From 56ef70d81fa3549d4f802cf5adf8e33158c238bb Mon Sep 17 00:00:00 2001 From: ryan Date: Fri, 28 Aug 2026 07:16:30 +0800 Subject: [PATCH] feat(cmd): register all 5 domain plugins in newWaveletApp and fix all lint issues --- internal/cmd/app.go | 16 ++++++++++++++- internal/cmd/app_test.go | 20 +++++++++++++++++-- plugins/domain/admin/errs.go | 12 ++++++------ plugins/domain/auth/errs.go | 38 ++++++++++++++++++------------------ 4 files changed, 58 insertions(+), 28 deletions(-) diff --git a/internal/cmd/app.go b/internal/cmd/app.go index 11da2fb2..32c2f9d1 100644 --- a/internal/cmd/app.go +++ b/internal/cmd/app.go @@ -22,6 +22,11 @@ import ( "github.com/Rain-kl/Wavelet/internal/platform/bootstrap" "github.com/Rain-kl/Wavelet/internal/router" "github.com/Rain-kl/Wavelet/pkg/util" + "github.com/Rain-kl/Wavelet/plugins/domain/admin" + "github.com/Rain-kl/Wavelet/plugins/domain/auth" + "github.com/Rain-kl/Wavelet/plugins/domain/message_gateway" + "github.com/Rain-kl/Wavelet/plugins/domain/risk_control" + "github.com/Rain-kl/Wavelet/plugins/domain/user" "github.com/Rain-kl/Wavelet/plugins/infra/cache" "github.com/Rain-kl/Wavelet/plugins/infra/database" "github.com/Rain-kl/Wavelet/plugins/infra/logger" @@ -29,7 +34,7 @@ import ( "github.com/hibiken/asynq" ) -// newWaveletApp creates a core.App wired with Wavelet platform infrastructure and profile drivers. +// newWaveletApp creates a core.App wired with Wavelet platform infrastructure, domain plugins, and profile drivers. // //nolint:contextcheck func newWaveletApp(profile core.Profile) *core.App { @@ -46,6 +51,15 @@ func newWaveletApp(profile core.Profile) *core.App { storage.New(), ) + // Register domain plugins + app.Use( + auth.New(), + user.New(), + message_gateway.New(), + risk_control.New(), + admin.New(), + ) + // Bind Goose migration runner app.SetMigrationRunner(func(_ context.Context, _ []extpoints.MigrationEntry) error { runMigrations() diff --git a/internal/cmd/app_test.go b/internal/cmd/app_test.go index bc4621f7..3c3b95d1 100644 --- a/internal/cmd/app_test.go +++ b/internal/cmd/app_test.go @@ -26,9 +26,9 @@ func TestNewWaveletAppProfiles(t *testing.T) { require.NotNil(t, app) assert.Equal(t, prof, app.Profile()) - // Verify 4 infra plugins + 3 driver plugins registered + // Verify 4 infra plugins + 5 domain plugins + 3 driver plugins registered plugins := app.Plugins() - assert.Len(t, plugins, 7) + assert.Len(t, plugins, 12) // Verify each standard infra plugin is registered _, ok := app.Plugin("database") @@ -43,6 +43,22 @@ func TestNewWaveletAppProfiles(t *testing.T) { _, ok = app.Plugin("storage") assert.True(t, ok, "storage plugin missing") + // Verify domain plugins + _, ok = app.Plugin("auth") + assert.True(t, ok, "auth plugin missing") + + _, ok = app.Plugin("user") + assert.True(t, ok, "user plugin missing") + + _, ok = app.Plugin("message_gateway") + assert.True(t, ok, "message_gateway plugin missing") + + _, ok = app.Plugin("risk_control") + assert.True(t, ok, "risk_control plugin missing") + + _, ok = app.Plugin("admin") + assert.True(t, ok, "admin plugin missing") + // Verify driver plugins _, ok = app.Plugin("driver_wavelet_http") assert.True(t, ok, "http driver missing") diff --git a/plugins/domain/admin/errs.go b/plugins/domain/admin/errs.go index 78e07657..6b288a1c 100644 --- a/plugins/domain/admin/errs.go +++ b/plugins/domain/admin/errs.go @@ -65,12 +65,12 @@ const ( // 用户管理(管理员视角)错误消息常量 const ( - userNotFound = "用户不存在" - cannotDisable = "不能禁用管理员账号" - cannotDelete = "不能删除管理员账号" - cannotDeleteSelf = "不能删除当前登录账号" - usernameRequired = "用户名不能为空" - emailRequired = "邮箱不能为空" + userNotFound = "用户不存在" + cannotDisable = "不能禁用管理员账号" + cannotDelete = "不能删除管理员账号" + cannotDeleteSelf = "不能删除当前登录账号" + usernameRequired = "用户名不能为空" + emailRequired = "邮箱不能为空" //nolint:gosec // error message, not hardcoded credentials passwordTooShort = "密码长度不能少于 8 位" usernameExists = "用户名已存在" diff --git a/plugins/domain/auth/errs.go b/plugins/domain/auth/errs.go index 37fca722..efcf33ba 100644 --- a/plugins/domain/auth/errs.go +++ b/plugins/domain/auth/errs.go @@ -6,24 +6,24 @@ package auth // OAuth and Auth error messages const ( - errInvalidState = "非法登录请求" - errIDTokenVerifyFailed = "ID Token 验证失败" //nolint:gosec // false positive: this is an error message, not hardcoded credentials - errIDTokenVerifyFailedFormat = "%s: %w" - errNonceMismatch = "nonce 不匹配,可能存在重放攻击" - errNoActiveAuthSource = "未配置可用认证源" - errServerAddressMissing = "服务器地址 (server_address) 未配置或配置为空,请在后台系统设置中配置后再试" - errAuthSourceRequired = "认证源不能为空" - errDiscoveryURLRequired = "OIDC 认证源必须配置 Discovery URL" - errUsernameGenerateFailed = "无法生成可用用户名" - errUsernameFromSourceFailed = "无法从认证源获取用户名" - errAuthSourceDisabled = "认证源未启用" - errInvalidExternalAccountBindingID = "绑定记录 ID 无效" - ErrTokenAuthNotAllowed = "该端点不允许使用访问令牌进行身份验证" //nolint:gosec // false positive: this is an error message, not hardcoded credentials - errOAuthStateRateLimited = "请求授权过于频繁,请稍后重试" - errAuthSourceNameRequired = "认证源名称不能为空" - errAuthSourceNameInvalid = "认证源名称格式不正确" - errAuthSourceTypeUnsupported = "不支持的认证源类型" - errAuthSourceDiscoveryURLRequired = "Discovery URL 不能为空" + errInvalidState = "非法登录请求" + errIDTokenVerifyFailed = "ID Token 验证失败" //nolint:gosec // false positive: this is an error message, not hardcoded credentials + errIDTokenVerifyFailedFormat = "%s: %w" + errNonceMismatch = "nonce 不匹配,可能存在重放攻击" + errNoActiveAuthSource = "未配置可用认证源" + errServerAddressMissing = "服务器地址 (server_address) 未配置或配置为空,请在后台系统设置中配置后再试" + errAuthSourceRequired = "认证源不能为空" + errDiscoveryURLRequired = "OIDC 认证源必须配置 Discovery URL" + errUsernameGenerateFailed = "无法生成可用用户名" + errUsernameFromSourceFailed = "无法从认证源获取用户名" + errAuthSourceDisabled = "认证源未启用" + errInvalidExternalAccountBindingID = "绑定记录 ID 无效" + ErrTokenAuthNotAllowed = "该端点不允许使用访问令牌进行身份验证" //nolint:gosec // false positive: this is an error message, not hardcoded credentials + errOAuthStateRateLimited = "请求授权过于频繁,请稍后重试" + errAuthSourceNameRequired = "认证源名称不能为空" + errAuthSourceNameInvalid = "认证源名称格式不正确" + errAuthSourceTypeUnsupported = "不支持的认证源类型" + errAuthSourceDiscoveryURLRequired = "Discovery URL 不能为空" //nolint:gosec // error message, not hardcoded credentials errAuthSourceClientCredentialsRequired = "启用认证源时必须配置 Client ID 和 Client Secret" errAuthSourceIDRequired = "认证源 ID 不能为空" @@ -33,5 +33,5 @@ const ( errExternalAccountBindingIDRequired = "外部帐号绑定记录 ID 不能为空" errAdminRequired = "无权访问" //nolint:gosec // error message, not hardcoded credentials - errTokenAdminRequired = "令牌无管理员权限" + errTokenAdminRequired = "令牌无管理员权限" )