Skip to content

Commit 9e15162

Browse files
Choi-JJunhoInvidamdaheeParkksongsunkookxhdtn8070
authored
develop -> main Merge (#486)
* test: TestContainer 적용 (#27) * test: TestContainer 적용 * test: TestContainer MySQL 버전 5.7로 변경 * test: RestAssured port 선언조건 추가 * feat: POST /user/login API 구현 (#50) * feat: User Entity 추가 * test: /user/login 인수테스트 작성 * feat: 로그인 뼈대코드 구성 * feat: testcontainer 도입 * test: TestContainer 적용 * test: TestContainer MySQL 버전 5.7로 변경 * test: RestAssured port 선언조건 추가 * feat: 사용자 로그인 구현 * feat: 사용자 마지막 로그인한 날짜 추가 * test: ActiveProfiles 설정 추가 * build: 토큰 값 minute 주석 추가 * refactor: refreshToken 만료일자 14일로 수정 * build: 불필요한 설정파일 제거 * refactor: 예외처리부 추가 * test: 학교 메일로 테스트케이스 수정 * refactor: 반환값 accessToken임을 명시 * feat: 상점 메뉴 조회 API 구현 (#112) * refactor: 전체 패키지 구조 변경 (#114) * refactor: 패키지 구조 변경 * refactor: DTO 레코드로 변경 * refactor: 상점 도메인 패키지 구조 변경 * refactor: 패키지 표현 변경 * feat: GET /lands API 구현 (#148) * feat : 도메인 생성 * faet : controller 구현 * feat : response DTO 생성 * feat : 전체 조회 service 구현 * feat : 전체 조회 repository 생성 * feat : Domain 생성 * test : 인수 테스트 작성 * refactor : 하위 패키지 중 domain을 model로 수정 * refactor : DTO 클래스에 JsonNaming 어노테이션 사용 * refactor : Column 어노테이션 안에 필요없는 내용 제거 * refactor : 복덕방 리스트 조회 메서드에 Transaction(readOnly=true)가 적용되도록 수정 * refactor : 리스트 원소로 사용하던 LandResponse의 이름을 LandListItemResponse로 수정 * feat: 사용자 인증 구현 (#149) * feat: 사용자 인증 구현 * refactor: ArgumentResolver 이름 변경 * refactor: CustomException 적용 * refactor: 예외상황 명시하도록 순서 변경 * refactor: 상수추출 * refactor: 미사용 생성자 제거 * chore: 패키지 변경 * refactor: 미사용 어노테이션 제거 * refactor: 오타수정 * refactor: 오류메시지 구체화 * refactor: 미사용 메서드 제거 * �feat: GET /dept, GET /depts 구현 (#147) * refactor: 패키지 구조 변경 * refactor: DTO 레코드로 변경 * refactor: 상점 도메인 패키지 구조 변경 * feat: 학과 조회 관련 틀 작성 * feat: 학과명 열거형 추가 * feat: 학과 조회 초안 작성 * feat: 학과 조회 정상 동작 * refactor: 열거형 제거 최대한 도입해보려 시도했으나 `@Enumerated(EnumType.STRING)`으로는 불가능한 구조인 것으로 판단하여 제거 (DB에 한글로 저장되어 있어서 enum과 매핑하려면 한글 열거형이 필요해보임) ERROR DETAIL: "No enum constant in.koreatech.koin.domain.dept.domain.DeptType.기계공학부" * rename: 정적 팩토리 메서드 네이밍 수정 * test: 인수 테스트 추가 * fix: 정상 동작하도록 수정 (복합키 매핑 이전) * refactor: 복합키 매핑 * remove: 미사용 코드 제거 * feat: GET /depts 구현 * test: GET /depts 테스트 작성 * rename: 도메인명 수정 Dept -> DeptInfo * fix: DeptInfoRepository Key 수정 * refactor: service 코드 간소화 * fix: GET /dept 응답 메시지 자료형 수정 * refactor: 트랜잭션 적용 * rename: 변수명 수정 * refactor: 응답 객체 자료형 수정 * refactor: 개행 컨벤션 준수 * rename: DTO 네이밍 수정 * refactor: 개행 컨벤션 준수 * refactor: 메서드 네이밍 수정 * test: 테스트 인자 상수화 * test: 코드 간소화 * fix: Repository ID 제네릭 수정 * refactor: Static Import로 변경 Response 클래스들에 붙은 SnakeCaseStrategy.class를 static import하여 가독성 향상 * test: GET /depts 테스트 코드 수정 1. 기존에 연관관계를 테스트하지 않던 코드 수정 2. 반복문을 제거하고 일일이 매핑하도록 수정 * refactor: DB에서 enum으로 구조 변경 cc. #152 * rename: 메서드명 컨벤션 준수 * rename: 컨트롤러 메서드명 컨벤션 준수 * refactor: 존재하지 않을 시 응답 코드 변경 * style: enum 개행 조정 * remove: DB 미사용으로 인한 불필요 코드 제거 --------- Co-authored-by: Invidam <hansupark0208@gmail.com> * feat: logout 구현 (#154) * feat: accessToken 재발급 (#155) * feat: logout 구현 * feat: accessToken 재발급 구현 * fix: 응답 수정 및 테스트 수정 * refactor: 사용자 인증 요구사항 제거 * refactor: 리프레시토큰 userId 구분 * �feat: 게시글 목록 조회 구현 (#158) * feat: 골격 작성 * feat: 엔티티 작성 * feat: repository 작성 * feat: service 작성 * feat: response 작성 * feat: DB 조회 로직 작성 * feat: Jsoup 의존성 추가 * feat: 응답 내용 추가 1. article.is_notice 2. article.contentSummary 3. board.is_notice 4. board.children (must null) * feat: 예외처리 작성 * refactor: 페이징 관련 정보 클래스 분리 * fix: soft delete된 게시판 or 게시글은 조회 안되도록 수정 * fix: 1페이지 조회 안되는 버그 수정 * fix: 누락된 응답 추가 (summary) * fix: 최신글부터 조회하도록 수정 * test: 테스트 코드 작성 * move: ErrorResponseWrapper 위치 변경 * refactor: 코딩 컨벤션 준수 * refactor: 문자열 파싱 메서드 리팩토링 * test: 예외상황 테스트 추가 * feat: 메뉴 카테고리 목록 조회 (#153) * feat: 메뉴 카테고리 조회 기능 구현 * refactor: 응답 DTO 생성 로직 수정 * refactor: cascade 처리 방식 변경 refactor: cascade 처리 방식 변경 * test: 테스트 문맥 변경 * feat: 복덕방 단일 조회 (#156) * feat : controller 구현 * feat : repository에 id로 조회 기능 생성 * feat : service에 조회 기능 구현 * feat : 응답 DTO 구현 * refactor : domain 필드 자료형 변경 * refactor : stream 라인 변경 * refactor : 코드 축약 * test : 단일 조회 테스트 작성 * refactor : 에러 메시지 구체적으로 수정 * refactor : 기존 응답 구조와 동일하도록 수정 * test : 테스트에 이미지 추가 * refactor:� findByXXX -> getByXXX (#164) * refactor: default method 활용한 getByXXX 메소드 추가 * style: 공벡 제거 * refactor: 복덕방에도 적용 * refactor: DataNotFoundException으로 묶어서 관리 * feat: 게시글 단일 조회 (#173) * feat: 골격 작성 * feat: Repository 메서드 추가 * feat: 응답 객체 작성 * feat: Comment 도메인 엔티티 작성 * feat: 초안 완성 * fix: 로그인된 사용자 정보 습득 절차 수정 1. 비로그인 유저의 요청도 받도록 수정 2. 올바르지 않은 토큰 입력 시 권한 없음으로 진행되도록 수정 * rename: 응답 객체 변수명 수정 * refactor: 내용 요약 정보 최신화 시기 변경 기존: getter 호출 시마다 로직 수행하여 추출 변경: jpa 엔티티 로드 후 1회 로직 수행 * refactor: 유저 인증 정보 전달 방식 수정 기존: 컨트롤러단에서 @RequestHeader로 받아 전달 변경: 서비스단에서 RequestContextHolder로 습득 * feat: 게시글 조회 기록 저장 및 조회수 변동 구현 유저의 게시글 조회가 조회수 증가로 이어지는 간격을 1시간으로 설정 * fix: 게시글 조회 관련 버그 수정 기존에 게시글 조회 이력이 남아있는데 만료 시간이 지난 경우, 기존 내역을 업데이트해줘야 하나 새로 저장을 시도하여 구문 에러가 발생함. 위 상황에는 기존 내역을 업데이트하는 로직을 추가함으로써 문제 해결 * fix: 게시글 목록 조회 버그 수정 문제: 최대 페이지 초과 시 404 에러가 발생하지 않음. 원인: 예외처리 로직을 별도 함수로 분리했으나 기존 함수를 사용중이었음 해결: 예외처리가 적용된 함수로 호출문 변경 * fix: 조회 기록 Builder에 만료시간 기입 * test: 신규 테스트 추가 및 기존 테스트 수정 * other: 학과 조회 자료형 수정 학과 코드: Long -> String * refactor: 코드스타일 개선 * rename: 메서드 네이밍 수정 * refactor: 빈 게시글 목록 조회 예외처리 제거 * refactor: IP 주소 습득 로직 분리 * test: 예외 제거에 따른 테스트 수정 * refactor: 연관관계 방식으로 로직 및 테스트 수정 * refactor: ArticleViewLog의 FK를 연관관계로 매핑 * refactor: Auth 어노테이션 활용하도록 변경 (#175) * refactor: Auth 어노테이션 활용하도록 변경 * refactor: IPAddress Interceptor 추가 * chore: auth global 패키지로 이동 * style: 로깅 디테일 * refactor: 불필요한 UserType 제거 * docs: add swagger config (#176) * refactor: Auth 어노테이션 활용하도록 변경 * refactor: IPAddress Interceptor 추가 * docs: swagger 추가 * chore: auth global 패키지로 이동 * style: 로깅 디테일 * refactor: 불필요한 UserType 제거 * refactor: Parameter Path 수정 * feat: 버전 단일 조회 (#168) * feat: request dto 작성 * feat: 엔티티 작성 * feat: response dto 작성 * feat: 서비스 작성 * feat: 컨트롤러 작성 * feature: 기존 코드 제거 및 테스트 코드 추가 * feat: 리뷰 적용 * feat: VersionType 피드백 적용 및 Exception Test Case 추가 * feat: 공백 컨벤션 수정 & No newline at end of file 적용 * feat: 회원 탈퇴 구현 (#178) * feat: 회원 탈퇴 구현 * refactor: 줄바꿈 * feat: 인기 게시글 목록 조회 (#181) * feat: API 골격 작성 * feat: Redis 접근 기능 구 * feat: 만료 체크 로직 자동화 * feat: 인기 많은 게시글 출력 로직 작성 1. 모든 로그 조회 2. 조회수 내림차순 정렬 3. Limit로 자르기 4. 결과 반환 * refactor: 스케줄러 관심사 분리 * feat: 최근 조회된 게시글 수가 10개 미만이면 최신 게시글과 병합 * fix: 응답 객체 필드명 수정 * test: 테스트 작성 * refactor: 조회수 검증 로직 개선 * docs: 응답 객체 설명 추가 * test: 불필요한 콘솔 출력 제거 * refactor: redis 대신 mysql을 사용하도록 수정 * test: 테스트 수정 * feat: 사장님 정보 조회 (#182) * feat: 도메인 엔티티 생성 * feat: 응답 객체 초안 작성 * feat: 도메인 클래스 작성 * feat: API 작성 1. 경로 수정(다른 API로 착각하고 작업중이었어서 수정) 2. 연관관계 매핑 3. API 로직 작성 * test: 테스트 작성 * refactor: 접근제어자 수정 * docs: 응답 객체 문서 주석 추가 * refactor: 트랜잭션 추가 * refactor: 예외처리 보완 * refactor: 양방향 연관관계 제거 * refactor: 잘못 기입된 Setter 제거 * refactor: 기본생성자 접근제어 추가 * refactor: 소프트딜리트된 대상은 제외 * refactor: 기본생성자 접근제어 추가 * style: 컨벤션 준수 * rename: 메서드명 변경 * feat: 사장님 자신의 모든 상점 조회 (#183) * feat: 도메인 엔티티 생성 * feat: 응답 객체 초안 작성 * feat: 도메인 클래스 작성 * feat: API 작성 1. 경로 수정(다른 API로 착각하고 작업중이었어서 수정) 2. 연관관계 매핑 3. API 로직 작성 * test: 테스트 작성 * feat: API 작성 * test: 테스트 작성 * refactor: 트랜잭션 적용 * docs: 응답 객체 문서 주석 추가 * fix: 버그 수정 * refactor: 읽기 전용 트랜잭션으로 수정 * refactor: 개행 컨벤션 준수 * feat: 사장님 회원가입 인증번호 전송 요청 (#184) * feat : owner controller 구현 * refactor: 기존 url에 맞게 수정 * feat: 이메일 관련 도메인 생성 & 검증 기능 구현 * feat: 중복 이메일인지 검증하는 기능 구현 * feat : AwsSesConfig 작성 * feat : SesMailSender 작성 * feat: 메일폼 작성 & 템플릿 가져오는 기능 구현 * feat: 메일 보내는 기능 구현 * feat: 메일 보낼 수 있는지 검사 * feat: OwnerInVerification 작성 * feat: redis에 저장 * fix: 타임리프 가져오는 에러 해결 * fix: 메일 전송 에러 해결 * refactor: mail form loader 설정 코드 메서드로 분리 * fix: 중복 이메일 검증 오류 해결 * feat: slack에 알림 보내는 기능 구현 * feat: 스웨거 작성 * refactor: 예외처리 수정 * feat: 슬랙 test url 작성 * feat: 레디스에 있는 사장님 정보 조회 구현 * test: 회원가입 인증번호 전송 요청 테스트 작성 * style: 클래스&메서드명 수정 * style: global의 commaon 패키지를 domain 패키지로 수정 * test: 테스트 메서드명 수정 * refactor: 인증번호 랜덤 생성을 따로 구현 * refactor: Aws SES 서울 리전으로 수정 * refactor: 이메일 검증 로직 수정 * fix: AWS SES 기존 Region으로 수정 * refactor: 스프링 이벤트 적용해서 슬랙 알림 전송하도록 수정 * refactor: 메일폼 가져오는 라이브러리 thymeleaf로 변경 * test: 슬래 전송 실패해도 200으로 응답하는 테스트로 수정 * test: 사장님 회원가입 인증번호 전송 요청 이벤트 발생 시 슬랙 전송 이벤트가 발생하는지 확인하는 테스트 * refactor: EmailAddress 객체 정적 팩토리 메서드를 사용하도록 수정 * refactor: OwnerInVerification 팩토리 메서드명 수정 * refactor: noticeEmailVerification()에서 코드 줄임 * refactor: 사용하지 않는 코드 제거 * test: MockBean을 SpyBean으로 수정 * test: MockBean 위치 변경 * test: application test yml에 thymeleaf 경로 설정 추가 * test: test/resources/mail/owner메일폼 추가 * test: test/resources/owner메일폼 제거 * test: MockBean 위치 AcceptanceTest로 변경 * style: record 변수 선언 세로로 위치 변경 * style: OwnerInVerification의 AccessLevel static import로 수정 * style: User 생성자 인수 일정하게 나열 * refactor: User 생성자 private으로 수정 * style: 모든 AccessLevel을 static import로 수정 * style: Owner, OwnerAttachment Doamin 위치 domain 패키지에서 model패키지로 수정 * refactor: aws ses 최신 버전으로 수정 * fix: 버전 매핑 에러 수정 (#191) * fix: 버그 수정 * refactor: 예외 수정 * test: 테스트 분리 * feat: 버전 최신화 메서드 작성 * refactor: 응답 간결화 및 버그 수정 * feat: 이메일 중복 체크 (#194) * feat: 이메일 중복 체크 구현 * feat: 이메일 중복 테스트 구현 * chore: application-test.yml 수정 - datasource 추가 * chore: application-test.yml 수정 - datasource 삭제 * refactor: ModelAttribute 적용 - @RequestParam -> @ModelAttribute * feat: 이메일 중복 테스트 추가 - 이메일을 보내지 않으면 400 - 잘못된 이메일 형식이면 400 * style: 라인 포맷팅 * feat : 강의 목록 조회(학기별) (#192) * feat : Lecture 클래스 생성 * feat : LectureApi 클래스 생성 * feat : LectureController 클래스 생성 * feat : LectureRepository 클래스 생성 * feat : LectureResponse DTO 생성 * feat : LectureService 클래스 생성 * feat : LectureApiTest 테스트 생성 후 통과 * refactor : 리뷰 반영 * refactor : classTime 반환타입 Integer[]로 변경 * refactor : 리뷰 반영 * refactor : Integer[]배열 List<Long>으로 변경 * refactor : TimeTable로 네이밍 변경 * refactor : 리뷰 반영 * feat: 버스 남은 시간 조회 - 셔틀버스, 등하교 버스 (#185) * feat: API 골격 작성 * feat: mongoDB 의존성 추가 * feat: 응답 객체 작성 * feat: 예외 추가 * feat: 엔티티 작성 * feat: 미운행인 버스 필터링 * feat: enum 추가 * feat: 남은 시간 계산 로직 작성 * feat: 가장 최근 버스까지 남은 시간 응답 구현 * feat: 미운행 요일 제외 로직 추가 * feat: 버스 정거장 검증로직 적용 및 중복되는 시간 제외 * refactor: enum 객체를 사용하도록 수정 * refactor: 등하교 방향 기준 탐색에서 정류장 탐색으로 로직 변경 * remove: 미사용 코드 제거 BusCourse.isRunning() * refactor: 테스트 mocking 위해 Clock 사용하도록 수정 * test: 테스트컨테이너 mongoDB 추가 * test: 셔틀 버스 조회 테스트 추가 * docs: API 문서에 파라미터 정보 명시 * remove: 불필요 주석 제거 * refactor: 누락된 Transactional 추가 * fix: mocking 변수 선언부 이동 * remove: 불필요 주석 제거 * refactor: 도착 시각 패턴 불일치 시 예외처리 * refactor: 반복문을 stream으로 변환 * refactor: 엔티티 필드로 List 사용 시 미리 초기화 * refactor: String 비교 시 NPE 예방 * refactor: 불필요한 매핑 메서드 제거 * refactor: 변수 분리 * rename: 변수명 수정 * refactor: Builder 생성자 접근제어자 수정 * refactor: enum 필드 간소화 * fix: 미사용 예외 사용하도록 수정 * feat: 출발지와 도착지가 일치할 경우 예외 처리 * refactor: IllegalArgumentException 예외 응답 수정 * feat : 학기 조회(전학기) (#196) * feat : Semester get API 구현 완료 * chore : 리뷰 반영 코드 위치 수정 / 패키지 이름 변경 * style : 라인 포매팅 및 클래스 삭제 * test : 테스트 코드 수정 * feat : 사장님 식당 생성, 특정 상점 조회 API구현 (#199) * feat: 상점 생성 기능 추가 * feat: 상점등록을 하기 위해 연관된 model정의 * feat: shop과 관련된 repository, exception작성 * feat: 1차 테스트 완료 * feat: 사장님 상점 생성 기능 구현 * feat: 특정상점조회 API구현 * refactor: 특정상점조회 테스트코드 수정 * chore: import경로 오류 수정 * chore: pull충돌 해결 * refactor: saveAll제거 * feat: 스웨거 설명 추가 * refactor: Builder생성자 접근제어 변경 * refactor: ShopResponse 적팩메이름 of로 변경 * refactor: ShopResponse 적팩메이름 of로 변경 * feat: 닉네임 중복 체크 (#189) * refactor: 회원 탈퇴 반환타입 수정 * feat: 중복 데이터 예외 처리 추가 * feat: 닉네임 중복 예외 처리 추가 * feat: 닉네임 중복 체크 구현 * feat: 닉네임 중복 테스트 * refactor: 예외 처리 수정 * refactor: 닉네임 중복 로직 수정 * feat: 닉네임 중복 중복아닐때, 제약조건위반시 테스트 추가 * refactor: 파라미터 valid 적용 * refactor: 전역 데이터 중복 예외 제거(이미 전에 누가 만들었음) * feat: 충돌 해결 * refactor: 코멘트 반영 수정 * feat : 식단 Api 구현 (#193) * feat : 충돌 해결 * chore : VersionException 제거 * chore : SnakeCaseStrategy import static 수정 * refactor : 엔티티 id int -> Long 수정 * feat : 사장님 식당 생성, 특정 상점 조회 API구현 (#199) * feat: 상점 생성 기능 추가 * feat: 상점등록을 하기 위해 연관된 model정의 * feat: shop과 관련된 repository, exception작성 * feat: 1차 테스트 완료 * feat: 사장님 상점 생성 기능 구현 * feat: 특정상점조회 API구현 * refactor: 특정상점조회 테스트코드 수정 * chore: import경로 오류 수정 * chore: pull충돌 해결 * refactor: saveAll제거 * feat: 스웨거 설명 추가 * refactor: Builder생성자 접근제어 변경 * refactor: ShopResponse 적팩메이름 of로 변경 * refactor: ShopResponse 적팩메이름 of로 변경 * feat : 커스텀 예외처리 추가 * chore : 충돌 해결 * chore : 테스트 정보 수정 * chore : 파라미터 설명 추가 * refactor : menu String -> List 수정 * fix : 테이블명 수정 * refactor : 현재시간에 대한 테스트를 위해 clock 모킹 추가 * remove : 사용하지 않는 예외 삭제 * chore : 테스트코드 public 제외, 불필요한 공백 삭제 --------- Co-authored-by: Hyeonsu Lee <127578418+20HyeonsuLee@users.noreply.github.com> * feat : 특정상점 전체메뉴조회 api작성 (#208) * feat: 특정 상점 모든 메뉴조회 api 작성 * feat: 특정 상점 모든 메뉴조회 api 테스트코드 작성 * feat: 코드리뷰사항 반영 1 차 * feat: 코드 리뷰사항 반영 2차 * feat : BCSD Lab 활동 api구현 (#207) * feat: bcsd lab 활동 가져오기 1차 테스트 통과 * refactor: 반환 값을 리스트에서 맵으로 변경 * refactor: activitiy api 반환값 맵으로 변경 * refactor: controller가 ActivityApi를 구현하게 변경 * chore: 불필요한 문자 제거 * style: 서비스 로직 최적화 * chore: 불필요한 코드 삭제 * chore: 충돌 해결 * chore: 불필요한 문자 제거 * chore: 1차 코드 리뷰 피드백 적용 * chore: 테스트 정보 주정 * style: 테스트에 param 적용 * chore: 줄 바꿈 수정 * style: 반환 타입 을 dto로 변경 * style: 컨트롤러 변수의 반환타입을 명시적으로 변경 * chore: 피드백 반영 * chore: 테스트 코드 내용 추가 * chore: ActivitiesResponseList Dto이름 변경 * feat: Presigned URL 구현 (#210) * feat: Enum Converter 추가 * style: 변수명 변경 * style: 불필요한 주석 제거 * refactor: Controller 테스트 제거 * refactor: 예외 수정 * chore: 패키지 구분 * refactor: 외부 API로 구분 * style: 공백제거 * test: 테스트 수정 * refactor: 변수명 변경 * refactor: fileName 포함하도록 수정 * refactor: request dto swagger 설명 추가 * refactor: passwordEncoder 활용하도록 수정 (#211) * fix: 특정 상점 전체메뉴조회 응답 객체 미스매치 수정 (#214) * feat: 특정 상점 모든 메뉴조회 api 작성 * feat: 특정 상점 모든 메뉴조회 api 테스트코드 작성 * feat: 코드리뷰사항 반영 1 차 * feat: 코드 리뷰사항 반영 2차 * fix: menus응답 수정 * chore: 충돌 해결 * chore: 충돌 해결 * chore: 응답 필드 이름 수정 * chore: 응답 필드 이름 수정 * feat: 시간표 기능 구현 (#212) * feat: 시간표 조회 기능 추가 * feat: 시간표 생성 기능 추가 * feat: 시간표 수정/삭제 기능 추가 * fix: 시간표 수정 변경 * refactor: 리뷰 반영 1차 * refactor: 리뷰 반영 2차 * refactor: 리뷰 반영 3차 * refactor: UpdateTimeTableRequest 이름 수정 UpdateTimeTableRequest -> TimeTableUpdateRequest * refactor: 리뷰 반영 5차 * refactor: 리뷰 반영 6차 * feat: 파일 단건 업로드 구현 (#227) * feat: 파일 단건 업로드 구현 * refactor: swagger 문서 추가 * refactor: swagger 설명 추가 * refactor: 미사용 변수 제거 * refactor: 파일 최대크기 설정 변경 * refactor: 필드주입방싱을 생성자주입 방식으로 변경 * feat: 파일 다중 업로드 구현 (#229) * feat: 파일 다중 업로드 구현 * docs: swagger 수정 * feat: 영양사 권한 추가 (#231) * feat: 영양사 권한 추가 * fix: 후행쉼표 추가 * fix: 복덕방 전제 조회 응답 객체 미스매치 수정 (#215) * chore: LandListItemResponse dto이름 LandsResponse로 변경 * fix: 반환값 list에서 key value형태로 변경 * fix: UploadServiceTest 수정 * style: 라인 포맷팅 * chore: ActivityResponse 예시 수정 * style: dto를 일반 클래스에서 record클래스로 수정 * style: ActivitiesResponse dto를 일반 클래스에서 record클래스로 수정 * feat: FCM 설정 (#232) * refactor: 상점 Entity 연관관계 설정 (#237) * feat: shop연관관계 수정 * refactor: 서비스레이어 dto변환 로직 제거 * feat: 상점사장님이 특정 상점을 조회하는 api작성 (#240) * feat: 상점조회 api작성 * chore: 라인포맷팅 * chore: 권한이 없는 사장님이 특정 상점 조회 테스트 코드 분리 --------- Co-authored-by: HyeonsuLee <leehyeonsu4888@naver.com> * feat : 영양사 품절 정보 입력 (#238) * feat : Dining 클래스에 soldOut 컬럼 추가 * feat : DiningResponse DTO에 soldOut 컬럼 추가 * feat : flyway DB에 sold_out 컬럼 추가 * feat : SoldOutRequest DTO 클래스 추가(메뉴아이디, 품절여부) * feat : CoopDiningController, CoopDiningApi 클래스 추 * feat : CoopDiningService 클래스 추가 * feat : DiningRepository 품절여부 변경 메서드 추가, 테스트용 메서드 추 * feat : 영양사 품절 요청 테스트, 권한 확인 테스트 추 * feat : 기존 테스트 동작하도록 수정 * feat : 리뷰 반 * feat : 리뷰 반영, 테스트 방식 변 * feat : coop 패키지 분 * feat : setSoldOut() 메서드 추 * feat : update 방식을 조회 후 set해주는 방식으로 변 * feat : 사용하지 않는 메서드 삭 * feat : 패키지 변경으로 인한 테스트 변경 * feat : 인가 테스트로 변경 * feat : getById()로 수정 * feat : 개행 추가 * feat : 메뉴가 없는 경우 예외 추가 * refactor: 컨벤션 반영 * refactor: snakecase로 변경 * feat : 영양사 코너별 식단 사진 업로드 (#241) * feat : 충돌 해결 * chore : VersionException 제거 * chore : SnakeCaseStrategy import static 수정 * refactor : 엔티티 id int -> Long 수정 * feat : 사장님 식당 생성, 특정 상점 조회 API구현 (#199) * feat: 상점 생성 기능 추가 * feat: 상점등록을 하기 위해 연관된 model정의 * feat: shop과 관련된 repository, exception작성 * feat: 1차 테스트 완료 * feat: 사장님 상점 생성 기능 구현 * feat: 특정상점조회 API구현 * refactor: 특정상점조회 테스트코드 수정 * chore: import경로 오류 수정 * chore: pull충돌 해결 * refactor: saveAll제거 * feat: 스웨거 설명 추가 * refactor: Builder생성자 접근제어 변경 * refactor: ShopResponse 적팩메이름 of로 변경 * refactor: ShopResponse 적팩메이름 of로 변경 * feat : 커스텀 예외처리 추가 * chore : 충돌 해결 * chore : 테스트 정보 수정 * chore : 파라미터 설명 추가 * refactor : menu String -> List 수정 * fix : 테이블명 수정 * refactor : 현재시간에 대한 테스트를 위해 clock 모킹 추가 * remove : 사용하지 않는 예외 삭제 * chore : 테스트코드 public 제외, 불필요한 공백 삭제 * feat : 영양사 컨트롤러, 서비스 구현 * feat : 식단 이미지 변수 추가 * feat : 영양사 권한 및 영양사 도메인 enum 추가 * feat : image 컬럼 추가 * feat : Image 업로드 요청 DTO 생성 * feat : 영양사님의 사진 업로드 테스트 추가 * feat : 특정 식단의 이미지 업데이트 쿼리 추가 * feat : 쿼리문 수정 * chore : log 제거 * refactor : coop Api 분리 * refactor : image_url로 변수명 수정 * refactor : image_url로 변수명 수정 * chore : menuId로 변수명 구체화 * chore : V$ -> V3 버전 수정 * remove : repository 계층 트랜잭션 제거(service 계층 처리) * feat : 허용되지 않은 권한에 대한 테스트 추가 * refactor : update 수정(setter 이용) * refactor : 테스트 - 허용되지않은 권한 수정 * refactor : getById() 추가 * chore : Optional 검증을 위해 findById() -> getById() 수정 * remove() : DynamicUpdate 제거 * chore : 충돌 해결 * chore : 파일 위치 수정 --------- Co-authored-by: Hyeonsu Lee <127578418+20HyeonsuLee@users.noreply.github.com> * feat: 사장님 회원가입 (#244) * feat: 사장님 회원가입 및 슬랙 알림발송 구현 * refactor: slack 알림발송 로직 수정 * refactor: 사장님 회원가입 로직 구성 * test: 미사용 테스트 제거 * style: 코드 포맷팅 * test: 테스트 수정 * refactor: update flyway * feature: 상점 사장님 관련 모든 GET API를 작성했습니다. (#245) * feat: 상점조회 api작성 * chore: 라인포맷팅 * feat: 점주전용 상점관련 조회 api작성 * feat: 사장님 상점 조회 api get 모두 작성 * chore: 리뷰사항 반영 --------- Co-authored-by: HyeonsuLee <leehyeonsu4888@naver.com> * fix: 게시판 공지사항 판단 로직 수정 (#246) * fix: 공지사항 판단 로직 수정 * fix: 공지사항 판단 로직 재수정 * refactor: 게시판 태그 enum으로 분리 * feat: 사장님 인증코드 검증 (#248) * feat: 사장님 인증번호 인증 구현 * refactor: 로직 수정 및 인증이 완료된 값에 대해 레디스 제거 * test: 테스트 추가 * build: 테이블 복원 * refactor: 인증방식 수정, 사용자 인증없이 사용자 id만 필요한 경우 `@UserId`를 사용하도록 수정 * test: MySQL 테스트 컨테이너 버전 8.0.29로 수정 * refactor: ArgumentResolver Webconfig 등록 * refactor: 파일업로드 임시 토큰에 대한 허용 * test: 테스트 수정 * refactor: 변수 사용 * fix: 전공별 커리큘럼 링크 수정, 새로운 과 추가 (#251) * fix: 전공별 커리큘럼 링크 수정, 새로운 과 추가 * fix: 전공별 커리큘럼 링크 다시 수정 * chore: DeptListItemResponse이름을 DeptsResponse로 변경 * style: 와일드 카드 사용하지 않는 것으로 다시 원래대로 복구 * chore: 주석 설명 변경 * style: 열거형 사용해서 필터 하게 변경 * feat: 사장님 비밀번호 재발급 구현 (#253) * feat: 사장님 인증번호 인증 구현 * refactor: 로직 수정 및 인증이 완료된 값에 대해 레디스 제거 * test: 테스트 추가 * build: 테이블 복원 * refactor: 인증방식 수정, 사용자 인증없이 사용자 id만 필요한 경우 `@UserId`를 사용하도록 수정 * test: MySQL 테스트 컨테이너 버전 8.0.29로 수정 * refactor: ArgumentResolver Webconfig 등록 * refactor: 파일업로드 임시 토큰에 대한 허용 * test: 테스트 수정 * feat: 사장님 비밀번호 찾기 API 구현 * refactor: 이메일 형식 수정 * refactor: 인증 제거 * feat : 회원 정보 수정 (#236) * feat : DTO 추가 * feat : 유저 수정 추가 * test : log.all() 삭제 및 422번 오류 삭제 * chore : update 수정 및 사용하지 않는 Request 객체 삭제 * refactor : update 이름 수정 * refactor : DTO major 라인 포맷팅 * chore : bulider() 미사용 및 update 로직 수 * chore : 리뷰 반영 및 학부/학번 404 -> 400번 오류로 수정 * chore : ApiResponse 수정 * chore : 리뷰 반영 * chore : withDetail 수정 * chore : 리뷰 반영(코드 스타일 및 메소드 분리) * chore : Local 내 회원 정보 조회 오류 확인 추가 * chore : 삼항 연산자 제거 * chore : Response department null 처리 추가 * chore : 변수 수정 및 Gender null 처리 추가 * chore : 변수 수정 및 department null 처리 추가 * chore : DB 학과 한글 저장 * chore : DB 저장 체크(Enumerated 삭제) * chore : DB 저장 체크(Enumerated 삭제 및 model 이름 수정) * chore : ENUM 사용하도록 재수정 * fix : ENUM -> STRING 사용 * chore : 검증 ENUM으로 이동 * chore : ENUM 영어 변수로 수정 * chore : ENUM 후행 쉼표 추가 * fix: 학기 최신 순으로 반환 (#268) * feat : 알림 구독 Api 구현 (#269) * feat : 충돌 해결 * chore : VersionException 제거 * chore : SnakeCaseStrategy import static 수정 * refactor : 엔티티 id int -> Long 수정 * feat : 사장님 식당 생성, 특정 상점 조회 API구현 (#199) * feat: 상점 생성 기능 추가 * feat: 상점등록을 하기 위해 연관된 model정의 * feat: shop과 관련된 repository, exception작성 * feat: 1차 테스트 완료 * feat: 사장님 상점 생성 기능 구현 * feat: 특정상점조회 API구현 * refactor: 특정상점조회 테스트코드 수정 * chore: import경로 오류 수정 * chore: pull충돌 해결 * refactor: saveAll제거 * feat: 스웨거 설명 추가 * refactor: Builder생성자 접근제어 변경 * refactor: ShopResponse 적팩메이름 of로 변경 * refactor: ShopResponse 적팩메이름 of로 변경 * feat : 커스텀 예외처리 추가 * chore : 충돌 해결 * chore : 테스트 정보 수정 * chore : 파라미터 설명 추가 * refactor : menu String -> List 수정 * fix : 테이블명 수정 * refactor : 현재시간에 대한 테스트를 위해 clock 모킹 추가 * remove : 사용하지 않는 예외 삭제 * chore : 테스트코드 public 제외, 불필요한 공백 삭제 * feat : 영양사 컨트롤러, 서비스 구현 * feat : 식단 이미지 변수 추가 * feat : 영양사 권한 및 영양사 도메인 enum 추가 * feat : image 컬럼 추가 * feat : Image 업로드 요청 DTO 생성 * feat : 영양사님의 사진 업로드 테스트 추가 * feat : 특정 식단의 이미지 업데이트 쿼리 추가 * feat : 쿼리문 수정 * chore : log 제거 * refactor : coop Api 분리 * refactor : image_url로 변수명 수정 * refactor : image_url로 변수명 수정 * chore : menuId로 변수명 구체화 * chore : V$ -> V3 버전 수정 * remove : repository 계층 트랜잭션 제거(service 계층 처리) * feat : 허용되지 않은 권한에 대한 테스트 추가 * refactor : update 수정(setter 이용) * refactor : 테스트 - 허용되지않은 권한 수정 * refactor : getById() 추가 * chore : Optional 검증을 위해 findById() -> getById() 수정 * remove() : DynamicUpdate 제거 * chore : 충돌 해결 * chore : 파일 위치 수정 * feat : 알림 구독 엔티티 생성 * feat: flyway 테이블 추가 * feat: API 형태 추가 * feat: 알림구독 추가, 삭제 컨트롤러 작성 * feat: 레포지토리 추가중.. * feat : delete api 수정 * feat: post 수정 중 .. * feat: GET 요청 반환값 만들기 * feat: 안정화 * feat: notification 팩토리 추가 * feat: getNotification 테스트코드 작성중 * test: 테스트 작성 중.. * feat: getNotification 테스트코드 작성완료 * feat: 스네이크케이스로 변경 후 디바이스토큰 추가 테스트코드 작성 * feat: post반환값 수정 * feat : deleteNotification 테스트 코드 추가 * feat : NotificationApiTest 완성 * remove : 알림 구독 관련 테스트 제거 * fix: 상속 받는 예외 클래스 수정 * fix: BIGINT -> UNSIGNED INT 수정 * test: koinAppUrl 추가 * style: 라인포맷팅 * test: .log().all() 제거 --------- Co-authored-by: Hyeonsu Lee <127578418+20HyeonsuLee@users.noreply.github.com> Co-authored-by: songsunkook <songsunkook@gmail.com> Co-authored-by: HyeonsuLee <leehyeonsu4888@naver.com> Co-authored-by: 최준호 <junho5336@gmail.com> * feat: 메뉴 변경 여부 추가 (#250) * feat: 메뉴 변경 확인 추가 * refactor: 테스트 수정 * feat: flyway 컬럼 추가 * refactor: V4에서 V5로 변경 * rename: V5에서 V6으로 변경 * Revert "feat: 메뉴 변경 여부 추가 (#250)" (#273) This reverts commit f8458cc. * refactor: 메뉴 변경 여부 컬럼명 통일 (#274) * feat: 메뉴 변경 확인 추가 * refactor: 테스트 수정 * feat: flyway 컬럼 추가 * refactor: V4에서 V5로 변경 * rename: V5에서 V6으로 변경 * refactor: 필드명 변경 * refactor: 필드명 변경 * feat: 버스 남은 시간 조회 - 시내버스 (#239) * feat: API 골격 작성 * feat: mongoDB 의존성 추가 * feat: 응답 객체 작성 * feat: 예외 추가 * feat: 엔티티 작성 * feat: 미운행인 버스 필터링 * feat: enum 추가 * feat: 남은 시간 계산 로직 작성 * feat: 가장 최근 버스까지 남은 시간 응답 구현 * feat: 미운행 요일 제외 로직 추가 * feat: 버스 정거장 검증로직 적용 및 중복되는 시간 제외 * refactor: enum 객체를 사용하도록 수정 * refactor: 등하교 방향 기준 탐색에서 정류장 탐색으로 로직 변경 * remove: 미사용 코드 제거 BusCourse.isRunning() * refactor: 테스트 mocking 위해 Clock 사용하도록 수정 * test: 테스트컨테이너 mongoDB 추가 * test: 셔틀 버스 조회 테스트 추가 * feat: 시내버스 Open API 호출 로직 작성 * feat: 방향 판단 로직 추가 * fix: 호출 예외 수정 * feat: json 파싱 로직 작성 1. json 파싱 로직 작성 2. 결과 코드 검증 3. 예외 추가 (500 반환) * feat: API 골격 작성 * feat: mongoDB 의존성 추가 * feat: 응답 객체 작성 * feat: 예외 추가 * feat: 엔티티 작성 * feat: 미운행인 버스 필터링 * feat: enum 추가 * feat: 남은 시간 계산 로직 작성 * feat: 가장 최근 버스까지 남은 시간 응답 구현 * feat: 미운행 요일 제외 로직 추가 * feat: 버스 정거장 검증로직 적용 및 중복되는 시간 제외 * refactor: enum 객체를 사용하도록 수정 * refactor: 등하교 방향 기준 탐색에서 정류장 탐색으로 로직 변경 * remove: 미사용 코드 제거 BusCourse.isRunning() * refactor: 테스트 mocking 위해 Clock 사용하도록 수정 * test: 테스트컨테이너 mongoDB 추가 * test: 셔틀 버스 조회 테스트 추가 * docs: API 문서에 파라미터 정보 명시 * remove: 불필요 주석 제거 * refactor: 누락된 Transactional 추가 * fix: mocking 변수 선언부 이동 * remove: 불필요 주석 제거 * refactor: 도착 시각 패턴 불일치 시 예외처리 * refactor: 반복문을 stream으로 변환 * refactor: 엔티티 필드로 List 사용 시 미리 초기화 * refactor: String 비교 시 NPE 예방 * refactor: 불필요한 매핑 메서드 제거 * refactor: 변수 분리 * rename: 변수명 수정 * fix: 충돌 해결 * refactor: Builder 생성자 접근제어자 수정 * refactor: enum 필드 간소화 * fix: 충돌 해결 * feat: 버스번호 필터링 * feat: 시내버스 조회 정보를 레디스 캐시로 저장 * feat: 버전 최신화 메서드 작성 * refactor: Pair를 사용하지 않도록 수정 * feat: ApiType 추가 - BusType과 BusOpenApiRequester 타입 맵핑을 위함 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: 주석 추가 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: record로 수정 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: 시내버스 캐시 저장 정보 변경 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * feat: 시내버스 버스 번호 반환 추가 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * feat: 버스 타입별 로직 분기 추가 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: 캐싱 정보 추가 - 남은 시간만 캐싱 -> 버스 도착 정보 통째로 캐싱 - api url 수정 - 버전 정보 저장 - forEach -> for Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: 시내버스 남은 시간 계산 로직 추가 - 버스 캐싱 정보 수정 - 시내버스 남은 시간 계산 로직 추가 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: 응답 객체 수정 - 기존: "now_bus": {"bus_number": null, ...} - 수정: "now_bus": null Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: 주석 추가 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: 응답 객체 null 체크 추가 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * feat: test 작성 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: 빈 배열 반환하도록 수정 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: 도착시간순 정렬 추가 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: 시간 차 수정 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: null 필터링 수정 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: updated_at 변경 로직 수정 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: .log().all() 삭제 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: switch문 if문으로 변경 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: 복붙 문제 수정 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * style: 컨벤션 적용 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * rename: BusInfoCache -> BusCache 이름 변경 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: 주석 수정 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * style: 컨벤션 적용 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: .log().all() 삭제 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * refactor: 패키지 분리 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * refactor: 상수, 검증 로직 분리 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * refactor: 파일 이름 수정 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * refactor: Bus.java 삭제와 구조 변경 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * refactor: 시내버스 남은 시간 - Redis 테스트 수정 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * refactor: 시내버스 남은 시간 - OpenApi 테스트 중간 작성 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * refactor: 변수명 변경 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * feat: 시내버스 남은 시간 - OpenApi 테스트 추 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * refactor: 시내버스 테스트 수정 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: Constant 클래스 enum으로 변경 * refactor: 캐시 만료 시간 분리 * Revert "refactor: Constant 클래스 enum으로 변" This reverts commit 5dcbf975cccbbd276dfa5e8dbbb52864eca6c209. * Revert "Revert "refactor: Constant 클래스 enum으로 변"" This reverts commit f321b7eb60f0d5426a1fef4d839c4861a08198a2. * refactor: Constant 클래스 네이밍 변경 * feat: 버스 번호 필터링 추가 - 400, 402, 405 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * chore: 충돌 해결 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * style: 줄바꿈 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * refactor: 중괄호 제거 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * test: OPEN_API_KEY 추가 * refactor: 리뷰 반영 * refactor: 디버그 코드 삭제 --------- Co-authored-by: songsunkook <songsunkook@gmail.com> Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * feature: 상점 사장님 관련 추가, 수정, 삭제 / 일반유저 모든 상점 조회 api작성 (#270) * feat: delete Api 구현 * feat: 테스트코드 작성 * feat: 메뉴생성요청 dto작성 * feat: 상점 사장님 추가, 수정 / 일반 유저 모든상점조회 api 작성 * feat: 라인 포맷팅 * feat: 테스트코드 로그 제거 * feat: 피드백 반영 1차 * chore: 디버깅용 출력 제거 * chore: 리뷰반영 2 --------- Co-authored-by: HyeonsuLee <leehyeonsu4888@naver.com> * feat: spring actuator 추가 (#276) Co-authored-by: Jang Jun Young <police0022@naver.com> * fix: 상점 생성 서버에러(@Valid 추가) (#281) Co-authored-by: HyeonsuLee <leehyeonsu4888@naver.com> * refactor: 조회 방식 수정 (#284) * feat: 상점 모든 카테고리 조회 api작성 (#282) * feat: delete Api 구현 * feat: 테스트코드 작성 * feat: 메뉴생성요청 dto작성 * feat: 상점 사장님 추가, 수정 / 일반 유저 모든상점조회 api 작성 * feat: 라인 포맷팅 * feat: 테스트코드 로그 제거 * feat: 피드백 반영 1차 * chore: 디버깅용 출력 제거 * chore: 리뷰반영 2 * feat: 모든 상점 카테고리 조회 api작성 * chore: 충돌해결 * chore: 충돌해결 --------- Co-authored-by: HyeonsuLee <leehyeonsu4888@naver.com> * �fix: student Entity 필드 수정 (#286) * refactor: #283 작업 revert * refactor: UserIdentity Ordinal로 수정 * refactor: 로그아웃, 탈퇴에 대한 권한 수정 (#288) * refactor: 이메일 인증 요청 dto 값 수정 (#290) * refactor: dto 네이밍 수정 * refactor: 사용자 성별 반환값 ordinal로 수정 * feat: lecture blank error (#293) * fix: 공백 문자 처리 * chore: log 제거 * style: 코드 효율적으로 전환 * fix: timetables 반환값 수정 (#294) * refactor: 반환값 형태 수정 * test: 테스트 값 수정 * test: 주석 제거 * refactor: trim -> strip 으로 변경 * test: 로그 제거 * fix/291 get lecture blank error reopen (#296) * fix: 공백 문자 처리 * chore: log 제거 * style: 코드 효율적으로 전환 * fix: 완전 비어 있는 리스트 처리 * chore: 우선 복구 * feat: 가게 이벤트 정보 조회 (#298) * feat: stage logback 적용 (#300) * feat: 로깅 추가 * feat: dev profile에만 추가되도록 구성 * feat: slack 알림발송 로직 추가 * refactor: 테스트용 코드 제거 * feat: slack 알림 메시지 수정 (#306) * feat: slack 알림 메시지 수정 * feat: 피드백 반영 * feat: 피드백 반영2 --------- Co-authored-by: Jang Jun Young <police0022@naver.com> * fix : userGender null 값 처리 추가 (#304) * feat: get member (#311) * feat: Get /members 구현 * feat: 사용자 단건조회 구현 * test: 테스트 구성 * fix: 없는 상점 조회 시 예외 발생 (#313) * fix: 없는 상점 조회시 예외 던지기 * chore: 개행 삭제 * chore: 라인포맷팅 --------- Co-authored-by: HyeonsuLee <leehyeonsu4888@naver.com> * fix: 연관관계 수정 (#315) Co-authored-by: HyeonsuLee <leehyeonsu4888@naver.com> * fix: 상점 사장님 회원가입 에러 수정 (#316) * fix: 연관관계 수정 * fix: 연관관계 수정 --------- Co-authored-by: HyeonsuLee <leehyeonsu4888@naver.com> * Fix: bearerToken 추출 오류 수정 (#309) * refactor: 강의시간 문자열 분리 수정 * refactor: BEARER_TYPE 수정 * refactor: 수정 * feat: is_event값 추가 (#302) * test: add JsonAssertions * feat: isEvent 값 추가 * test: 인자 변수로 수정 * test: 테스트 수정 * feat: 시외버스 API 구현 (#317) * feat: API 골격 작성 * feat: mongoDB 의존성 추가 * feat: 응답 객체 작성 * feat: 예외 추가 * feat: 엔티티 작성 * feat: 미운행인 버스 필터링 * feat: enum 추가 * feat: 남은 시간 계산 로직 작성 * feat: 가장 최근 버스까지 남은 시간 응답 구현 * feat: 미운행 요일 제외 로직 추가 * feat: 버스 정거장 검증로직 적용 및 중복되는 시간 제외 * refactor: enum 객체를 사용하도록 수정 * refactor: 등하교 방향 기준 탐색에서 정류장 탐색으로 로직 변경 * remove: 미사용 코드 제거 BusCourse.isRunning() * refactor: 테스트 mocking 위해 Clock 사용하도록 수정 * test: 테스트컨테이너 mongoDB 추가 * test: 셔틀 버스 조회 테스트 추가 * feat: 시내버스 Open API 호출 로직 작성 * feat: 방향 판단 로직 추가 * fix: 호출 예외 수정 * feat: json 파싱 로직 작성 1. json 파싱 로직 작성 2. 결과 코드 검증 3. 예외 추가 (500 반환) * feat: API 골격 작성 * feat: mongoDB 의존성 추가 * feat: 응답 객체 작성 * feat: 예외 추가 * feat: 엔티티 작성 * feat: 미운행인 버스 필터링 * feat: enum 추가 * feat: 남은 시간 계산 로직 작성 * feat: 가장 최근 버스까지 남은 시간 응답 구현 * feat: 미운행 요일 제외 로직 추가 * feat: 버스 정거장 검증로직 적용 및 중복되는 시간 제외 * refactor: enum 객체를 사용하도록 수정 * refactor: 등하교 방향 기준 탐색에서 정류장 탐색으로 로직 변경 * remove: 미사용 코드 제거 BusCourse.isRunning() * refactor: 테스트 mocking 위해 Clock 사용하도록 수정 * test: 테스트컨테이너 mongoDB 추가 * test: 셔틀 버스 조회 테스트 추가 * docs: API 문서에 파라미터 정보 명시 * remove: 불필요 주석 제거 * refactor: 누락된 Transactional 추가 * fix: mocking 변수 선언부 이동 * remove: 불필요 주석 제거 * refactor: 도착 시각 패턴 불일치 시 예외처리 * refactor: 반복문을 stream으로 변환 * refactor: 엔티티 필드로 List 사용 시 미리 초기화 * refactor: String 비교 시 NPE 예방 * refactor: 불필요한 매핑 메서드 제거 * refactor: 변수 분리 * rename: 변수명 수정 * fix: 충돌 해결 * refactor: Builder 생성자 접근제어자 수정 * refactor: enum 필드 간소화 * fix: 충돌 해결 * feat: 버스번호 필터링 * feat: 시내버스 조회 정보를 레디스 캐시로 저장 * feat: 버전 최신화 메서드 작성 * refactor: Pair를 사용하지 않도록 수정 * feat: ApiType 추가 - BusType과 BusOpenApiRequester 타입 맵핑을 위함 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: 주석 추가 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: record로 수정 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: 시내버스 캐시 저장 정보 변경 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * feat: 시내버스 버스 번호 반환 추가 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * feat: 버스 타입별 로직 분기 추가 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: 캐싱 정보 추가 - 남은 시간만 캐싱 -> 버스 도착 정보 통째로 캐싱 - api url 수정 - 버전 정보 저장 - forEach -> for Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: 시내버스 남은 시간 계산 로직 추가 - 버스 캐싱 정보 수정 - 시내버스 남은 시간 계산 로직 추가 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: 응답 객체 수정 - 기존: "now_bus": {"bus_number": null, ...} - 수정: "now_bus": null Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: 주석 추가 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: 응답 객체 null 체크 추가 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * feat: test 작성 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: 빈 배열 반환하도록 수정 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: 도착시간순 정렬 추가 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: 시간 차 수정 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: null 필터링 수정 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: updated_at 변경 로직 수정 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: .log().all() 삭제 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: switch문 if문으로 변경 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: 복붙 문제 수정 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * style: 컨벤션 적용 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * rename: BusInfoCache -> BusCache 이름 변경 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: 주석 수정 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * style: 컨벤션 적용 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: .log().all() 삭제 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * refactor: 패키지 분리 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * refactor: 상수, 검증 로직 분리 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * refactor: 파일 이름 수정 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * refactor: Bus.java 삭제와 구조 변경 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * refactor: 시내버스 남은 시간 - Redis 테스트 수정 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * refactor: 시내버스 남은 시간 - OpenApi 테스트 중간 작성 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * refactor: 변수명 변경 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * feat: 시내버스 남은 시간 - OpenApi 테스트 추 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * refactor: 시내버스 테스트 수정 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * refactor: Constant 클래스 enum으로 변경 * refactor: 캐시 만료 시간 분리 * Revert "refactor: Constant 클래스 enum으로 변" This reverts commit 5dcbf975cccbbd276dfa5e8dbbb52864eca6c209. * Revert "Revert "refactor: Constant 클래스 enum으로 변"" This reverts commit f321b7eb60f0d5426a1fef4d839c4861a08198a2. * refactor: Constant 클래스 네이밍 변경 * feat: 버스 번호 필터링 추가 - 400, 402, 405 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * chore: 충돌 해결 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * style: 줄바꿈 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * refactor: 중괄호 제거 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * test: OPEN_API_KEY 추가 * refactor: 리뷰 반영 * feat : 인수인계용 커밋 * feat: 시외버스기능구현 Co-authored-by: dradnats1012 <herjebi1012@gmail.com>, Choon0414 <hyunn815@naver.com> * feat: 시외버스 리팩터링 Co-authored-by: dradnats1012 <herjebi1012@gmail.com>, Choon0414 <hyunn815@naver.com> * test: 테스트 수정 Co-authored-by: dradnats1012 <herjebi1012@gmail.com>, Choon0414 <hyunn815@naver.com> * test: 테스트 수정 Co-authored-by: dradnats1012 <herjebi1012@gmail.com>, Choon0414 <hyunn815@naver.com> * test: 테스트 수정 Co-authored-by: dradnats1012 <herjebi1012@gmail.com>, Choon0414 <hyunn815@naver.com> * test: 테스트 제거 * refactor: 미사용 메소드 제거 * refactor: 네이밍 수정 * refactor: 네이밍 수정 * refactor: 네이밍 수정 * refactor: ttl 선언방식 수정 * refactor: 불필요한 추상화 제거 * refactor: 네이밍 수정 * style: 공백제거 * style: 코드 포맷팅 * style: 미사용 메소드 제거 * style: 미사용 클래스 제거 * refactor: API 사용 수정 * refactor: 클래스명 수정 --------- Co-authored-by: songsunkook <songsunkook@gmail.com> Co-authored-by: 박성빈 <psb106305@gmail.com> Co-authored-by: dradnats1012 <herjebi1012@gmail.com> Co-authored-by: Choon0414 <hyunn815@naver.com> * fix: 사장님 가게정보 수정 오류 (#319) * refactor: cascade 옵션 수정 * refactor: flush 추가 * fix: menu 정보 수정 시에도 flush 추가 (#320) * refactor: cascade 옵션 수정 * refactor: flush 추가 * refactor: flush 추가 * refactor: 식단 품절, 변경 여부 (Boolean -> 시간)으로 변경 (#310) * refactor: flyway 추가 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * refactor: Boolean에서 LocalDateTime으로 변경 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * test: Boolean에서 LocalDateTime으로 수정 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * test: DisplayName 수정 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * refactor: 품절 취소로직 추가 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * refactor: DTO NotNull Valid 추가 Co-authored-by: dradnats1012 <herjebi1012@gmail.com> --------- Co-authored-by: dradnats1012 <herjebi1012@gmail.com> * feat: 유저 권한 조회 API 작성 (#322) * feat: 유저 권한 조회 API 작성 * test: 테스트 작성 * refactor: 식단 조회 API DTO 필드명 변경 (#324) * fix: @param추가 (#327) Co-authored-by: HyeonsuLee <leehyeonsu4888@naver.com> * feat: 학생 회원가입 (#271) * feat: 에외 추가 * feat: 이메일 폼 추가 * feat: 골격 추가 * feat: 서비스 로직 구현 * feat: 인증 완료 폼 * feat: 회원 등록 폼 타임리프 설정 * feat: 이메일 인증 실패 폼 * feat: Controller 추가 * feat: 인증 완료시 isAuthed true 변경 * feat: 학번 학부 인증 및 UserIdentity->ordinal로 변경 * feat: 학생 회원가입 dto * feat: Service 구현 * feat: 토큰으로 부터 찾는 메서드 Repository에 추가 * feat: authToken 암호화 Util * feat: koreatehc.ac.kr 도메인 검증 * feat: 학번과 학부 검증 * feat: 슬랙 알림 * feat: 학생 이메일 요청, 가입 이벤트 * feat: 토큰 유효기간 설정 DateUtil * feat: 잘못된 학번 형식 예외 * feat: 이메일 인증 검증 dto * feat: 회원가입 이메일 인증 폼 데이터 * refactor: contorller 메서드 수정 * feat: 테스트 작성 * refactor: 컨벤션 맞게 수정 * refactor: log().all() 제거 * refactor: 컨벤션에 맞게 수정 * refactor: authToken passwordEncoder를 통해 암호화 * refactor: 학번 검증 수정 * refactor: 학번 검증 수정 * refactor: 메서드 네이밍수정 * refactor: 필드 controller->service 이동 * refactor: 유효하지 않은 데이터 400으로 반환 * refactor: 라인포맷팅 * refactor: 라인포맷팅 * feat: 에러코드반환수정 및 학번검증 테스트 추가 * refactor: 오류 해결 * refactor: 폼 반환 로직 수정 * refactor: 라인포맷팅 * refactor: 날짜 관련 로직 수정 * refactor: 호스트주소 추출 어노테이션으로 변경 * refactor: 학부,학번 검증 로직 변경 * refactor: 비밀번호 example 중복 제거 * refactor: 폼 반환 service 로직 수정 * refactor: 호스트 주소 어노테이션 적용 * refactor: 머지 형식에 맞게 수정 * refactor: 최신 전공 형식에 맞게 수정 * refactor: InvalidDataException -> IllegalException 변경 * refactor: 개행 수정 * refactor: camelCase로 수정 * refactor: 테스트명 수정 * refactor: expiredAt clock인자 받게 수정 * refactor: authToken UUID로 수정 * refactor: LocalTimeStringConverter 이름을 LocalTimeToHHmmStringConverter로 변경 * refactor: User객체 날짜 관련 속성LocalTimeToHHmmStringConverter 이용 * refactor: 학번 검증 수정 * refactor: host어노테이션 이름 변경 * refactor: LocalDate관련 수정 * refactor: 라인포맷팅 * refactor: LocalDate관련 클래스이름 수정 * refactor: URL얻어오는 코드 수정 * refactor: AuthResult orElse -> orElseGet * refactor: LocalTimeAttributeConverter 원래대로 수정 * refactor: 라인포맷팅 * refactor: orElseGet 수정 * feat: 신규상점 생성시 기본 카테고리 추가 (#331) * fix: @param추가 * feat: 신규 상점 생성 시 기본 메뉴 카테고리 추가 * chore: 라인포맷팅 --------- Co-authored-by: HyeonsuLee <leehyeonsu4888@naver.com> * fix: AttributeConverter 오류 수정 (#335) * feat: FCM 발송방식 수정 (#333) * docs: github workflow 설정 추가 * refactor: 알림 발송형태 수정 * refactor: 컬럼명 수정 * feat: isEvent 추가 (#337) * fix: shopId null일때 처리하기 (#341) * feat: 비밀번호 변경 로직 구현 (#342) * feat : 수정을 위한 1차 커밋 * feat : mailForm 생성 및 DTO, mail html 추가 * feat: controller 작성 * feat: webConfig 추가 * feat: resetToken전달하도록 수정 * feat: 이메일 전송 * feat: 버튼 누를 때 기능 * chore : 권한 static import * chore : LocalDateTime 형식으로 수정 및 미사용 파일 삭제 * feat: 비밀번호 초기화 구현 * docs: hidden 추가 * style: 개행제거 --------- Co-authored-by: duehee <149302959+duehee@users.noreply.github.com> Co-authored-by: daheeParkk <qkrekgml7414@naver.com> * fix : JsonProperty 삭제 (#345) * fix : Mixed Content 헤더 추가 (#347) * fix: attributeConverter milli second 길이가 두개인 경우도 반영 (#348) * fix: mili second 길이가 두개인 경우도 반영 * fix: authExpiredAt 시간 변경 * chore: datetimeformatter 변수명 변경 * Fix: attribute converter 오류 수정 (#349) * refactor: 회원가입 인증 토큰 만료기간 수정 * fix: AttributeConverter 오류 수정 * fix : 삭제된 userGender null 로직 추가 (#357) * feat: 이벤트 추가, 수정, 삭제, 베너조회 api 작성 (#350) * fix: @param추가 * feat: 신규 상점 생성 시 기본 메뉴 카테고리 추가 * chore…
1 parent 3c61882 commit 9e15162

File tree

467 files changed

+28395
-367
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

467 files changed

+28395
-367
lines changed

.github/CODEOWNERS

Lines changed: 0 additions & 1 deletion
This file was deleted.

.github/pr-labeler.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
기능: feature/*
2+
버그: fix/*
3+
리팩터링: refactor/*
4+
문서: docs/*
5+
테스트: test/*
6+
인프라: infra/*

.github/workflows/pr-labeler.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
name: PR Labeler
2+
on:
3+
pull_request:
4+
types: [ opened ]
5+
6+
jobs:
7+
pr-labeler:
8+
runs-on: ubuntu-latest
9+
steps:
10+
- uses: TimonVS/pr-labeler-action@v4
11+
env:
12+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,6 @@ out/
3838
.DS_STORE
3939

4040
application.yml
41+
*adminsdk.json
42+
43+
logs

Dockerfile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
FROM amazoncorretto:17
2+
3+
WORKDIR /app
4+
5+
COPY ./build/libs/KOIN_API_V2.jar /app/app.jar
6+
7+
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

build.gradle

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,59 @@ repositories {
2121
}
2222

2323
dependencies {
24+
implementation group: 'org.json', name: 'json', version: '20231013'
2425
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
2526
implementation 'org.springframework.boot:spring-boot-starter-validation'
2627
implementation 'org.springframework.boot:spring-boot-starter-web'
27-
compileOnly 'org.projectlombok:lombok'
28+
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
29+
implementation 'com.mysql:mysql-connector-j'
30+
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
31+
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
32+
33+
implementation 'io.jsonwebtoken:jjwt-api:0.12.3'
34+
35+
implementation 'org.jsoup:jsoup:1.15.3'
36+
implementation 'com.amazonaws:aws-java-sdk:1.12.672'
37+
implementation 'com.google.code.gson:gson:2.10.1'
38+
39+
// swagger
40+
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0'
41+
42+
// security
43+
implementation 'org.springframework.security:spring-security-crypto:6.2.2'
44+
45+
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.12.3'
46+
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.12.3'
2847
runtimeOnly 'com.h2database:h2'
2948
runtimeOnly 'com.mysql:mysql-connector-j'
49+
compileOnly 'org.projectlombok:lombok'
50+
3051
annotationProcessor 'org.projectlombok:lombok'
52+
53+
testImplementation 'org.testcontainers:testcontainers:1.19.3'
54+
testImplementation 'org.testcontainers:junit-jupiter:1.19.3'
55+
testImplementation 'org.testcontainers:mysql'
3156
testImplementation 'io.rest-assured:rest-assured:5.3.2'
3257
testImplementation 'org.springframework.boot:spring-boot-starter-test'
58+
59+
// presigned url
60+
implementation platform('software.amazon.awssdk:bom:2.20.56')
61+
implementation 'software.amazon.awssdk:s3'
62+
63+
// localstack
64+
testImplementation 'org.testcontainers:localstack'
65+
66+
// flyway
67+
implementation 'org.flywaydb:flyway-mysql'
68+
69+
// fcm
70+
implementation 'com.google.firebase:firebase-admin:9.2.0'
71+
72+
// Actuator
73+
implementation 'org.springframework.boot:spring-boot-starter-actuator'
74+
75+
// slack Notification
76+
implementation 'com.github.maricn:logback-slack-appender:1.4.0'
3377
}
3478

3579
tasks.named('bootBuildImage') {

src/main/java/in/koreatech/koin/KoinApplication.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,12 @@
22

33
import org.springframework.boot.SpringApplication;
44
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
6+
import org.springframework.scheduling.annotation.EnableScheduling;
57

8+
@EnableScheduling
69
@SpringBootApplication
10+
@ConfigurationPropertiesScan
711
public class KoinApplication {
812

913
public static void main(String[] args) {
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package in.koreatech.koin.admin.land.controller;
2+
3+
import org.springframework.http.ResponseEntity;
4+
import org.springframework.web.bind.annotation.GetMapping;
5+
import org.springframework.web.bind.annotation.RequestParam;
6+
7+
import in.koreatech.koin.admin.land.dto.AdminLandsResponse;
8+
import io.swagger.v3.oas.annotations.Operation;
9+
import io.swagger.v3.oas.annotations.media.Content;
10+
import io.swagger.v3.oas.annotations.media.Schema;
11+
import io.swagger.v3.oas.annotations.responses.ApiResponse;
12+
import io.swagger.v3.oas.annotations.responses.ApiResponses;
13+
import io.swagger.v3.oas.annotations.tags.Tag;
14+
15+
@Tag(name = "(Admin) AdminLand: 복덕방", description = "관리자 권한으로 복덕방 정보를 관리한다")
16+
public interface AdminLandApi {
17+
18+
@ApiResponses(
19+
value = {
20+
@ApiResponse(responseCode = "200"),
21+
@ApiResponse(responseCode = "404", content = @Content(schema = @Schema(hidden = true))),
22+
}
23+
)
24+
@Operation(summary = "복덕방 목록 조회")
25+
@GetMapping("/admin/lands")
26+
ResponseEntity<AdminLandsResponse> getLands(
27+
@RequestParam(name = "page", defaultValue = "1") Integer page,
28+
@RequestParam(name = "limit", defaultValue = "10", required = false) Integer limit,
29+
@RequestParam(name = "is_deleted", defaultValue = "false") Boolean isDeleted
30+
);
31+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package in.koreatech.koin.admin.land.controller;
2+
3+
import org.springframework.http.ResponseEntity;
4+
import org.springframework.web.bind.annotation.GetMapping;
5+
import org.springframework.web.bind.annotation.RequestParam;
6+
import org.springframework.web.bind.annotation.RestController;
7+
8+
import in.koreatech.koin.admin.land.dto.AdminLandsResponse;
9+
import in.koreatech.koin.admin.land.service.AdminLandService;
10+
import lombok.RequiredArgsConstructor;
11+
12+
@RestController
13+
@RequiredArgsConstructor
14+
public class AdminLandController implements AdminLandApi {
15+
16+
private final AdminLandService adminLandService;
17+
18+
@Override
19+
@GetMapping("/admin/lands")
20+
public ResponseEntity<AdminLandsResponse> getLands(
21+
@RequestParam(name = "page", defaultValue = "1") Integer page,
22+
@RequestParam(name = "limit", defaultValue = "10", required = false) Integer limit,
23+
@RequestParam(name = "is_deleted", defaultValue = "false") Boolean isDeleted
24+
) {
25+
return ResponseEntity.ok().body(adminLandService.getLands(page, limit, isDeleted));
26+
}
27+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package in.koreatech.koin.admin.land.dto;
2+
3+
import static com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy;
4+
import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED;
5+
6+
import com.fasterxml.jackson.databind.annotation.JsonNaming;
7+
8+
import in.koreatech.koin.domain.land.model.Land;
9+
import io.swagger.v3.oas.annotations.media.Schema;
10+
11+
@JsonNaming(value = SnakeCaseStrategy.class)
12+
public record AdminLandResponse(
13+
@Schema(description = "고유 id", example = "1", requiredMode = REQUIRED)
14+
Integer id,
15+
16+
@Schema(description = "이름", example = "금실타운", requiredMode = REQUIRED)
17+
String name,
18+
19+
@Schema(description = "종류", example = "원룸")
20+
String roomType,
21+
22+
@Schema(description = "월세", example = "200만원 (6개월)")
23+
String monthlyFee,
24+
25+
@Schema(description = "전세", example = "3500")
26+
String charterFee,
27+
28+
@Schema(description = "삭제(soft delete) 여부", example = "false", requiredMode = REQUIRED)
29+
Boolean isDeleted
30+
) {
31+
public static AdminLandResponse from(Land land) {
32+
return new AdminLandResponse(
33+
land.getId(),
34+
land.getName(),
35+
land.getRoomType(),
36+
land.getMonthlyFee(),
37+
land.getCharterFee(),
38+
land.isDeleted()
39+
);
40+
}
41+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package in.koreatech.koin.admin.land.dto;
2+
3+
import static com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy;
4+
import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED;
5+
6+
import java.util.List;
7+
8+
import org.springframework.data.domain.Page;
9+
10+
import com.fasterxml.jackson.databind.annotation.JsonNaming;
11+
12+
import in.koreatech.koin.domain.land.model.Land;
13+
import in.koreatech.koin.global.model.Criteria;
14+
import io.swagger.v3.oas.annotations.media.Schema;
15+
16+
@JsonNaming(value = SnakeCaseStrategy.class)
17+
public record AdminLandsResponse(
18+
19+
@Schema(description = "조건에 해당하는 총 집의 수", example = "57", requiredMode = REQUIRED)
20+
Long totalCount,
21+
22+
@Schema(description = "조건에 해당하는 집 중에 현재 페이지에서 조회된 수", example = "10", requiredMode = REQUIRED)
23+
Integer currentCount,
24+
25+
@Schema(description = "조건에 해당하는 집들을 조회할 수 있는 최대 페이지", example = "6", requiredMode = REQUIRED)
26+
Integer totalPage,
27+
28+
@Schema(description = "현재 페이지", example = "2", requiredMode = REQUIRED)
29+
Integer currentPage,
30+
31+
@Schema(description = "집 정보 리스트", requiredMode = REQUIRED)
32+
List<AdminLandResponse> lands
33+
) {
34+
public static AdminLandsResponse of(Page<Land> pagedResult, Criteria criteria) {
35+
return new AdminLandsResponse(
36+
pagedResult.getTotalElements(),
37+
pagedResult.getContent().size(),
38+
pagedResult.getTotalPages(),
39+
criteria.getPage() + 1,
40+
pagedResult.getContent()
41+
.stream()
42+
.map(AdminLandResponse::from)
43+
.toList()
44+
);
45+
}
46+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package in.koreatech.koin.admin.land.repository;
2+
3+
import org.springframework.data.domain.Page;
4+
import org.springframework.data.domain.Pageable;
5+
import org.springframework.data.repository.Repository;
6+
7+
import in.koreatech.koin.domain.land.model.Land;
8+
9+
public interface AdminLandRepository extends Repository<Land, Integer> {
10+
11+
Page<Land> findAllByIsDeleted(boolean isDeleted, Pageable pageable);
12+
13+
Integer countAllByIsDeleted(boolean isDeleted);
14+
15+
Land save(Land request);
16+
17+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package in.koreatech.koin.admin.land.service;
2+
3+
import org.springframework.data.domain.Page;
4+
import org.springframework.data.domain.PageRequest;
5+
import org.springframework.data.domain.Sort;
6+
import org.springframework.stereotype.Service;
7+
import org.springframework.transaction.annotation.Transactional;
8+
9+
import in.koreatech.koin.admin.land.dto.AdminLandsResponse;
10+
import in.koreatech.koin.admin.land.repository.AdminLandRepository;
11+
import in.koreatech.koin.domain.land.model.Land;
12+
import in.koreatech.koin.global.model.Criteria;
13+
import lombok.RequiredArgsConstructor;
14+
15+
@Service
16+
@RequiredArgsConstructor
17+
@Transactional(readOnly = true)
18+
public class AdminLandService {
19+
20+
private final AdminLandRepository adminLandRepository;
21+
22+
public AdminLandsResponse getLands(Integer page, Integer limit, Boolean isDeleted) {
23+
24+
// page > totalPage인 경우 totalPage로 조회하기 위해
25+
Integer total = adminLandRepository.countAllByIsDeleted(isDeleted);
26+
27+
Criteria criteria = Criteria.of(page, limit, total);
28+
PageRequest pageRequest = PageRequest.of(criteria.getPage(), criteria.getLimit(),
29+
Sort.by(Sort.Direction.ASC, "id"));
30+
31+
Page<Land> result = adminLandRepository.findAllByIsDeleted(isDeleted, pageRequest);
32+
33+
return AdminLandsResponse.of(result, criteria);
34+
}
35+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package in.koreatech.koin.domain.activity.controller;
2+
3+
import org.springframework.http.ResponseEntity;
4+
import org.springframework.web.bind.annotation.GetMapping;
5+
import org.springframework.web.bind.annotation.RequestParam;
6+
7+
import in.koreatech.koin.domain.activity.dto.ActivitiesResponse;
8+
import io.swagger.v3.oas.annotations.Operation;
9+
import io.swagger.v3.oas.annotations.media.Content;
10+
import io.swagger.v3.oas.annotations.media.Schema;
11+
import io.swagger.v3.oas.annotations.responses.ApiResponse;
12+
import io.swagger.v3.oas.annotations.responses.ApiResponses;
13+
import io.swagger.v3.oas.annotations.tags.Tag;
14+
15+
@Tag(name = "(Normal) Activity", description = "BCSDLab 활동")
16+
public interface ActivityApi {
17+
18+
@ApiResponses(
19+
value = {
20+
@ApiResponse(responseCode = "200", description = "성공적으로 활동 목록을 조회함"),
21+
@ApiResponse(responseCode = "404", description = "해당하는 활동이 없음", content = @Content(schema = @Schema(hidden = true))),
22+
}
23+
)
24+
@Operation(summary = "BCSD Lab 활동 조회")
25+
@GetMapping("/activities")
26+
ResponseEntity<ActivitiesResponse> getActivities(
27+
@RequestParam(required = false) String year
28+
);
29+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package in.koreatech.koin.domain.activity.controller;
2+
3+
import org.springframework.http.ResponseEntity;
4+
import org.springframework.web.bind.annotation.GetMapping;
5+
import org.springframework.web.bind.annotation.RequestParam;
6+
import org.springframework.web.bind.annotation.RestController;
7+
8+
import in.koreatech.koin.domain.activity.dto.ActivitiesResponse;
9+
import in.koreatech.koin.domain.activity.service.ActivityService;
10+
import lombok.RequiredArgsConstructor;
11+
12+
@RestController
13+
@RequiredArgsConstructor
14+
public class ActivityController implements ActivityApi {
15+
16+
private final ActivityService activityService;
17+
18+
@GetMapping("/activities")
19+
public ResponseEntity<ActivitiesResponse> getActivities(
20+
@RequestParam(required = false) String year
21+
) {
22+
ActivitiesResponse response = activityService.getActivities(year);
23+
return ResponseEntity.ok(response);
24+
}
25+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package in.koreatech.koin.domain.activity.dto;
2+
3+
import java.util.List;
4+
5+
import com.fasterxml.jackson.annotation.JsonProperty;
6+
7+
public record ActivitiesResponse(
8+
@JsonProperty("Activities")
9+
List<ActivityResponse> activities
10+
) {
11+
public ActivitiesResponse(List<ActivityResponse> activities) {
12+
this.activities = activities;
13+
}
14+
}

0 commit comments

Comments
 (0)