package main import ( "database/sql" _ "embed" "encoding/base64" "encoding/json" "fmt" "time" ) //go:embed mm.cred var mmDbCred string func GetMmConnString() (string, error) { pw, err := base64.StdEncoding.DecodeString(mmDbCred) if err != nil { return "", err } return fmt.Sprintf("%s:%s@tcp(%s)/moviemanager?parseTime=true", *mmDbUser, pw, *mmDbServer), err } func MmReadOracle() ([]MmOracle, error) { key := "oracle" var oracles []MmOracle data, err := mmCache.Get(key) if err == nil { err = json.Unmarshal(data, &oracles) if err == nil { return oracles, err } } oracleQuery := `SELECT m.id, m.title, m.mal_id, COALESCE(SUM(pv.score), 0) AS avgScore FROM movie m INNER JOIN vote pv ON (m.id = pv.movie_id) INNER JOIN promise pp ON (pp.user_id = pv.user_id) INNER JOIN evening me ON (pp.evening_id = me.id) WHERE m.id NOT IN ( SELECT m2.id FROM movie m2 INNER JOIN evening_movie em2 ON (m2.id = em2.movie_id) INNER JOIN evening e2 ON (em2.evening_id = e2.id) WHERE e2.date < ? ) AND ( m.id IN ( SELECT mm.movie_source FROM movie m3 INNER JOIN movie_movie mm ON (m3.id = mm.movie_target) INNER JOIN evening_movie em3 ON (mm.movie_target = em3.movie_id) INNER JOIN evening e3 ON (em3.evening_id = e3.id) WHERE e3.date < ? GROUP BY m3.id ) OR m.id NOT IN ( SELECT mm.movie_source FROM movie m4 INNER JOIN movie_movie mm ON (m4.id = mm.movie_source) ) ) AND pp.promised = 1 AND m.aired = 1 AND me.date >= ? AND me.date < ? GROUP BY m.id ORDER BY avgScore DESC, m.id ASC;` today := PrintDate(time.Now()) nextWeek := PrintDate(time.Now().AddDate(0, 0, 7)) rows, err := mmDb.Query(oracleQuery, today, today, today, nextWeek) if err != nil { return nil, err } defer rows.Close() oracles = make([]MmOracle, 0) for rows.Next() { var oracle MmOracle var qMalId sql.NullInt64 err = rows.Scan(&oracle.Id, &oracle.Title, &qMalId, &oracle.AvgScore) if err != nil { return oracles, err } if qMalId.Valid { oracle.Anime = qMalId.Int64 } oracles = append(oracles, oracle) } err = rows.Err() if err == nil { bytes, err := json.Marshal(oracles) if err == nil { mmCache.Set(key, bytes) } } return oracles, err }