## CI 修复 (P0/P1) P0 — 编译阻塞: - interfaces.go: postUseCase ISP 接口移除不用的 Create/Update/Delete P1 — 必须修复: - ST1000: 为 13 个包添加包注释 (common/config/model/service/...) - ST1005: redis_store.go 全部错误消息改为小写开头 - errcheck (19处): defer Close()→闭包忽略, notifier.Create→_=, r.Run→检查error - errorlint (9处): switch-on-error→errors.Is 链, ==→errors.Is - ST1020/ST1022: 导出符号注释以符号名开头 P2 — 安全评审: - gosec (12处): G203/G301/G304/G306 添加 nolint 注释并附理由 P3 — 清理: - unused: 移除 hasUnicode/energyStore/current/energyAdminUseCase - gofumpt + goimports 全量格式化 (35+ 文件)
179 lines
7.8 KiB
Go
179 lines
7.8 KiB
Go
// Package controller 定义 HTTP 请求处理层,通过 ISP 接口隔离依赖 Service。
|
||
package controller
|
||
|
||
import (
|
||
"io"
|
||
|
||
"metazone.cc/mce/internal/middleware"
|
||
"metazone.cc/mce/internal/model"
|
||
"metazone.cc/mce/internal/service"
|
||
"metazone.cc/mce/internal/session"
|
||
)
|
||
|
||
// authUseCase AuthController 对 AuthService 的最小依赖(ISP:5 个方法)
|
||
// 注意:Login/Register/ConfirmRestore 不再返回 JWT,session 由 controller 通过 SessionManager 创建
|
||
type authUseCase interface {
|
||
Register(req model.RegisterRequest, regIP string) (*model.User, error)
|
||
Login(req model.LoginRequest, loginIP string) (*model.User, error)
|
||
ConfirmRestore(req model.LoginRequest, loginIP string) (*model.User, error)
|
||
CheckEmail(email string) (bool, error)
|
||
IsRegistrationEnabled() bool
|
||
}
|
||
|
||
// rateLimiter AuthController 对 RateLimiter 的最小依赖(ISP:4 个方法)
|
||
type rateLimiter interface {
|
||
AllowAccount(email string) middleware.RateLimitResult
|
||
AllowIP(ip string) middleware.RateLimitResult
|
||
Clear(email, ip string)
|
||
ClearIP(ipKey string)
|
||
}
|
||
|
||
// postUseCase PostController 对 PostService 的最小依赖(ISP:6 个方法)
|
||
type postUseCase interface {
|
||
GetByID(id uint) (*model.Post, error)
|
||
List(keyword string, page, pageSize int) ([]model.Post, int64, error)
|
||
SubmitForAudit(postID uint) error
|
||
RecordRead(userID, postID uint)
|
||
RecordGuestRead(visitorID string, postID uint)
|
||
IsPostAccessible(userID uint, role string, postUserID uint) bool
|
||
}
|
||
|
||
// studioUseCase StudioController 对 PostService 的最小依赖(ISP:9 个方法)
|
||
type studioUseCase interface {
|
||
Create(userID uint, title, body, visibility, postType, reprintSource, declaration string, reprintProhibited bool, categoryID, scheduledAt string) (*model.Post, error)
|
||
GetByID(id uint) (*model.Post, error)
|
||
Update(postID uint, title, body, visibility, postType, reprintSource, declaration string, reprintProhibited bool, categoryID, scheduledAt string) error
|
||
Delete(postID uint) error
|
||
SubmitForAudit(postID uint) error
|
||
ListByUser(userID uint, status string, page, pageSize int) ([]model.Post, int64, error)
|
||
GetOverview(userID uint) (*service.StudioOverview, error)
|
||
IsPostAccessible(userID uint, role string, postUserID uint) bool
|
||
CanCreatePost(userID uint) bool
|
||
}
|
||
|
||
// spaceUseCase SpaceController 对 SpaceService 的最小依赖(ISP:5 个方法)
|
||
type spaceUseCase interface {
|
||
GetSpaceUser(uid uint) (*model.User, error)
|
||
GetPostsByUser(uid uint, page, pageSize int) ([]model.Post, int64, error)
|
||
CountUserPosts(uid uint) (int64, error)
|
||
GetUserStats(uid uint) (likes, favorites, reads int64, err error)
|
||
UpdateUser(user *model.User) error
|
||
}
|
||
|
||
// favoriteUseCaseForSpace SpaceController 对 FavoriteService 的最小依赖(ISP:收藏夹相关)
|
||
type favoriteUseCaseForSpace interface {
|
||
ListFolders(userID uint) (*service.FavoriteListResult, error)
|
||
ListFolderItems(userID, folderID uint, page, pageSize int) (*service.FolderItemsResult, error)
|
||
}
|
||
|
||
// sessionManager 登录管理对会话管理的最小依赖(ISP:4 个方法)
|
||
type sessionManager interface {
|
||
ListByUID(uid uint) ([]*session.Session, error)
|
||
Destroy(sid string) error
|
||
DestroyOtherByUID(uid uint, currentSID string) error
|
||
UpdateRemark(sid string, uid uint, remark string) error
|
||
}
|
||
|
||
// levelUseCase LevelController 对 LevelService 的最小依赖
|
||
type levelUseCase interface {
|
||
CheckIn(userID uint) (checkedIn bool, newExp int, levelUp bool, err error)
|
||
GetLevel(userID uint) (level int, exp int, checkedIn bool, err error)
|
||
CompleteTask(userID uint, taskType string) (newExp int, levelUp bool, err error)
|
||
}
|
||
|
||
// energyUseCase EnergyController 对 EnergyService 的最小依赖(ISP:3 个方法)
|
||
type energyUseCase interface {
|
||
Energize(energizerID uint, postID uint, amount int) (int, int, error)
|
||
GetEnergyInfo(userID uint, postID uint) (*service.EnergyInfo, error)
|
||
GetEnergyLogs(userID uint, days, page, pageSize int) ([]model.EnergyLog, int64, error)
|
||
}
|
||
|
||
// energyDeducter 删稿/改名时域能扣减接口(ISP)
|
||
type energyDeducter interface {
|
||
DeductOnDeletePost(authorUserID uint, postID uint) error
|
||
}
|
||
|
||
// energyRenameHandler 改名域能操作接口(ISP)
|
||
type energyRenameHandler interface {
|
||
DeductOnRename(userID uint) error
|
||
}
|
||
|
||
// commentUseCase CommentController 对 CommentService 的最小依赖(ISP:6 个方法)
|
||
type commentUseCase interface {
|
||
CreateRoot(userID, postID uint, body string) (*model.Comment, error)
|
||
CreateReply(userID, parentID uint, body string) (*model.Comment, error)
|
||
Delete(commentID uint, requesterID uint, isAdmin bool) error
|
||
ListRootComments(postID uint, page, pageSize int) ([]model.Comment, int64, error)
|
||
ListReplies(rootID uint) ([]model.Comment, error)
|
||
SearchUsers(keyword string, followerUID uint) ([]model.UserSearchResult, error)
|
||
}
|
||
|
||
// reactionUseCase ReactionController 对 ReactionService 的最小依赖(ISP:4 个方法)
|
||
type reactionUseCase interface {
|
||
ToggleLike(userID, postID uint) (bool, error)
|
||
ToggleDislike(userID, postID uint) (bool, error)
|
||
GetReaction(userID, postID uint) (service.ReactionType, error)
|
||
GetPostLikesCount(postID uint) (int, error)
|
||
}
|
||
|
||
// followUseCase FollowController 对 FollowService 的最小依赖(ISP:4 个方法)
|
||
type followUseCase interface {
|
||
Toggle(followerID, followeeID uint) (bool, error)
|
||
GetStatus(currentUserID, targetUserID uint) (*service.FollowStatus, error)
|
||
ListFollowers(userID, currentUserID uint, page, pageSize int) (*service.FollowListResult, error)
|
||
ListFollowing(userID, currentUserID uint, page, pageSize int) (*service.FollowListResult, error)
|
||
}
|
||
|
||
// favoriteUseCase FavoriteController 对 FavoriteService 的最小依赖(ISP:9 个方法)
|
||
type favoriteUseCase interface {
|
||
ListFolders(userID uint) (*service.FavoriteListResult, error)
|
||
CreateFolder(userID uint, name, description string, isPublic bool) (*model.Folder, error)
|
||
UpdateFolder(userID, folderID uint, name, description string, isPublic bool) error
|
||
DeleteFolder(userID, folderID uint) error
|
||
ListFolderItems(userID, folderID uint, page, pageSize int) (*service.FolderItemsResult, error)
|
||
AddFavorite(userID, postID uint, folderID *uint) error
|
||
RemoveFavorite(userID, postID uint) error
|
||
ToggleFavorite(userID, postID uint) (bool, error)
|
||
GetPostFavoriteStatus(userID, postID uint) (*service.FavoriteStatus, error)
|
||
}
|
||
|
||
// profileProvider SettingsController 对 AuthService 的最小依赖(ISP:4 个方法)
|
||
type profileProvider interface {
|
||
GetProfile(userID uint) (*model.User, error)
|
||
UpdateProfile(userID uint, username, bio string) error
|
||
ChangePassword(userID uint, currentPassword, newPassword string) error
|
||
DeleteAccount(userID uint, password, reason string) error
|
||
}
|
||
|
||
// avatarProvider SettingsController 头像上传对 Service 的最小依赖(ISP:2 个方法)
|
||
type avatarProvider interface {
|
||
ProcessAvatar(userID uint, file io.Reader, contentType string, cropX, cropY, cropSize int) (string, error)
|
||
ProcessImage(userID uint, file io.Reader, contentType string, cropX, cropY, cropSize int) (string, error)
|
||
}
|
||
|
||
// auditSubmittable SettingsController 对 AuditService 的依赖(ISP:4 个方法)
|
||
type auditSubmittable interface {
|
||
ShouldAudit(userID uint) (bool, error)
|
||
SubmitProfileChanges(userID uint, currentUser *model.User, newUsername, newBio string) error
|
||
Submit(userID uint, auditType, newValue string) error
|
||
GetPendingTypes(userID uint) ([]string, error)
|
||
}
|
||
|
||
// sessionConfig SettingsController 对配置的最小依赖(ISP:2 个方法)
|
||
type sessionConfig interface {
|
||
GetIdleTimeout() int
|
||
GetRememberTimeout() int
|
||
}
|
||
|
||
// taskCompleter SettingsController 对 LevelService 的依赖(ISP:2 个方法)
|
||
type taskCompleter interface {
|
||
CompleteTask(userID uint, taskType string) (newExp int, levelUp bool, err error)
|
||
HasCompletedTask(userID uint, taskType string) (bool, error)
|
||
}
|
||
|
||
// notifyPrefReader SettingsController 通知偏好的接口(ISP)
|
||
type notifyPrefReader interface {
|
||
GetNotifyPrefs(userID uint) (map[string]bool, error)
|
||
UpdateNotifyPref(userID uint, key string, enabled bool) error
|
||
}
|