From 2cf58b58b7c0d4f10c002072be27d1c2f04abfb5 Mon Sep 17 00:00:00 2001 From: Rickard Natt och Dag Date: Mon, 29 Apr 2024 22:21:04 +0200 Subject: [PATCH] fix(person): move seen to stored function instead --- db/queries.sql | 21 +++++---------------- handlers/person.go | 14 +------------- router/router.go | 1 - types/movie.go | 1 + types/person.go | 35 ++++++++++++++++++++++++++++------- views/person.templ | 10 ++-------- views/person_templ.go | 8 ++++---- 7 files changed, 41 insertions(+), 49 deletions(-) diff --git a/db/queries.sql b/db/queries.sql index f765847..467ca26 100644 --- a/db/queries.sql +++ b/db/queries.sql @@ -119,11 +119,11 @@ SELECT p.name, -- Function get_person_role_json returns a JSON array of movies -- The function is defined in the database - get_person_role_json (p.id, 'director'::job) AS director, - get_person_role_json (p.id, 'cast') AS cast, - get_person_role_json (p.id, 'writer') AS writer, - get_person_role_json (p.id, 'composer') AS composer, - get_person_role_json (p.id, 'producer') AS producer + get_person_role_with_seen_json (p.id, 'director'::job, $2) AS director, + get_person_role_with_seen_json (p.id, 'cast', $2) AS cast, + get_person_role_with_seen_json (p.id, 'writer', $2) AS writer, + get_person_role_with_seen_json (p.id, 'composer', $2) AS composer, + get_person_role_with_seen_json (p.id, 'producer', $2) AS producer FROM person AS p WHERE @@ -297,14 +297,3 @@ GROUP BY ORDER BY label DESC; --- name: person-seen-movie-by-id -SELECT - EXISTS ( - SELECT - id - FROM - seen - WHERE - user_id = $1 - AND movie_id = $2); - diff --git a/handlers/person.go b/handlers/person.go index 69552b7..fd0ca37 100644 --- a/handlers/person.go +++ b/handlers/person.go @@ -15,7 +15,7 @@ func HandleGetPersonByID(c *fiber.Ctx) error { id := c.Params("id") - err := db.Dot.Get(db.Client, &person, "person-by-id", id) + err := db.Dot.Get(db.Client, &person, "person-by-id", id, c.Locals("UserId")) if err != nil { // TODO: Display 404 page @@ -41,15 +41,3 @@ func HandleGetPersonByID(c *fiber.Ctx) error { return utils.TemplRender(c, views.Person(person, totalCredits, id)) } - -func HandleSeenMovieByID(c *fiber.Ctx) error { - var seen bool - - err := db.Dot.Get(db.Client, &seen, "person-seen-movie-by-id", c.Locals("UserId"), c.Params("movieId")) - - if err != nil { - return err - } - - return utils.TemplRender(c, views.Seen(seen)) -} diff --git a/router/router.go b/router/router.go index ed49842..0a8d395 100644 --- a/router/router.go +++ b/router/router.go @@ -37,7 +37,6 @@ func SetupRoutes(app *fiber.App) { personGroup.Get("/", redirectToHome) personGroup.Get("/:id", handlers.HandleGetPersonByID) - personGroup.Get("/:id/:movieId", handlers.HandleSeenMovieByID) // Search // -------------------------- diff --git a/types/movie.go b/types/movie.go index a2db127..2d35917 100644 --- a/types/movie.go +++ b/types/movie.go @@ -31,6 +31,7 @@ type Movie struct { Title string `db:"title" json:"title"` UpdatedAt time.Time `db:"updated_at"` WatchedAt time.Time `db:"watched_at" json:"watchedAt"` + Seen bool `db:"seen"` } type Movies []Movie diff --git a/types/person.go b/types/person.go index 892bb51..7dbaa61 100644 --- a/types/person.go +++ b/types/person.go @@ -3,16 +3,37 @@ package types import ( "encoding/json" "fmt" + "time" ) +type PersonMovie struct { + ID int `json:"id" db:"id"` + Title string `json:"title" db:"title"` + ReleaseDate time.Time `json:"release_date" db:"release_date"` + Seen bool `json:"seen" db:"seen"` +} + +type PersonMovies []PersonMovie + +func (u *PersonMovies) Scan(v interface{}) error { + switch vv := v.(type) { + case []byte: + return json.Unmarshal(vv, u) + case string: + return json.Unmarshal([]byte(vv), u) + default: + return fmt.Errorf("unsupported type: %T", v) + } +} + type Person struct { - ID int `json:"id" db:"id"` - Name string `json:"name" db:"name"` - Cast Movies `json:"cast" db:"cast"` - Director Movies `json:"director" db:"director"` - Writer Movies `json:"writer" db:"writer"` - Composer Movies `json:"composer" db:"composer"` - Producer Movies `json:"producer" db:"producer"` + ID int `json:"id" db:"id"` + Name string `json:"name" db:"name"` + Cast PersonMovies `json:"cast" db:"cast"` + Director PersonMovies `json:"director" db:"director"` + Writer PersonMovies `json:"writer" db:"writer"` + Composer PersonMovies `json:"composer" db:"composer"` + Producer PersonMovies `json:"producer" db:"producer"` } type Persons []Person diff --git a/views/person.templ b/views/person.templ index 817caf2..1a10bbc 100644 --- a/views/person.templ +++ b/views/person.templ @@ -7,7 +7,7 @@ import ( "strconv" ) -templ Credit(title string, data types.Movies, id string) { +templ Credit(title string, data types.PersonMovies, id string) { if len(data) > 0 { @components.Section(title, len(data)) {
    @@ -23,13 +23,7 @@ templ Credit(title string, data types.Movies, id string) { { movie.ReleaseDate.Format("2006") } - - - - - - - + @Seen(movie.Seen) } diff --git a/views/person_templ.go b/views/person_templ.go index 4d1eae6..2e862b1 100644 --- a/views/person_templ.go +++ b/views/person_templ.go @@ -17,7 +17,7 @@ import ( "strconv" ) -func Credit(title string, data types.Movies, id string) templ.Component { +func Credit(title string, data types.PersonMovies, id string) templ.Component { return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) { templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer) if !templ_7745c5c3_IsBuffer { @@ -75,15 +75,15 @@ func Credit(title string, data types.Movies, id string) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(fmt.Sprintf("/person/%s/%d", id, movie.ID))) + templ_7745c5c3_Err = Seen(movie.Seen).Render(ctx, templ_7745c5c3_Buffer) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" hx-trigger=\"load\">") + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err }