109 lines
2.8 KiB
Go
109 lines
2.8 KiB
Go
package user
|
|
|
|
import (
|
|
"github.com/labstack/echo/v4"
|
|
"gitnet.fr/deblan/budget/backend/controller/crud"
|
|
"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(),
|
|
}
|
|
|
|
e.GET("/api/user", c.List)
|
|
e.POST("/api/user", c.Create)
|
|
e.GET("/api/user/:id", c.Show)
|
|
e.POST("/api/user/:id", c.Update)
|
|
e.DELETE("/api/user/:id", 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: "Login required"})
|
|
}
|
|
|
|
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: "Login required"})
|
|
}
|
|
|
|
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: "Login required"})
|
|
}
|
|
|
|
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: "Login required"})
|
|
}
|
|
|
|
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: "Login required"})
|
|
}
|
|
|
|
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
|
|
})
|
|
}
|