diff --git a/cmd/gen_exception/exception.tmpl b/cmd/gen_exception/exception.tmpl new file mode 100644 index 0000000..166aa5d --- /dev/null +++ b/cmd/gen_exception/exception.tmpl @@ -0,0 +1,8 @@ +// Code generated by gen-exception; DO NOT EDIT. +package exception + +const ( +{{- range .Items }} + {{ .Name }} = "{{ .Value }}" +{{- end }} +) diff --git a/cmd/gen_exception/main.go b/cmd/gen_exception/main.go new file mode 100644 index 0000000..dd35425 --- /dev/null +++ b/cmd/gen_exception/main.go @@ -0,0 +1,97 @@ +//go:build ignore + +package main + +import ( + "fmt" + "log" + "os" + "path/filepath" + "strings" + "text/template" + + "golang.org/x/text/cases" + "golang.org/x/text/language" + "gopkg.in/yaml.v3" +) + +type ErrorItem struct { + Name string + Value string +} + +type TplData struct { + Items []ErrorItem +} + +func toCamel(s string) string { + caser := cases.Title(language.English) + s = strings.ReplaceAll(s, "-", "_") + parts := strings.Split(s, "_") + for i := range parts { + parts[i] = caser.String(parts[i]) + } + return strings.Join(parts, "") +} + +func recursiveParse(prefix string, raw any, items *[]ErrorItem) { + switch v := raw.(type) { + case map[string]any: + for key, val := range v { + recursiveParse(prefix+toCamel(key), val, items) + } + case string: + *items = append(*items, ErrorItem{ + Name: prefix, + Value: v, + }) + case int, int64: + *items = append(*items, ErrorItem{ + Name: prefix, + Value: fmt.Sprintf("%v", v), + }) + } +} + +func main() { + yamlDir := "internal/exception/definitions" + outputDir := "internal/exception" + tplPath := "cmd/gen_exception/exception.tmpl" + + if _, err := os.Stat(tplPath); os.IsNotExist(err) { + log.Fatalf("Cannot found tmpl %s", tplPath) + } + + funcMap := template.FuncMap{"ToCamel": toCamel} + tmpl := template.Must(template.New("exception.tmpl").Funcs(funcMap).ParseFiles(tplPath)) + + os.MkdirAll(outputDir, 0755) + + files, _ := filepath.Glob(filepath.Join(yamlDir, "*.yaml")) + for _, yamlFile := range files { + content, err := os.ReadFile(yamlFile) + if err != nil { + log.Printf("Read file error: %v", err) + continue + } + + var rawData any + if err := yaml.Unmarshal(content, &rawData); err != nil { + log.Printf("Unmarshal error in %s: %v", yamlFile, err) + continue + } + + var items []ErrorItem + recursiveParse("", rawData, &items) + + baseName := strings.TrimSuffix(filepath.Base(yamlFile), filepath.Ext(yamlFile)) + outputFileName := baseName + "_gen.go" + outputPath := filepath.Join(outputDir, outputFileName) + + f, _ := os.Create(outputPath) + tmpl.Execute(f, TplData{Items: items}) + f.Close() + + fmt.Printf("Generated: %s (%d constants)\n", outputPath, len(items)) + } +} diff --git a/exception/common.go b/exception/common.go deleted file mode 100644 index 2d7795e..0000000 --- a/exception/common.go +++ /dev/null @@ -1,12 +0,0 @@ -package exception - -const ( - CommonErrorInvalidInput = "00001" - CommonErrorUnauthorized = "00002" - CommonErrorInternal = "00003" - CommonErrorPermissionDenied = "00004" - CommonErrorUuidParseFailed = "00005" - CommonErrorDatabase = "00006" - CommonErrorMissingUserId = "00007" - CommonErrorUserNotFound = "00008" -) diff --git a/exception/endpoints.go b/exception/endpoints.go deleted file mode 100644 index 2e98d45..0000000 --- a/exception/endpoints.go +++ /dev/null @@ -1,32 +0,0 @@ -package exception - -// Middleware Service Endpoints -const ( - MiddlewareEndpoint = "01" -) - -// Auth Service Endpoints -const ( - AuthRedirectEndpoint = "01" - AuthMagicEndpoint = "02" - AuthTokenEndpoint = "03" - AuthRefreshEndpoint = "04" - AuthExchangeEndpoint = "05" -) - -// Event Service Endpoints -const ( - EventInfoEndpoint = "01" - EventCheckinEndpoint = "02" - EventCheckinQueryEndpoint = "03" - EventCheckinSubmitEndpoint = "04" -) - -// User Service Endpoints -const ( - UserInfoEndpoint = "01" - UserUpdateEndpoint = "02" - UserListEndpoint = "03" - UserFullEndpoint = "04" - UserCreateEndpoint = "05" -) diff --git a/exception/services.go b/exception/services.go deleted file mode 100644 index 3e2137e..0000000 --- a/exception/services.go +++ /dev/null @@ -1,16 +0,0 @@ -package exception - -// Middleware Services -const ( - MiddlewareGinLoggerService = "901" - MiddlewareJwtService = "902" - MiddlewarePermissionService = "903" - MiddlewareApiVersionService = "904" -) - -// Application Services -const ( - AuthService = "001" - UserService = "002" - EventService = "003" -) diff --git a/exception/specific.go b/exception/specific.go deleted file mode 100644 index 56f997f..0000000 --- a/exception/specific.go +++ /dev/null @@ -1,60 +0,0 @@ -package exception - -const ( - ApiVersionNotFound = "00001" - - // Auth Service - // Endpoint: AuthRedirectEndpoint (01) - AuthRedirectTokenInvalid = "00001" - AuthRedirectClientNotFound = "00002" - AuthRedirectUriMismatch = "00003" - AuthRedirectInvalidUri = "00004" - - // Endpoint: AuthMagicEndpoint (02) - AuthMagicTurnstileFailed = "00001" - AuthMagicCodeGenFailed = "00002" - AuthMagicInvalidExternalUrl = "00003" - AuthMagicInvalidEmailConfig = "00004" - - // Endpoint: AuthTokenEndpoint (03) - AuthTokenInvalidToken = "00001" - AuthTokenGenFailed = "00002" - - // Endpoint: AuthRefreshEndpoint (04) - AuthRefreshInvalidToken = "00001" - AuthRefreshRenewFailed = "00002" - - // Endpoint: AuthExchangeEndpoint (05) - AuthExchangeGetUserIdFailed = "00001" - AuthExchangeCodeGenFailed = "00002" - AuthExchangeInvalidRedirectUri = "00003" - - // Event Service - // Endpoint: EventInfoEndpoint (01) - EventInfoNotFound = "00001" - - // Endpoint: EventCheckinEndpoint (02) - EventCheckinGenCodeFailed = "00001" - - // Endpoint: EventCheckinQueryEndpoint (03) - EventCheckinQueryRecordNotFound = "00001" - - // Endpoint: EventCheckinSubmitEndpoint (04) - // (None) - - // User Service - // Endpoint: UserInfoEndpoint (01) - // (None) - - // Endpoint: UserUpdateEndpoint (02) - // (None) - - // Endpoint: UserListEndpoint (03) - UserListMeilisearchFailed = "00001" - - // Endpoint: UserFullEndpoint (04) - // (None) - - // Endpoint: UserCreateEndpoint (05) - // (None) -) diff --git a/exception/status.go b/exception/status.go deleted file mode 100644 index 79776a0..0000000 --- a/exception/status.go +++ /dev/null @@ -1,8 +0,0 @@ -package exception - -const ( - ErrorStatusSuccess = "2" - ErrorStatusUser = "4" - ErrorStatusServer = "5" - ErrorStatusClient = "6" -) diff --git a/exception/types.go b/exception/types.go deleted file mode 100644 index fa8a80f..0000000 --- a/exception/types.go +++ /dev/null @@ -1,6 +0,0 @@ -package exception - -const ( - ErrorTypeCommon = "0" - ErrorTypeSpecific = "1" -) diff --git a/generate.go b/generate.go new file mode 100644 index 0000000..64e68fb --- /dev/null +++ b/generate.go @@ -0,0 +1,3 @@ +package main + +//go:generate go run ./cmd/gen_exception/main.go diff --git a/go.mod b/go.mod index 7d3d6be..4ecfce0 100644 --- a/go.mod +++ b/go.mod @@ -75,9 +75,10 @@ require ( 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/text v0.33.0 // indirect google.golang.org/protobuf v1.36.11 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect gorm.io/driver/mysql v1.5.6 // indirect ) diff --git a/go.sum b/go.sum index 857c439..a06034b 100644 --- a/go.sum +++ b/go.sum @@ -348,6 +348,8 @@ 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.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= +golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE= +golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/exception/builder.go b/internal/exception/builder.go similarity index 100% rename from exception/builder.go rename to internal/exception/builder.go diff --git a/internal/exception/common_gen.go b/internal/exception/common_gen.go new file mode 100644 index 0000000..f8b84e7 --- /dev/null +++ b/internal/exception/common_gen.go @@ -0,0 +1,13 @@ +// Code generated by gen-exception; DO NOT EDIT. +package exception + +const ( + CommonErrorInvalidInput = "00001" + CommonErrorUnauthorized = "00002" + CommonErrorInternal = "00003" + CommonErrorPermissionDenied = "00004" + CommonErrorUuidParseFailed = "00005" + CommonErrorDatabase = "00006" + CommonErrorMissingUserId = "00007" + CommonErrorUserNotFound = "00008" +) diff --git a/internal/exception/definitions/common.yaml b/internal/exception/definitions/common.yaml new file mode 100644 index 0000000..752a1eb --- /dev/null +++ b/internal/exception/definitions/common.yaml @@ -0,0 +1,10 @@ +common: + error: + invalid_input: "00001" + unauthorized: "00002" + internal: "00003" + permission_denied: "00004" + uuid_parse_failed: "00005" + database: "00006" + missing_user_id: "00007" + user_not_found: "00008" diff --git a/internal/exception/definitions/endpoint.yaml b/internal/exception/definitions/endpoint.yaml new file mode 100644 index 0000000..86be040 --- /dev/null +++ b/internal/exception/definitions/endpoint.yaml @@ -0,0 +1,23 @@ +endpoint: + auth: + service: + redirect: "01" + magic: "02" + token: "03" + refresh: "04" + exchange: "05" + event: + service: + info: "01" + checkin: "02" + checkin_query: "03" + checkin_submit: "04" + user: + service: + info: "01" + update: "02" + list: "03" + full: "04" + create: "05" + middleware: + service: "01" diff --git a/internal/exception/definitions/middleware.yaml b/internal/exception/definitions/middleware.yaml new file mode 100644 index 0000000..9c7f5e0 --- /dev/null +++ b/internal/exception/definitions/middleware.yaml @@ -0,0 +1,5 @@ +middleware: + gin_logger: "901" + jwt: "902" + permission: "903" + api_version: "904" diff --git a/internal/exception/definitions/service.yaml b/internal/exception/definitions/service.yaml new file mode 100644 index 0000000..eb6ee05 --- /dev/null +++ b/internal/exception/definitions/service.yaml @@ -0,0 +1,4 @@ +service: + auth: "001" + user: "002" + event: "003" diff --git a/internal/exception/definitions/specific.yaml b/internal/exception/definitions/specific.yaml new file mode 100644 index 0000000..4360a9c --- /dev/null +++ b/internal/exception/definitions/specific.yaml @@ -0,0 +1,27 @@ +api: + version: + not_found: "00001" +auth: + redirect: + token_invalid: "00001" + client_not_found: "00002" + uri_mismatch: "00003" + invalid_uri: "00004" + magic: + turnstile_failed: "00001" + code_gen_failed: "00002" + invalid_external_url: "00003" + invalid_email_config: "00004" + token: + invalid_token: "00001" + gen_failed: "00002" + refresh: + invalid_token: "00001" + renew_failed: "00002" + exchange: + get_user_id_failed: "00001" + code_gen_failed: "00002" + invalid_redirect_uri: "00003" +user: + list: + meilisearch_failed: "00001" diff --git a/internal/exception/definitions/status.yaml b/internal/exception/definitions/status.yaml new file mode 100644 index 0000000..5bb5ef3 --- /dev/null +++ b/internal/exception/definitions/status.yaml @@ -0,0 +1,5 @@ +status: + success: "2" + user: "4" + server: "5" + client: "6" diff --git a/internal/exception/definitions/types.yaml b/internal/exception/definitions/types.yaml new file mode 100644 index 0000000..0725b74 --- /dev/null +++ b/internal/exception/definitions/types.yaml @@ -0,0 +1,3 @@ +type: + common: "1" + specific: "0" diff --git a/internal/exception/endpoint_gen.go b/internal/exception/endpoint_gen.go new file mode 100644 index 0000000..84d5014 --- /dev/null +++ b/internal/exception/endpoint_gen.go @@ -0,0 +1,20 @@ +// Code generated by gen-exception; DO NOT EDIT. +package exception + +const ( + EndpointAuthServiceExchange = "05" + EndpointAuthServiceRedirect = "01" + EndpointAuthServiceMagic = "02" + EndpointAuthServiceToken = "03" + EndpointAuthServiceRefresh = "04" + EndpointEventServiceCheckinQuery = "03" + EndpointEventServiceCheckinSubmit = "04" + EndpointEventServiceInfo = "01" + EndpointEventServiceCheckin = "02" + EndpointUserServiceList = "03" + EndpointUserServiceFull = "04" + EndpointUserServiceCreate = "05" + EndpointUserServiceInfo = "01" + EndpointUserServiceUpdate = "02" + EndpointMiddlewareService = "01" +) diff --git a/internal/exception/middleware_gen.go b/internal/exception/middleware_gen.go new file mode 100644 index 0000000..d078860 --- /dev/null +++ b/internal/exception/middleware_gen.go @@ -0,0 +1,9 @@ +// Code generated by gen-exception; DO NOT EDIT. +package exception + +const ( + MiddlewareGinLogger = "901" + MiddlewareJwt = "902" + MiddlewarePermission = "903" + MiddlewareApiVersion = "904" +) diff --git a/internal/exception/service_gen.go b/internal/exception/service_gen.go new file mode 100644 index 0000000..1505ce7 --- /dev/null +++ b/internal/exception/service_gen.go @@ -0,0 +1,8 @@ +// Code generated by gen-exception; DO NOT EDIT. +package exception + +const ( + ServiceUser = "002" + ServiceEvent = "003" + ServiceAuth = "001" +) diff --git a/internal/exception/specific_gen.go b/internal/exception/specific_gen.go new file mode 100644 index 0000000..eafa16a --- /dev/null +++ b/internal/exception/specific_gen.go @@ -0,0 +1,22 @@ +// Code generated by gen-exception; DO NOT EDIT. +package exception + +const ( + ApiVersionNotFound = "00001" + AuthRefreshInvalidToken = "00001" + AuthRefreshRenewFailed = "00002" + AuthExchangeGetUserIdFailed = "00001" + AuthExchangeCodeGenFailed = "00002" + AuthExchangeInvalidRedirectUri = "00003" + AuthRedirectClientNotFound = "00002" + AuthRedirectUriMismatch = "00003" + AuthRedirectInvalidUri = "00004" + AuthRedirectTokenInvalid = "00001" + AuthMagicCodeGenFailed = "00002" + AuthMagicInvalidExternalUrl = "00003" + AuthMagicInvalidEmailConfig = "00004" + AuthMagicTurnstileFailed = "00001" + AuthTokenInvalidToken = "00001" + AuthTokenGenFailed = "00002" + UserListMeilisearchFailed = "00001" +) diff --git a/internal/exception/status_gen.go b/internal/exception/status_gen.go new file mode 100644 index 0000000..b6ba5e9 --- /dev/null +++ b/internal/exception/status_gen.go @@ -0,0 +1,9 @@ +// Code generated by gen-exception; DO NOT EDIT. +package exception + +const ( + StatusClient = "6" + StatusSuccess = "2" + StatusUser = "4" + StatusServer = "5" +) diff --git a/internal/exception/types_gen.go b/internal/exception/types_gen.go new file mode 100644 index 0000000..c2944e1 --- /dev/null +++ b/internal/exception/types_gen.go @@ -0,0 +1,7 @@ +// Code generated by gen-exception; DO NOT EDIT. +package exception + +const ( + TypeCommon = "1" + TypeSpecific = "0" +) diff --git a/middleware/api_version.go b/middleware/api_version.go index f9b7421..91b11b3 100644 --- a/middleware/api_version.go +++ b/middleware/api_version.go @@ -1,7 +1,7 @@ package middleware import ( - "nixcn-cms/exception" + "nixcn-cms/internal/exception" "nixcn-cms/utils" "github.com/gin-gonic/gin" diff --git a/middleware/jwt.go b/middleware/jwt.go index 8d1d3b3..8b1eef3 100644 --- a/middleware/jwt.go +++ b/middleware/jwt.go @@ -1,7 +1,7 @@ package middleware import ( - "nixcn-cms/exception" + "nixcn-cms/internal/exception" "nixcn-cms/pkgs/authtoken" "nixcn-cms/utils" diff --git a/middleware/permission.go b/middleware/permission.go index 987b3bc..fde6d79 100644 --- a/middleware/permission.go +++ b/middleware/permission.go @@ -2,7 +2,7 @@ package middleware import ( "nixcn-cms/data" - "nixcn-cms/exception" + "nixcn-cms/internal/exception" "nixcn-cms/utils" "github.com/gin-gonic/gin" diff --git a/service/auth/exchange.go b/service/auth/exchange.go index c1227a4..8880cba 100644 --- a/service/auth/exchange.go +++ b/service/auth/exchange.go @@ -4,7 +4,7 @@ import ( "fmt" "net/url" "nixcn-cms/data" - "nixcn-cms/exception" + "nixcn-cms/internal/exception" "nixcn-cms/pkgs/authcode" "nixcn-cms/utils" diff --git a/service/auth/magic.go b/service/auth/magic.go index 40b86fc..841fb3c 100644 --- a/service/auth/magic.go +++ b/service/auth/magic.go @@ -2,7 +2,7 @@ package auth import ( "net/url" - "nixcn-cms/exception" + "nixcn-cms/internal/exception" "nixcn-cms/pkgs/authcode" "nixcn-cms/pkgs/email" "nixcn-cms/pkgs/turnstile" diff --git a/service/auth/redirect.go b/service/auth/redirect.go index cb4e5a1..818bd7d 100644 --- a/service/auth/redirect.go +++ b/service/auth/redirect.go @@ -3,7 +3,7 @@ package auth import ( "net/url" "nixcn-cms/data" - "nixcn-cms/exception" + "nixcn-cms/internal/exception" "nixcn-cms/pkgs/authcode" "nixcn-cms/utils" diff --git a/service/auth/refresh.go b/service/auth/refresh.go index 8ecd4b0..6788eef 100644 --- a/service/auth/refresh.go +++ b/service/auth/refresh.go @@ -1,7 +1,7 @@ package auth import ( - "nixcn-cms/exception" + "nixcn-cms/internal/exception" "nixcn-cms/pkgs/authtoken" "nixcn-cms/utils" diff --git a/service/auth/token.go b/service/auth/token.go index 2e00588..217cc8f 100644 --- a/service/auth/token.go +++ b/service/auth/token.go @@ -2,7 +2,7 @@ package auth import ( "nixcn-cms/data" - "nixcn-cms/exception" + "nixcn-cms/internal/exception" "nixcn-cms/pkgs/authcode" "nixcn-cms/pkgs/authtoken" "nixcn-cms/utils" diff --git a/service/event/checkin.go b/service/event/checkin.go index ae72da4..0f5708e 100644 --- a/service/event/checkin.go +++ b/service/event/checkin.go @@ -2,7 +2,7 @@ package event import ( "nixcn-cms/data" - "nixcn-cms/exception" + "nixcn-cms/internal/exception" "nixcn-cms/utils" "time" diff --git a/service/event/info.go b/service/event/info.go index 6109944..e0913cd 100644 --- a/service/event/info.go +++ b/service/event/info.go @@ -2,7 +2,7 @@ package event import ( "nixcn-cms/data" - "nixcn-cms/exception" + "nixcn-cms/internal/exception" "nixcn-cms/utils" "time" diff --git a/service/user/full.go b/service/user/full.go index cfadcb9..5f2f69b 100644 --- a/service/user/full.go +++ b/service/user/full.go @@ -2,7 +2,7 @@ package user import ( "nixcn-cms/data" - "nixcn-cms/exception" + "nixcn-cms/internal/exception" "nixcn-cms/utils" "github.com/gin-gonic/gin" diff --git a/service/user/info.go b/service/user/info.go index c59de04..c5c716c 100644 --- a/service/user/info.go +++ b/service/user/info.go @@ -2,7 +2,7 @@ package user import ( "nixcn-cms/data" - "nixcn-cms/exception" + "nixcn-cms/internal/exception" "nixcn-cms/utils" "github.com/gin-gonic/gin" diff --git a/service/user/list.go b/service/user/list.go index 1d2adcb..e72934e 100644 --- a/service/user/list.go +++ b/service/user/list.go @@ -2,7 +2,7 @@ package user import ( "nixcn-cms/data" - "nixcn-cms/exception" + "nixcn-cms/internal/exception" "nixcn-cms/utils" "strconv" diff --git a/service/user/update.go b/service/user/update.go index 791bb30..84256ec 100644 --- a/service/user/update.go +++ b/service/user/update.go @@ -3,8 +3,8 @@ package user import ( "net/url" "nixcn-cms/data" - "nixcn-cms/exception" "nixcn-cms/internal/cryptography" + "nixcn-cms/internal/exception" "nixcn-cms/utils" "unicode/utf8"