update project

This commit is contained in:
2024-11-25 16:10:58 +01:00
parent a6f3325842
commit 958ef12e91
9 changed files with 108 additions and 91 deletions
+12 -26
View File
@@ -1,44 +1,30 @@
package handlers
import (
"context"
"gopher-toolbox/app"
"log/slog"
"net/http"
"ron"
"gopher-toolbox/app"
"github.com/gofiber/fiber/v2"
"github.com/zepyrshut/rating-orama/internal/repository"
)
type Handlers struct {
App *app.App
Queries repository.ExtendedQuerier
app *app.App
queries repository.ExtendedQuerier
}
func New(q repository.ExtendedQuerier, app *app.App) *Handlers {
func New(app *app.App, q repository.ExtendedQuerier) *Handlers {
return &Handlers{
Queries: q,
App: app,
app: app,
queries: q,
}
}
func (hq *Handlers) ToBeImplemented(c *ron.CTX, ctx context.Context) {
c.JSON(http.StatusOK, ron.Data{
"message": "Not implemented yet",
})
func (hq *Handlers) ToBeImplemented(c *fiber.Ctx) error {
return c.Status(http.StatusNotImplemented).JSON("not implemented")
}
func (hq *Handlers) Ping(c *ron.CTX, ctx context.Context) {
slog.Info("ping", ron.RequestID, ctx.Value(ron.RequestID))
c.JSON(http.StatusOK, ron.Data{
"message": "pong",
})
}
func (hq *Handlers) Error(c *ron.CTX, ctx context.Context) {
slog.Error("error", ron.RequestID, ctx.Value(ron.RequestID))
c.JSON(http.StatusInternalServerError, ron.Data{
"req": ctx.Value(ron.RequestID),
"message": "error",
})
func (hq *Handlers) Ping(c *fiber.Ctx) error {
return c.JSON("pong")
}
+28 -30
View File
@@ -1,65 +1,63 @@
package handlers
import (
"context"
"gopher-toolbox/app"
"log/slog"
"net/http"
"ron"
"github.com/gofiber/fiber/v2"
"github.com/zepyrshut/rating-orama/internal/scraper"
"github.com/zepyrshut/rating-orama/internal/sqlc"
)
func (hq *Handlers) GetTVShow(c *ron.CTX, ctx context.Context) {
func (hq *Handlers) GetTVShow(c *fiber.Ctx) error {
ttShowID := c.Query("ttid")
slog.Info("", "ttid", ttShowID, ron.RequestID, ctx.Value(ron.RequestID))
var title string
var scraperEpisodes []scraper.Episode
var sqlcEpisodes []sqlc.Episode
tvShow, err := hq.Queries.CheckTVShowExists(ctx, ttShowID)
tvShow, err := hq.queries.CheckTVShowExists(c.Context(), ttShowID)
if err != nil {
title, scraperEpisodes = scraper.ScrapeEpisodes(ttShowID)
sqlcEpisodes, err = hq.Queries.CreateTvShowWithEpisodes(ctx, sqlc.CreateTVShowParams{
// TODO: make transactional
ttShow, err := hq.queries.CreateTVShow(c.Context(), sqlc.CreateTVShowParams{
TtImdb: ttShowID,
Name: title,
}, scraperEpisodes)
})
if err != nil {
slog.Error("failed to create tv show with episodes", "ttid", ttShowID, "error", err)
c.JSON(http.StatusInternalServerError, ron.Data{"error": app.ErrorCreating})
return
slog.Error("failed to create tv show", "ttid", ttShowID, "error", err)
return c.SendStatus(http.StatusInternalServerError)
}
slog.Info("ttshowid", "id", ttShow.ID)
for _, episode := range scraperEpisodes {
sqlcEpisodesParams := episode.ToEpisodeParams(ttShow.ID)
sqlcEpisode, err := hq.queries.CreateEpisodes(c.Context(), sqlcEpisodesParams)
if err != nil {
slog.Error("failed to create episodes", "ttid", ttShowID, "error", err)
return c.SendStatus(http.StatusInternalServerError)
}
sqlcEpisodes = append(sqlcEpisodes, sqlcEpisode)
}
slog.Info("scraped seasons", "ttid", ttShowID, "title", title)
} else {
title = tvShow.Name
sqlcEpisodes, err = hq.Queries.GetEpisodes(ctx, tvShow.ID)
sqlcEpisodes, err = hq.queries.GetEpisodes(c.Context(), tvShow.ID)
if err != nil {
slog.Error("failed to get episodes", "ttid", ttShowID, "error", err)
c.JSON(http.StatusInternalServerError, ron.Data{"error": app.ErrorGetting})
return
}
if err := hq.Queries.IncreasePopularity(ctx, ttShowID); err != nil {
slog.Error("failed to increase popularity", "ttid", ttShowID, "error", err)
c.JSON(http.StatusInternalServerError, ron.Data{"error": app.ErrorUpdating})
return
return c.SendStatus(http.StatusInternalServerError)
}
hq.queries.IncreasePopularity(c.Context(), ttShowID)
slog.Info("tv show exists", "ttid", ttShowID, "title", tvShow.Name)
}
tvShowMedian, _ := hq.Queries.TvShowMedianRating(ctx, sqlcEpisodes[0].TvShowID)
tvShowAverage, _ := hq.Queries.TvShowAverageRating(ctx, sqlcEpisodes[0].TvShowID)
c.JSON(http.StatusOK, ron.Data{
"popularity": tvShow.Popularity,
"title": title,
"seasons": sqlcEpisodes,
"tvShowMedian": tvShowMedian,
"tvShowAverage": tvShowAverage,
return c.JSON(fiber.Map{
"popularity": tvShow.Popularity,
"title": title,
"seasons": sqlcEpisodes,
})
}
+5 -3
View File
@@ -2,7 +2,6 @@ package scraper
import (
"fmt"
"github.com/PuerkitoBio/goquery"
"log/slog"
"regexp"
"sort"
@@ -10,6 +9,8 @@ import (
"strings"
"time"
"github.com/PuerkitoBio/goquery"
"github.com/gocolly/colly"
"github.com/jackc/pgx/v5/pgtype"
"github.com/zepyrshut/rating-orama/internal/sqlc"
@@ -47,14 +48,15 @@ const (
seasonsSelector = "ul.ipc-tabs a[data-testid='tab-season-entry']"
episodeCardSelector = "article.sc-f8507e90-1.cHtpvn.episode-item-wrapper"
seasonEpisodeAndTitleSelector = "div.ipc-title__text"
releasedDateSelector = "span.sc-ccd6e31b-10.dYquTu"
plotSelector = "div.sc-ccd6e31b-11.cVKeME"
releasedDateSelector = "span.sc-f2169d65-10.bYaARM"
plotSelector = "div.ipc-html-content-inner-div"
starRatingSelector = "span.ipc-rating-star--rating"
voteCountSelector = "span.ipc-rating-star--voteCount"
imdbEpisodesURL = "https://www.imdb.com/title/%s/episodes/?season=%d"
visitURL = "https://www.imdb.com/title/%s/episodes"
)
func ScrapeEpisodes(ttImdb string) (string, []Episode) {
c := colly.NewCollector(
colly.AllowedDomains("imdb.com", "www.imdb.com"),