Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

5주차 작업 병합 #212

Merged
merged 139 commits into from
Nov 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
139 commits
Select commit Hold shift + click to select a range
8b19c94
feat: 트랜잭션이 필요한 부분에 @Transactional 어노테이션 적용 #170
koomchang Nov 25, 2024
8f2acef
fix: 제목 쿼리를 기준으로 코스 갯수를 세는 로직 수정 #170
koomchang Nov 25, 2024
ebf6d77
test: service에서 mocking 대신 통합테스트로 리팩토링 #170
koomchang Nov 25, 2024
88c5e70
fix: 코스에서 불필요한 transaction 제거 #170
koomchang Nov 25, 2024
5033a57
fix: 불필요한 transactional 어노테이션 제거 #170
koomchang Nov 25, 2024
8d53c17
fix: 불필요한 import 제거 #170
koomchang Nov 25, 2024
120ada1
refactor: 테스트 픽스쳐에서 unique 한 값들에 대해 랜덤 값 부여 #170
koomchang Nov 25, 2024
46be96c
feat: 로그아웃 api 구현 #159
koomchang Nov 25, 2024
8168efa
feat: 로그아웃 mutation에 url 적용 #159
koomchang Nov 25, 2024
4ecf81a
test: 불필요한 테스트 삭제
Miensoap Nov 25, 2024
b0b2700
fix: 지도/코스 공개 여부 타입 검증
Miensoap Nov 25, 2024
cbfb1b6
feat: 지도에 썸네일 수정 기능 추가, 수정 정보가 없을 때 에러 응답 #177
Miensoap Nov 25, 2024
5346413
feat: 맵에 추가된 핀 수정 API #178
Miensoap Nov 25, 2024
6a39026
feat: 코스에 추가된 장소 수정 API #178
Miensoap Nov 25, 2024
e488c83
feat: PUT 수정 메서드에 트랜잭션 적용 #178
Miensoap Nov 25, 2024
2fc3b2b
refactor: 썸네일 기본값 처리 데코레이터 적용 #177
Miensoap Nov 25, 2024
3557c71
refactor: 필요한 정보가 포함되지 않은 요청에 대한 공통 커스텀 예외 사용 #178
Miensoap Nov 25, 2024
010c671
fix: map controller 에 완성된 user 모듈 연동 #54
hyohyo12 Nov 16, 2024
c83c3b8
fix: 지도의 controller 예외 추가 / Permission, isPublic, 유저 존재 검증 #54
hyohyo12 Nov 23, 2024
79ad42f
test: 지도 service 단위 테스트 작성 #54
hyohyo12 Nov 23, 2024
21dbbbc
test: 지도 통합테스트 작성 #54
hyohyo12 Nov 23, 2024
f48a386
fix: lint 관련 문제 해결 #54
hyohyo12 Nov 23, 2024
fb5bea5
fix: 지도 조회 페이지 크기 기본값 10에서 15로 변경
hyohyo12 Nov 23, 2024
0cb5770
fix: map 통합테스트 secretKey가 없어 발생하는 문제 override로 해셜 #54
hyohyo12 Nov 23, 2024
0e3220a
refactor: MapService의 repository 들을 모킹할 때 createMock 사용/ 필요없는 테스트 부분 …
hyohyo12 Nov 25, 2024
f1e0055
fix: MapPermissionGuard 비교 부분 지도의 user Id 와 파라미터의 userId 를 비교하도록 수정 #54
hyohyo12 Nov 25, 2024
acba08f
fix: dto 로 isPublic 검증하도록 변경 / 그에 맞게 테스트 코드 수정 #54
hyohyo12 Nov 25, 2024
dc29237
refactor: fixture 생성 함수 고차 함수로 변경 #54
hyohyo12 Nov 25, 2024
a139878
refactor: dto 로 isPublic 검증하고 예외를 발생시키기에 service 에서 중복적인 일을 수행하는 코드 삭…
hyohyo12 Nov 25, 2024
b685d4a
fix: dto로 isPublic 수정하기에 해당 예외 삭제 #54
hyohyo12 Nov 25, 2024
192a877
feat: 서비스 단위 테스트 방식 변경 실제 데이터베이스 통신 #54
hyohyo12 Nov 25, 2024
1e22fc7
fix: createPrivateMaps 에서 1개 더 생성되는 문제와 고차함수 사용 #54
hyohyo12 Nov 25, 2024
259ff83
fix: given/when/then 단위로 나눔 #54
hyohyo12 Nov 25, 2024
9a45c7a
test: 수정된 기능에 따라 테스트 코드 변경 #54
hyohyo12 Nov 26, 2024
b81d689
fix: yarn.lock
hyohyo12 Nov 26, 2024
a9a2772
fix: 유저 존재 예외 처리 하지 않음. #54
hyohyo12 Nov 26, 2024
0958eb6
test: 예외 처리 하지 않은 부분 삭제 #54
hyohyo12 Nov 26, 2024
9f57502
test: 가독성을 위해 줄 바꿈 추가, 공통 부분 함수화 #54
hyohyo12 Nov 26, 2024
a83a00a
fix: course 반환 15개로 증가
hyohyo12 Nov 26, 2024
06ee97c
fix: 쓰지 않는 라이브러리 제거
hyohyo12 Nov 26, 2024
c611c0f
fix: yarn.lock
hyohyo12 Nov 26, 2024
f4c5929
docs: README에 시스템 아키텍처 설계 사진 작성
koomchang Nov 26, 2024
143aa64
reafactor: 서비스 에러 코드 앞에 `E` prefix 붙이도록 수정 #187
Miensoap Nov 25, 2024
738f62f
refactor: 인증/인가 관련 예외 세분화 및 에러 코드 점검 #187
Miensoap Nov 25, 2024
8de26b2
refactor: 코스 관련 예외 점검 및 코드 수정 #187
Miensoap Nov 25, 2024
920628c
refactor: 장소 관련 예외 점검 및 코드 수정 #187
Miensoap Nov 25, 2024
298fea5
refactor: 지도 관련 예외 점검 및 코드 수정 #187
Miensoap Nov 25, 2024
a748c7c
refactor: 공통/유저/외부 서비스 관련 예외 점검 및 코드 수정 #187
Miensoap Nov 25, 2024
803b0ba
refactor: 배너 관련 예외 추가 #187
Miensoap Nov 26, 2024
9da2c6d
refactor: 예외 메시지 형식 통일 #187
Miensoap Nov 26, 2024
1c50507
test: 예외 메시지 수정 #187
Miensoap Nov 26, 2024
730079b
refactor: 에러 상세 정보는 응답하지 않고 로깅만 하도록 수정 #187
Miensoap Nov 26, 2024
65ed581
feat: 정렬 추가/ map괴 user, place 를 조인하여 조회 그리고 place가 있는 지도의 개수 세는 메소드 추…
hyohyo12 Nov 26, 2024
de9a9ff
feat: 지도 전체 조회, 지도 검색 조회 order 파라미터 추가 #166
hyohyo12 Nov 26, 2024
3e0096e
feat: mapService searchMap 과 getAllMaps 분리/ 변경된 레포지토리에 맞게 수정/ 전체 지도 조…
hyohyo12 Nov 26, 2024
185d279
refactor: 필요없는 기능 삭제 #166
hyohyo12 Nov 26, 2024
fe301c1
test: 변경된 요구사항 ( 지도 전체 조회시 핀 있는 지도 반환) 에 맞게 map service 테스트 변경 #166
hyohyo12 Nov 26, 2024
a870233
test: 변경된 요구사항 ( 지도 전체 조회시 핀 있는 지도 반환) 에 맞게 map 통합 테스트 변경 #166
hyohyo12 Nov 26, 2024
eac0707
test: mapRespository 추가된 메소드(countMapsWithPlace, findMapsWithPlace) 테…
hyohyo12 Nov 27, 2024
b1997d3
fix: color enum 변경 #166
hyohyo12 Nov 27, 2024
3f14182
fix: count 함수 분리/ PageMapResponse 로 반환하도록 수정
hyohyo12 Nov 27, 2024
69116cc
fix: mapRepository 로 분리한 countBy 수정에 따라 service 의 count 수정 / PagedMap…
hyohyo12 Nov 27, 2024
9538eef
refactor: color 사용 방식 변경 #166
hyohyo12 Nov 27, 2024
f017d77
refactort: 좀 더 직관적이고 일관성 있는 이름으로 변경 #166
hyohyo12 Nov 27, 2024
0ee7f5d
fix: beforeAll 로 데이터베이스 초기화/ Color 사용 방법 변경 #166
hyohyo12 Nov 27, 2024
38ee080
feat: user 조회 쿼리 #124
1119wj Nov 23, 2024
e4f76b1
feat: 배포환경 테스트 #124
1119wj Nov 23, 2024
662a3ae
fix: useAuth 변경 #124
1119wj Nov 23, 2024
bcc8c63
fix: 배포환경 변수 #124
1119wj Nov 23, 2024
e6fe628
feat: 새 장소 등록 UI #124
1119wj Nov 23, 2024
699c9af
feat: 코스 경로 UI #124
1119wj Nov 23, 2024
b417548
feat: 새 장소 등록 api #124
1119wj Nov 23, 2024
9f1d8e4
feat: usePolyline 및 커스텀 마커 #124
1119wj Nov 23, 2024
a55afe3
feat: 코스 관련 UI, 페이지 #124
1119wj Nov 25, 2024
6c6d948
feat: 메인페이지 UI 변경 #124
1119wj Nov 25, 2024
d92b9f9
feat: 쿼리키 변경 및 사소한 수정 #124
1119wj Nov 25, 2024
39d7662
feat: 메인페이지 변경, css수정 #124
1119wj Nov 25, 2024
e89437b
feat: 썸네일 등록 및 조회 #124
1119wj Nov 25, 2024
924ed43
style: 안쓰는 코드 삭제 #124
1119wj Nov 25, 2024
6262874
fix: 로그인 방식 변경 및 webp 최적화
1119wj Nov 25, 2024
3606baa
fix: user Query 수정
1119wj Nov 25, 2024
d434248
feat: 라우트 선언 방식 변경 #124
1119wj Nov 26, 2024
60160fc
feat: lazy 적용, loading 컴포넌트 #124
1119wj Nov 26, 2024
c61047c
feat: 로그인, 권한 컴포넌트 #124
1119wj Nov 26, 2024
0227aa5
feat: 권한 체크 #124
1119wj Nov 26, 2024
a69622b
feat: 마커 폴리라인 경로 #124
1119wj Nov 26, 2024
ecc2fb4
feat: 마커, 마커 info 구현 #124
1119wj Nov 26, 2024
b8b6c70
fix: props 변경 등 사소한 수정 #124
1119wj Nov 26, 2024
ac37e9a
feat: 토큰 검사 로직 #124
1119wj Nov 26, 2024
ee082ee
feat: 마커 info css #124
1119wj Nov 26, 2024
3f9ced6
feat: 에러 시 메인 이동 #124
1119wj Nov 26, 2024
eab4c61
style: 사용하지 않는 파일 삭제 #124
1119wj Nov 26, 2024
cd29ca5
feat: marker Cluster #124
1119wj Nov 27, 2024
52e78de
feat: 마커 클러스터 로직 #124
1119wj Nov 27, 2024
4a5d4dd
feat: 마커클러스터 라이브러리 추가 #124
1119wj Nov 27, 2024
326fa44
fix: 토큰에러, pointer이벤트, nav 버튼 #124
1119wj Nov 27, 2024
38763f2
fix: 마커 인포를 위한 props #124
1119wj Nov 27, 2024
0584fac
fix: 지도 영역 클릭 불가능 버그 수정 #124
1119wj Nov 27, 2024
039d164
fix: 토큰에러 처리 #124
1119wj Nov 27, 2024
575bcb3
fix: 린트 수정 #124
1119wj Nov 27, 2024
f46d744
test: 코스 통합테스트를 위한 설정 구성 #182
koomchang Nov 26, 2024
d635846
refactor: 지도 통합 테스트에서 app 초기화를 beforEach에서 beforeAll로 변경 #182
koomchang Nov 26, 2024
ec23b29
test: 코스 통합테스트에서 모듈에서 의존성 가져오도록 설정 구성 #182
koomchang Nov 26, 2024
a0b2510
test: E2E 테스트에서 datasource 및 app 설정 초기화 함수 분리 #182
koomchang Nov 26, 2024
1e4205b
test: 테스트 결과의 id값이 db에 영향 받지 않도록 수정 #182
koomchang Nov 26, 2024
27691f5
config: 백엔드 테스트할 때 env 참고할 수 있도록 설정 #182
koomchang Nov 27, 2024
4545286
fix: map 통합테스트에서 필요 없는 부분 제거 #182
koomchang Nov 27, 2024
29ee742
test: DB 초기화 유틸 함수 추가
Miensoap Nov 27, 2024
9ca1f9d
test: 장소 모듈 테스트에 초기화 함수 적용
Miensoap Nov 27, 2024
b0aa7c0
refactor: 테스트 테이블들을 직접 넣지 않고 쿼리로 가져오도록 변경 #182
koomchang Nov 27, 2024
61c87c9
refactor: map, place, course 테이블 들에서 truncateTables 유틸 함수를 사용하도록 리팩토링…
koomchang Nov 27, 2024
20c057e
fix: rebase 하며 사라진 부분 다시 채워넣음 #182
koomchang Nov 27, 2024
777a02b
fix: 리프레시 토큰 관련 로직에서 알맞은 에러 코드 응답하도록 수정
Miensoap Nov 27, 2024
ffb32da
refactor: 장소 카테고리 ENUM 으로 수정 #196
Miensoap Nov 27, 2024
887a2cb
refactor: 구글 장소 타입 -> 카테고리 변경 로직 추가 #196
Miensoap Nov 27, 2024
f642e08
test: 변경사항 테스트에 반영 #196
Miensoap Nov 27, 2024
31a39ad
docs: ES 초기설정 스크립트 수정 #195
Miensoap Nov 27, 2024
1ee16a8
feat: ES 인덱스에 자동완성에 사용될 필드 추가
Miensoap Nov 26, 2024
fe834a9
feat: 장소 검색어 자동완성 API 완성 #195
Miensoap Nov 26, 2024
2c5cc4c
docs: 설정용 파일과 보관용 파일 분리
Miensoap Nov 27, 2024
a4d332f
docs: README 에 로고 사진 추가 및 아키텍처 사진 수정
koomchang Nov 28, 2024
68f9758
refactor: ES 장소 검색에서 DTO 수정 #203
koomchang Nov 28, 2024
b0d2b45
test: 테스트 임시 비활성화 #203
koomchang Nov 28, 2024
82d6e3a
fix: 데이터 동기화 dto 수정 #203
koomchang Nov 28, 2024
fe28d95
fix: 위도 경도 undefined 에러 수정 #203
koomchang Nov 28, 2024
5222b57
fix: 장소 검색 DTO에 맞게 수정 #203
koomchang Nov 28, 2024
3a83c71
fix: 장소 검색 pagination 기존 10개에서 5개로 수정
koomchang Nov 28, 2024
cdb0491
fix: 장소 검색 갯수 5개로 변경
koomchang Nov 28, 2024
55831de
conf: 도커 설치, 전체 실행 스크립트
Miensoap Nov 27, 2024
8812332
feat: 구글 API 키 필요한 장소 검색/등록 API 비활성화
Miensoap Nov 30, 2024
cb63cb4
feat: Mysql 설정 및 실행 스크립트
Miensoap Nov 27, 2024
2488415
fix: ES 초기설정 스크립트 수정
Miensoap Nov 30, 2024
550dc26
feat: ES 설정 및 실행 스크립트
Miensoap Nov 30, 2024
acb8dc1
fix: Mysql 스크립트 수정
Miensoap Nov 30, 2024
cf26d04
feat: 환경변수 복사
Miensoap Nov 30, 2024
284ccd6
style: 코드 포맷팅
Miensoap Nov 30, 2024
afafe08
fix: ELK 스크립트 수정
Miensoap Nov 30, 2024
cc17f36
test: 빈 쿼리 에러를 반영한 테스트 수정
Miensoap Nov 30, 2024
b97c314
test: 쿼리 변수 추출
Miensoap Nov 30, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .github/workflows/CI_PIPELINE.yml
Original file line number Diff line number Diff line change
Expand Up @@ -59,5 +59,7 @@ jobs:

- name: Test ${{ matrix.project }}
if: env.changed == 'true'
run: yarn test
run: |
echo "${{ secrets.DOT_ENV_PROD }}" > ${{ github.workspace }}/backend/.env
yarn test
working-directory: ${{ matrix.project }}
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839

**/*.csv
**/*.log

# User-specific stuff
.idea/
.idea/**/workspace.xml
Expand Down
26 changes: 18 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
# **오늘의 길** 🚗
> 나만의 지도와 코스를 만들고 친구와 공유해 보세요!
<div align='center'>
<img src="https://github.com/user-attachments/assets/b30a96fe-c822-499d-942c-88e7ece72fb3" width=600 alt="오늘의 길">
<h3> 나만의 길을 따라 일상을 공유하다. 🗺️

### 팀원 소개
</div>

---
<a href="https://forms.gle/Hkckwm6vtZxoEnxH6" target='_blank'>📝 피드백을 남겨주세요!</a>

### 팀원 소개

| [J088_도원진](https://github.com/1119wj) | [J151_안금장](https://github.com/koomchang) | [J105_박민서](https://github.com/Miensoap) | [J270 _한동효](https://github.com/hyohyo12) |
|:--------------------------------------------------------------------------:|:--------------------------------------------------------------------------:|:--------------------------------------------------------------------------:|:---------------------------------------------------------------------------:|
Expand All @@ -11,15 +16,20 @@

### 프로젝트 소개

>**오늘의 길**은 사람들이 자신의 경험과 취향을 반영한 지도를 만들고 공유할 수 있는 플랫폼입니다.
> **오늘의 길**은 사람들이 자신의 경험과 취향을 반영한 지도를 만들고 공유할 수 있는 플랫폼입니다.
>
>맛집이나 여행지를 기록할 때 다양한 앱과 도구를 사용하는 대신,
이곳에서는 장소와 코스를 자유롭게 구성하고,다른 사람들과 공유하며 소통할 수 있습니다.
> 이곳에서는 장소와 코스를 자유롭게 구성하고,다른 사람들과 공유하며 소통할 수 있습니다.
>
>개인적인 기억과 감상을 담은 지도를 통해 새로운 발견을 하고,
좋아하는 사람들을 팔로우하며 일상의 영감을 얻는 소셜 지도 서비스입니다.
> 좋아하는 사람들을 팔로우하며 일상의 영감을 얻는 소셜 지도 서비스입니다.

### 시스템 아키텍처

<img src="https://github.com/user-attachments/assets/8385c502-7e82-41fa-ae10-b5f9b9ad0d56" width=1000>

</br>
</br>

|🏷️ 바로가기| [**팀 Notion**](https://elastic-bread-9ef.notion.site/12963e6f4ee98074b6f9f70cfa9ac836) | [그라운드 룰](https://github.com/boostcampwm-2024/web09-DailyRoad/wiki/%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C-%EB%A3%B0) | [컨벤션](#) | [기획/디자인](#) | [문서](#) |
|:-:|:--------------------------------------------------------------------------------------:|:----------:|:--------:|:-----------:|:-----:|
| 🏷️ 바로가기 | [**팀 Notion**](https://elastic-bread-9ef.notion.site/12963e6f4ee98074b6f9f70cfa9ac836) | [그라운드 룰](https://github.com/boostcampwm-2024/web09-DailyRoad/wiki/%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C-%EB%A3%B0) | [컨벤션](#) | [기획/디자인](#) | [문서](#) |
|:--------:|:--------------------------------------------------------------------------------------:|:-----------------------------------------------------------------------------------------------------------------:|:--------:|:-----------:|:-------:|
48 changes: 0 additions & 48 deletions backend/resources/scripts/elk/logstash/logstash.conf

This file was deleted.

11 changes: 6 additions & 5 deletions backend/src/admin/banner/banner.service.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { Injectable, NotFoundException } from '@nestjs/common';
import { Injectable } from '@nestjs/common';
import { AdminBannerRepository } from './banner.repository';
import { CreateBannerRequest } from '@src/admin/banner/dto/CreateBannerRequest';
import { UpdateBannerPeriodRequest } from '@src/admin/banner/dto/UpdateBannerPeriodRequest';
import { UpdateBannerDetailsRequest } from '@src/admin/banner/dto/UpdateBannerDetailsRequest';
import { BannerNotFoundException } from '@src/banner/exception/BannerNotFoundException';

@Injectable()
export class AdminBannerService {
Expand All @@ -26,7 +27,7 @@ export class AdminBannerService {
});

if (result.affected === 0) {
throw new NotFoundException(`Banner with id ${id} not found`);
throw new BannerNotFoundException(id);
}

return this.bannerRepository.findOne({ where: { id } });
Expand All @@ -42,7 +43,7 @@ export class AdminBannerService {
});

if (result.affected === 0) {
throw new NotFoundException(`Banner with id ${id} not found`);
throw new BannerNotFoundException(id);
}

return this.bannerRepository.findOne({ where: { id } });
Expand All @@ -52,9 +53,9 @@ export class AdminBannerService {
const result = await this.bannerRepository.softDelete(id);

if (result.affected === 0) {
throw new NotFoundException(`Banner with id ${id} not found`);
throw new BannerNotFoundException(id);
}

return { message: `Banner with id ${id} successfully deleted` };
return { deleted: id };
}
}
26 changes: 25 additions & 1 deletion backend/src/auth/auth.controller.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,20 @@
import { Request, Response } from 'express';
import { Body, Controller, Post, Get, Param, Res, Req } from '@nestjs/common';
import {
Body,
Controller,
Post,
Get,
Param,
Res,
Req,
Delete,
UseGuards,
} from '@nestjs/common';
import { AuthService } from './auth.service';
import { AuthenticationException } from './exception/AuthenticationException';
import { getOAuthProviderNameByValue } from './oauthProvider/OAuthProviders';
import { JwtAuthGuard } from '@src/auth/JwtAuthGuard';
import { AuthUser } from '@src/auth/AuthUser.decorator';

const REFRESH_TOKEN = 'refreshToken';

Expand Down Expand Up @@ -49,6 +61,18 @@ export class AuthController {
});
}

@Delete('signOut')
@UseGuards(JwtAuthGuard)
async signOut(@Res() response: Response, @AuthUser() user: AuthUser) {
await this.authService.signOut(user.userId);
response.clearCookie(REFRESH_TOKEN, {
httpOnly: true,
secure: true,
sameSite: 'none',
});
response.status(204).send();
}

@Post('refresh')
async refreshAccessToken(@Req() request: Request) {
const refreshToken = request.cookies[REFRESH_TOKEN];
Expand Down
28 changes: 17 additions & 11 deletions backend/src/auth/auth.service.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { JWTHelper } from './JWTHelper';
import { CreateUserRequest } from '../user/dto/CreateUserRequest';
import { UserService } from '../user/user.service';
import { RefreshTokenRepository } from './refresh-token.repository';
import { OAuthProvider } from './oauthProvider/OAuthProvider';
import { AuthenticationException } from './exception/AuthenticationException';
import { UserRole } from '../user/user.role';
import { JWTHelper } from '@src/auth/JWTHelper';
import { CreateUserRequest } from '@src/user/dto/CreateUserRequest';
import { UserService } from '@src/user/user.service';
import { RefreshTokenRepository } from '@src/auth/refresh-token.repository';
import { OAuthProvider } from '@src/auth/oauthProvider/OAuthProvider';
import { AuthenticationException } from '@src/auth/exception/AuthenticationException';
import { InvalidTokenException } from '@src/auth/exception/InvalidTokenException';
import { UserRole } from '@src/user/user.role';
import {
OAuthProviderName,
getOAuthProviders,
} from './oauthProvider/OAuthProviders';
OAuthProviderName,
} from '@src/auth/oauthProvider/OAuthProviders';
import { ExpiredTokenException } from '@src/auth/exception/ExpiredTokenException';

@Injectable()
export class AuthService {
Expand Down Expand Up @@ -65,12 +67,12 @@ export class AuthService {
});

if (!tokenEntity) {
throw new AuthenticationException('유효하지 않은 리프레시 토큰입니다.');
throw new InvalidTokenException('유효하지 않은 리프레시 토큰입니다.');
}

const isTokenValid = this.jwtHelper.verifyToken(refreshToken);
if (!isTokenValid) {
throw new AuthenticationException('리프레시 토큰이 만료되었습니다.');
throw new ExpiredTokenException('리프레시 토큰이 만료되었습니다.');
}

return this.jwtHelper.generateToken(this.accessTokenExpiration, {
Expand Down Expand Up @@ -110,4 +112,8 @@ export class AuthService {

return { accessToken, refreshToken };
}

async signOut(userId: number) {
await this.refreshTokenRepository.deleteByUserId(userId);
}
}
2 changes: 1 addition & 1 deletion backend/src/auth/exception/AuthenticationException.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { HttpStatus } from '@nestjs/common';
export class AuthenticationException extends BaseException {
constructor(message: string = '인증에 실패했습니다.') {
super({
code: 601,
code: 500,
message: message,
status: HttpStatus.UNAUTHORIZED,
});
Expand Down
2 changes: 1 addition & 1 deletion backend/src/auth/exception/AuthorizationException.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { HttpStatus } from '@nestjs/common';
export class AuthorizationException extends BaseException {
constructor(message: string = '해당 작업에 대한 권한이 없습니다.') {
super({
code: 602,
code: 510,
message: message,
status: HttpStatus.FORBIDDEN,
});
Expand Down
12 changes: 12 additions & 0 deletions backend/src/auth/exception/ExpiredTokenException.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { BaseException } from '@src/common/exception/BaseException';
import { HttpStatus } from '@nestjs/common';

export class ExpiredTokenException extends BaseException {
constructor(message: string = '만료된 토큰입니다.') {
super({
code: 502,
message: message,
status: HttpStatus.UNAUTHORIZED,
});
}
}
12 changes: 12 additions & 0 deletions backend/src/auth/exception/InvalidTokenException.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { BaseException } from '@src/common/exception/BaseException';
import { HttpStatus } from '@nestjs/common';

export class InvalidTokenException extends BaseException {
constructor(message: string = '유효하지 않은 토큰입니다.') {
super({
code: 501,
message: message,
status: HttpStatus.UNAUTHORIZED,
});
}
}
11 changes: 11 additions & 0 deletions backend/src/banner/exception/BannerNotFoundException.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { BaseException } from '@src/common/exception/BaseException';

export class BannerNotFoundException extends BaseException {
constructor(id: number) {
super({
code: 661,
message: `[${id}] 배너가 존재하지 않습니다.`,
status: 404,
});
}
}
3 changes: 3 additions & 0 deletions backend/src/common/consts.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// Todo. 오브젝트 스토리지에 실제 이미지 저장 후 수정
export const DEFAULT_THUMBNAIL_URL =
'https://avatars.githubusercontent.com/u/87180146?v=4';
9 changes: 9 additions & 0 deletions backend/src/common/decorator/ReplaceEmptyWith.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { Transform } from 'class-transformer';

/**
* 빈 문자열을 기본값으로 변환합니다.
* @param defaultValue
*/
export function ReplaceEmptyWith(defaultValue: string): PropertyDecorator {
return Transform(({ value }) => (value === '' ? defaultValue : value));
}
23 changes: 23 additions & 0 deletions backend/src/common/decorator/UnavaliableIn.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { ServiceUnavailableException } from '@nestjs/common';

export function UnavailableIn(env: string): MethodDecorator {
return (
target: object,
propertyKey: string | symbol,
descriptor: PropertyDescriptor,
) => {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(process.env.NODE_ENV);

Check warning on line 11 in backend/src/common/decorator/UnavaliableIn.ts

View workflow job for this annotation

GitHub Actions / Lint, Build and Test (backend)

Unexpected console statement
if (process.env.NODE_ENV === env) {
throw new ServiceUnavailableException(
`현재는 지원하지 않는 서비스입니다. [${env} 환경]`,
);
}

return originalMethod.apply(this, args);
};

return descriptor;
};
}
9 changes: 6 additions & 3 deletions backend/src/common/exception/BaseException.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,16 @@ import { ExceptionType } from './ExceptionType';
export class BaseException extends HttpException {
readonly code: number;

constructor(exceptionType: ExceptionType) {
constructor(
readonly exceptionType: ExceptionType,
readonly error?: Error,
) {
super(exceptionType.message, exceptionType.status);
this.code = exceptionType.code;
}

getCode(): number {
return this.code;
getCode(): string {
return `E${this.code}`;
}

getMessage(): string {
Expand Down
12 changes: 12 additions & 0 deletions backend/src/common/exception/EmptyRequestException.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { BaseException } from '@src/common/exception/BaseException';
import { HttpStatus } from '@nestjs/common';

export class EmptyRequestException extends BaseException {
constructor(action: string = '작업') {
super({
code: 601,
message: `${action}에 필요한 정보가 없습니다.`,
status: HttpStatus.BAD_REQUEST,
});
}
}
Loading