Skip to content

Commit

Permalink
Feat/#24 (#36)
Browse files Browse the repository at this point in the history
* fix: UserInterest 삭제

* chore: 이메일 텍스트 변경

* refactor: middleware type 추가

* feat: typecheck middleware 추가

* feat: authDTO 추가

* feat: 이메일 인증번호 전송, 확인, 비밀번호 변경 api 구현

* feat: controller 연결

* feat: router 연결

typeCheck middleware 추가
  • Loading branch information
hyundang authored Sep 6, 2021
1 parent f59b5e7 commit 484ce49
Show file tree
Hide file tree
Showing 9 changed files with 349 additions and 250 deletions.
18 changes: 18 additions & 0 deletions src/DTO/authDTO.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,24 @@ namespace authDTO {
email: string;
password: string;
}

export interface emailReqDTO {
email: string;
}

export interface codeReqDTO {
email: string;
emailCode: string;
}

export interface codeResDTO {
isOkay: boolean;
}

export interface passwordReqDTO {
email: string;
password: string;
}
}

export default authDTO;
287 changes: 177 additions & 110 deletions src/controller/auth.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Request, Response } from "express";
import { check, validationResult } from "express-validator";
import { validationResult } from "express-validator";
// libraries
import { response, returnCode } from "../library";
// services
Expand All @@ -14,9 +14,14 @@ import { authDTO } from "../DTO";
*/

const signupController = async (req: Request, res: Response) => {
// 이메일 형식이 잘못된 경우
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
return response.basicResponse(
res,
returnCode.BAD_REQUEST,
"요청 값이 올바르지 않습니다"
);
}

try {
Expand Down Expand Up @@ -57,9 +62,14 @@ const signupController = async (req: Request, res: Response) => {
*/

const signinController = async (req: Request, res: Response) => {
// 이메일 형식이 잘못된 경우
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
return response.basicResponse(
res,
returnCode.BAD_REQUEST,
"요청 값이 올바르지 않습니다"
);
}

try {
Expand Down Expand Up @@ -107,113 +117,167 @@ const signinController = async (req: Request, res: Response) => {
}
};

// /**
// * @이메일_인증번호_전송
// * @route Post auth/email
// * @access Public
// */

// router.post(
// "/email",
// [check("email", "Please include a valid email").isEmail()],
// async (req: Request, res: Response) => {
// const errors = validationResult(req);
// if (!errors.isEmpty()) {
// return res.status(400).json({ errors: errors.array() });
// }

// try {
// const data = await postEmail(req.body);

// // 요청 바디가 부족할 경우
// if (data == -1) {
// response(res, returnCode.BAD_REQUEST, "요청 값이 올바르지 않습니다");
// }
// // email이 DB에 없을 경우
// if (data == -2) {
// response(res, returnCode.BAD_REQUEST, "아이디가 존재하지 않습니다");
// }
// // 성공
// response(res, returnCode.OK, "인증번호 전송 성공");
// } catch (err) {
// console.error(err.message);
// response(res, returnCode.INTERNAL_SERVER_ERROR, "서버 오류");
// }
// }
// );

// /**
// * @인증번호_확인
// * @route Post auth/code
// * @access Public
// */

// router.post("/code", async (req: Request, res: Response) => {
// try {
// const data = await postCode(req.body);

// // 요청 바디가 부족할 경우
// if (data === -1) {
// response(res, returnCode.BAD_REQUEST, "요청 값이 올바르지 않습니다");
// }
// // email이 DB에 없을 경우
// if (data === -2) {
// response(res, returnCode.BAD_REQUEST, "아이디가 존재하지 않습니다");
// }
// // 인증번호가 올바르지 않은 경우
// if (data === -3) {
// dataResponse(res, returnCode.OK, "인증번호 인증 실패", { isOkay: false });
// }
// // 인증번호 인증 성공
// dataResponse(res, returnCode.OK, "인증번호 인증 성공", { isOkay: true });
// } catch (err) {
// console.error(err.message);
// response(res, returnCode.INTERNAL_SERVER_ERROR, "서버 오류");
// }
// });

// /**
// * @비밀번호_변경
// * @route Patch auth/pw
// * @desc Authenticate user & get token
// * @access Public
// */

// router.patch(
// "/pw",
// [
// check("email", "Please include a valid email").isEmail(),
// check(
// "password",
// "Please enter a password with 6 or more characters"
// ).isLength({ min: 6 }),
// ],
// async (req: Request, res: Response) => {
// const errors = validationResult(req);
// if (!errors.isEmpty()) {
// return res.status(400).json({ errors: errors.array() });
// }

// try {
// const reqData: pwReqDTO = req.body;
// const data = await patchPassword(reqData);

// // 요청 바디가 부족할 경우
// if (data === -1) {
// response(res, returnCode.BAD_REQUEST, "요청 값이 올바르지 않습니다");
// }
// // email이 DB에 없을 경우
// if (data === -2) {
// response(res, returnCode.BAD_REQUEST, "아이디가 존재하지 않습니다");
// }
// // 성공
// response(res, returnCode.OK, "비밀번호 변경 성공");
// } catch (err) {
// console.error(err.message);
// response(res, returnCode.INTERNAL_SERVER_ERROR, "서버 오류");
// }
// }
// );
/**
* @이메일_인증번호_전송
* @route Post auth/email
* @desc post email code for certification
* @access Public
*/

const postEmailController = async (req: Request, res: Response) => {
// 이메일 형식이 잘못된 경우
const errors = validationResult(req);
if (!errors.isEmpty()) {
return response.basicResponse(
res,
returnCode.BAD_REQUEST,
"요청 값이 올바르지 않습니다"
);
}

try {
const reqData: authDTO.emailReqDTO = req.body;
const resData: undefined | -1 | -2 | -3 = await authService.postEmail(
reqData
);

// 요청 바디가 부족할 경우
if (resData === -1) {
response.basicResponse(
res,
returnCode.BAD_REQUEST,
"요청 값이 올바르지 않습니다"
);
}
// email이 DB에 없을 경우
else if (resData === -2) {
response.basicResponse(
res,
returnCode.BAD_REQUEST,
"아이디가 존재하지 않습니다"
);
}
// 이메일 전송이 실패한 경우
else if (resData === -3) {
response.basicResponse(
res,
returnCode.SERVICE_UNAVAILABLE,
"이메일 전송이 실패하였습니다"
);
}
// 성공
else {
response.basicResponse(res, returnCode.NO_CONTENT, "인증번호 전송 성공");
}
} catch (err) {
console.error(err.message);
response.basicResponse(res, returnCode.INTERNAL_SERVER_ERROR, "서버 오류");
}
};

/**
* @인증번호_확인
* @route Post auth/code
* @desc check the certification code
* @access Public
*/

const postCodeController = async (req: Request, res: Response) => {
// 이메일 형식이 잘못된 경우
const errors = validationResult(req);
if (!errors.isEmpty()) {
return response.basicResponse(
res,
returnCode.BAD_REQUEST,
"요청 값이 올바르지 않습니다"
);
}

try {
const reqData: authDTO.codeReqDTO = req.body;
const resData: undefined | -1 | -2 | -3 = await authService.postCode(
reqData
);

// 요청 바디가 부족할 경우
if (resData === -1) {
response.basicResponse(
res,
returnCode.BAD_REQUEST,
"요청 값이 올바르지 않습니다"
);
}
// email이 DB에 없을 경우
if (resData === -2) {
response.basicResponse(
res,
returnCode.BAD_REQUEST,
"아이디가 존재하지 않습니다"
);
}
// 인증번호가 올바르지 않은 경우
if (resData === -3) {
response.dataResponse(res, returnCode.OK, "인증번호 인증 실패", {
isOkay: false,
});
}
// 인증번호 인증 성공
response.dataResponse(res, returnCode.OK, "인증번호 인증 성공", {
isOkay: true,
});
} catch (err) {
console.error(err.message);
response.basicResponse(res, returnCode.INTERNAL_SERVER_ERROR, "서버 오류");
}
};

/**
* @비밀번호_변경
* @route Patch auth/pw
* @desc change password
* @access Public
*/

const patchPasswordController = async (req: Request, res: Response) => {
// 이메일 형식 또는 비밀번호 형식이 잘못된 경우
const errors = validationResult(req);
if (!errors.isEmpty()) {
return response.basicResponse(
res,
returnCode.BAD_REQUEST,
"요청 값이 올바르지 않습니다"
);
}

try {
const reqData: authDTO.passwordReqDTO = req.body;
const data: undefined | -1 | -2 = await authService.patchPassword(reqData);

// 요청 바디가 부족할 경우
if (data === -1) {
response.basicResponse(
res,
returnCode.BAD_REQUEST,
"요청 값이 올바르지 않습니다"
);
}
// email이 DB에 없을 경우
else if (data === -2) {
response.basicResponse(
res,
returnCode.BAD_REQUEST,
"아이디가 존재하지 않습니다"
);
}
// 성공
else {
response.basicResponse(res, returnCode.NO_CONTENT, "비밀번호 변경 성공");
}
} catch (err) {
console.error(err.message);
response.basicResponse(res, returnCode.INTERNAL_SERVER_ERROR, "서버 오류");
}
};

/**
* @햄버거바
Expand All @@ -238,6 +302,9 @@ const authController = {
signinController,
signupController,
hamburgerController,
postEmailController,
postCodeController,
patchPasswordController,
};

export default authController;
2 changes: 1 addition & 1 deletion src/library/emailTemplete.ejs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@

<body>
<div class="wrap">
<p class="info_text">비밀번호 찾기를 위한 인증번호 입니다.</p>
<p class="info_text">💡 비밀번호 찾기를 위한 인증번호 입니다.</p>
<p class="info_text">비밀번호를 꼭 변경해주세요!</p>
<div class="info_code">
<%= authCode %>
Expand Down
5 changes: 3 additions & 2 deletions src/middleware/auth.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
// libararies
import { Request, Response } from "express";
import jwt from "jsonwebtoken";
import config from "../config";
import { response, returnCode } from "../library";

export default (req, res, next) => {
export default (req: Request, res: Response, next) => {
// 토큰 검사
if (req.headers.authorization == null) {
response.basicResponse(
Expand All @@ -17,7 +18,7 @@ export default (req, res, next) => {
// Verify token
try {
const decoded = jwt.verify(token, config.jwtSecret);

req.body.userID = decoded.user;
next();
} catch (err) {
Expand Down
1 change: 1 addition & 0 deletions src/middleware/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export { default as authMiddleware } from "./auth";
export { default as publicAuthMiddleware } from "./publicAuth";
export { default as typeCheckMiddleware } from "./typeCheck";
3 changes: 2 additions & 1 deletion src/middleware/publicAuth.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
// libararies
import { Request, Response } from "express";
import jwt from "jsonwebtoken";
import config from "../config";
import { response, returnCode } from "../library";

export default (req, res, next) => {
export default (req: Request, res: Response, next) => {
// 토큰 검사
if (req.headers.authorization == null) {
req.body.userID = null;
Expand Down
Loading

0 comments on commit 484ce49

Please sign in to comment.