fix(persistence): migrate all pkg/persistence imports to plugins/infra/database and plugins/infra/cache

- Replace db.DB(ctx) with database.DB(ctx) from plugins/infra/database
- Replace db.Redis/db.PrefixedKey/db.GetJSON/db.SetJSON with cachepkg.* from plugins/infra/cache
- Replace pkg/persistence/idgen with pkg/idgen (already exists)
- Replace pkg/persistence/batchwriter with pkg/batchwriter (already exists)
- Replace pkg/persistence/migrator with pkg/migrator (already exists)
- Replace pkg/persistence/logstore with plugins/domain/risk_control/logstore
- Delete defunct pkg/{persistence,cap,message_gateway,push,shared,task}
- Fix vet issues: db alias in domain_test.go, driver_asynq_worker.TaskHandler reference
- Update Makefile architecture guard
- Update docs and skill references
- Update go.mod: gorilla/sessions promotion to direct dependency
This commit is contained in:
ryan
2026-08-28 10:59:24 +08:00
parent fb6a3edb89
commit 416603b616
223 changed files with 1304 additions and 10057 deletions
+8 -8
View File
@@ -11,7 +11,7 @@ import (
"strconv"
"time"
persistence "github.com/Rain-kl/Wavelet/pkg/persistence"
database "github.com/Rain-kl/Wavelet/plugins/infra/database"
"github.com/Rain-kl/Wavelet/pkg/response"
"github.com/Rain-kl/Wavelet/plugins/domain/auth"
@@ -96,7 +96,7 @@ func Register(c *gin.Context) {
return
}
gormDB := persistence.DB(c.Request.Context())
gormDB := database.DB(c.Request.Context())
if err := gormDB.Create(newUser).Error; err != nil {
response.AbortBadRequest(c, "创建用户失败: "+err.Error())
return
@@ -143,7 +143,7 @@ func ChangePassword(c *gin.Context) {
return
}
gormDB := persistence.DB(c.Request.Context())
gormDB := database.DB(c.Request.Context())
_ = gormDB.Save(&user)
auth.InvalidateCachedUser(c.Request.Context(), user.ID)
@@ -173,7 +173,7 @@ func UpdateProfile(c *gin.Context) {
user.Website = req.Website
user.Location = req.Location
gormDB := persistence.DB(c.Request.Context())
gormDB := database.DB(c.Request.Context())
_ = gormDB.Save(&user)
auth.InvalidateCachedUser(c.Request.Context(), user.ID)
@@ -184,7 +184,7 @@ func UpdateProfile(c *gin.Context) {
func ListAccessTokens(c *gin.Context) {
userID := auth.GetUserIDFromContext(c)
var tokens []AccessToken
gormDB := persistence.DB(c.Request.Context())
gormDB := database.DB(c.Request.Context())
_ = gormDB.Where("user_id = ?", userID).Find(&tokens).Error
c.JSON(http.StatusOK, response.OK(tokens))
}
@@ -222,7 +222,7 @@ func CreateAccessToken(c *gin.Context) {
IsAdmin: req.IsAdmin,
}
gormDB := persistence.DB(c.Request.Context())
gormDB := database.DB(c.Request.Context())
if err := gormDB.Create(&token).Error; err != nil {
response.AbortInternal(c, "创建令牌失败")
return
@@ -245,7 +245,7 @@ func DeleteAccessToken(c *gin.Context) {
userID := auth.GetUserIDFromContext(c)
var token AccessToken
gormDB := persistence.DB(c.Request.Context())
gormDB := database.DB(c.Request.Context())
if err := gormDB.Where("id = ? AND user_id = ?", id, userID).First(&token).Error; err != nil {
response.AbortNotFound(c, errTokenNotFound)
return
@@ -267,7 +267,7 @@ func RotateAccessToken(c *gin.Context) {
userID := auth.GetUserIDFromContext(c)
var token AccessToken
gormDB := persistence.DB(c.Request.Context())
gormDB := database.DB(c.Request.Context())
if err := gormDB.Where("id = ? AND user_id = ?", id, userID).First(&token).Error; err != nil {
response.AbortNotFound(c, errTokenNotFound)
return
+2 -2
View File
@@ -15,7 +15,7 @@ import (
"github.com/Rain-kl/Wavelet/core"
"github.com/Rain-kl/Wavelet/core/contracts"
db "github.com/Rain-kl/Wavelet/pkg/persistence"
database "github.com/Rain-kl/Wavelet/plugins/infra/database"
"github.com/Rain-kl/Wavelet/plugins/domain/user"
)
@@ -30,7 +30,7 @@ func setupTestDB(t *testing.T) *gorm.DB {
&user.AccessToken{},
))
db.SetDB(testDB)
database.SetDB(testDB)
return testDB
}
+14 -14
View File
@@ -9,7 +9,7 @@ import (
"strings"
db "github.com/Rain-kl/Wavelet/pkg/persistence"
database "github.com/Rain-kl/Wavelet/plugins/infra/database"
"github.com/Rain-kl/Wavelet/pkg/util"
"gorm.io/gorm"
)
@@ -17,7 +17,7 @@ import (
// GetUserByID 通过 ID 获取用户
func GetUserByID(ctx context.Context, id uint64) (*User, error) {
var u User
if err := db.DB(ctx).First(&u, id).Error; err != nil {
if err := database.DB(ctx).First(&u, id).Error; err != nil {
return nil, err
}
return &u, nil
@@ -26,7 +26,7 @@ func GetUserByID(ctx context.Context, id uint64) (*User, error) {
// GetUserByUsername 通过用户名获取用户
func GetUserByUsername(ctx context.Context, username string) (*User, error) {
var u User
if err := db.DB(ctx).Where("username = ?", username).First(&u).Error; err != nil {
if err := database.DB(ctx).Where("username = ?", username).First(&u).Error; err != nil {
return nil, err
}
return &u, nil
@@ -35,7 +35,7 @@ func GetUserByUsername(ctx context.Context, username string) (*User, error) {
// GetUserByEmail 通过邮箱获取用户
func GetUserByEmail(ctx context.Context, email string) (*User, error) {
var u User
if err := db.DB(ctx).Where("email = ?", email).First(&u).Error; err != nil {
if err := database.DB(ctx).Where("email = ?", email).First(&u).Error; err != nil {
return nil, err
}
return &u, nil
@@ -43,17 +43,17 @@ func GetUserByEmail(ctx context.Context, email string) (*User, error) {
// CreateUser 创建用户
func CreateUser(ctx context.Context, u *User) error {
return db.DB(ctx).Create(u).Error
return database.DB(ctx).Create(u).Error
}
// UpdateUser 更新用户
func UpdateUser(ctx context.Context, u *User) error {
return db.DB(ctx).Save(u).Error
return database.DB(ctx).Save(u).Error
}
// ListUsers 分页查询用户
func ListUsers(ctx context.Context, page, pageSize int, keyword string) ([]*User, int64, error) {
db := db.DB(ctx).Model(&User{})
db := database.DB(ctx).Model(&User{})
if keyword != "" {
escaped := util.EscapeLike(keyword)
db = db.Where("username LIKE ? ESCAPE '\\' OR nickname LIKE ? ESCAPE '\\' OR email LIKE ? ESCAPE '\\'", "%"+escaped+"%", "%"+escaped+"%", "%"+escaped+"%")
@@ -75,7 +75,7 @@ func ListUsers(ctx context.Context, page, pageSize int, keyword string) ([]*User
// GetAccessTokenByHash 通过 Hash 查询访问令牌
func GetAccessTokenByHash(ctx context.Context, tokenHash string) (*AccessToken, error) {
var token AccessToken
if err := db.DB(ctx).Where("token_hash = ?", tokenHash).First(&token).Error; err != nil {
if err := database.DB(ctx).Where("token_hash = ?", tokenHash).First(&token).Error; err != nil {
return nil, err
}
return &token, nil
@@ -91,7 +91,7 @@ type AdminUserListFilter struct {
// ListAdminUsers 获取后台管理用户列表
func ListAdminUsers(ctx context.Context, filter AdminUserListFilter) (int64, []User, error) {
query := db.DB(ctx).Model(&User{})
query := database.DB(ctx).Model(&User{})
if filter.Username != "" {
escaped := util.EscapeLike(strings.ToLower(filter.Username))
query = query.Where("LOWER(username) LIKE ? ESCAPE '\\'", "%"+escaped+"%")
@@ -117,13 +117,13 @@ func ListAdminUsers(ctx context.Context, filter AdminUserListFilter) (int64, []U
// UpdateUserActive 更新用户激活状态
func UpdateUserActive(ctx context.Context, id uint64, active bool) error {
return db.DB(ctx).Model(&User{}).Where("id = ?", id).Update("is_active", active).Error
return database.DB(ctx).Model(&User{}).Where("id = ?", id).Update("is_active", active).Error
}
// GetActiveUserByID 获取处于激活状态的用户
func GetActiveUserByID(ctx context.Context, id uint64) (*User, error) {
var u User
if err := db.DB(ctx).Where("id = ? AND is_active = ?", id, true).First(&u).Error; err != nil {
if err := database.DB(ctx).Where("id = ? AND is_active = ?", id, true).First(&u).Error; err != nil {
return nil, err
}
return &u, nil
@@ -131,7 +131,7 @@ func GetActiveUserByID(ctx context.Context, id uint64) (*User, error) {
// DeleteUserWithRelations 删除用户及其级联关系
func DeleteUserWithRelations(ctx context.Context, id uint64) error {
return db.DB(ctx).Transaction(func(tx *gorm.DB) error {
return database.DB(ctx).Transaction(func(tx *gorm.DB) error {
if err := tx.Where("user_id = ?", id).Delete(&AccessToken{}).Error; err != nil {
return err
}
@@ -142,7 +142,7 @@ func DeleteUserWithRelations(ctx context.Context, id uint64) error {
// GetFirstAdminUser 获取第一个管理员用户
func GetFirstAdminUser(ctx context.Context) (*User, error) {
var u User
if err := db.DB(ctx).Where("is_admin = ?", true).Order("id ASC").First(&u).Error; err != nil {
if err := database.DB(ctx).Where("is_admin = ?", true).Order("id ASC").First(&u).Error; err != nil {
return nil, err
}
return &u, nil
@@ -152,7 +152,7 @@ func GetFirstAdminUser(ctx context.Context) (*User, error) {
func ListUsernamesMatchingBase(ctx context.Context, base string) ([]string, error) {
var usernames []string
escaped := util.EscapeLike(strings.ToLower(base))
if err := db.DB(ctx).Model(&User{}).
if err := database.DB(ctx).Model(&User{}).
Where("LOWER(username) LIKE ? ESCAPE '\\'", escaped+"%").
Pluck("username", &usernames).Error; err != nil {
return nil, err
+11 -11
View File
@@ -12,8 +12,8 @@ import (
"time"
"github.com/Rain-kl/Wavelet/core/contracts"
db "github.com/Rain-kl/Wavelet/pkg/persistence"
"github.com/Rain-kl/Wavelet/pkg/persistence/idgen"
database "github.com/Rain-kl/Wavelet/plugins/infra/database"
"github.com/Rain-kl/Wavelet/pkg/idgen"
pkgu "github.com/Rain-kl/Wavelet/pkg/util"
)
@@ -65,7 +65,7 @@ func (s *userServiceImpl) GetUserByUsername(ctx context.Context, username string
func (s *userServiceImpl) GetUserByEmail(ctx context.Context, email string) (*contracts.UserDTO, error) {
var u User
if err := db.DB(ctx).Where("email = ?", email).First(&u).Error; err != nil {
if err := database.DB(ctx).Where("email = ?", email).First(&u).Error; err != nil {
return nil, err
}
return toUserDTO(&u), nil
@@ -133,7 +133,7 @@ func (s *userServiceImpl) UpdateProfile(ctx context.Context, id uint64, req cont
}
updates["updated_at"] = time.Now()
if err := db.DB(ctx).Model(&User{}).Where("id = ?", id).Updates(updates).Error; err != nil {
if err := database.DB(ctx).Model(&User{}).Where("id = ?", id).Updates(updates).Error; err != nil {
return nil, err
}
@@ -142,7 +142,7 @@ func (s *userServiceImpl) UpdateProfile(ctx context.Context, id uint64, req cont
func (s *userServiceImpl) UpdatePassword(ctx context.Context, id uint64, oldPassword, newPassword string) error {
var user User
if err := db.DB(ctx).Where("id = ?", id).First(&user).Error; err != nil {
if err := database.DB(ctx).Where("id = ?", id).First(&user).Error; err != nil {
return err
}
@@ -154,7 +154,7 @@ func (s *userServiceImpl) UpdatePassword(ctx context.Context, id uint64, oldPass
return err
}
return db.DB(ctx).Model(&User{}).Where("id = ?", id).
return database.DB(ctx).Model(&User{}).Where("id = ?", id).
Updates(map[string]any{
"password": user.Password,
"updated_at": time.Now(),
@@ -163,7 +163,7 @@ func (s *userServiceImpl) UpdatePassword(ctx context.Context, id uint64, oldPass
func (s *userServiceImpl) VerifyPassword(ctx context.Context, id uint64, password string) bool {
var user User
if err := db.DB(ctx).Where("id = ?", id).First(&user).Error; err != nil {
if err := database.DB(ctx).Where("id = ?", id).First(&user).Error; err != nil {
pkgu.DummyCheckPassword(password)
return false
}
@@ -171,7 +171,7 @@ func (s *userServiceImpl) VerifyPassword(ctx context.Context, id uint64, passwor
}
func (s *userServiceImpl) UpdateLastLogin(ctx context.Context, id uint64, _ string) error {
return db.DB(ctx).Model(&User{}).Where("id = ?", id).
return database.DB(ctx).Model(&User{}).Where("id = ?", id).
Updates(map[string]any{
"last_login_at": time.Now(),
"updated_at": time.Now(),
@@ -210,7 +210,7 @@ func (s *userServiceImpl) SetUserActive(ctx context.Context, id uint64, active b
}
func (s *userServiceImpl) SetUserAdmin(ctx context.Context, id uint64, admin bool) error {
return db.DB(ctx).Model(&User{}).Where("id = ?", id).Update("is_admin", admin).Error
return database.DB(ctx).Model(&User{}).Where("id = ?", id).Update("is_admin", admin).Error
}
func (s *userServiceImpl) VerifyAccessToken(ctx context.Context, tokenHash string) (*contracts.UserDTO, bool, error) {
@@ -233,13 +233,13 @@ func (s *userServiceImpl) DeleteUser(ctx context.Context, id uint64) error {
func (s *userServiceImpl) CountUsers(ctx context.Context) (int64, error) {
var count int64
err := db.DB(ctx).Model(&User{}).Count(&count).Error
err := database.DB(ctx).Model(&User{}).Count(&count).Error
return count, err
}
func (s *userServiceImpl) CountActiveUsers(ctx context.Context) (int64, error) {
var count int64
err := db.DB(ctx).Model(&User{}).Where("is_active = ?", true).Count(&count).Error
err := database.DB(ctx).Model(&User{}).Where("is_active = ?", true).Count(&count).Error
return count, err
}