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