package user import ( "github.com/labstack/echo/v4" "gitnet.fr/deblan/budget/backend/controller/crud" "gitnet.fr/deblan/budget/backend/message" "gitnet.fr/deblan/budget/database/model" "gorm.io/gorm" ) type Controller struct { crud *crud.Controller } func (ctrl *Controller) Config() crud.Configuration { return crud.Configuration{ Model: model.User{}, Models: []model.User{}, ValidOrders: []string{"id", "display_name", "username"}, DefaultLimit: 20, CreateModel: func() interface{} { return new(model.User) }, } } func New(e *echo.Echo) *Controller { c := Controller{ crud: crud.New(), } listRoute := "/api/user" itemRoute := "/api/user/:id" e.GET(listRoute, c.List) e.POST(listRoute, c.Create) e.GET(itemRoute, c.Show) e.POST(itemRoute, c.Update) e.DELETE(itemRoute, c.Delete) return &c } func (ctrl *Controller) List(c echo.Context) error { if nil == model.LoadApiUser(c) { return c.JSON(403, crud.Error{Code: 403, Message: message.LoginRequired}) } return ctrl.crud.With(ctrl.Config()).List(c) } func (ctrl *Controller) Show(c echo.Context) error { if nil == model.LoadApiUser(c) { return c.JSON(403, crud.Error{Code: 403, Message: message.LoginRequired}) } return ctrl.crud.With(ctrl.Config()).Show(c) } func (ctrl *Controller) Delete(c echo.Context) error { if nil == model.LoadApiUser(c) { return c.JSON(403, crud.Error{Code: 403, Message: message.LoginRequired}) } return ctrl.crud.With(ctrl.Config()).Delete(c) } func (ctrl *Controller) Create(c echo.Context) error { if nil == model.LoadApiUser(c) { return c.JSON(403, crud.Error{Code: 403, Message: message.LoginRequired}) } type body struct { Username string `json:"username" form:"username" validate:"required"` DisplayName string `json:"display_name" form:"display_name" validate:"required"` Password string `json:"password" form:"password" validate:"required"` } return ctrl.crud.With(ctrl.Config()).Create(c, new(body), func(db *gorm.DB, v interface{}) (interface{}, error) { value := v.(*body) item := model.NewUser(value.Username, value.Password, value.DisplayName) db.Model(ctrl.crud.Config.Model).Save(&item) return item, nil }) } func (ctrl *Controller) Update(c echo.Context) error { if nil == model.LoadApiUser(c) { return c.JSON(403, crud.Error{Code: 403, Message: message.LoginRequired}) } type body struct { Username string `json:"username" form:"username" validate:"required"` DisplayName string `json:"display_name" form:"display_name" validate:"required"` Password string `json:"password" form:"password"` } return ctrl.crud.With(ctrl.Config()).Update(c, new(body), func(db *gorm.DB, a, b interface{}) (interface{}, error) { item := a.(*model.User) update := b.(*body) item.DisplayName = update.DisplayName if update.Password != "" { item.UpdatePassword(update.Password) } db.Model(ctrl.crud.Config.Model).Where("id = ?", item.ID).Save(&item) return item, nil }) }