From 83b102b961e062d7ecd1cfccfd03be0d0ec86f4f Mon Sep 17 00:00:00 2001 From: charbs0701 Date: Wed, 9 Aug 2023 04:34:21 +0900 Subject: [PATCH] =?UTF-8?q?[FIX]=20#02=20-=20=EC=B7=A8=EC=97=85=EA=B5=90?= =?UTF-8?q?=EC=9C=A1=EB=A6=AC=EC=8A=A4=ED=8A=B8=20API=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/baseResponseStatus.js | 5 +++ src/app/JobEdu/jobEduController.js | 37 ++++++++++---------- src/app/JobEdu/jobEduDao.js | 32 ++++++++++++------ src/app/JobEdu/jobEduProvider.js | 43 +++++++++++++++++++----- src/app/JobPosting/jobPostingDao.js | 2 +- src/app/JobPosting/jobPostingProvider.js | 1 - 6 files changed, 79 insertions(+), 41 deletions(-) diff --git a/config/baseResponseStatus.js b/config/baseResponseStatus.js index 6fed087..e027414 100644 --- a/config/baseResponseStatus.js +++ b/config/baseResponseStatus.js @@ -214,6 +214,11 @@ module.exports = { code: 404, message: "해당 취업교육이 존재하지 않습니다.", }, + JOBEDU_SEARCH_EMPTY: { + isSuccess: false, + code: 404, + message: "검색 결과가 없습니다.", + }, // JobPosting JOBPOSTING_ID_EMPTY: { diff --git a/src/app/JobEdu/jobEduController.js b/src/app/JobEdu/jobEduController.js index e141a0d..3bf299f 100644 --- a/src/app/JobEdu/jobEduController.js +++ b/src/app/JobEdu/jobEduController.js @@ -2,6 +2,7 @@ const jobEduProvider = require("./jobEduProvider"); const baseResponse = require("../../../config/baseResponseStatus"); const { response, errResponse } = require("../../../config/response"); +// 취업교육 목록 조회 export const getJobEduList = async (req, res) => { try { const page = req.query.page || 1; @@ -13,27 +14,13 @@ export const getJobEduList = async (req, res) => { page, active_status ); - - const totalCount = await jobEduProvider.retrieveJobEduListCount(); - const totalPage = Math.ceil(totalCount / pageSize); - - // 3. 사용자가 요청한 페이지 번호(`page`)가 총 페이지 수보다 큰지 확인한다. - if (page > totalPage) { - throw new Error("Page out of bounds"); - } - - const resultData = { - totalCount, - totalPage, - jobEduListResult, - }; - - return res.send(response(baseResponse.SUCCESS, resultData)); + + return res.send(response(baseResponse.SUCCESS, jobEduListResult)); } catch (error) { + console.error(error); if (error.message === "Page out of bounds") { return res.send(errResponse(baseResponse.PAGE_OUT_OF_BOUNDS_ERROR)); } - console.error(error); return res.send(errResponse(baseResponse.DB_ERROR)); } }; @@ -57,10 +44,14 @@ export const getJobEduById = async (req, res) => { return res.send(response(baseResponse.SUCCESS, jobEduByIdResult)); }; +// 취업교육 키워드 검색 export const getJobEduBySearch = async (req, res) => { const keyword = req.query.keyword; const page = req.query.page || 1; // 페이지 번호가 주어지지 않은 경우 기본값은 1 const pageSize = req.query.pageSize || 11; // 페이지 크기가 주어지지 않은 경우 기본값은 1 + const active_status = req.query.active_status; + + // 키워드가 없으면 에러 if (!keyword) { return res.status(400).json({ error: "keyword is required" }); } @@ -69,11 +60,17 @@ export const getJobEduBySearch = async (req, res) => { const data = await jobEduProvider.searchWithPagination( keyword, page, - pageSize + pageSize, + active_status ); return res.send(response(baseResponse.SUCCESS, data)); - } catch (err) { - console.log(err.stack); + } catch (error) { + if(error.message === "No search results") { + return res.send(errResponse(baseResponse.JOBEDU_SEARCH_EMPTY)); + } + if(error.message === "Page out of bounds") { + return res.send(errResponse(baseResponse.PAGE_OUT_OF_BOUNDS_ERROR)); + } res.status(500).json({ error: "Something went wrong" }); } }; diff --git a/src/app/JobEdu/jobEduDao.js b/src/app/JobEdu/jobEduDao.js index fc3483c..4119ed4 100644 --- a/src/app/JobEdu/jobEduDao.js +++ b/src/app/JobEdu/jobEduDao.js @@ -19,9 +19,10 @@ export const selectJobEduList = async function ( } }; -export const selectJobEduListCount = async function () { - const query = ` - select count(*) as total_count from job_educations; +export const selectJobEduListCount = async function (active_status) { + const query = active_status + ? `select count(*) as total_count from job_educations WHERE active_status = ${active_status};` + : ` select count(*) as total_count from job_educations; `; try { @@ -46,14 +47,18 @@ export const selectJobEduById = async function (jobEduId) { } }; +// 취업교육 검색결과 데이터 가져오는 쿼리 export const selectJobEduByKeyword = async function ( keyword, offset, - pageSize + pageSize, + active_status ) { - const query = ` - SELECT * FROM job_educations WHERE title LIKE '%${keyword}%' OR content LIKE '%${keyword}%' ORDER BY posted_at DESC LIMIT ${pageSize} OFFSET ${offset};`; - + const query = active_status + ? `SELECT * FROM job_educations WHERE (title LIKE '%${keyword}%' OR content LIKE '%${keyword}%') AND + active_status = ${active_status} ORDER BY posted_at DESC LIMIT ${pageSize} OFFSET ${offset};` + : `SELECT * FROM job_educations WHERE title LIKE '%${keyword}%' OR content LIKE '%${keyword}%' ORDER BY posted_at DESC LIMIT ${pageSize} OFFSET ${offset};`; + try { const result = await pool.query(query); return result.rows; @@ -63,9 +68,16 @@ export const selectJobEduByKeyword = async function ( } }; -export const selectJobEduTotalCountByKeyword = async function (keyword) { - const query = ` - SELECT count(*) as total_count FROM job_educations WHERE title LIKE '%${keyword}%' OR content LIKE '%${keyword}%';`; +// 취업교육 검색결과 데이터 갯수 세는 쿼리 +export const selectJobEduTotalCountByKeyword = async function ( + keyword, + active_status +) { + const query = active_status + ? `SELECT count(*) as total_count FROM job_educations WHERE (title LIKE '%${keyword}%' OR content LIKE '%${keyword}%') AND + active_status = ${active_status};` + : `SELECT count(*) as total_count FROM job_educations WHERE title LIKE '%${keyword}%' OR content LIKE '%${keyword}%'; + `; try { const result = await pool.query(query); diff --git a/src/app/JobEdu/jobEduProvider.js b/src/app/JobEdu/jobEduProvider.js index 0d75cb8..e1b76ea 100644 --- a/src/app/JobEdu/jobEduProvider.js +++ b/src/app/JobEdu/jobEduProvider.js @@ -3,13 +3,26 @@ const jobEduDao = require("./jobEduDao"); const { logger } = require("../../../config/winston"); +// 취업지원 목록 조회 export const retrieveJobEduList = async function (pageSize, page, active_status) { try { + // 1. 총 데이터의 개수를 알아낸다. + const totalCountResult = await jobEduDao.selectJobEduListCount(active_status); + const totalCount = totalCountResult.rows[0].total_count; + + // 2. 주어진 `pageSize`에 따라 총 페이지 수를 계산한다. + const totalPage = Math.ceil(totalCount / pageSize); + + // 3. 사용자가 요청한 페이지 번호(`page`)가 총 페이지 수보다 큰지 확인한다. + if (page > totalPage) { + throw new Error("Page out of bounds"); + } + const offset = (page - 1) * pageSize; const result = await jobEduDao.selectJobEduList(pageSize, offset, active_status); - return result; + return { totalCount, totalPage, result }; } catch (error) { - logger.error("DB 연결 실패"); + logger.error(error); throw error; } }; @@ -40,19 +53,31 @@ export const retrieveJobEduById = async function (jobEduId) { }; // 취업지원 검색 함수 -export const searchWithPagination = async function (keyword, page, pageSize) { +export const searchWithPagination = async function (keyword, page, pageSize, active_status) { try { + // 1. 총 데이터의 개수를 알아낸다. + const totalCount = await jobEduDao.selectJobEduTotalCountByKeyword(keyword, active_status); + // 검색결과가 없으면 에러 + if (parseInt(totalCount) === 0) { + throw new Error("No search results"); + } + + // 2. 주어진 `pageSize`에 따라 총 페이지 수를 계산한다. + const totalPage = Math.ceil(totalCount / pageSize); + + // 3. 사용자가 요청한 페이지 번호(`page`)가 총 페이지 수보다 큰지 확인한다. + if (page > totalPage) { + throw new Error("Page out of bounds"); + } + const offset = (page - 1) * pageSize; const result = await jobEduDao.selectJobEduByKeyword( keyword, offset, - pageSize + pageSize, + active_status ); - const totalCount = await jobEduDao.selectJobEduTotalCountByKeyword(keyword); - return { - totalCount: totalCount, - data: result, - }; + return { totalCount, totalPage, result }; } catch (error) { logger.error("DB 연결 실패"); logger.error(error); diff --git a/src/app/JobPosting/jobPostingDao.js b/src/app/JobPosting/jobPostingDao.js index 45167d1..92ceb2d 100644 --- a/src/app/JobPosting/jobPostingDao.js +++ b/src/app/JobPosting/jobPostingDao.js @@ -47,6 +47,7 @@ export const selectJobPostingById = async function (jobPostingId) { } }; +// 채용공고 검색결과 데이터 가져오는 쿼리 export const selectJobPostingByKeyword = async function ( keyword, offset, @@ -73,7 +74,6 @@ export const selectJobPostingTotalCountByKeyword = async function ( keyword, active_status ) { - console.log(active_status); const query = active_status ? `SELECT count(*) as total_count FROM job_postings WHERE (title LIKE '%${keyword}%' OR content LIKE '%${keyword}%') AND active_status = ${active_status};` diff --git a/src/app/JobPosting/jobPostingProvider.js b/src/app/JobPosting/jobPostingProvider.js index ca94d8e..1c96024 100644 --- a/src/app/JobPosting/jobPostingProvider.js +++ b/src/app/JobPosting/jobPostingProvider.js @@ -68,7 +68,6 @@ export const searchWithPagination = async function (keyword, page, pageSize, act keyword, active_status ); - console.log(totalCount); // 검색결과가 없으면 에러 if (parseInt(totalCount) === 0) { throw new Error("No search results");