- Updated main.go to initialize email service and include it in the dependency injection container. - Refactored handlers to utilize context in service method calls, improving consistency and error handling. - Introduced new service options for upload, security, and captcha services, enhancing modularity and testability. - Removed unused repository implementations to streamline the codebase. This commit continues the effort to improve the architecture by ensuring all services are properly injected and utilized across the application.
160 lines
6.2 KiB
Go
160 lines
6.2 KiB
Go
// Package service 定义业务逻辑层接口
|
|
package service
|
|
|
|
import (
|
|
"carrotskin/internal/model"
|
|
"carrotskin/pkg/storage"
|
|
"context"
|
|
"time"
|
|
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
// UserService 用户服务接口
|
|
type UserService interface {
|
|
// 用户认证
|
|
Register(ctx context.Context, username, password, email, avatar string) (*model.User, string, error)
|
|
Login(ctx context.Context, usernameOrEmail, password, ipAddress, userAgent string) (*model.User, string, error)
|
|
|
|
// 用户查询
|
|
GetByID(ctx context.Context, id int64) (*model.User, error)
|
|
GetByEmail(ctx context.Context, email string) (*model.User, error)
|
|
|
|
// 用户更新
|
|
UpdateInfo(ctx context.Context, user *model.User) error
|
|
UpdateAvatar(ctx context.Context, userID int64, avatarURL string) error
|
|
ChangePassword(ctx context.Context, userID int64, oldPassword, newPassword string) error
|
|
ResetPassword(ctx context.Context, email, newPassword string) error
|
|
ChangeEmail(ctx context.Context, userID int64, newEmail string) error
|
|
|
|
// URL验证
|
|
ValidateAvatarURL(ctx context.Context, avatarURL string) error
|
|
|
|
// 配置获取
|
|
GetMaxProfilesPerUser() int
|
|
GetMaxTexturesPerUser() int
|
|
}
|
|
|
|
// ProfileService 档案服务接口
|
|
type ProfileService interface {
|
|
// 档案CRUD
|
|
Create(ctx context.Context, userID int64, name string) (*model.Profile, error)
|
|
GetByUUID(ctx context.Context, uuid string) (*model.Profile, error)
|
|
GetByUserID(ctx context.Context, userID int64) ([]*model.Profile, error)
|
|
Update(ctx context.Context, uuid string, userID int64, name *string, skinID, capeID *int64) (*model.Profile, error)
|
|
Delete(ctx context.Context, uuid string, userID int64) error
|
|
|
|
// 档案状态
|
|
SetActive(ctx context.Context, uuid string, userID int64) error
|
|
CheckLimit(ctx context.Context, userID int64, maxProfiles int) error
|
|
|
|
// 批量查询
|
|
GetByNames(ctx context.Context, names []string) ([]*model.Profile, error)
|
|
GetByProfileName(ctx context.Context, name string) (*model.Profile, error)
|
|
}
|
|
|
|
// TextureService 材质服务接口
|
|
type TextureService interface {
|
|
// 材质CRUD
|
|
Create(ctx context.Context, uploaderID int64, name, description, textureType, url, hash string, size int, isPublic, isSlim bool) (*model.Texture, error)
|
|
GetByID(ctx context.Context, id int64) (*model.Texture, error)
|
|
GetByUserID(ctx context.Context, uploaderID int64, page, pageSize int) ([]*model.Texture, int64, error)
|
|
Search(ctx context.Context, keyword string, textureType model.TextureType, publicOnly bool, page, pageSize int) ([]*model.Texture, int64, error)
|
|
Update(ctx context.Context, textureID, uploaderID int64, name, description string, isPublic *bool) (*model.Texture, error)
|
|
Delete(ctx context.Context, textureID, uploaderID int64) error
|
|
|
|
// 收藏
|
|
ToggleFavorite(ctx context.Context, userID, textureID int64) (bool, error)
|
|
GetUserFavorites(ctx context.Context, userID int64, page, pageSize int) ([]*model.Texture, int64, error)
|
|
|
|
// 限制检查
|
|
CheckUploadLimit(ctx context.Context, uploaderID int64, maxTextures int) error
|
|
}
|
|
|
|
// TokenService 令牌服务接口
|
|
type TokenService interface {
|
|
// 令牌管理
|
|
Create(ctx context.Context, userID int64, uuid, clientToken string) (*model.Profile, []*model.Profile, string, string, error)
|
|
Validate(ctx context.Context, accessToken, clientToken string) bool
|
|
Refresh(ctx context.Context, accessToken, clientToken, selectedProfileID string) (string, string, error)
|
|
Invalidate(ctx context.Context, accessToken string)
|
|
InvalidateUserTokens(ctx context.Context, userID int64)
|
|
|
|
// 令牌查询
|
|
GetUUIDByAccessToken(ctx context.Context, accessToken string) (string, error)
|
|
GetUserIDByAccessToken(ctx context.Context, 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(ctx context.Context, email string) (int64, error)
|
|
VerifyPassword(ctx context.Context, password string, userID int64) error
|
|
|
|
// 会话管理
|
|
JoinServer(ctx context.Context, serverID, accessToken, selectedProfile, ip string) error
|
|
HasJoinedServer(ctx context.Context, serverID, username, ip string) error
|
|
|
|
// 密码管理
|
|
ResetYggdrasilPassword(ctx context.Context, userID int64) (string, error)
|
|
|
|
// 序列化
|
|
SerializeProfile(ctx context.Context, profile model.Profile) map[string]interface{}
|
|
SerializeUser(ctx context.Context, user *model.User, uuid string) map[string]interface{}
|
|
|
|
// 证书
|
|
GeneratePlayerCertificate(ctx context.Context, uuid string) (map[string]interface{}, error)
|
|
GetPublicKey(ctx context.Context) (string, error)
|
|
}
|
|
|
|
// SecurityService 安全服务接口
|
|
type SecurityService interface {
|
|
// 登录安全
|
|
CheckLoginLocked(ctx context.Context, identifier string) (bool, time.Duration, error)
|
|
RecordLoginFailure(ctx context.Context, identifier string) (int, error)
|
|
ClearLoginAttempts(ctx context.Context, identifier string) error
|
|
GetRemainingLoginAttempts(ctx context.Context, identifier string) (int, error)
|
|
|
|
// 验证码安全
|
|
CheckVerifyLocked(ctx context.Context, email, codeType string) (bool, time.Duration, error)
|
|
RecordVerifyFailure(ctx context.Context, email, codeType string) (int, error)
|
|
ClearVerifyAttempts(ctx context.Context, email, codeType string) error
|
|
}
|
|
|
|
// Services 服务集合
|
|
type Services struct {
|
|
User UserService
|
|
Profile ProfileService
|
|
Texture TextureService
|
|
Token TokenService
|
|
Verification VerificationService
|
|
Captcha CaptchaService
|
|
Upload UploadService
|
|
Yggdrasil YggdrasilService
|
|
Security SecurityService
|
|
}
|
|
|
|
// ServiceDeps 服务依赖
|
|
type ServiceDeps struct {
|
|
Logger *zap.Logger
|
|
Storage *storage.StorageClient
|
|
}
|