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  }