邹方成 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

61 lines
1.6 KiB
Go

package guild
import (
"context"
"errors"
"time"
"gorm.io/gorm"
"bindbox-game/internal/repository/mysql/model"
)
func (s *service) JoinGuild(ctx context.Context, guildID int64, in JoinGuildInput) error {
g, err := s.readDB.Guild.WithContext(ctx).Where(s.readDB.Guild.ID.Eq(guildID)).First()
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
return err
}
lastExit, err := s.readDB.GuildMembers.WithContext(ctx).
Where(s.readDB.GuildMembers.UserID.Eq(in.UserID)).
Where(s.readDB.GuildMembers.Status.Eq(2)).
Order(s.readDB.GuildMembers.ID.Desc()).
Limit(1).Find()
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
return err
}
if len(lastExit) > 0 {
exitAt := lastExit[0].StartTime
if time.Since(exitAt) < 24*time.Hour {
return errors.New("recently left a guild, join limited within 24h")
}
}
exists, err := s.readDB.GuildMembers.WithContext(ctx).
Where(s.readDB.GuildMembers.GuildID.Eq(guildID)).
Where(s.readDB.GuildMembers.UserID.Eq(in.UserID)).
Where(s.readDB.GuildMembers.Status.Eq(1)).Count()
if err != nil {
return err
}
if exists > 0 {
return errors.New("already a member")
}
joinStatus := int32(2)
var startTime time.Time
if g != nil && g.JoinMode == 1 {
joinStatus = 0
startTime = time.Time{}
} else {
startTime = time.Now()
}
m := &model.GuildMembers{
GuildID: guildID,
UserID: in.UserID,
Role: "member",
StartTime: startTime,
Status: 1,
JoinStatus: joinStatus,
}
return s.writeDB.GuildMembers.WithContext(ctx).Create(m)
}