禁止已发放二维码回退待用

This commit is contained in:
yml
2026-06-18 09:59:06 +08:00
parent 58e071d157
commit 7934141ba2
4 changed files with 143 additions and 10 deletions
+20 -8
View File
@@ -18,8 +18,9 @@ const (
)
var (
ErrQrCodeNotFound = errors.New("二维码不存在")
ErrQrCodeCannotDelete = errors.New("已使用的二维码不能删除")
ErrQrCodeNotFound = errors.New("二维码不存在")
ErrQrCodeCannotDelete = errors.New("已使用的二维码不能删除")
ErrQrCodeCannotReenable = errors.New("已发放的二维码不能改回待用")
)
// CreateQrCodeRequest 创建二维码请求
@@ -172,6 +173,14 @@ func (r *Repository) GetQrCodeStats(ctx context.Context) (*QrCodeStats, error) {
// UpdateQrCode 更新二维码
func (r *Repository) UpdateQrCode(ctx context.Context, id uint64, req UpdateQrCodeRequest) error {
var qrcode model.ChatQrCode
if err := r.db.WithContext(ctx).First(&qrcode, id).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return ErrQrCodeNotFound
}
return err
}
updates := make(map[string]interface{})
if req.ImageURL != nil {
@@ -185,6 +194,9 @@ func (r *Repository) UpdateQrCode(ctx context.Context, id uint64, req UpdateQrCo
if *req.Status != QrCodeStatusUnused && *req.Status != QrCodeStatusUsed && *req.Status != QrCodeStatusDisabled {
return errors.New("无效的状态值")
}
if *req.Status == QrCodeStatusUnused && qrcodeWasIssued(qrcode) {
return ErrQrCodeCannotReenable
}
updates["status"] = *req.Status
}
if req.ExpiresAt != nil {
@@ -197,17 +209,17 @@ func (r *Repository) UpdateQrCode(ctx context.Context, id uint64, req UpdateQrCo
return nil
}
result := r.db.WithContext(ctx).Model(&model.ChatQrCode{}).Where("id = ?", id).Updates(updates)
if result.Error != nil {
return result.Error
}
if result.RowsAffected == 0 {
return ErrQrCodeNotFound
if err := r.db.WithContext(ctx).Model(&qrcode).Updates(updates).Error; err != nil {
return err
}
return nil
}
func qrcodeWasIssued(qrcode model.ChatQrCode) bool {
return qrcode.Status == QrCodeStatusUsed || qrcode.ConversationID != nil || qrcode.UsedAt != nil
}
// DeleteQrCode 删除二维码(仅未使用的可删除)
func (r *Repository) DeleteQrCode(ctx context.Context, id uint64) error {
var qrcode model.ChatQrCode