package backend import ( "database/sql" "time" "github.com/jmoiron/sqlx" polochon "github.com/odwrtw/polochon/lib" ) const ( upsertMovieTorrentQuery = ` INSERT INTO movie_torrents (imdb_id, url, source, quality, upload_user, seeders, leechers) VALUES (:imdb_id, :url, :source, :quality, :upload_user, :seeders, :leechers) ON CONFLICT (imdb_id, quality, source) DO UPDATE SET imdb_id=:imdb_id, url=:url, source=:source, quality=:quality, upload_user=:upload_user, seeders=:seeders, leechers=:leechers RETURNING id;` getMovieTorrentQueryByImdbID = ` SELECT * FROM movie_torrents WHERE imdb_id=$1;` ) // movieTorrentDB represents the MovieTorrent in the DB type movieTorrentDB struct { ID string `db:"id"` ImdbID string `db:"imdb_id"` URL string `db:"url"` Source string `db:"source"` Quality string `db:"quality"` UploadUser string `db:"upload_user"` Seeders int `db:"seeders"` Leechers int `db:"leechers"` Created time.Time `db:"created_at"` Updated time.Time `db:"updated_at"` } // NewTorrentFromMovieTorrentDB creates a new polochon.Torrent from a // movieTorrentDB func NewTorrentFromMovieTorrentDB(mDB *movieTorrentDB) *polochon.Torrent { q, _ := polochon.StringToQuality(mDB.Quality) return &polochon.Torrent{ Quality: *q, URL: mDB.URL, Seeders: mDB.Seeders, Leechers: mDB.Leechers, Source: mDB.Source, UploadUser: mDB.UploadUser, } } // NewMovieTorrentDB returns a MovieTorrent ready to be put in DB from a // Torrent func NewMovieTorrentDB(t *polochon.Torrent, imdbID string) movieTorrentDB { return movieTorrentDB{ ImdbID: imdbID, URL: t.URL, Source: t.Source, Quality: string(t.Quality), UploadUser: t.UploadUser, Seeders: t.Seeders, Leechers: t.Leechers, } } // GetMovieTorrents returns polochon.Torrents from the database func GetMovieTorrents(db *sqlx.DB, imdbID string) ([]polochon.Torrent, error) { var torrentsDB = []*movieTorrentDB{} // Get the torrents from the DB err := db.Select(&torrentsDB, getMovieTorrentQueryByImdbID, imdbID) if err != nil { return nil, err } if len(torrentsDB) == 0 { return nil, sql.ErrNoRows } // Create polochon Torrents from the movieTorrentDB var torrents []polochon.Torrent for _, torrentDB := range torrentsDB { torrent := NewTorrentFromMovieTorrentDB(torrentDB) torrents = append(torrents, *torrent) } return torrents, nil } // UpsertMovieTorrent adds or updates MovieTorrent in db func UpsertMovieTorrent(db *sqlx.DB, t *polochon.Torrent, imdbID string) error { mDB := NewMovieTorrentDB(t, imdbID) r, err := db.NamedQuery(upsertMovieTorrentQuery, mDB) if err != nil { return err } defer r.Close() return nil }