新增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
145 lines
4.7 KiB
Go
145 lines
4.7 KiB
Go
// 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
|
|
}
|
|
|