bindbox-game/internal/api/guild/members_app.go
邹方成 6ee627139c
Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 40s
feat: 新增支付测试小程序与微信支付集成
feat(pay): 添加支付API基础结构
feat(miniapp): 创建支付测试小程序页面与配置
feat(wechatpay): 配置微信支付参数与证书
fix(guild): 修复成员列表查询条件
docs: 更新代码规范文档与需求文档
style: 统一前后端枚举显示与注释格式
refactor(admin): 重构用户奖励发放接口参数处理
test(title): 添加称号效果参数验证测试
2025-11-17 00:42:08 +08:00

200 lines
6.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package app
import (
"net/http"
"strconv"
"bindbox-game/internal/code"
"bindbox-game/internal/pkg/core"
"bindbox-game/internal/pkg/validation"
)
type joinGuildRequest struct {
UserID int64 `json:"user_id" binding:"required"`
}
type simpleMessageResponse struct {
Message string `json:"message"`
}
type joinGuildResponse struct {
Message string `json:"message"`
JoinStatus int32 `json:"join_status"`
}
// JoinGuild 加入工会
// @Summary 加入工会
// @Description 用户加入指定工会
// @Tags APP端.工会
// @Accept json
// @Produce json
// @Param guild_id path integer true "工会ID"
// @Param RequestBody body joinGuildRequest true "请求参数"
// @Success 200 {object} simpleMessageResponse
// @Failure 400 {object} code.Failure
// @Router /api/app/guilds/{guild_id}/members [post]
func (h *handler) JoinGuild() core.HandlerFunc {
return func(ctx core.Context) {
req := new(joinGuildRequest)
res := new(joinGuildResponse)
if err := ctx.ShouldBindJSON(req); err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, validation.Error(err)))
return
}
guildID, err := strconv.ParseInt(ctx.Param("guild_id"), 10, 64)
if err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, "未传递工会ID"))
return
}
if err := h.guild.JoinGuild(ctx.RequestContext(), guildID, struct{ UserID int64 }{UserID: req.UserID}); err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.JoinGuildError, err.Error()))
return
}
res.Message = "操作成功"
// 查询加入后的状态(待审/通过)
m, _ := h.readDB.GuildMembers.WithContext(ctx.RequestContext()).
Where(h.readDB.GuildMembers.GuildID.Eq(guildID)).
Where(h.readDB.GuildMembers.UserID.Eq(req.UserID)).
Where(h.readDB.GuildMembers.Status.Eq(1)).
Order(h.readDB.GuildMembers.ID.Desc()).
Limit(1).Find()
if len(m) > 0 {
res.JoinStatus = m[0].JoinStatus
}
ctx.Payload(res)
}
}
// LeaveGuild 离开工会
// @Summary 离开工会
// @Description 用户离开指定工会
// @Tags APP端.工会
// @Accept json
// @Produce json
// @Param guild_id path integer true "工会ID"
// @Param user_id path integer true "用户ID"
// @Success 200 {object} simpleMessageResponse
// @Failure 400 {object} code.Failure
// @Router /api/app/guilds/{guild_id}/members/{user_id} [delete]
func (h *handler) LeaveGuild() core.HandlerFunc {
return func(ctx core.Context) {
res := new(simpleMessageResponse)
guildID, err := strconv.ParseInt(ctx.Param("guild_id"), 10, 64)
if err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, "未传递工会ID"))
return
}
userID, err := strconv.ParseInt(ctx.Param("user_id"), 10, 64)
if err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, "未传递用户ID"))
return
}
if err := h.guild.LeaveGuild(ctx.RequestContext(), guildID, userID); err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.LeaveGuildError, err.Error()))
return
}
res.Message = "操作成功"
ctx.Payload(res)
}
}
type listMembersRequest struct {
Page int `form:"page"`
PageSize int `form:"page_size"`
}
type memberItem struct {
ID int64 `json:"id"`
UserID int64 `json:"user_id"`
Role string `json:"role"`
StartTime string `json:"start_time"`
}
type listMembersResponse struct {
Page int `json:"page"`
PageSize int `json:"page_size"`
Total int64 `json:"total"`
List []memberItem `json:"list"`
}
// ListGuildMembers 工会成员列表
// @Summary 查看工会成员
// @Description 查看指定工会的成员列表
// @Tags APP端.工会
// @Accept json
// @Produce json
// @Param guild_id path integer true "工会ID"
// @Param page query int true "页码" default(1)
// @Param page_size query int true "每页数量最多100" default(20)
// @Success 200 {object} listMembersResponse
// @Failure 400 {object} code.Failure
// @Router /api/app/guilds/{guild_id}/members [get]
func (h *handler) ListGuildMembers() core.HandlerFunc {
return func(ctx core.Context) {
req := new(listMembersRequest)
res := new(listMembersResponse)
if err := ctx.ShouldBindForm(req); err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, validation.Error(err)))
return
}
guildID, err := strconv.ParseInt(ctx.Param("guild_id"), 10, 64)
if err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, "未传递工会ID"))
return
}
items, total, err := h.guild.ListMembers(ctx.RequestContext(), guildID, req.Page, req.PageSize)
if err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ListGuildMembersError, err.Error()))
return
}
res.Page = req.Page
res.PageSize = req.PageSize
res.Total = total
res.List = make([]memberItem, len(items))
for i, v := range items {
res.List[i] = memberItem{ID: v.ID, UserID: v.UserID, Role: v.Role, StartTime: v.StartTime.Format("2006-01-02 15:04:05")}
}
ctx.Payload(res)
}
}
type myMembershipResponse struct {
Role string `json:"role"`
Status int32 `json:"status"`
JoinStatus int32 `json:"join_status"`
}
// GetMyGuildMembership 我的工会成员状态
// @Summary 查询本人在指定工会的成员状态
// @Description 返回角色、状态、加入状态
// @Tags APP端.工会
// @Accept json
// @Produce json
// @Param guild_id path integer true "工会ID"
// @Success 200 {object} myMembershipResponse
// @Failure 400 {object} code.Failure
// @Router /api/app/guilds/{guild_id}/members/me [get]
// @Security AppVerifyToken
func (h *handler) GetMyGuildMembership() core.HandlerFunc {
return func(ctx core.Context) {
res := new(myMembershipResponse)
guildID, err := strconv.ParseInt(ctx.Param("guild_id"), 10, 64)
if err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, "未传递工会ID"))
return
}
userID := int64(ctx.SessionUserInfo().Id)
m, err := h.readDB.GuildMembers.WithContext(ctx.RequestContext()).
Where(h.readDB.GuildMembers.GuildID.Eq(guildID)).
Where(h.readDB.GuildMembers.UserID.Eq(userID)).
Order(h.readDB.GuildMembers.ID.Desc()).
Limit(1).Find()
if err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ListGuildMembersError, err.Error()))
return
}
if len(m) > 0 {
res.Role = m[0].Role
res.Status = m[0].Status
res.JoinStatus = m[0].JoinStatus
}
ctx.Payload(res)
}
}