Skip to content

Commit

Permalink
Dev be to dev (#290)
Browse files Browse the repository at this point in the history
* ♻️ refactor: swagger url 변경

* ✨ feat: 이전 채팅 스크롤 조회 기능 구현

* ✨ feat: class dto 내부 타입 자동 변경 설정

* ✨ feat: 스크롤 크기를 100을 넘지 않도록 설정

* ✅ test: 100개 초과 메시지 조회에 대한 테스트 코드 작성

* ✨ feat: detail 항목 추가 및 구현 진행중

* 🐛 fix: kospiStock

* ✨ feat: 주식 검색 기능 구현

* ✨ feat: 주식 검색 엔드포인트 구현

* ✨ feat: swagger 기본 경로 변경

* ✨ feat: 좋아요 엔티티 구현

* ♻️ refactor: typeORM 설정 파일 이름 변경

* ✨ feat: kospi stock entity 추가

* 🐛 fix: openapi detail 잠깐 추가

* ✨ feat: 좋아요 기능 구현

* ✨ feat: 좋아요 엔드 포인트 구현

* 💄 style: 안 쓰이는 bigint 데코레이터 및 관련 import 삭제

* ✨ feat: 좋아요 취소 기능 구현

* ✨ feat: 좋아요 이벤트를 참여중인 채팅방에 전파

* ✨ feat: 채팅 스크롤 시 좋아요 여부 출력

* ♻️ refactor: stock 내부 필드 타입 변경

* ♻️ refactor: chat 스크롤 쿼리 중복 dto 제거

* ✨ feat: 웹소켓 초기 접속 세션 인증 기능 구현

* ✨ feat: 채팅방 접속 시 좋아요 여부도 출력

* ✨ feat: cors 허용 설정

* ♻️ refactor: 잘못된 파일명 수정

* ✅ test: datasource mock 타입 에러 수정

* ♻️ refactor: 채팅 스크롤 중복 로직 제거

* ✨ feat: detail 완성

* ✨ feat: 좋아요 순으로 채팅 정렬 기능 구현

* ✨ feat: 좋아요 순 채팅 스크롤 엔드포인트 구현

* ✨ feat: chat likeCount 인덱스 설정

* ♻️ refactor: 채팅 스크롤 쿼리 빌더 중복 코드 제거

* ✨ feat: 주식 소유 확인 엔드포인트를 쿼리로 받도록 변경

* ♻️ refactor: tR_IDS로 리터럴 삭제

* 🐛 fix: production 모드일때에만 작동하게 변경

* ♻️ refactor: 리터럴 코드 제거 - tr_id

* ✨ feat: token retry 로직 추가

* 💄 style: stock controller import 순서 수정

* ✨ feat: custom filter 추가, exception도 추가

* ✨ feat: 주식을 소유한 사용자만 채팅 가능하도록 구현

* ✨ feat: 유저 서브네임 생성 로직 구현

* ✨ feat: 멘션 엔티티 구현

* ✨ feat: 특정 유저를 멘션하는 기능 구현

* 🐛 fix: minute fix per config

* 🐛 fix: minute data 시간 체크 추가

* ✨ feat: 웹소켓 게이트 경로 변경

* 🐛 fix: output 파일 삭제, DI, 로직 변경(isMarketOpenTime이 정반대로 구현되어 있었음)

* 🐛 fix: 웹 소켓 비어있는 쿠키 에러 문제 해결

* ♻️ refactor: openapi scraper service 에서 안 쓰이는 클래스 삭제

* 🐛 fix: injectable하게 변경, 이전 websocket 코드 삭제ㅔ

* ✨ feat: websocket 연결 추가

* ✨ feat: live data 추가

* 🐛 fix: 기존 코드에서  object 검사 로직 변경

* ♻️ refactor: eslint 준수

* ✨ feat: 주식 데이터 조회 엔드포인트 통합

* 💄 style: 큰 따옴표 제거

* 🐛 fix: kospi stock 데이터 추가, 코드 리팩토링

* ✨ feat: 쿠키 sameSite 옵션 수정

* ✨ feat: 쿠키 sameSite 옵션 재설정

* 🐛 fix: detail 항목 해결

* 🐛 fix: detail NaN 임시 해결

* 🐛 fix: type ws 추가

* 🐛 fix: try catch 추가

* 🐛 fix: 커스텀 필터에 try-catch 추가

* ✨ feat: 쿠키 sameSite 옵션 재설정

* ✨ feat: 채팅 사용자 닉네임 정보 추가

* ✨ feat: 쿠키 옵션 초기화

* 🐛 fix: websocket 임시 수정

* ✨ feat: 테스터 유저 생성 기능 구현

* 🚚 chore: passport local 패키지 설치

* ✨ feat: 테스터 유저 service 구현

* ✨ feat: 테스터 유저 strategy 구현

* ✨ feat: 테스터 유저 guard 구현

* ✨ feat: 테스터 유저 로그인 기능 구현

* ♻️ refactor: google strategy 더이상 사용하지 않는 의존성 제거

* 🐛 fix: openapiPeriodData 수정 - 불필요한 private, filter 삭제, 로직 변경

* 🐛 fix: openapiToken - custom filter 삭제, 불필요한 private 삭제, try-catch로 변경

* ✨ feat: priority queue 추가

* 🐛 fix: type 수정 - undefined 추가 및 확인

* ♻️ refactor: websocket return 값 parse 분리후 테스트 추가

* ♻️ refactor: parse stock data를 다른 함수로 분리

* ♻️ refactor: web socket client 리팩토링

* ♻️ refactor: websocket Client 리팩토링 - initOpen, close등으로 분리

* 🐛 fix: openapilive data 수정

* ♻️ refactor: websocket client service 수정

* ♻️ refactor: api 폴더 이동

* 🐛 fix: websocket 에러 해결, import, DI 문제 해결

* 🐛 fix: stock gateway 수정, websocket - client 서빙 구조 변경

* 🐛 fix: 주식 상세 데이터 name 추

* Revert "🐛 fix: stock gateway 수정, websocket - client 서빙 구조 변경"

This reverts commit 441926f.

* ♻️ refactor: stock detail 기본쿼리가 아닌 left join 으로 변경

* ✨ feat: 유저 랜덤 닉네임 변경

* ✨ feat: 테스터 로그인 엔드포인트 swagger 설정

* ✨ feat: 랜덤 닉네임 상수 추가

* Bug/#235 websocket 버그 해결, token db에 저장 (#240)

* ✨ feat: token entity 추가

* ✨ feat: entity 에 저장, expire 검사 로직 추가

* 🐛 fix: token 주입으로 로직 변경

* ♻️ refactor: token 주입으로 변경, 그로 인한 오류 수정 및 console.log 삭제

* 🐛 fix: live 데이터 수집 오류 해결, 데이터 없을 때 insert 오류 해결

* 🐛 fix: stock, livedata entity 수정

* ♻️ refactor: develop 환경시 logging 활성화

* 📦️ ci: production 환경일 때 작동되게 변경

* ✨ feat: 거래중인 종목만 검색

* 🐛 fix: 중복된 닉네임 테스터 에러 수정

* ✨ feat: 채팅으로 멘션을 진행

* ✨ feat: 멘션 연관관계 설정

* 🐛 fix: 잘못된 검증으로 멘션이 안되는 문제 해결

* ✨ feat: 채팅스크롤에서 멘션 필드 추가

* ✨ feat: 닉네임과 서브네임으로 유저 닉네임 검색

* ✨ feat: 서브네임 like 적용

* livedata 수집 추가 + openapi로 장시간,마감 변경 로직, token을 주입할 수 있게 변경 (#246)

* ✨ feat: token entity 추가

* ✨ feat: entity 에 저장, expire 검사 로직 추가

* 🐛 fix: token 주입으로 로직 변경

* ♻️ refactor: token 주입으로 변경, 그로 인한 오류 수정 및 console.log 삭제

* 🐛 fix: live 데이터 수집 오류 해결, 데이터 없을 때 insert 오류 해결

* 🐛 fix: stock, livedata entity 수정

* ♻️ refactor: develop 환경시 logging 활성화

* 📦️ ci: production 환경일 때 작동되게 변경

* ♻️ refactor: websocket 모듈에서 liveData로 서비스 로직 분리

* ♻️ refactor: livedata stock module로 이동

* ✨ feat: 장 마감시 openapi로 부르는 로직 추가

* 🐛 fix: websocket logger 추가, client stock 저장되지 않는 오류 해결

* 🐛 fix: openapi는 저장이 필요 없음 롤 백

* 🐛 fix: open api로 데이터 받지 못하는 문제 해결

* 💄 style: 안 쓰이는 것 빼기

* 💄 style: console.log 삭제

* 🐛 fix: 주식 컨트롤러에서 잘못된 경로 매핑문제 해결

* Feature/#110 - 특정 사용자를 멘션한다. (#249)

* ✨ feat: 유저 서브네임 생성 로직 구현

* ✨ feat: 멘션 엔티티 구현

* ✨ feat: 특정 유저를 멘션하는 기능 구현

* 🐛 fix: 중복된 닉네임 테스터 에러 수정

* ✨ feat: 채팅으로 멘션을 진행

* ✨ feat: 멘션 연관관계 설정

* 🐛 fix: 잘못된 검증으로 멘션이 안되는 문제 해결

* ✨ feat: 채팅스크롤에서 멘션 필드 추가

* ✨ feat: 닉네임과 서브네임으로 유저 닉네임 검색

* ✨ feat: 서브네임 like 적용

* Feature/#251 - 주식 컨트롤러 잘못된 경로 매핑 문제 해결 (#252)

* ✨ feat: 유저 서브네임 생성 로직 구현

* ✨ feat: 멘션 엔티티 구현

* ✨ feat: 특정 유저를 멘션하는 기능 구현

* 🐛 fix: 중복된 닉네임 테스터 에러 수정

* ✨ feat: 채팅으로 멘션을 진행

* ✨ feat: 멘션 연관관계 설정

* 🐛 fix: 잘못된 검증으로 멘션이 안되는 문제 해결

* ✨ feat: 채팅스크롤에서 멘션 필드 추가

* ✨ feat: 닉네임과 서브네임으로 유저 닉네임 검색

* ✨ feat: 서브네임 like 적용

* 🐛 fix: 주식 컨트롤러에서 잘못된 경로 매핑문제 해결

* Bug/#250 stock data 문제 해결 (#256)

* ✨ feat: token entity 추가

* ✨ feat: entity 에 저장, expire 검사 로직 추가

* 🐛 fix: token 주입으로 로직 변경

* ♻️ refactor: token 주입으로 변경, 그로 인한 오류 수정 및 console.log 삭제

* 🐛 fix: live 데이터 수집 오류 해결, 데이터 없을 때 insert 오류 해결

* 🐛 fix: stock, livedata entity 수정

* ♻️ refactor: develop 환경시 logging 활성화

* 📦️ ci: production 환경일 때 작동되게 변경

* ♻️ refactor: websocket 모듈에서 liveData로 서비스 로직 분리

* ♻️ refactor: livedata stock module로 이동

* ✨ feat: 장 마감시 openapi로 부르는 로직 추가

* 🐛 fix: websocket logger 추가, client stock 저장되지 않는 오류 해결

* 🐛 fix: openapi는 저장이 필요 없음 롤 백

* 🐛 fix: open api로 데이터 받지 못하는 문제 해결

* 💄 style: 안 쓰이는 것 빼기

* 💄 style: console.log 삭제

* 🐛 fix: pk가 아닌 곳에 unique 키 추가

* 💄 style: 불필요한 logger 삭제

* ♻️ refactor: error, disconnect function 분리

* ♻️ refactor: stock data에 indexing, unique 거릭

* 🐛 fix: 타입 가드 빠진 부분을 추가하고, detail이

ISSUES CLOSED: 작동되는 것을 확인함

* 🐛 fix: 유량 제어 제거, try-catch로 다시 시작 추가

* ♻️ refactor: cron 추가

* 🐛 fix: cron

* ♻️ refactor: period data 수정

* ♻️ refactor: console.log 삭제

* 🐛 fix: token의 expired 먼저 확인하고 db 접근으로 변경

* 🐛 fix: settimeout 시간 조정

* ♻️ refactor: 확인용 getItemchartprice 제거

---------

Co-authored-by: kimminsu <[email protected]>

* ✨ feat: 변동률 랭킹 엔티티 구현

* ✨ feat: 변동률 랭킹 api 데이터 수집

* 💄 style: 변동 랭킹 주식 관련 코드 eslint 형식으로 수정

* ✨ feat: 랭킹 api 데이터를 스크롤

* Bug/#257 detail 로직 변경 (#258)

* ✨ feat: token entity 추가

* ✨ feat: entity 에 저장, expire 검사 로직 추가

* 🐛 fix: token 주입으로 로직 변경

* ♻️ refactor: token 주입으로 변경, 그로 인한 오류 수정 및 console.log 삭제

* 🐛 fix: live 데이터 수집 오류 해결, 데이터 없을 때 insert 오류 해결

* 🐛 fix: stock, livedata entity 수정

* ♻️ refactor: develop 환경시 logging 활성화

* 📦️ ci: production 환경일 때 작동되게 변경

* ♻️ refactor: websocket 모듈에서 liveData로 서비스 로직 분리

* ♻️ refactor: livedata stock module로 이동

* ✨ feat: 장 마감시 openapi로 부르는 로직 추가

* 🐛 fix: websocket logger 추가, client stock 저장되지 않는 오류 해결

* 🐛 fix: openapi는 저장이 필요 없음 롤 백

* 🐛 fix: open api로 데이터 받지 못하는 문제 해결

* 💄 style: 안 쓰이는 것 빼기

* 💄 style: console.log 삭제

* 🐛 fix: pk가 아닌 곳에 unique 키 추가

* 💄 style: 불필요한 logger 삭제

* ♻️ refactor: error, disconnect function 분리

* ♻️ refactor: stock data에 indexing, unique 거릭

* 🐛 fix: 타입 가드 빠진 부분을 추가하고, detail이

ISSUES CLOSED: 작동되는 것을 확인함

* 🐛 fix: 유량 제어 제거, try-catch로 다시 시작 추가

* ♻️ refactor: cron 추가

* 🐛 fix: cron

* ♻️ refactor: period data 수정

* ♻️ refactor: console.log 삭제

* 🐛 fix: token의 expired 먼저 확인하고 db 접근으로 변경

* 🐛 fix: settimeout 시간 조정

* ♻️ refactor: 확인용 getItemchartprice 제거

* ✨ feat: detail 구현 완료

* 🐛 fix: insert시 데이터 있으면 발생하는 오류 수정

* 💄 style: 테스트용 start 삭제, cron만 남겨놓음

* 🐛 fix: unique column 조건 rollback

* 🐛 fix: detail data에 시범적으로 추상클래스 적용

---------

Co-authored-by: kimminsu <[email protected]>

* 🐛 fix: openApiToken 타입 변경으로 인한 발생한 오류 수정

* ✨ feat: 구글 로그인 리다이렉트 주소 임시로 변경

* ✨ feat: 사용자 주식 삭제를 stock id 값을 통해 진행하도록 변경

* ✨ feat: 사용자 소유 주식 리스트 제공 엔드포인트 구현

* ✨ feat: 변동률 랭킹 조회시 라이브 데이터 수집

* ✨ feat: 구글 로그인 후 리다이렉트 url 변경

* 🐛 fix: console log 제거

* ✨ feat: 변동률 라이브 데이터 수집 스케줄러 수정

* 🐛 fix: 배포 환경에서 발생하는 칼럼 에러 문제 해결

* Bug/#267 - typeorm 기능으로 exist 확인, token 발급주기 단축(12시간) (#269)

* ✨ feat: token entity 추가

* ✨ feat: entity 에 저장, expire 검사 로직 추가

* 🐛 fix: token 주입으로 로직 변경

* ♻️ refactor: token 주입으로 변경, 그로 인한 오류 수정 및 console.log 삭제

* 🐛 fix: live 데이터 수집 오류 해결, 데이터 없을 때 insert 오류 해결

* 🐛 fix: stock, livedata entity 수정

* ♻️ refactor: develop 환경시 logging 활성화

* 📦️ ci: production 환경일 때 작동되게 변경

* ♻️ refactor: websocket 모듈에서 liveData로 서비스 로직 분리

* ♻️ refactor: livedata stock module로 이동

* ✨ feat: 장 마감시 openapi로 부르는 로직 추가

* 🐛 fix: websocket logger 추가, client stock 저장되지 않는 오류 해결

* 🐛 fix: openapi는 저장이 필요 없음 롤 백

* 🐛 fix: open api로 데이터 받지 못하는 문제 해결

* 💄 style: 안 쓰이는 것 빼기

* 💄 style: console.log 삭제

* 🐛 fix: pk가 아닌 곳에 unique 키 추가

* 💄 style: 불필요한 logger 삭제

* ♻️ refactor: error, disconnect function 분리

* ♻️ refactor: stock data에 indexing, unique 거릭

* 🐛 fix: 타입 가드 빠진 부분을 추가하고, detail이

ISSUES CLOSED: 작동되는 것을 확인함

* 🐛 fix: 유량 제어 제거, try-catch로 다시 시작 추가

* ♻️ refactor: cron 추가

* 🐛 fix: cron

* ♻️ refactor: period data 수정

* ♻️ refactor: console.log 삭제

* 🐛 fix: token의 expired 먼저 확인하고 db 접근으로 변경

* 🐛 fix: settimeout 시간 조정

* ♻️ refactor: 확인용 getItemchartprice 제거

* ✨ feat: detail 구현 완료

* 🐛 fix: insert시 데이터 있으면 발생하는 오류 수정

* 💄 style: 테스트용 start 삭제, cron만 남겨놓음

* 🐛 fix: unique column 조건 rollback

* 🐛 fix: detail data에 시범적으로 추상클래스 적용

* 🐛 fix: abstract에 넣을 함수 start, step는 추상이 아닌 function으로 정의

* ✨ feat: index type 추가

* ✨ feat: type 추가 = TR_ID

* ✨ feat: index 기능 틀만 추가

* 💄 style: logger livedata에 추가

* 💄 style: 테스트용 데이터 삭제

* 💄 style: 토큰 만료시간을 20시간에서 12시간으로 단축

* ♻️ refactor: 데이터 존재여부를 내가 직접 하는 것이 아닌 typeorm 기능으로 변경

* ♻️ refactor: openapiIndex query 추가

---------

Co-authored-by: kimminsu <[email protected]>

* Feature/#259 코스피, 코스닥, 원달러 환율 받아오기 (#275)

* ✨ feat: token entity 추가

* ✨ feat: entity 에 저장, expire 검사 로직 추가

* 🐛 fix: token 주입으로 로직 변경

* ♻️ refactor: token 주입으로 변경, 그로 인한 오류 수정 및 console.log 삭제

* 🐛 fix: live 데이터 수집 오류 해결, 데이터 없을 때 insert 오류 해결

* 🐛 fix: stock, livedata entity 수정

* ♻️ refactor: develop 환경시 logging 활성화

* 📦️ ci: production 환경일 때 작동되게 변경

* ♻️ refactor: websocket 모듈에서 liveData로 서비스 로직 분리

* ♻️ refactor: livedata stock module로 이동

* ✨ feat: 장 마감시 openapi로 부르는 로직 추가

* 🐛 fix: websocket logger 추가, client stock 저장되지 않는 오류 해결

* 🐛 fix: openapi는 저장이 필요 없음 롤 백

* 🐛 fix: open api로 데이터 받지 못하는 문제 해결

* 💄 style: 안 쓰이는 것 빼기

* 💄 style: console.log 삭제

* 🐛 fix: pk가 아닌 곳에 unique 키 추가

* 💄 style: 불필요한 logger 삭제

* ♻️ refactor: error, disconnect function 분리

* ♻️ refactor: stock data에 indexing, unique 거릭

* 🐛 fix: 타입 가드 빠진 부분을 추가하고, detail이

ISSUES CLOSED: 작동되는 것을 확인함

* 🐛 fix: 유량 제어 제거, try-catch로 다시 시작 추가

* ♻️ refactor: cron 추가

* 🐛 fix: cron

* ♻️ refactor: period data 수정

* ♻️ refactor: console.log 삭제

* 🐛 fix: token의 expired 먼저 확인하고 db 접근으로 변경

* 🐛 fix: settimeout 시간 조정

* ♻️ refactor: 확인용 getItemchartprice 제거

* ✨ feat: detail 구현 완료

* 🐛 fix: insert시 데이터 있으면 발생하는 오류 수정

* 💄 style: 테스트용 start 삭제, cron만 남겨놓음

* 🐛 fix: unique column 조건 rollback

* 🐛 fix: detail data에 시범적으로 추상클래스 적용

* 🐛 fix: abstract에 넣을 함수 start, step는 추상이 아닌 function으로 정의

* ✨ feat: index type 추가

* ✨ feat: type 추가 = TR_ID

* ✨ feat: index 기능 틀만 추가

* 💄 style: logger livedata에 추가

* 💄 style: 테스트용 데이터 삭제

* 💄 style: 토큰 만료시간을 20시간에서 12시간으로 단축

* ♻️ refactor: 데이터 존재여부를 내가 직접 하는 것이 아닌 typeorm 기능으로 변경

* ♻️ refactor: openapiIndex query 추가

* ✨ feat: index, rate 수집 완료

* 💄 style: 경에러 발생시logging 형식 변경

* 💄 style: live data pingpong logger 제거

* 💄 style: decorator eslint 형식 맞추기

* ✨ feat: 주가 지표, 환율 지표 response dto 추가

* ✨ feat: 주가 지표, 환율 컨트롤러 추가

* ✨ feat: controller추가, module 의존성 추ㅏㄱ

* ✨ feat: 이전에 했던 내용들 머지

* 💄 style: minute cron 삭제

* ♻️ refactor: index 엔드포인트 하나로 축약

* ✨ feat: 테스트 코드 추가

* 💄 style: cron필요하지 않는 거 삭제

* ♻️ refactor: 안 쓰이는 openapi util 함수 삭제

* 📝 docs: 지표 설명이 부족한 거 같아 추가

---------

Co-authored-by: kimminsu <[email protected]>

* ✨ feat: 로그아웃 엔드포인트 구현

* ✨ feat: 로그인 상태 확인 시 닉네임도 전송

* ✨ feat: 유저 정보 조회 엔드포인트 구현

* ✨ feat: 유저 닉네임 변경 엔드포인트 구현

* ✨ feat: 닉네임 변경 엔드포인트 스웨거 설정

* ✨ feat: cors를 로컬 환경에 허용

* ✨ feat: 상위 조회수 주식 라이브 데이터 수집 구현

* ✨ feat: 주식 가격 상승 및 하락률 조회 API 구현

* ✨ feat: 상위 조회 수 라이브 데이터 요청 큐 적용

* 🐛 fix: update at 갱신 문제 해결

* 🐛 fix: 누락된 키 다시 추가

* ✨ feat: 변동률 라이브 데이터 수집 스케줄러 재가동

* ✨ feat: 채팅 response id 필드 추가

* ✨ feat: 변동률 주가 데이터 큐 적용

* ♻️ refactor: 변동률 순위에 연관된 중복 코드 제거

* ♻️ refactor: 조회수 순위에 연관된 중복 코드 제거

* ✨ feat: 큐의 요청이 여러 계좌에 적절하게 분배할 수 있도록 구현

* 🐛 fix: 각 계좌마다 1초씩 block되는 문제 해결

* 🐛 fix: 변동률 데이터가 누적되는 현상 수정

* ✨ feat: 변동률 결과를 엔드포인트를 쿼리에 따라서 전송하도록 구현

* ✨ feat: 채팅에 서브네임 추가

* ✨ feat: 유저 로그인 상태 조회 시 subName도 전송

* ✨ feat: 개별 채팅 메시지 타입 수정

* 🐛 fix: 변동률 데이터가 정해진 길이를 받지 않는 버그 수정

---------

Co-authored-by: kimminsu <[email protected]>
Co-authored-by: kimminsu <[email protected]>
Co-authored-by: baegyeong <[email protected]>
  • Loading branch information
4 people authored Nov 28, 2024
1 parent 41a4115 commit 5ac11cc
Show file tree
Hide file tree
Showing 100 changed files with 4,473 additions and 595 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,6 @@ report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json

# vscode setting
.vscode

# remote
.remote
4 changes: 4 additions & 0 deletions packages/backend/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,7 @@ pids

# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json

# backup file
.backup
.bak
13 changes: 9 additions & 4 deletions packages/backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,20 @@
"test:watch": "jest --watch",
"test:cov": "jest --coverage",
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
"test:e2e": "jest --config ./test/jest-e2e.json"
"test:e2e": "jest --config ./test/jest-e2e.json",
"mem": "node ../../dist/main --inspect"
},
"dependencies": {
"@nestjs/common": "^10.0.0",
"@nestjs/config": "^3.3.0",
"@nestjs/core": "^10.0.0",
"@nestjs/passport": "^10.0.3",
"@nestjs/platform-express": "^10.0.0",
"@nestjs/platform-socket.io": "^10.4.7",
"@nestjs/platform-socket.io": "^10.4.8",
"@nestjs/schedule": "^4.1.1",
"@nestjs/swagger": "^8.0.5",
"@nestjs/typeorm": "^10.0.2",
"@nestjs/websockets": "^10.4.7",
"@nestjs/websockets": "^10.4.8",
"axios": "^1.7.7",
"class-transformer": "^0.5.1",
"class-validator": "^0.14.1",
Expand All @@ -39,13 +40,15 @@
"nest-winston": "^1.9.7",
"passport": "^0.7.0",
"passport-google-oauth20": "^2.0.0",
"passport-local": "^1.0.0",
"reflect-metadata": "^0.2.0",
"rxjs": "^7.8.1",
"socket.io": "^4.8.1",
"typeorm": "^0.3.20",
"unzipper": "^0.12.3",
"winston": "^3.17.0",
"winston-daily-rotate-file": "^5.0.0"
"winston-daily-rotate-file": "^5.0.0",
"ws": "^8.18.0"
},
"devDependencies": {
"@nestjs/cli": "^10.0.0",
Expand All @@ -56,8 +59,10 @@
"@types/jest": "^29.5.2",
"@types/node": "^20.3.1",
"@types/passport-google-oauth20": "^2.0.16",
"@types/passport-local": "^1.0.38",
"@types/supertest": "^6.0.0",
"@types/unzipper": "^0.10.10",
"@types/ws": "^8.5.13",
"@typescript-eslint/eslint-plugin": "^8.0.0",
"@typescript-eslint/parser": "^8.0.0",
"cz-emoji-conventional": "^1.1.0",
Expand Down
2 changes: 1 addition & 1 deletion packages/backend/src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { ChatModule } from '@/chat/chat.module';
import {
typeormDevelopConfig,
typeormProductConfig,
} from '@/configs/devTypeormConfig';
} from '@/configs/typeormConfig';
import { logger } from '@/configs/logger.config';
import { StockModule } from '@/stock/stock.module';
import { UserModule } from '@/user/user.module';
Expand Down
54 changes: 54 additions & 0 deletions packages/backend/src/auth/auth.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import { Controller, Get, Post, Req, Res } from '@nestjs/common';
import { ApiOkResponse, ApiOperation, ApiTags } from '@nestjs/swagger';
import { Request, Response } from 'express';
import { sessionConfig } from '@/configs/session.config';
import { User } from '@/user/domain/user.entity';

@ApiTags('Auth')
@Controller('auth')
export class AuthController {
@ApiOperation({
summary: '로그아웃',
description: '로그아웃을 진행한다.',
})
@Post('/logout')
logout(@Req() req: Request, @Res() res: Response) {
req.logout((err) => {
if (err) {
return res
.status(500)
.send({ message: 'Failed to logout', error: err });
}
req.session.destroy((destroyErr) => {
if (destroyErr) {
return res
.status(500)
.send({ message: 'Failed to destroy session', error: destroyErr });
}
res.clearCookie(sessionConfig.name || 'connect.sid');
return res.status(200).send({ message: 'Logged out successfully' });
});
});
}

@ApiOperation({
summary: '로그인 상태 확인',
description: '로그인 상태를 확인합니다.',
})
@ApiOkResponse({
description: '로그인된 상태',
example: { message: 'Authenticated' },
})
@Get('/status')
async user(@Req() request: Request) {
if (request.user) {
const user = request.user as User;
return {
message: 'Authenticated',
nickname: user.nickname,
subName: user.subName,
};
}
return { message: 'Not Authenticated', nickname: null, subName: null };
}
}
17 changes: 14 additions & 3 deletions packages/backend/src/auth/auth.module.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,24 @@
import { Module } from '@nestjs/common';
import { PassportModule } from '@nestjs/passport';
import { GoogleAuthController } from '@/auth/google/googleAuth.controller';
import { GoogleAuthService } from '@/auth/google/googleAuth.service';
import { GoogleStrategy } from '@/auth/google/strategy/google.strategy';
import { AuthController } from '@/auth/auth.controller';
import { SessionSerializer } from '@/auth/session/session.serializer';
import { TesterStrategy } from '@/auth/tester/strategy/tester.strategy';
import { TesterAuthController } from '@/auth/tester/testerAuth.controller';
import { TesterAuthService } from '@/auth/tester/testerAuth.service';
import { UserModule } from '@/user/user.module';

@Module({
imports: [UserModule],
controllers: [GoogleAuthController],
providers: [GoogleStrategy, GoogleAuthService, SessionSerializer],
imports: [UserModule, PassportModule.register({ session: true })],
controllers: [GoogleAuthController, TesterAuthController, AuthController],
providers: [
GoogleStrategy,
GoogleAuthService,
SessionSerializer,
TesterAuthService,
TesterStrategy,
],
})
export class AuthModule {}
22 changes: 3 additions & 19 deletions packages/backend/src/auth/google/googleAuth.controller.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Controller, Get, Req, Res, UseGuards } from '@nestjs/common';
import { ApiOkResponse, ApiOperation, ApiTags } from '@nestjs/swagger';
import { Request, Response } from 'express';
import { Controller, Get, Res, UseGuards } from '@nestjs/common';
import { ApiOperation, ApiTags } from '@nestjs/swagger';
import { Response } from 'express';
import { GoogleAuthGuard } from '@/auth/google/guard/google.guard';

@ApiTags('Auth')
Expand All @@ -23,20 +23,4 @@ export class GoogleAuthController {
async handleRedirect(@Res() response: Response) {
response.redirect('/');
}

@ApiOperation({
summary: '로그인 상태 확인',
description: '로그인 상태를 확인합니다.',
})
@ApiOkResponse({
description: '로그인된 상태',
example: { message: 'Authenticated' },
})
@Get('/status')
async user(@Req() request: Request) {
if (request.user) {
return { message: 'Authenticated' };
}
return { message: 'Not Authenticated' };
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ describe('GoogleAuthService 테스트', () => {
};

test('oauthId와 type에 맞는 유저가 있으면 해당 객체를 반환한다.', async () => {
const user: User = {
const user: Partial<User> = {
id: 1,
role: Role.USER,
type: OauthType.GOOGLE,
Expand Down
5 changes: 2 additions & 3 deletions packages/backend/src/auth/google/strategy/google.strategy.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import { Inject, Injectable } from '@nestjs/common';
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Profile, Strategy, VerifyCallback } from 'passport-google-oauth20';
import { GoogleAuthService } from '@/auth/google/googleAuth.service';
import { OauthType } from '@/user/domain/ouathType';
import { Logger } from 'winston';

export interface OauthUserInfo {
type: OauthType;
Expand All @@ -15,7 +14,7 @@ export interface OauthUserInfo {

@Injectable()
export class GoogleStrategy extends PassportStrategy(Strategy) {
constructor(private readonly googleAuthService: GoogleAuthService, @Inject('winston') private readonly logger: Logger) {
constructor(private readonly googleAuthService: GoogleAuthService) {
super({
clientID: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
Expand Down
2 changes: 1 addition & 1 deletion packages/backend/src/auth/session.module.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Module } from '@nestjs/common';
import { MemoryStore } from 'express-session';

export const MEMORY_STORE = 'memoryStore';
export const MEMORY_STORE = Symbol('memoryStore');

@Module({
providers: [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ export interface SessionSocket extends Socket {
session?: User;
}

interface PassportSession extends SessionData {
export interface PassportSession extends SessionData {
passport: { user: User };
}

Expand Down
30 changes: 30 additions & 0 deletions packages/backend/src/auth/session/websocketSession.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { MemoryStore } from 'express-session';
import { Socket } from 'socket.io';
import { websocketCookieParse } from '@/auth/session/cookieParser';
import { PassportSession } from '@/auth/session/webSocketSession.guard';

export class WebsocketSessionService {
constructor(private readonly sessionStore: MemoryStore) {}

async getAuthenticatedUser(socket: Socket) {
try {
const cookieValue = websocketCookieParse(socket);
const session = await this.getSession(cookieValue);
return session ? session.passport.user : null;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
} catch (e) {
return null;
}
}

private getSession(cookieValue: string) {
return new Promise<PassportSession | null>((resolve) => {
this.sessionStore.get(cookieValue, (err: Error, session) => {
if (err || !session) {
resolve(null);
}
resolve(session as PassportSession);
});
});
}
}
16 changes: 16 additions & 0 deletions packages/backend/src/auth/tester/guard/tester.guard.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { ExecutionContext, Injectable } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';

@Injectable()
export class TestAuthGuard extends AuthGuard('local') {
constructor() {
super();
}

async canActivate(context: ExecutionContext) {
const isActivate = (await super.canActivate(context)) as boolean;
const request = context.switchToHttp().getRequest();
await super.logIn(request);
return isActivate;
}
}
16 changes: 16 additions & 0 deletions packages/backend/src/auth/tester/strategy/tester.strategy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Strategy } from 'passport-local';
import { TesterAuthService } from '@/auth/tester/testerAuth.service';

@Injectable()
export class TesterStrategy extends PassportStrategy(Strategy) {
constructor(private readonly testerAuthService: TesterAuthService) {
super();
}

async validate(username: string, password: string, done: CallableFunction) {
const user = await this.testerAuthService.attemptAuthentication();
done(null, user);
}
}
51 changes: 51 additions & 0 deletions packages/backend/src/auth/tester/testerAuth.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { Controller, Get, Req, Res, UseGuards } from '@nestjs/common';
import {
ApiOkResponse,
ApiOperation,
ApiQuery,
ApiTags,
} from '@nestjs/swagger';
import { Request, Response } from 'express';
import { TestAuthGuard } from '@/auth/tester/guard/tester.guard';

@ApiTags('Auth')
@Controller('auth/tester')
export class TesterAuthController {
constructor() {}

@ApiOperation({
summary: '테스터 로그인 api',
description: '테스터로 로그인합니다.',
})
@ApiQuery({
name: 'username',
required: true,
description: '테스터 아이디(값만 넣으면 됨)',
})
@ApiQuery({
name: 'password',
required: true,
description: '테스터 비밀번호(값만 넣으면 됨)',
})
@Get('/login')
@UseGuards(TestAuthGuard)
async handleLogin(@Res() response: Response) {
response.redirect('/');
}

@ApiOperation({
summary: '로그인 상태 확인',
description: '로그인 상태를 확인합니다.',
})
@ApiOkResponse({
description: '로그인된 상태',
example: { message: 'Authenticated' },
})
@Get('/status')
async user(@Req() request: Request) {
if (request.user) {
return { message: 'Authenticated' };
}
return { message: 'Not Authenticated' };
}
}
11 changes: 11 additions & 0 deletions packages/backend/src/auth/tester/testerAuth.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { Injectable } from '@nestjs/common';
import { UserService } from '@/user/user.service';

@Injectable()
export class TesterAuthService {
constructor(private readonly userService: UserService) {}

async attemptAuthentication() {
return await this.userService.registerTester();
}
}
Loading

0 comments on commit 5ac11cc

Please sign in to comment.