fix: support soft-delete user uniqueness in tools
This commit is contained in:
@@ -2488,4 +2488,5 @@ git diff --check
|
||||
- 手机号码基础校验放宽为`^1\d{10}$`,不依赖号段更新。客户端/HTTP混合批次逐号码把非法号码、平台黑名单和企业应用黑名单记为`submit_failed/rejected`且金额0,合法号码照常冻结、入队;CMPP混合多目的提交对被拦截号码生成平台`REJECTD`失败回执,合法号码继续处理。
|
||||
- 短信审核页只返回待人工审核及人工处理记录,自动放行/拒绝不再混入;号码数量恢复设计基线的查看入口,真实接口仅返回手机号、归属地、运营商和短信状态并支持服务端搜索/分页。
|
||||
- 新待审核短信同步保存`reviewTaskId`,审核决定同时按短信直连和批次`riskTaskId`查找,修复审核任务已通过而短信仍`pending_review`。遵照要求不改写现存历史异常数据、不补发历史短信。
|
||||
- 用户登录标识改为“仅未删除记录唯一”后,部署管理员初始化与真实环境冒烟脚本同步从`username`唯一`upsert`改为先查询未删除用户、再按主键更新或创建,避免迁移后Prisma拒绝旧的唯一查询。
|
||||
- 发布前门禁阶段结果:Prisma format/generate/validate通过;风险审核+发送链定向2 suites / 108 tests通过,随后补充应用覆盖、号码分页与逐号码拦截用例;API全量26 suites / 338 tests、API TypeScript build、前端TypeScript/Vite生产构建、Gateway `go test ./...`/`go vet ./...`、依赖安全门禁通过。API保留既有Redis不可用容错告警与`--forceExit`提示,前端保留约1.95MB单chunk/584.70KB gzip提示。
|
||||
|
||||
@@ -19,7 +19,9 @@ function hashPassword(value) {
|
||||
}
|
||||
|
||||
async function main() {
|
||||
const existingUser = await prisma.user.findUnique({ where: { username } });
|
||||
const existingUser = await prisma.user.findFirst({
|
||||
where: { username, deletedAt: null },
|
||||
});
|
||||
const createPassword = configuredPassword || randomBytes(18).toString('base64url');
|
||||
const updatePassword = configuredPassword;
|
||||
const role = await prisma.role.upsert({
|
||||
@@ -27,9 +29,7 @@ async function main() {
|
||||
update: { name: '平台管理员', scope: 'platform' },
|
||||
create: { code: 'platform_admin', name: '平台管理员', scope: 'platform' },
|
||||
});
|
||||
const user = await prisma.user.upsert({
|
||||
where: { username },
|
||||
update: {
|
||||
const userData = {
|
||||
email,
|
||||
displayName: '生产平台管理员',
|
||||
...(updatePassword ? { passwordHash: hashPassword(updatePassword) } : {}),
|
||||
@@ -38,8 +38,14 @@ async function main() {
|
||||
lockedUntil: null,
|
||||
deletedAt: null,
|
||||
tenantId: null,
|
||||
},
|
||||
create: {
|
||||
};
|
||||
const user = existingUser
|
||||
? await prisma.user.update({
|
||||
where: { id: existingUser.id },
|
||||
data: userData,
|
||||
})
|
||||
: await prisma.user.create({
|
||||
data: {
|
||||
username,
|
||||
email,
|
||||
displayName: '生产平台管理员',
|
||||
|
||||
@@ -25,9 +25,13 @@ async function ensureSmokeData() {
|
||||
create: { code: tenantCode, name: 'Smoke Test Enterprise', status: 'active' },
|
||||
});
|
||||
|
||||
const user = await prisma.user.upsert({
|
||||
where: { username },
|
||||
update: {
|
||||
const existingUser = await prisma.user.findFirst({
|
||||
where: { username, deletedAt: null },
|
||||
});
|
||||
const user = existingUser
|
||||
? await prisma.user.update({
|
||||
where: { id: existingUser.id },
|
||||
data: {
|
||||
tenantId: tenant.id,
|
||||
email,
|
||||
phone,
|
||||
@@ -38,7 +42,9 @@ async function ensureSmokeData() {
|
||||
lockedUntil: null,
|
||||
deletedAt: null,
|
||||
},
|
||||
create: {
|
||||
})
|
||||
: await prisma.user.create({
|
||||
data: {
|
||||
tenantId: tenant.id,
|
||||
username,
|
||||
email,
|
||||
|
||||
Reference in New Issue
Block a user