emdb/cmd/api-service/moviestore/review.go

168 lines
4.1 KiB
Go
Raw Normal View History

2023-12-29 19:10:31 +01:00
package moviestore
2024-01-20 11:02:00 +01:00
import (
"encoding/json"
)
2024-01-06 14:22:22 +01:00
2023-12-29 19:10:31 +01:00
const (
ReviewSourceIMDB = "imdb"
2024-01-06 14:40:36 +01:00
MentionsSeparator = "|"
2023-12-29 19:10:31 +01:00
)
type ReviewSource string
2024-01-20 11:02:00 +01:00
type Titles struct {
Movies []string `json:"movies"`
TVShows []string `json:"tvShows"`
Games []string `json:"games"`
Books []string `json:"books"`
}
2023-12-29 19:10:31 +01:00
type Review struct {
2024-01-17 07:57:52 +01:00
ID string
MovieID string
Source ReviewSource
URL string
Review string
MovieRating int
Quality int
2024-01-20 11:02:00 +01:00
Titles Titles
2023-12-29 19:10:31 +01:00
}
type ReviewRepository struct {
db *SQLite
}
func NewReviewRepository(db *SQLite) *ReviewRepository {
return &ReviewRepository{
db: db,
}
}
func (rr *ReviewRepository) Store(r Review) error {
2024-01-20 11:02:00 +01:00
titles, err := json.Marshal(r.Titles)
if err != nil {
return err
}
if _, err := rr.db.Exec(`REPLACE INTO review (id, movie_id, source, url, review, movie_rating, quality, mentioned_titles) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
r.ID, r.MovieID, r.Source, r.URL, r.Review, r.MovieRating, r.Quality, titles); err != nil {
2023-12-29 19:10:31 +01:00
return err
}
return nil
}
func (rr *ReviewRepository) FindOne(id string) (Review, error) {
2024-01-20 11:02:00 +01:00
row := rr.db.QueryRow(`SELECT id, movie_id, source, url, review, movie_rating, quality, mentioned_titles FROM review WHERE id=?`, id)
2023-12-29 19:10:31 +01:00
if row.Err() != nil {
return Review{}, row.Err()
}
2024-01-06 14:22:22 +01:00
r := Review{}
2024-01-20 11:02:00 +01:00
var titles string
if err := row.Scan(&r.ID, &r.MovieID, &r.Source, &r.URL, &r.Review, &r.MovieRating, &r.Quality, &titles); err != nil {
2023-12-29 19:10:31 +01:00
return Review{}, err
}
2024-01-20 11:02:00 +01:00
if err := json.Unmarshal([]byte(titles), &r.Titles); err != nil {
return Review{}, err
2024-01-06 14:58:29 +01:00
}
2024-01-20 11:02:00 +01:00
2024-01-06 14:22:22 +01:00
return r, nil
2023-12-29 19:10:31 +01:00
}
func (rr *ReviewRepository) FindByMovieID(movieID string) ([]Review, error) {
2024-01-20 11:02:00 +01:00
rows, err := rr.db.Query(`SELECT id, movie_id, source, url, review, movie_rating, quality, mentioned_titles FROM review WHERE movie_id=?`, movieID)
2024-01-06 14:22:22 +01:00
if err != nil {
return nil, err
}
reviews := make([]Review, 0)
2024-01-20 11:02:00 +01:00
var titles string
2024-01-06 14:22:22 +01:00
for rows.Next() {
r := Review{}
2024-01-20 11:02:00 +01:00
if err := rows.Scan(&r.ID, &r.MovieID, &r.Source, &r.URL, &r.Review, &r.MovieRating, &r.Quality, &titles); err != nil {
2024-01-06 14:22:22 +01:00
return nil, err
}
2024-01-20 11:02:00 +01:00
if err := json.Unmarshal([]byte(titles), &r.Titles); err != nil {
return []Review{}, err
2024-01-06 14:58:29 +01:00
}
2024-01-06 14:22:22 +01:00
reviews = append(reviews, r)
}
rows.Close()
return reviews, nil
}
2024-01-06 14:55:00 +01:00
func (rr *ReviewRepository) FindNextUnrated() (Review, error) {
2024-01-20 11:02:00 +01:00
row := rr.db.QueryRow(`SELECT id, movie_id, source, url, review, movie_rating, quality, mentioned_titles FROM review WHERE quality=0 LIMIT 1`)
2024-01-06 14:55:00 +01:00
if row.Err() != nil {
return Review{}, row.Err()
}
r := Review{}
2024-01-20 11:02:00 +01:00
var titles string
if err := row.Scan(&r.ID, &r.MovieID, &r.Source, &r.URL, &r.Review, &r.MovieRating, &r.Quality, &titles); err != nil {
2024-01-06 14:55:00 +01:00
return Review{}, err
}
2024-01-20 11:02:00 +01:00
if err := json.Unmarshal([]byte(titles), &r.Titles); err != nil {
return Review{}, err
2024-01-06 14:58:29 +01:00
}
2024-01-06 14:55:00 +01:00
return r, nil
}
2024-01-06 14:22:22 +01:00
func (rr *ReviewRepository) FindUnrated() ([]Review, error) {
2024-01-20 11:02:00 +01:00
rows, err := rr.db.Query(`SELECT id, movie_id, source, url, review, movie_rating, quality, mentioned_titles FROM review WHERE quality=0`)
2023-12-29 19:10:31 +01:00
if err != nil {
return nil, err
}
reviews := make([]Review, 0)
2024-01-20 11:02:00 +01:00
var titles string
2023-12-29 19:10:31 +01:00
for rows.Next() {
r := Review{}
2024-01-20 11:02:00 +01:00
if err := rows.Scan(&r.ID, &r.MovieID, &r.Source, &r.URL, &r.Review, &r.MovieRating, &r.Quality, &titles); err != nil {
2023-12-29 19:10:31 +01:00
return nil, err
}
2024-01-20 11:02:00 +01:00
if err := json.Unmarshal([]byte(titles), &r.Titles); err != nil {
return []Review{}, err
2024-01-06 14:58:29 +01:00
}
2023-12-29 19:10:31 +01:00
reviews = append(reviews, r)
}
rows.Close()
return reviews, nil
}
2023-12-30 09:19:53 +01:00
2024-01-13 18:17:37 +01:00
func (rr *ReviewRepository) FindAll() ([]Review, error) {
2024-01-20 11:02:00 +01:00
rows, err := rr.db.Query(`SELECT id, movie_id, source, url, review, movie_rating, quality, mentioned_titles FROM review`)
2024-01-13 18:17:37 +01:00
if err != nil {
return nil, err
}
reviews := make([]Review, 0)
2024-01-20 11:02:00 +01:00
var titles string
2024-01-13 18:17:37 +01:00
for rows.Next() {
r := Review{}
2024-01-20 11:02:00 +01:00
if err := rows.Scan(&r.ID, &r.MovieID, &r.Source, &r.URL, &r.Review, &r.MovieRating, &r.Quality, &titles); err != nil {
2024-01-13 18:17:37 +01:00
return nil, err
}
2024-01-20 11:02:00 +01:00
if err := json.Unmarshal([]byte(titles), &r.Titles); err != nil {
return []Review{}, err
2024-01-13 18:17:37 +01:00
}
reviews = append(reviews, r)
}
rows.Close()
return reviews, nil
}
2023-12-30 09:19:53 +01:00
func (rr *ReviewRepository) DeleteByMovieID(id string) error {
if _, err := rr.db.Exec(`DELETE FROM review WHERE movie_id=?`, id); err != nil {
return err
}
return nil
}