Skip to content

[IDLE-000] 센터장은 공고 지원자를 확인할 수 있다. #49

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

Merged
merged 12 commits into from
Aug 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 12 additions & 6 deletions project/Projects/App/Sources/DI/Assembly/DomainAssembly.swift
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,12 @@ public struct DomainAssembly: Assembly {
}

container.register(CenterProfileUseCase.self) { resolver in
let repository = resolver.resolve(UserProfileRepository.self)!

return DefaultCenterProfileUseCase(repository: repository)
let userProfileRepository = resolver.resolve(UserProfileRepository.self)!
let userInfoLocalRepository = resolver.resolve(UserInfoLocalRepository.self)!
return DefaultCenterProfileUseCase(
userProfileRepository: userProfileRepository,
userInfoLocalRepository: userInfoLocalRepository
)
}

container.register(RecruitmentPostUseCase.self) { resolver in
Expand All @@ -46,9 +49,12 @@ public struct DomainAssembly: Assembly {
}

container.register(WorkerProfileUseCase.self) { resolver in
let repository = resolver.resolve(UserProfileRepository.self)!

return DefaultWorkerProfileUseCase(repository: repository)
let userProfileRepository = resolver.resolve(UserProfileRepository.self)!
let userInfoLocalRepository = resolver.resolve(UserInfoLocalRepository.self)!
return DefaultWorkerProfileUseCase(
userProfileRepository: userProfileRepository,
userInfoLocalRepository: userInfoLocalRepository
)
}

container.register(SettingScreenUseCase.self) { resolver in
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,10 @@ public class RecruitmentManagementCoordinator: RecruitmentManagementCoordinatabl

public func start() {
let coordinator = CenterRecruitmentPostBoardScreenCoordinator(
navigationController: navigationController
dependency: .init(
navigationController: navigationController,
recruitmentPostUseCase: injector.resolve(RecruitmentPostUseCase.self)
)
)
addChildCoordinator(coordinator)
coordinator.parent = self
Expand All @@ -63,8 +66,9 @@ public extension RecruitmentManagementCoordinator {
func showCheckingApplicantScreen(postId: String) {
let coordinator = CheckApplicantCoordinator(
dependency: .init(
postId: postId,
navigationController: navigationController,
centerEmployCardVO: .mock,
recruitmentPostUseCase: injector.resolve(RecruitmentPostUseCase.self),
workerProfileUseCase: injector.resolve(WorkerProfileUseCase.self)
)
)
Expand All @@ -73,12 +77,12 @@ public extension RecruitmentManagementCoordinator {
coordinator.start()
}

func showPostDetailScreenForCenter(postId: String, applicantCount: Int?) {
func showPostDetailScreenForCenter(postId: String, postState: PostState) {

let coordinator = PostDetailForCenterCoordinator(
dependency: .init(
postId: postId,
applicantCount: applicantCount,
postState: postState,
navigationController: navigationController,
recruitmentPostUseCase: injector.resolve(RecruitmentPostUseCase.self)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public class DefaultRecruitmentPostRepository: RecruitmentPostRepository {
let encodedData = try! JSONEncoder().encode(bundle.toDTO())

return service.request(api: .registerPost(postData: encodedData), with: .withToken)
.map { _ in () }
.mapToVoid()
}

public func getPostDetailForCenter(id: String) -> RxSwift.Single<Entity.RegisterRecruitmentPostBundle> {
Expand All @@ -50,6 +50,44 @@ public class DefaultRecruitmentPostRepository: RecruitmentPostRepository {
).map { _ in () }
}

public func getOngoingPosts() -> RxSwift.Single<[Entity.RecruitmentPostInfoForCenterVO]> {
return service.request(api: .getOnGoingPosts, with: .withToken)
.map(RecruitmentPostForCenterListDTO.self)
.map({ $0.jobPostings.map { $0.toVO() } })
}

public func getClosedPosts() -> RxSwift.Single<[Entity.RecruitmentPostInfoForCenterVO]> {
return service.request(api: .getClosedPosts, with: .withToken)
.map(RecruitmentPostForCenterListDTO.self)
.map({ $0.jobPostings.map { $0.toVO() } })
}

public func getPostApplicantCount(id: String) -> RxSwift.Single<Int> {
service.request(api: .getPostApplicantCount(id: id), with: .withToken)
.map(PostApplicantCountDTO.self)
.map { dto in
dto.applicantCount
}
}

public func getPostApplicantScreenData(id: String) -> RxSwift.Single<Entity.PostApplicantScreenVO> {
service.request(api: .getApplicantList(id: id), with: .withToken)
.map(PostApplicantScreenDTO.self)
.map { dto in
dto.toVO()
}
}

public func closePost(id: String) -> RxSwift.Single<Void> {
service.request(api: .closePost(id: id), with: .withToken)
.mapToVoid()
}

public func removePost(id: String) -> RxSwift.Single<Void> {
service.request(api: .removePost(id: id), with: .withToken)
.mapToVoid()
}

// MARK: Worker
public func getPostDetailForWorker(id: String) -> RxSwift.Single<Entity.RecruitmentPostForWorkerBundle> {
service.request(
Expand All @@ -65,12 +103,12 @@ public class DefaultRecruitmentPostRepository: RecruitmentPostRepository {
public func getNativePostListForWorker(nextPageId: String?, requestCnt: Int = 10) -> RxSwift.Single<Entity.RecruitmentPostListForWorkerVO> {

service.request(
api: .nativePostList(nextPageId: nextPageId, requestCnt: String(requestCnt)),
api: .getOnGoingNativePostListForWorker(nextPageId: nextPageId, requestCnt: String(requestCnt)),
with: .withToken
)
.map(RecruitmentPostListForWorkerDTO.self)
.catch({ error in
if let moyaError = error as? MoyaError, case .objectMapping(let error, let response) = moyaError {
if let moyaError = error as? MoyaError, case .objectMapping(let error, _) = moyaError {
print(error.localizedDescription)
}
return .error(error)
Expand All @@ -81,7 +119,8 @@ public class DefaultRecruitmentPostRepository: RecruitmentPostRepository {
}
}

fileprivate extension RegisterRecruitmentPostBundle {
// MARK: 공고등록 정보를 DTO로 변환하는 영역
extension RegisterRecruitmentPostBundle {

func toDTO() -> RecruitmentPostRegisterDTO {

Expand Down Expand Up @@ -161,10 +200,9 @@ fileprivate extension RegisterRecruitmentPostBundle {
return dto
}
}


// MARK: 엔티티 타입들을 DTO로 변경하기 위한 확장
fileprivate extension WorkDay {
extension WorkDay {

var dtoFormString: String {
switch self {
Expand All @@ -186,7 +224,7 @@ fileprivate extension WorkDay {
}
}

fileprivate extension IdleDateComponent {
extension IdleDateComponent {
var dtoFormString: String {
if part == .AM {
return "\(hour):\(minute)"
Expand All @@ -196,7 +234,7 @@ fileprivate extension IdleDateComponent {
}
}

fileprivate extension PaymentType {
extension PaymentType {
var dtoFormString: String {
switch self {
case .hourly:
Expand All @@ -209,7 +247,7 @@ fileprivate extension PaymentType {
}
}

fileprivate extension Gender {
extension Gender {
var dtoFormString: String {
switch self {
case .male:
Expand All @@ -222,13 +260,13 @@ fileprivate extension Gender {
}
}

fileprivate extension CareGrade {
extension CareGrade {
var dtoFormInt: Int {
self.rawValue + 1
}
}

fileprivate extension CognitionDegree {
extension CognitionDegree {
var dtoFormString: String {
switch self {
case .stable:
Expand All @@ -241,7 +279,7 @@ fileprivate extension CognitionDegree {
}
}

fileprivate extension DailySupportType {
extension DailySupportType {
var dtoFormString: String {
switch self {
case .cleaning:
Expand All @@ -258,7 +296,7 @@ fileprivate extension DailySupportType {
}
}

fileprivate extension ApplyType {
extension ApplyType {
var dtoFormString: String {
switch self {
case .phoneCall:
Expand All @@ -271,7 +309,7 @@ fileprivate extension ApplyType {
}
}

fileprivate extension ApplyDeadlineType {
extension ApplyDeadlineType {
var dtoFormString: String {
switch self {
case .untilApplicationFinished:
Expand All @@ -282,11 +320,13 @@ fileprivate extension ApplyDeadlineType {
}
}

fileprivate extension Date {
extension Date {
var dtoFormString: String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let dateString = dateFormatter.string(from: self)
return dateString
}
}


55 changes: 48 additions & 7 deletions project/Projects/Data/DataSource/API/RcruitmentPostAPI.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,26 @@ import Entity

public enum RcruitmentPostAPI {

// Common
/// 요양보호사용 센터용 선택가능
case postDetail(id: String, userType: UserType)

// Center
// - 공고 CRUD
case registerPost(postData: Data)
case editPost(id: String, postData: Data)
case removePost(id: String)
case closePost(id: String)
// - 공고 상세조회
case getOnGoingPosts
case getClosedPosts
case getApplicantList(id: String)

// - 공고 지원자 관련
case getPostApplicantCount(id: String)


// Worker
case nativePostList(nextPageId: String?, requestCnt: String)
case getOnGoingNativePostListForWorker(nextPageId: String?, requestCnt: String)
}

extension RcruitmentPostAPI: BaseAPI {
Expand All @@ -35,6 +44,8 @@ extension RcruitmentPostAPI: BaseAPI {
switch self {
case .postDetail(let id, let userType):
"/\(id)/\(userType.pathUri)"


case .registerPost:
""
case .editPost(let id, _):
Expand All @@ -43,7 +54,21 @@ extension RcruitmentPostAPI: BaseAPI {
"/\(id)"
case .closePost(let id):
"/\(id)/end"
case .nativePostList:


case .getOnGoingPosts:
"/status/in-progress"
case .getClosedPosts:
"/status/completed"
case .getApplicantList(let id):
"/\(id)/applicants"


case .getPostApplicantCount(let id):
"/\(id)/applicant-count"


case .getOnGoingNativePostListForWorker:
""
}
}
Expand All @@ -52,6 +77,8 @@ extension RcruitmentPostAPI: BaseAPI {
switch self {
case .postDetail:
.get


case .registerPost:
.post
case .editPost:
Expand All @@ -60,15 +87,29 @@ extension RcruitmentPostAPI: BaseAPI {
.delete
case .closePost:
.patch
case .nativePostList:


case .getOnGoingPosts:
.get
case .getClosedPosts:
.get
case .getApplicantList:
.get


case .getPostApplicantCount:
.get


case .getOnGoingNativePostListForWorker:
.get
}
}

var bodyParameters: Parameters? {
var params: Parameters = [:]
switch self {
case .nativePostList(let nextPageId, let requestCnt):
case .getOnGoingNativePostListForWorker(let nextPageId, let requestCnt):
if let nextPageId {
params["next"] = nextPageId
}
Expand All @@ -81,7 +122,7 @@ extension RcruitmentPostAPI: BaseAPI {

var parameterEncoding: ParameterEncoding {
switch self {
case .nativePostList:
case .getOnGoingNativePostListForWorker:
return URLEncoding.queryString
default:
return JSONEncoding.default
Expand All @@ -90,7 +131,7 @@ extension RcruitmentPostAPI: BaseAPI {

public var task: Moya.Task {
switch self {
case .nativePostList:
case .getOnGoingNativePostListForWorker:
.requestParameters(parameters: bodyParameters ?? [:], encoding: parameterEncoding)
case .registerPost(let bodyData):
.requestData(bodyData)
Expand Down
Loading