fix(backend): license service 小修 (#45-46-48)

- #45 Activate 幂等路径 Update 加错误检查,失败时返回 error 而非静默成功
- #46 Verify 加载 license 加 shop_id 过滤(防御纵深)
- #48 删除 ErrDeviceMismatch 死代码(多设备迁移后已无单设备约束)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-06-11 09:06:15 +08:00
parent f928d5c6a3
commit d28aba863e
+4 -3
View File
@@ -21,7 +21,6 @@ var (
ErrLicenseNotFound = errors.New("license not found")
ErrLicenseInactive = errors.New("license is inactive")
ErrLicenseExpired = errors.New("license has expired")
ErrDeviceMismatch = errors.New("license is bound to another device")
ErrDeviceLimitExceed = errors.New("device limit reached — deactivate another device first")
)
@@ -67,7 +66,9 @@ func (s *LicenseService) Activate(shopID uint64, licenseKey, deviceID, deviceNam
err := s.db.Where("license_id = ? AND device_id = ?", lic.ID, deviceID).First(&existing).Error
if err == nil {
// Device already bound — just touch last_seen_at (handled by autoUpdateTime)
s.db.Model(&existing).Update("device_name", deviceName)
if err := s.db.Model(&existing).Update("device_name", deviceName).Error; err != nil {
return nil, err
}
return &lic, nil
}
@@ -99,7 +100,7 @@ func (s *LicenseService) Verify(shopID uint64, deviceID string) (*model.License,
return nil, ErrLicenseNotFound
}
var lic model.License
if err := s.db.Where("id = ? AND is_active = 1", dev.LicenseID).First(&lic).Error; err != nil {
if err := s.db.Where("id = ? AND shop_id = ? AND is_active = 1", dev.LicenseID, shopID).First(&lic).Error; err != nil {
return nil, ErrLicenseNotFound
}
if lic.ExpiresAt != nil && time.Now().After(*lic.ExpiresAt) {