github.com/kyleu/dbaudit@v0.0.2-0.20240321155047-ff2f2c940496/app/controller/clib/profile.go (about) 1 // Package clib - Content managed by Project Forge, see [projectforge.md] for details. 2 package clib 3 4 import ( 5 "net/http" 6 "net/url" 7 8 "github.com/pkg/errors" 9 10 "github.com/kyleu/dbaudit/app" 11 "github.com/kyleu/dbaudit/app/controller" 12 "github.com/kyleu/dbaudit/app/controller/csession" 13 "github.com/kyleu/dbaudit/app/controller/cutil" 14 "github.com/kyleu/dbaudit/app/lib/theme" 15 "github.com/kyleu/dbaudit/views/vprofile" 16 ) 17 18 func Profile(w http.ResponseWriter, r *http.Request) { 19 controller.Act("profile", w, r, func(as *app.State, ps *cutil.PageState) (string, error) { 20 return profileAction(w, r, as, ps) 21 }) 22 } 23 24 func profileAction(w http.ResponseWriter, r *http.Request, as *app.State, ps *cutil.PageState) (string, error) { 25 ps.SetTitleAndData("Profile", ps.Profile) 26 thm := as.Themes.Get(ps.Profile.Theme, ps.Logger) 27 28 prvs, err := as.Auth.Providers(ps.Logger) 29 if err != nil { 30 return "", errors.Wrap(err, "can't load providers") 31 } 32 33 redir := "/" 34 ref := r.Header.Get("Referer") 35 if ref != "" { 36 u, err := url.Parse(ref) 37 if err == nil && u != nil && u.Path != cutil.DefaultProfilePath { 38 redir = u.Path 39 } 40 } 41 ps.DefaultNavIcon = "profile" 42 page := &vprofile.Profile{Profile: ps.Profile, Theme: thm, Providers: prvs, Referrer: redir} 43 return controller.Render(w, r, as, page, ps, "Profile") 44 } 45 46 func ProfileSave(w http.ResponseWriter, r *http.Request) { 47 controller.Act("profile.save", w, r, func(_ *app.State, ps *cutil.PageState) (string, error) { 48 frm, err := cutil.ParseForm(r, ps.RequestBody) 49 if err != nil { 50 return "", err 51 } 52 53 n := ps.Profile.Clone() 54 55 referrerDefault := frm.GetStringOpt("referrer") 56 if referrerDefault == "" { 57 referrerDefault = cutil.DefaultProfilePath 58 } 59 60 n.Name = frm.GetStringOpt("name") 61 n.Mode = frm.GetStringOpt("mode") 62 n.Theme = frm.GetStringOpt("theme") 63 if n.Theme == theme.Default.Key { 64 n.Theme = "" 65 } 66 67 err = csession.SaveProfile(n, w, ps.Session, ps.Logger) 68 if err != nil { 69 return "", err 70 } 71 72 return controller.ReturnToReferrer("Saved profile", referrerDefault, w, ps) 73 }) 74 }