Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 40s
feat(pay): 添加支付API基础结构 feat(miniapp): 创建支付测试小程序页面与配置 feat(wechatpay): 配置微信支付参数与证书 fix(guild): 修复成员列表查询条件 docs: 更新代码规范文档与需求文档 style: 统一前后端枚举显示与注释格式 refactor(admin): 重构用户奖励发放接口参数处理 test(title): 添加称号效果参数验证测试
61 lines
1.6 KiB
Go
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)
|
|
}
|