github.com/kyleu/dbaudit@v0.0.2-0.20240321155047-ff2f2c940496/app/controller/statement.go (about) 1 // Package controller - Content managed by Project Forge, see [projectforge.md] for details. 2 package controller 3 4 import ( 5 "fmt" 6 "net/http" 7 "strings" 8 9 "github.com/pkg/errors" 10 11 "github.com/kyleu/dbaudit/app" 12 "github.com/kyleu/dbaudit/app/controller/cutil" 13 "github.com/kyleu/dbaudit/app/statement" 14 "github.com/kyleu/dbaudit/app/util" 15 "github.com/kyleu/dbaudit/views/vstatement" 16 ) 17 18 func StatementList(w http.ResponseWriter, r *http.Request) { 19 Act("statement.list", w, r, func(as *app.State, ps *cutil.PageState) (string, error) { 20 q := strings.TrimSpace(r.URL.Query().Get("q")) 21 prms := ps.Params.Get("statement", nil, ps.Logger).Sanitize("statement") 22 var ret statement.Statements 23 var err error 24 if q == "" { 25 ret, err = as.Services.Statement.List(ps.Context, nil, prms, ps.Logger) 26 } else { 27 ret, err = as.Services.Statement.Search(ps.Context, q, nil, prms, ps.Logger) 28 } 29 if err != nil { 30 return "", err 31 } 32 ps.SetTitleAndData("Statements", ret) 33 page := &vstatement.List{Models: ret, Params: ps.Params, SearchQuery: q} 34 return Render(w, r, as, page, ps, "statement") 35 }) 36 } 37 38 func StatementDetail(w http.ResponseWriter, r *http.Request) { 39 Act("statement.detail", w, r, func(as *app.State, ps *cutil.PageState) (string, error) { 40 ret, err := statementFromPath(r, as, ps) 41 if err != nil { 42 return "", err 43 } 44 ps.SetTitleAndData(ret.TitleString()+" (Statement)", ret) 45 46 return Render(w, r, as, &vstatement.Detail{Model: ret}, ps, "statement", ret.TitleString()+"**database") 47 }) 48 } 49 50 func StatementCreateForm(w http.ResponseWriter, r *http.Request) { 51 Act("statement.create.form", w, r, func(as *app.State, ps *cutil.PageState) (string, error) { 52 ret := &statement.Statement{} 53 if r.URL.Query().Get("prototype") == util.KeyRandom { 54 ret = statement.Random() 55 } 56 ps.SetTitleAndData("Create [Statement]", ret) 57 ps.Data = ret 58 return Render(w, r, as, &vstatement.Edit{Model: ret, IsNew: true}, ps, "statement", "Create") 59 }) 60 } 61 62 func StatementRandom(w http.ResponseWriter, r *http.Request) { 63 Act("statement.random", w, r, func(as *app.State, ps *cutil.PageState) (string, error) { 64 ret, err := as.Services.Statement.Random(ps.Context, nil, ps.Logger) 65 if err != nil { 66 return "", errors.Wrap(err, "unable to find random Statement") 67 } 68 return ret.WebPath(), nil 69 }) 70 } 71 72 func StatementCreate(w http.ResponseWriter, r *http.Request) { 73 Act("statement.create", w, r, func(as *app.State, ps *cutil.PageState) (string, error) { 74 ret, err := statementFromForm(r, ps.RequestBody, true) 75 if err != nil { 76 return "", errors.Wrap(err, "unable to parse Statement from form") 77 } 78 err = as.Services.Statement.Create(ps.Context, nil, ps.Logger, ret) 79 if err != nil { 80 return "", errors.Wrap(err, "unable to save newly-created Statement") 81 } 82 msg := fmt.Sprintf("Statement [%s] created", ret.String()) 83 return FlashAndRedir(true, msg, ret.WebPath(), w, ps) 84 }) 85 } 86 87 func StatementEditForm(w http.ResponseWriter, r *http.Request) { 88 Act("statement.edit.form", w, r, func(as *app.State, ps *cutil.PageState) (string, error) { 89 ret, err := statementFromPath(r, as, ps) 90 if err != nil { 91 return "", err 92 } 93 ps.SetTitleAndData("Edit "+ret.String(), ret) 94 return Render(w, r, as, &vstatement.Edit{Model: ret}, ps, "statement", ret.String()) 95 }) 96 } 97 98 func StatementEdit(w http.ResponseWriter, r *http.Request) { 99 Act("statement.edit", w, r, func(as *app.State, ps *cutil.PageState) (string, error) { 100 ret, err := statementFromPath(r, as, ps) 101 if err != nil { 102 return "", err 103 } 104 frm, err := statementFromForm(r, ps.RequestBody, false) 105 if err != nil { 106 return "", errors.Wrap(err, "unable to parse Statement from form") 107 } 108 frm.ID = ret.ID 109 err = as.Services.Statement.Update(ps.Context, nil, frm, ps.Logger) 110 if err != nil { 111 return "", errors.Wrapf(err, "unable to update Statement [%s]", frm.String()) 112 } 113 msg := fmt.Sprintf("Statement [%s] updated", frm.String()) 114 return FlashAndRedir(true, msg, frm.WebPath(), w, ps) 115 }) 116 } 117 118 func StatementDelete(w http.ResponseWriter, r *http.Request) { 119 Act("statement.delete", w, r, func(as *app.State, ps *cutil.PageState) (string, error) { 120 ret, err := statementFromPath(r, as, ps) 121 if err != nil { 122 return "", err 123 } 124 err = as.Services.Statement.Delete(ps.Context, nil, ret.ID, ps.Logger) 125 if err != nil { 126 return "", errors.Wrapf(err, "unable to delete statement [%s]", ret.String()) 127 } 128 msg := fmt.Sprintf("Statement [%s] deleted", ret.String()) 129 return FlashAndRedir(true, msg, "/statement", w, ps) 130 }) 131 } 132 133 func statementFromPath(r *http.Request, as *app.State, ps *cutil.PageState) (*statement.Statement, error) { 134 idArgStr, err := cutil.RCRequiredString(r, "id", false) 135 if err != nil { 136 return nil, errors.Wrap(err, "must provide [id] as an argument") 137 } 138 idArgP := util.UUIDFromString(idArgStr) 139 if idArgP == nil { 140 return nil, errors.Errorf("argument [id] (%s) is not a valid UUID", idArgStr) 141 } 142 idArg := *idArgP 143 return as.Services.Statement.Get(ps.Context, nil, idArg, ps.Logger) 144 } 145 146 func statementFromForm(r *http.Request, b []byte, setPK bool) (*statement.Statement, error) { 147 frm, err := cutil.ParseForm(r, b) 148 if err != nil { 149 return nil, errors.Wrap(err, "unable to parse form") 150 } 151 return statement.FromMap(frm, setPK) 152 }