Skip to content

fix(api-key):软删除apikey后key没有被释放后续无法再自定义相同的key#1343

Merged
Wei-Shaw merged 1 commit intoWei-Shaw:mainfrom
yilinyo:fix/api-key-unique-conflict-after-soft-delete
Mar 30, 2026
Merged

fix(api-key):软删除apikey后key没有被释放后续无法再自定义相同的key#1343
Wei-Shaw merged 1 commit intoWei-Shaw:mainfrom
yilinyo:fix/api-key-unique-conflict-after-soft-delete

Conversation

@yilinyo
Copy link
Copy Markdown
Contributor

@yilinyo yilinyo commented Mar 27, 2026

#1333

修复 API Key 软删除后因唯一约束无法复用同名 key 的问题

问题概述

在 API Key 管理场景中,删除操作采用软删除(仅设置 deleted_at),但 api_keys.key 字段存在全局唯一约束。
因此,当某个 key 被软删除后,数据库中该行仍保留原始 key 值,后续再次创建同名 key 会触发唯一冲突,导致创建失败。

问题原因

当前实现中:

  • 删除逻辑只更新 deleted_at,不修改 key
  • key 字段声明了 Unique()

这意味着“历史软删除记录”仍占用唯一键空间,和“允许复用已删除 key”的业务预期冲突。

修复方案

修改位置:internal/repository/api_key_repo.goDelete 方法。

在软删除时,除了设置 deleted_at,同时将原始 key 改写为 tombstone 值(墓碑 key),释放原 key 的唯一约束占用。
建议 tombstone 规则:

  • 前缀固定:__deleted__
  • 拼接 id 与高精度时间戳(如 UnixNano
  • 保证长度不超过 schema 的 MaxLen(128)

示例格式:

  • __deleted__{id}__{unix_nano}

这样可确保:

  1. 原 key 可被后续重新创建
  2. 不需要改动数据库索引结构

修复效果

场景 修复前 修复后
删除后重建同名 key 触发唯一冲突,创建失败 可正常创建
历史删除记录保留 保留 保留
数据库索引调整 不涉及 不涉及

兼容性与风险说明

  • 该方案会改变被删除记录的 key 值,不再保留原始明文 key。
  • 若有依赖“删除后仍可用原 key 精确检索历史记录”的逻辑,需要改为按 id 或审计字段追踪。
  • 建议在日志/审计层补充记录“删除前原 key(脱敏)”用于排障。

测试说明

internal/repository/api_key_repo_integration_test.go 增加以下用例:

用例名 校验点
TestCreate_AfterSoftDelete_AllowsSameKey 删除 key A 后,再创建 key A 成功

运行命令

# 运行 API Key repository 集成测试(可按实际用例名调整 -run)
go test -tags=integration -v ./internal/repository/...

@Wei-Shaw Wei-Shaw merged commit 8f0dbde into Wei-Shaw:main Mar 30, 2026
4 checks passed
liafonx pushed a commit to liafonx/sub2api that referenced this pull request Apr 11, 2026
…lict-after-soft-delete

fix(api-key):软删除apikey后key没有被释放后续无法再自定义相同的key
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants