- 后端:SpaceController 支持 5 个 Tab(文章/关注/粉丝/收藏/设置),统一处理本人与访客视图 - 后端:注入 FavoriteService 支持收藏夹 Tab,新增用户统计数据查询 - 后端:新增 PUT /api/space/privacy 隐私设置 API 端点 - 后端:移除 FollowPageController 及 /space/:uid/followers|following 路由 - 前端:完全重写 space/index.html,顶部信息栏 + Tab 导航 + 左侧栏 + 主内容区 - 前端:重写 space.css 适配新布局(Profile Header/Tab Bar/文章/收藏/设置) - 清理:删除独立的 follow HTML 模板和 CSS 文件 - 模型:User 表新增 follower_list_public 隐私字段
131 lines
5.6 KiB
Go
131 lines
5.6 KiB
Go
package controller
|
||
|
||
import (
|
||
"metazone.cc/metalab/internal/middleware"
|
||
"metazone.cc/metalab/internal/model"
|
||
"metazone.cc/metalab/internal/service"
|
||
"metazone.cc/metalab/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:7 个方法)
|
||
type postUseCase interface {
|
||
Create(userID uint, title, body string) (*model.Post, error)
|
||
GetByID(id uint) (*model.Post, error)
|
||
List(keyword string, page, pageSize int) ([]model.Post, int64, error)
|
||
Update(postID uint, title, body string) error
|
||
Delete(postID uint) error
|
||
SubmitForAudit(postID uint) error
|
||
IsPostAccessible(userID uint, role string, postUserID uint) bool
|
||
}
|
||
|
||
// studioUseCase StudioController 对 PostService 的最小依赖(ISP:8 个方法)
|
||
type studioUseCase interface {
|
||
Create(userID uint, title, body string) (*model.Post, error)
|
||
GetByID(id uint) (*model.Post, error)
|
||
Update(postID uint, title, body 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
|
||
}
|
||
|
||
// 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 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, error)
|
||
GetEnergyInfo(userID 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
|
||
}
|
||
|
||
// energyAdminUseCase AdminEnergyController 对 EnergyService 的依赖(ISP:4 个方法)
|
||
type energyAdminUseCase interface {
|
||
AdminAdjust(operatorUID uint, userIDs []uint, amount int, description string, mode string) error
|
||
GetAdminEnergyLogs(energyType string, page, pageSize int) ([]model.EnergyLog, int64, error)
|
||
GetFundBalance() (int, error)
|
||
GetFundLogs(logType string, page, pageSize int) ([]model.FundLog, int64, 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) ([]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)
|
||
}
|