////
Search
🔥

Mini-OTL 개발

필수 조건

과제에서는 Nest.js + TypeScript + Prisma + MySQL을 사용합니다
해당 기술 스택으로 프로젝트를 세팅해주세요!
git사용 (반드시 개발 history를 남겨주세요)

권장 사항

API 테스트는 Postman을 사용

참고

구현 사항

아래 요건을 모두 만족하도록 DB Schema를 작성하고, 요청 사항을 처리하는 API 서버를 구현해 주세요.

공통

1.
리소스의 삭제는 Soft Delete 방식을 사용합니다.
2.
Production과 development의 두 환경을 갖도록 구현합니다. 환경 별 차이는 다음과 같습니다.
a.
각 환경이 사용하는 데이터베이스는 서로 달라야 합니다.
b.
Development 환경의 경우, 각 API가 호출될 때마다 로그가 출력되어야 합니다. ex) GET /users/1 has been excuted

Authentication

1.
유저는 이메일 / 패스워드를 이용해 로그인할 수 있습니다.
2.
로그인한 유저는 JWT 토큰을 발급 받고, 이후 모든 API에서 본인 인증 수단으로 사용합니다.
3.
Access Token의 제한 시간은 한 시간, Refresh Token의 제한 시간은 30일입니다.

User

1.
사용자는 이메일, 성, 이름, 전공을 가지고 있습니다.
2.
본인의 프로필만 조회가 가능하고, 다른 이들의 프로필은 조회할 수 없습니다.
3.
프로필을 조회하는 경우, 아래 정보가 포함되어야합니다.
a.
이메일
b.
성, 이름
c.
전공
d.
들었던 과목
e.
작성한 리뷰

Department

1.
여러 개의 학과가 존재합니다.
2.
다음 학과를 포함하여 과제를 수행해주시면 됩니다.
a.
기계공학과 (ME)
b.
전기및전자공학부 (EE)
c.
기술경영학부 (BTM)
d.
산업디자인학과 (ID)
e.
산업및시스템공학과 (IE)
f.
융합인재학부 (TS)
g.
전산학부 (CS)
3.
학생별 전공으로도 사용될 수 있고, 과목이 어느 학과와 관련되어있는지도 나타낼 수 있습니다.
4.
다음 정보를 포함해주세요.
a.
학과 이름(국문), 이름(영문), 학과 코드

Professor

1.
각 학과에는 여러 분의 교수님이 존재합니다.
2.
교수님은 여러 학과를 겸임할 수 있습니다.
3.
다음 정보를 필수적으로 포함해주세요.
a.
이름, 소속 학과
4.
다음 교수님 목록을 포함해주세요.
a.
larry, 전자과, 기경
b.
platypus, 전산, 산디
c.
tom, 융합인재, 전산
d.
yumyum, 전산, 산디
e.
duncan, 전산,전자
f.
april, 산공, 전산

Course

1.
학과 별로 개설되는 과목이 존재합니다.
2.
다음 정보를 필수적으로 포함해주세요.
a.
과목 이름(국문), 과목 이름(영문), 과목 코드, 강의,실험,학점
3.
사용자는 과목사전*에서 multi-select 과 keyword를 이용하여 과목을 검색할 수 있습니다.
과목사전: Course와 Lecture에 대한 정보들을 종합하여 부르는 말입니다. 사용자는 과목사전에 검색하여 Course와 Lecture에 대한 정보를 얻을 수 있습니다.
a.
multi-select 기준 - 학과, 학년
b.
키워드 - 검색어
4.
다음 과목 목록을 포함해주세요.
a.
‘PM의 역할과 이해’ - 산디과 203
b.
‘융합형 인재 개론’ - 융합인재학부 200
c.
‘OTL에서 기술 리더로 살아남는 법’ - 전산과 330
d.
‘알차게 휴학하는 방법’ - 기경과 442
e.
‘대학원 진학과 군문제 해결’ - 전자과 327
f.
‘즐거운 대학원 생활’ - 전자과 444
g.
‘슬기로운 대학원 생활’ - 전자과 445
h.
‘편하게 군대 다녀오기’ - 전자과 210
i.
‘스팍스에서 디자이너로 살아남기’ - 산디과 312
j.
‘피그마 개론 1’ - 산디과 320
k.
‘피그마 개론 심화 2’ - 산디과 330
l.
‘우당탕탕 자취개론’ - 기경과 201
m.
‘자바스크립트 개론’ - 전산과 200
n.
‘타입스크립트 개론’ - 전산과 300

Lecture

1.
과목별로 학기마다 개설되는 강의가 존재합니다.
2.
학생들은 강의에 대한 리뷰를 작성하고 평가를 할 수 있습니다.
3.
학생들은 매 학기마다 해당 강의로 시간표를 만들 수 있습니다. (TimeTable)
4.
평가는 다음과 같은 항목으로 구성됩니다.
a.
후기 내용
b.
성적 (A,B,C,D,F)
c.
널널 (A,B,C,D,F)
d.
강의 (A,B,C,D,F)
5.
학생들이 남긴 후기는 강의별 통계로 집계가 됩니다.
6.
학생들이 남긴 후기는 과목별 통계로도 집계가 됩니다.
7.
통계는 다음과 같은 항목을 포함합니다.
a.
성적, 널널, 강의
8.
다음 정보를 필수적으로 포함해주세요.
a.
교수, 과목, 학기 정보, 개설 시간, 강의, 실험, 학점
9.
강의별로 배치된 시간이 다릅니다.
10.
다음 강의를 포함해주세요.

Semester

1.
강의는 학기마다 다르게 열리므로, 학기에 대한 정보가 필요합니다.
2.
학기에 대한 정보는 연(year)과 학기(봄,여름,가을,겨울)로 구성됩니다.
3.
다음 학기를 기본적으로 포함해주세요.
a.
올해 봄, 가을

Review

1.
학생들은 각 강의에 대해 하나의 리뷰만 작성할 수 있습니다.
2.
본인이 쓴 후기를 확인하고 언제든지 수정할 수 있습니다. 한 번 쓴 후기는 삭제할 수 없습니다.
3.
남이 쓴 후기는 익명으로 보이며, 수정이나 삭제를 할 수 없습니다.
4.
남이 쓴 리뷰에 ‘신고하기’ 또는 ‘좋아요’를 표시할 수 있습니다.
5.
내가 쓴 리뷰는 ‘신고하기’ 또는 ‘좋아요’를 할 수 없습니다.
6.
내가 ‘좋아요’를 표시한 리뷰를 확인할 수 있습니다.
7.
관리자는 ‘신고하기’가 눌러진 게시물만 삭제할 수 있습니다.

Timetable

1.
학생들은 학기별로 시간표를 작성할 수 있습니다.
2.
시간표에는 해당 학기에 개설된 강의만 추가할 수 있습니다.
3.
시간표에 추가된 강의들은 시간이 겹쳐서는 안 됩니다.

필수 ERD

요구 사항 만족에 따라 추가하셔도 됩니다!

추가 구현 사항 (선택)

게시글 읽음 표시

리뷰 별로 내가 읽었는지를 레드닷으로 표시해주고, 새로운 리뷰가 등록되었음을 알려주고자 합니다.
1.
과목 목록에서 내가 한 번 클릭한 경우 읽음 처리를 위해 레드닷을 해제합니다.
2.
과목 목록에서 새로운 리뷰가 등록된 과목의 경우 레드닷을 다시 표시합니다.

API 목록

POST /api/users/login
로그인
POST /api/users/signup
회원 가입
GET /api/users/profile
본인의 프로필을 조회
GET /api/users/reviews
본인이 작성한 리뷰를 조회
GET /api/users/reviews/likes
본인이 좋아요를 누른 리뷰를 조회
GET /api/courses
과목 사전에서 과목 검색.
GET /api/courses/{courseId}
특정 과목에 대한 정보를 조회
GET /api/courses/{courseId}/reviews
과목 사전에서 특정 과목의 리뷰들을 조회
GET /api/courses/lectures
강의 검색. 특정 학기로 검색 가능.
GET /api/courses/lectures/{lectureId}/reviews
과목 사전에서 특정 강의의 리뷰들을 조회
GET /api/courses/lectures/reviews/{reviewId}
특정 리뷰를 조회
POST /api/courses/lectures/{lectureId}/reviews
특정 강의에 대한 리뷰를 작성
PATCH /api/courses/lectures/{lectureId}/reviews/{reviewId}
특정 강의에 대한 리뷰를 수정
본인이 쓴 리뷰만 수정이 가능합니다.
DELETE /api/courses/{courseId}/lectures/{lectureId}/reviews/{reviewId}
신고당한 리뷰만 관리자가 삭제 가능합니다.
POST /api/courses/lectures/reviews/{reviewId}/likes
특정 리뷰에 대한 좋아요 기능
DELETE /api/courses/lectures/reviews/{reviewId}/likes
특정 리뷰에 대한 좋아요 취소 기능
POST /api/courses/lectures/reviews/{reviewId}/excuse
특정 리뷰에 대한 신고 기능
GET /api/semesters
현재 학기에 대한 정보 조회. (2023년 가을학기 등)
GET /api/users/{userId}/timetables
본인이 생성한 시간표 조회
POST /api/users/{userId}/timetables
새로운 시간표 생성 기능
POST /api/users/{userId}/timetables/{timetableId}/lectures/{lectureId}
시간표에 새로운 강의를 추가하는 기능
현재 학기에 개설되지 않은 강의가 추가되면 안 됩니다.
DELETE /api/users/{userId}/timetables/{timetableId}/lectures/{lectureId}
시간표에 추가된 강의를 삭제
GET /api/users/{userId}/timetables/{timetableId}
생성된 시간표를 조회

참고 사항

인프런 강의를 듣는 것을 추천합니다.
따라하며 배우는 NestJS
탄탄한 백엔드 NestJS, 기초부터 심화까지
larry 계정
tom 계정
개발 컨벤션
DTO를 명확하게 정의하고, class-validator를 이용해서 파라미터 검증을 진행해주세요
리턴 타입은 response DTO로써 api 별로 정의하고 DTO로 변환하는 함수를 작성해주세요.
타이핑이 잘 되도록 메서드 및 함수의 시그니처를 명확하게 표시해주세요.
아래 Congratulations에 개인 페이지를 만들고 검색할 때 찾아봤던 모든 걸 아카이빙 해주세요!

 Congratulations!