-
Notifications
You must be signed in to change notification settings - Fork 0
Commit 83d94b1
[축] 0.2V 배포 [축] (#449)
* [축] 0.1V 배포 [축] (#391)
* [GWL-3] Tuist 프로젝트 세팅 (#18)
* build: Tuist를 통한 WeTri App Project 생성
* build: SwiftLint, SwiftFormat 적용
---------
Co-authored-by: JongPyoAhn <whdvy95@gmail.com>
* docs: PR Template 추가 (#20)
* build: 클린아키텍쳐 모듈러 폴더링 (#22)
* chore: Move PR template from iOS folder to parent directory (#24)
* [GWL-4] TS + Nest.js + TypeORM 세팅 (#25)
* build: nest-cli를 이용한 TS + Nest 프로젝트 생성
* chore: update package.json
* chore: env 파일 gitignore 추가
* build: TypeORM 세팅
* build: TypeORM 세팅 (클래스 분리)
* ci: 백엔드 CI yml파일 작성 (#26)
* [GWL-5] Design System 정리 (#28)
* build: 디자인시스템 Target 생성
* feat: Color Design System 적용
## ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS: YES로 변경
Assets Catalog Compiler가 자동으로 Extension해주는 기능이 False로 처리되어있습니다.
그래서 Project를 생성할 때 base 내부에 위 key값을 True로 변경하는 작업을 진행했습니다.
## Project options의 자동생성되는 bundle swift 코드 비활성화
* feat: Design System 버튼 추가
- 일반적으로 사용하는 메인 색깔의 둥근 모서리 버튼
- 메인 색깔의 원형스타일 버튼
- button state에 따라 스타일이 바뀌는 handler
* feat: UIFont extension 추가
- preferred font를 확장하여 bold, italic을 손쉽게 적용할 수 있도록 extension 마련
* build: swiftformat 규칙 수정
--guardelse 'next-line'
---------
Co-authored-by: JongPyoAhn <whdvy95@gmail.com>
* [GWL-7] Network 라이브러리 구현 (#36)
* feat: 독자적 TNNetwork 네트워크 모듈 구축
* feat: TNNetwork레이어 구성
### Mock 작성
- URLSessionProtocol 생성
- async 와 관련된 Mock
- Completion과 관련된 Mock
### 파일 분리
- 기존 Provider쪽에 있던 endpoint의 request를 endpoint 파일로 옮김
### 테스트코드 작성
* test: 테스트 코드 수정
* chore: initializer 접근제어 수정
외부로부터 사용되어야하는 객체들이 전부 internal로 되어있었습니다.
따라서 Trinet initializer의 접근제어자를 public으로 수정했습니다.
---------
Co-authored-by: SeungHyun Hong <whi7ehyun@gmail.com>
* build: RecordFeature Framework 생성 (#39)
* [GWL-41] TNCombineCococa 구현 (#41)
* build: TNCocoaCombine freamework 추가
* feat: TNCocoaCombine 추가
* [GWL-43] Swagger, Logger 적용 및 TypeORM Async 제거 (#51)
* feat: Swagger 설치 및 세팅
* feat: logger.middleware와 winston을 이용한 로깅 및 로그 파일관리
bootstrap 과정에서 winston 적용을 위해 winston 인스턴스를 전달하며, 인터셉터가 아닌 모든 요청에 대한 기록을 위해 logger 미들웨어 구현
* chore: 미들웨어 Inject 수정
* chore: lint 적용
* [GWL-40] Root Coordinator 세팅 (#48)
* fix: tuist generate가 되지않는 현상 해결
Feature프로젝트에 Sources, Resources, Tests 폴더가 형성되지 않아 발생하는 버그를 수정하였습니다.
* chore: APP단 Coordinator관련 파일 추가 및 폴더링
* feat: AppCoordinator 구성
* feat: TabBarCoordinator 구현
예제
* build: Coordinator 필수 구성요소 모듈화
* chrow: 리뷰 적용
앱코디네이터에서 탭바코디네이터 자식 추가, 탭바 코디네이터 selectedImage 작성
* [GWL-51] Design System Page Control 생성 (#54)
* feat: GWPageControl 구현
* feat: GWRoundedShadwView 구현
* chor: 접근 제어자 수정
* feat: 접근 제어자 수정, GWShadow 파일 분리
* [GWL-50] typeORM entity 세팅 및 테스트 (#56)
* chore: typeORM entity 세팅
* [GWL-22] 운동 요약 화면 UI 구성 (#57)
* feat: 운동 요약 화면을 갖는 ViewController, ViewModel 추가
* chore: 운동 종료버튼 접근성 힌트 추가
* chore: 운동참여 인원 CollectionView 추가
* feat: 운동 참여 인원 UI인 CollectionViewCell 추가
* feat: Diffable DataSource 적용
* feat: Custom Compositional Layout 구현
- Figma 디자인에 맞게 Layout을 수정했습니다.
* feat: CollectionView Cell Accessibility 추가
* feat: endWorkoutSubject 추가
endWorkoutButton이 눌렸을 때 endWorkoutSubject가 이벤트를 전달하도록 구현했습니다.
endWorkoutSubject는 Input이기에, 타입을 지우고 viewModel에게 파라미터로 넘겼습니다.
* chore: 하드코딩된 크기값과 제약조건값을 enum으로 관리
* [GWL-13] 운동 선택 화면 UI 구현 (#59)
* feat: 기능 구현
* chore: sceneDelegate수정
* chor: CardCell에 Rounded기능과 DropShadow 함수 이름 수정
* chor: SceneDelegate 수정
* chor: 피드백 반영
오타 및 함수명 변경
* chore: 다크모드 대응
* chor: 피드백 반영
* chor: 디렉토리 이름 변경
* [GWL-53] SwiftLint 수정 (#61)
* build: swiftLint 수정
Trailing Comma, line_length 수정
* fix: SwiftLint 적용이 안되는 현상 개선
기존에 적용이 안되는 이유는 Scripts에 적혀있던데로 generate할 때 경로지정을 안해줬기 때문입니다.
* build: SwiftFormat sortedSwitchCases -> sortSwitchCase
* [GWL-54] Tuist Test Github Action 적용 (#63)
* test: RecordFeatureTests 추가
test target이 있음에도 test 코드가 존재하지 않는다면 tuist test시 오류가 발생합니다.
그래서 오류를 방지하고자 추가했습니다.
* ci: Tuist test CI 설정
* chore: Rename color variables to primaryBackground and secondaryBackground (#65)
* fix: DesignSystemColor 컬러 수정되지 않은 곳 변경 (#67)
* fix: Fix typo (#68)
* [GWL-6] 탭바 기록화면 UI구성 (#66)
* fix: tuist 폴더구조
Resources와 Tests 폴더 경로 문제
* feat: 운동기록이 있는 경우의 UI 구현
* feat: 기록이 없을 때 나타내는 View 구현
* refactor: RecordViewController 네이밍 변경
* feat: RecordContainerViewController 생성
* feat: custom CallendarCollectionView 구현
* feat: custom CallendarCollectionView 구현
* feat: custom CallendarCollectionView 구현
* chore: SceneDelegate에서 뷰컨트롤러 테스트한 코드 제거
* chore: 오탈자 수정
* [GWL-5] DesignSystem 오탈자로 인한 컴파일에러 수정 (#74)
* hotfix: DesignSystem 오탈자 수정
* chore: github인식문제로 인한 asset 폴더 이름 변경
* chore: asset폴더 이름 적용
* feat: 자동 배포를 위한 파일 생성 (#80)
ci/cd의 yml에서 cd부분을 추가했습니다. ncp의 container registry를 사용하며 이미지가 push가 완료되면 action의 메시지를 통해 pull을 받습니다.
이미지를 받은 후, DockerFile을 실행하게 됩니다.
* [GWL-48] [FIX] 수동 배포에서 자동 배포로 구현하기 [도커] (#82)
* chore: 기존, CICD 파일 삭제
* ci: CI, CD가 작동하지 않았던 부분을 명확하게 하기위해 파일을 분리했습니다.
CD의 경우 PR로 이벤트를 바꿔서 PR에서 작동여부를 체크하겠습니다. ㅠㅠ
* refactor: 포트 터널링 제거
포트 터널링을 제거했습니다.. 일단 작동여부가 더 중요해졌어요
* refactor: 띄어쓰기 추가..
* refactor: 호스트 환경에서 컨테이너 환경으로 .env 파일 복사
* refactor: docker run에서 포트 매핑 제거
* refactor: docker run에서 -p 제거 ㅠㅠ
* refactor: 포트 포워딩 적용시켜보기
* refactor: env 파일 변경 테스트
* chore: develop 브랜치에 push가 되고 BackEnd 폴더가 변경될때만 작동한다.
* [GWL-16] 운동 동료 선택 화면 UI 구현 (#69)
* feat: WorkoutPearTypeSelectCell 생성
* feat: WorkoutViewController생성
* feat: PageControll 버그 수정
* feat: 뷰 구현
* feat: 오타 수정 pear -> peer
* feat: pageControl move prev 구현
* feat: gesture recognizer를 통한
* chor: 오타 수정
* feat: PageControl 버그 수정
* feat: backGround Color 오탈자 수정
* chore: Public 함수 이름 변경
* chore: GWPageControl 함수 이름 수정
* [GWL-49] RecordFeature Coordinator Flow 구성 (#84)
* feat: RecordFeature Coordinator
* feat: RecordFeature내부의 Coordinator flow 작성
* chore: Coordinator start Prefix 수정
이전 다함님 피드백을 늦게봐서 이제서야 반영합니다 ㅠㅠ
* chore: AppCoordinator Todo작성
* [GWL-64] Apple 인증 후 회원가입 구현, 로그인 유지 (access token, refresh token), Apple 인증 후 회원가입, 로그인 유지, global exception filter, global interceptor 구현 (#83)
* chore: auth module, controller, service 생성
* feat: signToken: access, refresh 토큰 생성 함수 구현
* feat: loginUser(): login했을 때 accessToken, refreshToken 생성 후 반환하는 함수 구현
* chore: users module, controller, service 생성
* chore: usersRepository 주입
* feat: authticateWithUserIdAndProvider() => 유저의 아이디가 데이터베이스에 존재하는지 검증하는 함수 구현
* chore: profile 모듈, 컨트롤러, 서비스 생성
* feat: registerWithUserIdAndProvider() => 회원가입 기능 구현
* feat: signup() 구현 -> auth/signup
* feat: 토큰 재발급하는 로직 구현
* feat: 토큰 재발급하는 api 구현
* bearerTokenGuard 구현, refreshTokenGuard 적용
* feat: signupDto 생성 후 적용
* chore: lint 적용
* feat: ResponseTransformInterceptor 구현 => response data를 transfrom 해준다.
* feat: httpExceptionFilter 구현, auth 관련된 custom exception 구현
* chore: spec 삭제
* chore: lint 적용
* ci: runs-on self-hosted로 변경
* [GWL-55] Makefile과 Tuist로 모듈 및 데모 앱 생성 명령어 구현 (#81)
* feat: Enhance dependency management
DependencyPlugin을 사용해서 프로젝트의 dependency 구조를 향상시킴
앞으로 새로운 모듈이 생성될 때마다 간편하게 모듈을 추가하거나 작업할 수 있게 되었음
Specifically:
- Added `TargetDependency` extensions for core components like `DesignSystem`, `Trinet`, `Coordinator`, and `CombineCocoa`.
- Introduced a new enum `Feature` to streamline the creation of feature-specific dependencies.
* chore: Rename TNCocoaCombine to `CombineCocoa`
* feat: Path extension 추가
각 모듈화된 상위 폴더를 기준으로 Path에 접근할 수 있도록 Sugar API 구현
* feat: Feature Module 생성을 Makefile로 간편화
* fix: lowerCamelCase로 만들어지지 않는 버그 수정
* chore: swiftformat 적용
* chore: WeTriApp을 App에서 App/WeTri로 폴더링
* feat: Demo make 명령어 구현
- demo 앱을 빠르게 만들어줄 수 있도록 shell script와 Makefile을 손봤습니다.
* feat: EnvironmentPlugin 추가
프로젝트의 기본 세팅 환경을 갖는 Plugin을 따로 마련했습니다.
* feat: Target templates 추가
app 타겟과 feature 타겟, 그 외 custom으로 설정할 수 있는 target를 추가했습니다.
* refactor: makeModule 리팩토링
makeModule이 Target모듈까지 만드는 부분을 분리했습니다.
앞으로 Project.makeModule은 외부로부터 Target을 받아 Project를 생성합니다.
* chore: swiftformat 적용
* fix: makeModule 리팩토링 코드에 맞게 sh 수정
* fix: TNCocoaCombine 제거
* fix: DesignSystem Resource 경로 설정
* fix: Target Tests추가 시 구현체 의존성 추가
* fix: Folder 생성 오류 수정
* chore: Feature tests stencil 추가
* refactor: module scripts를 하나로 통합
* [GWL-66] ipa 파일을 Object 스토리지에 저장후 API 메인에서 다운 받을 수 있도록 구현, CD 수정 (#88)
* chore: self-hosted에서 appleboy가 작동하지 않기에 ssh 접속 코드로 수정
* chore: app.service 삭제
* feat: ipa 제공을 위한 index.html 서빙 코드 작성
* chore: app.controller.spec.ts 제거
* chore: sendFile을 주는지 테스트 코드 작성
* fix: CD 파일 붙여넣기 오류 수정
* chore: 클-아 폴더링 (#90)
* [GWL-59] 유저가 운동을 마친 후 기록하는 API 요청 (#91)
* chore: api/v1 추가
* chore: records 모듈, 컨트롤러, 서비스 생성
* CreateExerciseLogDto 구현
* feat: createExerciseLog 함수 구현 -> 유저가 운동 후 기록
* chore: lint 적용
* chore: exercise -> workout
* �fix: CD sshpass 오류 수정..
* [GWL-25] 지도 화면 UI 구현 (#94)
* chore: WorkoutSummary 네이밍 수정
- WorkoutSummaryViewController -> WorkoutSessionViewController
- WorkoutSummaryViewModel -> WorkoutSessionViewModel
- ParticipantsCollectionViewCell -> SessionParticipantCell
* feat: WorkoutRouteMap 뷰 구성
* fix: tuist project code 수정
- app target을 생성할 때 별도의 infoPlist를 받도록 세팅
- Feature에서 coordinator 인식 오류 수정(coordinator dependency추가)
- WeTri App target에 위치 권한 infoPlist 설정
* feat: 이동시 경로를 그려주도록 구현
* [GWL-71] self-hosted Runner로 변경에 따른 CD 수정 (#92)
* refactor: self-hosted 환경이 Mac ARM 64임으로, linux/amd64로 빌드해야한다.
테스트를 위해 pull_request로 잠시 수정했습니다.
* chore: 시크릿 변수에 NCP를 빼먹었습니다.
* chore: Dockerfile에 public 폴더를 추가해줬습니다.
* chore: develop에 push 될 때, CD 액션이 발생하도록 수정
* chore: BackEnd CI에서 feture/BE/*경로만 CI를 진행한다.
* [GWL-57] 유저의 운동 기록 API 요청 (#96)
* feat: 유저의 운동 기록 가져오기, recordId의 운동 기록 가져오기
* chore: lint 적용
* chore: checker -> isPosted
* [GWL-27] 운동 결과 화면 흐름 구현 (#97)
* chore: Rename WorkoutSummary to WorkoutSession
- WorkoutSummary로 들어가있는 Input, Output, State를 WorkoutSession으로 변경
* feat: WorkoutSummary Scene 추가
* feat: 운동 요약 카드뷰를 제외한 기본 UI 구성
* feat: preferredFont에서 다양한 굵기설정 가능한 메서드 추가
- 기존 메서드에서는 bold만 설정할 수 있었고, 다양한 폰트 굵기를 제공하고자 별도의 메서드를 구현했습니다.
* feat: 운동 요약 카드 뷰 UI 구현
* chore: 운동 요약 화면 중 글쓰기 버튼과 기록 화면 이동 버튼 폰트 굵기 설정
* feat: 운동 요약 화면을 구성할 데이터 임시 정보 구현
- Mock JSON 추가
- DTO 추가
* feat: WorkoutSummaryRepository 구현
* feat: WorkoutSummaryUseCase 추가
* feat: UseCase 연동 및 ViewModel ViewController 데이터 스트림 연결
* feat: Error 발생시 에러 alert 처리
* chore: Move WorkoutSummary.json to reousrce folder
* fix: 뷰 수정 시 메인 스레드에서 동작하도록 수정
* fix: 지도 비율을 1:1.6으로 설정
* chore: 시간, 거리, 칼로리와 심박수 간 오와열 맞춤
* [GWL-62] 웹소켓 서버 구축 (#98)
* fix: 로거가 작동하지 않는 이유를 분석하고 수정
finish가 아닌 end로 설정해 두어야한다.
* chore: Ws와 SocketIO 의존성 설치
* feat: 웹소캣을 이용한 간단한 양방향 서버 구축
웹소캣을 이용해서 현재 간단하게 전송 후 되돌려받는 게이트웨이를 만들었습니다.
* ci: WSS 서버 통신을 위해 3003 포트포워딩
* ci: -p 명령어 추가
* ci: 리버스 프록시를 위한 포트포워딩 수정
* ci: 웹소캣 테스트를 위한 ci 수정
* chore: @nestjs/platform-ws 의존성 추가
* fix: 외존성 주입을 생성자로 사용
* chore: winton 로깅 에러로 인한 제거
* ci: 테스트 종료에 따른 CD 원상복귀
* [GWL-32] apple signIn 구현, 학습 정리 (#100)
* chore: runningTime -> workoutTime
* feat: appleSignIn 구현
* chore: lint, format 적용
* chore: bpm -> heartRate
* [GWL-68] RecordList 비즈니스 로직 작성 (#99)
* feat: MockRepository로 데이터 가져와서 RecordScene에 표시
* feat: 기록이 있을때와 없을때 뷰 변경 로직
* chore: noRecordsView TextAlignment 수정
* docs: 주석제거
* feat: appear될 때 오늘날짜 설정 로직
* docs: 주석 제거
* feat: ViewModel에서 Coordinator화면전환 로직
* chore: Records.json
* chore: Json파일 쉼표 빠진거 추가
* feat: workoutRecordsRepository 에러처리로직 추가
* chore: WorkoutMode에 CustomStringConvertible추가
* chore: 작은단위 피드백 반영
* refactor: ContainerViewController 자식뷰컨 Coordinator에서 생성
* style: Protocol prefix Representable
* feat: 서버와의 통신 String to Date
* docs: Json주석제거
* chore: 이중 switch문 제거
* rename: Usecase->UseCase
* [GWL-74] CocoaCombine bind(to:) 추가 (#103)
* feat: bind Method 구현
* test: bind(to:) unit test 추가
* fix: Test코드에서 Just Publisher 호출 위치 변경
* [GWL-78]Record Swagger 작성 (#108)
* chore: 의존성 추가
* feat: Swagger 모듈을 이용한 Record 컨트롤러 작성
* feat: DTO를 PickType을 상속 받았기에, Model에 API 데코레이터 작성
* feat: Response API 작성을 위한 DTO 파일 생성 및 적용
* ci: BackEnd_CI if 문 추가
* [GWL-77] auth, profile 스웨거 작성 (#110)
* feat: swagger 작업
* chore: format 적용
* [GWL-52] Logger 모듈 생성 (#101)
* feat: Implement Log module
* chore: Change OSLog to
* [GWL-80] 서버 URL을 XCConfig에 설정 (#107)
* feat: xcconfig 설정 추가
* add: Trinet baseURL default value 추가
* delete: Trinet 삭제
* add: xcconfig gitignore 추가
* ci: CI동작일 때 xcconfig 제외
* ci: make ci로 동작 수정
* ci: isCI에서 CI로 수정
* ci: TUIST_CI로 명명
* [GWL-70] Record 만들어진 UI ViewModel 구현 (#95)
* feat: WorkoutEnviorment ViewModel 생성
* feat: injectable, WorkOutEnvironmentSetupSyringe 구현
* feat: workoutSettingCoordinator 프로토콜 변경
* chore: 폴더 이름 변경 workoutSelectScene -> WorkoutEnvironmentScene
* chore: 폴더 구조 재확립
* feat: DIContainer 구현
* feat: useCase에서 Task진입으로 코드 변경
* feat: EnviormentVC연결
* chore: 변수 명 수정
* feat: workoutEnvironment 내부 navigationContainerController 페이지 이동 구현
* feat: persistency에서 PeerType 가져오는 로직 구현
* chore: Magicnumber 수정
* feat: Workouttpyes TNProvider 에서 Persistency 이용하도록 변경
* chore: 주석 수정
* chore: 주석 수정
* feat: Usecase에서 Subscription or cancellables 삭제
* Chore: 이름 수정
* chore: 오타 수정
* chore: 피드백 반영
- Container 제거
- flatMap 순환참조 위험성 제거
- dataCell에 보일 unique한 데이터를 갖을수 있도록 로직 추가
- let someVariable = Array(Set(array))
- uuid 제거
- Repository Representable 폴더 생성
* chore: 접근제어자 수정
* move: repositoryInterface 파일 위치변경
* feat: 피드백 반영 VC에 publisher타입을 <Result, Never> -> <State, Never>로 수정
그간 Error를 다른 타입으로 묶음으로서
* add: vcstate에서 error case안에 nested되게 수정
* delete: inject 삭제
* delete: devBranch충돌 회피
* [GWL-83] Record Swagger 리팩토링 (#114)
* refacotr: dto 리팩토링
* chore: format 적용
* [GWL-84] Workout Session 전체 뷰 구성 + Swiftformat CI 추가 (#117)
* add: WorkoutSessionContainerScene 추가
* refactor: 타이머label, 운동종료버튼을 container로 이동, PageViewController 사용
* chore: 운동종료버튼 viewModel 연결을 ContainerScene으로 이동
* add: pageControl 추가
* ci: swiftformat job 추가
* ci: swiftformat 경로 수정
* ci: Project 코드만 formatting하도록 수정
* delete: subscription.cancel() 제거
* [GWL-82] 날짜별 운동 기록 테이블 수정, 데이터 베이스 수정 (#115)
* chore: 의존성 설치
* chore: typeORM sync 기능 false 수정
* feat: workout 엔티티 구현
* add: workout 컨트롤러 서비스 모듈 dto 파일 생성
* chore: app 모듈에 workout 추가
* feat: workout Response Dto 구현
* feat: workouts 컨트롤러 getAllWorkout 기능 구현
* chore: 3주차 ipa 링크 추가
* chore: WorkoutModel에서 Workout 으로 클래스 명 변경
* chore: UserModel에서 User 으로 클래스 명 변경
* chore: RecordModel에서 Record 으로 클래스 명 변경
* chore: ProfileModel에서 Profile 으로 클래스 명 변경
* chore: User, Profile 명 수정
* delete: create-workout.dto.ts 삭제
* chore: Swagger 태그 설정
* chore: workout 라우팅 문자 변경
* refactor: 사용자가 년 월 일에 맞는 데이터를 요청할 때, 로직 작성
* docs: Issue Template 추가 (#119)
버그 제보, 기능 구현 템플릿 추가
* [GWL-116] 조금 더 구조적이고, 탄탄한 WebSocket 재 구축 (#126)
* delete: lives 폴더, 파일 제거
* add : events 폴더 생성 및 파일 추가
* chore: lives모듈 import 제거
* add: 매칭 API 폴더 생성
* add: event 폴더 생성
* delete: 기존 events 파일 제거
* chore: match 모듈 import
* chore: match controller 제거
* chore: format 적용
* [GWL-124] 랜덤 매칭 화면 구현 (#127)
* style: swiftFormatter 실행
* feat: RecordListViewController 화면전환 RunLoop.main에서 실행되게 코드 수정
* bug: containerNavgationController 의RootViewController 지정
* feat: 운동 매칭 선택 화면 VIew 1차 구현
* feat: Coordinator를 통한 RandomPeerMatching 화면 전환 구현
* feat: CancleButton Coordinator를 통한 Pop Method구현
* chore: alpha값 변경
* style: lint에 맞게 코드 수정
* style: 피드백 반영
* [GWL-125] GWPageController 스스로가 Size를 갖을 수 있도록 코드 변경 (#128)
* feat: GWPageControl 버그 수정
* style: 코드 주석 수정
* style: intrinsicContentSize
* chore: formattingTest 실패 수정
* [GWL-15] 운동 세션 Flow와 운동 요약 화면 이동 처리 (#130)
* chore: ViewController를 프로퍼티로 갖도록 수정
* feat: LocationTrackingProtocol 구현
RouteMapViewController가 채택하고, Container가 protocol을 바라보게 함으로써
위치 정보를 제공받는 Publisher만 접근하도록 구현했습니다.
* feat: location publisher를 container view controller와 연결
* add: WorkoutHealth 추가
- 운동 종료후 서버에게 요청보낼 건강 데이터입니다.
- 아직 서버와 협의되지 않은 임시 모델입니다.
* feat: Implement `HealthDataProtocol` in WorkoutSession Flow
WorkoutSessionViewController에서 HealthKit을 이용해 데이터를 파싱할 예정입니다.
healthData가 업데이트되면, publisher를 갖고있는 ContainerViewModel에게 이벤트가 전달되도록 구현했습니다.
* chore: TODO 작성
* feat: WorkoutRecordRepository 구현
* feat: WorkoutRecordUseCase 추가
* feat: Workout Session Container Flow 구현
* chore: swiftformat 적용
* feat: WorkoutSessionCoordinating 구현
- WorkoutSessionContainer를 보여주기 위한 Coordinator
* feat: coordinator로 요약화면 이동
* feat: Mock JSON 연결
* fix: UI - Main thread 오류 수정
* fix: Repository decode response model 수정
GWResponse를 묶어 decode하도록 수정했습니다.
* chore: 버튼이 눌릴 때 이벤트가 실행되도록 변경
* feat: 종료 버튼 탭 시 요약화면으로 이동
* fix: locationManager 설정을 lazy var에서 let으로 수정
* chore: NavigationBar 숨김 처리
* add: deinit 코드와 preview 미비된 코드 추가
* [GWL-129] RandomMatchingAPI연결 (#132)
* move: wokroutPeerRandomMatchingViewController 폴더 구조
* feat: RandomMacthing Repository, Usecase 생성
* feat: TNProvider Response받는 함수 추가
* feat: TNError 추가
* feat: TNProvider 수정, UseCase및 Repository data흐름 변경
* move: RepositoryInterface 파일 위치 수정
* feat: DTO수정, Coordinator수정, ViewModel 생성자 수정
* feat: Trinet Mock Session에서 여러 Data를 받을 수 있는 mockDataByURLString 추가
* feat: 목데이터 추가
* feat: ViewModel Usecase연결
* bug: 오타로 인한 MockData안불려오던 버그 수정
* feat: mockData Json 수정
* feat: 타임아웃후 ViewController Pop 기능 추가
* style: 중복되는 코드 함수 분리
* chore: swiftFormat적용
* bug: DidSelectPeer와 DidSelectWorkoutType버그 수정
* style: 코드 주걱 변경
* feat: TuistTest통과하도록 코드 변경
- completion 의 매서드 @sendable 제거
- Publisher_BindTests 이름 PublisherBindTests 로 변경
* Update iOS/Projects/Features/Record/Sources/Data/DTO/NullDTO.swift
Co-authored-by: SeungHyun Hong <whi7ehyun@gmail.com>
* bug: 오타 수정
* feat: TNProvider filtiering기능 추가
* chore: 원호님 피드백 적용 매칭 시간 150초로 수정
* feat: TNError추가 및 TNProvidable코드 추가
* style: TNProvidable statusCode 확인하는 매서드 이름 변경
---------
Co-authored-by: SeungHyun Hong <whi7ehyun@gmail.com>
* [GWL-37] CocoaCombine withLatestFrom 추가 + Code Coverage 100% (#133)
* feat: Publisher의 withLatestFrom 구현
* test: WithLatestFrom 테스트코드 추가
* refactor: UIControl subscription을 @objc에서 UIAction으로 변경
* test: UIControl+PublisherTests 추가
* [GWL-122] Room 기능 구현, 테스트 (#134)
* chore: record dto 수정
* feat: server joinRoom 구현
* feat: server leaveRoom 구현
* feat: server to().emit() 구현 => 브로드캐스트
* feat: ExtensionWebSocket 구현
* chore: 확장 클래스 적용
* chore: format 적용
* feat: client id추가, clients, sids 자료구조 server에 추가
* feat: webSocket이 close될 때 참여한 모든 룸을 나감
* chore: format 적용
* chore: test 삭제
* [GWL-140] 어드민 계정 생성, 로그인 구현 (#145)
* feat: admin 로그인 기능 구현
* chore: format 적용
* ci: labeled 설정
* [GWL-136] Trinet 리팩토링 (Headers, Header, method, typo) (#143)
* rename: Fix typo
* add: Add `CustomStringConvertible` in TNHeader(s)
* add: Add PUT method with comments
* feat: TNHeaders initializer options 추가 (배열, 딕셔너리)
* feat: accept, contentType, authorization 헤더 추가
* add: headers에 accessToken, refreshToken, formData 등의 api 추가
* rename: Rename Test to EndPointTests
* feat: MockEndPoint으로 분리 Session test code제거
* feat: SessionProtocol Tests
* fix: MockSession error 처리
* move: MockJSON폴더 제거 후 Persistency로 이동
* fix: Fix typo
* [GWL-121] 매칭 API 구현 (#135)
* chore: Redis 의존성 추가
* chore: Redis 의존성 추가 10.2.1 버전
* add: 레디스 config 파일 생성
* chore: 레디스 imports에 추가
* chore: 매칭 관련 Constant 관리 파일
* feat: Random 매칭에 필요한 DTO 작성과 Swagger 작성
* chore: redis config 작성을 공식문서와 동일하게 작성
* chore: DTO 생성 및 Swagger 적용
* delete: entity 삭제
* chore: redis Config 클래스 작성
* delete: 매치 업데이트 제거
* feat: 매칭을 시작하는 API, 중단하는 API, 잡혔는지 Short 폴링하는 API 작성
* test: 테스트 코드 작성!
* chore: 의존성 수정, 및 곧 대규모 삭제 예정
* chore: Swagger 재설정
* chore: lint 적용
* delete: 컨트롤러 spec.ts 삭제
* ci: 의존성 설치 수정
* delete: 외부에 생긴 package-lock 제거
* chore: 의존성 수정 및 설치
* delete: 타입 오류로 인한 서버 재시작 문제로 삭제..
* chore: event 클래스 수정
* chore: redis 비밀번호 제거
* refactor: redis에서 profile 삭제가 아닌 nickname 삭제 로직을 수정
* chore: auth에서 JWT 관련된 부분을 env 변수로 수정
* chore: 서비스 코드 수정에 따른 테스트 코드 수정
* [GWL-137] Workout API 수정, 테스트 코드 작성 및 Swagger 수정 (#147)
* chore: format 적용
* chore: format 적용
* refactor: UseGuards 적용, Swagger 수정
* refactor: UseGuards 적용, Swagger 수정
* refactor: find name에서 findAll로 수정
* chore: Swagger schema를 위한 example 코드 작성
* chore: Admin 상대 경로로 작성
* chore: Profile 상대 경로로 작성
* test: findAllWorkouts 메서드 테스트 코드 작성
* [GWL-142] 운동 시작 3,2,1 타이머 뷰컨트롤러 구현하기 (#148)
* feat: 타이머 VC 생성
* feat: 로직 viewController에서 ViewModel로 이동
* style: workoutSetting -> WorkoutEnvironmentSetUp coordinator로 이름 수정
* docs: Entity 주석 추가
* move: 폴더구조 이동
* docs: 코드 주석 변경
* feat: initTime추가
* refector: Init시점에서 시간을 받아서 타이머를 직접 만들 수 있게 수정
* style: 필요없는 코드 삭제
* style: 변수 명 변경
* docs: 주석 수정
* feat: BeforeWorkoutStartTimer Usecase로 분리
* feat: UseCase VIewModel 연결 및 timerfinish될 때 ViewModel input subject 추가
* style: 피드백 반영
* chore: 포메팅 적용
* style: 변수 명 수정
* [GWL-150] Keychain 모듈 작성 (#154)
* feat: keychain save, load
* docs: 주석
* feat: 삭제기능
* test: Keychain Mock생성 및 테스트
* fix: test코드 미작동
* chore: XCTAssertNil 활용
* [GWL-146] 운동기록화면 Custom Calendar 비즈니스 로직 구현 (#149)
* chore: pull하고 Formatter 빌드
* add: RecordCalendarViewModel
* feat: 현재 연,월에 해당하는 모든 일,요일 가져오기
* feat: 현재 일,요일 커스텀캘린더에 적용
* feat: 캘린더에서 선택된 인덱스 날짜 기록 불러오기
* feat: 요일 선택 시 레이블 변경
* fix: 캘린더 눌렀을 때, stream 전달 한번밖에 안되던 현상 해결
* fix: CustomCalendar 색칠된 Cell Reuse되는 현상 개선
Cell이 Reuse될 때 초기화되지 않아서 선택되지 않은 Cell들 도 색칠되는 현상 개선
* chore: naviagtionBar Hidden
* feat: 시작하자마자 캘린더에 오늘날짜 select 처리
* chore: 쓸데없는 로직 제거
* chore: 뷰관련 이벤트 main스레드에서 동작
* chore: code convention 관련 수정
* fix: 초기캘린더에서 다른날짜 클릭 시, 현재날짜 색상안없어지는 현상 제거
* refactor: 피드백 적용
에러관련 로직 리팩토링
* rename: viewModelError rename
* chore: 불필요한 함수 제거
* fix: 셀을 천천히 드래그하면 셀이 선택되지 않는 현상 개선
* chore: 불필요한 return제거
* [GWL-123] feat: 서버 room 관련 기능 구현 (#152)
* feat: 서버 room 관련 기능 구현
* fix: 타입 추가
* chore: @Injectable()제거
* [GWL-13] HealthKit 연동 - 데이터 파싱, bind(to:) 수정, entitlements 설정 (#161)
* feat: HealthKit 포함한 Entitlements 추가
- 기존에 Sign In with Apple이 들어있지 않아 같이 추가했습니다.
* feat: HealthKit을 사용하는 HealthRepository 추가
* feat: HealthRepositoryRepresentable을 준수하도록 구현
* feat: CombineCocoa bind(to:) Error타입 추가
* test: bind error 지원 테스트코드 추가
* feat: WorkoutSessionUseCase 임시 구현
- 아직 통신할 API가 만들어지지 않아 튜플타입으로 구현해둔 상태입니다.
* fix: HealthKit 데이터 파싱 문제 수정
- 기존 query를 중지하고, 저장하는 코드 추가
- updateHandler 추가
* fix: 2초마다 HealthKit 데이터를 가져오도록 수정
* style: combineLatest 코드 여러 줄로 나눔
* chore: Repository failable initializer를 initializer로 수정
* add: WorkoutScene 의존성 흐름 추가
* feat: HealthKit으로 받아온 데이터를 UI에 렌더링
* delete: Remove whitespaces
* [GWL-151] 웹소캣 AuthGuard 구현 -> 검증 verify 메서드 구현 (#160)
* delete: events-jwt 가드 삭제
* chore: jwt 토큰 여부 검사를 위한 imports
* feat: client에 검증에 필요한 변수 추가
* feat: 소켓 http 업그레이드를 보낼 때, 서버는 토큰 여부를 검사하고, 토큰을 통해 검증한다.
* [GWL-10]운동 세션화면 스톱워치 설정하기 (UseCase로 구현 완료, 테스트코드 작성) (#153)
* feat: Timer구현
* chore: 오타 수정
* feat: ci에러나는 부분 수정
* test: 타이머 테스트 코드 수정
* [GWL-156] 애플로그인 버튼 및 비즈니스 로직 구현 (#163)
* chore: LoginFeature모듈 생성
* add: LoginViewController,ViewModel
* feat: LoginViewController-UI구성 및 애플로그인버튼 생성
* add: LoginFeature 구조
* feat: LoginViewModel 바인딩
* add: dependency추가
* feat: authorizationRepository
* feat: AuthorizeUseCase 작성
* chore: Keychaining에 discardableResult
* feat: keychain에 저장하는 로직
* feat: 받아올 토큰 데이터타입 String
* feat: 서버에 보낼 토큰 데이터타입 String
* chore: formatting
* delete: entitlements
* refactor: OSLog->Custom Log
* fix: CI에러-stencil수정
* Revert "delete: entitlements"
This reverts commit 4fd33a1.
* refactor: input/outpu
* chore: Repository Log 에러 전체 커버
* chore: 피드백적용
* [GWL-158] redis 연결, redis 룸에 참가, 떠나기 ,redis pub/sub을 이용해서 브로드캐스트 (#172)
* feat: redis 연결, redis 룸, pub/sub 구현
* chore: format 적용
* fix: 수정
* feat: client.to().emit() 구현
* feat: 종료 이벤트 추가
* chore: 코드 정리
* [GWL-155] RecordFeture coordinating 화면 연결 (#167)
* chore: 오타 수정
* docs: 코드 주석 수정
* docs: 주석 수정
* chore: formatting 적용
* rename: 피드백 반영
* [GWL-164] Keychain 싱글톤 변경 (#169)
* feat: keychain 싱글톤으로 변경
* chore: formatting
* [GWL-156] 애플로그인 버튼 및 비즈니스 로직 구현 (#171)
* chore: swiftformat 적용
* chore: tryMap 적용
* chore: error case 삭제
---------
Co-authored-by: SeungHyun Hong <whi7ehyun@gmail.com>
* [GWL-166] Workouts API에 icon 이미지 컬럼 추가, Swagger 수정 (#179)
* refactor: workouts entity에 icon string 컬럼 추가
* chore: swagger example 수정
* test: 데이터 변경에 따른 목데이터 수정
* [GWL-162] Trinet 소켓 Providable 추가 + 테스트 코드 추가 (#177)
* add: WebSocketTaskProtocol 추가
- WebSocketTask의 모든 사용을 방지하고, 오로지 send, receive만 처리할 수 있도록 추상화했습니다.
* add: URLSessionWebSocketProtocol 추가
- URLSession에서 사용하는 WebSocketTask 메서드를 하나의 프로토콜로 추상화했습니다.
- Mocking하기 위함입니다.
* feat: TNSocketProvider 구현
* feat: WebSocketFrame 추가 및 send에 래핑
* add: SocketURL xcconfig 코드 추가
* add: Add comments
* feat: 테스트 샘플 코드 추가
* delete: 쓰지 않는 import문 삭제
* test: MockWebSocketSession 테스트 코드 추가
* chore: WebSocketFrame event 값 수정
- workout_session으로 변경 (서버 api 변경)
* [GWL-180] Trinet Interceptor 구현 (#183)
* feat: Trinet Interceptoor 구현
* feat: statusCode Valid하는 코드 변경
* delete: trinet + keychain 합친 shared 파일 삭제
* feat: InterCeptor TestCode 작성
* feat: 버그 수정
* docs: 주석 수정
* delete: 쓰지 않는 Test코드 삭제
* test: 타이머 테스트 코드 삭제
* [GWL-174] Matches API nickname -> publicId로 수정 (#181)
* chore: swagger 문서 수정
* refactor: nickname -> publicId로 수정
* test: nickname -> publicId가 바뀜에 따라 코드 변경
* [GWL-138] Record API 수정 및 Swagger 수정 (#182)
* chore: entity에서 안쓰는 의존성 제거
* refactor: apple 가이드에 따른 사용자와 관련된 모든 데이터가 null 값일 수 있기에 엔티티에 nullable true 추가
* refactor: 승현님 요청에 따른, recordId에서 id로 변경
* refactor: response에 id 제거
* [GWL-173] [Feat]: uuid -> publicId, 매칭 후 매칭되었는지 Redis Room 확인, workout_session 이벤트 생성해서 해당 이벤트로 전달받으면 룸에 브로드캐스트 하기 (#185)
* chore: uuid -> publicId, gateway 정리
* feat: checkMatching
* feat: workout_session 이벤트 생성,참여한 방 브로드캐스트 해보기
* chore: format 적용
* feat: wemit, data에 roomId 있는지 검사
* chore: spec 삭제
* chore: service 코드 수정
* [GWL-187] identity token 검증 후, 회원가입 여부 판별, 첫 로그인시 redirect url response (#191)
* feat: 토큰 검증, 토큰 검증 실패 시 exception 추가
* feat: appleSignIn 기능 구현
* fix: wetriWebSocketServer 로직 수정
* chore: apple login swagger 작성
* chore: format 적용
* fix: swagger 수정
* chore: 수정
* chore: spec 삭제
* [GWL-192] fix: record table에 workoutId 추가, accessToken, refreshToken 만료, 변조 exception 처리 (#193)
* fix: record table에 workoutId 추가
* chore: token 만료, 변조 -> exception 처리
* [GWL-131] image 업로드를 위한 API 구현, GreenEye 적용 (#194)
* chore: profiles.entity.ts에 profileImage 컬럼 추가
* add: images 파일 생성 및 뼈대 생성
* chore: 파일 업로드를 위한 multer와 aws-sdk 의존성 추가
* chore: 쓰로틀링 모듈 의존성 추가
* feat: 여러개의 파일 업로드에서 파일의 확장명과 파일의 크기를 검증하는 커스텀 파이프 클래스 구현
* chore: 스웨거 반환 설정
* chore: 커스텀 pip에서의 interface와 사진 크기에 대한, 매직넘버 생성
* chore: app 모듈에, Config 모듈 글로벌 적용
* feat: 이미지 전송 컨트롤러 구현
* feat: NCP Object Storage에 접근해 사진을 업로드하는 기능 구현
uuid로 이미지 명을 정하며, 리턴시에는 CDN 주소를 리턴한다.
* delete: 모듈에서 쓰로틀링 제거 -> 리버스 프록시 때문 -> 클라우드 딴에서 막아야한다.
* chore: jwt verify 에러 헨들링
* chore: jwt verify 에러 헨들링
* chore: greenEye 상수 업데이트
* feat: greenEye 적용, 실제로 잘 돌아감을 확인했습니다.
* chore: UseGuard 추가 사용자는 엑세스 토큰이 유효할 때만 이미지 업로드 API를 사용할 수 있다.
* chore: auth service { 누락 적용
* chore: format 적용
* chore: lint 적용
* fix: UseGuard 모듈 의존성 imports 추가 (#195)
* [GWL-168] 온보딩 화면 UI 구현 (#178)
* [feat] Onboarding Coordinating 추가
* feat: Onboarding Project 생성
* feat: useCase생성
* feat: Onboarding USecase 및 Repository 구현
* fix: 접근 제어자 변경
* move: 파일 구조 재정리 (domain, Presentation 레이어 등으로 분리하였음)
* feat: VIewModel and UseCase 바인딩
* feat: ViewModel VIewController 바인딩
* fix: repository Json 받아오는 버그 수정
* delete: 쓰지 않는 Import문 삭제
* style: 피드백 반영
* feat: 피드백 적용
- publisher operator tryMap -> Map으로 변경
- 변수 명 변경
* rename: 매직넘버 Constants로 이동
* style: 강한 참조 클로저 버그 수정
feat: Formatting 수정
* [GWL-189] TNKeychainInterceptor Shaerd 모듈 생성 (#196)
* feat: Shared 생성
* feat: 공통 Interceptor 생성
* fix: header addValue가 아닌 SetValue로 버그 수정
* move: MagicNumber관련된 Enum 생성
* feat: 자동으로 Refresh될 수 있는 Interceptor 구현
* feat: KeyChain 삭제 구현
* rename: 변수명 수정
* rename: CamelCase로 변수명 변경
* rename: CamelCase로 변수명 변경
* formatting: Formatting 적용
* rename: 로그 범위 및, 필요 없는 로그 삭제
* [GWL-186] 운동 날짜별 조회 API 명세에 따라 수정 (#190)
* feat: RecordsRepository 생성
* refactor: 기록목록 Request시 Date->DTO로 Request
* feat: mock 환경 추가
* feat: DTO to Domain
* feat: Time 표시형식 Pretty
* feat: 시작시간 끝시간 길이로 인해 넘어가는 화면 수정
* chore: 피드백 적용
* fix: try에 do-catch 적용
* chore: tryMap -> CompactMap 간소화
* [GWL-184] Socket과 HealthKit 연결, CombineCocoa와 Log 수정 (#197)
* add: 소켓으로 통신할 WorkoutRealTimeModel 추가
* add: WorkoutHealth 모델 프로퍼티 수정 (API와 맞춤)
* add: Add WorkoutSocketRepositoryRepresentable
* add: Add WorkoutSocketRepository
* feat: WorkoutSocketRepository가 자신의 Representable를 준수
* add: WorkoutSessionUseCaseDependency 추가
- date 뿐 만 아니라 roomID로 받아야하므로 dependency 구조체를 할당해서 주입받도록 구현했습니다.
* rename: Rename WorkoutHealth to WorkoutDataForm
* delete: WorkoutCoordinator 제거
* add: WorkoutHealthForm 추가
- 자신의 기록 데이터를 처리하기 위한 모델 추가
* delete: 임시 state case 제거
* refactor: 의존성을 외부에서 주입받도록 수정
* feat: HealthKit으로부터 받은 데이터를 모델링하는 작업 구현
* rename: WorkoutSessionUseCase가 갖는 repository명 수정
- repository -> healthRepository로 명명
* add: Add socketRepository in WorkoutSessionUseCase
socketRepository에 WebSocketMockSession을 넣어주기 위해 public initializer를 별도로 추가했습니다.
* chore: sendMyWorkout(with:) Output타입을 Void로 수정
운동 정보 전달에 실패했으면 Failure타입으로 넘어가므로 Bool타입보다 Void타입이 적합하다고 생각함
* feat: socket으로 데이터를 전달하는 Flow 추가
* feat: usecase에서 참여자 운동 정보 실시간 수신 연동
* chore: 운동 정보 데이터를 Double에서 Int로 전부 변경
* feat: WorkoutSessionViewModel과 WorkoutSessionUseCase를 연결
- WorkoutSessionUseCaseRepresentable에서 ViewModel에게 필요한 프로퍼티를 설정헀습니다.
- 기존에 임시로 사용했던 데이터타입을 전부 변경했습니다.
* feat: Workout Session timer 설정
* add: SessionPeerType 추가
* feat: 사용자 정보를 받아다가 CollectionViewCell에 업데이트
* chore: Cell의 초기 상태를 설정해주는 함수를 한 번만 호출되도록 설정
* chore: fatalError 제거
* refactor: WorkoutSession Scene마다 Dependency 설정
- 각 Dependency에 필요한 데이터를 Coordinator의 파라미터로 받도록 설정했습니다.
* fix: workoutSession을 보여줄 때 임시 dependency 설정
* fix: 음수 시간대가 나오는 현상 수정
* add: Logger category 추가
* add: withUnretained Operator 추가
* fix: continuation bug 수정
- Timer publisher에서 너무나도 긴 스트림을 유지하고있었기에, 2초가 부족해서 생긴 문제인 것으로 판명되었습니다.
- Timer Publisher로 발행된 이벤트는 subject에게 바로 전달되도록 수정했고, subject로 하여금 다시금 새로운 스트림을 생성하도록 수정했습니다.
* fix: continuation fatal error 버그 수정
* chore: 0으로 나누는 문제 수정
* delete: 쓰지 않는 변수 삭제
* chore: health data publisher의 Failure를 Never로 설정
HealthKit 데이터를 요청할 때 오류가 생기는 경우 Subject의 생명주기가 끝나므로
다시 성공적으로 데이터를 요청보냈다고한들 서버나 사용자에게 운동 데이터를 전달할 수 없었습니다.
Failure타입을 Error 대신 Never로 설정하고, Output타입을 Optional로 지정하면서
오류일 때 `nil`을 내보내는 방법을 사용했습니다.
이렇게 하면 Subject의 생명주기를 deinitialize가 될 때까지 가져갈 수 있고,
이벤트를 받는 DownStream에서 compactMap을 사용해 무시할 수 있습니다.
* delete: Remove RecordFeatureTests
- 타이머 테스트와 그 밖에 죽은 코드를 제거했습니다.
* [GWL-198] Combine Extension, CombineCocoa 분리, tuist build ci 추가 (#199)
* add: CombineExtension
* add: 각 모듈마다 CombineExtension import
* ci: tuist build 추가
* [GWL-176] Profile API를 구현한다. (#204)
* chore: ipa 배포 링크 추가
* feat: profile dto 생성
* feat: exception 구현
* chore: post 엔티디 수정
* feat: profile Rest API 구현, Create 부분은 제거
* chore: createUser 메서드에 profileImage 추가
* chore: getProfile 수정 및 구현
* chore: swagger API response 부분 수정
* chore: profiles 컨트롤러 수정
* [GWL-85] 서버 구조에 맞게 웹 소켓 연동 (#200)
* test: 서버 환경과 비슷하게 소켓 테스트 수정
- 테스트를 실환경으로 수정하면서 오류가 발생하는 것을 고칠 예정입니다.
* feat: test 코드에 맞게 MockWebSocketSession 기능 변경
* add: Socket 모델 debug 로그 추가
* fix: 헬스 데이터로 snapshot을 적용하는 코드가 누락된 점 수정
* style: 거리 데이터와 타이머 초 UI 수정
- 거리 데이터는 소수점 세 자리까지 보여줍니다.
- 타이머는 00분 00초로 시작합니다.
* delete: 불필요한 주석 제거
* [GWL-203] Splash 화면 구성 + 토큰 재발급 여부에 따라 화면 플로우 결정 (#216)
* fix: feature template 오타 수정
* add: Logo image 추가
* add: SplashScene 추가
* feat: 토큰 만료 여부에 따라 화면 전환 흐름 구현
* add: Logo image 추가
* add: viewDidLoad Input flow 추가
* feat: ViewModel initializer에 coordinator 세팅
* feat: Add use case in SplashViewModel
* feat: Implement SplashRepository and attach in SplashUseCase
* feat: Splash UseCase에서 토큰 재발급 및 저장 로직 구현
* add: 토큰 재발급 후 성공여부를 Coordinator에게 전달
* feat: viewModel과 coordinator 로직 간 흐름 연결
SplashCoordinating의 메서드를 호출해서 다른 화면으로 변경해야함을 알리고
이를 구현한 SplashCoordinator가 자신을 끝내고, delegate로 부모Coordinator에게 데이터를 넘김으로써
AppCoordinator에서 화면 로직 흐름을 갖을 수 있도록 구현했습니다.
* add: deinit log 추가
* feat: 로고 노출 시간 2초로 설정
* fix: viewDidLoad 이벤트 전달하지 않은 버그 수정
* feat: login으로 넘어갈 수 있도록 AppCoordinator 수정
* move: SplashFeature를 생성하여 전부 코드 이동
* rename: tokenExpired to `hasTokenExpired`
* delete: Remove Log in SplashUseCase
* docs: reissueToken DocC 추가
* chore: SwiftFormat 적용
* [GWL-215] pagination 구현, post 게시물 생성, pagination으로 게시물 가져오기 (#222)
* feat: createPost 함수 구현
* feat: paginate 구현, getPost 구현, 스웨거 작성
* chore: format 적용
---------
Co-authored-by: jeong-yong-shin <jeong-yong-shin@Sjy-MacBookProM1.local>
* [GWL-202] 캘린더 데이터 캐싱, 캐시 모듈 생성 (#206)
* feat: CacheRepository 생성
* feat: Cacher모듈 생성
* refactor: Repository에 있는 코드 Cacher로 옮기기
* feat: CacheManager 기능 정의
fetch와 set
* delete: 불필요한 Repository제거
* feat: Repository에서 cache에 데이터 요청하는로직 작성
* feat: 날짜별 기록 호출에 Cache적용
* fix: 오늘날짜도 캐시된데이터가 불러지는 현상 개선
* fix: 오늘 캐시한 데이터는 다음날 최신화 안되는 현상 개선
* refactor: error Depth 줄이기
* docs: Cacher 모듈에 주석 추가
* chore: formatter 적용
* [GWL-201] 프로필 화면 구현 (#224)
* add: ProfileFeature 추가
* feat: ProfileCoordinator과 ProfileScene 연결
* feat: navigation item 우측에 설정 버튼 추가
- 이중 네비게이션 제거를 위해 tab bar flow를 보여줄 때 NavigationBar을 hidden처리하였습니다.
* feat: GWProfileButton 구현
* add: profile 상단 UI 추가
* add: 검색 결과 없음 이미지 추가
* add: 내 게시물 section label 추가
* chore: 디자인 변경으로 인한 프로필 이미지 UI 수정
* refactor: ProfileHeaderView를 두고 UICollectionViewController로 전환
게시글이 많이 존재할 때 상단에 있는 사용자 프로필과 닉네임도 같이 스크롤되어 올라가야합니다.
이를 구현하고자 ReusableView로 변경했습니다.
* add: Diffable datasource 추가
* feat: Profile Post Cell 추가
* add: Input 모델 추가
setting 버튼 클릭 이벤트와 viewWillAppear 이벤트를 추가
* feat: 설정 창으로 이동하는 흐름 추가
* add: 클린 아키텍처 구조 생성 및 폴더링
* feat: ProfileRepository 프로필 fetching
* feat: Mock data로 닉네임과 프로필 fetching 흐름 구현
* feat: Profile entity 추가 및 repository에서 변환
* chore: header size 크기를 대략 300으로 설정
* add: Repository에 Interceptor 추가
* chore: viewWillAppear에서 viewDidLoad로 수정
* [GWL-223] feat: Post api 마무리 하기 (#226)
* feat: 특정 게시글 가져오기
* feat: 유저의 게시글 가져오기, 나의 게시글 가져오기 구현
* feat: 게시물 수정
* 게시글 삭제
* chore: format 적용
---------
Co-authored-by: jeong-yong-shin <jeong-yong-shin@Sjy-MacBookProM1.local>
* [GWL-217] 회원가입(1) UI 구현 (#227)
* build: SignUp모듈 생성
* feat: 회원가입화면(1) UI 구성
* feat: CustomButtonConfiguration 디자인시스템에 추가
* chore: Scenedelegate 정리
* [GWL-228] profile api 수정, 애플 로그인 응답 수정 (#234)
* fix: profile api 수정
* fix: profile dto 삭제
* feat: user 삭제 기능 구현
* fix: sign in response dto 수정
* chore: format 적용
* fix: updateProfile await 추가
* fix: whiteList: ture 적용, dto에 정의되지 않은 프로퍼티 무시
---------
Co-authored-by: jeong-yong-shin <jeong-yong-shin@Sjy-MacBookProM1.local>
* [GWL-236] RecordList 다크모드 개선 (#237)
* feat: 다크모드 대응
* chore: goReocrd 버튼 높이 설정
* fix: 캘린더 스와이프시 배경 적용
* chore: 캘린더 셀 색상 통일
* chore: SceneDelegate원상복구
* [GWL-218] 회원가입(2) UI 구성 (#230)
* add: SignUpProfileViewController
* add: nickNameBoxView
* add: NickNameCheckerView
* fix: 틀리면 BoxView색상변경
* chore: label내용 변경
* add: SignUpContainerViewController
* chore: SceneDelegate 변경코드 원상복구
* chore: TextColor primaryText
* chore: backGroundColor 적용
* feat: resignFirstResponder()적용
* chore: 오토레이아웃 매직넘버 -> 상수
* chore: SceneDelegate원상복구
* chore: frame super함수 변경
* [GWL-221] 칼만 필터 구현 (#225)
* feat: KalmanFilter UseCase생성
* Move: Matrix 위치 변경
* add: KalmanUseCase 파일 생성
* feat: kalmanUseCase 및 ViewModel ViewController 연결
* add: Domain Entity 파일 분리
* feat: 칼만 필터 상수값 수정
* feat: 오차 수정
* docs: 주석 수정
* docs: 디버그를 위한 로그 삭제
* feat: 피드백 반영
* style: 변수 명 변경
* [GWL-231] 회원가입 ContainerViewController 구현 (#239)
* feat: ContainerViewController에 GenderBirthView추가
* feat: ContainerViewController에 ProfileView추가
* feat: signUpGenderBirthView->signUpProfileView로 이동 구현
* chore: scenedelegate 원상복구
* feat: PageViewController 적용
* [GWL-175] NCP를 활용한 자동 배포 테스트 (#214)
* ci: 배포 환경 변경을 위한 CD 파일 수정
* ci: 배포 환경 변경을 위한 CD 파일 수정 DEV
* ci: DEV로 이름 변경
* ci: release CD 파일 작성
* [GWL-232] 회원가입 성별, 생년월일 비즈니스 로직 작성 (#246)
* chore: 폴더링 개선
* feat: viewModel Input-Output 구성
* feat: ViewController bind 구성
* feat: Container에 바인드할 요소 작성
* chore: 테스트용 접근제어자 수정 및 버튼 enabled설정
* feat: 조건 만족 시, PageViewController 좌우 스크롤 가능
* feat: 다음버튼을 눌렀을 때, pageVC 이동 및 pageControl 변경
* chore: flatMap -> tryMap 구조 단순화
* chore: swiftFormat 적용
* [GWL-241] fix: paginate response metadata 수정 (#242)
* fix: paginate response metadata 수정
* fix: swagger, response
* fix: postUrl description
---------
Co-authored-by: jeong-yong-shin <jeong-yong-shin@Sjy-MacBookProM1.local>
* [GWL-212] Workouts API 테스트 코드 작성 및 리팩토링 (#248)
* feat: workouts에 3000, 3100 번 커스텀 에러 생성
* chore: response dto에서 Schema Swagger 삭제 및 수정
* test: workouts의 테스트 코드 작성, 만약, 오류가 발생했을때 에러를 잘 처리하는지의 테스트 코드를 작성했습니다.
* chore: format 적용
* chore: 절대 경로에서 상대 경로로 변경
* chore: 절대 경로에서 상대 경로로 변경
* chore: 절대 경로에서 상대 경로로 변경
* test: workouts controller 테스트 코드 작성
* refactor: workout entity에 @isnotempty 문장 추가
* test: findOne 목 추가
* test: entity 테스트 코드 작성
* test: response dto 테스트 코드 작성
* [GWL-201] Empty State View + 게시물 가져오기 Mock Data 테스트, 페이지네이션 (#240)
* add: PostsEmptyStateView 추가
* add: Empty State View를 초기 상태로 보이도록 설정
* add: PostsRequestDTO 추가
* add: ProfileEndPoint.fetchPosts의 연관값 설정
* add: PostsResponstDTO, 그에 맞는 mock json 추가
* feat: fetchPosts in ProfileRepository
* add: Profile Feature 모듈에 keymanager 의존성 추가
* chore: Profile API 변경에 따라 코드 수정
* add: fetchPosts pagination 재설정 파라미터 추가
* add: UseCase에 fetchPosts(refresh:) 추가
새로운 데이터 또는 기존의 데이터에서 더 데이터를 요청하고 싶을 때 사용할 수 있도록 구현했습니다.
* refactor: Layout 세팅 코드를 확장 파일로 분리
* add: Post mock json 데이터 파싱
* feat: 게시글 불러올 때 cell 업데이트 코드 추가
* feat: pagination 이벤트 플로우 추가
* fix: 아이템 존재할 때 EmptyView가 삭제되도록 수정
* add: pagination 호출 제약 설정
- scroll될 때마다 계속 이벤트가 호출되는 것을 방지하기 위해 isLoading이라는 제약 불리언값을 설정했습니다.
ViewController에서 설정한 이유는, 데이터를 받아왔음을 알 수 있는 곳이기 때문입니다.
UseCase와 ViewModel을 고려했으나, 리턴하는 Publisher가 비동기로 동작되다보니
isLoading값을 false로 처리하고 데이터를 전달했을 때, 사용자가 스크롤해서 다시 데이터를 fetching할 수 있는
오류를 범하게 됩니다.
* refactor: Pagination 로직 수정
- repository에서 관리하던 nextID를 usecase로 이동시켰습니다.
- nextID를 usecase로 관리하게 되면서 metadata를 알아야할 필요가 있어 DTO를 그대로 UseCase에게 넘기도록 구현했습니다.
- ViewController가 이제 요청을 보낼 때 자신의 Item에서 제일 낮은 id값을 전달하며 데이터를 요청합니다.
- UseCase가 파라미터로 들어온 아이템의 id값을 확인하고, 딕셔너리에서 이미 해당 id로 요청보낸 이력이 있다면 무시합니다.
* chore: GetPosts mock data 수정
* refactor: 페이지네이션을 위해 작성된 로직 중 중복된 구조를 함수로 분리
* fix: profile 게시물 셀이 범위를 벗어나는 증상 수정
* chore: ProfileRepository를 struct로 변경
* feat: pull to refresh 기능 추가
* add: [weak self] 추가
* rename: Rename MetaData to PagingMetaData
* chore: Mock JSON postURL값을 실제 이미지 데이터로 변경
* [GWL-247] [Feat]: paginate 함수에 find (FindManyOptions) -> queryBuilder로 바꾸기 (#250)
* fix: paginate queryBuilder 사용
* fix: profile service 변경한 paginate 적용
* fix: post swagger 작성
* chore: format 적용
* chore: src 제거
---------
Co-authored-by: jeong-yong-shin <jeong-yong-shin@Sjy-MacBookProM1.local>
* [GWL-245] UserInformationManager 구현 (#249)
* feat: UserDefaults manager 구현
* feat: UserInformationManager 구현
* docs: 주석 수정
* feat: cache를 사용하지 않고 UserDefaults로 사용하는 것으로 코드 변경
* chore: 코드 순서 변경
* chore: lint적용
* delete: test 폴더삭제
* delete: 안쓰는 import문 삭제
* docs: 주석 추가
* style: SwiftFormat 적용
s
* [GWL-207] 이미지 업로드 API 테스트 코드 작성 및 리팩토링 (#251)
* feat: 이미지 DTO 작성 및 스웨거 작성
* chore: lint 적용
* feat: 예외처리 기능 추가, 오브젝트 스토리에 전송 실패시 발생하는 오류, 그린아이 실패시 발생하는 오류
* chore: .을 이용한 파싱시, 첫번째를 반환 하는 에러 발생
* test: 이미지 서비스 테스트 코드 작성
* chore: exception 추가
* test: Express.Multer.File 처럼 까다로운 타입들 타입 단언 사용
* test: validateFilespipe 테스트 코드 작성
* chore: format 적용
* [FIX] Image API 커스텀 인터셉터 제거 (#252)
* feat: 이미지 DTO 작성 및 스웨거 작성
* chore: lint 적용
* feat: 예외처리 기능 추가, 오브젝트 스토리에 전송 실패시 발생하는 오류, 그린아이 실패시 발생하는 오류
* chore: .을 이용한 파싱시, 첫번째를 반환 하는 에러 발생
* test: 이미지 서비스 테스트 코드 작성
* chore: exception 추가
* test: Express.Multer.File 처럼 까다로운 타입들 타입 단언 사용
* test: validateFilespipe 테스트 코드 작성
* chore: format 적용
* fix: 커스텀 FilesInterceptor 제거
* [GWL-219] 설정 화면 흐름 UI 구현 (#253)
* add: SettingsScene 추가
* add: SettingsCoordinating
* refactor: SettingCoordinating 제거 후 ProfileCoordinating으로 통합
* add: navigation title과 back button 설정
title을 크게 보이고, back button은 화살표만 보이도록 설정
* add: CollectionViewController로 변경
* feat: 설정창 Diffable DataSource 설정
* add: 선택 시 선택해제 애니메이션 추가
* add: profile 설정 탭을 누르는 이벤트를 viewModel에게 전달
* add: 프로필 설정 화면으로 이동하도록 coordinating 코드 세팅
* add: ProfileSettings Scene 추가
* move: Coordinator 폴더를 상위폴더로 이동
* chore: 프로필설정뷰 CollectionViewController로 변경
* add: UserProfileHeaderView 추가
* add: ProfileSettingsDataSource 로직 추가
* rename: ProfileSettingsHeaderView로 이름 변경
* chore: constraint anchor 수정
* chore: profile header view UI 변경
- background 제거
- imageView에 메인색 테두리 설정
* feat: ProfileSettingsViewController CompositionalLayout 설정
- ProfileSettingsHeaderView를 top Supplementary로 등록
* add: Profile Settings Diffable DataSource 설정
* add: ProfileSettings 셀 선택 시 자동 해제
* [GWL-229]운동 매칭 이후 운동 session에 관한 데이터 넘겨주는 기능 구현 (#238)
* refector: 레거시 수정
* feat: WorkoutFlow 수정
* Move: Peer타입 UseCase연결
* feat: StringDate를-> Date로 바꾸는 로직 생성
* feat: OneSecondsTimerUseCase연결
* feat: 화면넘어가는 로직 구성
* docs: 주석 수정
* docs: 주석 추가
* feat: WorkoutSessionComponents를 통한 화면 구성으로 변경
* style: 코드 줄간격 수정
* feat: UserInformation UseCase 생성
* feat: UserInformation UseCase 연결
* feat: 여러 사람이 들어왔을 때 여러 셀을 생성하도록 Dependency 수정
* style: 코드 formatting 수정
* feat: ImageURL을 통해 Cell image 삽입 코드 구현
* docs: 주석 수정
* docs: 주석 수정
* [GWL-244] 홈 뷰 UI 생성 (#258)
* feat: Home Preoject.swift 생성
* feat: Coorinator생성
* feat: HomeCoordinator 구현
* feat: Home CollectionView구현
* feat: 프로필 피드 카드 셀 상단부 구현
* Style: 매직 넘버 수정
* feat: headerView 실제 테스트
* feat: Cell 생성
* docs: 주석 수정
* docs: 주석 수정
* style: formatting 수정
* [GWL-213] posts 테스트 코드 작성 및 리팩토링 (#256)
* test: posts.service.spec.ts 작성
* test: posts.controller.spec 작성
* chore: format 적용
---------
Co-authored-by: jeong-yong-shin <jeong-yong-shin@Sjy-MacBookProM1.local>
* [GWL-255] LoginCoordinator 구현 (#259)
* feat: Coordinator
* feta: LoginCoordinator
* add: InitialUser Entity
* feat: FinishDelegate설정
* feat: API명세에 따라 response별 파싱객체 변경
* feat: LoginFeature Mock환경 추가
* add: LoginFeature Resources에 Mock json 추가
* fix: Identity토큰 Decoding방식 변경
* chore: SceneDelegate 복구
* fix: record entity 수정 mapCapture, gps 추가 (#266)
Co-authored-by: jeong-yong-shin <jeong-yong-shin@Sjy-MacBookProM1.local>
* [GWL-262] HomeView ContentImages 넘기는 것 구현 (#263)
* style: 변수 명 오타 수정
* feat: ImageCell 생성 및 Image를 위한 CollectionView 생성
* feat: Update로직 생성
* delete: 안쓰는 파일 삭제
* delete: 안쓰는 코드 삭제
* style: 접근 제어자 수정
* [GWL-211] Matches API 테스트 코드 작성 및 리팩토링 (#270)
* chore: matches/random
* chore: create-match.dto 테스트 코드 작성
* test: random-match.dto 테스트 코드 작성
* chore: format 적용
* refactor: 레디스 expired 추가
* test: 서비스 코드에 expired 추가
* test: 올바르지 못한 코드 제거
* chore: matches 스웨거 작성
* chore: expired 타임 조정
* [GWL-233] 회원가입 프로필 이미지, 닉네임 비즈니스로직 작성, Form-Data 로직 작성 (#264)
* feat: NickName정규식 검사
* add: SignUpProfileViewModel
* chore: viewModel에 Usecase추가
SingUpProfileViewModel에 nicknamecheckUseCase
* feat: 닉네임 조건 판별 기능"
* fix: cancelButton 클릭 시 닉네임사용할 수 없음이 안뜨는 현상 개선
* chore: 앨범 접근권한 추가
* feat: 프로필이미지 버튼 클릭 시, 앨범 접근 기능
* chore: 쓰레드처리
* fix: GWProfileButton 클릭 안되는 현상 개선
* feat: 앨범으로 받아온 이미지로 이미지버튼 이미지 교체 성공
* feat: 카메라로 촬영해서 프로필이미지 선택기능 추가
* feat: CombineLatest를 활용한 완료버튼 활성화 구현
* feat: CompletionButton Binding
* add: UseCase
* chore: 이미지 데이터 준비
* feat: form-data Endpoint정의
* feat: ImageFormRepository: form-data통신
* feat: imageData를 form-data요청
* chore: completeButtonTap sink 간소화
* add: coordinator
* feat: Coordinator
* add: 로그인에서 받아올 InitialUser 추가
* chore: 로그인으로부터 받아올 정보 Coordinator로 받기
* chore: SignUpFeature -> LoginFeature 의존성 제거
* feat: formData완성
* feat: formData완성
* docs: 주석제거
* feat: SignUpCoordinator 구현
* feat: 회원가입 과정동안의 데이터를 합쳐서 보내는 ViewModel 로직 작성
* feat: 회원가입 비즈니스로직, 레포지토리 작성
* chore: ViewModel과 Usecase, Repository 연결
* feat: SignUp Mock 환경 구축
* chore: Lint 원상복구
…1 parent 7c7b730 commit 83d94b1Copy full SHA for 83d94b1
File tree
Expand file treeCollapse file tree
2 files changed
+16
-0
lines changedFilter options
- iOS/Projects/Features/Home
- Sources/Data
- Tests
Expand file treeCollapse file tree
2 files changed
+16
-0
lines changediOS/Projects/Features/Home/Sources/Data/HomeRepository.swift
Copy file name to clipboard+9Lines changed: 9 additions & 0 deletions
Original file line number | Diff line number | Diff line change | |
---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + |
iOS/Projects/Features/Home/Tests/HomeFeatureTests.swift
Copy file name to clipboard+7Lines changed: 7 additions & 0 deletions
Original file line number | Diff line number | Diff line change | |
---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + |
0 commit comments