feat(cmd): register all 5 domain plugins in newWaveletApp and fix all lint issues

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