feat: Service层接口化
新增Service接口定义(internal/service/interfaces.go): - UserService: 用户认证、查询、更新等接口 - ProfileService: 档案CRUD、状态管理接口 - TextureService: 材质管理、收藏功能接口 - TokenService: 令牌生命周期管理接口 - VerificationService: 验证码服务接口 - CaptchaService: 滑动验证码接口 - UploadService: 上传服务接口 - YggdrasilService: Yggdrasil API接口 新增Service实现: - user_service_impl.go: 用户服务实现 - profile_service_impl.go: 档案服务实现 - texture_service_impl.go: 材质服务实现 - token_service_impl.go: 令牌服务实现 更新Container: - 添加Service层字段 - 初始化Service实例 - 添加With*Service选项函数 遵循Go最佳实践: - 接口定义与实现分离 - 依赖通过构造函数注入 - 便于单元测试mock
This commit is contained in:
144
internal/service/interfaces.go
Normal file
144
internal/service/interfaces.go
Normal file
@@ -0,0 +1,144 @@
|
||||
// Package service 定义业务逻辑层接口
|
||||
package service
|
||||
|
||||
import (
|
||||
"carrotskin/internal/model"
|
||||
"carrotskin/pkg/storage"
|
||||
"context"
|
||||
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
// UserService 用户服务接口
|
||||
type UserService interface {
|
||||
// 用户认证
|
||||
Register(username, password, email, avatar string) (*model.User, string, error)
|
||||
Login(usernameOrEmail, password, ipAddress, userAgent string) (*model.User, string, error)
|
||||
|
||||
// 用户查询
|
||||
GetByID(id int64) (*model.User, error)
|
||||
GetByEmail(email string) (*model.User, error)
|
||||
|
||||
// 用户更新
|
||||
UpdateInfo(user *model.User) error
|
||||
UpdateAvatar(userID int64, avatarURL string) error
|
||||
ChangePassword(userID int64, oldPassword, newPassword string) error
|
||||
ResetPassword(email, newPassword string) error
|
||||
ChangeEmail(userID int64, newEmail string) error
|
||||
|
||||
// URL验证
|
||||
ValidateAvatarURL(avatarURL string) error
|
||||
|
||||
// 配置获取
|
||||
GetMaxProfilesPerUser() int
|
||||
GetMaxTexturesPerUser() int
|
||||
}
|
||||
|
||||
// ProfileService 档案服务接口
|
||||
type ProfileService interface {
|
||||
// 档案CRUD
|
||||
Create(userID int64, name string) (*model.Profile, error)
|
||||
GetByUUID(uuid string) (*model.Profile, error)
|
||||
GetByUserID(userID int64) ([]*model.Profile, error)
|
||||
Update(uuid string, userID int64, name *string, skinID, capeID *int64) (*model.Profile, error)
|
||||
Delete(uuid string, userID int64) error
|
||||
|
||||
// 档案状态
|
||||
SetActive(uuid string, userID int64) error
|
||||
CheckLimit(userID int64, maxProfiles int) error
|
||||
|
||||
// 批量查询
|
||||
GetByNames(names []string) ([]*model.Profile, error)
|
||||
GetByProfileName(name string) (*model.Profile, error)
|
||||
}
|
||||
|
||||
// TextureService 材质服务接口
|
||||
type TextureService interface {
|
||||
// 材质CRUD
|
||||
Create(uploaderID int64, name, description, textureType, url, hash string, size int, isPublic, isSlim bool) (*model.Texture, error)
|
||||
GetByID(id int64) (*model.Texture, error)
|
||||
GetByUserID(uploaderID int64, page, pageSize int) ([]*model.Texture, int64, error)
|
||||
Search(keyword string, textureType model.TextureType, publicOnly bool, page, pageSize int) ([]*model.Texture, int64, error)
|
||||
Update(textureID, uploaderID int64, name, description string, isPublic *bool) (*model.Texture, error)
|
||||
Delete(textureID, uploaderID int64) error
|
||||
|
||||
// 收藏
|
||||
ToggleFavorite(userID, textureID int64) (bool, error)
|
||||
GetUserFavorites(userID int64, page, pageSize int) ([]*model.Texture, int64, error)
|
||||
|
||||
// 限制检查
|
||||
CheckUploadLimit(uploaderID int64, maxTextures int) error
|
||||
}
|
||||
|
||||
// TokenService 令牌服务接口
|
||||
type TokenService interface {
|
||||
// 令牌管理
|
||||
Create(userID int64, uuid, clientToken string) (*model.Profile, []*model.Profile, string, string, error)
|
||||
Validate(accessToken, clientToken string) bool
|
||||
Refresh(accessToken, clientToken, selectedProfileID string) (string, string, error)
|
||||
Invalidate(accessToken string)
|
||||
InvalidateUserTokens(userID int64)
|
||||
|
||||
// 令牌查询
|
||||
GetUUIDByAccessToken(accessToken string) (string, error)
|
||||
GetUserIDByAccessToken(accessToken string) (int64, error)
|
||||
}
|
||||
|
||||
// VerificationService 验证码服务接口
|
||||
type VerificationService interface {
|
||||
SendCode(ctx context.Context, email, codeType string) error
|
||||
VerifyCode(ctx context.Context, email, code, codeType string) error
|
||||
}
|
||||
|
||||
// CaptchaService 滑动验证码服务接口
|
||||
type CaptchaService interface {
|
||||
Generate(ctx context.Context) (masterImg, tileImg, captchaID string, y int, err error)
|
||||
Verify(ctx context.Context, dx int, captchaID string) (bool, error)
|
||||
}
|
||||
|
||||
// UploadService 上传服务接口
|
||||
type UploadService interface {
|
||||
GenerateAvatarUploadURL(ctx context.Context, userID int64, fileName string) (*storage.PresignedPostPolicyResult, error)
|
||||
GenerateTextureUploadURL(ctx context.Context, userID int64, fileName, textureType string) (*storage.PresignedPostPolicyResult, error)
|
||||
}
|
||||
|
||||
// YggdrasilService Yggdrasil服务接口
|
||||
type YggdrasilService interface {
|
||||
// 用户认证
|
||||
GetUserIDByEmail(email string) (int64, error)
|
||||
VerifyPassword(password string, userID int64) error
|
||||
|
||||
// 会话管理
|
||||
JoinServer(serverID, accessToken, selectedProfile, ip string) error
|
||||
HasJoinedServer(serverID, username, ip string) error
|
||||
|
||||
// 密码管理
|
||||
ResetYggdrasilPassword(userID int64) (string, error)
|
||||
|
||||
// 序列化
|
||||
SerializeProfile(profile model.Profile) map[string]interface{}
|
||||
SerializeUser(user *model.User, uuid string) map[string]interface{}
|
||||
|
||||
// 证书
|
||||
GeneratePlayerCertificate(uuid string) (map[string]interface{}, error)
|
||||
GetPublicKey() (string, error)
|
||||
}
|
||||
|
||||
// Services 服务集合
|
||||
type Services struct {
|
||||
User UserService
|
||||
Profile ProfileService
|
||||
Texture TextureService
|
||||
Token TokenService
|
||||
Verification VerificationService
|
||||
Captcha CaptchaService
|
||||
Upload UploadService
|
||||
Yggdrasil YggdrasilService
|
||||
}
|
||||
|
||||
// ServiceDeps 服务依赖
|
||||
type ServiceDeps struct {
|
||||
Logger *zap.Logger
|
||||
Storage *storage.StorageClient
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user