package repo import ( "admin/apps/game/domain/entity" "admin/apps/game/model" "admin/apps/game/model/dto" "admin/internal/errcode" "errors" "gorm.io/gorm" "time" ) type ICDKeyRepo interface { GetByID(projectId, id int) (*entity.CDKey, bool, error) GetByKey(projectId int, key string) (*entity.CDKey, bool, error) AddCount(projectId, id int, delta int) (*entity.CDKey, error) GetUsedHistory(batchInfo *entity.CDKey, key string, serverId, roleId string) (*model.CDKeyUsed, bool, error) RecordUse(batchInfo *entity.CDKey, params *dto.CDKeyUseReq) error GetUsedHistoryList(projectId, id int) ([]*dto.CDKeyUsedInfo, error) } func NewCDKeyRepo(db *gorm.DB) ICDKeyRepo { return &cdKeyRepoImpl{db: db} } type cdKeyRepoImpl struct { db *gorm.DB } func (impl *cdKeyRepoImpl) AddCount(projectId, id int, delta int) (*entity.CDKey, error) { po := new(model.CDKey) err := impl.db.Where("project_id = ? and id = ?", projectId, id).First(po).Error if err != nil { return nil, errcode.New(errcode.ParamsInvalid, "not found cdkey conf:%v", id) } et := entity.NewCDKey(po) et.AddCount(delta) err = impl.db.Where("project_id = ? and id = ?", projectId, id).Updates(po).Error if err != nil { return nil, errcode.New(errcode.DBError, "update data:%+v error:%v", po, id) } return et, nil } func (impl *cdKeyRepoImpl) GetByID(projectId, id int) (*entity.CDKey, bool, error) { po := new(model.CDKey) err := impl.db.Where("project_id = ? and id = ?", projectId, id).First(po).Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, false, nil } return nil, false, errcode.New(errcode.ParamsInvalid, "not found cdkey conf:%v", id) } return entity.NewCDKey(po), true, nil } func (impl *cdKeyRepoImpl) GetByKey(projectId int, key string) (*entity.CDKey, bool, error) { po := new(model.CDKey) err := impl.db.Where("project_id = ? and code = ?", projectId, key).First(po).Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, false, nil } return nil, false, errcode.New(errcode.ParamsInvalid, "not found cdkey conf:%v", key) } return entity.NewCDKey(po), true, nil } func (impl *cdKeyRepoImpl) GetUsedHistory(batchInfo *entity.CDKey, key string, serverId, roleId string) (*model.CDKeyUsed, bool, error) { po := new(model.CDKeyUsed) // 获取同一批次角色的使用情况,同一批只能使用一次 err := impl.db.Where("project_id = ? and cd_key_id = ? and server_id = ? and role_id = ?", batchInfo.Po.ProjectId, batchInfo.Po.ID, serverId, roleId).First(po).Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, false, nil } return nil, false, errcode.New(errcode.ParamsInvalid, "found cdkey use:%v,%v,%v,%v error:%v", batchInfo.Po.ProjectId, serverId, roleId, key, err) } return po, true, nil } func (impl *cdKeyRepoImpl) RecordUse(batchInfo *entity.CDKey, params *dto.CDKeyUseReq) error { po := &model.CDKeyUsed{ ProjectId: batchInfo.Po.ProjectId, CDKeyId: batchInfo.Po.ID, ServerID: params.ServerID, Account: params.Account, RoleID: params.RoleID, RoleName: params.RoleName, Key: params.Key, IP: params.IP, DeviceId: params.DeviceID, } err := impl.db.Save(po).Error if err != nil { return errcode.New(errcode.CDKeyInvalid, "save db(%+v) error:%v", po, err) } return nil } func (impl *cdKeyRepoImpl) GetUsedHistoryList(projectId, id int) ([]*dto.CDKeyUsedInfo, error) { list := make([]*model.CDKeyUsed, 0) err := impl.db.Where("project_id = ? and cd_key_id = ?", projectId, id).Find(&list).Error if err != nil { return nil, errcode.New(errcode.DBError, "GetUsedHistoryList %v %v error:%v", projectId, id, err) } retList := make([]*dto.CDKeyUsedInfo, 0, len(list)) for _, v := range list { retList = append(retList, &dto.CDKeyUsedInfo{ ServerID: v.ServerID, Account: v.Account, RoleID: v.RoleID, RoleName: v.RoleName, Key: v.Key, IP: v.IP, DeviceID: v.DeviceId, CreatedAt: v.CreatedAt.Format(time.DateTime), }) } return retList, nil }