Skip to content

Commit

Permalink
Merge pull request #24 from inu-appcenter/filtering
Browse files Browse the repository at this point in the history
Filtering
  • Loading branch information
seokahi committed Nov 24, 2022
2 parents 7d8f8e2 + 542c319 commit fdffdbb
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 25 deletions.
11 changes: 8 additions & 3 deletions src/server/routes/events/getCategorybyFiltering.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,24 @@ 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,
eventStatus: stringAsBoolean,
pageNum: stringAsInt.optional(),
pageSize:stringAsInt.optional()
},

response: EventResponseScheme,
});

export default defineRoute('get', '/events-by-category', schema, async (req, res) => {
const {categoryId , eventStatus} = req.query;
const {userId} = req;
const {categoryId , eventStatus,pageNum,pageSize} = req.query;

const eventCategoryInformation = await EventService.getCategorybyFiltering(categoryId,eventStatus);
const eventCategoryInformation = await EventService.getCategorybyFiltering(userId,categoryId,eventStatus,pageNum,pageSize);
return res.json(eventCategoryInformation);
});
103 changes: 81 additions & 22 deletions src/service/EventService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ import UserService from './UserService';
import SubscriptionService from './SubscriptionService';
import {Infer} from '../common/utils/zod';
import { EventRequestScheme} from '../entity/schemes';
import {MoreThanOrEqual} from "typeorm";
import { findConfigFile } from 'typescript';
import { MoreThanOrEqual} from "typeorm";


class EventService {
async makeEvent(userId: number, body: Infer<typeof EventRequestScheme>): Promise<Event> {
Expand Down Expand Up @@ -71,25 +71,36 @@ class EventService {

}

async getCategorybyFiltering(categoryId?:number,eventStatus?:boolean): Promise<Event[]> {
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,pageNum?:number, pageSize?:number): Promise<Event[]> {
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 = "동아리/소모임";
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 == 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},order: {id: 'DESC'},skip: pageSize * pageNum,take: pageSize});
}

}

else { // 로그인 한 사용자
return await this.getEventsWithoutBlockedUserbyFiltering(userId, category, eventStatus,pageNum,pageSize); // 로그인 한 사람은 blocking user 빼고
}
}

Expand Down Expand Up @@ -137,7 +148,7 @@ class EventService {
WHERE block.blocking_user_id = :requestorId
)`, {requestorId})
.orderBy('event.id', 'DESC')
.getMany(); // group by 안해도 얘가 잘 처리해줌 ^~^
.getMany()// group by 안해도 얘가 잘 처리해줌 ^~^
}

// 차단된 사용자 제외하고 페이지 별로 내려주기 NEW
Expand All @@ -162,6 +173,54 @@ class EventService {
.getMany(); // group by 안해도 얘가 잘 처리해줌 ^~^
}

//차단한 사용자 제외하고 필터링
private async getEventsWithoutBlockedUserbyFiltering(requestorId: number, category:string, eventStatus:boolean,pageNum:number, pageSize:number): Promise<Event[]> {
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})
.take(pageSize)
.skip(pageSize * pageNum) // 페이징 적용
.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})
.take(pageSize)
.skip(pageSize * pageNum) // 페이징 적용
.orderBy('event.id', 'DESC')
.getMany() // group by 안해도 얘가 잘 처리해줌 ^~^
}
}




/**
Expand Down

0 comments on commit fdffdbb

Please sign in to comment.