11import 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'
43import 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*/
1313export 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 }
0 commit comments