export async function onUnlinkProvider(req : express.Request, res : express.Response) { const log = slog.stepIn('SettingsApi', 'onUnlinkProvider'); try { do { const locale = req.ext.locale; const param : Request.UnlinkProvider = req.body; const condition : Request.UnlinkProvider = { provider: ['string', null, true] as any }; if (Utils.existsParameters(param, condition) === false) { res.ext.badRequest(locale); break; } // プロバイダ名チェック const {provider} = param; log.d(`${provider}`); if (provider !== 'twitter' && provider !== 'facebook' && provider !== 'google' && provider !== 'github') { res.ext.badRequest(locale); break; } // アカウント更新 const session : Session = req.ext.session; const account = await AccountAgent.find(session.account_id); if (AccountAgent.canUnlink(account, provider)) { account[provider] = null; await AccountAgent.update(account); const response : Response.UnlinkProvider = {status:Response.Status.OK, message:{}}; res.json(response); } else { const response : Response.UnlinkProvider = { status: Response.Status.FAILED, message: {general:R.text(R.CANNOT_UNLINK, locale)} }; res.json(response); } } while (false); log.stepOut(); } catch (err) {Utils.internalServerError(err, res, log);} }
export async function isRequestChangeEmailValid(param : Request.RequestChangeEmail, myAccount : Account, locale : string) : Promise<ValidationResult> { const log = slog.stepIn('SettingsApi', 'isRequestChangeEmailValid'); const response : Response.RequestChangeEmail = {status:Response.Status.OK, message:{}}; const {email} = param; do { if (email) { const alreadyExistsAccount = await AccountAgent.findByProviderId('email', email); const resultEmail = await Validator.email(email, myAccount.id, alreadyExistsAccount, locale); if (resultEmail.status !== Response.Status.OK) { response.status = resultEmail.status; response.message.email = resultEmail.message; } } else { if (AccountAgent.canUnlink(myAccount, 'email') === false) { response.status = Response.Status.FAILED; response.message.email = R.text(R.CANNOT_EMPTY_EMAIL, locale); } } } while (false); if (response.status !== Response.Status.OK) { log.w(JSON.stringify(response, null, 2)); } log.stepOut(); return {response}; }
export async function isChangePasswordValid(param : Request.ChangePassword, myAccountId : number, locale : string) : Promise<ValidationResult> { const log = slog.stepIn('SettingsApi', 'isChangePasswordValid'); const response : Response.ChangePassword = {status:Response.Status.OK, message:{}}; const {oldPassword, newPassword, confirm} = param; let account : Account = null; do { // パスワード検証 const passwordResult = Validator.password({password:newPassword, confirm, canNull:true}, locale); if (passwordResult.status !== Response.Status.OK) { response.status = passwordResult.status; response.message.newPassword = passwordResult.password; response.message.confirm = passwordResult.confirm; } // アカウント存在検証 account = await AccountAgent.find(myAccountId); if (account === null) { response.status = Response.Status.FAILED; response.message.general = R.text(R.ACCOUNT_NOT_FOUND, locale); break; } // メールアドレスが設定されているかどうか if (account.email === null) { response.status = Response.Status.FAILED; response.message.general = R.text(R.CANNOT_SET_PASSWORD, locale); } // パスワードを未設定にする場合は他に認証手段があるかどうか if (newPassword === null) { if (AccountAgent.canUnlink(account, 'email') === false) { response.status = Response.Status.FAILED; response.message.newPassword = R.text(R.CANNOT_NO_SET_PASSWORD, locale); } } // 現在のパスワードと現在のパスワードとして入力されたパスワードが一致するかどうか if (account.password !== null || oldPassword !== null) { const hashPassword = Utils.getHashPassword(account.email, oldPassword, Config.PASSWORD_SALT); if (hashPassword !== account.password) { response.status = Response.Status.FAILED; response.message.oldPassword = R.text(R.INVALID_PASSWORD, locale); } } } while (false); if (response.status !== Response.Status.OK) { log.w(JSON.stringify(response, null, 2)); } log.stepOut(); return {response, account}; }