Skip to content

Commit

Permalink
Feat: 과릿 1.1.0 (#303)
Browse files Browse the repository at this point in the history
* Chore: FCM 관련 파일 .gitignore 추가

* Feat: 알림 테스트용 API (#262)

* Chore: FCM을 위한 firebase-admin dependency 추가 #165

* Feat: Notification 기본 구조 생성 #165

* Chore: FCM Configuration 생성 #165

* Chore: FCM용 비공개 키 gitignore 등록 #165

* Chore: FCM용 properties 등록 #165

* Chore: FCM 설정 업데이트 #165

* Feat: Notification 기본 포맷 생성 #165

* Feat: Notification 기본 포맷 생성 #165

* Feat: Token 관련 기본 포맷 생성 #165

* Feat: FCM용 Service 객체 및 요청 Dto 생성 #165

* Feat: Android & APNS 관련 설정 진행 #165

* Feat: FCM관련 Entity 수정 #165

* Feat: 토큰 저장 비즈니스 로직 개발 #165

* Feat: Token Entity를 Member의 column으로 마이그레이션 #165

* Chore: FCM 환경설정 진행 #165

* Feat: 토큰 저장/수정 API #165

* Feat: 로그아웃 시 토큰 정보 제거하는 로직 추가 #165

* Feat: 로그아웃 메소드에 트랜잭션 추가 #165

* Style: 메소드 주석 추가 #165

* Feat: FCM 관련 ErrorCode 추가 #165

* Feat: FCM 송신 메소드 개발 #165

* Feat: FCMMessageDto 정보 업데이트 #165

* Chore: FCM 환경설정 업데이트 #165

* Feat: 학생 초대 시, 해당 학생이 앱 내에 있는 학생이라면 알림이 가도록 비즈니스 로직 추가 #165

* Feat: Notification Entity 칼럼 추가 #165

* Chore: FCM 관련 yml 추가 #165

* Feat: 알림 테스트용 API (#263)

* Chore: FCM을 위한 firebase-admin dependency 추가 #165

* Feat: Notification 기본 구조 생성 #165

* Chore: FCM Configuration 생성 #165

* Chore: FCM용 비공개 키 gitignore 등록 #165

* Chore: FCM용 properties 등록 #165

* Chore: FCM 설정 업데이트 #165

* Feat: Notification 기본 포맷 생성 #165

* Feat: Notification 기본 포맷 생성 #165

* Feat: Token 관련 기본 포맷 생성 #165

* Feat: FCM용 Service 객체 및 요청 Dto 생성 #165

* Feat: Android & APNS 관련 설정 진행 #165

* Feat: FCM관련 Entity 수정 #165

* Feat: 토큰 저장 비즈니스 로직 개발 #165

* Feat: Token Entity를 Member의 column으로 마이그레이션 #165

* Chore: FCM 환경설정 진행 #165

* Feat: 토큰 저장/수정 API #165

* Feat: 로그아웃 시 토큰 정보 제거하는 로직 추가 #165

* Feat: 로그아웃 메소드에 트랜잭션 추가 #165

* Style: 메소드 주석 추가 #165

* Feat: FCM 관련 ErrorCode 추가 #165

* Feat: FCM 송신 메소드 개발 #165

* Feat: FCMMessageDto 정보 업데이트 #165

* Chore: FCM 환경설정 업데이트 #165

* Feat: 학생 초대 시, 해당 학생이 앱 내에 있는 학생이라면 알림이 가도록 비즈니스 로직 추가 #165

* Feat: Notification Entity 칼럼 추가 #165

* Chore: FCM 관련 yml 추가 #165

* Fix: 학생 초대 시, 학생이 기존 가입 유저라면 문자가 아닌 알림을 보내도록 수정 #165

* Feat: 테스트용 알림 API #165

* Chore: DEV CD 스크립트 수정 #165

* Feat: 알림 테스트용 API (#264)

* Chore: FCM을 위한 firebase-admin dependency 추가 #165

* Feat: Notification 기본 구조 생성 #165

* Chore: FCM Configuration 생성 #165

* Chore: FCM용 비공개 키 gitignore 등록 #165

* Chore: FCM용 properties 등록 #165

* Chore: FCM 설정 업데이트 #165

* Feat: Notification 기본 포맷 생성 #165

* Feat: Notification 기본 포맷 생성 #165

* Feat: Token 관련 기본 포맷 생성 #165

* Feat: FCM용 Service 객체 및 요청 Dto 생성 #165

* Feat: Android & APNS 관련 설정 진행 #165

* Feat: FCM관련 Entity 수정 #165

* Feat: 토큰 저장 비즈니스 로직 개발 #165

* Feat: Token Entity를 Member의 column으로 마이그레이션 #165

* Chore: FCM 환경설정 진행 #165

* Feat: 토큰 저장/수정 API #165

* Feat: 로그아웃 시 토큰 정보 제거하는 로직 추가 #165

* Feat: 로그아웃 메소드에 트랜잭션 추가 #165

* Style: 메소드 주석 추가 #165

* Feat: FCM 관련 ErrorCode 추가 #165

* Feat: FCM 송신 메소드 개발 #165

* Feat: FCMMessageDto 정보 업데이트 #165

* Chore: FCM 환경설정 업데이트 #165

* Feat: 학생 초대 시, 해당 학생이 앱 내에 있는 학생이라면 알림이 가도록 비즈니스 로직 추가 #165

* Feat: Notification Entity 칼럼 추가 #165

* Chore: FCM 관련 yml 추가 #165

* Fix: 학생 초대 시, 학생이 기존 가입 유저라면 문자가 아닌 알림을 보내도록 수정 #165

* Feat: 테스트용 알림 API #165

* Chore: DEV CD 스크립트 수정 #165

* Chore: DEV CD 스크립트 수정 #165

* Feat: 알림 테스트용 API  (#265)

* Chore: FCM을 위한 firebase-admin dependency 추가 #165

* Feat: Notification 기본 구조 생성 #165

* Chore: FCM Configuration 생성 #165

* Chore: FCM용 비공개 키 gitignore 등록 #165

* Chore: FCM용 properties 등록 #165

* Chore: FCM 설정 업데이트 #165

* Feat: Notification 기본 포맷 생성 #165

* Feat: Notification 기본 포맷 생성 #165

* Feat: Token 관련 기본 포맷 생성 #165

* Feat: FCM용 Service 객체 및 요청 Dto 생성 #165

* Feat: Android & APNS 관련 설정 진행 #165

* Feat: FCM관련 Entity 수정 #165

* Feat: 토큰 저장 비즈니스 로직 개발 #165

* Feat: Token Entity를 Member의 column으로 마이그레이션 #165

* Chore: FCM 환경설정 진행 #165

* Feat: 토큰 저장/수정 API #165

* Feat: 로그아웃 시 토큰 정보 제거하는 로직 추가 #165

* Feat: 로그아웃 메소드에 트랜잭션 추가 #165

* Style: 메소드 주석 추가 #165

* Feat: FCM 관련 ErrorCode 추가 #165

* Feat: FCM 송신 메소드 개발 #165

* Feat: FCMMessageDto 정보 업데이트 #165

* Chore: FCM 환경설정 업데이트 #165

* Feat: 학생 초대 시, 해당 학생이 앱 내에 있는 학생이라면 알림이 가도록 비즈니스 로직 추가 #165

* Feat: Notification Entity 칼럼 추가 #165

* Chore: FCM 관련 yml 추가 #165

* Fix: 학생 초대 시, 학생이 기존 가입 유저라면 문자가 아닌 알림을 보내도록 수정 #165

* Feat: 테스트용 알림 API #165

* Chore: DEV CD 스크립트 수정 #165

* Chore: DEV CD 스크립트 수정 #165

* Chore: DEV CD 스크립트 수정 #165

* Feat: 알림 테스트용 API  (#267)

* Chore: FCM을 위한 firebase-admin dependency 추가 #165

* Feat: Notification 기본 구조 생성 #165

* Chore: FCM Configuration 생성 #165

* Chore: FCM용 비공개 키 gitignore 등록 #165

* Chore: FCM용 properties 등록 #165

* Chore: FCM 설정 업데이트 #165

* Feat: Notification 기본 포맷 생성 #165

* Feat: Notification 기본 포맷 생성 #165

* Feat: Token 관련 기본 포맷 생성 #165

* Feat: FCM용 Service 객체 및 요청 Dto 생성 #165

* Feat: Android & APNS 관련 설정 진행 #165

* Feat: FCM관련 Entity 수정 #165

* Feat: 토큰 저장 비즈니스 로직 개발 #165

* Feat: Token Entity를 Member의 column으로 마이그레이션 #165

* Chore: FCM 환경설정 진행 #165

* Feat: 토큰 저장/수정 API #165

* Feat: 로그아웃 시 토큰 정보 제거하는 로직 추가 #165

* Feat: 로그아웃 메소드에 트랜잭션 추가 #165

* Style: 메소드 주석 추가 #165

* Feat: FCM 관련 ErrorCode 추가 #165

* Feat: FCM 송신 메소드 개발 #165

* Feat: FCMMessageDto 정보 업데이트 #165

* Chore: FCM 환경설정 업데이트 #165

* Feat: 학생 초대 시, 해당 학생이 앱 내에 있는 학생이라면 알림이 가도록 비즈니스 로직 추가 #165

* Feat: Notification Entity 칼럼 추가 #165

* Chore: FCM 관련 yml 추가 #165

* Fix: 학생 초대 시, 학생이 기존 가입 유저라면 문자가 아닌 알림을 보내도록 수정 #165

* Feat: 테스트용 알림 API #165

* Chore: DEV CD 스크립트 수정 #165

* Chore: DEV CD 스크립트 수정 #165

* Chore: DEV CD 스크립트 수정 #165

* Chore: DEV CD 스크립트 수정 #165

* Feat: 알림 테스트 API (#268)

* Chore: FCM을 위한 firebase-admin dependency 추가 #165

* Feat: Notification 기본 구조 생성 #165

* Chore: FCM Configuration 생성 #165

* Chore: FCM용 비공개 키 gitignore 등록 #165

* Chore: FCM용 properties 등록 #165

* Chore: FCM 설정 업데이트 #165

* Feat: Notification 기본 포맷 생성 #165

* Feat: Notification 기본 포맷 생성 #165

* Feat: Token 관련 기본 포맷 생성 #165

* Feat: FCM용 Service 객체 및 요청 Dto 생성 #165

* Feat: Android & APNS 관련 설정 진행 #165

* Feat: FCM관련 Entity 수정 #165

* Feat: 토큰 저장 비즈니스 로직 개발 #165

* Feat: Token Entity를 Member의 column으로 마이그레이션 #165

* Chore: FCM 환경설정 진행 #165

* Feat: 토큰 저장/수정 API #165

* Feat: 로그아웃 시 토큰 정보 제거하는 로직 추가 #165

* Feat: 로그아웃 메소드에 트랜잭션 추가 #165

* Style: 메소드 주석 추가 #165

* Feat: FCM 관련 ErrorCode 추가 #165

* Feat: FCM 송신 메소드 개발 #165

* Feat: FCMMessageDto 정보 업데이트 #165

* Chore: FCM 환경설정 업데이트 #165

* Feat: 학생 초대 시, 해당 학생이 앱 내에 있는 학생이라면 알림이 가도록 비즈니스 로직 추가 #165

* Feat: Notification Entity 칼럼 추가 #165

* Chore: FCM 관련 yml 추가 #165

* Fix: 학생 초대 시, 학생이 기존 가입 유저라면 문자가 아닌 알림을 보내도록 수정 #165

* Feat: 테스트용 알림 API #165

* Chore: DEV CD 스크립트 수정 #165

* Chore: DEV CD 스크립트 수정 #165

* Chore: DEV CD 스크립트 수정 #165

* Chore: DEV CD 스크립트 수정 #165

* Chore: DEV CD 스크립트 수정 #165

* Feat: 테스트용 알림 API (#269)

* Chore: FCM을 위한 firebase-admin dependency 추가 #165

* Feat: Notification 기본 구조 생성 #165

* Chore: FCM Configuration 생성 #165

* Chore: FCM용 비공개 키 gitignore 등록 #165

* Chore: FCM용 properties 등록 #165

* Chore: FCM 설정 업데이트 #165

* Feat: Notification 기본 포맷 생성 #165

* Feat: Notification 기본 포맷 생성 #165

* Feat: Token 관련 기본 포맷 생성 #165

* Feat: FCM용 Service 객체 및 요청 Dto 생성 #165

* Feat: Android & APNS 관련 설정 진행 #165

* Feat: FCM관련 Entity 수정 #165

* Feat: 토큰 저장 비즈니스 로직 개발 #165

* Feat: Token Entity를 Member의 column으로 마이그레이션 #165

* Chore: FCM 환경설정 진행 #165

* Feat: 토큰 저장/수정 API #165

* Feat: 로그아웃 시 토큰 정보 제거하는 로직 추가 #165

* Feat: 로그아웃 메소드에 트랜잭션 추가 #165

* Style: 메소드 주석 추가 #165

* Feat: FCM 관련 ErrorCode 추가 #165

* Feat: FCM 송신 메소드 개발 #165

* Feat: FCMMessageDto 정보 업데이트 #165

* Chore: FCM 환경설정 업데이트 #165

* Feat: 학생 초대 시, 해당 학생이 앱 내에 있는 학생이라면 알림이 가도록 비즈니스 로직 추가 #165

* Feat: Notification Entity 칼럼 추가 #165

* Chore: FCM 관련 yml 추가 #165

* Fix: 학생 초대 시, 학생이 기존 가입 유저라면 문자가 아닌 알림을 보내도록 수정 #165

* Feat: 테스트용 알림 API #165

* Chore: DEV CD 스크립트 수정 #165

* Chore: DEV CD 스크립트 수정 #165

* Chore: DEV CD 스크립트 수정 #165

* Chore: DEV CD 스크립트 수정 #165

* Chore: DEV CD 스크립트 수정 #165

* Chore: DEV CD 스크립트 수정 #165

* Feat: 알림 테스트용 API (#270)

* Chore: FCMConfig 수정 #165

* Feat: 알림 테스트용 API (#271)

* Chore: FCMConfig 수정 #165

* Feat: 알림 테스트용 API (#272)

* Chore: FCMConfig 수정 #165

* Feat: 알림 테스트용 API (#273)

* Chore: FCM을 위한 firebase-admin dependency 추가 #165

* Feat: Notification 기본 구조 생성 #165

* Chore: FCM Configuration 생성 #165

* Chore: FCM용 비공개 키 gitignore 등록 #165

* Chore: FCM용 properties 등록 #165

* Chore: FCM 설정 업데이트 #165

* Feat: Notification 기본 포맷 생성 #165

* Feat: Notification 기본 포맷 생성 #165

* Feat: Token 관련 기본 포맷 생성 #165

* Feat: FCM용 Service 객체 및 요청 Dto 생성 #165

* Feat: Android & APNS 관련 설정 진행 #165

* Feat: FCM관련 Entity 수정 #165

* Feat: 토큰 저장 비즈니스 로직 개발 #165

* Feat: Token Entity를 Member의 column으로 마이그레이션 #165

* Chore: FCM 환경설정 진행 #165

* Feat: 토큰 저장/수정 API #165

* Feat: 로그아웃 시 토큰 정보 제거하는 로직 추가 #165

* Feat: 로그아웃 메소드에 트랜잭션 추가 #165

* Style: 메소드 주석 추가 #165

* Feat: FCM 관련 ErrorCode 추가 #165

* Feat: FCM 송신 메소드 개발 #165

* Feat: FCMMessageDto 정보 업데이트 #165

* Chore: FCM 환경설정 업데이트 #165

* Feat: 학생 초대 시, 해당 학생이 앱 내에 있는 학생이라면 알림이 가도록 비즈니스 로직 추가 #165

* Feat: Notification Entity 칼럼 추가 #165

* Chore: FCM 관련 yml 추가 #165

* Fix: 학생 초대 시, 학생이 기존 가입 유저라면 문자가 아닌 알림을 보내도록 수정 #165

* Feat: 테스트용 알림 API #165

* Chore: DEV CD 스크립트 수정 #165

* Chore: DEV CD 스크립트 수정 #165

* Chore: DEV CD 스크립트 수정 #165

* Chore: DEV CD 스크립트 수정 #165

* Chore: DEV CD 스크립트 수정 #165

* Chore: DEV CD 스크립트 수정 #165

* Chore: FCMConfig 수정 #165

* Chore: FCMConfig 수정 #165

* Chore: FCMConfig 수정 #165

* Chore: FCMConfig 수정 #165

* Feat: 알림 테스트용 API (#274)

* Feat: 배포환경에서의 FCM 오류 확인 #165

* Feat: 알림 테스트용 API (#275)

* Feat: Redis 커넥션 설정 변경 #165

* Feat: 알림 테스트용 API 적용 (#277)

* Fix: params 삭제 후 Data 구조 변경 #165

* Refactor: FCM 전송 구조 리팩토링  (#278)

* Feat: 수업 리포트 생성 시 알림이 가도록 비즈니스 로직 추가 진행 중 #165

* Feat: Push Notification 개발 (#279)

* Chore: FCM을 위한 firebase-admin dependency 추가 #165

* Feat: Notification 기본 구조 생성 #165

* Chore: FCM Configuration 생성 #165

* Chore: FCM용 비공개 키 gitignore 등록 #165

* Chore: FCM용 properties 등록 #165

* Chore: FCM 설정 업데이트 #165

* Feat: Notification 기본 포맷 생성 #165

* Feat: Notification 기본 포맷 생성 #165

* Feat: Token 관련 기본 포맷 생성 #165

* Feat: FCM용 Service 객체 및 요청 Dto 생성 #165

* Feat: Android & APNS 관련 설정 진행 #165

* Feat: FCM관련 Entity 수정 #165

* Feat: 토큰 저장 비즈니스 로직 개발 #165

* Feat: Token Entity를 Member의 column으로 마이그레이션 #165

* Chore: FCM 환경설정 진행 #165

* Feat: 토큰 저장/수정 API #165

* Feat: 로그아웃 시 토큰 정보 제거하는 로직 추가 #165

* Feat: 로그아웃 메소드에 트랜잭션 추가 #165

* Style: 메소드 주석 추가 #165

* Feat: FCM 관련 ErrorCode 추가 #165

* Feat: FCM 송신 메소드 개발 #165

* Feat: FCMMessageDto 정보 업데이트 #165

* Chore: FCM 환경설정 업데이트 #165

* Feat: 학생 초대 시, 해당 학생이 앱 내에 있는 학생이라면 알림이 가도록 비즈니스 로직 추가 #165

* Feat: Notification Entity 칼럼 추가 #165

* Chore: FCM 관련 yml 추가 #165

* Fix: 학생 초대 시, 학생이 기존 가입 유저라면 문자가 아닌 알림을 보내도록 수정 #165

* Feat: 테스트용 알림 API #165

* Chore: DEV CD 스크립트 수정 #165

* Chore: DEV CD 스크립트 수정 #165

* Chore: DEV CD 스크립트 수정 #165

* Chore: DEV CD 스크립트 수정 #165

* Chore: DEV CD 스크립트 수정 #165

* Chore: DEV CD 스크립트 수정 #165

* Chore: FCMConfig 수정 #165

* Chore: FCMConfig 수정 #165

* Chore: FCMConfig 수정 #165

* Chore: FCMConfig 수정 #165

* Feat: 배포환경에서의 FCM 오류 확인 #165

* Feat: Redis 커넥션 설정 변경 #165

* Style: 미사용 코드 주석 처리 #165

* Feat: FCM 에러 추가 정의 #165

* Style: 불필요 코드 제거 #165

* Feat: FCMClient 메소드 구조 변경 및 관련 로직 수정 #165

* Feat: 전체 발송 API #165

* Fix: params 삭제 후 Data 구조 변경 #165

* Fix: FCMMessageDto 미사용하는 방식으로 구조 개선 #165

* Fix: FCMMessageDto 미사용에 따른 파일 삭제 #165

* Feat: 수업 리포트 생성 시 알림이 가도록 비즈니스 로직 추가 진행 중 #165

* Feat: 수업 리포트 수정 시 알림 연동 #165

* Refactor: FCM 비동기 처리 & Bulk Insert 도입 (#282)

* Refactor: FCM 메세지 비동기 전송으로 변경 #280

* Feat: BulkInsert를 위한 JdbcTemplate 활용 Repository 생성 및 bulkinsert 메소드 개발 #280

* Refactor: BulkInsert 적용 #280

* Feat: Bulk Insert를 위한 JdbcTemplate 활용 Repository 생성 및 Bulk Insert 메소드 개발  #280

* Refactor: Bulk Insert 적용 #280

* Chore: Async 환경 설정 및 FCMClient 비동기 적용 #280

* Refactor: FCM 비동기 처리 & Bulk Insert 도입 (#283)

* Fix: 토큰리스트 비어있는지 확인하는 로직 추가 #280

* Feat: 지정 시간대마다 수업 일정 알림 개발 (#285)

* Chore: Spring Batch 환경 설정 (#284)

* Chore: Spring Batch & Quartz Dependency 추가 #244

* Chore: Spring Batch & Quartz 사용을 위한 어노테이션 추가 #244

* Refactor: 불필요한 import 삭제 #244

* Chore: Spring Batch 관련 설정 추가 #244

* Chore: Spring Batch 환경 설정 #244

* Chore: Quartz를 활용해 매일 오전 9시에 특정 Job 실행되도록 설정 #244

* Chore: 진행될 Task 기본 포맷 정의 #244

* Chore: Task에서 활용해야할 정보를 조회하는 로직 및 Dto 생성 #244

* Feat: FCM N명의 사용자에게 N개의 개별 메시지 보내는 메소드 개발 #281

* Chore: 스키마 서버 실행 시마다 생성되지 않도록 설정 변경 #281

* Feat: 배치용 Dto에 토큰 정보 포함 #281

* Feat: 매일 아침 9시에 수업 정보 보내는 알림 개발 #281

* Fix: 매일 아침 9시에 수업 정보 보내는 알림 내용 수정 #281

* Fix: 매일 아침 9시에 수업 정보 보내는 알림 내용 수정 #281

* Fix: 이모지는 빈문자열로 대체되도록 수정 (#289)

* Fix: SMS 전송 시 이모지는 제거되고 보내지도록 수정 (#287)

* Feat: 알림 조회 API (#291)

* Fix: FCM 전송 시, 이모지는 빈문자열로 대체되도록 수정 #290

* Feat: 공지사항 페이지네이션 API #286

* Fix: 공지사항 발송 API 수정 (#293)

* Fix: 배치 중복으로 돌아가지 않도록 수정 (#295)

* Fix: 학교 글자 수 제한 조건 수정 #294

* Fix: Lesson에 delivered_at 칼럼 추가 #294

* Fix: Lesson에 delivered_at 칼럼 추가 #294

* Fix: Batch Task 로직 업데이트 #294

* Fix: FCM Android Notification 설정 변경 #294

* Fix: 배치 중복으로 돌아가지 않도록 수정 (#296)

* Fix: 학교 글자 수 제한 조건 수정 #294

* Fix: Lesson에 delivered_at 칼럼 추가 #294

* Fix: Lesson에 delivered_at 칼럼 추가 #294

* Fix: Batch Task 로직 업데이트 #294

* Fix: FCM Android Notification 설정 변경 #294

* Fix: Batch Scheduler 주기 원상복구 #294

* Fix: 배치 주기 매일 오전 9시로 변경 #297 (#298)

* Fix: FCM 테스트 API DB 저장되도록 수정 (#301)
  • Loading branch information
dl-00-e8 authored Nov 10, 2023
1 parent d4c19b2 commit 3ec89b9
Show file tree
Hide file tree
Showing 42 changed files with 1,259 additions and 33 deletions.
6 changes: 6 additions & 0 deletions .github/workflows/dev-CD.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,12 @@ jobs:
echo "${{ secrets.APPLICATION_SECRET}}" > ./application-secret.yml
shell: bash

# - name: Make firebase json
# run: |
# mkdir -p ./src/main/resources/firebase
# echo "${{ secrets.FIREBASE_DEV_ADMIN}}" > ./src/main/resources/firebase/firebase-dev-admin.json
# shell: bash

# # makeFiles.config 반영
# - name: Make 00-makeFiles.config
# run: |
Expand Down
8 changes: 8 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,14 @@ dependencies {

// AOP
implementation 'org.springframework.boot:spring-boot-starter-aop'

// Spring Batch & Quartz
implementation 'org.springframework.boot:spring-boot-starter-batch'
implementation 'org.springframework.boot:spring-boot-starter-quartz'
testImplementation 'org.springframework.batch:spring-batch-test'

// FCM
implementation 'com.google.firebase:firebase-admin:9.2.0'
}

tasks.named('test') {
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/com/selfrunner/gwalit/GwalitApplication.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
package com.selfrunner.gwalit;

import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@EnableAsync
@EnableJpaAuditing
@EnableScheduling
@EnableBatchProcessing
@SpringBootApplication
public class GwalitApplication {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@


import com.fasterxml.jackson.core.JsonProcessingException;
import com.google.firebase.messaging.Message;
import com.selfrunner.gwalit.domain.homework.repository.HomeworkRepository;
import com.selfrunner.gwalit.domain.lecture.dto.request.*;
import com.selfrunner.gwalit.domain.lecture.dto.response.GetLectureMainRes;
Expand All @@ -13,6 +14,7 @@
import com.selfrunner.gwalit.domain.lecture.repository.LectureRepository;
import com.selfrunner.gwalit.domain.lesson.dto.response.LessonMetaRes;
import com.selfrunner.gwalit.domain.lesson.entity.Lesson;
import com.selfrunner.gwalit.domain.lesson.repository.LessonJdbcRepository;
import com.selfrunner.gwalit.domain.lesson.repository.LessonRepository;
import com.selfrunner.gwalit.domain.member.entity.*;
import com.selfrunner.gwalit.domain.member.exception.MemberException;
Expand All @@ -22,6 +24,7 @@
import com.selfrunner.gwalit.global.common.Day;
import com.selfrunner.gwalit.global.common.Schedule;
import com.selfrunner.gwalit.global.exception.ErrorCode;
import com.selfrunner.gwalit.global.util.fcm.FCMClient;
import com.selfrunner.gwalit.global.util.sms.SmsClient;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
Expand All @@ -47,8 +50,10 @@ public class LectureService {
private final MemberRepository memberRepository;
private final TaskRepository taskRepository;
private final LessonRepository lessonRepository;
private final LessonJdbcRepository lessonJdbcRepository;
private final HomeworkRepository homeworkRepository;
private final SmsClient smsClient;
private final FCMClient fcmClient;

@Transactional
public GetLectureMetaRes register(Member member, PostLectureReq postLectureReq) {
Expand Down Expand Up @@ -82,7 +87,7 @@ public GetLectureMetaRes register(Member member, PostLectureReq postLectureReq)
}
}
}
lessonRepository.saveAll(lessonList);
lessonJdbcRepository.saveAll(lessonList);

// Response
List<MemberMeta> memberMetas = new ArrayList<>();
Expand Down Expand Up @@ -162,7 +167,7 @@ public GetLectureMetaRes update(Member member, Long lectureId, PutLectureReq put
}
}
}
lessonRepository.saveAll(lessonList);
lessonJdbcRepository.saveAll(lessonList);
}
if(putLectureReq.getDeleteBefore().equals(Boolean.FALSE)) {
lessonRepository.deleteAllByLectureIdAndDate(lectureId, LocalDate.now(), lecture.getEndDate());
Expand All @@ -175,7 +180,7 @@ public GetLectureMetaRes update(Member member, Long lectureId, PutLectureReq put
}
}
}
lessonRepository.saveAll(lessonList);
lessonJdbcRepository.saveAll(lessonList);
}
}

Expand Down Expand Up @@ -276,13 +281,19 @@ public void inviteStudent(Member member, Long lectureId, PostInviteReq postInvit
}

// Business Logic
String lectureName = memberAndLecture.getLecture().getName();
Member check = memberRepository.findNotFakeByPhoneAndType(postInviteReq.getPhone(), MemberType.STUDENT).orElse(null);
if(check != null) {
if(check.getState().equals(MemberState.INVITE)) {
smsClient.sendInvitation(member.getName(), memberAndLecture.getLecture().getName(), postInviteReq, Boolean.TRUE);
smsClient.sendInvitation(member.getName(), lectureName, postInviteReq, Boolean.TRUE);
}
if(check.getState().equals(MemberState.ACTIVE)) {
smsClient.sendInvitation(member.getName(), memberAndLecture.getLecture().getName(),postInviteReq, Boolean.FALSE);
// smsClient.sendInvitation(member.getName(), lectureName,postInviteReq, Boolean.FALSE);
String title = lectureName + "클래스 초대";
String body = "[과릿] " + member.getName() + " 선생님으로부터 " + lectureName + " 클래스 초대가 도착했습니다." + "\n" + "접속하여 초대된 클래스를 확인해보세요!";
// FCMMessageDto fcmMessageDto = FCMMessageDto.toDto(check.getToken(), title, body, "studentLectureMain", lectureId, null, null, null);
Message message = fcmClient.makeMessage(check.getToken(), title, body, "studentLectureMain", lectureId, null, null, null);
fcmClient.send(message);
}
MemberAndLecture studentAndLecture = MemberAndLecture.builder()
.member(check)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.selfrunner.gwalit.domain.lesson.entity;

public enum BatchStatus {
READY, PROCESSING, SENT
}
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,10 @@ public class Lesson extends BaseTimeEntity {
@Column(name = "endTime", columnDefinition = "time")
private LocalTime endTime;

@Column(name = "delivered_at", columnDefinition = "varchar(255)")
@Enumerated(EnumType.STRING)
private BatchStatus deliveredAt;

public void update(PutLessonReq putLessonReq) {
this.type = LessonType.valueOf(putLessonReq.getType());
this.participants = putLessonReq.getParticipants();
Expand Down Expand Up @@ -98,6 +102,6 @@ public Lesson(Lecture lecture, String type, List<Participant> participants, Stri
this.weekday = time.getWeekday();
this.startTime = LocalTime.parse(time.getStartTime(), DateTimeFormatter.ofPattern("HH:mm"));
this.endTime = LocalTime.parse(time.getEndTime(), DateTimeFormatter.ofPattern("HH:mm"));

this.deliveredAt = BatchStatus.READY;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.selfrunner.gwalit.domain.lesson.repository;

import com.selfrunner.gwalit.domain.lesson.entity.Lesson;
import lombok.RequiredArgsConstructor;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Time;
import java.util.List;

@Repository
@RequiredArgsConstructor
public class LessonJdbcRepository {

private final JdbcTemplate jdbcTemplate;

@Transactional
public void saveAll(List<Lesson> lessonList) {
String sql = "INSERT INTO lesson (lecture_id, type, date, weekday, start_time, end_time) " +
"VALUES (?, ?, ?, ?, ?, ?)";

jdbcTemplate.batchUpdate(sql,
new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
Lesson lesson = lessonList.get(i);
ps.setLong(1, lesson.getLecture().getLectureId());
ps.setString(2, lesson.getType().toString());
ps.setDate(3, Date.valueOf(lesson.getDate()));
ps.setString(4, lesson.getWeekday().toString());
ps.setTime(5, Time.valueOf(lesson.getStartTime()));
ps.setTime(6, Time.valueOf(lesson.getEndTime()));
}

@Override
public int getBatchSize() {
return lessonList.size();
}
}

);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.selfrunner.gwalit.domain.lesson.dto.response.LessonMetaRes;
import com.selfrunner.gwalit.domain.lesson.dto.response.LessonProgressRes;
import com.selfrunner.gwalit.domain.member.entity.Member;
import com.selfrunner.gwalit.global.batch.dto.BatchNotificationDto;

import java.time.LocalDate;
import java.util.List;
Expand All @@ -21,8 +21,6 @@ public interface LessonRepositoryCustom {

Optional<LessonMetaRes> findLessonMetaByLectureIdAfterNow(Long lectureId);

Optional<List<LessonMetaRes>> findAllLessonMetaByLectureIdAndDate(Long lectureId);

void deleteAllByLectureIdAndDate(Long lectureId, LocalDate startDate, LocalDate endDate);

Optional<Long> findRecentLessonIdByLectureId(Long lectureId);
Expand All @@ -32,4 +30,12 @@ public interface LessonRepositoryCustom {
List<Long> findAllLessonIdByLectureIdList(List<Long> lectureIdList);

void deleteAllByLectureLectureIdList(List<Long> lectureIdList);

List<Long> findTodayLessonIdByDate(LocalDate date);

List<BatchNotificationDto> findAllByDate(List<Long> lessonIdList);

void updateLessonProcessingByDate(List<Long> lessonIdList);

void updateLessonSentByDate(List<Long> lessonIdList);
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@
import com.querydsl.jpa.impl.JPAQueryFactory;
import com.selfrunner.gwalit.domain.lesson.dto.response.LessonMetaRes;
import com.selfrunner.gwalit.domain.lesson.dto.response.LessonProgressRes;
import com.selfrunner.gwalit.domain.lesson.entity.BatchStatus;
import com.selfrunner.gwalit.domain.lesson.entity.LessonType;
import com.selfrunner.gwalit.domain.member.entity.Member;
import com.selfrunner.gwalit.global.batch.dto.BatchLessonDto;
import com.selfrunner.gwalit.global.batch.dto.BatchNotificationDto;
import com.selfrunner.gwalit.global.common.Schedule;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
Expand All @@ -19,8 +21,10 @@
import java.util.Optional;

import static com.querydsl.core.group.GroupBy.groupBy;
import static com.querydsl.core.group.GroupBy.list;
import static com.selfrunner.gwalit.domain.lecture.entity.QLecture.lecture;
import static com.selfrunner.gwalit.domain.lesson.entity.QLesson.lesson;
import static com.selfrunner.gwalit.domain.member.entity.QMember.member;
import static com.selfrunner.gwalit.domain.member.entity.QMemberAndLecture.memberAndLecture;

@Repository
Expand Down Expand Up @@ -80,7 +84,7 @@ public List<Long> findAllLessonIdByLectureId(Long lectureId) {
public Optional<LessonMetaRes> findLessonMetaByLectureIdBeforeNow(Long lectureId) {
return Optional.ofNullable(queryFactory.select(Projections.constructor(LessonMetaRes.class, lesson.lessonId, lesson.lecture.lectureId, lesson.type, lesson.date, Projections.constructor(Schedule.class, lesson.weekday, lesson.startTime, lesson.endTime), lesson.participants))
.from(lesson)
.where(lesson.lecture.lectureId.eq(lectureId), lesson.date.before(LocalDate.now().plusDays(1l)))
.where(lesson.lecture.lectureId.eq(lectureId), lesson.date.before(LocalDate.now().plusDays(1L)))
.orderBy(lesson.date.desc(), lesson.startTime.desc(), lesson.endTime.desc())
.fetchFirst());
}
Expand All @@ -94,16 +98,6 @@ public Optional<LessonMetaRes> findLessonMetaByLectureIdAfterNow(Long lectureId)
.fetchFirst());
}

@Override
public Optional<List<LessonMetaRes>> findAllLessonMetaByLectureIdAndDate(Long lectureId) {
return Optional.ofNullable(
queryFactory.select(lesson)
.from(lesson)
.where(lesson.lecture.lectureId.eq(lectureId), lesson.date.between(LocalDate.now().minusDays(8), LocalDate.now()))
.transform(groupBy(lesson.lessonId).list(Projections.constructor(LessonMetaRes.class, lesson.lessonId, lesson.lecture.lectureId, lesson.type, lesson.date, Projections.constructor(Schedule.class, lesson.weekday, lesson.startTime, lesson.endTime), lesson.participants)))
);
}

@Override
public void deleteAllByLectureIdAndDate(Long lectureId, LocalDate startDate, LocalDate endDate) {
queryFactory.update(lesson)
Expand All @@ -117,7 +111,7 @@ public Optional<Long> findRecentLessonIdByLectureId(Long lectureId) {
return Optional.ofNullable(queryFactory.select(lesson.lessonId)
.from(lesson)
.leftJoin(lecture).on(lesson.lecture.lectureId.eq(lecture.lectureId))
.where(lesson.lecture.lectureId.eq(lectureId), lesson.deletedAt.isNull(), lesson.date.before(LocalDate.now().plusDays(1l)))
.where(lesson.lecture.lectureId.eq(lectureId), lesson.deletedAt.isNull(), lesson.date.before(LocalDate.now().plusDays(1L)))
.orderBy(lesson.date.desc(), lesson.startTime.desc(), lesson.endTime.desc())
.fetchFirst()
);
Expand All @@ -128,7 +122,7 @@ public Optional<List<Long>> findRecentLessonIdByLectureIdList(List<Long> lecture
return Optional.ofNullable(
queryFactory.select(lesson.lessonId)
.from(lesson)
.where(lesson.lecture.lectureId.in(lectureIdList), lesson.deletedAt.isNull(), lesson.date.before(LocalDate.now().plusDays(1l)))
.where(lesson.lecture.lectureId.in(lectureIdList), lesson.deletedAt.isNull(), lesson.date.before(LocalDate.now().plusDays(1L)))
.orderBy(lesson.date.desc(), lesson.startTime.desc(), lesson.endTime.desc())
.transform(groupBy(lesson.lecture.lectureId).list(lesson.lessonId))
);
Expand All @@ -149,4 +143,43 @@ public void deleteAllByLectureLectureIdList(List<Long> lectureIdList) {
.where(lesson.lecture.lectureId.in(lectureIdList))
.execute();
}

@Override
public List<Long> findTodayLessonIdByDate(LocalDate date) {
return queryFactory.select(lesson.lessonId)
.from(lesson)
.leftJoin(lecture).on(lecture.lectureId.eq(lesson.lecture.lectureId))
.leftJoin(memberAndLecture).on(memberAndLecture.lecture.lectureId.eq(lecture.lectureId))
.leftJoin(member).on(memberAndLecture.member.memberId.eq(member.memberId))
.where(lesson.deletedAt.isNull(), lecture.deletedAt.isNull(), memberAndLecture.deletedAt.isNull(), lesson.date.eq(date), member.token.isNotNull(), memberAndLecture.isTeacher.eq(Boolean.TRUE), lesson.deliveredAt.eq(BatchStatus.READY))
.fetch();
}

@Override
public List<BatchNotificationDto> findAllByDate(List<Long> lessonIdList) {
return queryFactory.selectFrom(lesson)
.leftJoin(lecture).on(lecture.lectureId.eq(lesson.lecture.lectureId))
.leftJoin(memberAndLecture).on(memberAndLecture.lecture.lectureId.eq(lecture.lectureId))
.leftJoin(member).on(memberAndLecture.member.memberId.eq(member.memberId))
.where(lesson.lessonId.in(lessonIdList))
.transform(groupBy(memberAndLecture.member.memberId)
.list(Projections.constructor(BatchNotificationDto.class, memberAndLecture.member.memberId, member.token,
list(Projections.constructor(BatchLessonDto.class, lecture.name, lesson.date, lesson.startTime, lesson.endTime)))));
}

@Override
public void updateLessonProcessingByDate(List<Long> lessonIdList) {
queryFactory.update(lesson)
.set(lesson.deliveredAt, BatchStatus.PROCESSING)
.where(lesson.lessonId.in(lessonIdList))
.execute();
}

@Override
public void updateLessonSentByDate(List<Long> lessonIdList) {
queryFactory.update(lesson)
.set(lesson.deliveredAt, BatchStatus.SENT)
.where(lesson.lessonId.in(lessonIdList))
.execute();
}
}
Loading

0 comments on commit 3ec89b9

Please sign in to comment.