diff --git a/api/devices_by_slug.go b/api/devices_by_slug.go new file mode 100644 index 0000000..33f3f07 --- /dev/null +++ b/api/devices_by_slug.go @@ -0,0 +1,25 @@ +package api + +import ( + "context" + "net/http" + + "github.com/tigorlazuardi/redmage/models" + "github.com/tigorlazuardi/redmage/pkg/errs" +) + +func (api *API) DeviceBySlug(ctx context.Context, slug string) (device *models.Device, err error) { + ctx, span := tracer.Start(ctx, "*API.DeviceByName") + defer span.End() + + device, err = models.FindDevice(ctx, api.db, slug) + if err != nil { + if err.Error() == "sql: no rows in result set" { + return device, errs.Wrapw(err, "device not found", "device", device).Code(http.StatusNotFound) + } + + return device, errs.Wrapw(err, "failed to find device", "device", device) + } + + return device, nil +} diff --git a/server/routes/page_devices_details.go b/server/routes/page_devices_details.go new file mode 100644 index 0000000..c2297d5 --- /dev/null +++ b/server/routes/page_devices_details.go @@ -0,0 +1,58 @@ +package routes + +import ( + "net/http" + + "github.com/go-chi/chi/v5" + "github.com/tigorlazuardi/redmage/pkg/errs" + "github.com/tigorlazuardi/redmage/pkg/log" + "github.com/tigorlazuardi/redmage/views" + "github.com/tigorlazuardi/redmage/views/devicesview/devicedetails" +) + +func (routes *Routes) PageDeviceDetails(rw http.ResponseWriter, req *http.Request) { + ctx, span := tracer.Start(req.Context(), "*Routees.PageDeviceDetails") + defer span.End() + + c := views.NewContext(routes.Config, req) + + slug := chi.URLParam(req, "slug") + + var data devicedetails.Data + data.Params.FillFromQuery(req.URL.Query()) + + var err error + + data.Device, err = routes.API.DeviceBySlug(ctx, slug) + if err != nil { + log.New(ctx).Err(err).Error("failed to get device by slug") + code, message := errs.HTTPMessage(err) + rw.WriteHeader(code) + data.Error = message + if err := devicedetails.View(c, data).Render(ctx, rw); err != nil { + log.New(ctx).Err(err).Error("failed to render device details page") + } + return + } + + data.Params.Device = data.Device.Slug + + result, err := routes.API.ImagesList(ctx, data.Params) + if err != nil { + log.New(ctx).Err(err).Error("failed to get image by device") + code, message := errs.HTTPMessage(err) + rw.WriteHeader(code) + data.Error = message + if err := devicedetails.View(c, data).Render(ctx, rw); err != nil { + log.New(ctx).Err(err).Error("failed to render device details page") + } + return + } + + data.Images = result.Images + data.TotalImages = result.Total + + if err := devicedetails.View(c, data).Render(ctx, rw); err != nil { + log.New(ctx).Err(err).Error("failed to render device details page") + } +} diff --git a/server/routes/routes.go b/server/routes/routes.go index 7e2f433..e1056f5 100644 --- a/server/routes/routes.go +++ b/server/routes/routes.go @@ -82,6 +82,7 @@ func (routes *Routes) registerWWWRoutes(router chi.Router) { r.Get("/subreddits/add", routes.PageSubredditsAdd) r.Get("/config", routes.PageConfig) r.Get("/devices", routes.PageDevices) + r.Get("/devices/details/{slug}", routes.PageDeviceDetails) r.Get("/schedules", routes.PageScheduleHistory) }) } diff --git a/views/devicesview/devicedetails/data.go b/views/devicesview/devicedetails/data.go new file mode 100644 index 0000000..7af151a --- /dev/null +++ b/views/devicesview/devicedetails/data.go @@ -0,0 +1,46 @@ +package devicedetails + +import ( + "github.com/tigorlazuardi/redmage/api" + "github.com/tigorlazuardi/redmage/models" +) + +type Data struct { + Error string + Device *models.Device + Images models.ImageSlice + TotalImages int64 + Params api.ImageListParams +} + +type splitBySubredditImages struct { + Subreddit string + Images models.ImageSlice +} + +func (data Data) splitImages() []*splitBySubredditImages { + var out []*splitBySubredditImages + + for _, image := range data.Images { + var found bool + + inner: + for _, o := range out { + if o.Subreddit == image.Subreddit { + found = true + o.Images = append(o.Images, image) + break inner + } + } + + if !found { + out = append(out, &splitBySubredditImages{ + Subreddit: image.Subreddit, + Images: models.ImageSlice{image}, + }) + } + + } + + return out +} diff --git a/views/devicesview/devicedetails/filter.templ b/views/devicesview/devicedetails/filter.templ new file mode 100644 index 0000000..b7a591b --- /dev/null +++ b/views/devicesview/devicedetails/filter.templ @@ -0,0 +1,35 @@ +package devicedetails + +import "fmt" + +templ filter(data Data) { +
{ fmt.Sprintf("%.0f \u00d7 %.0f", device.ResolutionX, device.ResolutionY) } px
+