Browse Source

create forgotPasswordErrorCode type

Shun Miyazawa 3 years ago
parent
commit
c94a03b080

+ 7 - 0
packages/app/src/interfaces/errors/forgot-password.ts

@@ -0,0 +1,7 @@
+export const forgotPasswordErrorCode = {
+  PASSWORD_RESET_IS_UNAVAILABLE: 'password-reset-is-unavailable',
+  TOKEN_NOT_FOUND: 'token-not-found',
+  PASSWORD_RESET_ORDER_IS_NOT_APPROPRIATE: 'password-reset-order-is-not-appropriate',
+} as const;
+
+export type forgotPasswordErrorCode = typeof forgotPasswordErrorCode[keyof typeof forgotPasswordErrorCode]

+ 6 - 4
packages/app/src/pages/forgot-password-errors.page.tsx

@@ -5,12 +5,14 @@ import { useTranslation } from 'next-i18next';
 import { serverSideTranslations } from 'next-i18next/serverSideTranslations';
 import { serverSideTranslations } from 'next-i18next/serverSideTranslations';
 import Link from 'next/link';
 import Link from 'next/link';
 
 
+import { forgotPasswordErrorCode } from '~/interfaces/errors/forgot-password';
+
 import {
 import {
   CommonProps, getNextI18NextConfig, getServerSideCommonProps,
   CommonProps, getNextI18NextConfig, getServerSideCommonProps,
 } from './utils/commons';
 } from './utils/commons';
 
 
 type Props = CommonProps & {
 type Props = CommonProps & {
-  errorCode: string
+  errorCode: forgotPasswordErrorCode
 };
 };
 
 
 const ForgotPasswordErrorsPage: NextPage<Props> = (props: Props) => {
 const ForgotPasswordErrorsPage: NextPage<Props> = (props: Props) => {
@@ -27,9 +29,9 @@ const ForgotPasswordErrorsPage: NextPage<Props> = (props: Props) => {
                 <h1><i className="icon-lock-open large"/></h1>
                 <h1><i className="icon-lock-open large"/></h1>
                 <h2 className="text-center">{ t('forgot_password.reset_password') }</h2>
                 <h2 className="text-center">{ t('forgot_password.reset_password') }</h2>
 
 
-                { errorCode === 'password-reset-is-unavailable' && <h3 className="text-muted">This feature is unavailable.</h3>}
+                { errorCode === forgotPasswordErrorCode.PASSWORD_RESET_IS_UNAVAILABLE && <h3 className="text-muted">This feature is unavailable.</h3>}
 
 
-                { errorCode === 'password-reset-order-is-not-appropriate' && (
+                { errorCode === (forgotPasswordErrorCode.PASSWORD_RESET_ORDER_IS_NOT_APPROPRIATE || forgotPasswordErrorCode.TOKEN_NOT_FOUND) && (
                   <div>
                   <div>
                     <div className="alert alert-warning mb-3">
                     <div className="alert alert-warning mb-3">
                       <h2>{ t('forgot_password.incorrect_token_or_expired_url') }</h2>
                       <h2>{ t('forgot_password.incorrect_token_or_expired_url') }</h2>
@@ -69,7 +71,7 @@ export const getServerSideProps: GetServerSideProps = async(context: GetServerSi
 
 
   const errorCode = context.query.errorCode;
   const errorCode = context.query.errorCode;
   if (typeof errorCode === 'string') {
   if (typeof errorCode === 'string') {
-    props.errorCode = errorCode;
+    props.errorCode = errorCode as forgotPasswordErrorCode;
   }
   }
 
 
   // Direct access to '/forgot-password-errors' redirects to '/'
   // Direct access to '/forgot-password-errors' redirects to '/'

+ 9 - 2
packages/app/src/server/middlewares/inject-reset-order-by-token-middleware.ts

@@ -1,24 +1,31 @@
 import { NextFunction, Request, Response } from 'express';
 import { NextFunction, Request, Response } from 'express';
 import createError from 'http-errors';
 import createError from 'http-errors';
 
 
+import { forgotPasswordErrorCode } from '~/interfaces/errors/forgot-password';
+
 import PasswordResetOrder, { IPasswordResetOrder } from '../models/password-reset-order';
 import PasswordResetOrder, { IPasswordResetOrder } from '../models/password-reset-order';
 
 
 export type ReqWithPasswordResetOrder = Request & {
 export type ReqWithPasswordResetOrder = Request & {
   passwordResetOrder: IPasswordResetOrder,
   passwordResetOrder: IPasswordResetOrder,
 };
 };
 
 
+// eslint-disable-next-line import/no-anonymous-default-export
 export default async(req: ReqWithPasswordResetOrder, res: Response, next: NextFunction): Promise<void> => {
 export default async(req: ReqWithPasswordResetOrder, res: Response, next: NextFunction): Promise<void> => {
   const token = req.params.token || req.body.token;
   const token = req.params.token || req.body.token;
 
 
   if (token == null) {
   if (token == null) {
-    return next(createError(400, 'Token not found', { code: 'token-not-found' }));
+    return next(createError(400, 'Token not found', { code: forgotPasswordErrorCode.TOKEN_NOT_FOUND }));
   }
   }
 
 
   const passwordResetOrder = await PasswordResetOrder.findOne({ token });
   const passwordResetOrder = await PasswordResetOrder.findOne({ token });
 
 
   // check if the token is valid
   // check if the token is valid
   if (passwordResetOrder == null || passwordResetOrder.isExpired() || passwordResetOrder.isRevoked) {
   if (passwordResetOrder == null || passwordResetOrder.isExpired() || passwordResetOrder.isRevoked) {
-    return next(createError(400, 'passwordResetOrder is null or expired or revoked', { code: 'password-reset-order-is-not-appropriate' }));
+    return next(createError(
+      400,
+      'passwordResetOrder is null or expired or revoked',
+      { code: forgotPasswordErrorCode.PASSWORD_RESET_ORDER_IS_NOT_APPROPRIATE },
+    ));
   }
   }
 
 
   req.passwordResetOrder = passwordResetOrder;
   req.passwordResetOrder = passwordResetOrder;

+ 3 - 2
packages/app/src/server/routes/forgot-password.ts

@@ -3,6 +3,7 @@ import {
 } from 'express';
 } from 'express';
 import createError from 'http-errors';
 import createError from 'http-errors';
 
 
+import { forgotPasswordErrorCode } from '~/interfaces/errors/forgot-password';
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
 
 
 import { ReqWithPasswordResetOrder } from '../middlewares/inject-reset-order-by-token-middleware';
 import { ReqWithPasswordResetOrder } from '../middlewares/inject-reset-order-by-token-middleware';
@@ -24,7 +25,7 @@ export const checkForgotPasswordEnabledMiddlewareFactory = (crowi: any, forApi =
       logger.error(message);
       logger.error(message);
 
 
       const statusCode = forApi ? 405 : 404;
       const statusCode = forApi ? 405 : 404;
-      return next(createError(statusCode, message, { code: 'password-reset-is-unavailable' }));
+      return next(createError(statusCode, message, { code: forgotPasswordErrorCode.PASSWORD_RESET_IS_UNAVAILABLE }));
     }
     }
 
 
     next();
     next();
@@ -51,7 +52,7 @@ type CrowiReq = Request & {
 }
 }
 
 
 // middleware to handle error
 // middleware to handle error
-export const handleErrorsMiddleware = (crowi: any) => {
+export const handleErrorsMiddleware = (crowi: Crowi) => {
   return (error: Error & { code: string }, req: CrowiReq, res: Response, next: NextFunction): void => {
   return (error: Error & { code: string }, req: CrowiReq, res: Response, next: NextFunction): void => {
     if (error != null) {
     if (error != null) {
       const { nextApp } = crowi;
       const { nextApp } = crowi;