Skip to content
This repository was archived by the owner on Feb 11, 2026. It is now read-only.

Commit 795961c

Browse files
committed
Added Update Username & Password
1 parent 36387f1 commit 795961c

4 files changed

Lines changed: 64 additions & 16 deletions

File tree

app/controllers/me_controller.ts

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
import type { HttpContext } from '@adonisjs/core/http'
2-
import User from '#models/user'
3-
import { updateEmailValidator } from '#validators/me'
2+
import { updateEmailValidator, updatePasswordValidator, updateUsernameValidator } from '#validators/me'
43
import redis from '@adonisjs/redis/services/main'
5-
4+
import User from '#models/user'
5+
import { APP_STATUS_CODE, config } from '#start/pdnode'
66
// MeController: /me/*
77
/*
88
-- TODOS --
99
* 添加更改用户邮箱 (2/2)
10-
* TODO: 添加更改用户名
11-
* TODO: 添加更改密码
10+
* 添加更改用户名 (2/2)
11+
* 添加更改密码 (2/2)
1212
*/
1313
export default class MeController {
1414
async show({ response, auth }: HttpContext) {
1515
const user = auth.user
16-
return response.ok(user)
16+
return response.ok({ ...user, status: APP_STATUS_CODE.SUCCESS })
1717
}
1818
async updateEmail({ request, response, auth }: HttpContext) {
1919
const payload = await updateEmailValidator.validate(request.all())
@@ -22,33 +22,60 @@ export default class MeController {
2222
const savedOldCode = await redis.get(oldEmailKey)
2323

2424
if (!savedOldCode || savedOldCode !== String(payload.oldEmailCode)) {
25-
return response.badRequest({ status: 'e_old_email_code_invalid' })
25+
return response.badRequest({ status: APP_STATUS_CODE.E_WRONG_EMAIL_CODE })
2626
}
2727

28-
2928
const newEmailKey = `auth:code:verifyEmail:email:${payload.newEmail}`
3029
const savedNewCode = await redis.get(newEmailKey)
3130

3231
if (!savedNewCode || savedNewCode !== String(payload.newEmailCode)) {
33-
return response.badRequest({ status: 'e_new_email_code_invalid' })
32+
return response.badRequest({ status: APP_STATUS_CODE.E_WRONG_EMAIL_CODE })
3433
}
3534

3635
const isTaken = await User.findBy('email', payload.newEmail)
3736
if (isTaken) {
38-
return response.conflict({ status: 'e_email_already_registered' })
37+
return response.conflict({ status: APP_STATUS_CODE.E_EMAIL_ALREADY_REGISTER })
3938
}
4039

4140
user.email = payload.newEmail
4241
await user.save()
4342

44-
await Promise.all([
45-
redis.del(oldEmailKey),
46-
redis.del(newEmailKey)
47-
])
43+
await Promise.all([redis.del(oldEmailKey), redis.del(newEmailKey)])
44+
45+
return response.ok({ status: APP_STATUS_CODE.SUCCESS })
46+
}
47+
async updatePassword({ request, response, auth }: HttpContext) {
48+
const { newPassword, oldPassword } = await updatePasswordValidator.validate(request.all())
49+
50+
await User.verifyCredentials(auth.user!.username, oldPassword)
51+
52+
if (newPassword === oldPassword) {
53+
return response.badRequest({ status: APP_STATUS_CODE.E_NEW_PASSWORD_SAME_AS_OLD_PASSWORD })
54+
}
55+
56+
auth.user!.password = newPassword
57+
58+
await auth.user!.save()
59+
60+
return response.ok({ status: APP_STATUS_CODE.SUCCESS })
61+
}
62+
async updateUsername({ request, response, auth }: HttpContext) {
63+
const { newUsername, password } = await updateUsernameValidator.validate(request.all(), {
64+
meta: {
65+
bannedUsernames: config.banned.username,
66+
},
67+
})
68+
69+
70+
await User.verifyCredentials(auth.user!.username, password)
71+
72+
if (await User.query().whereILike('username', newUsername).first()) return response.badRequest({ status: APP_STATUS_CODE.E_USERNAME_ALREADY_REGISTER })
4873

49-
return response.ok({ status: 's_email_updated' })
74+
auth.user!.username = newUsername
5075

76+
await auth.user!.save()
5177

78+
return response.ok({ status: APP_STATUS_CODE.SUCCESS })
5279

5380

5481
}

app/validators/me.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,27 @@
11
import vine from '@vinejs/vine'
2+
import { isBannedRule } from '#validators/user'
23

34
export const updateEmailValidator = vine.compile(
45
vine.object({
56
newEmail: vine.string().trim().email(),
67
newEmailCode: vine.number().min(100000).max(999999),
78
oldEmailCode: vine.number().min(100000).max(999999),
9+
810
}),
911
);
12+
13+
export const updatePasswordValidator = vine.compile(
14+
vine.object({
15+
newPassword: vine.string().trim().minLength(6).maxLength(24),
16+
oldPassword: vine.string().trim().minLength(6).maxLength(24),
17+
18+
})
19+
)
20+
21+
export const updateUsernameValidator = vine.compile(
22+
vine.object({
23+
newUsername: vine.string().trim().regex(/^[a-zA-Z0-9._-]+$/).minLength(3)
24+
.maxLength(12).use(isBannedRule({type: "username"})),
25+
password: vine.string().trim().minLength(6).maxLength(24),
26+
})
27+
)

app/validators/user.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ type RegistrationMeta = {
1111
bannedNicknames: string[]
1212
}
1313

14-
const isBannedRule = vine.createRule(
14+
export const isBannedRule = vine.createRule(
1515
(
1616
value: unknown,
1717
options: { type: "username" | "nickname" },
@@ -37,6 +37,7 @@ const isBannedRule = vine.createRule(
3737
if (hasBadWord) {
3838
field.report(
3939
`${options.type === "username" ? "Username" : "Nickname"} contains prohibited words.`,
40+
// TODO: Add to APP_STATUS_CODE
4041
`e_bad_${options.type}`,
4142
field,
4243
);

start/routes.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ router.group(() => {
3939
router.group(() => {
4040
router.get("/", [MeController, "show"])
4141
router.put("/email", [MeController, "updateEmail"])
42+
router.put("/password", [MeController, "updatePassword"])
43+
router.put("/username", [MeController, "updateUsername"])
4244
}).use(middleware.auth()).prefix("/me")
4345

4446

0 commit comments

Comments
 (0)