diff --git a/src/domains/search/search.controller.js b/src/domains/search/search.controller.js index e8c3cc7..5e14dc9 100644 --- a/src/domains/search/search.controller.js +++ b/src/domains/search/search.controller.js @@ -1,7 +1,7 @@ import { response } from "../../config/response.js"; import { status } from "../../config/response.status.js"; import { getSearch, getCloth, getSearchResult, getSearchBrand, getMyCloth, getMyWish } from "./search.provider.js"; -import { addMyCloth, addMyWish, delMyWish, addMyFollow } from "./search.service.js"; +import { addMyCloth, addMyWish, delMyWish, addMyFollow, delMyFollow } from "./search.service.js"; export const searchPreview = async (req, res, next) => { console.log("검색 메인화면을 조회합니다"); @@ -57,4 +57,10 @@ export const addFollow = async (req, res, next) => { console.log("팔로우를 요청하였습니다!"); const userId = res.locals.uuid; res.send(response(status.SUCCESS, await addMyFollow(userId, req.params.clothId))); +} + +export const delFollow = async (req, res, next) => { + console.log("팔로우 취소를 요청하였습니다!"); + const userId = res.locals.uuid; + res.send(response(status.SUCCESS, await delMyFollow(userId, req.params.clothId))); } \ No newline at end of file diff --git a/src/domains/search/search.dao.js b/src/domains/search/search.dao.js index fd22a3a..56a685c 100644 --- a/src/domains/search/search.dao.js +++ b/src/domains/search/search.dao.js @@ -8,7 +8,7 @@ import { UserNicknameToClothId, UserCategoryToClothId, brandToBrandName, userIdToNickname, userToNickname, getBrandToBrandId, userToBrand, categoryToBrand, clothToBrand, clothCategoryToBrand, insertCloth, insertRealSize, getCloth, - addWishSQL, delWishSQL, getWishSQL, getFollowSQL, addFollowSQL } from "./search.sql.js"; + addWishSQL, delWishSQL, getWishSQL, getFollowSQL, addFollowSQL, delFollowSQL } from "./search.sql.js"; // nickname+cloth 반환 export const getNicknameToClothId = async (category) => { @@ -289,4 +289,22 @@ export const addFollowDAO = async (userId, clothId) => { }catch (err) { throw new BaseError(status.PARAMETER_IS_WRONG); } +} + +// Follow 취소 +export const delFollowDAO = async (userId, clothId) => { + try{ + const conn = await pool.getConnection(); + const to_user = await pool.query(getUserIdToClothId, clothId); + const is_exist = await pool.query(getFollowSQL, [userId, to_user[0][0].uuid]); + if(is_exist[0].length == 0){ + throw new BaseError(status.PARAMETER_IS_WRONG); + } + await pool.query(delFollowSQL, [userId, to_user[0][0].uuid]); + const follow = await pool.query(getFollowSQL, [userId, to_user[0][0].uuid]); + conn.release(); + return follow; + }catch (err) { + throw new BaseError(status.PARAMETER_IS_WRONG); + } } \ No newline at end of file diff --git a/src/domains/search/search.dto.js b/src/domains/search/search.dto.js index a7886d0..5ca8ab6 100644 --- a/src/domains/search/search.dto.js +++ b/src/domains/search/search.dto.js @@ -199,4 +199,13 @@ export const getWishDTO = (wish) => { export const addFollowDTO = (follow) => { return {"follow_id": follow}; +} + +export const delFollowDTO = (follow) => { + let follow_id; + if(follow[0].length == 0){ + follow_id = 0; + } + + return {"follow_id": follow_id}; } \ No newline at end of file diff --git a/src/domains/search/search.service.js b/src/domains/search/search.service.js index 290a32a..17813ec 100644 --- a/src/domains/search/search.service.js +++ b/src/domains/search/search.service.js @@ -1,7 +1,7 @@ import { BaseError } from "../../config/error.js"; import { status } from "../../config/response.status.js"; -import { addClothResponseDTO, addWishDTO, delWishDTO, addFollowDTO } from "./search.dto.js"; -import { clothAdd, getAddCloth, addWishDAO, delWishDAO, addFollowDAO } from "./search.dao.js"; +import { addClothResponseDTO, addWishDTO, delWishDTO, addFollowDTO, delFollowDTO } from "./search.dto.js"; +import { clothAdd, getAddCloth, addWishDAO, delWishDAO, addFollowDAO, delFollowDAO } from "./search.dao.js"; export const addMyCloth = async (userId, body) => { const requiredFields = ['name', 'product_code', 'category', 'size', 'fit']; @@ -58,4 +58,8 @@ export const delMyWish = async (userId, clothId) => { export const addMyFollow = async (userId, clothId) => { return addFollowDTO(await addFollowDAO(userId, clothId)); +} + +export const delMyFollow = async (userId, clothId) => { + return delFollowDTO(await delFollowDAO(userId, clothId)); } \ No newline at end of file diff --git a/src/domains/search/search.sql.js b/src/domains/search/search.sql.js index 7acff20..be3a4e6 100644 --- a/src/domains/search/search.sql.js +++ b/src/domains/search/search.sql.js @@ -115,4 +115,6 @@ export const getWishSQL = "SELECT id FROM wish WHERE cloth_id = ? AND wisher_uui export const getFollowSQL = "SELECT id FROM follow WHERE from_uuid = ? AND to_uuid = ? ;" -export const addFollowSQL = "INSERT INTO follow (from_uuid, to_uuid) VALUES (?, ?) ;" \ No newline at end of file +export const addFollowSQL = "INSERT INTO follow (from_uuid, to_uuid) VALUES (?, ?) ;" + +export const delFollowSQL = "DELETE FROM follow WHERE from_uuid = ? AND to_uuid = ? ;" \ No newline at end of file diff --git a/src/routes/search.js b/src/routes/search.js index 9304932..39b8fa5 100644 --- a/src/routes/search.js +++ b/src/routes/search.js @@ -2,7 +2,7 @@ import express from "express"; import asyncHandler from 'express-async-handler'; import { LoginCheck } from "../middlewares/logincheck.js"; import { searchPreview, clothView, searchView, brandView, addClothPreview, addCloth, - addWish, delWish, getWish, addFollow } from "../domains/search/search.controller.js"; + addWish, delWish, getWish, addFollow, delFollow } from "../domains/search/search.controller.js"; export const searchRouter = express.Router({mergeParams: true}); @@ -34,4 +34,7 @@ searchRouter.delete('/:clothId/wish', LoginCheck, asyncHandler(delWish)); searchRouter.get('/:clothId/wish', LoginCheck, asyncHandler(getWish)); //검색-follow에 추가 -searchRouter.post('/:clothId/follow', LoginCheck, asyncHandler(addFollow)); \ No newline at end of file +searchRouter.post('/:clothId/follow', LoginCheck, asyncHandler(addFollow)); + +//검색-follow에서 삭제 +searchRouter.delete('/:clothId/follow', LoginCheck, asyncHandler(delFollow)); \ No newline at end of file diff --git a/src/swagger/search.swagger.yaml b/src/swagger/search.swagger.yaml index 1a4b8aa..408deff 100644 --- a/src/swagger/search.swagger.yaml +++ b/src/swagger/search.swagger.yaml @@ -653,11 +653,7 @@ paths: data: type: array example: { - "clothData": [ - { - "wish_id": 20 - } - ] + "wish_id": 20 } '400': @@ -730,11 +726,7 @@ paths: data: type: array example: { - "clothData": [ - { - "wish_id": 20 - } - ] + "wish_id": 20 } '400': @@ -807,11 +799,7 @@ paths: data: type: array example: { - "clothData": [ - { - "wish_id": 20 - } - ] + "wish_id": 20 } '400': @@ -885,11 +873,80 @@ paths: data: type: array example: { - "clothData": [ - { - "wish_id": 20 - } - ] + "follow_id": 20 + } + + '400': + description: 잘못된 요청 + schema: + type: object + properties: + status: + type: integer + example: 400 + isSuccess: + type: boolean + example: false + code: + type: integer + example: COMMON001 + message: + type: string + example: 잘못된 요청입니다 + + '500': + description: 서버 에러 + schema: + type: object + properties: + status: + type: integer + example: 500 + isSuccess: + type: boolean + example: false + code: + type: integer + example: COMMON000 + message: + type: string + example: 서버 에러, 관리자에게 문의 바랍니다. + + delete: + tags: + - Search + summary: follow 취소 로직 + operationId: delFollow + security: + - bearerAuth: [] + parameters: + - name: clothId + in: path + required: true + schema: + type: integer + responses: + '200': + description: follow 취소 성공 + schema: + type: object + properties: + status: + type: integer + example: 200 + isSuccess: + type: boolean + example: true + code: + type: integer + example: 200 + message: + type: string + example: "success!" + data: + type: array + example: { + "follow_id": 0 } '400':