Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[GWL-16] 운동 동료 선택 화면 UI 구현 #69

Merged
merged 13 commits into from
Nov 20, 2023

Conversation

MaraMincho
Copy link
Member

@MaraMincho MaraMincho commented Nov 20, 2023

Screenshots 📸

Name
Simulator.Screen.Recording.-.iPhone.15.Pro.-.2023-11-20.at.17.01.01.mp4



고민, 과정, 근거 💬

직접 PageController 구현

  • PageControll 위에 UIPageControl을 구현해야 했음
  • 실제 있는 컴포넌트 였지만 자꾸 에러가 발생해서 (움직이지 않았음)
  • 따로 ContentNavigatonController를 구현(delegate채택후 이에 따라 PageController가 움직이게 작성)
        public func navigationController(_: UINavigationController, didShow viewController: UIViewController, animated _: Bool) {
          if viewController == workoutSelectViewController {
            pageControl.makePage(index: 0)
          }
        }



PageController 수정

  • pageControl에 보이던 뷰들을 GWRoundShadowView에서, 그냥 UIView로 대체
  • 결정적으로 작은 pageControl은 그림자가 보이지 않음
  • GWRuondShadowView의 경우 ShadowPath를 정하는 코드가 내부에 있었는데, 이는 한번 작성하면 변하지 않도록 처음 코드 작성
  • 이에 따라서 autoLayout을 바꿔도 Shadow는 따라오지 않게 되었음



차후 DataSource와 같은 force unwrapping 제거 예정

image

  • 아래와 같이 일단 선언하고 로직 연결부분에서 제거 예정 (아마 따로 class로 관리 예정)



References 📋




Copy link

@MaraMincho MaraMincho added 📱 iOS iOS 파트 Issue, 또는 Pull Request 🌟 중간 🔨 구현 새로운 기능 또는 요청 labels Nov 20, 2023
Comment on lines 85 to 120
func makePage(index pageIndex: Int) {
if pageIndex >= pages.count {
return
}
deselectPage(at: currentPageIndex)
currentPageIndex = pageIndex
selectPage(at: currentPageIndex)
}

func makeNextPage() {
if currentPageIndex >= pages.count {
return
}
deselectPage(at: currentPageIndex)
currentPageIndex += 1
selectPage(at: currentPageIndex)

UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseInOut) { [weak self] in
guard let self else { return }
layoutIfNeeded()
}
}

func makePrev() {
if currentPageIndex >= pages.count {
return
}
deselectPage(at: currentPageIndex)
currentPageIndex -= 1
selectPage(at: currentPageIndex)

UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseInOut) { [weak self] in
guard let self else { return }
layoutIfNeeded()
}
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p3: make라는 이름이 직접적으로 와닿지는 않습니다. make라고 하면 무언가를 생성해서 내보내야할 것 같은데 그게 아니여서요.
이 부분은 더 고민해보셨으면 좋겠습니다. :)

Copy link
Member

@WhiteHyun WhiteHyun Nov 20, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p3: 그리고 공통으로 사용하는 DesignSystem이니만큼, PR에 변경점을 작성해주시는 게 좋을 것 같아요. 나중에 사용하게 될 때 자주 참고할 것 같아서요!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵 확인했습니다! 감사합니다!

Comment on lines 45 to 47
pages = (0 ..< countOfPage).enumerated().map { _, _ -> UIView in
return pageViewObject
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p3: enumerated를 해주는 이유가 있을까요? 단순히 파라미터 사용 없이 값만을 리턴하는 클로저라면, 다른 방법도 생각해보면 좋을 것 같습니다.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵, 놓쳤는데 짚어주셔서 감사합니다!

let collectionView = UICollectionView(frame: .zero, collectionViewLayout: makeCollectionViewLayout())
collectionView.register(WorkoutCardCell.self, forCellWithReuseIdentifier: WorkoutCardCell.identifier)
collectionView.register(WorkoutSelectTypeCell.self, forCellWithReuseIdentifier: WorkoutSelectTypeCell.identifier)
collectionView.backgroundColor = UIColor.clear
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p3: 간단하게 줄일 수 있을 것 같습니다.

Suggested change
collectionView.backgroundColor = UIColor.clear
collectionView.backgroundColor = .clear

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

감사합니다!

Copy link
Member

@JongPyoAhn JongPyoAhn left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다 다함님 :)

pearTypeSelectCollectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
}

func tempInitDataSource() {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3

함수이름이 명확했으면 좋겠습니다..!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수정하겠습니다!

Comment on lines +85 to +86
contentNavigationController.view.translatesAutoresizingMaskIntoConstraints = false
contentNavigationController.view.leadingAnchor.constraint(equalTo: safeArea.leadingAnchor).isActive = true
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3

NSLaoutConstraint를 사용하면 .isActive를 사용하지 않아도되서 편리하더라구요!
추천드립니다~

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저는 사실 NSLayoutConstraint를 좋아하지 않는데요, 이유는 가끔가다 Constraint를 저장해야할 때가 있기 때문입니다. 그 때는 그 프로퍼티만 따로 뺴서 지장하는 방식이 예쁘지 않더군요... 그래도 이번 기회에 고민해보겠습니다!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이유가 있으셨군요..!
저는 그런 경험을 못해봐서 이렇게 말씀드린거 같아요 ㅠㅠ
다함님 편하실대로 하시면 될거같습니다~!

@@ -39,21 +36,29 @@ public final class WorkoutEnvironmentSetupViewController: UIViewController {
}()

var dataSource: UICollectionViewDiffableDataSource<Int, UUID>!
var workoutCardCollectionView: UICollectionView!
var workoutTypesCollectionView: UICollectionView!
var workoutPaerTypesCollectionView: UICollectionView!
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2

사용되지 않는 프로퍼티 같습니다~

Suggested change
var workoutPaerTypesCollectionView: UICollectionView!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

사실 이 부분은, dataSource를 WorkoutEnvironmentSetupViewController에서 다루고 싶었습니다. 현재는 종속적인 VC 내부에서 dataSource를 init하지만, 차후 리팩토링을 위해 남겨두었습니다. 이부분을 주석을 작성하지 않아 혼란을 야기한 것 같습니다...!


configureDataSource()
}

func configureDataSource() {
dataSource = .init(collectionView: workoutCardCollectionView, cellProvider: { collectionView, indexPath, _ in
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: WorkoutCardCell.identifier, for: indexPath)
dataSource = .init(collectionView: workoutTypesCollectionView, cellProvider: { collectionView, indexPath, _ in
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2

위에 workoutTypesCollectionView를 전역으로 강제언래핑 하셨는데요!
여기서만 사용되는거같아서 bind()랑 전역을 지우고 이 함수 안에서만 선언하고 사용하시는건 어떠신가요~?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

확인했습니다!

setup()
}

var dataSource: UICollectionViewDiffableDataSource<Int, UUID>!
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2

여기도 강제언래핑으로 보여지는데요!
사용하신걸 확인해보니 아래처럼 선언해도 괜찮을것 같아요!

Suggested change
var dataSource: UICollectionViewDiffableDataSource<Int, UUID>!
var dataSource: UICollectionViewDiffableDataSource<Int, UUID>?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3

또한 셀이 2개밖에 없어서 DiffableDatasource를 사용하지 않아도 될것 같다는 의견입니다!

스프린트할 때, 리뷰어님들께서 재사용되는 셀이 없을때는 CollectionView나 TableView를 사용하지 않는게 좋을것 같다고 하셨던게 기억나네요.
오버엔지니어링처럼 보여서 그러신걸까요 ㅎㅎ.. 이유는 찾지 못한것같습니다

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

사실 CollectionView로 구현한 이유는, 다양한 환경을 고려해서 였습니다. 현재는 랜덤 매칭과 혼자 달리기 뿐이지만, 다양한 조건을 추가할 수 있다고 생각했습니다. 가령 클럽 멤버와 달리기나 친구와 달리기 그리고 동시에 시간에 맞춰 달리기 등 다양한 메뉴가 추가될 수 있다고 생각했습니다. 유연한 구조를 생각하다 보니, 재사용 관점에서의 diffable datasource는 그닥 구미가 당기지 않는 선택지 같네요...

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아닙니다!
재사용관점에서 Diffable Datasource는 제 생각에 가장 좋은 선택지 같아요!
제가 말씀드린건 그저 셀이 2개인데 CollectionView를 사용하는게 오버엔지니어링이 될 수 있겠다고 말씀드린건데요!
다함님께서 납득할만한 이유를 설명해주셔서 변경안하셔도 될것같아요 🤗

@MaraMincho MaraMincho merged commit 0e4957e into develop Nov 20, 2023
3 of 4 checks passed
@MaraMincho MaraMincho deleted the feature/iOS/GWL-16 branch November 20, 2023 14:43
WhiteHyun added a commit that referenced this pull request Dec 12, 2023
* [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]>
@wonholim wonholim added this to the WeTri v0.1 milestone Dec 27, 2023
MaraMincho pushed a commit that referenced this pull request Jan 16, 2024
[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함수 에러처리
MaraMincho added a commit that referenced this pull request Jan 16, 2024
* [축] 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수정

…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
📱 iOS iOS 파트 Issue, 또는 Pull Request 🔨 구현 새로운 기능 또는 요청
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

운동 동료 선택 대전 상대 검색 화면 UI 구현
4 participants