Skip to content

Commit

Permalink
[축] 0.2V 배포 [축] (#449)
Browse files Browse the repository at this point in the history
* [축] 0.1V 배포 [축] (#391)

* [GWL-3] Tuist 프로젝트 세팅 (#18)

* build: Tuist를 통한 WeTri App Project 생성

* build: SwiftLint, SwiftFormat 적용

---------

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

* 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 <[email protected]>

* [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 <[email protected]>

* 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 <[email protected]>

* bug: 오타 수정

* feat: TNProvider filtiering기능 추가

* chore: 원호님 피드백 적용 매칭 시간 150초로 수정

* feat: TNError추가 및 TNProvidable코드 추가

* style: TNProvidable statusCode 확인하는 매서드 이름 변경

---------

Co-authored-by: SeungHyun Hong <[email protected]>

* [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 4fd33a124071ab3c1017e246e6d74ccf17e1214b.

* 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 <[email protected]>

* [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 <[email protected]>

* [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 <[email protected]>

* [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 <[email protected]>

* [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 <[email protected]>

* [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 <[email protected]>

* [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 <[email protected]>

* [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 <[email protected]>

* [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 원상복구

* docs: UserBit - mappedUserID 주석 추가

* rename: UserBit -> NewUserInformation

* chore: CommonNetworkingKeyManager Tokens 사용

* chore: 사용하지않는 cancellable 지우기

* [GWL-267]  Trinet Multipart/form-Data 기능 추가 (#271)

* feat: Trinet모듈에 MultipartFormData 추가

* chore: 접근제어자 변경

* [GWL-254] 지도 업로드 구현 (#269)

* add: private 접근제어 설정

* feat: 위도 경도 범위를 구하는 LocationPathUseCase 추가

* rename: useCase to KalmanUseCase

* add: LocationPathUseCase in RouteMapViewModel

* refactor: RouteMapViewController 프로퍼티를 의존성 주입 방식으로 변경

* add: render(state:)메서드를 추가해서 transform 이후 sink에 주입

* feat: location을 이용해서 region 생성하는 흐름을 연결

* feat: 사용자가 지나온 거리를 Capture하여 Data로 변환하는 작업 처리

* chore: mapScreenshotData가 담당하는 두 가지 기능을 분리

- mapCaptureData에서 지도 캡처 데이터를 반환하는 기능으로만 사용
- requestCapture를 이용해서 지도를 이미지로 변환하는 요청을 담당하는 메서드를 만듦

* feat: SessionContainerViewController로 이미지 데이터의 흐름을 연결

* add: MapImageUploadUseCase

* add: MapImageUploadRepository 추가

* feat: image 업로드 기능 추가 with Trinet

* fix: HealthKit 순환참조 문제 수정

* feat: Multipart를 사용해서 이미지 업로드 기능 구현

Trinet에 MultipartFormData를 추가해서 구현했습니다.

* chore: LocationPathUseCase 로직 수정

* fix: remove code for swiftlint and swiftformat

* feat: WorkoutDataForm을 요청 모델로 변경

WorkoutDataForm을 요청모델로 변경하면서
기존의 Location 값과 helath data를 하나로 묶는 작업을 ViewModel에서 하게 되었습니다.

* [Fix] 매칭 API matched 리턴 문제  (#276)

* chore: expired 제거

* chore: matched false 리턴

* test: expired 수정

* fix: 15초를 더하는데 아닌 15분을 더하는 오류 수정 (#278)

* [GWL-280] 매칭 API의 자신을 표시하는 myPublicID 생성, events gateway 로깅 (#281)

* fix: 매칭이 잡혔을 때, 나를 특정할 수 있는 myPublicId 생성

* fix: 이벤트 클래스 로깅 추가

* test: 불필요한 테스트 코드 삭제

* [GWL-257] common service 에러 처리, 테스트 코드 작성, 리팩토링 (#272)

* chore: queryBuilder 에러 처리

* add: base-paginate-res.dto.ts 파일 추가

* test: test 환경 구축

* test: common.service.spec.ts 작성

* chore: format 적용

---------

Co-authored-by: jeong-yong-shin <[email protected]>

* [GWL-282] Json 직렬화 문제, 연결할 때, 소켓에 나머지 인원이 들어오지 못하는 문제 (#283)

* test: Json.stringify 제거

* fix: jsonMessage 부분 JSON.parse 수행

* fix: expired 제거 및 MATCHING_DELAY 적용

* fix: matchProfile 20초 후 삭제 적용

* fix: userMatch 삭제 적용

* [GWL-284] 앱 코디네이터 Splash, Login 흐름 연결 (#285)

* fix: circular dependency 수정

* add: Splash로 연결

* feat: Login Coordinator 실행 코드 추가

- showLoginFlow 내에서 LoginCoordinator 호출 함수 추가

* [GWL-254] (#286)

* fix: circular dependency 수정

* fix: 버튼이 두 번 눌려야 동작되는 버그 수정

withLatestFrom을 CombineLatest로 변경해서 해결

* fix: record 설정 안되는 버그 수정

* chore: AppCoordinator 기본 실행을 Splash로 수정

* refactor: MultipartFormData 불필요한 코드 정리

- 재정의되어있는 코드 제거
- mimeType을 배열로 입력받음
- makeBody를 갖고있는 프로퍼티로 만들 수 있도록 수정

* refactor: MultipartItem 추가

* [GWL-273] 소켓 연결 (#287)

* feat: 엑세스 토큰 저장

feat:

* feat: 매서드 버그 수정

* feat: 세션 잡히는거 구성...

* feat: 수정...

* bug: formatter 수정

* feat: Header에 AccessToken 삽입

* feat: 소켓 Json 에러 수정

* chore: style 설정

* fix: bug 수정

* fix: 토큰 수정

* [Fix] 소켓 연결시 token에러 핸들링이 안되는 문제, record에 gps 컬럼이 255자였던 건 관하여 (#291)

* fix: matchProfiles에서 expired 메서드를 사용해야 한다.

* fix: appleSignIn expired 메서드를 사용해야 한다.

* fix: jwt 오류가 발생했을 때, 소켓의 연결을 끊는다.

* fix: longtext로 교체

* [GWL-220] WeTri 임시 파일 제거, Trinet 폴더링 및 기반 파일 추가 (#293)

* remove: 불필요한 파일 제거

* move: Trinet Foldering

* refactor: GWResponse를 Trinet에서 관리하도록 수정

* chore: NullDTO를 Trinet의 EmptyModel로 대체

* remove: Trinet에서 Log 제거

* chore: trinet associatedtype 마크 수정

* fix: birthdate 값이 Date인걸 String으로 수정 (#294)

* fix: posts entity 수정, post response 변경 (#289)

Co-authored-by: jeong-yong-shin <[email protected]>

* [GWL-295] 배포서버와 개발서버 분리 (#296)

* chore: 모듈 생성시 사용하는 debug, release XCConfig 분리

* add: debug, release scheme 추가

* feat: make release 추가

* feat: Change Schemes when tuist generate about each mode

* [GWL-300] 운동 세션 화면 버그 수정 (#302)

* fix: Subscription이 추가로 발생되어 event가 두 번 이상 반복되는 버그 수정

* fix: pageViewController delegate로 pageControl 수정

* [GWL-268] 로그인 회원가입 연결 및 서버통신 (#297)

* fix: CircularDepedency 현상 개선

* chore: 중복 Mutipart제거

* docs: 주석 제거

* chore: MultiPart-Trinet 재결합

* feat: Trinet No Interceptor Upload

* rename: userBit -> newUserInformation

* rename: userBit-newUserInformation

* fix: SignUp넘어갈 때, mainThread 에러 수정

* fix: ImageForm데이터 전달 안되는 현상 개선 및 회원가입 완료 시 받아온 토큰값 저장하는 로직 작성

* chore: Lint 정상화

* fix: SignUpGenderBirth에서 SignUpProfile까지 성별벌스 데이터 이동안되는 현상 개선

* Login, SignUp, TabBar Coordinator 연결

* add: Auth모듈 추가

* add: Auth모듈에 Token Entity

* add: Auth모듈에 AuthProvider추가

* chore: Token접근제어자 수정

* feat: 로그인 완료 시, 분기처리

* fix: Encoder로 인해 액세스토큰이 키체인에 쌍따옴표가 붙어서 저장되는 현상 개선

* chore: lint 복구

* fix: merge conflict

* fix: form-Data 이미지 그린아이에서 튕기는 현상 개선 이유 : fileName

* chore: 피드백 반영

---------

Co-authored-by: SeungHyun Hong <[email protected]>

* [Fix] records 조회에서 workouts 이름이 누락되는 문제, 로그인시 엑세스 토큰을 받고, 리프래쉬 토큰을 받을 때, 타임아웃 이 걸리는 문제 (#314)

* fix: leftjoin 후, 운동 종류 name을 리턴하도록 수정

* fix: 엔티티 주석 제거

* chore: 커넥션 풀 사용

* fix: record 스웨거 수정

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

---------

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

* [GWL-303] 로고 추가된 로그인 화면 UI 작성 (#318)

* feat: Login 뷰 구성

* chore: SceneDelegate 복구

* feat: 개인정보처리방침 링크 추가

* chore: 중복로직 제거

* [GWL-304] 회원가입 화면 버튼 수정 (#319)

* fix: SignUpProfileViewController 버튼 크기 조절

* fix: SignUpGenderBirth 버튼 크기 조절

* chore: SceneDelegate 원상복구

* chore: ButtonConfiguration font 설정

* chore: ButtonConfigurationHandler 적용

* [GWL-305] 이미지 다운샘플링 적용 (#322)

* add: DownSampling Module

* feat: downsampling 기능

* feat: SignUpProfile에서 불러오는 이미지에 다운샘플링 적용

* rename: DownSampling -> Downsampling

* chore: SceneDelegate 롤백

* feat: UIImage로 타입캐스팅하지 않고 Data로 캐스팅하는 기능 추가

유의미한 결과로 타입캐스팅으로 인해 136MB까지 갑자기 메모리가 튀는 현상을 메모리가 튀지않고 32MB를 쭉 유지하도록 개선하였습니다. 해당 커밋은 나중에 누군가가 참고할 수 있도록 남겨두겠습니다.

* chore: Error파일 분리

* [GWL-299]지도 스크린샷 할 떄 PolyLine을 그리는 기능 추가 (#301)

* Auto stash before rebase of "origin/develop"

* Auto stash before rebase of "origin/develop"

* feat: 폴리라인을 그릴 수 있는 기능 추가

* chore: 임시 커밋

* feat: Polyline을 그리는 로직 생성

* bug: 폴리라인 데이터 버그 수정

* docs: 주석 수정

* feat: deprecated 된 UIGrapthicsImageRendrer삭제

* docs: 주석 수정

* delete: Image저장하는 코드 삭제

* delete: 안쓰는 accessToken code 삭제

* delete: 안쓰는 모듈 파일 삭제

* [GWL-307] 운동 요약 화면 내 버그 수정 (#317)

* fix: Repository deocde 모델 수정

- decoding 이슈 해결

* chore: WorkoutSummaryDTO 모델 수정

서버와 맞지 않는 모델을 수정하면서 발생한 오류를 고쳤습니다.

* add: WorkoutSummaryModel Entity 추가

* feat: DTO to Entity로 수정

* chore: jsonDecoder에 dateFormatter 설정

* fix: 운동 세션 시간초 보이지 않는 버그 수정

* feat: 결과 화면 내에 지도에 polyline 적용

* feat: 지도 데이터에 맞게 region 설정

* add: 기록된 날짜 형식을 디자인에 맞게 설정

* fix: 카운트다운 Date 파싱 안되는 문제 수정

* add: SessionFinishDelegate 추가

운동 요약화면에서 다시 기록 화면으로 넘어갈 때 부모 Coordinator에게 알리기 위함입니다.

* feat: 처음으로 버튼 클릭시 메인 화면으로 이동하는 로직 연결

* chore: CLLocation으로 변환하는 함수 추가

* add: 글쓰기 버튼 탭 시 alert 표시

showAlert의 타입을 Any로 바꾸어 표시할 수 있는 모든 타입을 반환하도록 수정했습니다.

* fix: dateFormat으로 형변환하는 과정을 Entity 생성 직전에 처리하도록 수정

* [GWL-298] 닉네임 중복 검사 api (#309)

* feat: 닉네임 중복 검사 api 추가

* fix: validateProfileNickname

---------

Co-authored-by: jeong-yong-shin <[email protected]>

* [Feat]: WorkoutEnvironmentViewController  popGestgure 버그 수정 (#321)

* chore: Appcoordinator초기 시작 지점 변경

* feat: scrollView를 활용하여 수정

* delete: TabBarCoordinator -> Splash Flow 시작 흐름 변경

* feat: UIScroll버그 수정

* style: 접근 제어자 수정

* [GWL-326] 회원가입 완료버튼 활성화 안되는 현상 개선 (#327)

* fix: 회원가입 완료버튼 활성화 안되는 현상 개선

* chore: 쓸데없는 코드 정리

* feat: 버그 수정 (#324)

* [GWL-308] 운동 세션 중 소켓 버그와 디자인 일부 수정 (#325)

* fix: SessionData를 WebSocketFrame으로 변경

* delete: test코드 삭제

* chore: MockWebSocketSession을 서버 응답에 맞게 수정

서버에 맞게 Mock을 수정하면서 동시에 테스트 코드도 수정했습니다.

* fix: id 대신 nickname을 Key값으로 하여 diffable dataSource 스냅샷 설정

* chore: 타이머 설정 기본값을 6초로 설정

- 6초로 설정하게 되면 사용자는 5초부터 보여지게 됩니다.

* add: 기록 요약 화면 중 단위 표시 추가

* fix: polyline 확대되어 보이는 문제 수정 (#337)

* [GWL-312] UserDefatuls를 통한 프로필 이미지 및, 닉네임 저장 하는 UseCase연결 (#328)

* feat: UseCase생성

* feat: UserDefaults UseCase연결 작업 생성

* feat: 회원가입 후 UserDefaults에 저장하는 로직 작성

* feat: Cancel API WorkoutID 추가하여 요청 (#330)

* [GWL-331] LocationData가 Polyline을 그릴 수 없을 만큼 데이터 갯수가 작을 때 FatalError가 발생하는 버그 수정 (#333)

* feat: 운동 기록 할 만큼 위치 값이 없을 때 초기값 지정

* docs: 주석 수정

* feat: 폴리라인 초기값 "광화문 -> 의미있는 장소" 로 수정

* fix: appleSignIn 응답 값에 따른 http code 설정 (#339)

Co-authored-by: jeong-yong-shin <[email protected]>

* [GWL-320] ResponseCode에 따른 이미지 재설정 얼럿 추가 (#338)

* feat: 사진업로드 Error코드 정의

* feat: 에러코드별 얼럿 추가

* feat: 프로필 이미지 설정 방법 선택 alert to actionSheet

* fix: 계속 error 얼럿이 발생하는 현상 개선

* chore: AppDelegate Keychian import 제거

* [GWL-334] 카운트다운 화면, WorkoutSession, WorkoutSummery 화면에서 TabBar 보이는 버그 수정 (#335)

* feat: 운동 기록중에 보이는 tapbar hidden 처리 완료

* feat: 순환참조 문제 해결

* feat: 순환 참조 문제 해결

* chore: UseGuard 적용 (#342)

* [GWL-340] 기록이 존재하지않을 때, 보여줘야하는 커스텀뷰가 안나타나는 현상 개선 (#341)

* fix: date가 존재하지 않을 때, 커스텀 뷰 안나타나는 현상 개선

* fix: workoutRecordsRepositoryEndpoint post -> get변경 후 쿼리 추가

* chore: Lint 되돌리기

* chore: 후행클로저로 수정

* chore: print() 제거

* [GWL-343] 가우시안 블러를 활용하여 Login background 화면 설정  (#344)

* feat: 가우시안 블러 적용

* feat: 운동 영상 백그라운드 추가

밋밋한 로그인 화면을 동적으로 보여주기 위해 AVFoundation을 이용하여 영상을 보여줬습니다.

* add: 로그인 화면에 맞는 로고 이미지 추가

* fix: 개인정보 처리방침 링크 잘못된 부분 수정

* chore: 영상이 실행될 수 있을 때 블러와 그라디언트를 적용하도록 수정

* delete: Login 약관 뷰 배경색 제거

* chore: 애플 로그인 버튼 색상을 하얀색으로 설정

* feat: 영상이 끝나갈 때 천천히 재생되도록 설정

* fix: 회원가입 진입 시 로그인 화면으로 넘어가는 버그 수정

* delete: Keychain 제거

---------

Co-authored-by: SeungHyun Hong <[email protected]>

* [GWL-346] Login KeyChain 오작동 개선, Gender버튼 높이 변경 (#347)

* chore: Keys -> CommonKey에 저장된 Key사용

* chore: Gender버튼 높이 조절

* fix: Keychain 작동불량 개선

* chore: 애니메이션 필요한 부분 animated true

* feat: 오타 수정 (#350)

* [GWL-351] 프로필 API 변경에 따른 코드 수정 + 로그아웃 기능 추가 (#352)

* fix: 프로필 API 잘못된 요청 수정

* feat: 로그아웃 터치 시 viewModel에게 이벤트 전달

* feat: Keychain에서 토큰을 삭제할 repository, usecase 구현

* add: Add UseCase in SettingsViewModel's initializer

* feat: 로그아웃 실패 시 alert 화면을 띄움

* feat: 로그아웃 시 로그인 화면으로 이동하는 흐름 구현

* feat: 로그아웃 버튼 탭 시 한 번 더 질의하도록 수정

* chore: PagingMetaData의 lastID 타입을 Int?로 수정

* [GWL-353] 프로필 설정 화면 시 사용자 정보 데이터 파싱 (#354)

* add: ProfileSettings Repository, UseCase 추가

* add: Profile entity에 birth 추가

* feat: UserDefaults로 사용자 정보 fetching 로직 구현

* feat: 프로필 설정 화면 진입 시 Profile 가져오는 로직 연결

* add: Implement showAlert to show error for user

* add: Add `configure(with:)` in ProfileSettingsHeaderView to update view

* add: profile settings function 추가

* feat: header 섹션일 때만 supplementary가 보이도록 설정

* feat: 데이터가 들어왔을 때 헤더 뷰 업데이트

* add: 셀 클릭 시 준비중이라는 alert화면 설정

* add: userInformationManager dependency 추가

* fix: TabBar 수정

- 홈 화면 제거
- tint color를 main03으로 설정

* feat: 6주차 ipa 파일 배포 (#358)

* 버그 수정 (#357)

* delete: path 제거

* chore: textView 폰트 접근성 수정

* feat: 랜덤매칭시 잘못 들어오는 String을 Regex를 통해 파싱하는 기능 추가

* Update BackEnd_CD_PROD.yml

* style: 매직넘버및 디자인에 안맞는 버튼 크기 수정

* feat: ActionSheet 취소 버튼 추가

* fix: 카메라로 프로필이미지 선택 안되는 현상 개선

* fix: ProductionServer Response에서 isFirstLogined 안내려오는 현상 개선

* delete: defaults data 삭제

* fix: 토큰 설정하지 않아 서버에러가 발생한 것 수정

---------

Co-authored-by: MaraMincho <[email protected]>
Co-authored-by: Vardy <[email protected]>
Co-authored-by: JongPyoAhn <[email protected]>

* [GWL-364] Production 배포 yml 수정! (#366)

* feat: 6주차 ipa 파일 배포 dev1

* feat: 배포 관련 버그 수정

* ci: 배포 관련 PROD 적용

* [GWL-359] 닉네임 관련 버그 픽스 (#363)

* fix: TextField 20글자 안넘도록 방어로직 작성

* fix: 닉네임 입력하기 전에 warning Label 나타나지 않도록 사용성 개선

* chore: SceneDelegate 원상복구

* [GWL-364] Production 배포 파일 수정 (#376)

* feat: 6주차 ipa 파일 배포 dev1

* feat: 배포 관련 버그 수정

* ci: 배포 관련 PROD 적용

* ci: 배포 관련 PROD 적용 병렬처리 삭제

* feat: html 제목 수정

* feat: isOptional()추가 (#379)

Co-authored-by: jeong-yong-shin <[email protected]>

* [GWL-367] 운동 요약 화면 - 심박수 UI 제거 (#368)

* delete: 심박수 UI 제거

* fix: 심박수를 제거하면서 UI가 전부 위로 올라가는 현상 수정

* add: Map Empty State 이미지 추가

* add: 운동 요약 화면 로그를 담당하기 위한 카테고리 추가

* add: location값 존재하지 않을 때 log 출력

* add: EmptyImageView를 MapView의 크기와 동일하게 설정

* add: 좌표 값이 5개 미만일 때 empty view가 보여지도록 설정

* delete: 건강 데이터 기본값 제거

* add: Empty State Label 추가

* add: mapView 높이 배율을 0.66 대신 0.5로 설정

* chore: 글로벌 예외처리에서 에러메세지가 스트링이 아닌 문제를 해결 (#382)

* fix: 오늘 날짜 이후로 선택되는 현상 개선 (#371)

* fix: 앨범에서 이미지 선택 시, 이미지피커가 사라지지 않는 문제 개선 (#372)

* [GWL-360] 프로필 사진을 선택하라고 알려주는 Warning 추가 (#370)

* rename: nicknamecheckerView -> checkerView

* feat: CheckerView 재사용을 위한 상속 NickNameCheckerView생성

* feat: 이미지 추가 확인하는 기능 추가

* chore: SceneDelegate 복구

* fix: 권한설정이 안됐을 때, 앱을 사용할 수 없는 문제 개선

* [GWL-374] 폴리라인이 그려지지 않던 버그 수정 (#377)

* feat: 칼만 필터 이전 값이 업데이트 되지 않던 버그 수정, mapCaptureDataSubject의 nil 을 넘김

* feat: location데이터가 없을 때, 넘어가지 않던 버그를 API변경을 통해 수정

* fix: URL을 URL?로 수정

---------

Co-authored-by: SeungHyun Hong <[email protected]>

* [GWL-365] 온보딩 화면 연결  (#373)

* feat: Demo추가

* feat: Demo앱과 연결

* feat: OnBoarding Demo삭제

기능 구현

* feat: signUp이후 OnboardingFlow 연결

* Update iOS/Projects/Features/Onboarding/Sources/Presentaion/ViweController/OnboardingViewController.swift

Co-authored-by: SeungHyun Hong <[email protected]>

* Update iOS/Workspace.swift

Co-authored-by: SeungHyun Hong <[email protected]>

* feat: ShowOnboardingFlow -> ShowSplashFlow로 변경

---------

Co-authored-by: SeungHyun Hong <[email protected]>

* [GWL-375] 운동 기록 리스트 fetching 안되는 버그 수정 (#384)

* chore: API 변경에 따라 records response 모델 수정

* chore: Change createdAt's type to Date in RecordResponseDTO

* chore: 모서리 둥글게 처리

* chore: 운동 기록 셀 위아래 제약조건 설정

* fix: 날짜 leading padding맞지 않는 버그 수정

* chore: cell padding 설정

* chore: Record mock json을 서버에 맞게 수정

* fix: 닉네임 중복시http code 202 (#386)

Co-authored-by: jeong-yong-shin <[email protected]>

* [GWL-383] UserDfeaults에 데이터를 저장하는 Fetcher를 생성 (#387)

* feat: splash에서 이미지데이터와, 닉네임 데이터를 다시 받아옴

* delete: 필요없는 import 제거

* feat: 스플래시 화면에서 프로필을 설정하는 UserDefaults로직 수정

* feat: 공통 모듈 생성

* delete: 필요없는 파일 삭제

* feat: class -> Struct로 코드 변경

* feat: 필요 없는 데이터 삭제

* feat: matchingDescriptionLabelQueue를 통해 Text를 넘기는 구조 생성 (#389)

* [GWL-306] 닉네임 중복검사 기능 추가 (#390)

* feat: 닉네임 중복검사 기능 추가

* chore: 테스트코드 제거

* chore: frame을그대로 넣기

* chore: duplicateTest함수 에러처리

* 0.1버전 배포 추가!~

* [GWL- 393 (HotFix)] 온보딩 화면 텍스트 희미한 문제 해결 (#394)

* feat: Main03 Color수정

* feat: Onboarding Background Color 수정

* feat: 다시 색 수정

* feat: 글자 색 수정

* bug: 버그 수정

* chore: 수정했던 파일 복구

* fix: 카메라로 사진올릴 때, 다운샘플링 안되는 현상 픽스 (#395)

* [GWL-396] 시간대 15시간 차이나는 버그 수정 (#397)

* fix: Date가 15시간 차이나는 버그 수정

* chore: km를 m로 수정

* chore: Timezone설정해서 올바른 시간대로 들어오도록 설정

---------

Co-authored-by: JongPyoAhn <[email protected]>
Co-authored-by: MaraMincho <[email protected]>
Co-authored-by: Vardy <[email protected]>
Co-authored-by: jongpyo Ahn <[email protected]>
Co-authored-by: 신정용 <[email protected]>
Co-authored-by: jeong-yong-shin <[email protected]>
Co-authored-by: sjy982 <[email protected]>

* Wetri 0.1.0 Version

[GWL-3] Tuist 프로젝트 세팅 (#18)

* build: Tuist를 통한 WeTri App Project 생성

* build: SwiftLint, SwiftFormat 적용

---------

Co-authored-by: JongPyoAhn <[email protected]>
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 <[email protected]>
[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 <[email protected]>
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수정

…
  • Loading branch information
8 people authored Jan 16, 2024
1 parent 7c7b730 commit 83d94b1
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 0 deletions.
9 changes: 9 additions & 0 deletions iOS/Projects/Features/Home/Sources/Data/HomeRepository.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
//
// HomeRepository.swift
// HomeFeature
//
// Created by MaraMincho on 12/7/23.
// Copyright © 2023 kr.codesquad.boostcamp8. All rights reserved.
//

import Foundation
7 changes: 7 additions & 0 deletions iOS/Projects/Features/Home/Tests/HomeFeatureTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import XCTest

final class HomeFeatureTests: XCTestCase {
func testAlwaysPassed() {
XCTAssertTrue(true)
}
}

0 comments on commit 83d94b1

Please sign in to comment.