diff --git a/base/constant/const.go b/base/constant/const.go index 66a58ae..4eb8f25 100644 --- a/base/constant/const.go +++ b/base/constant/const.go @@ -1,6 +1,6 @@ package constant -import "github.com/yiran15/api-server/base/apitypes" +import apitypes "github.com/yiran15/api-server/base/types" type userContextKey struct{} diff --git a/base/constant/errors.go b/base/constant/errors.go index 1ee955c..95ed335 100644 --- a/base/constant/errors.go +++ b/base/constant/errors.go @@ -5,7 +5,9 @@ import ( ) var ( - ErrAuthFailed = errors.New("auth failed") - ErrNoPermission = errors.New("access forbidden") - ErrLoginFailed = errors.New("incorrect username or password") + ErrAuthFailed = errors.New("auth failed") + ErrNoPermission = errors.New("access forbidden") + ErrLoginFailed = errors.New("incorrect username or password") + ErrUserNotFound = errors.New("user not found") + ErrPasswordWrong = errors.New("password incorrect") ) diff --git a/base/data/database.go b/base/data/database.go index 6bd551e..d96ad74 100644 --- a/base/data/database.go +++ b/base/data/database.go @@ -1,47 +1,23 @@ package data import ( + "context" "fmt" "github.com/spf13/viper" "github.com/yiran15/api-server/base/conf" + "github.com/yiran15/api-server/stores" "go.uber.org/zap" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" ) -// type zapWriter struct { -// log *zap.Logger -// } +var dbInstance *gorm.DB -// func (w zapWriter) Printf(_ string, args ...interface{}) { -// // gorm: l.Printf(l.traceErrStr, utils.FileWithLineNum(), err, float64(elapsed.Nanoseconds())/1e6, rows, sql) -// if len(args) == 5 { -// w.log.Error("gorm log", zap.String("err", args[1].(error).Error()), zap.Float64("elapsed", args[2].(float64)), zap.String("rows", "-"), zap.String("sql", args[4].(string))) -// return -// } -// switch args[2].(type) { -// case int64: -// w.log.Info("gorm log", zap.Float64("elapsed", args[1].(float64)), zap.Int64("rows", args[2].(int64)), zap.String("sql", args[3].(string))) -// case string: -// w.log.Info("gorm log", zap.Float64("elapsed", args[1].(float64)), zap.String("rows", args[2].(string)), zap.String("sql", args[3].(string))) -// default: -// w.log.Info("gorm log", zap.Float64("elapsed", args[1].(float64)), zap.String("rows", "-"), zap.String("sql", args[3].(string))) -// } -// } - -// newGormLogger create a new gorm logger -// func newGormLogger(z *zap.Logger) logger.Interface { -// return logger.New( -// zapWriter{log: z}, // 使用 zap writer -// logger.Config{ -// SlowThreshold: time.Second, // 慢查询阈值 -// LogLevel: logger.Info, // 级别 -// Colorful: true, -// }, -// ) -// } +func GetDB(ctx context.Context) *gorm.DB { + return dbInstance.WithContext(ctx) +} func NewDB() (*gorm.DB, func(), error) { dsn, err := conf.GetMysqlDsn() @@ -56,7 +32,7 @@ func NewDB() (*gorm.DB, func(), error) { zap.S().Info("enable debug mode on the database") } - dbInstance, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ + dbInstance, err = gorm.Open(mysql.Open(dsn), &gorm.Config{ DisableForeignKeyConstraintWhenMigrating: true, Logger: dbLogger, }) @@ -81,5 +57,6 @@ func NewDB() (*gorm.DB, func(), error) { sqlDB.SetConnMaxLifetime(conf.GetMysqlMaxLifetime()) zap.S().Info("db connect success") + stores.SetDefault(dbInstance) return dbInstance, func() { _ = sqlDB.Close() }, nil } diff --git a/base/helper/gorm.go b/base/helper/gorm.go new file mode 100644 index 0000000..717fcfe --- /dev/null +++ b/base/helper/gorm.go @@ -0,0 +1,10 @@ +package helper + +import "gorm.io/gen/field" + +func Sort(orderCol field.OrderExpr, direction string) field.Expr { + if direction == "desc" { + return orderCol.Desc() + } + return orderCol.Asc() +} diff --git a/base/middleware/middleware.go b/base/middleware/middleware.go index 9caa0ec..ee901cc 100644 --- a/base/middleware/middleware.go +++ b/base/middleware/middleware.go @@ -2,7 +2,7 @@ package middleware import ( "github.com/gin-gonic/gin" - "github.com/yiran15/api-server/base/apitypes" + apitypes "github.com/yiran15/api-server/base/types" "github.com/yiran15/api-server/pkg/casbin" "github.com/yiran15/api-server/pkg/jwt" "github.com/yiran15/api-server/store" diff --git a/base/server/server.go b/base/server/server.go index 5a434ad..1c62ece 100644 --- a/base/server/server.go +++ b/base/server/server.go @@ -8,10 +8,10 @@ import ( "time" "github.com/gin-gonic/gin" - "github.com/yiran15/api-server/base/apitypes" "github.com/yiran15/api-server/base/conf" "github.com/yiran15/api-server/base/constant" "github.com/yiran15/api-server/base/router" + apitypes "github.com/yiran15/api-server/base/types" "github.com/yiran15/api-server/controller" "go.uber.org/zap" ) diff --git a/base/apitypes/api.go b/base/types/api.go similarity index 70% rename from base/apitypes/api.go rename to base/types/api.go index 9f1a056..c6c4288 100644 --- a/base/apitypes/api.go +++ b/base/types/api.go @@ -1,4 +1,4 @@ -package apitypes +package types import "github.com/yiran15/api-server/model" @@ -38,3 +38,25 @@ type ApiInfo struct { Path string `json:"path"` Handler string `json:"handler"` } + +func NewApi(req *ApiCreateRequest) *model.Api { + return &model.Api{ + Name: req.Name, + Path: req.Path, + Method: req.Method, + Description: req.Description, + } +} + +func NewApiListResponse(apis []*model.Api, total int64, pageSize, page int) *ApiListResponse { + return &ApiListResponse{ + ListResponse: &ListResponse{ + Total: total, + Pagination: &Pagination{ + Page: page, + PageSize: pageSize, + }, + }, + List: apis, + } +} diff --git a/base/apitypes/res.go b/base/types/res.go similarity index 97% rename from base/apitypes/res.go rename to base/types/res.go index 98fc6a0..faa2eb7 100644 --- a/base/apitypes/res.go +++ b/base/types/res.go @@ -1,4 +1,4 @@ -package apitypes +package types type Response struct { Code int `json:"code"` diff --git a/base/apitypes/role.go b/base/types/role.go similarity index 63% rename from base/apitypes/role.go rename to base/types/role.go index a8f45f9..20cf620 100644 --- a/base/apitypes/role.go +++ b/base/types/role.go @@ -1,6 +1,8 @@ -package apitypes +package types -import "github.com/yiran15/api-server/model" +import ( + "github.com/yiran15/api-server/model" +) type RoleCreateRequest struct { Name string `json:"name" binding:"required,ascii"` @@ -25,3 +27,16 @@ type RoleListResponse struct { *ListResponse List []*model.Role `json:"list"` } + +func NewRoleListResponse(roles []*model.Role, total int64, pageIndex, pageSize int) *RoleListResponse { + return &RoleListResponse{ + ListResponse: &ListResponse{ + Pagination: &Pagination{ + Page: pageIndex, + PageSize: pageSize, + }, + Total: total, + }, + List: roles, + } +} diff --git a/base/apitypes/types.go b/base/types/types.go similarity index 94% rename from base/apitypes/types.go rename to base/types/types.go index a5ecbfd..a8c481b 100644 --- a/base/apitypes/types.go +++ b/base/types/types.go @@ -1,4 +1,4 @@ -package apitypes +package types type IDRequest struct { ID int64 `uri:"id" binding:"required"` diff --git a/base/apitypes/user.go b/base/types/user.go similarity index 92% rename from base/apitypes/user.go rename to base/types/user.go index 34e080c..b05999d 100644 --- a/base/apitypes/user.go +++ b/base/types/user.go @@ -1,4 +1,4 @@ -package apitypes +package types import ( "github.com/yiran15/api-server/model" @@ -81,7 +81,14 @@ type OauthLoginResponse struct { } type OAuthActivateRequest struct { - ID string `uri:"id" binding:"required"` + ID int `uri:"id" binding:"required"` Password string `json:"password" binding:"required,min=8"` ConfirmPassword string `json:"confirmPassword" binding:"required,min=8"` } + +func NewUserLoginResponse(user *model.User, token string) *UserLoginResponse { + return &UserLoginResponse{ + User: user, + Token: token, + } +} diff --git a/cmd/apiserver.go b/cmd/apiserver.go index b1108cf..8ff2494 100644 --- a/cmd/apiserver.go +++ b/cmd/apiserver.go @@ -16,6 +16,7 @@ import ( "github.com/yiran15/api-server/base/conf" "github.com/yiran15/api-server/base/constant" baselog "github.com/yiran15/api-server/base/log" + v1 "github.com/yiran15/api-server/service/v1" "go.uber.org/zap" ) @@ -73,6 +74,9 @@ func runApp(_ *cobra.Command, _ []string) error { return fmt.Errorf("init application faild: %w", err) } defer cleanup() + + v1.NewStore() + if err := app.Run(ctx); err != nil { return fmt.Errorf("run application faild: %w", err) } diff --git a/cmd/init.go b/cmd/init.go index 0733170..1b0399f 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -6,10 +6,10 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" - "github.com/yiran15/api-server/base/apitypes" "github.com/yiran15/api-server/base/conf" "github.com/yiran15/api-server/base/constant" "github.com/yiran15/api-server/base/data" + apitypes "github.com/yiran15/api-server/base/types" "github.com/yiran15/api-server/model" "github.com/yiran15/api-server/pkg/casbin" "github.com/yiran15/api-server/pkg/jwt" @@ -60,10 +60,7 @@ func getService() (*service, func(), error) { } provider := store.NewDBProvider(db) - userRepo := store.NewUserStore(provider) - roleRepo := store.NewRoleStore(provider) apiRepo := store.NewApiStore(provider) - casbinStore := store.NewCasbinStore(provider) txManager := store.NewTxManager(db) redisClient, err := data.NewRDB() @@ -86,8 +83,8 @@ func getService() (*service, func(), error) { } casbinManager := casbin.NewCasbinManager(casbinEnforcer) - userServicer := v1.NewUserService(userRepo, roleRepo, cacheStore, txManager, generateToken, nil, nil, nil) - roleServicer := v1.NewRoleService(roleRepo, apiRepo, casbinStore, casbinManager, txManager) + userServicer := v1.NewUserService(cacheStore, txManager, generateToken, nil, nil) + roleServicer := v1.NewRoleService(casbinManager) apiServicer := v1.NewApiServicer(apiRepo) return &service{ db: db, diff --git a/cmd/wire_gen.go b/cmd/wire_gen.go index b6871ae..aaeaeb9 100644 --- a/cmd/wire_gen.go +++ b/cmd/wire_gen.go @@ -24,19 +24,15 @@ import ( // Injectors from wire.go: func InitApplication() (*app.Application, func(), error) { - db, cleanup, err := data.NewDB() + client, err := data.NewRDB() if err != nil { return nil, nil, err } - dbProvider := store.NewDBProvider(db) - userStorer := store.NewUserStore(dbProvider) - roleStorer := store.NewRoleStore(dbProvider) - client, err := data.NewRDB() + cacheStore, cleanup, err := store.NewCacheStore(client) if err != nil { - cleanup() return nil, nil, err } - cacheStore, cleanup2, err := store.NewCacheStore(client) + db, cleanup2, err := data.NewDB() if err != nil { cleanup() return nil, nil, err @@ -54,12 +50,9 @@ func InitApplication() (*app.Application, func(), error) { cleanup() return nil, nil, err } - feiShuUserStorer := store.NewFeiShuUserStore(dbProvider) cacher := localcache.NewCacher(oAuth2) - userServicer := v1.NewUserService(userStorer, roleStorer, cacheStore, txManager, generateToken, oAuth2, feiShuUserStorer, cacher) + userServicer := v1.NewUserService(cacheStore, txManager, generateToken, oAuth2, cacher) userController := controller.NewUserController(userServicer) - apiStorer := store.NewApiStore(dbProvider) - casbinStorer := store.NewCasbinStore(dbProvider) enforcer, err := casbin.NewEnforcer(db) if err != nil { cleanup2() @@ -67,11 +60,14 @@ func InitApplication() (*app.Application, func(), error) { return nil, nil, err } casbinManager := casbin.NewCasbinManager(enforcer) - roleServicer := v1.NewRoleService(roleStorer, apiStorer, casbinStorer, casbinManager, txManager) + roleServicer := v1.NewRoleService(casbinManager) roleController := controller.NewRoleController(roleServicer) + dbProvider := store.NewDBProvider(db) + apiStorer := store.NewApiStore(dbProvider) apiServicer := v1.NewApiServicer(apiStorer) apiController := controller.NewApiController(apiServicer) authChecker := casbin.NewAuthChecker(enforcer) + userStorer := store.NewUserStore(dbProvider) middlewareMiddleware := middleware.NewMiddleware(generateToken, authChecker, cacheStore, userStorer) routerRouter := router.NewRouter(userController, roleController, apiController, middlewareMiddleware) engine, err := server.NewHttpServer(routerRouter) diff --git a/controller/api.go b/controller/api.go index 189bf73..ce05348 100644 --- a/controller/api.go +++ b/controller/api.go @@ -4,8 +4,8 @@ import ( "net/http" "github.com/gin-gonic/gin" - "github.com/yiran15/api-server/base/apitypes" "github.com/yiran15/api-server/base/constant" + "github.com/yiran15/api-server/base/types" v1 "github.com/yiran15/api-server/service/v1" ) @@ -34,8 +34,8 @@ func NewApiController(apiService v1.ApiServicer) ApiController { // @Tags API管理 // @Accept json // @Produce json -// @Param data body apitypes.ApiCreateRequest true "创建请求参数" -// @Success 200 {object} apitypes.Response "创建成功" +// @Param data body types.ApiCreateRequest true "创建请求参数" +// @Success 200 {object} types.Response "创建成功" // @Router /api/v1/api [post] func (receiver *apiController) CreateApi(c *gin.Context) { ResponseOnlySuccess(c, receiver.apiService.CreateApi, bindTypeJson) @@ -47,8 +47,8 @@ func (receiver *apiController) CreateApi(c *gin.Context) { // @Tags API管理 // @Accept json // @Produce json -// @Param data body apitypes.ApiUpdateRequest true "更新请求参数" -// @Success 200 {object} apitypes.Response "更新成功" +// @Param data body types.ApiUpdateRequest true "更新请求参数" +// @Success 200 {object} types.Response "更新成功" // @Router /api/v1/api/:id [put] func (receiver *apiController) UpdateApi(c *gin.Context) { ResponseOnlySuccess(c, receiver.apiService.UpdateApi, bindTypeUri, bindTypeJson) @@ -60,8 +60,8 @@ func (receiver *apiController) UpdateApi(c *gin.Context) { // @Tags API管理 // @Accept json // @Produce json -// @Param data body apitypes.IDRequest true "删除请求参数" -// @Success 200 {object} apitypes.Response "删除成功" +// @Param data body types.IDRequest true "删除请求参数" +// @Success 200 {object} types.Response "删除成功" // @Router /api/v1/api/:id [delete] func (receiver *apiController) DeleteApi(c *gin.Context) { ResponseOnlySuccess(c, receiver.apiService.DeleteApi, bindTypeUri) @@ -73,8 +73,8 @@ func (receiver *apiController) DeleteApi(c *gin.Context) { // @Tags API管理 // @Accept json // @Produce json -// @Param data body apitypes.IDRequest true "查询请求参数" -// @Success 200 {object} apitypes.Response{data=model.Api} "查询成功" +// @Param data body types.IDRequest true "查询请求参数" +// @Success 200 {object} types.Response{data=model.Api} "查询成功" // @Router /api/v1/api/:id [get] func (receiver *apiController) QueryApi(c *gin.Context) { ResponseWithData(c, receiver.apiService.QueryApi, bindTypeUri) @@ -86,8 +86,8 @@ func (receiver *apiController) QueryApi(c *gin.Context) { // @Tags API管理 // @Accept json // @Produce json -// @Param data query apitypes.ApiListRequest true "查询请求参数" -// @Success 200 {object} apitypes.Response{data=apitypes.ApiListResponse} "查询成功" +// @Param data query types.ApiListRequest true "查询请求参数" +// @Success 200 {object} types.Response{data=types.ApiListResponse} "查询成功" // @Router /api/v1/api/ [get] func (receiver *apiController) ListApi(c *gin.Context) { ResponseWithData(c, receiver.apiService.ListApi, bindTypeUri, bindTypeQuery) @@ -98,9 +98,9 @@ func (receiver *apiController) ListApi(c *gin.Context) { // @Tags API管理 // @Accept json // @Produce json -// @Success 200 {object} apitypes.Response{data=apitypes.ServerApiData} "查询成功" +// @Success 200 {object} types.Response{data=types.ServerApiData} "查询成功" // @Router /api/v1/api/serverApi [get] func (receiver *apiController) GetServerApi(c *gin.Context) { - c.JSON(http.StatusOK, apitypes.NewResponseWithOpts(http.StatusOK, apitypes.WithMsg("success"), apitypes.WithData(constant.ApiData))) - // c.JSON(http.StatusOK, apitypes.NewResponse(http.StatusOK, "success", constant.ApiData, "")) + c.JSON(http.StatusOK, types.NewResponseWithOpts(http.StatusOK, types.WithMsg("success"), types.WithData(constant.ApiData))) + // c.JSON(http.StatusOK, types.NewResponse(http.StatusOK, "success", constant.ApiData, "")) } diff --git a/controller/check_req.go b/controller/check_req.go index 75bd33e..2e33669 100644 --- a/controller/check_req.go +++ b/controller/check_req.go @@ -10,7 +10,7 @@ import ( ut "github.com/go-playground/universal-translator" "github.com/go-playground/validator/v10" zh_translations "github.com/go-playground/validator/v10/translations/zh" - "github.com/yiran15/api-server/base/apitypes" + "github.com/yiran15/api-server/base/types" ) var ( @@ -59,7 +59,7 @@ func registerValidator(v *validator.Validate) error { } var userListValidator validator.Func = func(fl validator.FieldLevel) bool { - user, ok := fl.Parent().Interface().(apitypes.UserListRequest) + user, ok := fl.Parent().Interface().(types.UserListRequest) if !ok { return false } diff --git a/controller/handler.go b/controller/handler.go index 3b3acb1..b1e33dd 100644 --- a/controller/handler.go +++ b/controller/handler.go @@ -9,8 +9,8 @@ import ( "github.com/gin-contrib/requestid" "github.com/gin-gonic/gin" "github.com/go-sql-driver/mysql" - "github.com/yiran15/api-server/base/apitypes" "github.com/yiran15/api-server/base/constant" + "github.com/yiran15/api-server/base/types" "gorm.io/gorm" ) @@ -120,16 +120,16 @@ func ResponseNoBind(c *gin.Context, handler HandlerErrNoBind) { func responseError(c *gin.Context, err error) { code, err := getErr(err) - c.JSON(code, apitypes.NewResponseWithOpts(code, apitypes.WithError(err.Error()))) + c.JSON(code, types.NewResponseWithOpts(code, types.WithError(err.Error()))) c.Error(err) } func responseSuccess(c *gin.Context, data any) { - c.JSON(http.StatusOK, apitypes.NewResponseWithOpts(0, apitypes.WithMsg("success"), apitypes.WithData(data))) + c.JSON(http.StatusOK, types.NewResponseWithOpts(0, types.WithMsg("success"), types.WithData(data))) } func responseParamError(c *gin.Context, err error, errors string) { - c.JSON(http.StatusBadRequest, apitypes.NewResponseWithOpts(http.StatusBadRequest, apitypes.WithMsg("parameter error"), apitypes.WithError(errors))) + c.JSON(http.StatusBadRequest, types.NewResponseWithOpts(http.StatusBadRequest, types.WithMsg("parameter error"), types.WithError(errors))) c.Error(err) } diff --git a/controller/role.go b/controller/role.go index 06ef12f..94937d0 100644 --- a/controller/role.go +++ b/controller/role.go @@ -29,8 +29,8 @@ func NewRoleController(roleService v1.RoleServicer) RoleController { // @Tags 角色管理 // @Accept json // @Produce json -// @Param data body apitypes.RoleCreateRequest true "创建请求参数" -// @Success 200 {object} apitypes.Response "创建成功" +// @Param data body types.RoleCreateRequest true "创建请求参数" +// @Success 200 {object} types.Response "创建成功" // @Router /api/v1/role [post] func (receiver *roleController) CreateRole(c *gin.Context) { ResponseOnlySuccess(c, receiver.roleService.CreateRole, bindTypeJson) @@ -42,8 +42,8 @@ func (receiver *roleController) CreateRole(c *gin.Context) { // @Tags 角色管理 // @Accept json // @Produce json -// @Param data body apitypes.RoleUpdateRequest true "更新请求参数" -// @Success 200 {object} apitypes.Response "更新成功" +// @Param data body types.RoleUpdateRequest true "更新请求参数" +// @Success 200 {object} types.Response "更新成功" // @Router /api/v1/role/:id [put] func (receiver *roleController) UpdateRole(c *gin.Context) { ResponseOnlySuccess(c, receiver.roleService.UpdateRole, bindTypeUri, bindTypeJson) @@ -55,8 +55,8 @@ func (receiver *roleController) UpdateRole(c *gin.Context) { // @Tags 角色管理 // @Accept json // @Produce json -// @Param data body apitypes.IDRequest true "删除请求参数" -// @Success 200 {object} apitypes.Response "删除成功" +// @Param data body types.IDRequest true "删除请求参数" +// @Success 200 {object} types.Response "删除成功" // @Router /api/v1/role/:id [delete] func (receiver *roleController) DeleteRole(c *gin.Context) { ResponseOnlySuccess(c, receiver.roleService.DeleteRole, bindTypeUri) @@ -68,8 +68,8 @@ func (receiver *roleController) DeleteRole(c *gin.Context) { // @Tags 角色管理 // @Accept json // @Produce json -// @Param data body apitypes.IDRequest true "查询请求参数" -// @Success 200 {object} apitypes.Response{data=model.Role} "查询成功" +// @Param data body types.IDRequest true "查询请求参数" +// @Success 200 {object} types.Response{data=model.Role} "查询成功" // @Router /api/v1/role/:id [get] func (receiver *roleController) QueryRole(c *gin.Context) { ResponseWithData(c, receiver.roleService.QueryRole, bindTypeUri) @@ -81,8 +81,8 @@ func (receiver *roleController) QueryRole(c *gin.Context) { // @Tags 角色管理 // @Accept json // @Produce json -// @Param data query apitypes.RoleListRequest true "查询请求参数" -// @Success 200 {object} apitypes.Response{data=apitypes.RoleListResponse} "查询成功" +// @Param data query types.RoleListRequest true "查询请求参数" +// @Success 200 {object} types.Response{data=types.RoleListResponse} "查询成功" // @Router /api/v1/role/ [get] func (receiver *roleController) ListRole(c *gin.Context) { ResponseWithData(c, receiver.roleService.ListRole, bindTypeUri, bindTypeQuery) diff --git a/controller/user.go b/controller/user.go index 0e64547..7ac6320 100644 --- a/controller/user.go +++ b/controller/user.go @@ -45,8 +45,8 @@ func NewUserController(userServicer v1.UserServicer) UserController { // @Tags 用户管理 // @Accept json // @Produce json -// @Param data body apitypes.UserLoginRequest true "登录请求参数" -// @Success 200 {object} apitypes.Response{data=apitypes.UserLoginResponse} "登录成功" +// @Param data body types.UserLoginRequest true "登录请求参数" +// @Success 200 {object} types.Response{data=types.UserLoginResponse} "登录成功" // @Router /api/v1/users/login [post] func (receiver *UserControllerImpl) UserLoginController(c *gin.Context) { ResponseWithData(c, receiver.userServicer.Login, bindTypeJson) @@ -58,7 +58,7 @@ func (receiver *UserControllerImpl) UserLoginController(c *gin.Context) { // @Tags 用户管理 // @Accept json // @Produce json -// @Success 200 {object} apitypes.Response "注销成功" +// @Success 200 {object} types.Response "注销成功" // @Router /api/v1/user/logout [post] func (receiver *UserControllerImpl) UserLogoutController(c *gin.Context) { ResponseNoBind(c, receiver.userServicer.Logout) @@ -70,8 +70,8 @@ func (receiver *UserControllerImpl) UserLogoutController(c *gin.Context) { // @Tags 用户管理 // @Accept json // @Produce json -// @Param data body apitypes.UserCreateRequest true "创建请求参数" -// @Success 200 {object} apitypes.Response "创建成功" +// @Param data body types.UserCreateRequest true "创建请求参数" +// @Success 200 {object} types.Response "创建成功" // @Router /api/v1/user/register [post] func (receiver *UserControllerImpl) UserCreateController(c *gin.Context) { ResponseOnlySuccess(c, receiver.userServicer.CreateUser, bindTypeJson) @@ -83,8 +83,8 @@ func (receiver *UserControllerImpl) UserCreateController(c *gin.Context) { // @Tags 用户管理 // @Accept json // @Produce json -// @Param data body apitypes.UserUpdateAdminRequest true "更新请求参数" -// @Success 200 {object} apitypes.Response "更新成功" +// @Param data body types.UserUpdateAdminRequest true "更新请求参数" +// @Success 200 {object} types.Response "更新成功" // @Router /api/v1/user/:id [put] func (receiver *UserControllerImpl) UserUpdateByAdminController(c *gin.Context) { ResponseOnlySuccess(c, receiver.userServicer.UpdateUserByAdmin, bindTypeUri, bindTypeJson) @@ -96,8 +96,8 @@ func (receiver *UserControllerImpl) UserUpdateByAdminController(c *gin.Context) // @Tags 用户管理 // @Accept json // @Produce json -// @Param data body apitypes.UserUpdateSelfRequest true "更新请求参数" -// @Success 200 {object} apitypes.Response "更新成功" +// @Param data body types.UserUpdateSelfRequest true "更新请求参数" +// @Success 200 {object} types.Response "更新成功" // @Router /api/v1/user/self [put] func (receiver *UserControllerImpl) UserUpdateBySelfController(c *gin.Context) { ResponseOnlySuccess(c, receiver.userServicer.UpdateUserBySelf, bindTypeJson) @@ -109,8 +109,8 @@ func (receiver *UserControllerImpl) UserUpdateBySelfController(c *gin.Context) { // @Tags 用户管理 // @Accept json // @Produce json -// @Param data body apitypes.IDRequest true "删除请求参数" -// @Success 200 {object} apitypes.Response "删除成功" +// @Param data body types.IDRequest true "删除请求参数" +// @Success 200 {object} types.Response "删除成功" // @Router /api/v1/user/:id [delete] func (receiver *UserControllerImpl) UserDeleteController(c *gin.Context) { ResponseOnlySuccess(c, receiver.userServicer.DeleteUser, bindTypeUri) @@ -122,8 +122,8 @@ func (receiver *UserControllerImpl) UserDeleteController(c *gin.Context) { // @Tags 用户管理 // @Accept json // @Produce json -// @Param data body apitypes.IDRequest true "查询请求参数" -// @Success 200 {object} apitypes.Response{data=model.User} "查询成功" +// @Param data body types.IDRequest true "查询请求参数" +// @Success 200 {object} types.Response{data=model.User} "查询成功" // @Router /api/v1/user/:id [get] func (receiver *UserControllerImpl) UserQueryController(c *gin.Context) { ResponseWithData(c, receiver.userServicer.QueryUser, bindTypeUri) @@ -135,7 +135,7 @@ func (receiver *UserControllerImpl) UserQueryController(c *gin.Context) { // @Tags 用户管理 // @Accept json // @Produce json -// @Success 200 {object} apitypes.Response{data=model.User} "查询成功" +// @Success 200 {object} types.Response{data=model.User} "查询成功" // @Router /api/v1/user/info [get] func (receiver *UserControllerImpl) UserInfoController(c *gin.Context) { ResponseWithDataNoBind(c, receiver.userServicer.Info) @@ -147,8 +147,8 @@ func (receiver *UserControllerImpl) UserInfoController(c *gin.Context) { // @Tags 用户管理 // @Accept json // @Produce json -// @Param data query apitypes.UserListRequest true "查询请求参数" -// @Success 200 {object} apitypes.Response{data=apitypes.UserListResponse} "登录成功" +// @Param data query types.UserListRequest true "查询请求参数" +// @Success 200 {object} types.Response{data=types.UserListResponse} "登录成功" // @Router /api/v1/user/ [get] func (receiver *UserControllerImpl) UserListController(c *gin.Context) { ResponseWithData(c, receiver.userServicer.ListUser, bindTypeQuery) @@ -189,8 +189,8 @@ func (receiver *UserControllerImpl) OAuth2LoginController(c *gin.Context) { // @Tags 用户管理 // @Accept json // @Produce json -// @Param data query apitypes.OAuthLoginRequest true "回调请求参数" -// @Success 200 {object} apitypes.Response{data=apitypes.UserLoginResponse} "登录成功" +// @Param data query types.OAuthLoginRequest true "回调请求参数" +// @Success 200 {object} types.Response{data=types.UserLoginResponse} "登录成功" // @Router /api/v1/oauth2/callback [get] func (receiver *UserControllerImpl) OAuth2CallbackController(c *gin.Context) { session := sessions.Default(c) @@ -226,7 +226,7 @@ func (receiver *UserControllerImpl) OAuth2CallbackController(c *gin.Context) { // @Tags 用户管理 // @Accept json // @Produce json -// @Success 200 {object} apitypes.Response{data=[]string} "获取成功" +// @Success 200 {object} types.Response{data=[]string} "获取成功" // @Router /api/v1/oauth2/provider [get] func (receiver *UserControllerImpl) OAuth2ProviderController(c *gin.Context) { ResponseWithDataNoBind(c, receiver.userServicer.OAuth2Provider) @@ -238,8 +238,8 @@ func (receiver *UserControllerImpl) OAuth2ProviderController(c *gin.Context) { // @Tags 用户管理 // @Accept json // @Produce json -// @Param data body apitypes.OAuthActivateRequest true "激活请求参数" -// @Success 200 {object} apitypes.Response{data=apitypes.UserLoginResponse} "激活成功" +// @Param data body types.OAuthActivateRequest true "激活请求参数" +// @Success 200 {object} types.Response{data=types.UserLoginResponse} "激活成功" // @Router /api/v1/oauth2/:id [post] func (receiver *UserControllerImpl) OAuth2ActivateController(c *gin.Context) { session := sessions.Default(c) diff --git a/go.mod b/go.mod index efbd8df..fbf0c49 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module github.com/yiran15/api-server -go 1.23.7 +go 1.24.0 + +toolchain go1.24.9 require ( github.com/casbin/casbin/v2 v2.109.0 @@ -11,7 +13,7 @@ require ( github.com/go-playground/locales v0.14.1 github.com/go-playground/universal-translator v0.18.1 github.com/go-playground/validator/v10 v10.27.0 - github.com/go-sql-driver/mysql v1.8.1 + github.com/go-sql-driver/mysql v1.9.3 github.com/golang-jwt/jwt/v5 v5.2.2 github.com/google/uuid v1.6.0 github.com/google/wire v0.6.0 @@ -24,25 +26,32 @@ require ( github.com/swaggo/gin-swagger v1.6.0 github.com/swaggo/swag v1.16.6 go.uber.org/zap v1.27.0 - golang.org/x/crypto v0.41.0 + golang.org/x/crypto v0.46.0 golang.org/x/oauth2 v0.27.0 gorm.io/driver/mysql v1.6.0 - gorm.io/gorm v1.30.0 + gorm.io/gorm v1.31.1 ) require ( + github.com/casbin/casbin/v3 v3.8.1 // indirect github.com/gorilla/context v1.1.2 // indirect github.com/gorilla/securecookie v1.1.2 // indirect github.com/gorilla/sessions v1.4.0 // indirect + github.com/ncruces/go-strftime v1.0.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/shopspring/decimal v1.4.0 // indirect + golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 // indirect + gorm.io/datatypes v1.2.4 // indirect + gorm.io/hints v1.1.0 // indirect ) require ( filippo.io/edwards25519 v1.1.0 // indirect github.com/KyleBanks/depth v1.2.1 // indirect - github.com/bmatcuk/doublestar/v4 v4.6.1 // indirect + github.com/bmatcuk/doublestar/v4 v4.9.1 // indirect github.com/bytedance/sonic v1.14.0 // indirect github.com/bytedance/sonic/loader v0.3.0 // indirect - github.com/casbin/govaluate v1.3.0 // indirect + github.com/casbin/govaluate v1.10.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cloudwego/base64x v0.1.6 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect @@ -52,8 +61,8 @@ require ( github.com/gin-contrib/requestid v1.0.5 github.com/gin-contrib/sse v1.1.0 // indirect github.com/gin-contrib/zap v1.1.5 - github.com/glebarez/go-sqlite v1.20.3 // indirect - github.com/glebarez/sqlite v1.7.0 // indirect + github.com/glebarez/go-sqlite v1.22.0 // indirect + github.com/glebarez/sqlite v1.11.0 // indirect github.com/go-openapi/jsonpointer v0.21.2 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/spec v0.21.0 // indirect @@ -64,9 +73,9 @@ require ( github.com/golang-sql/sqlexp v0.1.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect - github.com/jackc/pgx/v5 v5.5.5 // indirect - github.com/jackc/puddle/v2 v2.2.1 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/pgx/v5 v5.8.0 // indirect + github.com/jackc/puddle/v2 v2.2.2 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/josharian/intern v1.0.0 // indirect @@ -75,11 +84,11 @@ require ( github.com/leodido/go-urn v1.4.0 // indirect github.com/mailru/easyjson v0.9.0 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/microsoft/go-mssqldb v1.6.0 // indirect + github.com/microsoft/go-mssqldb v1.9.5 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect - github.com/remyoudompheng/bigfft v0.0.0-20230126093431-47fa9a501578 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/sagikazarmark/locafero v0.7.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect @@ -91,19 +100,20 @@ require ( github.com/ugorji/go/codec v1.3.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/arch v0.20.0 // indirect - golang.org/x/mod v0.27.0 // indirect - golang.org/x/net v0.43.0 // indirect - golang.org/x/sync v0.16.0 // indirect - golang.org/x/sys v0.35.0 // indirect - golang.org/x/text v0.28.0 // indirect - golang.org/x/tools v0.36.0 // indirect + golang.org/x/mod v0.31.0 // indirect + golang.org/x/net v0.48.0 // indirect + golang.org/x/sync v0.19.0 // indirect + golang.org/x/sys v0.39.0 // indirect + golang.org/x/text v0.32.0 // indirect + golang.org/x/tools v0.40.0 // indirect google.golang.org/protobuf v1.36.7 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - gorm.io/driver/postgres v1.5.9 // indirect - gorm.io/driver/sqlserver v1.5.3 // indirect - gorm.io/plugin/dbresolver v1.6.0 // indirect - modernc.org/libc v1.22.2 // indirect - modernc.org/mathutil v1.5.0 // indirect - modernc.org/memory v1.5.0 // indirect - modernc.org/sqlite v1.20.3 // indirect + gorm.io/driver/postgres v1.6.0 // indirect + gorm.io/driver/sqlserver v1.6.3 // indirect + gorm.io/gen v0.3.27 + gorm.io/plugin/dbresolver v1.6.2 // indirect + modernc.org/libc v1.67.4 // indirect + modernc.org/mathutil v1.7.1 // indirect + modernc.org/memory v1.11.0 // indirect + modernc.org/sqlite v1.42.2 // indirect ) diff --git a/go.sum b/go.sum index 40d710b..76e236a 100644 --- a/go.sum +++ b/go.sum @@ -1,27 +1,56 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.1.2/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0/go.mod h1:ON4tFdPTwRcgWEaVDrN3584Ef+b7GgSJaXxe5fW9t4M= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.1/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1 h1:/iHxaJhsFr0+xVFfbMr5vxz848jyiWuIEDhYq3y5odY= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1 h1:lGlwhPtrX6EVml1hO0ivjkUxsSyl4dsiw9qcA1k/3IQ= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 h1:Gt0j3wceWMwPmiazCa8MzMA0MfhmPIz0Qp0FJ6qcM0U= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.1.0/go.mod h1:bhXu1AjYL+wutSL/kpSq6s7733q2Rb0yuot9Zgfqa/0= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 h1:vcYCAze6p19qBW7MhZybIsqD8sMV8js0NyQM8JDnVtg= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1/go.mod h1:uE9zaUfEQT/nbQjVi2IblCG9iaLtZsuYZ8ne+PuQ02M= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 h1:sO0/P7g68FrryJzljemN+6GTssUXdANk6aJ7T1ZxnsQ= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1 h1:B+blDbyVIG3WaikNxPnhPiJ1MThR03b3vKGtER95TP4= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= github.com/Azure/azure-sdk-for-go/sdk/internal v1.2.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY= github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1 h1:6oNBlSdi1QqM1PNW7FPA6xOGA5UNsXnkaYZz9vdPGhA= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2/go.mod h1:yInRyqWXAuaPrgI7p70+lDDgh3mlBohis29jGMISnmc= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0/go.mod h1:4OG6tQ9EOP/MT0NMjDlRzWoVFxfu9rN9B2X+tlSVktg= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 h1:FPKJS1T+clwv+OLGt13a8UjqeRuh0O4SJ3lUriThc+4= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.0 h1:yfJe15aSwEQ6Oo6J+gdfdulPNoZ3TEhmbhLIoxZcA+U= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.0/go.mod h1:Q28U+75mpCaSCDowNEmhIo/rmgdkqmkmzI7N6TGR4UY= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1 h1:MyVTgWR8qd/Jw1Le0NZebGBUCLbtak3bJ3z1OlqZBpw= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1/go.mod h1:GpPjLhVR9dnUoJMyHWSPy71xY9/lcmpzIPZXmF0FCVY= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.3.1 h1:Wgf5rZba3YZqeTNJPtvqZoBu1sBN/L4sry+u2U3Y75w= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v0.8.0 h1:T028gtTPiYt/RMUfs8nVsAL7FDQrfLlrm/NnRG/zcC4= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v0.8.0/go.mod h1:cw4zVQgBby0Z5f2v0itn6se2dDP17nTjbZFXW5uPyHA= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0 h1:D3occbWoio4EBLkbkevetNMAVX197GkzbUMtqjGWn80= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h1:bTSOgj05NGRuHHhQwAdPnYr9TOdNmKlZTgGLL6nyAdI= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.1.1 h1:bFWuoEKg+gImo7pvkiQEFAc8ocibADgXeiLAxWhWmkI= +github.com/AzureAD/microsoft-authentication-library-for-go v0.5.1/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= github.com/AzureAD/microsoft-authentication-library-for-go v1.1.0 h1:HCc0+LpPfpCKs6LGGLAhwBARt9632unrVcI6i8s/8os= github.com/AzureAD/microsoft-authentication-library-for-go v1.1.0/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 h1:DzHpqpoJVaCgOUdVHxE8QB52S6NiVdDQvGlny1qvPqA= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 h1:oygO0locgZJe7PpYPXT5A29ZkwJaPqcva7BVeemZOZs= github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I= github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= +github.com/bmatcuk/doublestar/v4 v4.9.1 h1:X8jg9rRZmJd4yRy7ZeNDRnM+T3ZfHv15JiBJ/avrEXE= +github.com/bmatcuk/doublestar/v4 v4.9.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= @@ -32,15 +61,22 @@ github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZw github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= github.com/casbin/casbin/v2 v2.109.0 h1:/Rxcqa8V9t6/mMleX4laRtc/mduA+oYdZr449Rd1lD0= github.com/casbin/casbin/v2 v2.109.0/go.mod h1:Ee33aqGrmES+GNL17L0h9X28wXuo829wnNUnS0edAco= +github.com/casbin/casbin/v3 v3.8.1 h1:D4dEY4knePPR4YgNP5WZtWNaOxD0UK0LpPy9+zxtBwo= +github.com/casbin/casbin/v3 v3.8.1/go.mod h1:5rJbQr2e6AuuDDNxnPc5lQlC9nIgg6nS1zYwKXhpHC8= github.com/casbin/gorm-adapter/v3 v3.33.0 h1:wS7WoD+7zYR70ZxvZBj++oXPpaF/+WwhdmQ02w9micg= github.com/casbin/gorm-adapter/v3 v3.33.0/go.mod h1:vAPCl1sRTT+VgUSAkOb2zEWDDc+jcfrnKybH8aUkCKM= +github.com/casbin/gorm-adapter/v3 v3.40.0 h1:jj58MTKmjAqvTkVOcaapN6HolwdtwiqxVVLsvY8Owsw= +github.com/casbin/gorm-adapter/v3 v3.40.0/go.mod h1:BQZRJhwUnwMpI+pT2m7/cUJwXxrHfzpBpPcNTyMGeGA= github.com/casbin/govaluate v1.3.0 h1:VA0eSY0M2lA86dYd5kPPuNZMUD9QkWnOCnavGrw9myc= github.com/casbin/govaluate v1.3.0/go.mod h1:G/UnbIjZk/0uMNaLwZZmFQrR72tYRZWQkO70si/iR7A= +github.com/casbin/govaluate v1.10.0 h1:ffGw51/hYH3w3rZcxO/KcaUIDOLP84w7nsidMVgaDG0= +github.com/casbin/govaluate v1.10.0/go.mod h1:G/UnbIjZk/0uMNaLwZZmFQrR72tYRZWQkO70si/iR7A= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M= github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -72,8 +108,12 @@ github.com/gin-gonic/gin v1.10.1 h1:T0ujvqyCSqRopADpgPgiTT63DUQVSfojyME59Ei63pQ= github.com/gin-gonic/gin v1.10.1/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= github.com/glebarez/go-sqlite v1.20.3 h1:89BkqGOXR9oRmG58ZrzgoY/Fhy5x0M+/WV48U5zVrZ4= github.com/glebarez/go-sqlite v1.20.3/go.mod h1:u3N6D/wftiAzIOJtZl6BmedqxmmkDfH3q+ihjqxC9u0= +github.com/glebarez/go-sqlite v1.22.0 h1:uAcMJhaA6r3LHMTFgP0SifzgXg46yJkgxqyuyec+ruQ= +github.com/glebarez/go-sqlite v1.22.0/go.mod h1:PlBIdHe0+aUEFn+r2/uthrWq4FxbzugL0L8Li6yQJbc= github.com/glebarez/sqlite v1.7.0 h1:A7Xj/KN2Lvie4Z4rrgQHY8MsbebX3NyWsL3n2i82MVI= github.com/glebarez/sqlite v1.7.0/go.mod h1:PkeevrRlF/1BhQBCnzcMWzgrIk7IOop+qS2jUYLfHhk= +github.com/glebarez/sqlite v1.11.0 h1:wSG0irqzP6VurnMEpFGer5Li19RpIRi2qvQz++w0GMw= +github.com/glebarez/sqlite v1.11.0/go.mod h1:h8/o8j5wiAsqSPoWELDUdJXhjAhsVliSn7bWZjOhrgQ= github.com/go-openapi/jsonpointer v0.21.2 h1:AqQaNADVwq/VnkCmQg6ogE+M3FOsKTytwges0JdwVuA= github.com/go-openapi/jsonpointer v0.21.2/go.mod h1:50I1STOfbY1ycR8jGz8DaMeLCdXiI6aDteEdRNNzpdk= github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= @@ -92,15 +132,22 @@ github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHO github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo= +github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= @@ -108,6 +155,7 @@ github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EO github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -115,7 +163,9 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= +github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -137,18 +187,28 @@ github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsI github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= github.com/jackc/pgx/v5 v5.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw= github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= +github.com/jackc/pgx/v5 v5.8.0 h1:TYPDoleBBme0xGSAX3/+NujXXtpZn9HBONkQC7IEZSo= +github.com/jackc/pgx/v5 v5.8.0/go.mod h1:QVeDInX2m9VyzvNeiCJVjCkNFqzsNb43204HshNSZKw= github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc= github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= @@ -159,8 +219,11 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= @@ -173,21 +236,38 @@ github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4 github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/microsoft/go-mssqldb v0.19.0/go.mod h1:ukJCBnnzLzpVF0qYRT+eg1e+eSwjeQ7IvenUv8QPook= github.com/microsoft/go-mssqldb v1.6.0 h1:mM3gYdVwEPFrlg/Dvr2DNVEgYFG7L42l+dGc67NNNpc= github.com/microsoft/go-mssqldb v1.6.0/go.mod h1:00mDtPbeQCRGC1HwOOR5K/gr30P1NcEG0vx6Kbv2aJU= +github.com/microsoft/go-mssqldb v1.7.2/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA= +github.com/microsoft/go-mssqldb v1.8.2/go.mod h1:vp38dT33FGfVotRiTmDo3bFyaHq+p3LektQrjTULowo= +github.com/microsoft/go-mssqldb v1.9.5 h1:orwya0X/5bsL1o+KasupTkk2eNTNFkTQG0BEe/HxCn0= +github.com/microsoft/go-mssqldb v1.9.5/go.mod h1:VCP2a0KEZZtGLRHd1PsLavLFYy/3xX2yJUPycv3Sr2Q= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w= +github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= +github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/redis/go-redis/v9 v9.11.0 h1:E3S08Gl/nJNn5vkxd2i78wZxWAPNZgUNTp8WIJUAiIs= @@ -195,11 +275,17 @@ github.com/redis/go-redis/v9 v9.11.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6 github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230126093431-47fa9a501578 h1:VstopitMQi3hZP0fzvnsLmzXZdQGc4bEcgu24cp+d4M= github.com/remyoudompheng/bigfft v0.0.0-20230126093431-47fa9a501578/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo= github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k= +github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= +github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= @@ -215,14 +301,17 @@ github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqj github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= @@ -248,37 +337,65 @@ golang.org/x/arch v0.20.0 h1:dx1zTU0MAE98U+TQ8BLl7XsJbgze2WnNKF/8tGp/Q6c= golang.org/x/arch v0.20.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= +golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= +golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0= +golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 h1:fQsdNF2N+/YewlRZiricy4P1iimyPKZ/xwniHj8Q2a0= +golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93/go.mod h1:EPRbTFwzwjXj9NpYyyrvenVh9Y+GFeEvMNh7Xuz7xgU= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ= golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc= +golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI= +golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= +golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= +golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M= golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -286,43 +403,74 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= +golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= +golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= +golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -330,37 +478,75 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= +golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA= +golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/datatypes v1.2.4 h1:uZmGAcK/QZ0uyfCuVg0VQY1ZmV9h1fuG0tMwKByO1z4= +gorm.io/datatypes v1.2.4/go.mod h1:f4BsLcFAX67szSv8svwLRjklArSHAvHLeE3pXAS5DZI= +gorm.io/datatypes v1.2.7 h1:ww9GAhF1aGXZY3EB3cJPJ7//JiuQo7DlQA7NNlVaTdk= +gorm.io/datatypes v1.2.7/go.mod h1:M2iO+6S3hhi4nAyYe444Pcb0dcIiOMJ7QHaUXxyiNZY= gorm.io/driver/mysql v1.6.0 h1:eNbLmNTpPpTOVZi8MMxCi2aaIm0ZpInbORNXDwyLGvg= gorm.io/driver/mysql v1.6.0/go.mod h1:D/oCC2GWK3M/dqoLxnOlaNKmXz8WNTfcS9y5ovaSqKo= gorm.io/driver/postgres v1.5.9 h1:DkegyItji119OlcaLjqN11kHoUgZ/j13E0jkJZgD6A8= gorm.io/driver/postgres v1.5.9/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI= +gorm.io/driver/postgres v1.6.0 h1:2dxzU8xJ+ivvqTRph34QX+WrRaJlmfyPqXmoGVjMBa4= +gorm.io/driver/postgres v1.6.0/go.mod h1:vUw0mrGgrTK+uPHEhAdV4sfFELrByKVGnaVRkXDhtWo= +gorm.io/driver/sqlite v1.1.6/go.mod h1:W8LmC/6UvVbHKah0+QOC7Ja66EaZXHwUTjgXY8YNWX8= +gorm.io/driver/sqlite v1.5.0/go.mod h1:kDMDfntV9u/vuMmz8APHtHF0b4nyBB7sfCieC6G8k8I= gorm.io/driver/sqlserver v1.5.3 h1:rjupPS4PVw+rjJkfvr8jn2lJ8BMhT4UW5FwuJY0P3Z0= gorm.io/driver/sqlserver v1.5.3/go.mod h1:B+CZ0/7oFJ6tAlefsKoyxdgDCXJKSgwS2bMOQZT0I00= +gorm.io/driver/sqlserver v1.6.0/go.mod h1:WQzt4IJo/WHKnckU9jXBLMJIVNMVeTu25dnOzehntWw= +gorm.io/driver/sqlserver v1.6.3 h1:UR+nWCuphPnq7UxnL57PSrlYjuvs+sf1N59GgFX7uAI= +gorm.io/driver/sqlserver v1.6.3/go.mod h1:VZeNn7hqX1aXoN5TPAFGWvxWG90xtA8erGn2gQmpc6U= +gorm.io/gen v0.3.27 h1:ziocAFLpE7e0g4Rum69pGfB9S6DweTxK8gAun7cU8as= +gorm.io/gen v0.3.27/go.mod h1:9zquz2xD1f3Eb/eHq4oLn2z6vDVvQlCY5S3uMBLv4EA= +gorm.io/gorm v1.21.15/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= +gorm.io/gorm v1.22.2/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= +gorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= +gorm.io/gorm v1.25.0/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gorm.io/gorm v1.25.7-0.20240204074919-46816ad31dde/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= gorm.io/gorm v1.30.0 h1:qbT5aPv1UH8gI99OsRlvDToLxW5zR7FzS9acZDOZcgs= gorm.io/gorm v1.30.0/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE= +gorm.io/gorm v1.31.1 h1:7CA8FTFz/gRfgqgpeKIBcervUn3xSyPUmr6B2WXJ7kg= +gorm.io/gorm v1.31.1/go.mod h1:XyQVbO2k6YkOis7C2437jSit3SsDK72s7n7rsSHd+Gs= +gorm.io/hints v1.1.0 h1:Lp4z3rxREufSdxn4qmkK3TLDltrM10FLTHiuqwDPvXw= +gorm.io/hints v1.1.0/go.mod h1:lKQ0JjySsPBj3uslFzY3JhYDtqEwzm+G1hv8rWujB6Y= +gorm.io/hints v1.1.2 h1:b5j0kwk5p4+3BtDtYqqfY+ATSxjj+6ptPgVveuynn9o= +gorm.io/hints v1.1.2/go.mod h1:/ARdpUHAtyEMCh5NNi3tI7FsGh+Cj/MIUlvNxCNCFWg= gorm.io/plugin/dbresolver v1.6.0 h1:XvKDeOtTn1EIX6s4SrKpEH82q0gXVemhYjbYZFGFVcw= gorm.io/plugin/dbresolver v1.6.0/go.mod h1:tctw63jdrOezFR9HmrKnPkmig3m5Edem9fdxk9bQSzM= +gorm.io/plugin/dbresolver v1.6.2 h1:F4b85TenghUeITqe3+epPSUtHH7RIk3fXr5l83DF8Pc= +gorm.io/plugin/dbresolver v1.6.2/go.mod h1:tctw63jdrOezFR9HmrKnPkmig3m5Edem9fdxk9bQSzM= modernc.org/libc v1.22.2 h1:4U7v51GyhlWqQmwCHj28Rdq2Yzwk55ovjFrdPjs8Hb0= modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug= +modernc.org/libc v1.67.4 h1:zZGmCMUVPORtKv95c2ReQN5VDjvkoRm9GWPTEPuvlWg= +modernc.org/libc v1.67.4/go.mod h1:QvvnnJ5P7aitu0ReNpVIEyesuhmDLQ8kaEoyMjIFZJA= modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= +modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= +modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= modernc.org/sqlite v1.20.3 h1:SqGJMMxjj1PHusLxdYxeQSodg7Jxn9WWkaAQjKrntZs= modernc.org/sqlite v1.20.3/go.mod h1:zKcGyrICaxNTMEHSr1HQ2GUraP0j+845GYw37+EyT6A= +modernc.org/sqlite v1.42.2 h1:7hkZUNJvJFN2PgfUdjni9Kbvd4ef4mNLOu0B9FGxM74= +modernc.org/sqlite v1.42.2/go.mod h1:+VkC6v3pLOAE0A0uVucQEcbVW0I5nHCeDaBf+DpsQT8= diff --git a/gormgen/main.go b/gormgen/main.go new file mode 100644 index 0000000..a268439 --- /dev/null +++ b/gormgen/main.go @@ -0,0 +1,25 @@ +package main + +import ( + "github.com/yiran15/api-server/base/conf" + "github.com/yiran15/api-server/base/data" + "github.com/yiran15/api-server/model" + "gorm.io/gen" +) + +func main() { + g := gen.NewGenerator(gen.Config{ + OutPath: "./stores", + Mode: gen.WithoutContext | gen.WithDefaultQuery | gen.WithQueryInterface, + }) + conf.LoadConfig("./config.yaml") + db, clear, err := data.NewDB() + if err != nil { + panic(err) + } + defer clear() + g.UseDB(db) + g.ApplyBasic(model.User{}, model.Role{}, model.Api{}, model.CasbinRule{}, model.FeiShuUser{}) + g.ApplyInterface(model.User{}, model.Role{}, model.Api{}, model.CasbinRule{}, model.FeiShuUser{}) + g.Execute() +} diff --git a/pkg/jwt/jwt.go b/pkg/jwt/jwt.go index c90bf07..3bb0de8 100644 --- a/pkg/jwt/jwt.go +++ b/pkg/jwt/jwt.go @@ -15,12 +15,13 @@ type JwtInterface interface { GenerateToken(id int64, userName string) (token string, err error) ParseToken(tokenString string) (jwtClaims *JwtClaims, err error) GetUser(ctx context.Context) (*JwtClaims, error) + GetExpire() time.Duration } type GenerateToken struct { secret string - expire time.Duration issuer string + expire time.Duration } func NewGenerateToken() (*GenerateToken, error) { @@ -102,3 +103,7 @@ func (j *GenerateToken) GetUser(ctx context.Context) (*JwtClaims, error) { } return jwtClaims, nil } + +func (j *GenerateToken) GetExpire() (expire time.Duration) { + return j.expire +} diff --git a/service/v1/api.go b/service/v1/api.go index 2f6dea1..ac73bcc 100644 --- a/service/v1/api.go +++ b/service/v1/api.go @@ -6,8 +6,9 @@ import ( "fmt" "strings" - "github.com/yiran15/api-server/base/apitypes" + "github.com/yiran15/api-server/base/helper" "github.com/yiran15/api-server/base/log" + "github.com/yiran15/api-server/base/types" "github.com/yiran15/api-server/model" "github.com/yiran15/api-server/store" "go.uber.org/zap" @@ -15,53 +16,55 @@ import ( ) type ApiServicer interface { - CreateApi(ctx context.Context, req *apitypes.ApiCreateRequest) error - UpdateApi(ctx context.Context, req *apitypes.ApiUpdateRequest) error - DeleteApi(ctx context.Context, req *apitypes.IDRequest) error - QueryApi(ctx context.Context, req *apitypes.IDRequest) (*model.Api, error) - ListApi(ctx context.Context, pagination *apitypes.ApiListRequest) (*apitypes.ApiListResponse, error) + CreateApi(ctx context.Context, req *types.ApiCreateRequest) error + UpdateApi(ctx context.Context, req *types.ApiUpdateRequest) error + DeleteApi(ctx context.Context, req *types.IDRequest) error + QueryApi(ctx context.Context, req *types.IDRequest) (*model.Api, error) + ListApi(ctx context.Context, pagination *types.ApiListRequest) (*types.ApiListResponse, error) } -type ApiService struct { - apiStore store.ApiStorer -} +type ApiService struct{} func NewApiServicer(apiStore store.ApiStorer) ApiServicer { - return &ApiService{ - apiStore: apiStore, - } + return &ApiService{} } -func (receiver *ApiService) CreateApi(ctx context.Context, req *apitypes.ApiCreateRequest) error { - if api, err := receiver.apiStore.Query(ctx, store.Where("name", req.Name)); err != nil { +func (receiver *ApiService) CreateApi(ctx context.Context, req *types.ApiCreateRequest) (err error) { + sql := a.WithContext(ctx) + if _, err = sql.Where(a.Name.Eq(req.Name)).First(); err != nil { if !errors.Is(err, gorm.ErrRecordNotFound) { return err } - if api != nil { - return fmt.Errorf("api %s already exists", req.Name) - } } - return receiver.apiStore.Create(ctx, &model.Api{ - Name: req.Name, - Path: req.Path, - Method: req.Method, - Description: req.Description, - }) + if err = sql.Create(types.NewApi(req)); err != nil { + return err + } + return nil } -func (receiver *ApiService) UpdateApi(ctx context.Context, req *apitypes.ApiUpdateRequest) error { - api, err := receiver.apiStore.Query(ctx, store.Where("id", req.ID)) - if err != nil { +func (receiver *ApiService) UpdateApi(ctx context.Context, req *types.ApiUpdateRequest) (err error) { + var ( + api *model.Api + sql = a.WithContext(ctx).Where(a.ID.Eq(req.ID)) + ) + if api, err = sql.First(); err != nil { return err } api.Description = req.Description - return receiver.apiStore.Update(ctx, api) + if _, err = sql.Updates(api); err != nil { + return err + } + return nil } -func (receiver *ApiService) DeleteApi(ctx context.Context, req *apitypes.IDRequest) error { - api, err := receiver.apiStore.Query(ctx, store.Where("id", req.ID), store.Preload(model.PreloadRoles)) - if err != nil { +func (receiver *ApiService) DeleteApi(ctx context.Context, req *types.IDRequest) (err error) { + var ( + api *model.Api + sql = a.WithContext(ctx).Where(a.ID.Eq(req.ID)) + ) + + if api, err = sql.Preload(a.Roles).First(); err != nil { return err } @@ -75,45 +78,49 @@ func (receiver *ApiService) DeleteApi(ctx context.Context, req *apitypes.IDReque return fmt.Errorf("api %s has roles %s", api.Name, rolesName) } - return receiver.apiStore.Delete(ctx, api) + if _, err = sql.Delete(api); err != nil { + return err + } + return nil } -func (receiver *ApiService) QueryApi(ctx context.Context, req *apitypes.IDRequest) (*model.Api, error) { - return receiver.apiStore.Query(ctx, store.Where("id", req.ID)) +func (receiver *ApiService) QueryApi(ctx context.Context, req *types.IDRequest) (api *model.Api, err error) { + if api, err = a.WithContext(ctx).Where(a.ID.Eq(req.ID)).First(); err != nil { + return nil, err + } + return api, nil } -func (receiver *ApiService) ListApi(ctx context.Context, req *apitypes.ApiListRequest) (*apitypes.ApiListResponse, error) { +func (receiver *ApiService) ListApi(ctx context.Context, req *types.ApiListRequest) (res *types.ApiListResponse, err error) { var ( - where store.Option - colum = "id" - oder = "desc" + apis []*model.Api + total int64 + sql = a.WithContext(ctx) ) if req.Name != "" { - where = store.Like("name", req.Name+"%") + sql = sql.Where(a.Name.Like(req.Name + "%")) } else if req.Path != "" { - where = store.Like("path", req.Path+"%") + sql = sql.Where(a.Path.Like(req.Path + "%")) } else if req.Method != "" { - where = store.Like("method", req.Method+"%") + sql = sql.Where(a.Method.Like(req.Method + "%")) + } + + if total, err = sql.Count(); err != nil { + return nil, err } if req.Sort != "" && req.Direction != "" { - colum = req.Sort - oder = req.Direction + sort, ok := a.GetFieldByName(req.Sort) + if !ok { + return nil, fmt.Errorf("invalid sort field: %s", req.Sort) + } + sql = sql.Order(helper.Sort(sort, req.Direction)) } - total, apis, err := receiver.apiStore.List(ctx, req.Page, req.PageSize, colum, oder, where) - if err != nil { + if apis, err = sql.Limit(req.PageSize).Offset(req.Page - 1*req.PageSize).Find(); err != nil { return nil, err } - return &apitypes.ApiListResponse{ - ListResponse: &apitypes.ListResponse{ - Pagination: &apitypes.Pagination{ - Page: req.Page, - PageSize: req.PageSize, - }, - Total: total, - }, - List: apis, - }, nil + + return types.NewApiListResponse(apis, total, req.PageSize, req.Page), nil } diff --git a/service/v1/role.go b/service/v1/role.go index 79a0c98..6f5e93f 100644 --- a/service/v1/role.go +++ b/service/v1/role.go @@ -6,51 +6,40 @@ import ( "fmt" "strings" - "github.com/yiran15/api-server/base/apitypes" + "github.com/yiran15/api-server/base/data" "github.com/yiran15/api-server/base/helper" + "github.com/yiran15/api-server/base/types" "github.com/yiran15/api-server/model" "github.com/yiran15/api-server/pkg/casbin" - "github.com/yiran15/api-server/store" + "github.com/yiran15/api-server/stores" "gorm.io/gorm" ) type RoleServicer interface { - CreateRole(ctx context.Context, req *apitypes.RoleCreateRequest) error - UpdateRole(ctx context.Context, req *apitypes.RoleUpdateRequest) error - DeleteRole(ctx context.Context, req *apitypes.IDRequest) error - QueryRole(ctx context.Context, req *apitypes.IDRequest) (*model.Role, error) - ListRole(ctx context.Context, pagination *apitypes.RoleListRequest) (*apitypes.RoleListResponse, error) + CreateRole(ctx context.Context, req *types.RoleCreateRequest) error + UpdateRole(ctx context.Context, req *types.RoleUpdateRequest) error + DeleteRole(ctx context.Context, req *types.IDRequest) error + QueryRole(ctx context.Context, req *types.IDRequest) (*model.Role, error) + ListRole(ctx context.Context, pagination *types.RoleListRequest) (*types.RoleListResponse, error) } type roleService struct { - roleRepository store.RoleStorer - apiRepository store.ApiStorer - casbinStore store.CasbinStorer - casbinManager casbin.CasbinManager - txManager store.TxManagerInterface + casbinManager casbin.CasbinManager } -func NewRoleService(roleRepository store.RoleStorer, apiRepository store.ApiStorer, casbinStore store.CasbinStorer, casbinManager casbin.CasbinManager, txManager store.TxManagerInterface) RoleServicer { - return &roleService{ - roleRepository: roleRepository, - apiRepository: apiRepository, - casbinStore: casbinStore, - casbinManager: casbinManager, - txManager: txManager, - } +func NewRoleService(casbinManager casbin.CasbinManager) RoleServicer { + return &roleService{casbinManager: casbinManager} } -func (receiver *roleService) CreateRole(ctx context.Context, req *apitypes.RoleCreateRequest) error { +func (receiver *roleService) CreateRole(ctx context.Context, req *types.RoleCreateRequest) (err error) { req.Apis = helper.RemoveDuplicates(req.Apis) var ( role *model.Role - total int64 apis []*model.Api - err error rules []*model.CasbinRule + total int64 ) - - if role, err = receiver.roleRepository.Query(ctx, store.Where("name", req.Name)); err != nil { + if role, err = r.WithContext(ctx).Where(r.Name.Eq(req.Name)).First(); err != nil { if !errors.Is(err, gorm.ErrRecordNotFound) { return err } @@ -61,11 +50,13 @@ func (receiver *roleService) CreateRole(ctx context.Context, req *apitypes.RoleC } if len(req.Apis) > 0 { - total, apis, err = receiver.apiRepository.List(ctx, 0, 0, "", "", store.In("id", req.Apis)) - if err != nil { + sql := a.WithContext(ctx).Where(a.ID.In(req.Apis...)) + if total, err = sql.Count(); err != nil { + return err + } + if apis, err = sql.Find(); err != nil { return err } - if err := helper.ValidateRoleApis(req.Apis, total, apis); err != nil { return err } @@ -80,42 +71,52 @@ func (receiver *roleService) CreateRole(ctx context.Context, req *apitypes.RoleC }) } - if err := receiver.txManager.Transaction(ctx, func(ctx context.Context) error { - if err := receiver.roleRepository.Create(ctx, &model.Role{ + err = stores.Use(data.GetDB(ctx)).Transaction(func(tx *stores.Query) error { + role := &model.Role{ Name: req.Name, Description: req.Description, Apis: apis, - }); err != nil { + } + if err := tx.CasbinRule.WithContext(ctx).Create(rules...); err != nil { return err } - if err := receiver.casbinStore.CreateBatch(ctx, rules); err != nil { + + err := tx.Role.WithContext(ctx).Create(role) + if err != nil { return err } return nil - }); err != nil { + }) + if err != nil { return err } return receiver.casbinManager.LoadPolicy() } -func (receiver *roleService) UpdateRole(ctx context.Context, req *apitypes.RoleUpdateRequest) error { +func (receiver *roleService) UpdateRole(ctx context.Context, req *types.RoleUpdateRequest) (err error) { var ( - total int64 - apis []*model.Api - err error - rules []*model.CasbinRule + total int64 + role *model.Role + apis []*model.Api + rules []*model.CasbinRule + casbinRules []*model.CasbinRule ) req.Apis = helper.RemoveDuplicates(req.Apis) - role, err := receiver.roleRepository.Query(ctx, store.Where("id", req.ID)) - if err != nil { + if role, err = r.WithContext(ctx).Where(r.ID.Eq(req.ID)).First(); err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return fmt.Errorf("role not found") + } return err } role.Description = req.Description if len(req.Apis) > 0 { - total, apis, err = receiver.apiRepository.List(ctx, 0, 0, "", "", store.In("id", req.Apis)) - if err != nil { + sql := a.WithContext(ctx).Where(a.ID.In(req.Apis...)) + if total, err = sql.Count(); err != nil { + return err + } + if apis, err = sql.Find(); err != nil { return err } @@ -124,8 +125,11 @@ func (receiver *roleService) UpdateRole(ctx context.Context, req *apitypes.RoleU } } - total, casbinRules, err := receiver.casbinStore.List(ctx, 0, 0, "", "", store.Where("v0", role.Name)) - if err != nil { + casbinSql := c.WithContext(ctx).Where(c.V0.Eq(role.Name)) + if total, err = casbinSql.Count(); err != nil { + return err + } + if casbinRules, err = casbinSql.Find(); err != nil { return err } @@ -138,32 +142,36 @@ func (receiver *roleService) UpdateRole(ctx context.Context, req *apitypes.RoleU }) } - if err := receiver.txManager.Transaction(ctx, func(ctx context.Context) error { - if err := receiver.roleRepository.Update(ctx, role); err != nil { + err = stores.Use(data.GetDB(ctx)).Transaction(func(tx *stores.Query) error { + if _, err := tx.Role.WithContext(ctx).Where(r.ID.Eq(role.ID)).Updates(role); err != nil { return err } if total > 0 { - if err := receiver.casbinStore.DeleteBatch(ctx, casbinRules); err != nil { + if _, err := tx.CasbinRule.WithContext(ctx).Delete(casbinRules...); err != nil { return err } } - if err := receiver.casbinStore.CreateBatch(ctx, rules); err != nil { + if err := tx.Role.Apis.Model(role).Replace(apis...); err != nil { return err } - if err := receiver.roleRepository.ReplaceAssociation(ctx, role, model.PreloadApis, apis); err != nil { + if err := tx.CasbinRule.WithContext(ctx).Create(rules...); err != nil { return err } return nil - }); err != nil { + }) + if err != nil { return err } return receiver.casbinManager.LoadPolicy() } -func (receiver *roleService) DeleteRole(ctx context.Context, req *apitypes.IDRequest) error { - role, err := receiver.roleRepository.Query(ctx, store.Where("id", req.ID), store.Preload(model.PreloadUsers)) - if err != nil { +func (receiver *roleService) DeleteRole(ctx context.Context, req *types.IDRequest) (err error) { + var ( + role *model.Role + casbinRules []*model.CasbinRule + ) + if role, err = r.WithContext(ctx).Where(r.ID.Eq(req.ID)).First(); err != nil { return err } @@ -176,61 +184,62 @@ func (receiver *roleService) DeleteRole(ctx context.Context, req *apitypes.IDReq return fmt.Errorf("the role is being used by the users %s", unames) } - _, casbinRules, err := receiver.casbinStore.List(ctx, 0, 0, "", "", store.Where("v0", role.Name)) - if err != nil { + if casbinRules, err = c.WithContext(ctx).Where(c.V0.Eq(role.Name)).Find(); err != nil { return err } - if err := receiver.txManager.Transaction(ctx, func(ctx context.Context) error { - if err := receiver.roleRepository.Delete(ctx, role); err != nil { + err = stores.Use(data.GetDB(ctx)).Transaction(func(tx *stores.Query) error { + if _, err = tx.Role.WithContext(ctx).Delete(role); err != nil { return err } - if err := receiver.roleRepository.ClearAssociation(ctx, role, model.PreloadApis); err != nil { + + if err = tx.Role.Apis.Model(role).Clear(); err != nil { return err } - if err := receiver.casbinStore.DeleteBatch(ctx, casbinRules); err != nil { + + if _, err = tx.CasbinRule.WithContext(ctx).Delete(casbinRules...); err != nil { return err } return nil - }); err != nil { - return err - } + }) return receiver.casbinManager.LoadPolicy() } -func (receiver *roleService) QueryRole(ctx context.Context, req *apitypes.IDRequest) (*model.Role, error) { - return receiver.roleRepository.Query(ctx, store.Where("id", req.ID), store.Preload(model.PreloadApis)) +func (receiver *roleService) QueryRole(ctx context.Context, req *types.IDRequest) (role *model.Role, err error) { + if role, err = r.WithContext(ctx).Where(r.ID.Eq(req.ID)).Preload(r.Apis).First(); err != nil { + return nil, err + } + return role, nil } -func (receiver *roleService) ListRole(ctx context.Context, req *apitypes.RoleListRequest) (*apitypes.RoleListResponse, error) { +func (receiver *roleService) ListRole(ctx context.Context, req *types.RoleListRequest) (*types.RoleListResponse, error) { var ( - where store.Option - colum = "id" - oder = "desc" + err error + total int64 + roles []*model.Role + sql = r.WithContext(ctx) ) + if req.Name != "" { - where = store.Like("name", req.Name+"%") + sql = sql.Where(r.Name.Like(req.Name + "%")) + } + + if total, err = sql.Count(); err != nil { + return nil, err } if req.Sort != "" && req.Direction != "" { - colum = req.Sort - oder = req.Direction + sort, ok := r.GetFieldByName(req.Sort) + if !ok { + return nil, fmt.Errorf("invalid sort field: %s", req.Sort) + } + sql = sql.Order(helper.Sort(sort, req.Direction)) } - total, objs, err := receiver.roleRepository.List(ctx, req.Page, req.PageSize, colum, oder, where) - if err != nil { + if roles, err = sql.Limit(req.PageSize).Offset((req.Page - 1) * req.PageSize).Find(); err != nil { return nil, err } - res := &apitypes.RoleListResponse{ - ListResponse: &apitypes.ListResponse{ - Pagination: &apitypes.Pagination{ - Page: req.Page, - PageSize: req.PageSize, - }, - Total: total, - }, - List: objs, - } - return res, nil + + return types.NewRoleListResponse(roles, total, req.Page, req.PageSize), nil } diff --git a/service/v1/store.go b/service/v1/store.go new file mode 100644 index 0000000..333e3a5 --- /dev/null +++ b/service/v1/store.go @@ -0,0 +1,19 @@ +package v1 + +import "github.com/yiran15/api-server/stores" + +var ( + u = stores.User + r = stores.Role + f = stores.FeiShuUser + a = stores.Api + c = stores.CasbinRule +) + +func NewStore() { + u = stores.User + r = stores.Role + f = stores.FeiShuUser + a = stores.Api + c = stores.CasbinRule +} diff --git a/service/v1/user.go b/service/v1/user.go index 1ecb5f2..34d70b4 100644 --- a/service/v1/user.go +++ b/service/v1/user.go @@ -5,18 +5,20 @@ import ( "errors" "fmt" "sort" + "strconv" "strings" "time" - "github.com/yiran15/api-server/base/apitypes" "github.com/yiran15/api-server/base/constant" "github.com/yiran15/api-server/base/helper" "github.com/yiran15/api-server/base/log" + "github.com/yiran15/api-server/base/types" "github.com/yiran15/api-server/model" "github.com/yiran15/api-server/pkg/jwt" localcache "github.com/yiran15/api-server/pkg/local_cache" "github.com/yiran15/api-server/pkg/oauth" "github.com/yiran15/api-server/store" + "github.com/yiran15/api-server/stores" "go.uber.org/zap" "golang.org/x/crypto/bcrypt" "gorm.io/gorm" @@ -30,58 +32,54 @@ type UserServicer interface { type OAuthServicer interface { OAuth2Provider(ctx context.Context) ([]string, error) OAuth2Login(provider, state string) (string, error) - OAuth2Callback(ctx context.Context, req *apitypes.OAuthLoginRequest) (*apitypes.UserLoginResponse, error) - OAuth2Activate(ctx context.Context, req *apitypes.OAuthActivateRequest) (*apitypes.UserLoginResponse, error) + OAuth2Callback(ctx context.Context, req *types.OAuthLoginRequest) (*types.UserLoginResponse, error) + OAuth2Activate(ctx context.Context, req *types.OAuthActivateRequest) (*types.UserLoginResponse, error) } type GeneralUserServicer interface { - Login(ctx context.Context, req *apitypes.UserLoginRequest) (*apitypes.UserLoginResponse, error) + Login(ctx context.Context, req *types.UserLoginRequest) (*types.UserLoginResponse, error) Logout(ctx context.Context) error Info(ctx context.Context) (*model.User, error) - CreateUser(ctx context.Context, req *apitypes.UserCreateRequest) error - UpdateUserByAdmin(ctx context.Context, req *apitypes.UserUpdateAdminRequest) error - UpdateUserBySelf(ctx context.Context, req *apitypes.UserUpdateSelfRequest) error - DeleteUser(ctx context.Context, req *apitypes.IDRequest) error - QueryUser(ctx context.Context, req *apitypes.IDRequest) (*model.User, error) - ListUser(ctx context.Context, pagination *apitypes.UserListRequest) (*apitypes.UserListResponse, error) + CreateUser(ctx context.Context, req *types.UserCreateRequest) error + UpdateUserByAdmin(ctx context.Context, req *types.UserUpdateAdminRequest) error + UpdateUserBySelf(ctx context.Context, req *types.UserUpdateSelfRequest) error + DeleteUser(ctx context.Context, req *types.IDRequest) error + QueryUser(ctx context.Context, req *types.IDRequest) (*model.User, error) + ListUser(ctx context.Context, pagination *types.UserListRequest) (*types.UserListResponse, error) } type UserService struct { - userStore store.UserStorer - roleStore store.RoleStorer - cacheStore store.CacheStorer - tx store.TxManagerInterface - jwt jwt.JwtInterface - oauth *oauth.OAuth2 - feishuUserStore store.FeiShuUserStorer - localCache localcache.Cacher + cacheStore store.CacheStorer + tx store.TxManagerInterface + jwt jwt.JwtInterface + oauth *oauth.OAuth2 + localCache localcache.Cacher } -func NewUserService(userStore store.UserStorer, roleStore store.RoleStorer, cacheStore store.CacheStorer, tx store.TxManagerInterface, jwt jwt.JwtInterface, feishuOauth *oauth.OAuth2, feishuUserStore store.FeiShuUserStorer, localCache localcache.Cacher) UserServicer { +func NewUserService(cacheStore store.CacheStorer, tx store.TxManagerInterface, jwt jwt.JwtInterface, feishuOauth *oauth.OAuth2, localCache localcache.Cacher) UserServicer { return &UserService{ - userStore: userStore, - roleStore: roleStore, - cacheStore: cacheStore, - tx: tx, - jwt: jwt, - oauth: feishuOauth, - feishuUserStore: feishuUserStore, - localCache: localCache, + cacheStore: cacheStore, + tx: tx, + jwt: jwt, + oauth: feishuOauth, + localCache: localCache, } } -func (receiver *UserService) Login(ctx context.Context, req *apitypes.UserLoginRequest) (*apitypes.UserLoginResponse, error) { - user, err := receiver.userStore.Query(ctx, store.Where("email", req.Email), store.Where("status", 1), store.Preload(model.PreloadRoles)) +func (receiver *UserService) Login(ctx context.Context, req *types.UserLoginRequest) (*types.UserLoginResponse, error) { + user, err := u.WithContext(ctx).Where(u.Email.Eq(req.Email), u.Status.Eq(1)).Preload(u.Roles).First() if err != nil { if !errors.Is(err, gorm.ErrRecordNotFound) { return nil, err } - log.WithRequestID(ctx).Error("login failed, user not found", zap.String("email", req.Email)) + log.WithRequestID(ctx). + Error("login failed", zap.String("email", req.Email), zap.Error(constant.ErrUserNotFound)) return nil, constant.ErrLoginFailed } if !receiver.checkPasswordHash(req.Password, user.Password) { - log.WithRequestID(ctx).Error("login failed, invalid password", zap.String("email", req.Email)) + log.WithRequestID(ctx). + Error("login failed", zap.String("email", req.Email), zap.Error(constant.ErrPasswordWrong)) return nil, constant.ErrLoginFailed } token, err := receiver.jwt.GenerateToken(user.ID, user.Name) @@ -89,24 +87,24 @@ func (receiver *UserService) Login(ctx context.Context, req *apitypes.UserLoginR return nil, err } + tokenExpire := receiver.jwt.GetExpire() if len(user.Roles) == 0 { - if err := receiver.cacheStore.SetSet(ctx, store.RoleType, user.ID, []any{constant.EmptyRoleSentinel}, nil); err != nil { - log.WithRequestID(ctx).Error("login set empty role cache error", zap.Int64("userID", user.ID), zap.Error(err)) + if err := receiver.cacheStore.SetSet(ctx, store.RoleType, user.ID, []any{constant.EmptyRoleSentinel}, &tokenExpire); err != nil { + log.WithRequestID(ctx). + Error("login set empty role cache error", zap.Int64("userID", user.ID), zap.Error(err)) } } else { roleNames := make([]any, 0, len(user.Roles)) for _, role := range user.Roles { roleNames = append(roleNames, role.Name) } - if err := receiver.cacheStore.SetSet(ctx, store.RoleType, user.ID, roleNames, nil); err != nil { - log.WithRequestID(ctx).Error("login set role cache error", zap.Int64("userID", user.ID), zap.Any("roles", roleNames), zap.Error(err)) + if err := receiver.cacheStore.SetSet(ctx, store.RoleType, user.ID, roleNames, &tokenExpire); err != nil { + log.WithRequestID(ctx). + Error("login set role cache error", zap.Int64("userID", user.ID), zap.Any("roles", roleNames), zap.Error(err)) } } - return &apitypes.UserLoginResponse{ - User: user, - Token: token, - }, nil + return types.NewUserLoginResponse(user, token), nil } func (receiver *UserService) Logout(ctx context.Context) error { @@ -117,10 +115,9 @@ func (receiver *UserService) Logout(ctx context.Context) error { return receiver.cacheStore.DelKey(ctx, store.RoleType, mc.UserID) } -func (receiver *UserService) CreateUser(ctx context.Context, req *apitypes.UserCreateRequest) error { +func (receiver *UserService) CreateUser(ctx context.Context, req *types.UserCreateRequest) (err error) { var ( user *model.User - err error total int64 roles []*model.Role ) @@ -129,7 +126,7 @@ func (receiver *UserService) CreateUser(ctx context.Context, req *apitypes.UserC *req.RolesID = helper.RemoveDuplicates(*req.RolesID) } - if user, err = receiver.userStore.Query(ctx, store.Where("email", req.Email), store.Where("status", 1)); err != nil { + if user, err = u.WithContext(ctx).Where(u.Email.Eq(req.Email), u.Status.Eq(1)).First(); err != nil { if !errors.Is(err, gorm.ErrRecordNotFound) { return err } @@ -145,8 +142,10 @@ func (receiver *UserService) CreateUser(ctx context.Context, req *apitypes.UserC } if req.RolesID != nil { - total, roles, err = receiver.roleStore.List(ctx, 0, 0, "", "", store.In("id", *req.RolesID)) - if err != nil { + if total, err = r.WithContext(ctx).Where(r.ID.In(*req.RolesID...)).Count(); err != nil { + return err + } + if roles, err = r.WithContext(ctx).Where(r.ID.In(*req.RolesID...)).Find(); err != nil { return err } if err = helper.ValidateRoleIds(*req.RolesID, roles, total); err != nil { @@ -161,22 +160,13 @@ func (receiver *UserService) CreateUser(ctx context.Context, req *apitypes.UserC Password: hashedPassword, Avatar: req.Avatar, Mobile: req.Mobile, + Roles: roles, } - return receiver.tx.Transaction(ctx, func(ctx context.Context) error { - if err = receiver.userStore.Create(ctx, user); err != nil { - return err - } - - if req.RolesID == nil { - return nil - } - - return receiver.userStore.AppendAssociation(ctx, user, model.PreloadRoles, roles) - }) + return u.WithContext(ctx).Create(user) } -func (receiver *UserService) UpdateUserByAdmin(ctx context.Context, req *apitypes.UserUpdateAdminRequest) error { +func (receiver *UserService) UpdateUserByAdmin(ctx context.Context, req *types.UserUpdateAdminRequest) error { if err := receiver.updateUser(ctx, nil, req); err != nil { return err } @@ -185,59 +175,67 @@ func (receiver *UserService) UpdateUserByAdmin(ctx context.Context, req *apitype return nil } - return receiver.updateRole(ctx, &apitypes.UserUpdateRoleRequest{ + return receiver.updateRole(ctx, &types.UserUpdateRoleRequest{ ID: req.ID, RolesID: *req.RolesID, }) } -func (receiver *UserService) UpdateUserBySelf(ctx context.Context, req *apitypes.UserUpdateSelfRequest) error { +func (receiver *UserService) UpdateUserBySelf(ctx context.Context, req *types.UserUpdateSelfRequest) error { + var ( + user *model.User + ) mc, err := receiver.jwt.GetUser(ctx) if err != nil { return err } - user, err := receiver.userStore.Query(ctx, store.Where("id", mc.UserID)) - if err != nil { + + if user, err = u.WithContext(ctx).FilterWithID(int(mc.UserID)); err != nil { return err } + if req.OldPassword == "" { return errors.New("old password is required") } if !receiver.checkPasswordHash(req.OldPassword, user.Password) { return errors.New("invalid old password") } - newReq := new(apitypes.UserUpdateAdminRequest) + newReq := new(types.UserUpdateAdminRequest) newReq.ID = mc.UserID newReq.UserUpdateSelfRequest = req return receiver.updateUser(ctx, user, newReq) } -func (receiver *UserService) DeleteUser(ctx context.Context, req *apitypes.IDRequest) error { - user, err := receiver.userStore.Query(ctx, store.Where("id", req.ID)) - if err != nil { +func (receiver *UserService) DeleteUser(ctx context.Context, req *types.IDRequest) (err error) { + var ( + user *model.User + feishuUser *model.FeiShuUser + ) + if user, err = u.WithContext(ctx).FilterWithID(int(req.ID)); err != nil { return err } - if err := receiver.userStore.Delete(ctx, user); err != nil { + + if _, err := u.WithContext(ctx).Delete(user); err != nil { return err } - feishuUser, err := receiver.feishuUserStore.Query(ctx, store.Where("user_id", req.ID)) + feishuUser, err = f.WithContext(ctx).Where(f.UserID.Eq(strconv.FormatInt(req.ID, 10))).First() if err != nil { if !errors.Is(err, gorm.ErrRecordNotFound) { return err } } if feishuUser != nil { - if err := receiver.feishuUserStore.Delete(ctx, feishuUser); err != nil { + if _, err := f.WithContext(ctx).Delete(feishuUser); err != nil { return err } } - return receiver.userStore.ClearAssociation(ctx, user, model.PreloadRoles) + return u.Roles.WithContext(ctx).Model(user).Clear() } -func (receiver *UserService) QueryUser(ctx context.Context, req *apitypes.IDRequest) (*model.User, error) { - return receiver.userStore.Query(ctx, store.Where("id", req.ID), store.Preload(model.PreloadRoles)) +func (receiver *UserService) QueryUser(ctx context.Context, req *types.IDRequest) (*model.User, error) { + return u.WithContext(ctx).Where(u.ID.Eq(req.ID)).Preload(u.Roles).First() } func (receiver *UserService) Info(ctx context.Context) (*model.User, error) { @@ -249,58 +247,64 @@ func (receiver *UserService) Info(ctx context.Context) (*model.User, error) { log.WithRequestID(ctx).Error("user not found", zap.Int64("userId", mc.UserID), zap.String("userName", mc.UserName)) return nil, errors.New("user not found") } - return receiver.userStore.Query(ctx, store.Where("id", mc.UserID), store.Preload(model.PreloadRoles)) + return u.WithContext(ctx).Where(u.ID.Eq(mc.UserID)).Preload(u.Roles).First() } -func (receiver *UserService) ListUser(ctx context.Context, req *apitypes.UserListRequest) (*apitypes.UserListResponse, error) { +func (receiver *UserService) ListUser(ctx context.Context, req *types.UserListRequest) (*types.UserListResponse, error) { var ( - likeOpt store.Option - statusOpt store.Option - filed = "id" - oder = "desc" + sql stores.IUserDo + users []*model.User + err error + total int64 ) if req.Name != "" { - likeOpt = store.Like("name", req.Name+"%") + sql = u.WithContext(ctx).Where(u.Name.Like(req.Name + "%")) } else if req.Email != "" { - likeOpt = store.Like("email", req.Email+"%") + sql = u.WithContext(ctx).Where(u.Email.Like(req.Email + "%")) } else if req.Mobile != "" { - likeOpt = store.Like("mobile", req.Mobile+"%") + sql = u.WithContext(ctx).Where(u.Mobile.Like(req.Mobile + "%")) } else if req.Department != "" { - likeOpt = store.Like("department", req.Department+"%") + sql = u.WithContext(ctx).Where(u.Department.Like(req.Department + "%")) + } else { + sql = u.WithContext(ctx) } if req.Status != 0 { - statusOpt = store.Where("status", req.Status) + sql = sql.Where(u.Status.Eq(req.Status)) } - if req.Sort != "" && req.Direction != "" { - filed = req.Sort - oder = req.Direction + if req.Sort != "" { + orderCol, ok := u.GetFieldByName(req.Sort) + if !ok { + return nil, fmt.Errorf("invalid sort field: %s", req.Sort) + } + sql = sql.Order(helper.Sort(orderCol, req.Direction)) } - total, objs, err := receiver.userStore.List(ctx, req.Page, req.PageSize, filed, oder, likeOpt, statusOpt) - if err != nil { + if total, err = sql.Count(); err != nil { + return nil, err + } + if users, err = sql.Limit(req.PageSize).Offset((req.Page - 1) * req.PageSize).Find(); err != nil { return nil, err } - res := &apitypes.UserListResponse{ - ListResponse: &apitypes.ListResponse{ - Pagination: &apitypes.Pagination{ + + res := &types.UserListResponse{ + ListResponse: &types.ListResponse{ + Pagination: &types.Pagination{ Page: req.Page, PageSize: req.PageSize, }, Total: total, }, - List: objs, + List: users, } return res, nil } -func (receiver *UserService) updateUser(ctx context.Context, user *model.User, req *apitypes.UserUpdateAdminRequest) error { - var err error +func (receiver *UserService) updateUser(ctx context.Context, user *model.User, req *types.UserUpdateAdminRequest) (err error) { if user == nil { - user, err = receiver.userStore.Query(ctx, store.Where("id", req.ID)) - if err != nil { + if user, err = u.WithContext(ctx).Where(u.ID.Eq(req.ID)).First(); err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return fmt.Errorf("user %d not found", req.ID) } @@ -309,11 +313,13 @@ func (receiver *UserService) updateUser(ctx context.Context, user *model.User, r } if req.UserUpdateSelfRequest != nil { + user.Name = req.UserUpdateSelfRequest.Name user.NickName = req.UserUpdateSelfRequest.NickName user.Email = req.UserUpdateSelfRequest.Email user.Avatar = req.UserUpdateSelfRequest.Avatar user.Mobile = req.UserUpdateSelfRequest.Mobile + if req.Password != "" { hashedPassword, err := receiver.hashPassword(req.Password) if err != nil { @@ -326,31 +332,36 @@ func (receiver *UserService) updateUser(ctx context.Context, user *model.User, r if req.Status != 0 { user.Status = &req.Status } - return receiver.userStore.Update(ctx, user) + + if _, err := u.WithContext(ctx).Where(u.ID.Eq(user.ID)).Updates(user); err != nil { + return err + } + return nil } -func (receiver *UserService) updateRole(ctx context.Context, req *apitypes.UserUpdateRoleRequest) error { +func (receiver *UserService) updateRole(ctx context.Context, req *types.UserUpdateRoleRequest) (err error) { var ( total int64 - err error roles []*model.Role + user *model.User ) req.RolesID = helper.RemoveDuplicates(req.RolesID) - user, err := receiver.userStore.Query(ctx, store.Where("id", req.ID), store.Preload(model.PreloadRoles)) - if err != nil { + if user, err = u.WithContext(ctx).Where(u.ID.Eq(req.ID)).Preload(u.Roles).First(); err != nil { return err } - total, roles, err = receiver.roleStore.List(ctx, 0, 0, "", "", store.In("id", req.RolesID)) - if err != nil { + roleSql := r.WithContext(ctx).Where(r.ID.In(req.RolesID...)) + if total, err = roleSql.Count(); err != nil { + return err + } + if roles, err = roleSql.Find(); err != nil { return err } if err = helper.ValidateRoleIds(req.RolesID, roles, total); err != nil { return err } - - if err := receiver.userStore.ReplaceAssociation(ctx, user, model.PreloadRoles, roles); err != nil { + if err = u.Roles.WithContext(ctx).Model(user).Replace(roles...); err != nil { return err } @@ -406,7 +417,7 @@ func (receiver *UserService) OAuth2Login(provider, state string) (string, error) return receiver.oauth.Redirect(state, provider), nil } -func (receiver *UserService) OAuth2Callback(ctx context.Context, req *apitypes.OAuthLoginRequest) (*apitypes.UserLoginResponse, error) { +func (receiver *UserService) OAuth2Callback(ctx context.Context, req *types.OAuthLoginRequest) (*types.UserLoginResponse, error) { var ( userID int64 userName string @@ -442,7 +453,7 @@ func (receiver *UserService) OAuth2Callback(ctx context.Context, req *apitypes.O userName = user.Name roles = user.Roles if user.Status != nil && *user.Status != model.UserStatusActive { - return &apitypes.UserLoginResponse{User: user, Token: ""}, nil + return &types.UserLoginResponse{User: user, Token: ""}, nil } case *model.KeycloakUser: @@ -458,7 +469,7 @@ func (receiver *UserService) OAuth2Callback(ctx context.Context, req *apitypes.O userName = user.Name roles = user.Roles if user.Status != nil && *user.Status != model.UserStatusActive { - return &apitypes.UserLoginResponse{User: user, Token: ""}, nil + return &types.UserLoginResponse{User: user, Token: ""}, nil } default: return nil, errors.New("unsupported oauth user type") @@ -490,7 +501,7 @@ func (receiver *UserService) OAuth2Callback(ctx context.Context, req *apitypes.O } } - return &apitypes.UserLoginResponse{User: user, Token: token}, nil + return &types.UserLoginResponse{User: user, Token: token}, nil } func (receiver *UserService) feishuLogin(ctx context.Context, userInfo *model.FeiShuUser) (*model.FeiShuUser, error) { @@ -498,14 +509,19 @@ func (receiver *UserService) feishuLogin(ctx context.Context, userInfo *model.Fe return nil, errors.New("feishu user is empty") } - var email string + var ( + err error + email string + feishuUser *model.FeiShuUser + ) + if userInfo.EnterpriseEmail != "" { email = userInfo.EnterpriseEmail } else if userInfo.Email != "" { email = userInfo.Email } - u := &model.User{ + user := &model.User{ Name: userInfo.EnName, NickName: userInfo.EnName, Avatar: userInfo.AvatarUrl, @@ -514,7 +530,7 @@ func (receiver *UserService) feishuLogin(ctx context.Context, userInfo *model.Fe Email: email, } - feishuUser, err := receiver.feishuUserStore.Query(ctx, store.Where("user_id", userInfo.UserID), store.Preload("User.Roles")) + feishuUser, err = f.WithContext(ctx).Where(f.UserID.Eq(userInfo.UserID)).Preload(f.User.Roles).First() if err != nil { if !errors.Is(err, gorm.ErrRecordNotFound) { return nil, err @@ -523,19 +539,19 @@ func (receiver *UserService) feishuLogin(ctx context.Context, userInfo *model.Fe feishuUser = userInfo } if feishuUser.User == nil { - feishuUser.User = u + feishuUser.User = user } - if err := receiver.feishuUserStore.Create(ctx, feishuUser); err != nil { + if err := f.WithContext(ctx).Create(feishuUser); err != nil { return nil, err } return feishuUser, nil } if feishuUser.User == nil { - if err := receiver.userStore.Create(ctx, u); err != nil { + if err := u.WithContext(ctx).Create(user); err != nil { return nil, err } - feishuUser.User = u + feishuUser.User = user } return feishuUser, nil @@ -546,7 +562,7 @@ func (receiver *UserService) genericLogin(ctx context.Context, userInfo *model.K return nil, errors.New("generic user is empty") } - data, err = receiver.userStore.Query(ctx, store.Where("email", userInfo.Email), store.Preload("Roles")) + data, err = u.WithContext(ctx).Where(u.Email.Eq(userInfo.Email)).Preload(u.Roles).First() if err != nil { if !errors.Is(err, gorm.ErrRecordNotFound) { return nil, err @@ -560,13 +576,13 @@ func (receiver *UserService) genericLogin(ctx context.Context, userInfo *model.K Department: strings.Join(userInfo.Group, ","), } if len(userInfo.Roles) > 0 { - _, roles, err := receiver.roleStore.List(ctx, 0, 0, "", "", store.In("name", userInfo.Roles)) + roles, err := r.WithContext(ctx).Where(r.Name.In(userInfo.Roles...)).Find() if err != nil { return nil, err } data.Roles = roles } - if err := receiver.userStore.Create(ctx, data); err != nil { + if err := u.WithContext(ctx).Create(data); err != nil { return nil, err } } @@ -587,13 +603,18 @@ func (receiver *UserService) OAuth2Provider(_ context.Context) ([]string, error) return list, nil } -func (receiver *UserService) OAuth2Activate(ctx context.Context, req *apitypes.OAuthActivateRequest) (*apitypes.UserLoginResponse, error) { +func (receiver *UserService) OAuth2Activate(ctx context.Context, req *types.OAuthActivateRequest) (*types.UserLoginResponse, error) { if req.Password != req.ConfirmPassword { return nil, errors.New("password not match") } - user, err := receiver.userStore.Query(ctx, store.Where("id", req.ID)) - if err != nil { + var ( + user *model.User + err error + sql = u.WithContext(ctx) + ) + + if user, err = sql.Where(u.ID.Eq(int64(req.ID))).First(); err != nil { return nil, err } @@ -601,14 +622,17 @@ func (receiver *UserService) OAuth2Activate(ctx context.Context, req *apitypes.O if err != nil { return nil, fmt.Errorf("hash password error: %v", err) } + user.Password = password user.Status = helper.Int(model.UserStatusActive) - if err := receiver.userStore.Update(ctx, user); err != nil { + + if _, err := sql.Updates(user); err != nil { return nil, fmt.Errorf("update user error: %v", err) } + token, err := receiver.jwt.GenerateToken(user.ID, user.Name) if err != nil { return nil, err } - return &apitypes.UserLoginResponse{User: user, Token: token}, nil + return types.NewUserLoginResponse(user, token), nil } diff --git a/stores/apis.gen.go b/stores/apis.gen.go new file mode 100644 index 0000000..f75bbe1 --- /dev/null +++ b/stores/apis.gen.go @@ -0,0 +1,559 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package stores + +import ( + "context" + "database/sql" + "strings" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "github.com/yiran15/api-server/model" +) + +func newApi(db *gorm.DB, opts ...gen.DOOption) api { + _api := api{} + + _api.apiDo.UseDB(db, opts...) + _api.apiDo.UseModel(&model.Api{}) + + tableName := _api.apiDo.TableName() + _api.ALL = field.NewAsterisk(tableName) + _api.ID = field.NewInt64(tableName, "id") + _api.CreatedAt = field.NewTime(tableName, "created_at") + _api.UpdatedAt = field.NewTime(tableName, "updated_at") + _api.DeletedAt = field.NewField(tableName, "deleted_at") + _api.Name = field.NewString(tableName, "name") + _api.Path = field.NewString(tableName, "path") + _api.Method = field.NewString(tableName, "method") + _api.Description = field.NewString(tableName, "description") + _api.Roles = apiManyToManyRoles{ + db: db.Session(&gorm.Session{}), + + RelationField: field.NewRelation("Roles", "model.Role"), + Users: struct { + field.RelationField + Roles struct { + field.RelationField + } + }{ + RelationField: field.NewRelation("Roles.Users", "model.User"), + Roles: struct { + field.RelationField + }{ + RelationField: field.NewRelation("Roles.Users.Roles", "model.Role"), + }, + }, + Apis: struct { + field.RelationField + Roles struct { + field.RelationField + } + }{ + RelationField: field.NewRelation("Roles.Apis", "model.Api"), + Roles: struct { + field.RelationField + }{ + RelationField: field.NewRelation("Roles.Apis.Roles", "model.Role"), + }, + }, + } + + _api.fillFieldMap() + + return _api +} + +type api struct { + apiDo + + ALL field.Asterisk + ID field.Int64 + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Field + Name field.String + Path field.String + Method field.String + Description field.String + Roles apiManyToManyRoles + + fieldMap map[string]field.Expr +} + +func (a api) Table(newTableName string) *api { + a.apiDo.UseTable(newTableName) + return a.updateTableName(newTableName) +} + +func (a api) As(alias string) *api { + a.apiDo.DO = *(a.apiDo.As(alias).(*gen.DO)) + return a.updateTableName(alias) +} + +func (a *api) updateTableName(table string) *api { + a.ALL = field.NewAsterisk(table) + a.ID = field.NewInt64(table, "id") + a.CreatedAt = field.NewTime(table, "created_at") + a.UpdatedAt = field.NewTime(table, "updated_at") + a.DeletedAt = field.NewField(table, "deleted_at") + a.Name = field.NewString(table, "name") + a.Path = field.NewString(table, "path") + a.Method = field.NewString(table, "method") + a.Description = field.NewString(table, "description") + + a.fillFieldMap() + + return a +} + +func (a *api) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := a.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (a *api) fillFieldMap() { + a.fieldMap = make(map[string]field.Expr, 9) + a.fieldMap["id"] = a.ID + a.fieldMap["created_at"] = a.CreatedAt + a.fieldMap["updated_at"] = a.UpdatedAt + a.fieldMap["deleted_at"] = a.DeletedAt + a.fieldMap["name"] = a.Name + a.fieldMap["path"] = a.Path + a.fieldMap["method"] = a.Method + a.fieldMap["description"] = a.Description + +} + +func (a api) clone(db *gorm.DB) api { + a.apiDo.ReplaceConnPool(db.Statement.ConnPool) + a.Roles.db = db.Session(&gorm.Session{Initialized: true}) + a.Roles.db.Statement.ConnPool = db.Statement.ConnPool + return a +} + +func (a api) replaceDB(db *gorm.DB) api { + a.apiDo.ReplaceDB(db) + a.Roles.db = db.Session(&gorm.Session{}) + return a +} + +type apiManyToManyRoles struct { + db *gorm.DB + + field.RelationField + + Users struct { + field.RelationField + Roles struct { + field.RelationField + } + } + Apis struct { + field.RelationField + Roles struct { + field.RelationField + } + } +} + +func (a apiManyToManyRoles) Where(conds ...field.Expr) *apiManyToManyRoles { + if len(conds) == 0 { + return &a + } + + exprs := make([]clause.Expression, 0, len(conds)) + for _, cond := range conds { + exprs = append(exprs, cond.BeCond().(clause.Expression)) + } + a.db = a.db.Clauses(clause.Where{Exprs: exprs}) + return &a +} + +func (a apiManyToManyRoles) WithContext(ctx context.Context) *apiManyToManyRoles { + a.db = a.db.WithContext(ctx) + return &a +} + +func (a apiManyToManyRoles) Session(session *gorm.Session) *apiManyToManyRoles { + a.db = a.db.Session(session) + return &a +} + +func (a apiManyToManyRoles) Model(m *model.Api) *apiManyToManyRolesTx { + return &apiManyToManyRolesTx{a.db.Model(m).Association(a.Name())} +} + +func (a apiManyToManyRoles) Unscoped() *apiManyToManyRoles { + a.db = a.db.Unscoped() + return &a +} + +type apiManyToManyRolesTx struct{ tx *gorm.Association } + +func (a apiManyToManyRolesTx) Find() (result []*model.Role, err error) { + return result, a.tx.Find(&result) +} + +func (a apiManyToManyRolesTx) Append(values ...*model.Role) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Append(targetValues...) +} + +func (a apiManyToManyRolesTx) Replace(values ...*model.Role) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Replace(targetValues...) +} + +func (a apiManyToManyRolesTx) Delete(values ...*model.Role) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Delete(targetValues...) +} + +func (a apiManyToManyRolesTx) Clear() error { + return a.tx.Clear() +} + +func (a apiManyToManyRolesTx) Count() int64 { + return a.tx.Count() +} + +func (a apiManyToManyRolesTx) Unscoped() *apiManyToManyRolesTx { + a.tx = a.tx.Unscoped() + return &a +} + +type apiDo struct{ gen.DO } + +type IApiDo interface { + gen.SubQuery + Debug() IApiDo + WithContext(ctx context.Context) IApiDo + WithResult(fc func(tx gen.Dao)) gen.ResultInfo + ReplaceDB(db *gorm.DB) + ReadDB() IApiDo + WriteDB() IApiDo + As(alias string) gen.Dao + Session(config *gorm.Session) IApiDo + Columns(cols ...field.Expr) gen.Columns + Clauses(conds ...clause.Expression) IApiDo + Not(conds ...gen.Condition) IApiDo + Or(conds ...gen.Condition) IApiDo + Select(conds ...field.Expr) IApiDo + Where(conds ...gen.Condition) IApiDo + Order(conds ...field.Expr) IApiDo + Distinct(cols ...field.Expr) IApiDo + Omit(cols ...field.Expr) IApiDo + Join(table schema.Tabler, on ...field.Expr) IApiDo + LeftJoin(table schema.Tabler, on ...field.Expr) IApiDo + RightJoin(table schema.Tabler, on ...field.Expr) IApiDo + Group(cols ...field.Expr) IApiDo + Having(conds ...gen.Condition) IApiDo + Limit(limit int) IApiDo + Offset(offset int) IApiDo + Count() (count int64, err error) + Scopes(funcs ...func(gen.Dao) gen.Dao) IApiDo + Unscoped() IApiDo + Create(values ...*model.Api) error + CreateInBatches(values []*model.Api, batchSize int) error + Save(values ...*model.Api) error + First() (*model.Api, error) + Take() (*model.Api, error) + Last() (*model.Api, error) + Find() ([]*model.Api, error) + FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.Api, err error) + FindInBatches(result *[]*model.Api, batchSize int, fc func(tx gen.Dao, batch int) error) error + Pluck(column field.Expr, dest interface{}) error + Delete(...*model.Api) (info gen.ResultInfo, err error) + Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + Updates(value interface{}) (info gen.ResultInfo, err error) + UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + UpdateColumns(value interface{}) (info gen.ResultInfo, err error) + UpdateFrom(q gen.SubQuery) gen.Dao + Attrs(attrs ...field.AssignExpr) IApiDo + Assign(attrs ...field.AssignExpr) IApiDo + Joins(fields ...field.RelationField) IApiDo + Preload(fields ...field.RelationField) IApiDo + FirstOrInit() (*model.Api, error) + FirstOrCreate() (*model.Api, error) + FindByPage(offset int, limit int) (result []*model.Api, count int64, err error) + ScanByPage(result interface{}, offset int, limit int) (count int64, err error) + Rows() (*sql.Rows, error) + Row() *sql.Row + Scan(result interface{}) (err error) + Returning(value interface{}, columns ...string) IApiDo + UnderlyingDB() *gorm.DB + schema.Tabler + + FilterWithID(id int) (result *model.Api, err error) +} + +// SELECT * FROM @@table WHERE id = @id +func (a apiDo) FilterWithID(id int) (result *model.Api, err error) { + var params []interface{} + + var generateSQL strings.Builder + params = append(params, id) + generateSQL.WriteString("SELECT * FROM apis WHERE id = ? ") + + var executeSQL *gorm.DB + executeSQL = a.UnderlyingDB().Raw(generateSQL.String(), params...).Take(&result) // ignore_security_alert + err = executeSQL.Error + + return +} + +func (a apiDo) Debug() IApiDo { + return a.withDO(a.DO.Debug()) +} + +func (a apiDo) WithContext(ctx context.Context) IApiDo { + return a.withDO(a.DO.WithContext(ctx)) +} + +func (a apiDo) ReadDB() IApiDo { + return a.Clauses(dbresolver.Read) +} + +func (a apiDo) WriteDB() IApiDo { + return a.Clauses(dbresolver.Write) +} + +func (a apiDo) Session(config *gorm.Session) IApiDo { + return a.withDO(a.DO.Session(config)) +} + +func (a apiDo) Clauses(conds ...clause.Expression) IApiDo { + return a.withDO(a.DO.Clauses(conds...)) +} + +func (a apiDo) Returning(value interface{}, columns ...string) IApiDo { + return a.withDO(a.DO.Returning(value, columns...)) +} + +func (a apiDo) Not(conds ...gen.Condition) IApiDo { + return a.withDO(a.DO.Not(conds...)) +} + +func (a apiDo) Or(conds ...gen.Condition) IApiDo { + return a.withDO(a.DO.Or(conds...)) +} + +func (a apiDo) Select(conds ...field.Expr) IApiDo { + return a.withDO(a.DO.Select(conds...)) +} + +func (a apiDo) Where(conds ...gen.Condition) IApiDo { + return a.withDO(a.DO.Where(conds...)) +} + +func (a apiDo) Order(conds ...field.Expr) IApiDo { + return a.withDO(a.DO.Order(conds...)) +} + +func (a apiDo) Distinct(cols ...field.Expr) IApiDo { + return a.withDO(a.DO.Distinct(cols...)) +} + +func (a apiDo) Omit(cols ...field.Expr) IApiDo { + return a.withDO(a.DO.Omit(cols...)) +} + +func (a apiDo) Join(table schema.Tabler, on ...field.Expr) IApiDo { + return a.withDO(a.DO.Join(table, on...)) +} + +func (a apiDo) LeftJoin(table schema.Tabler, on ...field.Expr) IApiDo { + return a.withDO(a.DO.LeftJoin(table, on...)) +} + +func (a apiDo) RightJoin(table schema.Tabler, on ...field.Expr) IApiDo { + return a.withDO(a.DO.RightJoin(table, on...)) +} + +func (a apiDo) Group(cols ...field.Expr) IApiDo { + return a.withDO(a.DO.Group(cols...)) +} + +func (a apiDo) Having(conds ...gen.Condition) IApiDo { + return a.withDO(a.DO.Having(conds...)) +} + +func (a apiDo) Limit(limit int) IApiDo { + return a.withDO(a.DO.Limit(limit)) +} + +func (a apiDo) Offset(offset int) IApiDo { + return a.withDO(a.DO.Offset(offset)) +} + +func (a apiDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IApiDo { + return a.withDO(a.DO.Scopes(funcs...)) +} + +func (a apiDo) Unscoped() IApiDo { + return a.withDO(a.DO.Unscoped()) +} + +func (a apiDo) Create(values ...*model.Api) error { + if len(values) == 0 { + return nil + } + return a.DO.Create(values) +} + +func (a apiDo) CreateInBatches(values []*model.Api, batchSize int) error { + return a.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (a apiDo) Save(values ...*model.Api) error { + if len(values) == 0 { + return nil + } + return a.DO.Save(values) +} + +func (a apiDo) First() (*model.Api, error) { + if result, err := a.DO.First(); err != nil { + return nil, err + } else { + return result.(*model.Api), nil + } +} + +func (a apiDo) Take() (*model.Api, error) { + if result, err := a.DO.Take(); err != nil { + return nil, err + } else { + return result.(*model.Api), nil + } +} + +func (a apiDo) Last() (*model.Api, error) { + if result, err := a.DO.Last(); err != nil { + return nil, err + } else { + return result.(*model.Api), nil + } +} + +func (a apiDo) Find() ([]*model.Api, error) { + result, err := a.DO.Find() + return result.([]*model.Api), err +} + +func (a apiDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.Api, err error) { + buf := make([]*model.Api, 0, batchSize) + err = a.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (a apiDo) FindInBatches(result *[]*model.Api, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return a.DO.FindInBatches(result, batchSize, fc) +} + +func (a apiDo) Attrs(attrs ...field.AssignExpr) IApiDo { + return a.withDO(a.DO.Attrs(attrs...)) +} + +func (a apiDo) Assign(attrs ...field.AssignExpr) IApiDo { + return a.withDO(a.DO.Assign(attrs...)) +} + +func (a apiDo) Joins(fields ...field.RelationField) IApiDo { + for _, _f := range fields { + a = *a.withDO(a.DO.Joins(_f)) + } + return &a +} + +func (a apiDo) Preload(fields ...field.RelationField) IApiDo { + for _, _f := range fields { + a = *a.withDO(a.DO.Preload(_f)) + } + return &a +} + +func (a apiDo) FirstOrInit() (*model.Api, error) { + if result, err := a.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*model.Api), nil + } +} + +func (a apiDo) FirstOrCreate() (*model.Api, error) { + if result, err := a.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*model.Api), nil + } +} + +func (a apiDo) FindByPage(offset int, limit int) (result []*model.Api, count int64, err error) { + result, err = a.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = a.Offset(-1).Limit(-1).Count() + return +} + +func (a apiDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = a.Count() + if err != nil { + return + } + + err = a.Offset(offset).Limit(limit).Scan(result) + return +} + +func (a apiDo) Scan(result interface{}) (err error) { + return a.DO.Scan(result) +} + +func (a apiDo) Delete(models ...*model.Api) (result gen.ResultInfo, err error) { + return a.DO.Delete(models) +} + +func (a *apiDo) withDO(do gen.Dao) *apiDo { + a.DO = *do.(*gen.DO) + return a +} diff --git a/stores/casbin_rule.gen.go b/stores/casbin_rule.gen.go new file mode 100644 index 0000000..ac10491 --- /dev/null +++ b/stores/casbin_rule.gen.go @@ -0,0 +1,429 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package stores + +import ( + "context" + "database/sql" + "strings" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "github.com/yiran15/api-server/model" +) + +func newCasbinRule(db *gorm.DB, opts ...gen.DOOption) casbinRule { + _casbinRule := casbinRule{} + + _casbinRule.casbinRuleDo.UseDB(db, opts...) + _casbinRule.casbinRuleDo.UseModel(&model.CasbinRule{}) + + tableName := _casbinRule.casbinRuleDo.TableName() + _casbinRule.ALL = field.NewAsterisk(tableName) + _casbinRule.ID = field.NewInt64(tableName, "id") + _casbinRule.PType = field.NewString(tableName, "ptype") + _casbinRule.V0 = field.NewString(tableName, "v0") + _casbinRule.V1 = field.NewString(tableName, "v1") + _casbinRule.V2 = field.NewString(tableName, "v2") + _casbinRule.V3 = field.NewString(tableName, "v3") + _casbinRule.V4 = field.NewString(tableName, "v4") + _casbinRule.V5 = field.NewString(tableName, "v5") + + _casbinRule.fillFieldMap() + + return _casbinRule +} + +type casbinRule struct { + casbinRuleDo + + ALL field.Asterisk + ID field.Int64 + PType field.String + V0 field.String + V1 field.String + V2 field.String + V3 field.String + V4 field.String + V5 field.String + + fieldMap map[string]field.Expr +} + +func (c casbinRule) Table(newTableName string) *casbinRule { + c.casbinRuleDo.UseTable(newTableName) + return c.updateTableName(newTableName) +} + +func (c casbinRule) As(alias string) *casbinRule { + c.casbinRuleDo.DO = *(c.casbinRuleDo.As(alias).(*gen.DO)) + return c.updateTableName(alias) +} + +func (c *casbinRule) updateTableName(table string) *casbinRule { + c.ALL = field.NewAsterisk(table) + c.ID = field.NewInt64(table, "id") + c.PType = field.NewString(table, "ptype") + c.V0 = field.NewString(table, "v0") + c.V1 = field.NewString(table, "v1") + c.V2 = field.NewString(table, "v2") + c.V3 = field.NewString(table, "v3") + c.V4 = field.NewString(table, "v4") + c.V5 = field.NewString(table, "v5") + + c.fillFieldMap() + + return c +} + +func (c *casbinRule) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := c.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (c *casbinRule) fillFieldMap() { + c.fieldMap = make(map[string]field.Expr, 8) + c.fieldMap["id"] = c.ID + c.fieldMap["ptype"] = c.PType + c.fieldMap["v0"] = c.V0 + c.fieldMap["v1"] = c.V1 + c.fieldMap["v2"] = c.V2 + c.fieldMap["v3"] = c.V3 + c.fieldMap["v4"] = c.V4 + c.fieldMap["v5"] = c.V5 +} + +func (c casbinRule) clone(db *gorm.DB) casbinRule { + c.casbinRuleDo.ReplaceConnPool(db.Statement.ConnPool) + return c +} + +func (c casbinRule) replaceDB(db *gorm.DB) casbinRule { + c.casbinRuleDo.ReplaceDB(db) + return c +} + +type casbinRuleDo struct{ gen.DO } + +type ICasbinRuleDo interface { + gen.SubQuery + Debug() ICasbinRuleDo + WithContext(ctx context.Context) ICasbinRuleDo + WithResult(fc func(tx gen.Dao)) gen.ResultInfo + ReplaceDB(db *gorm.DB) + ReadDB() ICasbinRuleDo + WriteDB() ICasbinRuleDo + As(alias string) gen.Dao + Session(config *gorm.Session) ICasbinRuleDo + Columns(cols ...field.Expr) gen.Columns + Clauses(conds ...clause.Expression) ICasbinRuleDo + Not(conds ...gen.Condition) ICasbinRuleDo + Or(conds ...gen.Condition) ICasbinRuleDo + Select(conds ...field.Expr) ICasbinRuleDo + Where(conds ...gen.Condition) ICasbinRuleDo + Order(conds ...field.Expr) ICasbinRuleDo + Distinct(cols ...field.Expr) ICasbinRuleDo + Omit(cols ...field.Expr) ICasbinRuleDo + Join(table schema.Tabler, on ...field.Expr) ICasbinRuleDo + LeftJoin(table schema.Tabler, on ...field.Expr) ICasbinRuleDo + RightJoin(table schema.Tabler, on ...field.Expr) ICasbinRuleDo + Group(cols ...field.Expr) ICasbinRuleDo + Having(conds ...gen.Condition) ICasbinRuleDo + Limit(limit int) ICasbinRuleDo + Offset(offset int) ICasbinRuleDo + Count() (count int64, err error) + Scopes(funcs ...func(gen.Dao) gen.Dao) ICasbinRuleDo + Unscoped() ICasbinRuleDo + Create(values ...*model.CasbinRule) error + CreateInBatches(values []*model.CasbinRule, batchSize int) error + Save(values ...*model.CasbinRule) error + First() (*model.CasbinRule, error) + Take() (*model.CasbinRule, error) + Last() (*model.CasbinRule, error) + Find() ([]*model.CasbinRule, error) + FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.CasbinRule, err error) + FindInBatches(result *[]*model.CasbinRule, batchSize int, fc func(tx gen.Dao, batch int) error) error + Pluck(column field.Expr, dest interface{}) error + Delete(...*model.CasbinRule) (info gen.ResultInfo, err error) + Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + Updates(value interface{}) (info gen.ResultInfo, err error) + UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + UpdateColumns(value interface{}) (info gen.ResultInfo, err error) + UpdateFrom(q gen.SubQuery) gen.Dao + Attrs(attrs ...field.AssignExpr) ICasbinRuleDo + Assign(attrs ...field.AssignExpr) ICasbinRuleDo + Joins(fields ...field.RelationField) ICasbinRuleDo + Preload(fields ...field.RelationField) ICasbinRuleDo + FirstOrInit() (*model.CasbinRule, error) + FirstOrCreate() (*model.CasbinRule, error) + FindByPage(offset int, limit int) (result []*model.CasbinRule, count int64, err error) + ScanByPage(result interface{}, offset int, limit int) (count int64, err error) + Rows() (*sql.Rows, error) + Row() *sql.Row + Scan(result interface{}) (err error) + Returning(value interface{}, columns ...string) ICasbinRuleDo + UnderlyingDB() *gorm.DB + schema.Tabler + + FilterWithID(id int) (result *model.CasbinRule, err error) +} + +// SELECT * FROM @@table WHERE id = @id +func (c casbinRuleDo) FilterWithID(id int) (result *model.CasbinRule, err error) { + var params []interface{} + + var generateSQL strings.Builder + params = append(params, id) + generateSQL.WriteString("SELECT * FROM casbin_rule WHERE id = ? ") + + var executeSQL *gorm.DB + executeSQL = c.UnderlyingDB().Raw(generateSQL.String(), params...).Take(&result) // ignore_security_alert + err = executeSQL.Error + + return +} + +func (c casbinRuleDo) Debug() ICasbinRuleDo { + return c.withDO(c.DO.Debug()) +} + +func (c casbinRuleDo) WithContext(ctx context.Context) ICasbinRuleDo { + return c.withDO(c.DO.WithContext(ctx)) +} + +func (c casbinRuleDo) ReadDB() ICasbinRuleDo { + return c.Clauses(dbresolver.Read) +} + +func (c casbinRuleDo) WriteDB() ICasbinRuleDo { + return c.Clauses(dbresolver.Write) +} + +func (c casbinRuleDo) Session(config *gorm.Session) ICasbinRuleDo { + return c.withDO(c.DO.Session(config)) +} + +func (c casbinRuleDo) Clauses(conds ...clause.Expression) ICasbinRuleDo { + return c.withDO(c.DO.Clauses(conds...)) +} + +func (c casbinRuleDo) Returning(value interface{}, columns ...string) ICasbinRuleDo { + return c.withDO(c.DO.Returning(value, columns...)) +} + +func (c casbinRuleDo) Not(conds ...gen.Condition) ICasbinRuleDo { + return c.withDO(c.DO.Not(conds...)) +} + +func (c casbinRuleDo) Or(conds ...gen.Condition) ICasbinRuleDo { + return c.withDO(c.DO.Or(conds...)) +} + +func (c casbinRuleDo) Select(conds ...field.Expr) ICasbinRuleDo { + return c.withDO(c.DO.Select(conds...)) +} + +func (c casbinRuleDo) Where(conds ...gen.Condition) ICasbinRuleDo { + return c.withDO(c.DO.Where(conds...)) +} + +func (c casbinRuleDo) Order(conds ...field.Expr) ICasbinRuleDo { + return c.withDO(c.DO.Order(conds...)) +} + +func (c casbinRuleDo) Distinct(cols ...field.Expr) ICasbinRuleDo { + return c.withDO(c.DO.Distinct(cols...)) +} + +func (c casbinRuleDo) Omit(cols ...field.Expr) ICasbinRuleDo { + return c.withDO(c.DO.Omit(cols...)) +} + +func (c casbinRuleDo) Join(table schema.Tabler, on ...field.Expr) ICasbinRuleDo { + return c.withDO(c.DO.Join(table, on...)) +} + +func (c casbinRuleDo) LeftJoin(table schema.Tabler, on ...field.Expr) ICasbinRuleDo { + return c.withDO(c.DO.LeftJoin(table, on...)) +} + +func (c casbinRuleDo) RightJoin(table schema.Tabler, on ...field.Expr) ICasbinRuleDo { + return c.withDO(c.DO.RightJoin(table, on...)) +} + +func (c casbinRuleDo) Group(cols ...field.Expr) ICasbinRuleDo { + return c.withDO(c.DO.Group(cols...)) +} + +func (c casbinRuleDo) Having(conds ...gen.Condition) ICasbinRuleDo { + return c.withDO(c.DO.Having(conds...)) +} + +func (c casbinRuleDo) Limit(limit int) ICasbinRuleDo { + return c.withDO(c.DO.Limit(limit)) +} + +func (c casbinRuleDo) Offset(offset int) ICasbinRuleDo { + return c.withDO(c.DO.Offset(offset)) +} + +func (c casbinRuleDo) Scopes(funcs ...func(gen.Dao) gen.Dao) ICasbinRuleDo { + return c.withDO(c.DO.Scopes(funcs...)) +} + +func (c casbinRuleDo) Unscoped() ICasbinRuleDo { + return c.withDO(c.DO.Unscoped()) +} + +func (c casbinRuleDo) Create(values ...*model.CasbinRule) error { + if len(values) == 0 { + return nil + } + return c.DO.Create(values) +} + +func (c casbinRuleDo) CreateInBatches(values []*model.CasbinRule, batchSize int) error { + return c.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (c casbinRuleDo) Save(values ...*model.CasbinRule) error { + if len(values) == 0 { + return nil + } + return c.DO.Save(values) +} + +func (c casbinRuleDo) First() (*model.CasbinRule, error) { + if result, err := c.DO.First(); err != nil { + return nil, err + } else { + return result.(*model.CasbinRule), nil + } +} + +func (c casbinRuleDo) Take() (*model.CasbinRule, error) { + if result, err := c.DO.Take(); err != nil { + return nil, err + } else { + return result.(*model.CasbinRule), nil + } +} + +func (c casbinRuleDo) Last() (*model.CasbinRule, error) { + if result, err := c.DO.Last(); err != nil { + return nil, err + } else { + return result.(*model.CasbinRule), nil + } +} + +func (c casbinRuleDo) Find() ([]*model.CasbinRule, error) { + result, err := c.DO.Find() + return result.([]*model.CasbinRule), err +} + +func (c casbinRuleDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.CasbinRule, err error) { + buf := make([]*model.CasbinRule, 0, batchSize) + err = c.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (c casbinRuleDo) FindInBatches(result *[]*model.CasbinRule, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return c.DO.FindInBatches(result, batchSize, fc) +} + +func (c casbinRuleDo) Attrs(attrs ...field.AssignExpr) ICasbinRuleDo { + return c.withDO(c.DO.Attrs(attrs...)) +} + +func (c casbinRuleDo) Assign(attrs ...field.AssignExpr) ICasbinRuleDo { + return c.withDO(c.DO.Assign(attrs...)) +} + +func (c casbinRuleDo) Joins(fields ...field.RelationField) ICasbinRuleDo { + for _, _f := range fields { + c = *c.withDO(c.DO.Joins(_f)) + } + return &c +} + +func (c casbinRuleDo) Preload(fields ...field.RelationField) ICasbinRuleDo { + for _, _f := range fields { + c = *c.withDO(c.DO.Preload(_f)) + } + return &c +} + +func (c casbinRuleDo) FirstOrInit() (*model.CasbinRule, error) { + if result, err := c.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*model.CasbinRule), nil + } +} + +func (c casbinRuleDo) FirstOrCreate() (*model.CasbinRule, error) { + if result, err := c.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*model.CasbinRule), nil + } +} + +func (c casbinRuleDo) FindByPage(offset int, limit int) (result []*model.CasbinRule, count int64, err error) { + result, err = c.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = c.Offset(-1).Limit(-1).Count() + return +} + +func (c casbinRuleDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = c.Count() + if err != nil { + return + } + + err = c.Offset(offset).Limit(limit).Scan(result) + return +} + +func (c casbinRuleDo) Scan(result interface{}) (err error) { + return c.DO.Scan(result) +} + +func (c casbinRuleDo) Delete(models ...*model.CasbinRule) (result gen.ResultInfo, err error) { + return c.DO.Delete(models) +} + +func (c *casbinRuleDo) withDO(do gen.Dao) *casbinRuleDo { + c.DO = *do.(*gen.DO) + return c +} diff --git a/stores/feishu_users.gen.go b/stores/feishu_users.gen.go new file mode 100644 index 0000000..644aa5a --- /dev/null +++ b/stores/feishu_users.gen.go @@ -0,0 +1,605 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package stores + +import ( + "context" + "database/sql" + "strings" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "github.com/yiran15/api-server/model" +) + +func newFeiShuUser(db *gorm.DB, opts ...gen.DOOption) feiShuUser { + _feiShuUser := feiShuUser{} + + _feiShuUser.feiShuUserDo.UseDB(db, opts...) + _feiShuUser.feiShuUserDo.UseModel(&model.FeiShuUser{}) + + tableName := _feiShuUser.feiShuUserDo.TableName() + _feiShuUser.ALL = field.NewAsterisk(tableName) + _feiShuUser.UID = field.NewInt64(tableName, "uid") + _feiShuUser.CreatedAt = field.NewTime(tableName, "created_at") + _feiShuUser.UpdatedAt = field.NewTime(tableName, "updated_at") + _feiShuUser.DeletedAt = field.NewField(tableName, "deleted_at") + _feiShuUser.AvatarBig = field.NewString(tableName, "avatar_big") + _feiShuUser.AvatarMiddle = field.NewString(tableName, "avatar_middle") + _feiShuUser.AvatarThumb = field.NewString(tableName, "avatar_thumb") + _feiShuUser.AvatarUrl = field.NewString(tableName, "avatar_url") + _feiShuUser.Email = field.NewString(tableName, "email") + _feiShuUser.EmployeeNo = field.NewString(tableName, "employee_no") + _feiShuUser.EnName = field.NewString(tableName, "en_name") + _feiShuUser.EnterpriseEmail = field.NewString(tableName, "enterprise_email") + _feiShuUser.Mobile = field.NewString(tableName, "mobile") + _feiShuUser.Name = field.NewString(tableName, "name") + _feiShuUser.OpenID = field.NewString(tableName, "open_id") + _feiShuUser.TenantKey = field.NewString(tableName, "tenant_key") + _feiShuUser.UnionID = field.NewString(tableName, "union_id") + _feiShuUser.UserID = field.NewString(tableName, "user_id") + _feiShuUser.User = feiShuUserBelongsToUser{ + db: db.Session(&gorm.Session{}), + + RelationField: field.NewRelation("User", "model.User"), + Roles: struct { + field.RelationField + Users struct { + field.RelationField + } + Apis struct { + field.RelationField + Roles struct { + field.RelationField + } + } + }{ + RelationField: field.NewRelation("User.Roles", "model.Role"), + Users: struct { + field.RelationField + }{ + RelationField: field.NewRelation("User.Roles.Users", "model.User"), + }, + Apis: struct { + field.RelationField + Roles struct { + field.RelationField + } + }{ + RelationField: field.NewRelation("User.Roles.Apis", "model.Api"), + Roles: struct { + field.RelationField + }{ + RelationField: field.NewRelation("User.Roles.Apis.Roles", "model.Role"), + }, + }, + }, + } + + _feiShuUser.fillFieldMap() + + return _feiShuUser +} + +type feiShuUser struct { + feiShuUserDo + + ALL field.Asterisk + UID field.Int64 // 关联users表中的用户id + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Field + AvatarBig field.String // 飞书用户avatar_big + AvatarMiddle field.String // 飞书用户avatar_middle + AvatarThumb field.String // 飞书用户avatar_thumb + AvatarUrl field.String // 飞书用户avatar_url + Email field.String // 飞书用户email + EmployeeNo field.String // 飞书用户employee_no + EnName field.String // 飞书用户en_name + EnterpriseEmail field.String // 飞书用户enterprise_email + Mobile field.String // 飞书用户mobile + Name field.String // 飞书用户name + OpenID field.String // 飞书用户open_id + TenantKey field.String // 飞书用户tenant_key + UnionID field.String // 飞书用户union_id + UserID field.String // 飞书用户ID + User feiShuUserBelongsToUser + + fieldMap map[string]field.Expr +} + +func (f feiShuUser) Table(newTableName string) *feiShuUser { + f.feiShuUserDo.UseTable(newTableName) + return f.updateTableName(newTableName) +} + +func (f feiShuUser) As(alias string) *feiShuUser { + f.feiShuUserDo.DO = *(f.feiShuUserDo.As(alias).(*gen.DO)) + return f.updateTableName(alias) +} + +func (f *feiShuUser) updateTableName(table string) *feiShuUser { + f.ALL = field.NewAsterisk(table) + f.UID = field.NewInt64(table, "uid") + f.CreatedAt = field.NewTime(table, "created_at") + f.UpdatedAt = field.NewTime(table, "updated_at") + f.DeletedAt = field.NewField(table, "deleted_at") + f.AvatarBig = field.NewString(table, "avatar_big") + f.AvatarMiddle = field.NewString(table, "avatar_middle") + f.AvatarThumb = field.NewString(table, "avatar_thumb") + f.AvatarUrl = field.NewString(table, "avatar_url") + f.Email = field.NewString(table, "email") + f.EmployeeNo = field.NewString(table, "employee_no") + f.EnName = field.NewString(table, "en_name") + f.EnterpriseEmail = field.NewString(table, "enterprise_email") + f.Mobile = field.NewString(table, "mobile") + f.Name = field.NewString(table, "name") + f.OpenID = field.NewString(table, "open_id") + f.TenantKey = field.NewString(table, "tenant_key") + f.UnionID = field.NewString(table, "union_id") + f.UserID = field.NewString(table, "user_id") + + f.fillFieldMap() + + return f +} + +func (f *feiShuUser) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := f.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (f *feiShuUser) fillFieldMap() { + f.fieldMap = make(map[string]field.Expr, 19) + f.fieldMap["uid"] = f.UID + f.fieldMap["created_at"] = f.CreatedAt + f.fieldMap["updated_at"] = f.UpdatedAt + f.fieldMap["deleted_at"] = f.DeletedAt + f.fieldMap["avatar_big"] = f.AvatarBig + f.fieldMap["avatar_middle"] = f.AvatarMiddle + f.fieldMap["avatar_thumb"] = f.AvatarThumb + f.fieldMap["avatar_url"] = f.AvatarUrl + f.fieldMap["email"] = f.Email + f.fieldMap["employee_no"] = f.EmployeeNo + f.fieldMap["en_name"] = f.EnName + f.fieldMap["enterprise_email"] = f.EnterpriseEmail + f.fieldMap["mobile"] = f.Mobile + f.fieldMap["name"] = f.Name + f.fieldMap["open_id"] = f.OpenID + f.fieldMap["tenant_key"] = f.TenantKey + f.fieldMap["union_id"] = f.UnionID + f.fieldMap["user_id"] = f.UserID + +} + +func (f feiShuUser) clone(db *gorm.DB) feiShuUser { + f.feiShuUserDo.ReplaceConnPool(db.Statement.ConnPool) + f.User.db = db.Session(&gorm.Session{Initialized: true}) + f.User.db.Statement.ConnPool = db.Statement.ConnPool + return f +} + +func (f feiShuUser) replaceDB(db *gorm.DB) feiShuUser { + f.feiShuUserDo.ReplaceDB(db) + f.User.db = db.Session(&gorm.Session{}) + return f +} + +type feiShuUserBelongsToUser struct { + db *gorm.DB + + field.RelationField + + Roles struct { + field.RelationField + Users struct { + field.RelationField + } + Apis struct { + field.RelationField + Roles struct { + field.RelationField + } + } + } +} + +func (a feiShuUserBelongsToUser) Where(conds ...field.Expr) *feiShuUserBelongsToUser { + if len(conds) == 0 { + return &a + } + + exprs := make([]clause.Expression, 0, len(conds)) + for _, cond := range conds { + exprs = append(exprs, cond.BeCond().(clause.Expression)) + } + a.db = a.db.Clauses(clause.Where{Exprs: exprs}) + return &a +} + +func (a feiShuUserBelongsToUser) WithContext(ctx context.Context) *feiShuUserBelongsToUser { + a.db = a.db.WithContext(ctx) + return &a +} + +func (a feiShuUserBelongsToUser) Session(session *gorm.Session) *feiShuUserBelongsToUser { + a.db = a.db.Session(session) + return &a +} + +func (a feiShuUserBelongsToUser) Model(m *model.FeiShuUser) *feiShuUserBelongsToUserTx { + return &feiShuUserBelongsToUserTx{a.db.Model(m).Association(a.Name())} +} + +func (a feiShuUserBelongsToUser) Unscoped() *feiShuUserBelongsToUser { + a.db = a.db.Unscoped() + return &a +} + +type feiShuUserBelongsToUserTx struct{ tx *gorm.Association } + +func (a feiShuUserBelongsToUserTx) Find() (result *model.User, err error) { + return result, a.tx.Find(&result) +} + +func (a feiShuUserBelongsToUserTx) Append(values ...*model.User) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Append(targetValues...) +} + +func (a feiShuUserBelongsToUserTx) Replace(values ...*model.User) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Replace(targetValues...) +} + +func (a feiShuUserBelongsToUserTx) Delete(values ...*model.User) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Delete(targetValues...) +} + +func (a feiShuUserBelongsToUserTx) Clear() error { + return a.tx.Clear() +} + +func (a feiShuUserBelongsToUserTx) Count() int64 { + return a.tx.Count() +} + +func (a feiShuUserBelongsToUserTx) Unscoped() *feiShuUserBelongsToUserTx { + a.tx = a.tx.Unscoped() + return &a +} + +type feiShuUserDo struct{ gen.DO } + +type IFeiShuUserDo interface { + gen.SubQuery + Debug() IFeiShuUserDo + WithContext(ctx context.Context) IFeiShuUserDo + WithResult(fc func(tx gen.Dao)) gen.ResultInfo + ReplaceDB(db *gorm.DB) + ReadDB() IFeiShuUserDo + WriteDB() IFeiShuUserDo + As(alias string) gen.Dao + Session(config *gorm.Session) IFeiShuUserDo + Columns(cols ...field.Expr) gen.Columns + Clauses(conds ...clause.Expression) IFeiShuUserDo + Not(conds ...gen.Condition) IFeiShuUserDo + Or(conds ...gen.Condition) IFeiShuUserDo + Select(conds ...field.Expr) IFeiShuUserDo + Where(conds ...gen.Condition) IFeiShuUserDo + Order(conds ...field.Expr) IFeiShuUserDo + Distinct(cols ...field.Expr) IFeiShuUserDo + Omit(cols ...field.Expr) IFeiShuUserDo + Join(table schema.Tabler, on ...field.Expr) IFeiShuUserDo + LeftJoin(table schema.Tabler, on ...field.Expr) IFeiShuUserDo + RightJoin(table schema.Tabler, on ...field.Expr) IFeiShuUserDo + Group(cols ...field.Expr) IFeiShuUserDo + Having(conds ...gen.Condition) IFeiShuUserDo + Limit(limit int) IFeiShuUserDo + Offset(offset int) IFeiShuUserDo + Count() (count int64, err error) + Scopes(funcs ...func(gen.Dao) gen.Dao) IFeiShuUserDo + Unscoped() IFeiShuUserDo + Create(values ...*model.FeiShuUser) error + CreateInBatches(values []*model.FeiShuUser, batchSize int) error + Save(values ...*model.FeiShuUser) error + First() (*model.FeiShuUser, error) + Take() (*model.FeiShuUser, error) + Last() (*model.FeiShuUser, error) + Find() ([]*model.FeiShuUser, error) + FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.FeiShuUser, err error) + FindInBatches(result *[]*model.FeiShuUser, batchSize int, fc func(tx gen.Dao, batch int) error) error + Pluck(column field.Expr, dest interface{}) error + Delete(...*model.FeiShuUser) (info gen.ResultInfo, err error) + Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + Updates(value interface{}) (info gen.ResultInfo, err error) + UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + UpdateColumns(value interface{}) (info gen.ResultInfo, err error) + UpdateFrom(q gen.SubQuery) gen.Dao + Attrs(attrs ...field.AssignExpr) IFeiShuUserDo + Assign(attrs ...field.AssignExpr) IFeiShuUserDo + Joins(fields ...field.RelationField) IFeiShuUserDo + Preload(fields ...field.RelationField) IFeiShuUserDo + FirstOrInit() (*model.FeiShuUser, error) + FirstOrCreate() (*model.FeiShuUser, error) + FindByPage(offset int, limit int) (result []*model.FeiShuUser, count int64, err error) + ScanByPage(result interface{}, offset int, limit int) (count int64, err error) + Rows() (*sql.Rows, error) + Row() *sql.Row + Scan(result interface{}) (err error) + Returning(value interface{}, columns ...string) IFeiShuUserDo + UnderlyingDB() *gorm.DB + schema.Tabler + + FilterWithID(id int) (result *model.FeiShuUser, err error) +} + +// SELECT * FROM @@table WHERE id = @id +func (f feiShuUserDo) FilterWithID(id int) (result *model.FeiShuUser, err error) { + var params []interface{} + + var generateSQL strings.Builder + params = append(params, id) + generateSQL.WriteString("SELECT * FROM feishu_users WHERE id = ? ") + + var executeSQL *gorm.DB + executeSQL = f.UnderlyingDB().Raw(generateSQL.String(), params...).Take(&result) // ignore_security_alert + err = executeSQL.Error + + return +} + +func (f feiShuUserDo) Debug() IFeiShuUserDo { + return f.withDO(f.DO.Debug()) +} + +func (f feiShuUserDo) WithContext(ctx context.Context) IFeiShuUserDo { + return f.withDO(f.DO.WithContext(ctx)) +} + +func (f feiShuUserDo) ReadDB() IFeiShuUserDo { + return f.Clauses(dbresolver.Read) +} + +func (f feiShuUserDo) WriteDB() IFeiShuUserDo { + return f.Clauses(dbresolver.Write) +} + +func (f feiShuUserDo) Session(config *gorm.Session) IFeiShuUserDo { + return f.withDO(f.DO.Session(config)) +} + +func (f feiShuUserDo) Clauses(conds ...clause.Expression) IFeiShuUserDo { + return f.withDO(f.DO.Clauses(conds...)) +} + +func (f feiShuUserDo) Returning(value interface{}, columns ...string) IFeiShuUserDo { + return f.withDO(f.DO.Returning(value, columns...)) +} + +func (f feiShuUserDo) Not(conds ...gen.Condition) IFeiShuUserDo { + return f.withDO(f.DO.Not(conds...)) +} + +func (f feiShuUserDo) Or(conds ...gen.Condition) IFeiShuUserDo { + return f.withDO(f.DO.Or(conds...)) +} + +func (f feiShuUserDo) Select(conds ...field.Expr) IFeiShuUserDo { + return f.withDO(f.DO.Select(conds...)) +} + +func (f feiShuUserDo) Where(conds ...gen.Condition) IFeiShuUserDo { + return f.withDO(f.DO.Where(conds...)) +} + +func (f feiShuUserDo) Order(conds ...field.Expr) IFeiShuUserDo { + return f.withDO(f.DO.Order(conds...)) +} + +func (f feiShuUserDo) Distinct(cols ...field.Expr) IFeiShuUserDo { + return f.withDO(f.DO.Distinct(cols...)) +} + +func (f feiShuUserDo) Omit(cols ...field.Expr) IFeiShuUserDo { + return f.withDO(f.DO.Omit(cols...)) +} + +func (f feiShuUserDo) Join(table schema.Tabler, on ...field.Expr) IFeiShuUserDo { + return f.withDO(f.DO.Join(table, on...)) +} + +func (f feiShuUserDo) LeftJoin(table schema.Tabler, on ...field.Expr) IFeiShuUserDo { + return f.withDO(f.DO.LeftJoin(table, on...)) +} + +func (f feiShuUserDo) RightJoin(table schema.Tabler, on ...field.Expr) IFeiShuUserDo { + return f.withDO(f.DO.RightJoin(table, on...)) +} + +func (f feiShuUserDo) Group(cols ...field.Expr) IFeiShuUserDo { + return f.withDO(f.DO.Group(cols...)) +} + +func (f feiShuUserDo) Having(conds ...gen.Condition) IFeiShuUserDo { + return f.withDO(f.DO.Having(conds...)) +} + +func (f feiShuUserDo) Limit(limit int) IFeiShuUserDo { + return f.withDO(f.DO.Limit(limit)) +} + +func (f feiShuUserDo) Offset(offset int) IFeiShuUserDo { + return f.withDO(f.DO.Offset(offset)) +} + +func (f feiShuUserDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IFeiShuUserDo { + return f.withDO(f.DO.Scopes(funcs...)) +} + +func (f feiShuUserDo) Unscoped() IFeiShuUserDo { + return f.withDO(f.DO.Unscoped()) +} + +func (f feiShuUserDo) Create(values ...*model.FeiShuUser) error { + if len(values) == 0 { + return nil + } + return f.DO.Create(values) +} + +func (f feiShuUserDo) CreateInBatches(values []*model.FeiShuUser, batchSize int) error { + return f.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (f feiShuUserDo) Save(values ...*model.FeiShuUser) error { + if len(values) == 0 { + return nil + } + return f.DO.Save(values) +} + +func (f feiShuUserDo) First() (*model.FeiShuUser, error) { + if result, err := f.DO.First(); err != nil { + return nil, err + } else { + return result.(*model.FeiShuUser), nil + } +} + +func (f feiShuUserDo) Take() (*model.FeiShuUser, error) { + if result, err := f.DO.Take(); err != nil { + return nil, err + } else { + return result.(*model.FeiShuUser), nil + } +} + +func (f feiShuUserDo) Last() (*model.FeiShuUser, error) { + if result, err := f.DO.Last(); err != nil { + return nil, err + } else { + return result.(*model.FeiShuUser), nil + } +} + +func (f feiShuUserDo) Find() ([]*model.FeiShuUser, error) { + result, err := f.DO.Find() + return result.([]*model.FeiShuUser), err +} + +func (f feiShuUserDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.FeiShuUser, err error) { + buf := make([]*model.FeiShuUser, 0, batchSize) + err = f.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (f feiShuUserDo) FindInBatches(result *[]*model.FeiShuUser, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return f.DO.FindInBatches(result, batchSize, fc) +} + +func (f feiShuUserDo) Attrs(attrs ...field.AssignExpr) IFeiShuUserDo { + return f.withDO(f.DO.Attrs(attrs...)) +} + +func (f feiShuUserDo) Assign(attrs ...field.AssignExpr) IFeiShuUserDo { + return f.withDO(f.DO.Assign(attrs...)) +} + +func (f feiShuUserDo) Joins(fields ...field.RelationField) IFeiShuUserDo { + for _, _f := range fields { + f = *f.withDO(f.DO.Joins(_f)) + } + return &f +} + +func (f feiShuUserDo) Preload(fields ...field.RelationField) IFeiShuUserDo { + for _, _f := range fields { + f = *f.withDO(f.DO.Preload(_f)) + } + return &f +} + +func (f feiShuUserDo) FirstOrInit() (*model.FeiShuUser, error) { + if result, err := f.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*model.FeiShuUser), nil + } +} + +func (f feiShuUserDo) FirstOrCreate() (*model.FeiShuUser, error) { + if result, err := f.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*model.FeiShuUser), nil + } +} + +func (f feiShuUserDo) FindByPage(offset int, limit int) (result []*model.FeiShuUser, count int64, err error) { + result, err = f.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = f.Offset(-1).Limit(-1).Count() + return +} + +func (f feiShuUserDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = f.Count() + if err != nil { + return + } + + err = f.Offset(offset).Limit(limit).Scan(result) + return +} + +func (f feiShuUserDo) Scan(result interface{}) (err error) { + return f.DO.Scan(result) +} + +func (f feiShuUserDo) Delete(models ...*model.FeiShuUser) (result gen.ResultInfo, err error) { + return f.DO.Delete(models) +} + +func (f *feiShuUserDo) withDO(do gen.Dao) *feiShuUserDo { + f.DO = *do.(*gen.DO) + return f +} diff --git a/stores/gen.go b/stores/gen.go new file mode 100644 index 0000000..637c252 --- /dev/null +++ b/stores/gen.go @@ -0,0 +1,135 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package stores + +import ( + "context" + "database/sql" + + "gorm.io/gorm" + + "gorm.io/gen" + + "gorm.io/plugin/dbresolver" +) + +var ( + Q = new(Query) + Api *api + CasbinRule *casbinRule + FeiShuUser *feiShuUser + Role *role + User *user +) + +func SetDefault(db *gorm.DB, opts ...gen.DOOption) { + *Q = *Use(db, opts...) + Api = &Q.Api + CasbinRule = &Q.CasbinRule + FeiShuUser = &Q.FeiShuUser + Role = &Q.Role + User = &Q.User +} + +func Use(db *gorm.DB, opts ...gen.DOOption) *Query { + return &Query{ + db: db, + Api: newApi(db, opts...), + CasbinRule: newCasbinRule(db, opts...), + FeiShuUser: newFeiShuUser(db, opts...), + Role: newRole(db, opts...), + User: newUser(db, opts...), + } +} + +type Query struct { + db *gorm.DB + + Api api + CasbinRule casbinRule + FeiShuUser feiShuUser + Role role + User user +} + +func (q *Query) Available() bool { return q.db != nil } + +func (q *Query) clone(db *gorm.DB) *Query { + return &Query{ + db: db, + Api: q.Api.clone(db), + CasbinRule: q.CasbinRule.clone(db), + FeiShuUser: q.FeiShuUser.clone(db), + Role: q.Role.clone(db), + User: q.User.clone(db), + } +} + +func (q *Query) ReadDB() *Query { + return q.ReplaceDB(q.db.Clauses(dbresolver.Read)) +} + +func (q *Query) WriteDB() *Query { + return q.ReplaceDB(q.db.Clauses(dbresolver.Write)) +} + +func (q *Query) ReplaceDB(db *gorm.DB) *Query { + return &Query{ + db: db, + Api: q.Api.replaceDB(db), + CasbinRule: q.CasbinRule.replaceDB(db), + FeiShuUser: q.FeiShuUser.replaceDB(db), + Role: q.Role.replaceDB(db), + User: q.User.replaceDB(db), + } +} + +type queryCtx struct { + Api IApiDo + CasbinRule ICasbinRuleDo + FeiShuUser IFeiShuUserDo + Role IRoleDo + User IUserDo +} + +func (q *Query) WithContext(ctx context.Context) *queryCtx { + return &queryCtx{ + Api: q.Api.WithContext(ctx), + CasbinRule: q.CasbinRule.WithContext(ctx), + FeiShuUser: q.FeiShuUser.WithContext(ctx), + Role: q.Role.WithContext(ctx), + User: q.User.WithContext(ctx), + } +} + +func (q *Query) Transaction(fc func(tx *Query) error, opts ...*sql.TxOptions) error { + return q.db.Transaction(func(tx *gorm.DB) error { return fc(q.clone(tx)) }, opts...) +} + +func (q *Query) Begin(opts ...*sql.TxOptions) *QueryTx { + tx := q.db.Begin(opts...) + return &QueryTx{Query: q.clone(tx), Error: tx.Error} +} + +type QueryTx struct { + *Query + Error error +} + +func (q *QueryTx) Commit() error { + return q.db.Commit().Error +} + +func (q *QueryTx) Rollback() error { + return q.db.Rollback().Error +} + +func (q *QueryTx) SavePoint(name string) error { + return q.db.SavePoint(name).Error +} + +func (q *QueryTx) RollbackTo(name string) error { + return q.db.RollbackTo(name).Error +} diff --git a/stores/roles.gen.go b/stores/roles.gen.go new file mode 100644 index 0000000..9680927 --- /dev/null +++ b/stores/roles.gen.go @@ -0,0 +1,649 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package stores + +import ( + "context" + "database/sql" + "strings" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "github.com/yiran15/api-server/model" +) + +func newRole(db *gorm.DB, opts ...gen.DOOption) role { + _role := role{} + + _role.roleDo.UseDB(db, opts...) + _role.roleDo.UseModel(&model.Role{}) + + tableName := _role.roleDo.TableName() + _role.ALL = field.NewAsterisk(tableName) + _role.ID = field.NewInt64(tableName, "id") + _role.CreatedAt = field.NewTime(tableName, "created_at") + _role.UpdatedAt = field.NewTime(tableName, "updated_at") + _role.DeletedAt = field.NewField(tableName, "deleted_at") + _role.Name = field.NewString(tableName, "name") + _role.Description = field.NewString(tableName, "description") + _role.Users = roleManyToManyUsers{ + db: db.Session(&gorm.Session{}), + + RelationField: field.NewRelation("Users", "model.User"), + Roles: struct { + field.RelationField + Users struct { + field.RelationField + } + Apis struct { + field.RelationField + Roles struct { + field.RelationField + } + } + }{ + RelationField: field.NewRelation("Users.Roles", "model.Role"), + Users: struct { + field.RelationField + }{ + RelationField: field.NewRelation("Users.Roles.Users", "model.User"), + }, + Apis: struct { + field.RelationField + Roles struct { + field.RelationField + } + }{ + RelationField: field.NewRelation("Users.Roles.Apis", "model.Api"), + Roles: struct { + field.RelationField + }{ + RelationField: field.NewRelation("Users.Roles.Apis.Roles", "model.Role"), + }, + }, + }, + } + + _role.Apis = roleManyToManyApis{ + db: db.Session(&gorm.Session{}), + + RelationField: field.NewRelation("Apis", "model.Api"), + } + + _role.fillFieldMap() + + return _role +} + +type role struct { + roleDo + + ALL field.Asterisk + ID field.Int64 + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Field + Name field.String + Description field.String + Users roleManyToManyUsers + + Apis roleManyToManyApis + + fieldMap map[string]field.Expr +} + +func (r role) Table(newTableName string) *role { + r.roleDo.UseTable(newTableName) + return r.updateTableName(newTableName) +} + +func (r role) As(alias string) *role { + r.roleDo.DO = *(r.roleDo.As(alias).(*gen.DO)) + return r.updateTableName(alias) +} + +func (r *role) updateTableName(table string) *role { + r.ALL = field.NewAsterisk(table) + r.ID = field.NewInt64(table, "id") + r.CreatedAt = field.NewTime(table, "created_at") + r.UpdatedAt = field.NewTime(table, "updated_at") + r.DeletedAt = field.NewField(table, "deleted_at") + r.Name = field.NewString(table, "name") + r.Description = field.NewString(table, "description") + + r.fillFieldMap() + + return r +} + +func (r *role) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := r.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (r *role) fillFieldMap() { + r.fieldMap = make(map[string]field.Expr, 8) + r.fieldMap["id"] = r.ID + r.fieldMap["created_at"] = r.CreatedAt + r.fieldMap["updated_at"] = r.UpdatedAt + r.fieldMap["deleted_at"] = r.DeletedAt + r.fieldMap["name"] = r.Name + r.fieldMap["description"] = r.Description + +} + +func (r role) clone(db *gorm.DB) role { + r.roleDo.ReplaceConnPool(db.Statement.ConnPool) + r.Users.db = db.Session(&gorm.Session{Initialized: true}) + r.Users.db.Statement.ConnPool = db.Statement.ConnPool + r.Apis.db = db.Session(&gorm.Session{Initialized: true}) + r.Apis.db.Statement.ConnPool = db.Statement.ConnPool + return r +} + +func (r role) replaceDB(db *gorm.DB) role { + r.roleDo.ReplaceDB(db) + r.Users.db = db.Session(&gorm.Session{}) + r.Apis.db = db.Session(&gorm.Session{}) + return r +} + +type roleManyToManyUsers struct { + db *gorm.DB + + field.RelationField + + Roles struct { + field.RelationField + Users struct { + field.RelationField + } + Apis struct { + field.RelationField + Roles struct { + field.RelationField + } + } + } +} + +func (a roleManyToManyUsers) Where(conds ...field.Expr) *roleManyToManyUsers { + if len(conds) == 0 { + return &a + } + + exprs := make([]clause.Expression, 0, len(conds)) + for _, cond := range conds { + exprs = append(exprs, cond.BeCond().(clause.Expression)) + } + a.db = a.db.Clauses(clause.Where{Exprs: exprs}) + return &a +} + +func (a roleManyToManyUsers) WithContext(ctx context.Context) *roleManyToManyUsers { + a.db = a.db.WithContext(ctx) + return &a +} + +func (a roleManyToManyUsers) Session(session *gorm.Session) *roleManyToManyUsers { + a.db = a.db.Session(session) + return &a +} + +func (a roleManyToManyUsers) Model(m *model.Role) *roleManyToManyUsersTx { + return &roleManyToManyUsersTx{a.db.Model(m).Association(a.Name())} +} + +func (a roleManyToManyUsers) Unscoped() *roleManyToManyUsers { + a.db = a.db.Unscoped() + return &a +} + +type roleManyToManyUsersTx struct{ tx *gorm.Association } + +func (a roleManyToManyUsersTx) Find() (result []*model.User, err error) { + return result, a.tx.Find(&result) +} + +func (a roleManyToManyUsersTx) Append(values ...*model.User) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Append(targetValues...) +} + +func (a roleManyToManyUsersTx) Replace(values ...*model.User) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Replace(targetValues...) +} + +func (a roleManyToManyUsersTx) Delete(values ...*model.User) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Delete(targetValues...) +} + +func (a roleManyToManyUsersTx) Clear() error { + return a.tx.Clear() +} + +func (a roleManyToManyUsersTx) Count() int64 { + return a.tx.Count() +} + +func (a roleManyToManyUsersTx) Unscoped() *roleManyToManyUsersTx { + a.tx = a.tx.Unscoped() + return &a +} + +type roleManyToManyApis struct { + db *gorm.DB + + field.RelationField +} + +func (a roleManyToManyApis) Where(conds ...field.Expr) *roleManyToManyApis { + if len(conds) == 0 { + return &a + } + + exprs := make([]clause.Expression, 0, len(conds)) + for _, cond := range conds { + exprs = append(exprs, cond.BeCond().(clause.Expression)) + } + a.db = a.db.Clauses(clause.Where{Exprs: exprs}) + return &a +} + +func (a roleManyToManyApis) WithContext(ctx context.Context) *roleManyToManyApis { + a.db = a.db.WithContext(ctx) + return &a +} + +func (a roleManyToManyApis) Session(session *gorm.Session) *roleManyToManyApis { + a.db = a.db.Session(session) + return &a +} + +func (a roleManyToManyApis) Model(m *model.Role) *roleManyToManyApisTx { + return &roleManyToManyApisTx{a.db.Model(m).Association(a.Name())} +} + +func (a roleManyToManyApis) Unscoped() *roleManyToManyApis { + a.db = a.db.Unscoped() + return &a +} + +type roleManyToManyApisTx struct{ tx *gorm.Association } + +func (a roleManyToManyApisTx) Find() (result []*model.Api, err error) { + return result, a.tx.Find(&result) +} + +func (a roleManyToManyApisTx) Append(values ...*model.Api) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Append(targetValues...) +} + +func (a roleManyToManyApisTx) Replace(values ...*model.Api) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Replace(targetValues...) +} + +func (a roleManyToManyApisTx) Delete(values ...*model.Api) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Delete(targetValues...) +} + +func (a roleManyToManyApisTx) Clear() error { + return a.tx.Clear() +} + +func (a roleManyToManyApisTx) Count() int64 { + return a.tx.Count() +} + +func (a roleManyToManyApisTx) Unscoped() *roleManyToManyApisTx { + a.tx = a.tx.Unscoped() + return &a +} + +type roleDo struct{ gen.DO } + +type IRoleDo interface { + gen.SubQuery + Debug() IRoleDo + WithContext(ctx context.Context) IRoleDo + WithResult(fc func(tx gen.Dao)) gen.ResultInfo + ReplaceDB(db *gorm.DB) + ReadDB() IRoleDo + WriteDB() IRoleDo + As(alias string) gen.Dao + Session(config *gorm.Session) IRoleDo + Columns(cols ...field.Expr) gen.Columns + Clauses(conds ...clause.Expression) IRoleDo + Not(conds ...gen.Condition) IRoleDo + Or(conds ...gen.Condition) IRoleDo + Select(conds ...field.Expr) IRoleDo + Where(conds ...gen.Condition) IRoleDo + Order(conds ...field.Expr) IRoleDo + Distinct(cols ...field.Expr) IRoleDo + Omit(cols ...field.Expr) IRoleDo + Join(table schema.Tabler, on ...field.Expr) IRoleDo + LeftJoin(table schema.Tabler, on ...field.Expr) IRoleDo + RightJoin(table schema.Tabler, on ...field.Expr) IRoleDo + Group(cols ...field.Expr) IRoleDo + Having(conds ...gen.Condition) IRoleDo + Limit(limit int) IRoleDo + Offset(offset int) IRoleDo + Count() (count int64, err error) + Scopes(funcs ...func(gen.Dao) gen.Dao) IRoleDo + Unscoped() IRoleDo + Create(values ...*model.Role) error + CreateInBatches(values []*model.Role, batchSize int) error + Save(values ...*model.Role) error + First() (*model.Role, error) + Take() (*model.Role, error) + Last() (*model.Role, error) + Find() ([]*model.Role, error) + FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.Role, err error) + FindInBatches(result *[]*model.Role, batchSize int, fc func(tx gen.Dao, batch int) error) error + Pluck(column field.Expr, dest interface{}) error + Delete(...*model.Role) (info gen.ResultInfo, err error) + Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + Updates(value interface{}) (info gen.ResultInfo, err error) + UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + UpdateColumns(value interface{}) (info gen.ResultInfo, err error) + UpdateFrom(q gen.SubQuery) gen.Dao + Attrs(attrs ...field.AssignExpr) IRoleDo + Assign(attrs ...field.AssignExpr) IRoleDo + Joins(fields ...field.RelationField) IRoleDo + Preload(fields ...field.RelationField) IRoleDo + FirstOrInit() (*model.Role, error) + FirstOrCreate() (*model.Role, error) + FindByPage(offset int, limit int) (result []*model.Role, count int64, err error) + ScanByPage(result interface{}, offset int, limit int) (count int64, err error) + Rows() (*sql.Rows, error) + Row() *sql.Row + Scan(result interface{}) (err error) + Returning(value interface{}, columns ...string) IRoleDo + UnderlyingDB() *gorm.DB + schema.Tabler + + FilterWithID(id int) (result *model.Role, err error) +} + +// SELECT * FROM @@table WHERE id = @id +func (r roleDo) FilterWithID(id int) (result *model.Role, err error) { + var params []interface{} + + var generateSQL strings.Builder + params = append(params, id) + generateSQL.WriteString("SELECT * FROM roles WHERE id = ? ") + + var executeSQL *gorm.DB + executeSQL = r.UnderlyingDB().Raw(generateSQL.String(), params...).Take(&result) // ignore_security_alert + err = executeSQL.Error + + return +} + +func (r roleDo) Debug() IRoleDo { + return r.withDO(r.DO.Debug()) +} + +func (r roleDo) WithContext(ctx context.Context) IRoleDo { + return r.withDO(r.DO.WithContext(ctx)) +} + +func (r roleDo) ReadDB() IRoleDo { + return r.Clauses(dbresolver.Read) +} + +func (r roleDo) WriteDB() IRoleDo { + return r.Clauses(dbresolver.Write) +} + +func (r roleDo) Session(config *gorm.Session) IRoleDo { + return r.withDO(r.DO.Session(config)) +} + +func (r roleDo) Clauses(conds ...clause.Expression) IRoleDo { + return r.withDO(r.DO.Clauses(conds...)) +} + +func (r roleDo) Returning(value interface{}, columns ...string) IRoleDo { + return r.withDO(r.DO.Returning(value, columns...)) +} + +func (r roleDo) Not(conds ...gen.Condition) IRoleDo { + return r.withDO(r.DO.Not(conds...)) +} + +func (r roleDo) Or(conds ...gen.Condition) IRoleDo { + return r.withDO(r.DO.Or(conds...)) +} + +func (r roleDo) Select(conds ...field.Expr) IRoleDo { + return r.withDO(r.DO.Select(conds...)) +} + +func (r roleDo) Where(conds ...gen.Condition) IRoleDo { + return r.withDO(r.DO.Where(conds...)) +} + +func (r roleDo) Order(conds ...field.Expr) IRoleDo { + return r.withDO(r.DO.Order(conds...)) +} + +func (r roleDo) Distinct(cols ...field.Expr) IRoleDo { + return r.withDO(r.DO.Distinct(cols...)) +} + +func (r roleDo) Omit(cols ...field.Expr) IRoleDo { + return r.withDO(r.DO.Omit(cols...)) +} + +func (r roleDo) Join(table schema.Tabler, on ...field.Expr) IRoleDo { + return r.withDO(r.DO.Join(table, on...)) +} + +func (r roleDo) LeftJoin(table schema.Tabler, on ...field.Expr) IRoleDo { + return r.withDO(r.DO.LeftJoin(table, on...)) +} + +func (r roleDo) RightJoin(table schema.Tabler, on ...field.Expr) IRoleDo { + return r.withDO(r.DO.RightJoin(table, on...)) +} + +func (r roleDo) Group(cols ...field.Expr) IRoleDo { + return r.withDO(r.DO.Group(cols...)) +} + +func (r roleDo) Having(conds ...gen.Condition) IRoleDo { + return r.withDO(r.DO.Having(conds...)) +} + +func (r roleDo) Limit(limit int) IRoleDo { + return r.withDO(r.DO.Limit(limit)) +} + +func (r roleDo) Offset(offset int) IRoleDo { + return r.withDO(r.DO.Offset(offset)) +} + +func (r roleDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IRoleDo { + return r.withDO(r.DO.Scopes(funcs...)) +} + +func (r roleDo) Unscoped() IRoleDo { + return r.withDO(r.DO.Unscoped()) +} + +func (r roleDo) Create(values ...*model.Role) error { + if len(values) == 0 { + return nil + } + return r.DO.Create(values) +} + +func (r roleDo) CreateInBatches(values []*model.Role, batchSize int) error { + return r.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (r roleDo) Save(values ...*model.Role) error { + if len(values) == 0 { + return nil + } + return r.DO.Save(values) +} + +func (r roleDo) First() (*model.Role, error) { + if result, err := r.DO.First(); err != nil { + return nil, err + } else { + return result.(*model.Role), nil + } +} + +func (r roleDo) Take() (*model.Role, error) { + if result, err := r.DO.Take(); err != nil { + return nil, err + } else { + return result.(*model.Role), nil + } +} + +func (r roleDo) Last() (*model.Role, error) { + if result, err := r.DO.Last(); err != nil { + return nil, err + } else { + return result.(*model.Role), nil + } +} + +func (r roleDo) Find() ([]*model.Role, error) { + result, err := r.DO.Find() + return result.([]*model.Role), err +} + +func (r roleDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.Role, err error) { + buf := make([]*model.Role, 0, batchSize) + err = r.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (r roleDo) FindInBatches(result *[]*model.Role, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return r.DO.FindInBatches(result, batchSize, fc) +} + +func (r roleDo) Attrs(attrs ...field.AssignExpr) IRoleDo { + return r.withDO(r.DO.Attrs(attrs...)) +} + +func (r roleDo) Assign(attrs ...field.AssignExpr) IRoleDo { + return r.withDO(r.DO.Assign(attrs...)) +} + +func (r roleDo) Joins(fields ...field.RelationField) IRoleDo { + for _, _f := range fields { + r = *r.withDO(r.DO.Joins(_f)) + } + return &r +} + +func (r roleDo) Preload(fields ...field.RelationField) IRoleDo { + for _, _f := range fields { + r = *r.withDO(r.DO.Preload(_f)) + } + return &r +} + +func (r roleDo) FirstOrInit() (*model.Role, error) { + if result, err := r.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*model.Role), nil + } +} + +func (r roleDo) FirstOrCreate() (*model.Role, error) { + if result, err := r.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*model.Role), nil + } +} + +func (r roleDo) FindByPage(offset int, limit int) (result []*model.Role, count int64, err error) { + result, err = r.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = r.Offset(-1).Limit(-1).Count() + return +} + +func (r roleDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = r.Count() + if err != nil { + return + } + + err = r.Offset(offset).Limit(limit).Scan(result) + return +} + +func (r roleDo) Scan(result interface{}) (err error) { + return r.DO.Scan(result) +} + +func (r roleDo) Delete(models ...*model.Role) (result gen.ResultInfo, err error) { + return r.DO.Delete(models) +} + +func (r *roleDo) withDO(do gen.Dao) *roleDo { + r.DO = *do.(*gen.DO) + return r +} diff --git a/stores/users.gen.go b/stores/users.gen.go new file mode 100644 index 0000000..f01d344 --- /dev/null +++ b/stores/users.gen.go @@ -0,0 +1,575 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package stores + +import ( + "context" + "database/sql" + "strings" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "github.com/yiran15/api-server/model" +) + +func newUser(db *gorm.DB, opts ...gen.DOOption) user { + _user := user{} + + _user.userDo.UseDB(db, opts...) + _user.userDo.UseModel(&model.User{}) + + tableName := _user.userDo.TableName() + _user.ALL = field.NewAsterisk(tableName) + _user.ID = field.NewInt64(tableName, "id") + _user.CreatedAt = field.NewTime(tableName, "created_at") + _user.UpdatedAt = field.NewTime(tableName, "updated_at") + _user.DeletedAt = field.NewField(tableName, "deleted_at") + _user.Name = field.NewString(tableName, "name") + _user.NickName = field.NewString(tableName, "nick_name") + _user.Department = field.NewString(tableName, "department") + _user.Email = field.NewString(tableName, "email") + _user.Password = field.NewString(tableName, "password") + _user.Avatar = field.NewString(tableName, "avatar") + _user.Mobile = field.NewString(tableName, "mobile") + _user.Status = field.NewInt(tableName, "status") + _user.Roles = userManyToManyRoles{ + db: db.Session(&gorm.Session{}), + + RelationField: field.NewRelation("Roles", "model.Role"), + Users: struct { + field.RelationField + Roles struct { + field.RelationField + } + }{ + RelationField: field.NewRelation("Roles.Users", "model.User"), + Roles: struct { + field.RelationField + }{ + RelationField: field.NewRelation("Roles.Users.Roles", "model.Role"), + }, + }, + Apis: struct { + field.RelationField + Roles struct { + field.RelationField + } + }{ + RelationField: field.NewRelation("Roles.Apis", "model.Api"), + Roles: struct { + field.RelationField + }{ + RelationField: field.NewRelation("Roles.Apis.Roles", "model.Role"), + }, + }, + } + + _user.fillFieldMap() + + return _user +} + +type user struct { + userDo + + ALL field.Asterisk + ID field.Int64 + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Field + Name field.String // 用户名称 + NickName field.String // 用户昵称 + Department field.String // 用户部门 + Email field.String // 邮箱 + Password field.String // 用户密码 + Avatar field.String // 用户头像 + Mobile field.String // 用户手机号 + Status field.Int // 用户状态,1可用,2禁用,3未激活 + Roles userManyToManyRoles + + fieldMap map[string]field.Expr +} + +func (u user) Table(newTableName string) *user { + u.userDo.UseTable(newTableName) + return u.updateTableName(newTableName) +} + +func (u user) As(alias string) *user { + u.userDo.DO = *(u.userDo.As(alias).(*gen.DO)) + return u.updateTableName(alias) +} + +func (u *user) updateTableName(table string) *user { + u.ALL = field.NewAsterisk(table) + u.ID = field.NewInt64(table, "id") + u.CreatedAt = field.NewTime(table, "created_at") + u.UpdatedAt = field.NewTime(table, "updated_at") + u.DeletedAt = field.NewField(table, "deleted_at") + u.Name = field.NewString(table, "name") + u.NickName = field.NewString(table, "nick_name") + u.Department = field.NewString(table, "department") + u.Email = field.NewString(table, "email") + u.Password = field.NewString(table, "password") + u.Avatar = field.NewString(table, "avatar") + u.Mobile = field.NewString(table, "mobile") + u.Status = field.NewInt(table, "status") + + u.fillFieldMap() + + return u +} + +func (u *user) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := u.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (u *user) fillFieldMap() { + u.fieldMap = make(map[string]field.Expr, 13) + u.fieldMap["id"] = u.ID + u.fieldMap["created_at"] = u.CreatedAt + u.fieldMap["updated_at"] = u.UpdatedAt + u.fieldMap["deleted_at"] = u.DeletedAt + u.fieldMap["name"] = u.Name + u.fieldMap["nick_name"] = u.NickName + u.fieldMap["department"] = u.Department + u.fieldMap["email"] = u.Email + u.fieldMap["password"] = u.Password + u.fieldMap["avatar"] = u.Avatar + u.fieldMap["mobile"] = u.Mobile + u.fieldMap["status"] = u.Status + +} + +func (u user) clone(db *gorm.DB) user { + u.userDo.ReplaceConnPool(db.Statement.ConnPool) + u.Roles.db = db.Session(&gorm.Session{Initialized: true}) + u.Roles.db.Statement.ConnPool = db.Statement.ConnPool + return u +} + +func (u user) replaceDB(db *gorm.DB) user { + u.userDo.ReplaceDB(db) + u.Roles.db = db.Session(&gorm.Session{}) + return u +} + +type userManyToManyRoles struct { + db *gorm.DB + + field.RelationField + + Users struct { + field.RelationField + Roles struct { + field.RelationField + } + } + Apis struct { + field.RelationField + Roles struct { + field.RelationField + } + } +} + +func (a userManyToManyRoles) Where(conds ...field.Expr) *userManyToManyRoles { + if len(conds) == 0 { + return &a + } + + exprs := make([]clause.Expression, 0, len(conds)) + for _, cond := range conds { + exprs = append(exprs, cond.BeCond().(clause.Expression)) + } + a.db = a.db.Clauses(clause.Where{Exprs: exprs}) + return &a +} + +func (a userManyToManyRoles) WithContext(ctx context.Context) *userManyToManyRoles { + a.db = a.db.WithContext(ctx) + return &a +} + +func (a userManyToManyRoles) Session(session *gorm.Session) *userManyToManyRoles { + a.db = a.db.Session(session) + return &a +} + +func (a userManyToManyRoles) Model(m *model.User) *userManyToManyRolesTx { + return &userManyToManyRolesTx{a.db.Model(m).Association(a.Name())} +} + +func (a userManyToManyRoles) Unscoped() *userManyToManyRoles { + a.db = a.db.Unscoped() + return &a +} + +type userManyToManyRolesTx struct{ tx *gorm.Association } + +func (a userManyToManyRolesTx) Find() (result []*model.Role, err error) { + return result, a.tx.Find(&result) +} + +func (a userManyToManyRolesTx) Append(values ...*model.Role) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Append(targetValues...) +} + +func (a userManyToManyRolesTx) Replace(values ...*model.Role) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Replace(targetValues...) +} + +func (a userManyToManyRolesTx) Delete(values ...*model.Role) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Delete(targetValues...) +} + +func (a userManyToManyRolesTx) Clear() error { + return a.tx.Clear() +} + +func (a userManyToManyRolesTx) Count() int64 { + return a.tx.Count() +} + +func (a userManyToManyRolesTx) Unscoped() *userManyToManyRolesTx { + a.tx = a.tx.Unscoped() + return &a +} + +type userDo struct{ gen.DO } + +type IUserDo interface { + gen.SubQuery + Debug() IUserDo + WithContext(ctx context.Context) IUserDo + WithResult(fc func(tx gen.Dao)) gen.ResultInfo + ReplaceDB(db *gorm.DB) + ReadDB() IUserDo + WriteDB() IUserDo + As(alias string) gen.Dao + Session(config *gorm.Session) IUserDo + Columns(cols ...field.Expr) gen.Columns + Clauses(conds ...clause.Expression) IUserDo + Not(conds ...gen.Condition) IUserDo + Or(conds ...gen.Condition) IUserDo + Select(conds ...field.Expr) IUserDo + Where(conds ...gen.Condition) IUserDo + Order(conds ...field.Expr) IUserDo + Distinct(cols ...field.Expr) IUserDo + Omit(cols ...field.Expr) IUserDo + Join(table schema.Tabler, on ...field.Expr) IUserDo + LeftJoin(table schema.Tabler, on ...field.Expr) IUserDo + RightJoin(table schema.Tabler, on ...field.Expr) IUserDo + Group(cols ...field.Expr) IUserDo + Having(conds ...gen.Condition) IUserDo + Limit(limit int) IUserDo + Offset(offset int) IUserDo + Count() (count int64, err error) + Scopes(funcs ...func(gen.Dao) gen.Dao) IUserDo + Unscoped() IUserDo + Create(values ...*model.User) error + CreateInBatches(values []*model.User, batchSize int) error + Save(values ...*model.User) error + First() (*model.User, error) + Take() (*model.User, error) + Last() (*model.User, error) + Find() ([]*model.User, error) + FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.User, err error) + FindInBatches(result *[]*model.User, batchSize int, fc func(tx gen.Dao, batch int) error) error + Pluck(column field.Expr, dest interface{}) error + Delete(...*model.User) (info gen.ResultInfo, err error) + Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + Updates(value interface{}) (info gen.ResultInfo, err error) + UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + UpdateColumns(value interface{}) (info gen.ResultInfo, err error) + UpdateFrom(q gen.SubQuery) gen.Dao + Attrs(attrs ...field.AssignExpr) IUserDo + Assign(attrs ...field.AssignExpr) IUserDo + Joins(fields ...field.RelationField) IUserDo + Preload(fields ...field.RelationField) IUserDo + FirstOrInit() (*model.User, error) + FirstOrCreate() (*model.User, error) + FindByPage(offset int, limit int) (result []*model.User, count int64, err error) + ScanByPage(result interface{}, offset int, limit int) (count int64, err error) + Rows() (*sql.Rows, error) + Row() *sql.Row + Scan(result interface{}) (err error) + Returning(value interface{}, columns ...string) IUserDo + UnderlyingDB() *gorm.DB + schema.Tabler + + FilterWithID(id int) (result *model.User, err error) +} + +// SELECT * FROM @@table WHERE id = @id +func (u userDo) FilterWithID(id int) (result *model.User, err error) { + var params []interface{} + + var generateSQL strings.Builder + params = append(params, id) + generateSQL.WriteString("SELECT * FROM users WHERE id = ? ") + + var executeSQL *gorm.DB + executeSQL = u.UnderlyingDB().Raw(generateSQL.String(), params...).Take(&result) // ignore_security_alert + err = executeSQL.Error + + return +} + +func (u userDo) Debug() IUserDo { + return u.withDO(u.DO.Debug()) +} + +func (u userDo) WithContext(ctx context.Context) IUserDo { + return u.withDO(u.DO.WithContext(ctx)) +} + +func (u userDo) ReadDB() IUserDo { + return u.Clauses(dbresolver.Read) +} + +func (u userDo) WriteDB() IUserDo { + return u.Clauses(dbresolver.Write) +} + +func (u userDo) Session(config *gorm.Session) IUserDo { + return u.withDO(u.DO.Session(config)) +} + +func (u userDo) Clauses(conds ...clause.Expression) IUserDo { + return u.withDO(u.DO.Clauses(conds...)) +} + +func (u userDo) Returning(value interface{}, columns ...string) IUserDo { + return u.withDO(u.DO.Returning(value, columns...)) +} + +func (u userDo) Not(conds ...gen.Condition) IUserDo { + return u.withDO(u.DO.Not(conds...)) +} + +func (u userDo) Or(conds ...gen.Condition) IUserDo { + return u.withDO(u.DO.Or(conds...)) +} + +func (u userDo) Select(conds ...field.Expr) IUserDo { + return u.withDO(u.DO.Select(conds...)) +} + +func (u userDo) Where(conds ...gen.Condition) IUserDo { + return u.withDO(u.DO.Where(conds...)) +} + +func (u userDo) Order(conds ...field.Expr) IUserDo { + return u.withDO(u.DO.Order(conds...)) +} + +func (u userDo) Distinct(cols ...field.Expr) IUserDo { + return u.withDO(u.DO.Distinct(cols...)) +} + +func (u userDo) Omit(cols ...field.Expr) IUserDo { + return u.withDO(u.DO.Omit(cols...)) +} + +func (u userDo) Join(table schema.Tabler, on ...field.Expr) IUserDo { + return u.withDO(u.DO.Join(table, on...)) +} + +func (u userDo) LeftJoin(table schema.Tabler, on ...field.Expr) IUserDo { + return u.withDO(u.DO.LeftJoin(table, on...)) +} + +func (u userDo) RightJoin(table schema.Tabler, on ...field.Expr) IUserDo { + return u.withDO(u.DO.RightJoin(table, on...)) +} + +func (u userDo) Group(cols ...field.Expr) IUserDo { + return u.withDO(u.DO.Group(cols...)) +} + +func (u userDo) Having(conds ...gen.Condition) IUserDo { + return u.withDO(u.DO.Having(conds...)) +} + +func (u userDo) Limit(limit int) IUserDo { + return u.withDO(u.DO.Limit(limit)) +} + +func (u userDo) Offset(offset int) IUserDo { + return u.withDO(u.DO.Offset(offset)) +} + +func (u userDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IUserDo { + return u.withDO(u.DO.Scopes(funcs...)) +} + +func (u userDo) Unscoped() IUserDo { + return u.withDO(u.DO.Unscoped()) +} + +func (u userDo) Create(values ...*model.User) error { + if len(values) == 0 { + return nil + } + return u.DO.Create(values) +} + +func (u userDo) CreateInBatches(values []*model.User, batchSize int) error { + return u.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (u userDo) Save(values ...*model.User) error { + if len(values) == 0 { + return nil + } + return u.DO.Save(values) +} + +func (u userDo) First() (*model.User, error) { + if result, err := u.DO.First(); err != nil { + return nil, err + } else { + return result.(*model.User), nil + } +} + +func (u userDo) Take() (*model.User, error) { + if result, err := u.DO.Take(); err != nil { + return nil, err + } else { + return result.(*model.User), nil + } +} + +func (u userDo) Last() (*model.User, error) { + if result, err := u.DO.Last(); err != nil { + return nil, err + } else { + return result.(*model.User), nil + } +} + +func (u userDo) Find() ([]*model.User, error) { + result, err := u.DO.Find() + return result.([]*model.User), err +} + +func (u userDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.User, err error) { + buf := make([]*model.User, 0, batchSize) + err = u.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (u userDo) FindInBatches(result *[]*model.User, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return u.DO.FindInBatches(result, batchSize, fc) +} + +func (u userDo) Attrs(attrs ...field.AssignExpr) IUserDo { + return u.withDO(u.DO.Attrs(attrs...)) +} + +func (u userDo) Assign(attrs ...field.AssignExpr) IUserDo { + return u.withDO(u.DO.Assign(attrs...)) +} + +func (u userDo) Joins(fields ...field.RelationField) IUserDo { + for _, _f := range fields { + u = *u.withDO(u.DO.Joins(_f)) + } + return &u +} + +func (u userDo) Preload(fields ...field.RelationField) IUserDo { + for _, _f := range fields { + u = *u.withDO(u.DO.Preload(_f)) + } + return &u +} + +func (u userDo) FirstOrInit() (*model.User, error) { + if result, err := u.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*model.User), nil + } +} + +func (u userDo) FirstOrCreate() (*model.User, error) { + if result, err := u.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*model.User), nil + } +} + +func (u userDo) FindByPage(offset int, limit int) (result []*model.User, count int64, err error) { + result, err = u.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = u.Offset(-1).Limit(-1).Count() + return +} + +func (u userDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = u.Count() + if err != nil { + return + } + + err = u.Offset(offset).Limit(limit).Scan(result) + return +} + +func (u userDo) Scan(result interface{}) (err error) { + return u.DO.Scan(result) +} + +func (u userDo) Delete(models ...*model.User) (result gen.ResultInfo, err error) { + return u.DO.Delete(models) +} + +func (u *userDo) withDO(do gen.Dao) *userDo { + u.DO = *do.(*gen.DO) + return u +}