Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
陈曦
sub2api
Commits
1f39bf8a
"frontend/src/views/vscode:/vscode.git/clone" did not exist on "216321aa9e441bcd003715e1ea119cee858020bf"
Commit
1f39bf8a
authored
Mar 27, 2026
by
YilinMacAir
Browse files
fix:修复由于数据库唯一键导致软删除apikey后key没有被释放后续无法再自定义相同的key
parent
fdd8499f
Changes
2
Show whitespace changes
Inline
Side-by-side
backend/internal/repository/api_key_repo.go
View file @
1f39bf8a
...
...
@@ -3,6 +3,7 @@ package repository
import
(
"context"
"database/sql"
"fmt"
"time"
dbent
"github.com/Wei-Shaw/sub2api/ent"
...
...
@@ -257,9 +258,12 @@ func (r *apiKeyRepository) Update(ctx context.Context, key *service.APIKey) erro
}
func
(
r
*
apiKeyRepository
)
Delete
(
ctx
context
.
Context
,
id
int64
)
error
{
// 存在唯一键约束 生成tombstone key 用来释放原key,长度远小于 128,满足 schema 限制
tombstoneKey
:=
fmt
.
Sprintf
(
"__deleted__%d__%d"
,
id
,
time
.
Now
()
.
UnixNano
())
// 显式软删除:避免依赖 Hook 行为,确保 deleted_at 一定被设置。
affected
,
err
:=
r
.
client
.
APIKey
.
Update
()
.
Where
(
apikey
.
IDEQ
(
id
),
apikey
.
DeletedAtIsNil
())
.
SetKey
(
tombstoneKey
)
.
SetDeletedAt
(
time
.
Now
())
.
Save
(
ctx
)
if
err
!=
nil
{
...
...
backend/internal/repository/api_key_repo_integration_test.go
View file @
1f39bf8a
...
...
@@ -151,6 +151,31 @@ func (s *APIKeyRepoSuite) TestDelete() {
s
.
Require
()
.
Error
(
err
,
"expected error after delete"
)
}
func
(
s
*
APIKeyRepoSuite
)
TestCreate_AfterSoftDelete_AllowsSameKey
()
{
user
:=
s
.
mustCreateUser
(
"recreate-after-soft-delete@test.com"
)
const
reusedKey
=
"sk-reuse-after-soft-delete"
first
:=
&
service
.
APIKey
{
UserID
:
user
.
ID
,
Key
:
reusedKey
,
Name
:
"First Key"
,
Status
:
service
.
StatusActive
,
}
s
.
Require
()
.
NoError
(
s
.
repo
.
Create
(
s
.
ctx
,
first
),
"create first key"
)
s
.
Require
()
.
NoError
(
s
.
repo
.
Delete
(
s
.
ctx
,
first
.
ID
),
"soft delete first key"
)
second
:=
&
service
.
APIKey
{
UserID
:
user
.
ID
,
Key
:
reusedKey
,
Name
:
"Second Key"
,
Status
:
service
.
StatusActive
,
}
s
.
Require
()
.
NoError
(
s
.
repo
.
Create
(
s
.
ctx
,
second
),
"create second key with same key"
)
s
.
Require
()
.
NotZero
(
second
.
ID
)
s
.
Require
()
.
NotEqual
(
first
.
ID
,
second
.
ID
,
"recreated key should be a new row"
)
}
// --- ListByUserID / CountByUserID ---
func
(
s
*
APIKeyRepoSuite
)
TestListByUserID
()
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment