Conversation
Walkthrough코드베이스 전반에서 Changes
Sequence Diagram(s)sequenceDiagram
participant UI as ViewModel / UI
participant UseCase as UseCase
participant Repo as Repository
participant API as Remote API
participant DTO as DTO/Response
UI->>UseCase: execute(workspace: "AGENCY")
UseCase->>Repo: getProfile(workspace: "AGENCY")
Repo->>API: GET /profile?workspace=AGENCY
API->>DTO: 응답 (GetProfileResponseDTO 포함, workspace)
DTO-->>API: DTO
API-->>Repo: 매핑 -> User(workspace: ...)
Repo-->>UseCase: User
UseCase-->>UI: User 결과
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes
Possibly related PRs
Suggested reviewers
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 4
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
SampoomManagement/Features/User/Data/Remote/API/UserAPI.swift (1)
19-80: workspace 문자열 인코딩 누락으로 요청이 실패할 수 있습니다.workspace 값은 사용자 입력이나 서버 응답으로 내려오는 자유 문자열이라 공백, 한글,
&등 특수문자를 포함할 수 있습니다. 현재처럼 값을 그대로 엔드포인트 문자열에 삽입하면URL(string:)단계에서 nil이 떨어지거나 잘못된 쿼리로 전송되어 호출이 실패합니다. role 기반일 때는 enum 값이라 안전했지만, workspace로 회귀하면서 위험이 현실화됩니다. 최소한 URL 허용 문자 집합으로 percent-encoding 하거나, Alamofire가 인코딩하도록parameters를 사용해야 합니다. 아래 예시는getProfile이지만 같은 패턴이 쓰인 다른 메서드에도 동일하게 적용해 주세요.- return try await networkManager.request( - endpoint: "user/profile?workspace=\(workspace)", + let encodedWorkspace = workspace.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? workspace + return try await networkManager.request( + endpoint: "user/profile?workspace=\(encodedWorkspace)", method: .get, parameters: nil, responseType: GetProfileResponseDTO.self )
🧹 Nitpick comments (3)
SampoomManagement/Features/User/Domain/UseCase/EditEmployeeUseCase.swift (1)
17-18: 매개변수 변경이 일관되게 적용됨
role에서workspace로의 매개변수 이름 변경이 repository 호출과 일관되게 적용되었습니다. 다만 제공된 코드 스니펫(EditEmployeeViewModel.swift)을 보면 호출 시workspace: "AGENCY"가 하드코딩되어 있습니다. 사용자의 실제 workspace 값을 동적으로 전달하는 것이 더 적절할 수 있습니다.SampoomManagement/Features/User/UI/EmployeeListViewModel.swift (1)
90-95: 하드코딩된 workspace 값을 사용자 정보에서 가져오는 것을 권장
workspace: "AGENCY"가 하드코딩되어 있습니다. AI 요약에 따르면 User 모델에 workspace 속성이 추가되었으므로, 82-87번 줄에서 이미 조회한user객체의 workspace 값을 사용하는 것이 더 유연하고 정확합니다.다음과 같이 수정을 고려해보세요:
let result = try await getEmployeeUseCase.execute( - workspace: "AGENCY", + workspace: user.workspace, organizationId: user.agencyId, page: page, size: 20 )SampoomManagement/Features/User/Domain/UseCase/UpdateEmployeeStatusUseCase.swift (1)
17-18: 매개변수 변경이 일관되게 적용됨
role에서workspace로의 매개변수 이름 변경이 repository 호출과 일관되게 적용되었습니다. 코드 스니펫(UpdateEmployeeStatusViewModel.swift 79번 줄)을 보면 호출 시workspace: "AGENCY"가 하드코딩되어 있으니, 실제 사용자의 workspace 값을 동적으로 전달하는 것을 고려해보세요.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (33)
SampoomManagement.xcodeproj/project.pbxproj(4 hunks)SampoomManagement/Core/Network/TokenRefreshService.swift(1 hunks)SampoomManagement/Features/Auth/Data/Local/Preferences/AuthPreferences.swift(6 hunks)SampoomManagement/Features/Auth/Data/Mappers/AuthMappers.swift(1 hunks)SampoomManagement/Features/Auth/Data/Remote/API/AuthAPI.swift(3 hunks)SampoomManagement/Features/Auth/Data/Remote/DTO/LoginRequestDTO.swift(1 hunks)SampoomManagement/Features/Auth/Data/Remote/DTO/SignupRequestDTO.swift(1 hunks)SampoomManagement/Features/Auth/Data/Repository/AuthRepositoryImpl.swift(3 hunks)SampoomManagement/Features/Auth/Domain/Repository/AuthRepository.swift(1 hunks)SampoomManagement/Features/Auth/Domain/UseCase/SignUpUseCase.swift(1 hunks)SampoomManagement/Features/Auth/UI/LoginViewModel.swift(1 hunks)SampoomManagement/Features/Auth/UI/SignUpUiState.swift(5 hunks)SampoomManagement/Features/Auth/UI/SignUpViewModel.swift(2 hunks)SampoomManagement/Features/Dashboard/UI/DashboardViewModel.swift(1 hunks)SampoomManagement/Features/User/Data/Mappers/UserMappers.swift(5 hunks)SampoomManagement/Features/User/Data/Remote/API/UserAPI.swift(2 hunks)SampoomManagement/Features/User/Data/Remote/DTO/EditEmployeeResponseDTO.swift(1 hunks)SampoomManagement/Features/User/Data/Remote/DTO/EmployeeDTO.swift(1 hunks)SampoomManagement/Features/User/Data/Remote/DTO/GetProfileResponseDTO.swift(1 hunks)SampoomManagement/Features/User/Data/Remote/DTO/UpdateEmployeeStatusResponseDTO.swift(1 hunks)SampoomManagement/Features/User/Data/Repository/UserRepositoryImpl.swift(8 hunks)SampoomManagement/Features/User/Domain/Models/Employee.swift(1 hunks)SampoomManagement/Features/User/Domain/Models/User.swift(1 hunks)SampoomManagement/Features/User/Domain/Repository/UserRepository.swift(1 hunks)SampoomManagement/Features/User/Domain/UseCase/EditEmployeeUseCase.swift(1 hunks)SampoomManagement/Features/User/Domain/UseCase/GetEmployeeCountUseCase.swift(1 hunks)SampoomManagement/Features/User/Domain/UseCase/GetEmployeeUseCase.swift(1 hunks)SampoomManagement/Features/User/Domain/UseCase/GetProfileUseCase.swift(1 hunks)SampoomManagement/Features/User/Domain/UseCase/UpdateEmployeeStatusUseCase.swift(1 hunks)SampoomManagement/Features/User/UI/EditEmployeeViewModel.swift(2 hunks)SampoomManagement/Features/User/UI/EmployeeListViewModel.swift(1 hunks)SampoomManagement/Features/User/UI/UpdateEmployeeStatusViewModel.swift(2 hunks)SampoomManagement/Features/User/UI/UpdateProfileViewModel.swift(1 hunks)
🧰 Additional context used
🧬 Code graph analysis (18)
SampoomManagement/Features/Auth/UI/LoginViewModel.swift (1)
SampoomManagement/Features/User/Domain/UseCase/GetProfileUseCase.swift (1)
execute(17-19)
SampoomManagement/Features/User/Domain/UseCase/UpdateEmployeeStatusUseCase.swift (5)
SampoomManagement/Features/User/Domain/UseCase/EditEmployeeUseCase.swift (1)
execute(17-19)SampoomManagement/Features/User/Domain/UseCase/GetEmployeeUseCase.swift (1)
execute(17-19)SampoomManagement/Features/User/Data/Remote/API/UserAPI.swift (1)
updateEmployeeStatus(71-84)SampoomManagement/Features/User/Data/Repository/UserRepositoryImpl.swift (1)
updateEmployeeStatus(136-149)SampoomManagement/Features/User/UI/UpdateEmployeeStatusViewModel.swift (1)
updateEmployeeStatus(53-97)
SampoomManagement/Features/User/Domain/UseCase/EditEmployeeUseCase.swift (3)
SampoomManagement/Features/User/Data/Remote/API/UserAPI.swift (1)
editEmployee(55-68)SampoomManagement/Features/User/Data/Repository/UserRepositoryImpl.swift (1)
editEmployee(107-134)SampoomManagement/Features/User/UI/EditEmployeeViewModel.swift (1)
editEmployee(46-90)
SampoomManagement/Features/User/Data/Remote/API/UserAPI.swift (3)
SampoomManagement/Features/User/Data/Repository/UserRepositoryImpl.swift (4)
getProfile(23-59)getEmployeeList(97-105)editEmployee(107-134)updateEmployeeStatus(136-149)SampoomManagement/Features/User/UI/EditEmployeeViewModel.swift (1)
editEmployee(46-90)SampoomManagement/Features/User/UI/UpdateEmployeeStatusViewModel.swift (1)
updateEmployeeStatus(53-97)
SampoomManagement/Features/Dashboard/UI/DashboardViewModel.swift (2)
SampoomManagement/Features/User/Domain/UseCase/GetEmployeeCountUseCase.swift (1)
execute(17-19)SampoomManagement/Features/User/Domain/UseCase/GetStoredUserUseCase.swift (1)
execute(17-19)
SampoomManagement/Features/User/Domain/Repository/UserRepository.swift (5)
SampoomManagement/Features/User/Data/Remote/API/UserAPI.swift (5)
getProfile(19-26)updateProfile(29-42)getEmployeeList(45-52)editEmployee(55-68)updateEmployeeStatus(71-84)SampoomManagement/Features/User/Data/Repository/UserRepositoryImpl.swift (6)
getProfile(23-59)updateProfile(61-95)getEmployeeList(97-105)editEmployee(107-134)updateEmployeeStatus(136-149)getEmployeeCount(151-157)SampoomManagement/Features/User/UI/UpdateProfileViewModel.swift (1)
updateProfile(46-89)SampoomManagement/Features/User/UI/EditEmployeeViewModel.swift (1)
editEmployee(46-90)SampoomManagement/Features/User/UI/UpdateEmployeeStatusViewModel.swift (1)
updateEmployeeStatus(53-97)
SampoomManagement/Features/User/Domain/UseCase/GetProfileUseCase.swift (7)
SampoomManagement/Features/Auth/Domain/UseCase/SignUpUseCase.swift (1)
execute(17-33)SampoomManagement/Features/User/Domain/UseCase/EditEmployeeUseCase.swift (1)
execute(17-19)SampoomManagement/Features/User/Domain/UseCase/GetEmployeeCountUseCase.swift (1)
execute(17-19)SampoomManagement/Features/User/Domain/UseCase/GetEmployeeUseCase.swift (1)
execute(17-19)SampoomManagement/Features/User/Domain/UseCase/UpdateEmployeeStatusUseCase.swift (1)
execute(17-19)SampoomManagement/Features/User/Data/Remote/API/UserAPI.swift (1)
getProfile(19-26)SampoomManagement/Features/User/Data/Repository/UserRepositoryImpl.swift (1)
getProfile(23-59)
SampoomManagement/Features/User/Domain/UseCase/GetEmployeeUseCase.swift (4)
SampoomManagement/Features/User/Domain/UseCase/EditEmployeeUseCase.swift (1)
execute(17-19)SampoomManagement/Features/User/Domain/UseCase/GetEmployeeCountUseCase.swift (1)
execute(17-19)SampoomManagement/Features/User/Data/Remote/API/UserAPI.swift (1)
getEmployeeList(45-52)SampoomManagement/Features/User/Data/Repository/UserRepositoryImpl.swift (1)
getEmployeeList(97-105)
SampoomManagement/Features/User/Domain/UseCase/GetEmployeeCountUseCase.swift (2)
SampoomManagement/Features/User/Domain/UseCase/GetEmployeeUseCase.swift (1)
execute(17-19)SampoomManagement/Features/User/Data/Repository/UserRepositoryImpl.swift (1)
getEmployeeCount(151-157)
SampoomManagement/Features/Auth/UI/SignUpViewModel.swift (2)
SampoomManagement/Features/Auth/Domain/UseCase/SignUpUseCase.swift (1)
execute(17-33)SampoomManagement/Features/User/Domain/UseCase/GetProfileUseCase.swift (1)
execute(17-19)
SampoomManagement/Features/User/Data/Mappers/UserMappers.swift (2)
SampoomManagement/Core/Network/TokenRefreshService.swift (1)
refreshToken(17-69)SampoomManagement/Features/Auth/Data/Repository/AuthRepositoryImpl.swift (1)
refreshToken(82-122)
SampoomManagement/Features/Auth/Data/Mappers/AuthMappers.swift (2)
SampoomManagement/Core/Network/TokenRefreshService.swift (1)
refreshToken(17-69)SampoomManagement/Features/Auth/Data/Repository/AuthRepositoryImpl.swift (1)
refreshToken(82-122)
SampoomManagement/Features/Auth/Data/Local/Preferences/AuthPreferences.swift (3)
SampoomManagement/Features/Auth/Data/Local/Preferences/KeychainManager.swift (3)
save(24-43)delete(73-85)get(45-71)SampoomManagement/Core/Network/TokenRefreshService.swift (1)
refreshToken(17-69)SampoomManagement/Features/Auth/Data/Repository/AuthRepositoryImpl.swift (1)
refreshToken(82-122)
SampoomManagement/Features/User/UI/UpdateEmployeeStatusViewModel.swift (1)
SampoomManagement/Features/User/Domain/UseCase/UpdateEmployeeStatusUseCase.swift (1)
execute(17-19)
SampoomManagement/Features/Auth/Domain/UseCase/SignUpUseCase.swift (1)
SampoomManagement/Features/Auth/Data/Repository/AuthRepositoryImpl.swift (1)
signUp(20-50)
SampoomManagement/Features/User/Data/Repository/UserRepositoryImpl.swift (4)
SampoomManagement/Features/User/Data/Remote/API/UserAPI.swift (4)
getProfile(19-26)getEmployeeList(45-52)editEmployee(55-68)updateEmployeeStatus(71-84)SampoomManagement/Features/Auth/Data/Repository/AuthRepositoryImpl.swift (1)
retry(153-174)SampoomManagement/Features/User/UI/EditEmployeeViewModel.swift (1)
editEmployee(46-90)SampoomManagement/Features/User/UI/UpdateEmployeeStatusViewModel.swift (1)
updateEmployeeStatus(53-97)
SampoomManagement/Features/User/UI/EditEmployeeViewModel.swift (1)
SampoomManagement/Features/User/Domain/UseCase/EditEmployeeUseCase.swift (1)
execute(17-19)
SampoomManagement/Features/User/Domain/Models/User.swift (2)
SampoomManagement/Core/Network/TokenRefreshService.swift (1)
refreshToken(17-69)SampoomManagement/Features/Auth/Data/Repository/AuthRepositoryImpl.swift (1)
refreshToken(82-122)
🔇 Additional comments (20)
SampoomManagement.xcodeproj/project.pbxproj (1)
287-287: 버전 증가가 적절합니다.프로젝트 버전(7→8) 및 마케팅 버전(1.0.6→1.0.7) 증가가 정상적으로 적용되었습니다.
Also applies to: 303-303, 322-322, 338-338
SampoomManagement/Features/Auth/Data/Repository/AuthRepositoryImpl.swift (2)
20-35: 파라미터 이름 변경이 일관되게 적용되었습니다.
role파라미터가workspace로 변경되었으며, API 호출에도 일관되게 반영되었습니다.
98-112: 토큰 갱신 시 workspace 필드가 올바르게 보존됩니다.기존 사용자의 workspace 정보가 토큰 갱신 후에도 유지되도록 구현되었습니다.
SampoomManagement/Features/Auth/UI/SignUpViewModel.swift (1)
73-109: 회원가입 흐름에서 workspace가 올바르게 전파됩니다.UI 상태에서 use case 호출까지 workspace 파라미터가 일관되게 사용되었습니다.
SampoomManagement/Core/Network/TokenRefreshService.swift (1)
51-65: 토큰 갱신 시 workspace 필드 보존이 적절합니다.업데이트된 User 객체 생성 시 workspace 필드가 올바르게 포함되었습니다.
SampoomManagement/Features/User/Domain/Models/Employee.swift (1)
10-25: Employee 모델에 workspace 필드가 추가되었습니다.새로운 workspace 필드가 적절한 위치에 추가되었으며, 기존 필드들은 변경되지 않았습니다.
SampoomManagement/Features/Auth/Data/Remote/DTO/LoginRequestDTO.swift (1)
10-14: DTO 필드명이 workspace로 변경되었습니다.LoginRequestDTO의 필드가
role에서workspace로 변경되어 API 계약이 업데이트되었습니다.SampoomManagement/Features/Auth/UI/LoginViewModel.swift (1)
37-64: 로그인 성공 후 프로필 조회 시 workspace 파라미터가 사용됩니다.GetProfileUseCase 호출이 workspace 파라미터를 사용하도록 업데이트되었습니다.
SampoomManagement/Features/User/Data/Remote/DTO/EmployeeDTO.swift (1)
10-24: EmployeeDTO에 workspace 필드가 추가되었습니다.새로운 workspace 필드가 추가되어 Employee 도메인 모델과 일치합니다.
SampoomManagement/Features/User/UI/UpdateProfileViewModel.swift (1)
55-69: Workspace 필드 전파 확인됨User 객체 생성 시
workspace필드를 올바르게 전달하고 있습니다. 다만 이 변경사항 역시 workspace를 추가하는 것이므로 PR 제목의 "롤백"과 모순됩니다.SampoomManagement/Features/Auth/Domain/UseCase/SignUpUseCase.swift (1)
17-33: 파라미터 이름 변경 확인됨
role에서workspace로 파라미터 이름이 변경되었으며, repository 호출도 일관되게 업데이트되었습니다. 구현은 올바르나 PR 제목의 "롤백"과는 반대 방향입니다.SampoomManagement/Features/Auth/Data/Remote/DTO/SignupRequestDTO.swift (1)
10-17: DTO 필드 변경 확인됨
role에서workspace로 필드명이 변경되었습니다. 구조적으로는 문제없으나, 이는 workspace 통합을 진행하는 것이지 롤백이 아닙니다.SampoomManagement/Features/User/UI/UpdateEmployeeStatusViewModel.swift (1)
62-77: Employee 객체 생성 시 workspace 전파 확인됨
currentEmployee.workspace값을 올바르게 전달하고 있습니다.SampoomManagement/Features/User/Data/Remote/DTO/GetProfileResponseDTO.swift (1)
10-21: Profile DTO에 workspace 필드 추가 확인됨GetProfileResponseDTO에
workspace필드가 추가되었습니다. 이는 로그인 후 프로필 조회를 통해 workspace 정보를 받아오는 것으로 보입니다.주목할 점:
role과workspace필드가 모두 존재합니다 (Line 14, 16)- 이는 AuthMappers.swift에서 로그인 직후 빈 문자열로 초기화된 workspace가 이후 프로필 조회를 통해 채워짐을 시사합니다
SampoomManagement/Features/Auth/Data/Mappers/AuthMappers.swift (1)
11-27: 프로필 조회 실패 시 오류 처리 강화 필요분석 결과, 프로필 조회 흐름은 정상적으로 작동합니다:
- 로그인 후
getProfileUseCase.execute()호출 → 서버에서workspace,name,UserRepositoryImpl.getProfile()내부에서 라인 56의preferences.saveUser(completeUser)로 병합된 사용자 정보 영구 저장따라서 정상 흐름에서는
workspace가 빈 문자열로 남지 않습니다.다만, 실제 문제는
getProfile()실패 시 오류 처리입니다:
- LoginViewModel 라인 55에서 프로필 조회 오류가 무시되고, 사용자는
workspace: "",name: "",email: ""상태로 남음- DashboardViewModel 라인 132의
workspace.isEmpty방어 로직이 이를 보완하려 하나, 근본적인 해결책 아님개선 필요 사항:
getProfileUseCase실패 시 명확한 오류 처리 또는 재시도 로직 추가- 사용자에게 프로필 조회 실패 알림
- 프로필 조회 없이 진행하지 않도록 흐름 제어
SampoomManagement/Features/Auth/Domain/Repository/AuthRepository.swift (1)
11-18: 프로토콜 시그니처 변경이 적절함
signUp메서드의 매개변수가role에서workspace로 일관되게 변경되었습니다. 이는 breaking change이지만 PR의 목적(Workspace, Role 통합 롤백)과 일치합니다.SampoomManagement/Features/User/Domain/UseCase/GetProfileUseCase.swift (1)
17-18: 매개변수 이름 변경 확인됨
role에서workspace로의 매개변수 변경이 repository 호출과 일관되게 적용되었습니다.SampoomManagement/Features/Auth/UI/SignUpUiState.swift (1)
10-136: UI State의 포괄적인 리팩토링 확인됨
role에서workspace로의 이름 변경이 struct의 모든 부분(속성 선언, 초기화, copy 메서드)에서 일관되게 적용되었습니다. 가입 시 기본값 "AGENCY"를 사용하는 것은 적절해 보입니다.SampoomManagement/Features/User/Domain/UseCase/GetEmployeeCountUseCase.swift (1)
17-18: 매개변수 이름 변경 확인됨
role에서workspace로의 매개변수 변경이 repository 호출과 일관되게 적용되었습니다.SampoomManagement/Features/User/Data/Remote/DTO/EditEmployeeResponseDTO.swift (1)
10-15: 백엔드 API 응답 필드명 변경 의도 확인 완료
role에서workspace로 변경한 것은 의도된 백엔드 API 계약 업데이트입니다.UpdateEmployeeStatusResponseDTO도 동일한 패턴(workspace만 포함, role 제외)을 따르고 있어 일관된 API 설계 변경으로 보입니다.현재 구현은 부분 응답(partial response)을 기존 직원 정보와 병합하는 방식으로 안전하게 처리하고 있습니다:
UserRepositoryImpl.swift라인 120: 병합 중role은 요청 파라미터에서 가져옴EditEmployeeViewModel.swift라인 59:currentEmployee.role보존- 데이터 손실 없음
코드가 백엔드 변경을 올바르게 처리하고 있으므로 특별한 조치는 불필요합니다.
SampoomManagement/Features/User/Data/Remote/DTO/UpdateEmployeeStatusResponseDTO.swift
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Actionable comments posted: 1
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (17)
SampoomManagement.xcodeproj/project.pbxproj(4 hunks)SampoomManagement/Core/Network/TokenRefreshService.swift(1 hunks)SampoomManagement/Features/Auth/Data/Local/Preferences/AuthPreferences.swift(6 hunks)SampoomManagement/Features/Auth/Data/Mappers/AuthMappers.swift(1 hunks)SampoomManagement/Features/Auth/Data/Repository/AuthRepositoryImpl.swift(3 hunks)SampoomManagement/Features/Auth/UI/AuthViewModel.swift(1 hunks)SampoomManagement/Features/User/Data/Mappers/UserMappers.swift(5 hunks)SampoomManagement/Features/User/Data/Remote/DTO/EditEmployeeResponseDTO.swift(0 hunks)SampoomManagement/Features/User/Data/Remote/DTO/EmployeeDTO.swift(1 hunks)SampoomManagement/Features/User/Data/Remote/DTO/GetProfileResponseDTO.swift(1 hunks)SampoomManagement/Features/User/Data/Remote/DTO/UpdateEmployeeStatusResponseDTO.swift(0 hunks)SampoomManagement/Features/User/Data/Repository/UserRepositoryImpl.swift(8 hunks)SampoomManagement/Features/User/Domain/Models/Employee.swift(1 hunks)SampoomManagement/Features/User/Domain/Models/User.swift(1 hunks)SampoomManagement/Features/User/UI/EditEmployeeViewModel.swift(2 hunks)SampoomManagement/Features/User/UI/UpdateEmployeeStatusViewModel.swift(2 hunks)SampoomManagement/Features/User/UI/UpdateProfileViewModel.swift(1 hunks)
💤 Files with no reviewable changes (2)
- SampoomManagement/Features/User/Data/Remote/DTO/UpdateEmployeeStatusResponseDTO.swift
- SampoomManagement/Features/User/Data/Remote/DTO/EditEmployeeResponseDTO.swift
🚧 Files skipped from review as they are similar to previous changes (6)
- SampoomManagement/Features/User/UI/UpdateProfileViewModel.swift
- SampoomManagement/Features/User/UI/EditEmployeeViewModel.swift
- SampoomManagement/Features/Auth/Data/Repository/AuthRepositoryImpl.swift
- SampoomManagement/Core/Network/TokenRefreshService.swift
- SampoomManagement/Features/User/UI/UpdateEmployeeStatusViewModel.swift
- SampoomManagement/Features/User/Data/Remote/DTO/GetProfileResponseDTO.swift
🧰 Additional context used
🧬 Code graph analysis (2)
SampoomManagement/Features/User/Data/Repository/UserRepositoryImpl.swift (4)
SampoomManagement/Features/User/Data/Remote/API/UserAPI.swift (4)
getProfile(19-26)getEmployeeList(45-52)editEmployee(55-68)updateEmployeeStatus(71-84)SampoomManagement/Features/Auth/Data/Repository/AuthRepositoryImpl.swift (1)
retry(152-173)SampoomManagement/Features/User/UI/EditEmployeeViewModel.swift (1)
editEmployee(46-89)SampoomManagement/Features/User/UI/UpdateEmployeeStatusViewModel.swift (1)
updateEmployeeStatus(53-96)
SampoomManagement/Features/Auth/Data/Local/Preferences/AuthPreferences.swift (1)
SampoomManagement/Features/Auth/Data/Local/Preferences/KeychainManager.swift (3)
save(24-43)delete(73-85)get(45-71)
🔇 Additional comments (18)
SampoomManagement.xcodeproj/project.pbxproj (2)
303-303: 검토 의견 재평가: 버전 기록이 실제와 다릅니다.검증 결과, 현재 PR은 MARKETING_VERSION을 1.0.7에서 1.0.8로 업그레이드하고 있습니다. 버전 1.0.7이 이미 존재하며 건너뛰지 않았으므로, 원래 검토 의견의 전제가 잘못되었습니다.
git 기록:
- 최신 커밋:
MARKETING_VERSION = 1.0.7→MARKETING_VERSION = 1.0.8(정상적인 순차 업그레이드)- 이전 상태: 버전 1.0.7 존재 확인
Likely an incorrect or invalid review comment.
287-287: 빌드 버전 8을 건너뛴 이유를 확인해 주세요.
CURRENT_PROJECT_VERSION이 7에서 9로 증가하고MARKETING_VERSION이 1.0.6에서 1.0.8로 증가하여 각각 버전 8과 1.0.7을 건너뛰고 있습니다. 롤백 커밋에서 버전을 이렇게 높이는 것이 의도적인지 확인이 필요합니다.SampoomManagement/Features/User/Domain/Models/Employee.swift (1)
15-15: 모델 변경이 올바르게 적용되었습니다.
workspace속성이 적절히 추가되었으며, 전체 코드베이스의 마이그레이션과 일관성 있게 통합되었습니다.SampoomManagement/Features/Auth/Data/Mappers/AuthMappers.swift (1)
20-20: 로그인 응답 매핑이 적절합니다.로그인 시점에는
workspace정보를 알 수 없으므로 빈 문자열을 사용하는 것이 적절합니다. 이후getProfile호출을 통해 실제 값으로 업데이트됩니다.SampoomManagement/Features/User/Data/Remote/DTO/EmployeeDTO.swift (1)
14-14: DTO 업데이트가 올바릅니다.API 응답 스키마 변경에 맞춰
workspace속성이 적절히 추가되었습니다.SampoomManagement/Features/User/Domain/Models/User.swift (1)
18-18: 도메인 모델 변경이 올바릅니다.
User모델에workspace속성이 적절히 추가되었으며, 아키텍처 전반의 변경사항과 일관성 있게 통합되었습니다.SampoomManagement/Features/User/Data/Mappers/UserMappers.swift (5)
20-20: 프로필 매핑이 올바릅니다.DTO에서
workspace값을 정확히 추출하여 도메인 모델로 전달하고 있습니다.
39-39: 빈 문자열 사용이 적절합니다.Repository 계층에서 실제 사용자의
workspace값으로 병합되므로(UserRepositoryImpl line 82 참조), 매퍼에서의 빈 문자열 기본값은 문제없습니다.
55-55: 응답 매핑이 적절합니다.Repository에서 기존 직원 정보와 병합 시 빈 문자열인 경우 기존 값을 사용하는 로직이 있으므로(UserRepositoryImpl line 119 참조), 이 구현이 올바릅니다.
75-75: 직원 DTO 매핑이 올바릅니다.DTO에서
workspace값을 정확히 추출하여 도메인 모델로 변환하고 있습니다.
95-95: 상태 업데이트 매핑이 올바릅니다.기존 직원의
workspace값을 보존하여 데이터 무결성을 유지하고 있습니다.SampoomManagement/Features/Auth/Data/Local/Preferences/AuthPreferences.swift (1)
21-21: Keychain 저장소 마이그레이션이 적절히 구현되었습니다.
workspace필드가 저장, 조회, 삭제 로직에 일관되게 추가되었으며, 기존 사용자 데이터(role만 있고 workspace가 없는 경우)를 위한 마이그레이션 처리도 적절합니다(line 86에서 빈 문자열 기본값 사용).기존 사용자가 로그인 후
workspace가 빈 문자열로 유지되는지, 아니면 이후getProfile호출을 통해 실제 값으로 채워지는지 확인이 필요합니다. 인증 플로우에서 로그인 또는 앱 시작 시 프로필 정보를 다시 가져오는지 검증해주세요.Also applies to: 37-37, 51-51, 86-86, 101-101, 149-149
SampoomManagement/Features/User/Data/Repository/UserRepositoryImpl.swift (6)
23-58: 프로필 조회 로직이 올바르게 업데이트되었습니다.
workspace파라미터가 일관되게 전달되며, 재시도 메커니즘을 통해 서버 지연을 적절히 처리하고 있습니다. 프로필 데이터와 토큰 정보를 병합하여 완전한 사용자 정보를 구성하는 로직도 정확합니다.
60-93: 프로필 업데이트 로직이 올바릅니다.입력 사용자의
workspace값이 적절히 보존되어 데이터 무결성이 유지됩니다(line 82).
95-103: 직원 목록 조회가 올바르게 업데이트되었습니다.
workspace파라미터가 API 호출에 일관되게 전달됩니다.
105-131: 직원 정보 수정 로직이 견고하게 구현되었습니다.Line 119의 빈 문자열 체크를 통해 응답에
workspace가 없는 경우 기존 값을 보존하는 방어적 프로그래밍이 적용되었습니다.
133-146: 직원 상태 업데이트가 올바르게 구현되었습니다.
workspace파라미터가 API 호출에 정확히 전달되며, 매퍼에서 기존 직원 정보를 사용하여 데이터 일관성을 유지합니다.
148-154: 직원 수 조회가 올바르게 업데이트되었습니다.
workspace파라미터가 API 호출에 일관되게 전달됩니다.
📝 Summary
Workspace, Role 통합 롤백
🙏 Question & PR point
📬 Reference
Summary by CodeRabbit
새로운 기능
개선사항
제거/변경
버전