Implement MovieManager connection

This commit is contained in:
daru
2022-06-29 00:43:55 +02:00
parent 2b12e63637
commit 022ff8d0f9
12 changed files with 253 additions and 56 deletions

90
zecke.go Normal file
View File

@@ -0,0 +1,90 @@
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
}