package view import ( "strconv" "github.com/valyala/fasthttp" "git.sr.ht/~gabrielgio/img/pkg/database/repository" "git.sr.ht/~gabrielgio/img/pkg/ext" "git.sr.ht/~gabrielgio/img/pkg/service" "git.sr.ht/~gabrielgio/img/templates" ) type ( SettingsView struct { // there is not need to create a controller for this settingsRepository repository.SettingsRepository userController *service.AuthController } ) func NewSettingsView( settingsRespository repository.SettingsRepository, userController *service.AuthController, ) *SettingsView { return &SettingsView{ settingsRepository: settingsRespository, userController: userController, } } func (self *SettingsView) Index(ctx *fasthttp.RequestCtx) error { s, err := self.settingsRepository.Load(ctx) if err != nil { return err } users, err := self.userController.List(ctx) if err != nil { return err } templates.WritePageTemplate(ctx, &templates.SettingsPage{ Settings: s, Users: users, }) return nil } func (self *SettingsView) User(ctx *fasthttp.RequestCtx) error { id := string(ctx.FormValue("userId")) idValue, err := ParseUint(id) if err != nil { return err } if idValue == nil { templates.WritePageTemplate(ctx, &templates.UserPage{}) } else { user, err := self.userController.Get(ctx, *idValue) if err != nil { return err } templates.WritePageTemplate(ctx, &templates.UserPage{ ID: idValue, Username: user.Username, Path: user.Path, IsAdmin: user.IsAdmin, }) } return nil } func (self *SettingsView) UpsertUser(ctx *fasthttp.RequestCtx) error { var ( username = string(ctx.FormValue("username")) password = ctx.FormValue("password") path = string(ctx.FormValue("path")) isAdmin = string(ctx.FormValue("isAdmin")) == "on" id = string(ctx.FormValue("userId")) ) idValue, err := ParseUint(id) if err != nil { return err } err = self.userController.Upsert(ctx, idValue, username, "", password, isAdmin, path) if err != nil { return err } ctx.Redirect("/settings", 307) return nil } func (self *SettingsView) Delete(ctx *fasthttp.RequestCtx) error { var ( id = string(ctx.FormValue("userId")) ) idValue, err := ParseUint(id) if err != nil { return err } if idValue != nil { err = self.userController.Delete(ctx, *idValue) if err != nil { return err } } ctx.Redirect("/settings", 307) return nil } func (self *SettingsView) Save(ctx *fasthttp.RequestCtx) error { var ( showMode = string(ctx.FormValue("showMode")) == "on" showOwner = string(ctx.FormValue("showOwner")) == "on" preloadVideoMetadata = string(ctx.FormValue("preloadVideoMetadata")) == "on" ) err := self.settingsRepository.Save(ctx, &repository.Settings{ ShowMode: showMode, ShowOwner: showOwner, PreloadVideoMetadata: preloadVideoMetadata, }) if err != nil { return err } return self.Index(ctx) } func (self *SettingsView) SetMyselfIn(r *ext.Router) { r.GET("/settings/", self.Index) r.POST("/settings/", self.Save) r.GET("/users/", self.User) r.GET("/users/delete", self.Delete) r.POST("/users/", self.UpsertUser) } func ParseUint(id string) (*uint, error) { var idValue *uint if id != "" { v, err := strconv.Atoi(id) if err != nil { return nil, err } u := uint(v) idValue = &u } return idValue, nil }