canape/backend/models/movie_torrents.go

106 lines
2.8 KiB
Go

package models
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, size)
VALUES (:imdb_id, :url, :source, :quality, :upload_user, :seeders,
:leechers, :size)
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, size=:size
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"`
Size int `db:"size"`
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,
Size: mDB.Size,
}
}
// 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,
Size: t.Size,
}
}
// 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
}