Files
backend/internal/handler/admin_group_handler.go
lafay 2f584c1f2c
All checks were successful
Build Backend / build (push) Successful in 5m10s
Build Backend / build-docker (push) Successful in 2m22s
This is a breaking change that renames the entire project from "Carrot BBS" to "WithYou".
The Go module name has been changed from `carrot_bbs` to `with_you`, which requires
all import paths to be updated throughout the codebase and by external consumers.

BREAKING CHANGE: Module name changed from carrot_bbs to with_you. All imports
and dependencies must be updated from carrot_bbs/* to with_you/*.
2026-04-22 16:01:59 +08:00

203 lines
4.9 KiB
Go

package handler
import (
"strconv"
"with_you/internal/dto"
"with_you/internal/pkg/response"
"with_you/internal/service"
"github.com/gin-gonic/gin"
)
// AdminGroupHandler 管理端群组处理器
type AdminGroupHandler struct {
adminGroupService service.AdminGroupService
}
// NewAdminGroupHandler 创建管理端群组处理器
func NewAdminGroupHandler(adminGroupService service.AdminGroupService) *AdminGroupHandler {
return &AdminGroupHandler{
adminGroupService: adminGroupService,
}
}
// GetGroupList 获取群组列表
// GET /api/v1/admin/groups
func (h *AdminGroupHandler) GetGroupList(c *gin.Context) {
// 解析分页参数
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20"))
if page <= 0 {
page = 1
}
if pageSize <= 0 || pageSize > 100 {
pageSize = 20
}
// 获取筛选参数
keyword := c.Query("keyword")
status := c.Query("status")
ownerID := c.Query("owner_id")
startDate := c.Query("start_date")
endDate := c.Query("end_date")
groups, total, err := h.adminGroupService.GetGroupList(c.Request.Context(), page, pageSize, keyword, status, ownerID, startDate, endDate)
if err != nil {
response.InternalServerError(c, "failed to get group list")
return
}
response.Paginated(c, groups, total, page, pageSize)
}
// GetGroupDetail 获取群组详情
// GET /api/v1/admin/groups/:id
func (h *AdminGroupHandler) GetGroupDetail(c *gin.Context) {
groupID := c.Param("id")
if groupID == "" {
response.BadRequest(c, "group id is required")
return
}
groupDetail, err := h.adminGroupService.GetGroupDetail(c.Request.Context(), groupID)
if err != nil {
response.NotFound(c, "group not found")
return
}
response.Success(c, groupDetail)
}
// GetGroupMembers 获取群组成员列表
// GET /api/v1/admin/groups/:id/members
func (h *AdminGroupHandler) GetGroupMembers(c *gin.Context) {
groupID := c.Param("id")
if groupID == "" {
response.BadRequest(c, "group id is required")
return
}
// 解析分页参数
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20"))
if page <= 0 {
page = 1
}
if pageSize <= 0 || pageSize > 100 {
pageSize = 20
}
members, err := h.adminGroupService.GetGroupMembers(c.Request.Context(), groupID, page, pageSize)
if err != nil {
response.HandleError(c, err, "failed to get group members")
return
}
response.Success(c, members)
}
// DeleteGroup 解散群组
// DELETE /api/v1/admin/groups/:id
func (h *AdminGroupHandler) DeleteGroup(c *gin.Context) {
groupID := c.Param("id")
if groupID == "" {
response.BadRequest(c, "group id is required")
return
}
err := h.adminGroupService.DeleteGroup(c.Request.Context(), groupID)
if err != nil {
response.HandleError(c, err, "failed to delete group")
return
}
response.Success(c, dto.SuccessResponse{
Success: true,
Message: "group deleted successfully",
})
}
// UpdateGroupStatus 更新群组状态
// PUT /api/v1/admin/groups/:id/status
func (h *AdminGroupHandler) UpdateGroupStatus(c *gin.Context) {
groupID := c.Param("id")
if groupID == "" {
response.BadRequest(c, "group id is required")
return
}
var req dto.AdminUpdateGroupStatusRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.BadRequest(c, "invalid request body: "+err.Error())
return
}
// 验证状态值
if req.Status != "active" && req.Status != "dissolved" {
response.BadRequest(c, "invalid status value, must be 'active' or 'dissolved'")
return
}
groupDetail, err := h.adminGroupService.UpdateGroupStatus(c.Request.Context(), groupID, req.Status)
if err != nil {
response.HandleError(c, err, "failed to update group status")
return
}
response.Success(c, groupDetail)
}
// RemoveMember 移除群组成员
// DELETE /api/v1/admin/groups/:id/members/:userId
func (h *AdminGroupHandler) RemoveMember(c *gin.Context) {
groupID := c.Param("id")
userID := c.Param("userId")
if groupID == "" {
response.BadRequest(c, "group id is required")
return
}
if userID == "" {
response.BadRequest(c, "user id is required")
return
}
err := h.adminGroupService.RemoveMember(c.Request.Context(), groupID, userID)
if err != nil {
response.HandleError(c, err, "failed to remove member")
return
}
response.Success(c, dto.SuccessResponse{
Success: true,
Message: "member removed successfully",
})
}
// TransferOwner 转让群主
// PUT /api/v1/admin/groups/:id/transfer
func (h *AdminGroupHandler) TransferOwner(c *gin.Context) {
groupID := c.Param("id")
if groupID == "" {
response.BadRequest(c, "group id is required")
return
}
var req dto.AdminTransferGroupOwnerRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.BadRequest(c, "invalid request body: "+err.Error())
return
}
groupDetail, err := h.adminGroupService.TransferOwner(c.Request.Context(), groupID, req.NewOwnerID)
if err != nil {
response.HandleError(c, err, "failed to transfer owner")
return
}
response.Success(c, groupDetail)
}