package user import ( "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/libs/auth" "github.com/veypi/OneAuth/models" "github.com/vyes-ai/vigo" "github.com/vyes-ai/vigo/contrib/crud" ) type userIDReq struct { UserID string `parse:"path@user_id"` } var _ = Router.Delete("/{user_id}", "删除用户", auth.Check("user", "user_id", auth.DoDelete, checkOwner), userDelete) func userDelete(x *vigo.X, req *userIDReq) (any, error) { data := &models.User{} err := cfg.DB().Where("id = ?", req.UserID).Delete(data).Error return data, err } var _ = Router.Get("/{user_id}", "获取用户详情", auth.Check("user", "user_id", auth.DoRead, checkOwner), userGet) func checkOwner(x *vigo.X, data any) bool { u, ok1 := data.(*models.User) return ok1 && u.ID == x.PathParams.Get("user_id") } func userGet(x *vigo.X, req *userIDReq) (any, error) { data := &models.User{} err := cfg.DB().Where("id = ?", req.UserID).First(data).Error return data, err } var _ = Router.Get("/", "用户列表", auth.Check("user", "", auth.DoUpdate), crud.List(cfg.DB, &models.User{})) var _ = Router.Patch("/{user_id}", "更新用户", auth.Check("user", "user_id", auth.DoUpdate, checkOwner), userPatch) type patchOpts struct { ID string `json:"id" parse:"path@user_id"` Nickname *string `json:"nickname" parse:"json"` Icon *string `json:"icon" parse:"json"` Username *string `json:"username" parse:"json"` Email *string `json:"email" parse:"json"` Phone *string `json:"phone" parse:"json"` Status *uint `json:"status" parse:"json"` } func userPatch(x *vigo.X, opts *patchOpts) (any, error) { data := &models.User{} err := cfg.DB().Where("id = ?", opts.ID).First(data).Error if err != nil { return nil, vigo.ErrNotFound } optsMap := make(map[string]any) if opts.Username != nil { optsMap["username"] = opts.Username } if opts.Nickname != nil { optsMap["nickname"] = opts.Nickname } if opts.Icon != nil { optsMap["icon"] = opts.Icon } if opts.Email != nil { optsMap["email"] = opts.Email } if opts.Phone != nil { optsMap["phone"] = opts.Phone } if opts.Status != nil { optsMap["status"] = opts.Status } err = cfg.DB().Model(data).Updates(optsMap).Error return data, err }