From da5f6ec2cd4dd85c15518134602ed95150f56ef6 Mon Sep 17 00:00:00 2001 From: seokahi Date: Thu, 24 Nov 2022 12:05:25 +0900 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=ED=9A=8C=EC=9B=90=EC=9D=80=20?= =?UTF-8?q?=EC=B0=A8=EB=8B=A8=ED=95=9C=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=A0=9C=EC=99=B8=ED=95=98=EA=B3=A0=20=ED=95=84=ED=84=B0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../routes/events/getCategorybyFiltering.ts | 3 +- src/service/EventService.ts | 95 +++++++++++++++---- 2 files changed, 76 insertions(+), 22 deletions(-) diff --git a/src/server/routes/events/getCategorybyFiltering.ts b/src/server/routes/events/getCategorybyFiltering.ts index f248396..a5a17e0 100644 --- a/src/server/routes/events/getCategorybyFiltering.ts +++ b/src/server/routes/events/getCategorybyFiltering.ts @@ -17,8 +17,9 @@ const schema = defineSchema({ }); export default defineRoute('get', '/events-by-category', schema, async (req, res) => { + const {userId} = req; const {categoryId , eventStatus} = req.query; - const eventCategoryInformation = await EventService.getCategorybyFiltering(categoryId,eventStatus); + const eventCategoryInformation = await EventService.getCategorybyFiltering(userId,categoryId,eventStatus); return res.json(eventCategoryInformation); }); diff --git a/src/service/EventService.ts b/src/service/EventService.ts index 2cd794c..11df561 100644 --- a/src/service/EventService.ts +++ b/src/service/EventService.ts @@ -9,8 +9,9 @@ import UserService from './UserService'; import SubscriptionService from './SubscriptionService'; import {Infer} from '../common/utils/zod'; import { EventRequestScheme} from '../entity/schemes'; -import {MoreThanOrEqual} from "typeorm"; +import {Any, MoreThanOrEqual} from "typeorm"; import { findConfigFile } from 'typescript'; +import { any } from 'zod'; class EventService { async makeEvent(userId: number, body: Infer): Promise { @@ -71,25 +72,33 @@ class EventService { } - async getCategorybyFiltering(categoryId?:number,eventStatus?:boolean): Promise { - switch(categoryId) { - case 0: if(eventStatus == true) return await Event.find({where: {endAt: MoreThanOrEqual(new Date()),category:"선택없음"},order: {id: 'DESC'}}); - else return await Event.find({where:{category:"선택없음"}}); - case 1: if(eventStatus == true) return await Event.find({where: {endAt: MoreThanOrEqual(new Date()),category:"동아리/소모임"},order: {id: 'DESC'}}); - else return await Event.find({where:{category:"동아리/소모임"}}); - case 2: if(eventStatus == true) return await Event.find({where: {endAt: MoreThanOrEqual(new Date()),category:"학생회"},order: {id: 'DESC'}}); - else return await Event.find({where:{category:"학생회"}}); - case 3: if(eventStatus == true) return await Event.find({where: {endAt: MoreThanOrEqual(new Date()),category:"간식나눔"},order: {id: 'DESC'}}); - else return await Event.find({where:{category:"간식나눔"}}); - case 4: if(eventStatus == true) return await Event.find({where: {endAt: MoreThanOrEqual(new Date()),category:"대회/공모전"},order: {id: 'DESC'}}); - else return await Event.find({where:{category:"대회/공모전"}}); - case 5: if(eventStatus == true) return await Event.find({where: {endAt: MoreThanOrEqual(new Date()),category:"스터디"},order: {id: 'DESC'}}); - else return await Event.find({where:{category:"스터디"}}); - case 6: if(eventStatus == true) return await Event.find({where: {endAt: MoreThanOrEqual(new Date()),category:"구인"},order: {id: 'DESC'}}); - else return await Event.find({where:{category:"구인"}}); - case 7: if(eventStatus == true) return await Event.find({where: {endAt: MoreThanOrEqual(new Date()),category:"기타"},order: {id: 'DESC'}}); - else return await Event.find({where:{category:"기타"}}); - default: return await this.getEvents(); + async getCategorybyFiltering(userId?:number,categoryId?:number,eventStatus?:boolean): Promise { + + if(categoryId == undefined || eventStatus == undefined) { + categoryId = 0; // 기본 값 : 선택없음 카테고리 + eventStatus = false; + } + + let category ="" + if(categoryId == 0) category = "선택없음"; + else if(categoryId == 1) category = "동아리/소모임"; + else if(categoryId == 2) category = "학생회"; + else if(categoryId == 3) category = "간식나눔"; + else if(categoryId == 4) category = "대회/공모전"; + else if(categoryId == 6) category = "스터디"; + else if(categoryId == 7) category="구인"; + else if (categoryId == 8) category="기타"; + else category = "선택없음"; + + if(userId == null) { // 로그인 X + if(eventStatus == true) // 진행 중인 이벤트만 + { return await Event.find({where: {endAt: MoreThanOrEqual(new Date()),category:category},order: {id: 'DESC'}});} + else //모든 이벤트 다 + { return await Event.find({where:{category:category}}); } + } + + else { // 로그인 한 사용자 + return await this.getEventsWithoutBlockedUserbyFiltering(userId, category, eventStatus); // 로그인 한 사람은 blocking user 빼고 } } @@ -137,7 +146,7 @@ class EventService { WHERE block.blocking_user_id = :requestorId )`, {requestorId}) .orderBy('event.id', 'DESC') - .getMany(); // group by 안해도 얘가 잘 처리해줌 ^~^ + .getMany()// group by 안해도 얘가 잘 처리해줌 ^~^ } // 차단된 사용자 제외하고 페이지 별로 내려주기 NEW @@ -162,6 +171,50 @@ class EventService { .getMany(); // group by 안해도 얘가 잘 처리해줌 ^~^ } + //차단한 사용자 제외하고 필터링 + private async getEventsWithoutBlockedUserbyFiltering(requestorId: number, category:string, eventStatus:boolean ): Promise { + if(eventStatus == true) { // 진행중인 이벤트만 가져옴 + return await Event.createQueryBuilder('event') + /** relations 필드 가져오는 부분 */ + .leftJoinAndSelect('event.user', 'user') + .leftJoinAndSelect('event.comments', 'comments') + .leftJoinAndSelect('event.likes', 'likes') + .leftJoinAndSelect('event.notifications', 'notifications') + + /** where 절을 위한 join(select는 안 함) */ + .leftJoin('event.user', 'event_composer') + .where(`event_composer.id NOT IN ( + SELECT blocked_user_id + FROM block + WHERE block.blocking_user_id = :requestorId + )`, {requestorId}) + .andWhere(`event.endAt >= :date`,{date :new Date()}) + .andWhere(`event.category = :category`,{category:category}) + .orderBy('event.id', 'DESC') + .getMany() // group by 안해도 얘가 잘 처리해줌 ^~^ + } + else { // 모든 이벤트 가져옴 + return await Event.createQueryBuilder('event') + /** relations 필드 가져오는 부분 */ + .leftJoinAndSelect('event.user', 'user') + .leftJoinAndSelect('event.comments', 'comments') + .leftJoinAndSelect('event.likes', 'likes') + .leftJoinAndSelect('event.notifications', 'notifications') + + /** where 절을 위한 join(select는 안 함) */ + .leftJoin('event.user', 'event_composer') + .where(`event_composer.id NOT IN ( + SELECT blocked_user_id + FROM block + WHERE block.blocking_user_id = :requestorId + )`, {requestorId}) + .andWhere(`event.category = :category`,{category:category}) + .orderBy('event.id', 'DESC') + .getMany() // group by 안해도 얘가 잘 처리해줌 ^~^ + } + } + + /** From 93b58936c2f688a0c2dd1dd089553c6547ddb67f Mon Sep 17 00:00:00 2001 From: seokahi Date: Thu, 24 Nov 2022 16:34:51 +0900 Subject: [PATCH 2/5] =?UTF-8?q?feat:=20=ED=95=84=ED=84=B0=EB=A7=81?= =?UTF-8?q?=ED=95=A0=20=EB=95=8C=20=20=ED=8E=98=EC=9D=B4=EC=A7=95=EB=8F=84?= =?UTF-8?q?=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../routes/events/getCategorybyFiltering.ts | 9 +++-- src/service/EventService.ts | 33 +++++++++++-------- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/server/routes/events/getCategorybyFiltering.ts b/src/server/routes/events/getCategorybyFiltering.ts index a5a17e0..e9c84bc 100644 --- a/src/server/routes/events/getCategorybyFiltering.ts +++ b/src/server/routes/events/getCategorybyFiltering.ts @@ -6,11 +6,14 @@ import {EventResponseScheme} from '../../../entity/schemes'; const schema = defineSchema({ summary: '카테고리 별로 필터링해서 가져옵니다', - description: 'categoryId => 선택없음:0 동아리/소모임:1 학생회:2 간식나눔:3 대회/공모전:4 스터디:5 구인:6 기타:7 진행중인 이벤트: 8 | eventStatus => true 일 경우 해당 카테고리 중애서 진행 중인 이벤트만 가져옴, false 일 경우 진행 중인 이벤트와 상관없이 해당 카테고리 이벤트 다 가져옴', + description: `categoryId => 선택없음:0 동아리/소모임:1 학생회:2 간식나눔:3 대회/공모전:4 스터디:5 구인:6 기타:7 진행중인 이벤트: 8 `+ + `eventStatus => true 일 경우 해당 카테고리 중애서 진행 중인 이벤트만 가져옴, false 일 경우 진행 중인 이벤트와 상관없이 해당 카테고리 이벤트 다 가져옴`, query: { categoryId: stringAsInt, eventStatus: stringAsBoolean, + pageNum: stringAsInt.optional(), + pageSize:stringAsInt.optional() }, response: EventResponseScheme, @@ -18,8 +21,8 @@ const schema = defineSchema({ export default defineRoute('get', '/events-by-category', schema, async (req, res) => { const {userId} = req; - const {categoryId , eventStatus} = req.query; + const {categoryId , eventStatus,pageNum,pageSize} = req.query; - const eventCategoryInformation = await EventService.getCategorybyFiltering(userId,categoryId,eventStatus); + const eventCategoryInformation = await EventService.getCategorybyFiltering(userId,categoryId,eventStatus,pageNum,pageSize); return res.json(eventCategoryInformation); }); diff --git a/src/service/EventService.ts b/src/service/EventService.ts index 11df561..3151509 100644 --- a/src/service/EventService.ts +++ b/src/service/EventService.ts @@ -72,13 +72,14 @@ class EventService { } - async getCategorybyFiltering(userId?:number,categoryId?:number,eventStatus?:boolean): Promise { - - if(categoryId == undefined || eventStatus == undefined) { - categoryId = 0; // 기본 값 : 선택없음 카테고리 - eventStatus = false; + async getCategorybyFiltering(userId?:number,categoryId?:number,eventStatus?:boolean,pageNum?:number, pageSize?:number): Promise { + if(eventStatus == undefined) eventStatus = false; // 비어있으면 전체 가져옴 + + if(pageNum == undefined || pageSize == undefined) { // 하나라도 비어있으면 + pageNum = 0; + pageSize = 0; // 전체 가져오는걸로! } - + let category ="" if(categoryId == 0) category = "선택없음"; else if(categoryId == 1) category = "동아리/소모임"; @@ -90,15 +91,17 @@ class EventService { else if (categoryId == 8) category="기타"; else category = "선택없음"; - if(userId == null) { // 로그인 X - if(eventStatus == true) // 진행 중인 이벤트만 - { return await Event.find({where: {endAt: MoreThanOrEqual(new Date()),category:category},order: {id: 'DESC'}});} - else //모든 이벤트 다 - { return await Event.find({where:{category:category}}); } + if(userId == undefined) { // 로그인 X + if(eventStatus == true) { + return await Event.find({where: {endAt: MoreThanOrEqual(new Date()),category:category},order: {id: 'DESC'},skip: pageSize * pageNum,take: pageSize}); + } else { + return await Event.find({where:{category:category},skip: pageSize * pageNum,take: pageSize}); + } + } else { // 로그인 한 사용자 - return await this.getEventsWithoutBlockedUserbyFiltering(userId, category, eventStatus); // 로그인 한 사람은 blocking user 빼고 + return await this.getEventsWithoutBlockedUserbyFiltering(userId, category, eventStatus,pageNum,pageSize); // 로그인 한 사람은 blocking user 빼고 } } @@ -172,7 +175,7 @@ class EventService { } //차단한 사용자 제외하고 필터링 - private async getEventsWithoutBlockedUserbyFiltering(requestorId: number, category:string, eventStatus:boolean ): Promise { + private async getEventsWithoutBlockedUserbyFiltering(requestorId: number, category:string, eventStatus:boolean,pageNum:number, pageSize:number): Promise { if(eventStatus == true) { // 진행중인 이벤트만 가져옴 return await Event.createQueryBuilder('event') /** relations 필드 가져오는 부분 */ @@ -190,6 +193,8 @@ class EventService { )`, {requestorId}) .andWhere(`event.endAt >= :date`,{date :new Date()}) .andWhere(`event.category = :category`,{category:category}) + .take(pageSize) + .skip(pageSize * pageNum) // 페이징 적용 .orderBy('event.id', 'DESC') .getMany() // group by 안해도 얘가 잘 처리해줌 ^~^ } @@ -209,6 +214,8 @@ class EventService { WHERE block.blocking_user_id = :requestorId )`, {requestorId}) .andWhere(`event.category = :category`,{category:category}) + .take(pageSize) + .skip(pageSize * pageNum) // 페이징 적용 .orderBy('event.id', 'DESC') .getMany() // group by 안해도 얘가 잘 처리해줌 ^~^ } From 3f6bbfec39ee9e98a27ac9f0446226bc9f845b23 Mon Sep 17 00:00:00 2001 From: seokahi Date: Thu, 24 Nov 2022 16:39:47 +0900 Subject: [PATCH 3/5] =?UTF-8?q?chore:=20descrdescription=20=EB=B3=B4?= =?UTF-8?q?=EC=B6=A9=20=EC=84=A4=EB=AA=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/routes/events/getCategorybyFiltering.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/server/routes/events/getCategorybyFiltering.ts b/src/server/routes/events/getCategorybyFiltering.ts index e9c84bc..0997f2e 100644 --- a/src/server/routes/events/getCategorybyFiltering.ts +++ b/src/server/routes/events/getCategorybyFiltering.ts @@ -6,8 +6,9 @@ import {EventResponseScheme} from '../../../entity/schemes'; const schema = defineSchema({ summary: '카테고리 별로 필터링해서 가져옵니다', - description: `categoryId => 선택없음:0 동아리/소모임:1 학생회:2 간식나눔:3 대회/공모전:4 스터디:5 구인:6 기타:7 진행중인 이벤트: 8 `+ - `eventStatus => true 일 경우 해당 카테고리 중애서 진행 중인 이벤트만 가져옴, false 일 경우 진행 중인 이벤트와 상관없이 해당 카테고리 이벤트 다 가져옴`, + description: `categoryId : 선택없음:0 동아리/소모임:1 학생회:2 간식나눔:3 대회/공모전:4 스터디:5 구인:6 기타:7`+ + `eventStatus : true 일 경우 해당 카테고리 중애서 진행 중인 이벤트만 가져옴, false 일 경우 진행 중인 이벤트와 상관없이 해당 카테고리 이벤트 다 가져옴`+ + `페이징 적용(http://uniletter.inuappcenter.kr/#/default/get_events 참고)`, query: { categoryId: stringAsInt, From 1a522f3d005b5cd454231cf732ea210763cb4634 Mon Sep 17 00:00:00 2001 From: seokahi Date: Thu, 24 Nov 2022 16:44:22 +0900 Subject: [PATCH 4/5] =?UTF-8?q?chore:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/service/EventService.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/service/EventService.ts b/src/service/EventService.ts index 3151509..5be11f2 100644 --- a/src/service/EventService.ts +++ b/src/service/EventService.ts @@ -9,9 +9,8 @@ import UserService from './UserService'; import SubscriptionService from './SubscriptionService'; import {Infer} from '../common/utils/zod'; import { EventRequestScheme} from '../entity/schemes'; -import {Any, MoreThanOrEqual} from "typeorm"; -import { findConfigFile } from 'typescript'; -import { any } from 'zod'; +import { MoreThanOrEqual} from "typeorm"; + class EventService { async makeEvent(userId: number, body: Infer): Promise { From 542c319ab6a4f5aa50b850d93e02f931b191e350 Mon Sep 17 00:00:00 2001 From: seokahi Date: Thu, 24 Nov 2022 21:03:23 +0900 Subject: [PATCH 5/5] =?UTF-8?q?chore:=20event=20=EB=82=B4=EB=A6=BC?= =?UTF-8?q?=EC=B0=A8=EC=88=9C=EC=9C=BC=EB=A1=9C=20=EB=B6=88=EB=9F=AC?= =?UTF-8?q?=EC=98=A4=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/service/EventService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/service/EventService.ts b/src/service/EventService.ts index 5be11f2..93d99d3 100644 --- a/src/service/EventService.ts +++ b/src/service/EventService.ts @@ -94,7 +94,7 @@ class EventService { if(eventStatus == true) { return await Event.find({where: {endAt: MoreThanOrEqual(new Date()),category:category},order: {id: 'DESC'},skip: pageSize * pageNum,take: pageSize}); } else { - return await Event.find({where:{category:category},skip: pageSize * pageNum,take: pageSize}); + return await Event.find({where:{category:category},order: {id: 'DESC'},skip: pageSize * pageNum,take: pageSize}); } }