Skip to content

[IDLE-113] 등록한 공고의 상세 정보를 확인하고 수정할 수 있다. #38

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 8 commits into from
Aug 14, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,8 @@ class CenterMainCoordinator: CenterMainCoordinatable {
dependency: .init(
parent: self,
navigationController: navigationController,
workerProfileUseCase: injector.resolve(WorkerProfileUseCase.self)
workerProfileUseCase: injector.resolve(WorkerProfileUseCase.self),
recruitmentPostUseCase: injector.resolve(RecruitmentPostUseCase.self)
)
)

Expand Down Expand Up @@ -123,9 +124,13 @@ extension CenterMainCoordinator {
/// 공고등록창을 표시합니다.
func registerRecruitmentPost() {

let coordinator = RegisterRecruitmentPostCoordinator(dependency: .init(
navigationController: navigationController,
injector: injector)
let coordinator = RegisterRecruitmentPostCoordinator(
dependency: .init(
navigationController: navigationController,
recruitmentPostUseCase: injector.resolve(
RecruitmentPostUseCase.self
)
)
)
coordinator.parent = self
addChildCoordinator(coordinator)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,67 +10,3 @@ import DSKit
import PresentationCore
import CenterFeature
import UseCaseInterface


class RegisterRecruitmentPostCoordinator: RegisterRecruitmentPostCoordinatable {

struct Dependency {
let navigationController: UINavigationController
let injector: Injector
}

var childCoordinators: [Coordinator] = []

var parent: ParentCoordinator?

var navigationController: UINavigationController
let injector: Injector

var viewModel: RegisterRecruitmentPostViewModelable!

init(dependency: Dependency) {
self.navigationController = dependency.navigationController
self.injector = dependency.injector
}

func start() {
self.viewModel = RegisterRecruitmentPostVM(
recruitmentPostUseCase: injector.resolve(RecruitmentPostUseCase.self)
)

let coordinator = RegisterRecruitmentCoordinator(
viewModel: viewModel,
navigationController: navigationController
)
coordinator.parent = self
addChildCoordinator(coordinator)
coordinator.start()
}
}

extension RegisterRecruitmentPostCoordinator {

func showOverViewScreen() {
let coordinator = PostOverviewCoordinator(
viewModel: viewModel,
navigationController: navigationController
)
coordinator.parent = self
addChildCoordinator(coordinator)
coordinator.start()
}

func showRegisterCompleteScreen() {
let coordinator = RegisterCompleteCoordinator(
navigationController: navigationController
)
coordinator.parent = self
addChildCoordinator(coordinator)
coordinator.start()
}

func registerFinished() {
clearChildren()
parent?.removeChildCoordinator(self)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,60 +13,95 @@ import Foundation

public class DefaultRecruitmentPostRepository: RecruitmentPostRepository {

let service: RecruitmentPostService = .init()
private var service: RecruitmentPostService = .init()

public init() { }
public init(_ store: KeyValueStore? = nil) {
if let store {
self.service = RecruitmentPostService(keyValueStore: store)
}
}

public func registerPost(bundle: RegisterRecruitmentPostBundle) -> RxSwift.Single<Void> {

let encodedData = try! JSONEncoder().encode(bundle.toDTO())

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

public func getPostDetailForCenter(id: String) -> RxSwift.Single<Entity.RegisterRecruitmentPostBundle> {

service.request(api: .postDetail(id: id, userType: .center), with: .withToken)
.map(RecruitmentPostFetchDTO.self)
.map { dto in
dto.toEntity()
}
}

public func registerPost(input1: Entity.WorkTimeAndPayStateObject, input2: Entity.AddressInputStateObject, input3: Entity.CustomerInformationStateObject, input4: Entity.CustomerRequirementStateObject, input5: Entity.ApplicationDetailStateObject) -> RxSwift.Single<Void> {
public func editPostDetail(id: String, bundle: RegisterRecruitmentPostBundle) -> RxSwift.Single<Void> {

let encodedData = try! JSONEncoder().encode(bundle.toDTO())

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

fileprivate extension RegisterRecruitmentPostBundle {

func toDTO() -> RecruitmentPostRegisterDTO {

// WorkTimeAndPayment
// - all required
let weekDays: [String] = input1.selectedDays
let weekDays: [String] = workTimeAndPay.selectedDays
.filter ({ (key, value) in value }).keys
.map { day in day.dtoFormString }

let startTime: String = input1.workStartTime!.dtoFormString
let endTime: String = input1.workEndTime!.dtoFormString
let paymentType: String = input1.paymentType!.dtoFormString
let paymentAmount: Int = .init(input1.paymentAmount)!
let startTime: String = workTimeAndPay.workStartTime!.dtoFormString
let endTime: String = workTimeAndPay.workEndTime!.dtoFormString
let paymentType: String = workTimeAndPay.paymentType!.dtoFormString
let paymentAmount: Int = .init(workTimeAndPay.paymentAmount)!

// AddressInputStateObject
// - all required
let roadNameAddress: String = input2.addressInfo!.roadAddress
let lotNumberAddress: String = input2.addressInfo!.jibunAddress
let roadNameAddress: String = addressInfo.addressInfo!.roadAddress
let lotNumberAddress: String = addressInfo.addressInfo!.jibunAddress

// CustomerInformationStateObject
// - required
let clientName: String = input3.name
let gender: String = input3.gender!.dtoFormString
let birthYear: Int = .init(input3.birthYear)!
let weight: Int = .init(input3.weight)!
let careLevel: Int = input3.careGrade!.dtoFormInt
let mentalStatus: String = input3.cognitionState!.dtoFormString
let clientName: String = customerInformation.name
let gender: String = customerInformation.gender!.dtoFormString
let birthYear: Int = .init(customerInformation.birthYear)!
let weight: Int? = .init(customerInformation.weight) ?? nil
let careLevel: Int = customerInformation.careGrade!.dtoFormInt
let mentalStatus: String = customerInformation.cognitionState!.dtoFormString
// - optional
let disease: String = input3.deceaseDescription
let disease: String? = customerInformation.deceaseDescription.isEmpty ? nil : customerInformation.deceaseDescription

// CustomerRequirementStateObject
// - required
let isMealAssistance: Bool = input4.mealSupportNeeded!
let isBowelAssistance: Bool = input4.toiletSupportNeeded!
let isWalkingAssistance: Bool = input4.movingSupportNeeded!
let isMealAssistance: Bool = customerRequirement.mealSupportNeeded!
let isBowelAssistance: Bool = customerRequirement.toiletSupportNeeded!
let isWalkingAssistance: Bool = customerRequirement.movingSupportNeeded!
// - optional
let extraRequirement: String = input4.additionalRequirement
let lifeAssistance: [String] = input4.dailySupportTypeNeeds
let extraRequirement: String? = customerRequirement.additionalRequirement.isEmpty ? nil :customerRequirement.additionalRequirement
let lifAssistanceList = customerRequirement.dailySupportTypeNeeds
.filter ({ $1 }).keys
.map { type in type.dtoFormString }
let lifeAssistance: [String] = lifAssistanceList.isEmpty ? ["NONE"] : lifAssistanceList

// ApplicationDetailStateObject
// - required
let isExperiencePreferred = input5.experiencePreferenceType! == .beginnerPossible ? false : true
let applyMethod = input5.applyType
let isExperiencePreferred = applicationDetail.experiencePreferenceType! == .beginnerPossible ? false : true
let applyMethod = applicationDetail.applyType
.filter ({ $1 }).keys
.map { type in type.dtoFormString }
let applyDeadlineType = input5.applyDeadlineType!.dtoFormString
let applyDeadline = input5.deadlineDate!.dtoFormString
let applyDeadlineType = applicationDetail.applyDeadlineType!.dtoFormString
let applyDeadline = applicationDetail.deadlineDate!.dtoFormString

let dto = RecruitmentPostDTO(
let dto = RecruitmentPostRegisterDTO(
isMealAssistance: isMealAssistance,
isBowelAssistance: isBowelAssistance,
isWalkingAssistance: isWalkingAssistance,
Expand All @@ -91,11 +126,7 @@ public class DefaultRecruitmentPostRepository: RecruitmentPostRepository {
applyDeadline: applyDeadline,
applyDeadlineType: applyDeadlineType
)

let encodedData = try! JSONEncoder().encode(dto)

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,18 @@

import Moya
import Foundation
import Entity

public enum RcruitmentPostAPI {

// Common
case postDetail(id: String, userType: UserType)

// Center
case registerPost(postData: Data)
case editPost(id: String, postData: Data)
case removePost(id: String)
case closePost(id: String)
}

extension RcruitmentPostAPI: BaseAPI {
Expand All @@ -22,15 +29,31 @@ extension RcruitmentPostAPI: BaseAPI {

public var path: String {
switch self {
case .postDetail(let id, let userType):
"/\(id)/\(userType.pathUri)"
case .registerPost:
""
case .editPost(let id, _):
"/\(id)"
case .removePost(let id):
"/\(id)"
case .closePost(let id):
"/\(id)/end"
}
}

public var method: Moya.Method {
switch self {
case .postDetail:
.get
case .registerPost:
.post
case .editPost:
.patch
case .removePost:
.delete
case .closePost:
.patch
}
}

Expand All @@ -45,6 +68,10 @@ extension RcruitmentPostAPI: BaseAPI {
switch self {
case .registerPost(let bodyData):
.requestData(bodyData)
case .editPost(_, let editData):
.requestData(editData)
default:
.requestPlain
}
}
}
Loading