From dbac9bfbd6148d0a7cac3ac717a68fd1c4f74704 Mon Sep 17 00:00:00 2001 From: E ON Date: Mon, 29 May 2023 02:25:29 +0900 Subject: [PATCH 1/2] =?UTF-8?q?[BMOL-28]=20Feat:=20Add=20=EC=98=A4?= =?UTF-8?q?=EB=8A=98=20=ED=95=9C=EC=A4=84=20=EB=93=B1=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/index.js | 5 +- src/controllers/onelinerController.js | 54 ++++++++++++++++++ src/dao/index.js | 5 +- src/dao/onelinerDao.js | 46 +++++++++++++++ src/dao/repositories/onelinerRepository.js | 65 ++++++++++++++++++++++ src/routes/v1/index.js | 3 +- src/routes/v1/onelinerRouteV1.js | 15 +++++ src/services/index.js | 3 +- src/services/onelinerService.js | 38 +++++++++++++ 9 files changed, 228 insertions(+), 6 deletions(-) create mode 100644 src/controllers/onelinerController.js create mode 100644 src/dao/onelinerDao.js create mode 100644 src/dao/repositories/onelinerRepository.js create mode 100644 src/routes/v1/onelinerRouteV1.js create mode 100644 src/services/onelinerService.js diff --git a/src/controllers/index.js b/src/controllers/index.js index 9a2d33d..4f68d7a 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -6,7 +6,7 @@ const bookTimerController = require("./bookTimerController"); const libraryController = require('./libraryController') const lastPageController = require("./lastPageController"); const bookShelfController = require("./bookShelfController"); - +const onelinerController = require("./onelinerController"); module.exports = { ...healthcheckController, @@ -16,5 +16,6 @@ module.exports = { ...bookTimerController, ...bookShelfController, ...lastPageController, - ...libraryController + ...libraryController, + ...onelinerController } diff --git a/src/controllers/onelinerController.js b/src/controllers/onelinerController.js new file mode 100644 index 0000000..2398f35 --- /dev/null +++ b/src/controllers/onelinerController.js @@ -0,0 +1,54 @@ +const { OnelinerService } = require('../services') + + +const postOneliner = async (ctx) => { + const userId = ctx.request.headers.user_id; + + const { + book_id, + title, + authors, + oneliner, + color, + top, + left, + font, + font_size, + bg_image_url + } = ctx.request.body; + + const onelinerService = new OnelinerService(); + + const result = await onelinerService.postOneliner(userId, book_id, + title, + authors, + oneliner, + color, + top, + left, + font, + font_size, + bg_image_url); + + const data = { + oneliner: + result.data + + } + const meta = { + sortType: "latest", + continuousToken: "0", + currentPage: "0", + requestId: ctx.state.requestId, + now: +new Date(), +}; + + ctx.body = { + data: data, + meta + }; +}; + +module.exports = { + postOneliner +} \ No newline at end of file diff --git a/src/dao/index.js b/src/dao/index.js index 8095edb..477f558 100644 --- a/src/dao/index.js +++ b/src/dao/index.js @@ -7,7 +7,7 @@ const readingHistoryDao = require('./bookTimerDao') const mylistDao = require('./mylistDao') const lastPageDao = require("./lastPageDao"); const bookShelfDao = require("./bookShelfDao"); - +const onelinerDao = require("./onelinerDao"); module.exports = { ...accountDao, @@ -15,5 +15,6 @@ module.exports = { ...readingHistoryDao, ...bookShelfDao, ...lastPageDao, - ...mylistDao + ...mylistDao, + ...onelinerDao } diff --git a/src/dao/onelinerDao.js b/src/dao/onelinerDao.js new file mode 100644 index 0000000..9cdfa0c --- /dev/null +++ b/src/dao/onelinerDao.js @@ -0,0 +1,46 @@ +const { OnelinerRepository } = require('./repositories/onelinerRepository') + +class OnelinerDao { + constructor(){ + this._daoName = 'OnelinerDao' + } + + get daoName(){ + return this._daoName + } + + + async postOneliner(userId, book_id, title, authors,oneliner, color,top,left,font,font_size,bg_image_url){ + + const OnelinerRepo = new OnelinerRepository(); + const userInfo = await OnelinerRepo.getUserInfoByUserId(userId); + + const profileImageUrlJSON = JSON.stringify(userInfo[0].profile_image_url); + const nicknameJSON = JSON.stringify(userInfo[0].nickname); + const authorsJSON = JSON.stringify(authors); + + const onelinerInfo = await OnelinerRepo.postOneliner( + profileImageUrlJSON, + nicknameJSON, + userId, + book_id, + title, + authorsJSON, + oneliner, + color, + top, + left, + font, + font_size, + bg_image_url) + + const onelinerInfoResult = await OnelinerRepo.getOnelinerInfoByBookId(onelinerInfo.book_id) + + const result = { + data : onelinerInfoResult, + } + return result + } +} + +module.exports = { OnelinerDao } \ No newline at end of file diff --git a/src/dao/repositories/onelinerRepository.js b/src/dao/repositories/onelinerRepository.js new file mode 100644 index 0000000..b1e3450 --- /dev/null +++ b/src/dao/repositories/onelinerRepository.js @@ -0,0 +1,65 @@ +const pgClient = require('../connections/postgresql') + + class OnelinerRepository { + constructor(){ + this._repositoryName = 'OnelinerRepository' + } + get name(){ + return this._repositoryName + } + // 결과 호출을 위한 쿼리 + async getOnelinerInfoByBookId(book_id){ + const query = pgClient.select('*') + .from('tbl_oneliner') + .where('tbl_oneliner.book_id', book_id) + return query + } + // UserInfo를 가져오기 위한 쿼리 (profile_image, nickname) + async getUserInfoByUserId(user_id){ + const query = pgClient.select('profile_image_url','nickname') + .from('tbl_account') + .where('tbl_account.id', user_id) + return query + } + + async postOneliner( + profile_image_url, + nickname, + userId, + book_id, + title, + authors, + oneliner, + color, + top, + left, + font, + font_size, + bg_image_url) { + + const query = pgClient('tbl_oneliner').insert({ + id: pgClient.raw("gen_random_uuid()"), + user_id: userId, + profile_image: profile_image_url, + nickname: nickname, + book_id: book_id, + title: title, + authors: authors, + oneliner: oneliner, + color: color, + top: top, + left: left, + font: font, + font_size: font_size, + bg_image_url: bg_image_url + }).returning('book_id'); + const result = await query; // 쿼리 실행 및 결과 받기 + + return result[0]; // book_id 반환 + } + + } + + module.exports = { + OnelinerRepository, + }; \ No newline at end of file diff --git a/src/routes/v1/index.js b/src/routes/v1/index.js index 60db3e6..c7d4cb6 100644 --- a/src/routes/v1/index.js +++ b/src/routes/v1/index.js @@ -8,6 +8,7 @@ const { lastPageRouteV1 } = require("./lastPageRouteV1"); const { libraryRouteV1 } = require('./libraryRouteV1') const { bookShelfRouteV1 } = require("./bookShelfRouteV1"); +const { onelinerRouteV1 } = require("./onelinerRouteV1"); const V1 = () => { const router = Router(); @@ -18,7 +19,7 @@ const V1 = () => { lastPageRouteV1(router); libraryRouteV1(router); bookShelfRouteV1(router); - + onelinerRouteV1(router); return router; }; diff --git a/src/routes/v1/onelinerRouteV1.js b/src/routes/v1/onelinerRouteV1.js new file mode 100644 index 0000000..d22deb3 --- /dev/null +++ b/src/routes/v1/onelinerRouteV1.js @@ -0,0 +1,15 @@ +const Router = require("koa-router"); +const onelinerController = require("../../controllers/onelinerController"); + +const onelinerRouteAPIV1 = (root)=>{ + const router = Router(); + + router.post('/', onelinerController.postOneliner); + + root.use('/oneliner', router.routes()) +} + +const onelinerRouteV1 = (root)=>{ + onelinerRouteAPIV1(root) +} +module.exports = { onelinerRouteV1 } \ No newline at end of file diff --git a/src/services/index.js b/src/services/index.js index b4ee35c..e8d8a9e 100644 --- a/src/services/index.js +++ b/src/services/index.js @@ -9,7 +9,7 @@ const DecoratorService = require("../dao/bookTimerDecorator"); const bookShelfService = require("./bookShelfService"); const lastPageService = require("./lastPageService"); const mylistService = require('./mylistService') - +const onelinerService = require('./onelinerService'); module.exports = { ...healthcheckService, @@ -23,4 +23,5 @@ module.exports = { ...DecoratorService, ...bookShelfService, ...lastPageService, + ...onelinerService, }; diff --git a/src/services/onelinerService.js b/src/services/onelinerService.js new file mode 100644 index 0000000..8546bf0 --- /dev/null +++ b/src/services/onelinerService.js @@ -0,0 +1,38 @@ +const { + OnelinerDao + } = require("../dao/onelinerDao"); + + const validator = require('validator') + const { InvalidUUID, AccountNotFound, MyBookNotFound } = require('./errorService'); + +class OnelinerService { + constructor(){ + this._serviceName = 'onelinerService' + } + + get serviceName(){ + return this._serviceName + } + + async postOneliner(userId, book_id, title, authors, oneliner, color, top, left, font, font_size, bg_image_url){ + const onelinerDao = new OnelinerDao() + const onelinerRows = await onelinerDao.postOneliner( + userId, + book_id, + title, + authors, + oneliner, + color, + top, + left, + font, + font_size, + bg_image_url) + + return onelinerRows + } + + +} + +module.exports = { OnelinerService }; From c7116809ac2df16c31e1a3bc5b5983d6ff420fdb Mon Sep 17 00:00:00 2001 From: E ON Date: Tue, 30 May 2023 01:04:01 +0900 Subject: [PATCH 2/2] =?UTF-8?q?[BMOL-28]=20Feat/Refactor:=20Add=20UUID=20c?= =?UTF-8?q?heck=20for=20userId=20and=20bookId,=20postOneliner=EC=97=90?= =?UTF-8?q?=EC=84=9C=20parameters=EB=A5=BC=20object=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/onelinerController.js | 23 +++++----- src/services/onelinerService.js | 61 ++++++++++++++++++--------- 2 files changed, 55 insertions(+), 29 deletions(-) diff --git a/src/controllers/onelinerController.js b/src/controllers/onelinerController.js index 2398f35..0549565 100644 --- a/src/controllers/onelinerController.js +++ b/src/controllers/onelinerController.js @@ -19,16 +19,19 @@ const postOneliner = async (ctx) => { const onelinerService = new OnelinerService(); - const result = await onelinerService.postOneliner(userId, book_id, - title, - authors, - oneliner, - color, - top, - left, - font, - font_size, - bg_image_url); + const result = await onelinerService.postOneliner({ + userId: userId, + book_id: book_id, + title: title, + authors: authors, + oneliner: oneliner, + color: color, + top: top, + left: left, + font: font, + font_size: font_size, + bg_image_url: bg_image_url + }); const data = { oneliner: diff --git a/src/services/onelinerService.js b/src/services/onelinerService.js index 8546bf0..2440165 100644 --- a/src/services/onelinerService.js +++ b/src/services/onelinerService.js @@ -13,26 +13,49 @@ class OnelinerService { get serviceName(){ return this._serviceName } - - async postOneliner(userId, book_id, title, authors, oneliner, color, top, left, font, font_size, bg_image_url){ - const onelinerDao = new OnelinerDao() + + async postOneliner(data) { + const { + userId, + book_id, + title, + authors, + oneliner, + color, + top, + left, + font, + font_size, + bg_image_url + } = data; + + // UUID type check + if (!validator.isUUID(userId)) { + throw new InvalidUUID(userId); + } + + if (!validator.isUUID(book_id)) { + throw new InvalidUUID(book_id); + } + + const onelinerDao = new OnelinerDao(); const onelinerRows = await onelinerDao.postOneliner( - userId, - book_id, - title, - authors, - oneliner, - color, - top, - left, - font, - font_size, - bg_image_url) - - return onelinerRows - } - - + userId, + book_id, + title, + authors, + oneliner, + color, + top, + left, + font, + font_size, + bg_image_url + ); + + return onelinerRows; + } + } module.exports = { OnelinerService };