diff --git a/14th-team5-iOS/App/Sources/Manager/DeepLinkManager.swift b/14th-team5-iOS/App/Sources/Manager/DeepLinkManager.swift index e0463b8e3..4bae1cf7b 100644 --- a/14th-team5-iOS/App/Sources/Manager/DeepLinkManager.swift +++ b/14th-team5-iOS/App/Sources/Manager/DeepLinkManager.swift @@ -71,11 +71,11 @@ final class DeepLinkManager { } - private func fetchTodayPost(type: PostType, completion: @escaping (PostListPage?) -> Void) { + private func fetchTodayPost(type: PostType, completion: @escaping (PostListPageEntity?) -> Void) { let dateString = Date().toFormatString(with: "yyyy-MM-dd") let query = PostListQuery(date: dateString, type: type) - postUseCase.excute(query: query) + postUseCase.execute(query: query) .subscribe(onSuccess: { result in completion(result) }) diff --git a/14th-team5-iOS/App/Sources/Presentation/Camera/Dependency/CameraDIContainer.swift b/14th-team5-iOS/App/Sources/Presentation/Camera/Dependency/CameraDIContainer.swift index 815ed414c..49ae164c0 100644 --- a/14th-team5-iOS/App/Sources/Presentation/Camera/Dependency/CameraDIContainer.swift +++ b/14th-team5-iOS/App/Sources/Presentation/Camera/Dependency/CameraDIContainer.swift @@ -17,7 +17,6 @@ public final class CameraDIContainer: BaseDIContainer { public typealias ViewContrller = CameraViewController public typealias Repository = CameraRepositoryProtocol public typealias Reactor = CameraViewReactor - public typealias UseCase = CameraViewUseCaseProtocol private let cameraType: UploadLocation @@ -42,18 +41,22 @@ public final class CameraDIContainer: BaseDIContainer { return CameraViewController(reactor: makeReactor()) } - public func makeUseCase() -> UseCase { - return CameraViewUseCase(cameraRepository: makeRepository()) - } - public func makeRepository() -> Repository { return CameraRepository() } public func makeReactor() -> Reactor { + return CameraViewReactor( - cameraUseCase: makeUseCase(), + createProfileImageUseCase: CreateCameraUseCase(cameraRepository: makeRepository()), + uploadImageUseCase: FetchCameraUploadImageUseCase(cameraRepository: makeRepository()), + fetchMissionUseCase: FetchCameraTodayMissionUseCase(cameraRepository: makeRepository()), + fetchRealEmojiUpdateUseCase: FetchCameraRealEmojiUpdateUseCase(cameraRepostiroy: makeRepository()), + editProfileImageUseCase: EditCameraProfileImageUseCase(cameraRepository: makeRepository()), + fetchRealEmojiCreateUseCase: FetchCameraRealEmojiUploadUseCase(cameraRepository: makeRepository()), + fetchRealEmojiListUseCase: FetchCameraRealEmojiListUseCase(cameraRepository: makeRepository()), + fetchRealEmojiPreSignedUseCase: FetchCameraRealEmojiUseCase(cameraRepository: makeRepository()), provider: globalState, cameraType: cameraType, memberId: memberId, diff --git a/14th-team5-iOS/App/Sources/Presentation/Camera/Dependency/CameraDisplayDIContainer.swift b/14th-team5-iOS/App/Sources/Presentation/Camera/Dependency/CameraDisplayDIContainer.swift index e57cc4de4..d1334884e 100644 --- a/14th-team5-iOS/App/Sources/Presentation/Camera/Dependency/CameraDisplayDIContainer.swift +++ b/14th-team5-iOS/App/Sources/Presentation/Camera/Dependency/CameraDisplayDIContainer.swift @@ -16,7 +16,6 @@ public final class CameraDisplayDIContainer: BaseDIContainer { public typealias ViewContrller = CameraDisplayViewController public typealias Repository = CameraRepositoryProtocol public typealias Reactor = CameraDisplayViewReactor - public typealias UseCase = CameraDisplayViewUseCaseProtocol fileprivate var displayData: Data fileprivate var missionTitle: String @@ -43,12 +42,15 @@ public final class CameraDisplayDIContainer: BaseDIContainer { return CameraRepository() } - public func makeUseCase() -> UseCase { - return CameraDisplayViewUseCase(cameraDisplayViewRepository: makeRepository()) - } - public func makeReactor() -> Reactor { - return CameraDisplayViewReactor(provider: globalState, cameraDisplayUseCase: makeUseCase(), displayData: displayData, missionTitle: missionTitle, cameraType: cameraDisplayType) + return CameraDisplayViewReactor( + provider: globalState, + createPresignedCameraUseCase: CreateCameraUseCase(cameraRepository: makeRepository()), + uploadImageUseCase: FetchCameraUploadImageUseCase(cameraRepository: makeRepository()), + fetchCameraImageUseCase: CreateCameraImageUseCase(cameraRepository: makeRepository()), + displayData: displayData, + missionTitle: missionTitle, + cameraType: cameraDisplayType + ) } - } diff --git a/14th-team5-iOS/App/Sources/Presentation/Camera/Reactor/CameraDisplayViewReactor.swift b/14th-team5-iOS/App/Sources/Presentation/Camera/Reactor/CameraDisplayViewReactor.swift index 3a1bac5c3..36eb3b9af 100644 --- a/14th-team5-iOS/App/Sources/Presentation/Camera/Reactor/CameraDisplayViewReactor.swift +++ b/14th-team5-iOS/App/Sources/Presentation/Camera/Reactor/CameraDisplayViewReactor.swift @@ -16,7 +16,9 @@ public final class CameraDisplayViewReactor: Reactor { public var initialState: State private let provider: GlobalStateProviderProtocol - private var cameraDisplayUseCase: CameraDisplayViewUseCaseProtocol + private let createPresignedCameraUseCase: CreateCameraUseCaseProtocol + private let uploadImageUseCase: FetchCameraUploadImageUseCaseProtocol + private let fetchCameraImageUseCase: CreateCameraImageUseCaseProtocol public enum Action { case viewDidLoad @@ -33,9 +35,9 @@ public final class CameraDisplayViewReactor: Reactor { case setRenderImage(Data) case saveDeviceimage(Data) case setDescription(String) - case setDisplayEntity(CameraDisplayImageResponse?) + case setDisplayEntity(CameraPreSignedEntity?) case setDisplayOriginalEntity(Bool) - case setPostEntity(CameraDisplayPostResponse?) + case setPostEntity(CameraPostEntity?) } public struct State { @@ -46,22 +48,27 @@ public final class CameraDisplayViewReactor: Reactor { @Pulse var displayData: Data @Pulse var missionTitle: String @Pulse var displaySection: [DisplayEditSectionModel] - @Pulse var displayEntity: CameraDisplayImageResponse? + @Pulse var displayEntity: CameraPreSignedEntity? @Pulse var displayOringalEntity: Bool - @Pulse var displayPostEntity: CameraDisplayPostResponse? + @Pulse var displayPostEntity: CameraPostEntity? } init( provider: GlobalStateProviderProtocol, - cameraDisplayUseCase: CameraDisplayViewUseCaseProtocol, + createPresignedCameraUseCase: CreateCameraUseCaseProtocol, + uploadImageUseCase: FetchCameraUploadImageUseCaseProtocol, + fetchCameraImageUseCase: CreateCameraImageUseCaseProtocol, displayData: Data, missionTitle: String, cameraType: PostType = .survival ) { self.provider = provider - self.cameraDisplayUseCase = cameraDisplayUseCase + self.createPresignedCameraUseCase = createPresignedCameraUseCase + self.uploadImageUseCase = uploadImageUseCase + self.fetchCameraImageUseCase = fetchCameraImageUseCase + self.initialState = State( isLoading: true, displayDescrption: "", @@ -86,7 +93,8 @@ public final class CameraDisplayViewReactor: Reactor { .just(.setLoading(false)), .just(.setError(false)), .just(.setRenderImage(currentState.displayData)), - cameraDisplayUseCase.executeDisplayImageURL(parameters: parameters) + createPresignedCameraUseCase.execute(parameter: parameters) + .asObservable() .withUnretained(self) .subscribe(on: ConcurrentDispatchQueueScheduler.init(qos: .background)) .asObservable() @@ -97,7 +105,7 @@ public final class CameraDisplayViewReactor: Reactor { .just(.setError(true)) ) } - return owner.cameraDisplayUseCase.executeUploadToS3(toURL: originalURL, imageData: owner.currentState.displayData) + return owner.uploadImageUseCase.execute(to: originalURL, from: owner.currentState.displayData) .subscribe(on: ConcurrentDispatchQueueScheduler.init(qos: .background)) .asObservable() .flatMap { isSuccess -> Observable in @@ -155,7 +163,7 @@ public final class CameraDisplayViewReactor: Reactor { uploadTime: DateFormatter.yyyyMMddTHHmmssXXX.string(from: Date()) ) - return cameraDisplayUseCase.executeCombineWithTextImage(parameters: parameters, query: cameraQuery) + return fetchCameraImageUseCase.execute(parameter: parameters, query: cameraQuery) .asObservable() .catchAndReturn(nil) .flatMap { entity -> Observable in diff --git a/14th-team5-iOS/App/Sources/Presentation/Camera/Reactor/CameraViewReactor.swift b/14th-team5-iOS/App/Sources/Presentation/Camera/Reactor/CameraViewReactor.swift index 2d3d06640..5429c414f 100644 --- a/14th-team5-iOS/App/Sources/Presentation/Camera/Reactor/CameraViewReactor.swift +++ b/14th-team5-iOS/App/Sources/Presentation/Camera/Reactor/CameraViewReactor.swift @@ -17,7 +17,20 @@ import ReactorKit public final class CameraViewReactor: Reactor { public var initialState: State - private var cameraUseCase: CameraViewUseCaseProtocol + + + private let createProfileImageUseCase: CreateCameraUseCaseProtocol + private let uploadImageUseCase: FetchCameraUploadImageUseCaseProtocol + private let fetchMissionUseCase: FetchCameraTodayMissionUseCaseProtocol + private let fetchRealEmojiUpdateUseCase: FetchCameraRealEmojiUpdateUseCaseProtocol + private let fetchRealEmojiCreateUseCase: FetchCameraRealEmojiUploadUseCaseProtocol + private let editProfileImageUseCase: EditCameraProfileImageUseCaseProtocol + private let fetchRealEmojiListUseCase: FetchCameraRealEmojiListUseCaseProtocol + private let fetchRealEmojiPreSignedUseCase: FetchCameraRealEmojiUseCaseProtocol + + + + private let provider: GlobalStateProviderProtocol public var cameraType: UploadLocation public var memberId: String @@ -40,13 +53,13 @@ public final class CameraViewReactor: Reactor { case setAccountProfileData(Data) case setPinchZoomScale(CGFloat) case setZoomScale(CGFloat) - case setProfileImageURLResponse(CameraDisplayImageResponse?) - case setProfileMemberResponse(MembersProfileResponse?) - case setRealEmojiImageURLResponse(CameraRealEmojiPreSignedResponse?) - case setRealEmojiImageCreateResponse(CameraCreateRealEmojiResponse?) - case setRealEmojiItems([CameraRealEmojiImageItemResponse?]) + case setProfileImageURLResponse(CameraPreSignedEntity?) + case setProfileMemberResponse(MembersProfileEntity?) + case setRealEmojiImageURLResponse(CameraRealEmojiPreSignedEntity?) + case setRealEmojiImageCreateResponse(CameraCreateRealEmojiEntity?) + case setRealEmojiItems([CameraRealEmojiImageItemEntity?]) case setRealEmojiSection([EmojiSectionItem]) - case setMissionResponse(CameraTodayMissionResponse?) + case setMissionResponse(CameraTodayMssionEntity?) case setErrorAlert(Bool) case setRealEmojiType(Emojis) case setFeedImageData(Data) @@ -57,11 +70,11 @@ public final class CameraViewReactor: Reactor { @Pulse var isLoading: Bool @Pulse var isFlashMode: Bool @Pulse var isSwitchPosition: Bool - @Pulse var profileImageURLEntity: CameraDisplayImageResponse? - @Pulse var realEmojiURLEntity: CameraRealEmojiPreSignedResponse? - @Pulse var realEmojiCreateEntity: CameraCreateRealEmojiResponse? - @Pulse var realEmojiEntity: [CameraRealEmojiImageItemResponse?] - @Pulse var missionEntity: CameraTodayMissionResponse? + @Pulse var profileImageURLEntity: CameraPreSignedEntity? + @Pulse var realEmojiURLEntity: CameraRealEmojiPreSignedEntity? + @Pulse var realEmojiCreateEntity: CameraCreateRealEmojiEntity? + @Pulse var realEmojiEntity: [CameraRealEmojiImageItemEntity?] + @Pulse var missionEntity: CameraTodayMssionEntity? @Pulse var realEmojiSection: [EmojiSectionModel] @Pulse var zoomScale: CGFloat @Pulse var pinchZoomScale: CGFloat @@ -73,17 +86,32 @@ public final class CameraViewReactor: Reactor { var memberId: String var isUpload: Bool @Pulse var isError: Bool - @Pulse var profileMemberEntity: MembersProfileResponse? + @Pulse var profileMemberEntity: MembersProfileEntity? } - init(cameraUseCase: CameraViewUseCaseProtocol, - provider: GlobalStateProviderProtocol, - cameraType: UploadLocation, - memberId: String, - emojiType: Emojis = .emoji(forIndex: 1) + init( + createProfileImageUseCase: CreateCameraUseCaseProtocol, + uploadImageUseCase: FetchCameraUploadImageUseCaseProtocol, + fetchMissionUseCase: FetchCameraTodayMissionUseCaseProtocol, + fetchRealEmojiUpdateUseCase: FetchCameraRealEmojiUpdateUseCaseProtocol, + editProfileImageUseCase: EditCameraProfileImageUseCaseProtocol, + fetchRealEmojiCreateUseCase: FetchCameraRealEmojiUploadUseCaseProtocol, + fetchRealEmojiListUseCase: FetchCameraRealEmojiListUseCaseProtocol, + fetchRealEmojiPreSignedUseCase: FetchCameraRealEmojiUseCaseProtocol, + provider: GlobalStateProviderProtocol, + cameraType: UploadLocation, + memberId: String, + emojiType: Emojis = .emoji(forIndex: 1) ) { self.cameraType = cameraType - self.cameraUseCase = cameraUseCase + self.createProfileImageUseCase = createProfileImageUseCase + self.uploadImageUseCase = uploadImageUseCase + self.fetchMissionUseCase = fetchMissionUseCase + self.fetchRealEmojiUpdateUseCase = fetchRealEmojiUpdateUseCase + self.editProfileImageUseCase = editProfileImageUseCase + self.fetchRealEmojiCreateUseCase = fetchRealEmojiCreateUseCase + self.fetchRealEmojiListUseCase = fetchRealEmojiListUseCase + self.fetchRealEmojiPreSignedUseCase = fetchRealEmojiPreSignedUseCase self.memberId = memberId self.provider = provider self.initialState = State( @@ -116,9 +144,9 @@ public final class CameraViewReactor: Reactor { return viewDidLoadMutation() case .didTapToggleButton: - return cameraUseCase.executeToggleCameraPosition(self.currentState.isSwitchPosition).map { .setPosition($0) } + return Observable.just(.setPosition(!self.currentState.isSwitchPosition)) case .didTapFlashButton: - return cameraUseCase.executeToggleCameraFlash(self.currentState.isFlashMode).map { .setFlashMode($0) } + return Observable.just(.setFlashMode(self.currentState.isFlashMode)) case let .didTapZoomButton(scale): if self.currentState.zoomScale == 2.0 { return .just(.setZoomScale(self.currentState.zoomScale - scale)) @@ -211,8 +239,10 @@ extension CameraViewReactor { private func viewDidLoadMutation() -> Observable { switch cameraType { case .realEmoji: + return .concat( - cameraUseCase.executeRealEmojiItems(memberId: memberId) + fetchRealEmojiListUseCase.execute(memberId: memberId) + .asObservable() .withUnretained(self) .flatMap { owner, entity -> Observable in var sectionItem: [EmojiSectionItem] = [] @@ -244,7 +274,8 @@ extension CameraViewReactor { } ) case .mission: - return cameraUseCase.executeTodayMission() + return fetchMissionUseCase.execute() + .asObservable() .withUnretained(self) .flatMap { owner, entity -> Observable in @@ -278,10 +309,11 @@ extension CameraViewReactor { return .concat( .just(.setLoading(false)), - cameraUseCase.executeProfileImageURL(parameter: profileParameter) + + createProfileImageUseCase.execute(parameter: profileParameter) + .asObservable() .withUnretained(self) .subscribe(on: ConcurrentDispatchQueueScheduler.init(qos: .background)) - .asObservable() .flatMap { owner, entity -> Observable in //TODO: 추후 오류 Alert 추가 guard let presingedURL = entity?.imageURL else { @@ -291,7 +323,7 @@ extension CameraViewReactor { ) } - return owner.cameraUseCase.executeUploadToS3(toURL: presingedURL, imageData: imageData) + return owner.uploadImageUseCase.execute(to: presingedURL, from: imageData) .subscribe(on: ConcurrentDispatchQueueScheduler.init(qos: .background)) .asObservable() .flatMap { isSuccess -> Observable in @@ -309,7 +341,7 @@ extension CameraViewReactor { let profileImageEditParameter = ProfileImageEditParameter(profileImageUrl: originalURL) if isSuccess { - return owner.cameraUseCase.executeEditProfileImage(memberId: owner.memberId, parameter: profileImageEditParameter) + return owner.editProfileImageUseCase.execute(memberId: owner.memberId, parameter: profileImageEditParameter) .asObservable() .subscribe(on: ConcurrentDispatchQueueScheduler.init(qos: .background)) .flatMap { editEntity -> Observable in @@ -341,27 +373,27 @@ extension CameraViewReactor { if currentState.realEmojiEntity[currentState.emojiType.rawValue - 1] == nil { return .concat( .just(.setLoading(false)), - cameraUseCase.executeRealEmojiImageURL(memberId: memberId, parameter: realEmojiParameter) + fetchRealEmojiPreSignedUseCase.execute(memberId: memberId, parameter: realEmojiParameter) + .asObservable() .withUnretained(self) .subscribe(on: ConcurrentDispatchQueueScheduler.init(qos: .background)) - .asObservable() .flatMap { owner, entity -> Observable in guard let presingedURL = entity?.imageURL else { return .just(.setErrorAlert(true))} - return owner.cameraUseCase.executeUploadToS3(toURL: presingedURL, imageData: imageData) + return owner.uploadImageUseCase.execute(to: presingedURL, from: imageData) .subscribe(on: ConcurrentDispatchQueueScheduler.init(qos: .background)) .asObservable() .flatMap { isSuccess -> Observable in let originalURL = owner.configureProfileOriginalS3URL(url: presingedURL, with: .realEmoji) let realEmojiCreateParameter = CameraCreateRealEmojiParameters(type: owner.currentState.emojiType.emojiString, imageUrl: originalURL) if isSuccess { - return owner.cameraUseCase.executeRealEmojiUploadToS3(memberId: owner.memberId, parameter: realEmojiCreateParameter) + return owner.fetchRealEmojiCreateUseCase.execute(memberId: owner.memberId, parameter: realEmojiCreateParameter) .asObservable() .subscribe(on: ConcurrentDispatchQueueScheduler.init(qos: .background)) .flatMap { realEmojiEntity -> Observable in guard let createRealEmojiEntity = realEmojiEntity else { return .just(.setErrorAlert(true))} owner.provider.realEmojiGlobalState.createRealEmojiImage(indexPath: owner.currentState.emojiType.rawValue - 1, image: createRealEmojiEntity.realEmojiImageURL, emojiType: createRealEmojiEntity.realEmojiType) - return owner.cameraUseCase.executeRealEmojiItems(memberId: owner.memberId) + return owner.fetchRealEmojiListUseCase.execute(memberId: owner.memberId) .asObservable() .flatMap { reloadEntity -> Observable in return .concat( @@ -389,20 +421,20 @@ extension CameraViewReactor { let realEmojiParameter = CameraRealEmojiParameters(imageName: realEmojiImage) return .concat( .just(.setLoading(false)), - cameraUseCase.executeRealEmojiImageURL(memberId: memberId, parameter: realEmojiParameter) + fetchRealEmojiPreSignedUseCase.execute(memberId: memberId, parameter: realEmojiParameter) + .asObservable() .withUnretained(self) .subscribe(on: ConcurrentDispatchQueueScheduler.init(qos: .background)) - .asObservable() .flatMap { owner, entity -> Observable in guard let presingedURL = entity?.imageURL else { return .just(.setErrorAlert(true))} let originalURL = owner.configureProfileOriginalS3URL(url: presingedURL, with: .realEmoji) let updateRealEmojiParameter = CameraUpdateRealEmojiParameters(imageUrl: originalURL) - return owner.cameraUseCase.executeUploadToS3(toURL: presingedURL, imageData: imageData) + return owner.uploadImageUseCase.execute(to: presingedURL, from: imageData) .subscribe(on: ConcurrentDispatchQueueScheduler.init(qos: .background)) .asObservable() .flatMap { isSuccess -> Observable in if isSuccess { - return owner.cameraUseCase.executeUpdateRealEmojiImage(memberId: owner.memberId, realEmojiId: owner.currentState.realEmojiEntity[owner.currentState.emojiType.rawValue - 1]?.realEmojiId ?? "", parameter: updateRealEmojiParameter) + return owner.fetchRealEmojiUpdateUseCase.execute(memberId: owner.memberId, emojiId: owner.currentState.realEmojiEntity[owner.currentState.emojiType.rawValue - 1]?.realEmojiId ?? "", parameter: updateRealEmojiParameter) .asObservable() .flatMap { updateRealEmojiEntity -> Observable in guard let updateEntity = updateRealEmojiEntity else { return .just(.setErrorAlert(true))} diff --git a/14th-team5-iOS/App/Sources/Presentation/Home/Dependency/MainViewDIContainer.swift b/14th-team5-iOS/App/Sources/Presentation/Home/Dependency/MainViewDIContainer.swift index 067af9f3a..c522b9b1e 100644 --- a/14th-team5-iOS/App/Sources/Presentation/Home/Dependency/MainViewDIContainer.swift +++ b/14th-team5-iOS/App/Sources/Presentation/Home/Dependency/MainViewDIContainer.swift @@ -49,8 +49,8 @@ extension MainViewDIContainer { return MainViewRepository() } - private func makeMissionUserDefaultsRepository() -> MissionUserDefaultsRepository { - return MissionUserDefaultsRepository() + private func makeMissionRepository() -> MissionRepositoryProtocol { + return MissionRepository() } private func makeFetchMainUseCase() -> FetchMainUseCaseProtocol { @@ -62,6 +62,6 @@ extension MainViewDIContainer { } private func makeCheckMissionAlertShowUseCase() -> CheckMissionAlertShowUseCaseProtocol { - return CheckMissionAlertShowUseCase(missionUserDefaultsRepository: makeMissionUserDefaultsRepository()) + return CheckMissionAlertShowUseCase(missionRepository: makeMissionRepository()) } } diff --git a/14th-team5-iOS/App/Sources/Presentation/Home/Reactor/MainPostViewReactor.swift b/14th-team5-iOS/App/Sources/Presentation/Home/Reactor/MainPostViewReactor.swift index 7b9edb383..40307c8df 100644 --- a/14th-team5-iOS/App/Sources/Presentation/Home/Reactor/MainPostViewReactor.swift +++ b/14th-team5-iOS/App/Sources/Presentation/Home/Reactor/MainPostViewReactor.swift @@ -55,7 +55,7 @@ extension MainPostViewReactor { ]) case .fetchPost: let query = PostListQuery(date: DateFormatter.dashYyyyMMdd.string(from: Date()), type: currentState.type) - return postUseCase.excute(query: query) + return postUseCase.execute(query: query) .asObservable() .flatMap { (postList) -> Observable in guard let postList = postList, diff --git a/14th-team5-iOS/App/Sources/Presentation/PostDetail/Dependency/PostListsDIContainer.swift b/14th-team5-iOS/App/Sources/Presentation/PostDetail/Dependency/PostListsDIContainer.swift index 8ccfd4941..352756059 100644 --- a/14th-team5-iOS/App/Sources/Presentation/PostDetail/Dependency/PostListsDIContainer.swift +++ b/14th-team5-iOS/App/Sources/Presentation/PostDetail/Dependency/PostListsDIContainer.swift @@ -56,8 +56,8 @@ final class PostListsDIContainer { return MissionRepository() } - func makeMissionUseCase() -> MissionContentUseCaseProtocol { - return MissionContentUseCase(missionContentRepository: makeMissionRepository()) + func makeMissionUseCase() -> FetchMissionContentUseCaseProtocol { + return FetchMissionContentUseCase(missionRepository: makeMissionRepository()) } func makeReactor( @@ -67,7 +67,7 @@ final class PostListsDIContainer { ) -> Reactor { return PostReactor( provider: globalState, - missionUseCase: makeMissionUseCase(), + fetchMissionUseCase: makeMissionUseCase(), initialState: PostReactor.State( selectedIndex: selectedIndex, originPostLists: postLists, diff --git a/14th-team5-iOS/App/Sources/Presentation/PostDetail/Reactor/PostReactor.swift b/14th-team5-iOS/App/Sources/Presentation/PostDetail/Reactor/PostReactor.swift index 8d97a757a..3df3ac5d5 100644 --- a/14th-team5-iOS/App/Sources/Presentation/PostDetail/Reactor/PostReactor.swift +++ b/14th-team5-iOS/App/Sources/Presentation/PostDetail/Reactor/PostReactor.swift @@ -21,7 +21,7 @@ final class PostReactor: Reactor { enum Mutation { case setPop case setSelectedPostIndex(Int) - case setMissionContent(MissionContentResponse) + case setMissionContent(MissionContentEntity) case setPushProfileViewController(String) } @@ -32,7 +32,7 @@ final class PostReactor: Reactor { var isPop: Bool = false var selectedPost: PostEntity = .init(postId: "", author: .init(memberId: "", profileImageURL: "", name: ""), commentCount: 0, emojiCount: 0, imageURL: "", content: "", time: "") - @Pulse var missionContent: MissionContentResponse? = nil + @Pulse var missionContent: MissionContentEntity? = nil @Pulse var reactionMemberIds: [String] = [] @Pulse var shouldPushProfileViewController: String? @@ -41,17 +41,17 @@ final class PostReactor: Reactor { let initialState: State - let missionUseCase: MissionContentUseCaseProtocol + let fetchMissionUseCase: FetchMissionContentUseCaseProtocol let provider: GlobalStateProviderProtocol init( provider: GlobalStateProviderProtocol, - missionUseCase: MissionContentUseCaseProtocol, + fetchMissionUseCase: FetchMissionContentUseCaseProtocol, initialState: State ) { self.provider = provider - self.missionUseCase = missionUseCase + self.fetchMissionUseCase = fetchMissionUseCase self.initialState = initialState } } @@ -76,11 +76,13 @@ extension PostReactor { case let .setPost(index): guard case let .main(postEntity) = currentState.originPostLists.items[index], let missionId = postEntity.missionId else { return Observable.just(.setSelectedPostIndex(index)) } - return missionUseCase.execute(missionId: missionId) + return fetchMissionUseCase.execute(missionId: missionId) + .asObservable() .flatMap { entity -> Observable in + guard let originEntity = entity else { return .empty() } return .concat( .just(.setSelectedPostIndex(index)), - .just(.setMissionContent(entity)) + .just(.setMissionContent(originEntity)) ) } diff --git a/14th-team5-iOS/App/Sources/Presentation/Profile/Dependency/ProfileDIContainer.swift b/14th-team5-iOS/App/Sources/Presentation/Profile/Dependency/ProfileDIContainer.swift index b6fed08af..18712a1eb 100644 --- a/14th-team5-iOS/App/Sources/Presentation/Profile/Dependency/ProfileDIContainer.swift +++ b/14th-team5-iOS/App/Sources/Presentation/Profile/Dependency/ProfileDIContainer.swift @@ -16,7 +16,6 @@ public final class ProfileDIContainer: BaseDIContainer { public typealias ViewContrller = ProfileViewController public typealias Repository = MembersRepositoryProtocol public typealias Reactor = ProfileViewReactor - public typealias UseCase = MembersUseCaseProtocol private var globalState: GlobalStateProviderProtocol { guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { @@ -37,17 +36,23 @@ public final class ProfileDIContainer: BaseDIContainer { return ProfileViewController(reactor: makeReactor()) } - public func makeUseCase() -> UseCase { - return MembersUseCase(membersRepository: makeRepository()) - } - public func makeRepository() -> Repository { return MembersRepository() } - public func makeReactor() -> ProfileViewReactor { - return ProfileViewReactor(membersUseCase: makeUseCase(), provider: globalState, memberId: memberId, isUser: isUser) + private func makeCameraRepository() -> CameraRepository { + return CameraRepository() } - + public func makeReactor() -> ProfileViewReactor { + return ProfileViewReactor( + fetchMembersProfileUseCase: FetchMembersProfileUseCase(membersRepository: makeRepository()), + createProfilePresignedUseCase: CreateCameraUseCase(cameraRepository: makeCameraRepository()), + uploadProfileImageUseCase: FetchCameraUploadImageUseCase(cameraRepository: makeCameraRepository()), + updateProfileUseCase: UpdateMembersProfileUseCase(membersRepository: makeRepository()), + provider: globalState, + memberId: memberId, + isUser: isUser + ) + } } diff --git a/14th-team5-iOS/App/Sources/Presentation/Profile/Dependency/ProfileFeedDIContainer.swift b/14th-team5-iOS/App/Sources/Presentation/Profile/Dependency/ProfileFeedDIContainer.swift index 0f90512e5..ffd601eba 100644 --- a/14th-team5-iOS/App/Sources/Presentation/Profile/Dependency/ProfileFeedDIContainer.swift +++ b/14th-team5-iOS/App/Sources/Presentation/Profile/Dependency/ProfileFeedDIContainer.swift @@ -16,7 +16,7 @@ final class ProfileFeedDIContainer { typealias ViewController = ProfileFeedViewController typealias Reactor = ProfileFeedViewReactor typealias Repository = PostListRepositoryProtocol - typealias UseCase = ProfileFeedUseCaseProtocol + typealias UseCase = FetchMembersPostListUseCaseProtocol private let postType: PostType private let memberId: String @@ -36,7 +36,7 @@ final class ProfileFeedDIContainer { } func makeUseCase() -> UseCase { - return ProfileFeedUseCase(missionFeedRepository: makeRepository()) + return FetchMembersPostListUseCase(postListRepository: makeRepository()) } func makeRepository() -> Repository { diff --git a/14th-team5-iOS/App/Sources/Presentation/Profile/Reactor/ProfileFeedViewReactor.swift b/14th-team5-iOS/App/Sources/Presentation/Profile/Reactor/ProfileFeedViewReactor.swift index 33f80f7c7..c1c5b9c09 100644 --- a/14th-team5-iOS/App/Sources/Presentation/Profile/Reactor/ProfileFeedViewReactor.swift +++ b/14th-team5-iOS/App/Sources/Presentation/Profile/Reactor/ProfileFeedViewReactor.swift @@ -15,7 +15,7 @@ import ReactorKit final class ProfileFeedViewReactor: Reactor { var initialState: State - private let feedUseCase: ProfileFeedUseCaseProtocol + private let feedUseCase: FetchMembersPostListUseCaseProtocol enum Action { case reloadFeedItems @@ -27,7 +27,7 @@ final class ProfileFeedViewReactor: Reactor { case setFeedSectionItems([ProfileFeedSectionItem]) case setFeedItemPage(Int) case setFeedPaginationItems([PostEntity]) - case setFeedItems(PostListPage) + case setFeedItems(PostListPageEntity) case setFeedDetailItem(PostSection.Model, IndexPath) } @@ -38,11 +38,15 @@ final class ProfileFeedViewReactor: Reactor { @Pulse var feedPaginationItems: [PostEntity] @Pulse var feedPage: Int @Pulse var type: PostType - @Pulse var feedItems: PostListPage? + @Pulse var feedItems: PostListPageEntity? @Pulse var feedSection: [ProfileFeedSectionModel] } - init(feedUseCase: ProfileFeedUseCaseProtocol, type: PostType, memberId: String) { + init( + feedUseCase: FetchMembersPostListUseCaseProtocol, + type: PostType, + memberId: String + ) { self.feedUseCase = feedUseCase self.initialState = State( memberId: memberId, diff --git a/14th-team5-iOS/App/Sources/Presentation/Profile/Reactor/ProfileViewReactor.swift b/14th-team5-iOS/App/Sources/Presentation/Profile/Reactor/ProfileViewReactor.swift index fdcbf8a71..b05c52a86 100644 --- a/14th-team5-iOS/App/Sources/Presentation/Profile/Reactor/ProfileViewReactor.swift +++ b/14th-team5-iOS/App/Sources/Presentation/Profile/Reactor/ProfileViewReactor.swift @@ -14,7 +14,14 @@ import ReactorKit public final class ProfileViewReactor: Reactor { public var initialState: State - private let membersUseCase: MembersUseCaseProtocol + + private let fetchMembersProfileUseCase: FetchMembersProfileUseCaseProtocol + private let createProfilePresignedUseCase: CreateCameraUseCaseProtocol + private let uploadProfileImageUseCase: FetchCameraUploadImageUseCaseProtocol + private let updateProfileUseCase: UpdateMembersProfileUseCaseProtocol + + + private let memberId: String private let isUser: Bool private let provider: GlobalStateProviderProtocol @@ -31,8 +38,8 @@ public final class ProfileViewReactor: Reactor { public enum Mutation { case setLoading(Bool) - case setProfilePresingedURL(CameraDisplayImageResponse?) - case setProfileMemberItems(MembersProfileResponse?) + case setProfilePresingedURL(CameraPreSignedEntity?) + case setProfileMemberItems(MembersProfileEntity?) case setProfileFeedType(BibbiFeedType) } @@ -41,12 +48,23 @@ public final class ProfileViewReactor: Reactor { var memberId: String var isUser: Bool var feedType: BibbiFeedType - @Pulse var profileMemberEntity: MembersProfileResponse? - @Pulse var profilePresingedURLEntity: CameraDisplayImageResponse? + @Pulse var profileMemberEntity: MembersProfileEntity? + @Pulse var profilePresingedURLEntity: CameraPreSignedEntity? } - init(membersUseCase: MembersUseCaseProtocol, provider: GlobalStateProviderProtocol, memberId: String, isUser: Bool) { - self.membersUseCase = membersUseCase + init( + fetchMembersProfileUseCase: FetchMembersProfileUseCaseProtocol, + createProfilePresignedUseCase: CreateCameraUseCaseProtocol, + uploadProfileImageUseCase: FetchCameraUploadImageUseCaseProtocol, + updateProfileUseCase: UpdateMembersProfileUseCaseProtocol, + provider: GlobalStateProviderProtocol, + memberId: String, + isUser: Bool + ) { + self.fetchMembersProfileUseCase = fetchMembersProfileUseCase + self.createProfilePresignedUseCase = createProfilePresignedUseCase + self.uploadProfileImageUseCase = uploadProfileImageUseCase + self.updateProfileUseCase = updateProfileUseCase self.memberId = memberId self.isUser = isUser self.initialState = State( @@ -77,7 +95,7 @@ public final class ProfileViewReactor: Reactor { //TODO: Keychain, UserDefaults 추가 switch action { case .viewDidLoad: - return membersUseCase.executeProfileMemberItems(memberId: currentState.memberId) + return fetchMembersProfileUseCase.execute(memberId: currentState.memberId) .asObservable() .flatMap { entity -> Observable in .just(.setProfileMemberItems(entity)) @@ -87,20 +105,20 @@ public final class ProfileViewReactor: Reactor { let nickNameImageEditParameter: CameraDisplayImageParameters = CameraDisplayImageParameters(imageName: nickNameProfileImage) return .concat( .just(.setLoading(false)), - membersUseCase.executeProfileImageURLCreate(parameter: nickNameImageEditParameter) + createProfilePresignedUseCase.execute(parameter: nickNameImageEditParameter) + .asObservable() .withUnretained(self) .subscribe(on: ConcurrentDispatchQueueScheduler.init(qos: .background)) - .asObservable() .flatMap { owner, entity -> Observable in guard let profilePresingedURL = entity?.imageURL else { return .empty() } - return owner.membersUseCase.executeProfileImageToPresingedUpload(to: profilePresingedURL, data: nickNameFileData) + return owner.uploadProfileImageUseCase.execute(to: profilePresingedURL, from: nickNameFileData) .subscribe(on: ConcurrentDispatchQueueScheduler.init(qos: .background)) .asObservable() .flatMap { isSuccess -> Observable in let originalPath = owner.configureProfileOriginalS3URL(url: profilePresingedURL) let profileEditParameter: ProfileImageEditParameter = ProfileImageEditParameter(profileImageUrl: originalPath) if isSuccess { - return owner.membersUseCase.executeReloadProfileImage(memberId: self.currentState.memberId, parameter: profileEditParameter) + return owner.updateProfileUseCase.execute(memberId: owner.currentState.memberId, parameter: profileEditParameter) .subscribe(on: ConcurrentDispatchQueueScheduler.init(qos: .background)) .asObservable() .flatMap { memberEntity -> Observable in @@ -119,7 +137,7 @@ public final class ProfileViewReactor: Reactor { }) case .viewWillAppear: - return membersUseCase.executeProfileMemberItems(memberId: currentState.memberId) + return fetchMembersProfileUseCase.execute(memberId: currentState.memberId) .asObservable() .withUnretained(self) .flatMap { owner ,entity -> Observable in @@ -135,20 +153,20 @@ public final class ProfileViewReactor: Reactor { let profileImageEditParameter: CameraDisplayImageParameters = CameraDisplayImageParameters(imageName: profileImage) return .concat( .just(.setLoading(false)), - membersUseCase.executeProfileImageURLCreate(parameter: profileImageEditParameter) + createProfilePresignedUseCase.execute(parameter: profileImageEditParameter) + .asObservable() .withUnretained(self) .subscribe(on: ConcurrentDispatchQueueScheduler.init(qos: .background)) - .asObservable() .flatMap { owner, entity -> Observable in guard let profilePresingedURL = entity?.imageURL else { return .empty() } - return owner.membersUseCase.executeProfileImageToPresingedUpload(to: profilePresingedURL, data: fileData) + return owner.uploadProfileImageUseCase.execute(to: profilePresingedURL, from: fileData) .subscribe(on: ConcurrentDispatchQueueScheduler.init(qos: .background)) .asObservable() .flatMap { isSuccess -> Observable in let originalPath = owner.configureProfileOriginalS3URL(url: profilePresingedURL) let profileEditParameter: ProfileImageEditParameter = ProfileImageEditParameter(profileImageUrl: originalPath) if isSuccess { - return owner.membersUseCase.executeReloadProfileImage(memberId: self.currentState.memberId, parameter: profileEditParameter) + return owner.updateProfileUseCase.execute(memberId: owner.currentState.memberId, parameter: profileEditParameter) .subscribe(on: ConcurrentDispatchQueueScheduler.init(qos: .background)) .asObservable() .flatMap { memberEntity -> Observable in @@ -169,7 +187,7 @@ public final class ProfileViewReactor: Reactor { ) case .didTapInitProfile: - return membersUseCase.executeDeleteProfileImage(memberId: memberId) + return fetchMembersProfileUseCase.execute(memberId: memberId) .asObservable() .flatMap { entity -> Observable in return .concat( diff --git a/14th-team5-iOS/Data/Sources/Account/AccountRepository/AccountRepository.swift b/14th-team5-iOS/Data/Sources/Account/AccountRepository/AccountRepository.swift index e1bfb6a1d..268c8c31e 100644 --- a/14th-team5-iOS/Data/Sources/Account/AccountRepository/AccountRepository.swift +++ b/14th-team5-iOS/Data/Sources/Account/AccountRepository/AccountRepository.swift @@ -25,7 +25,7 @@ public protocol AccountImpl: AnyObject { func appleLogin(with snsType: SNS, vc: UIViewController) -> Observable func executeNicknameUpdate(memberId: String, parameter: AccountNickNameEditParameter) -> Observable func signUp(name: String, date: String, photoURL: String?) -> Observable - func executePresignedImageURLCreate(parameter: CameraDisplayImageParameters) -> Observable + func executePresignedImageURLCreate(parameter: CameraDisplayImageParameters) -> Observable func executeProfileImageUpload(to url: String, data: Data) -> Observable } @@ -124,7 +124,7 @@ public final class AccountRepository: AccountImpl { .asObservable() } - public func executePresignedImageURLCreate(parameter: CameraDisplayImageParameters) -> Observable { + public func executePresignedImageURLCreate(parameter: CameraDisplayImageParameters) -> Observable { return profileWorker.createProfileImagePresingedURL(accessToken: accessToken, parameters: parameter) .compactMap { $0?.toDomain() } .asObservable() diff --git a/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraCreateRealEmojiResponseDTO.swift b/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraCreateRealEmojiResponseDTO.swift index 5070d8d18..36ac19e51 100644 --- a/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraCreateRealEmojiResponseDTO.swift +++ b/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraCreateRealEmojiResponseDTO.swift @@ -26,7 +26,7 @@ public struct CameraCreateRealEmojiResponseDTO: Decodable { extension CameraCreateRealEmojiResponseDTO { - public func toDomain() -> CameraCreateRealEmojiResponse { + public func toDomain() -> CameraCreateRealEmojiEntity { return .init( realEmojiId: realEmojiId, realEmojiType: realEmojiType, diff --git a/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraDisplayImageResponseDTO.swift b/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraDisplayImageResponseDTO.swift index c025b00d0..271ba073d 100644 --- a/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraDisplayImageResponseDTO.swift +++ b/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraDisplayImageResponseDTO.swift @@ -22,7 +22,7 @@ public struct CameraDisplayImageResponseDTO: Decodable { extension CameraDisplayImageResponseDTO { - public func toDomain() -> CameraDisplayImageResponse? { + public func toDomain() -> CameraPreSignedEntity? { return .init(imageURL: imageURL ?? "") } } diff --git a/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraDisplayPostResponseDTO.swift b/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraDisplayPostResponseDTO.swift index ba6c9fb10..606fe86a1 100644 --- a/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraDisplayPostResponseDTO.swift +++ b/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraDisplayPostResponseDTO.swift @@ -26,8 +26,7 @@ public struct CameraDisplayPostResponseDTO: Decodable { extension CameraDisplayPostResponseDTO { - public func toDomain() -> CameraDisplayPostResponse { - + public func toDomain() -> CameraPostEntity { return .init( postId: postId ?? "", authorId: authorId ?? "", @@ -39,6 +38,5 @@ extension CameraDisplayPostResponseDTO { content: content ?? "", createdAt: createdAt ) - } } diff --git a/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraRealEmojiImageItemResponseDTO.swift b/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraRealEmojiImageItemResponseDTO.swift index 894317fb3..35b3e369c 100644 --- a/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraRealEmojiImageItemResponseDTO.swift +++ b/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraRealEmojiImageItemResponseDTO.swift @@ -37,8 +37,8 @@ extension CameraRealEmojiImageItemResponseDTO { extension CameraRealEmojiImageItemResponseDTO { - func toDomain() -> [CameraRealEmojiImageItemResponse?] { - var items: [CameraRealEmojiImageItemResponse?] = Array(repeating: nil, count: 5) + func toDomain() -> [CameraRealEmojiImageItemEntity?] { + var items: [CameraRealEmojiImageItemEntity?] = Array(repeating: nil, count: 5) realEmojiItems.forEach { guard let emojiType = $0.realEmojiType.last else { @@ -51,7 +51,7 @@ extension CameraRealEmojiImageItemResponseDTO { } extension CameraRealEmojiImageItemResponseDTO.CameraRealEmojiInfoResponseDTO { - func toDomain() -> CameraRealEmojiImageItemResponse { + func toDomain() -> CameraRealEmojiImageItemEntity { return .init( realEmojiId: realEmojiId, realEmojiType: realEmojiType, diff --git a/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraRealEmojiPreSignedResponseDTO.swift b/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraRealEmojiPreSignedResponseDTO.swift index 01ede5f02..7fbfc2d41 100644 --- a/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraRealEmojiPreSignedResponseDTO.swift +++ b/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraRealEmojiPreSignedResponseDTO.swift @@ -22,7 +22,7 @@ public struct CameraRealEmojiPreSignedResponseDTO: Decodable { extension CameraRealEmojiPreSignedResponseDTO { - public func toDomain() -> CameraRealEmojiPreSignedResponse { + public func toDomain() -> CameraRealEmojiPreSignedEntity { return .init(imageURL: imageURL) } } diff --git a/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraTodayMissionResponseDTO.swift b/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraTodayMissionResponseDTO.swift index 2953b92a2..97de51ad7 100644 --- a/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraTodayMissionResponseDTO.swift +++ b/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraTodayMissionResponseDTO.swift @@ -25,7 +25,7 @@ public struct CameraTodayMissionResponseDTO: Decodable { extension CameraTodayMissionResponseDTO { - func toDomain() -> CameraTodayMissionResponse { + func toDomain() -> CameraTodayMssionEntity { return .init( missionDate: missionDate.toDate(with: "yyyy-MM-dd"), missionId: missionId, diff --git a/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraUpdateRealEmojiResponseDTO.swift b/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraUpdateRealEmojiResponseDTO.swift index d44590741..dbbc254f9 100644 --- a/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraUpdateRealEmojiResponseDTO.swift +++ b/14th-team5-iOS/Data/Sources/Camera/DataMapping/CameraUpdateRealEmojiResponseDTO.swift @@ -25,7 +25,7 @@ public struct CameraUpdateRealEmojiResponseDTO: Decodable { } extension CameraUpdateRealEmojiResponseDTO { - public func toDomain() -> CameraUpdateRealEmojiResponse { + public func toDomain() -> CameraUpdateRealEmojiEntity { return .init( realEmojiId: realEmojiId, realEmojiType: realEmojiType, diff --git a/14th-team5-iOS/Data/Sources/Camera/Repository/CameraRepository.swift b/14th-team5-iOS/Data/Sources/Camera/Repository/CameraRepository.swift index 295abf277..74c28d799 100644 --- a/14th-team5-iOS/Data/Sources/Camera/Repository/CameraRepository.swift +++ b/14th-team5-iOS/Data/Sources/Camera/Repository/CameraRepository.swift @@ -26,82 +26,56 @@ public final class CameraRepository { extension CameraRepository: CameraRepositoryProtocol { - public func toggleCameraPosition(_ isState: Bool) -> Observable { - return Observable - .create { observer in - observer.onNext(!isState) - - return Disposables.create() - } - } - - - public func toggleCameraFlash(_ isState: Bool) -> Observable { - return Observable - .create { observer in - observer.onNext(!isState) - return Disposables.create() - } - } - public func combineWithTextImage(parameters: CameraDisplayPostParameters, query:CameraMissionFeedQuery) -> Observable { + public func combineWithTextImage(parameters: CameraDisplayPostParameters, query:CameraMissionFeedQuery) -> Single { return cameraAPIWorker.combineWithTextImageUpload(accessToken: accessToken, parameters: parameters, query: query) .map { $0?.toDomain() } .catchAndReturn(nil) - .asObservable() } - public func fetchPresignedeImageURL(parameters: CameraDisplayImageParameters) -> Observable { + public func addPresignedeImageURL(parameters: CameraDisplayImageParameters) -> Single { return cameraAPIWorker.createProfilePresignedURL(accessToken: accessToken, parameters: parameters) - .compactMap { $0?.toDomain() } - .asObservable() + .map { $0?.toDomain() } } - public func uploadImageToS3(toURL url: String, imageData: Data) -> Observable { + public func uploadImageToS3(to url: String, from imageData: Data) -> Single { return cameraAPIWorker.uploadImageToPresignedURL(accessToken: accessToken, toURL: url, withImageData: imageData) - .asObservable() } - public func editProfleImageToS3(memberId: String, parameter: ProfileImageEditParameter) -> Observable { + public func editProfleImageToS3(memberId: String, parameter: ProfileImageEditParameter) -> Single { return cameraAPIWorker.editProfileImageToS3(accessToken: accessToken, memberId: memberId, parameters: parameter) .do { guard let userEntity = $0?.toProfileEntity() else { return } FamilyUserDefaults.saveMemberToUserDefaults(familyMember: userEntity) } - .compactMap { $0?.toDomain() } - .asObservable() + .map { $0?.toDomain() } } - public func fetchRealEmojiImageURL(memberId: String, parameters: CameraRealEmojiParameters) -> Observable { + public func fetchRealEmojiImageURL(memberId: String, parameters: CameraRealEmojiParameters) -> Single { return cameraAPIWorker.createRealEmojiPresignedURL(accessToken: accessToken, memberId: memberId, parameters: parameters) - .compactMap { $0?.toDomain() } - .asObservable() + .map { $0?.toDomain() } } - public func uploadRealEmojiImageToS3(memberId: String, parameters: CameraCreateRealEmojiParameters) -> Observable { + public func uploadRealEmojiImageToS3(memberId: String, parameters: CameraCreateRealEmojiParameters) -> Single { return cameraAPIWorker.uploadRealEmojiImageToS3(accessToken: accessToken, memberId: memberId, parameters: parameters) - .compactMap { $0?.toDomain() } - .asObservable() + .map { $0?.toDomain() } } - public func fetchRealEmojiItems(memberId: String) -> Observable<[CameraRealEmojiImageItemResponse?]> { + public func fetchRealEmojiItems(memberId: String) -> Single<[CameraRealEmojiImageItemEntity?]> { return cameraAPIWorker.loadRealEmojiImage(accessToken: accessToken, memberId: memberId) - .compactMap { $0?.toDomain() } - .asObservable() + .map { $0?.toDomain() ?? [] } } - public func updateRealEmojiImage(memberId: String, realEmojiId: String, parameters: CameraUpdateRealEmojiParameters) -> Observable { + public func updateRealEmojiImage(memberId: String, realEmojiId: String, parameters: CameraUpdateRealEmojiParameters) -> Single { return cameraAPIWorker.updateRealEmojiImage(accessToken: accessToken, memberId: memberId, realEmojiId: realEmojiId, parameters: parameters) - .compactMap { $0?.toDomain() } - .asObservable() + .map { $0?.toDomain() } } - public func fetchTodayMissionItem() -> Observable { + public func fetchTodayMissionItem() -> Single { return cameraAPIWorker.fetchMissionItems(accessToken: accessToken) - .compactMap { $0?.toDomain() } - .asObservable() + .map { $0?.toDomain() } } } diff --git a/14th-team5-iOS/Data/Sources/Members/DataMapping/MembersProfileResponseDTO.swift b/14th-team5-iOS/Data/Sources/Members/DataMapping/MembersProfileResponseDTO.swift index ba5d305a5..c662434d9 100644 --- a/14th-team5-iOS/Data/Sources/Members/DataMapping/MembersProfileResponseDTO.swift +++ b/14th-team5-iOS/Data/Sources/Members/DataMapping/MembersProfileResponseDTO.swift @@ -21,7 +21,7 @@ struct MembersProfileResponseDTO: Decodable { extension MembersProfileResponseDTO { //MARK: 프로필 정보 Entity - func toDomain() -> MembersProfileResponse { + func toDomain() -> MembersProfileEntity { return .init( memberId: memberId, memberName: name, diff --git a/14th-team5-iOS/Data/Sources/Members/Repositories/MembersRepository.swift b/14th-team5-iOS/Data/Sources/Members/Repositories/MembersRepository.swift index f37ad58bf..4ae2a612c 100644 --- a/14th-team5-iOS/Data/Sources/Members/Repositories/MembersRepository.swift +++ b/14th-team5-iOS/Data/Sources/Members/Repositories/MembersRepository.swift @@ -24,28 +24,14 @@ public final class MembersRepository { extension MembersRepository: MembersRepositoryProtocol { - - public func fetchProfileMemberItems(memberId: String) -> Observable { + + public func fetchProfileMemberItems(memberId: String) -> Single { return membersAPIWorker.fetchProfileMember(accessToken: accessToken, memberId: memberId) .map { $0?.toDomain() } .catchAndReturn(nil) - .asObservable() - } - - - public func fetchProfileAlbumImageURL(parameter: CameraDisplayImageParameters) -> Observable { - return membersAPIWorker.createProfileImagePresingedURL(accessToken: accessToken, parameters: parameter) - .compactMap { $0?.toDomain() } - .asObservable() - } - - - public func uploadProfileImageToPresingedURL(to url: String, imageData: Data) -> Observable { - return membersAPIWorker.uploadToProfilePresingedURL(accessToken: accessToken, toURL: url, with: imageData) - .asObservable() } - public func updataProfileImageToS3(memberId: String, parameter: ProfileImageEditParameter) -> Observable { + public func updataProfileImageToS3(memberId: String, parameter: ProfileImageEditParameter) -> Single { return membersAPIWorker.updateProfileAlbumImageToS3(accessToken: accessToken, memberId: memberId, parameter: parameter) .do { guard let userEntity = $0?.toProfileEntity() else { return } @@ -53,10 +39,9 @@ extension MembersRepository: MembersRepositoryProtocol { } .map { $0?.toDomain() } .catchAndReturn(nil) - .asObservable() } - public func deleteProfileImageToS3(memberId: String) -> Observable { + public func deleteProfileImageToS3(memberId: String) -> Single { return membersAPIWorker.deleteProfileImageToS3(accessToken: accessToken, memberId: memberId) .do { guard let userEntity = $0?.toProfileEntity() else { return } @@ -64,7 +49,6 @@ extension MembersRepository: MembersRepositoryProtocol { } .map { $0?.toDomain() } .catchAndReturn(nil) - .asObservable() } } diff --git a/14th-team5-iOS/Data/Sources/Mission/DataMapping/GetTodayMissionResponseDTO.swift b/14th-team5-iOS/Data/Sources/Mission/DataMapping/GetTodayMissionResponseDTO.swift deleted file mode 100644 index acfd41b4c..000000000 --- a/14th-team5-iOS/Data/Sources/Mission/DataMapping/GetTodayMissionResponseDTO.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// GetTodayMissionResponseDTO.swift -// Data -// -// Created by Kim dohyun on 6/6/24. -// - -import Foundation - -import Domain - -struct GetTodayMissionResponseDTO: Codable { - let date: String - let id: String - let content: String - - func toDomain() -> TodayMissionResponse { - return .init(id: id, content: content) - } -} diff --git a/14th-team5-iOS/Data/Sources/Mission/DataMapping/MissionContentResponseDTO.swift b/14th-team5-iOS/Data/Sources/Mission/DataMapping/MissionContentResponseDTO.swift index b2b2e9280..3d255a50f 100644 --- a/14th-team5-iOS/Data/Sources/Mission/DataMapping/MissionContentResponseDTO.swift +++ b/14th-team5-iOS/Data/Sources/Mission/DataMapping/MissionContentResponseDTO.swift @@ -21,7 +21,7 @@ struct MissionContentResponseDTO: Decodable { } extension MissionContentResponseDTO { - func toDomain() -> MissionContentResponse { + func toDomain() -> MissionContentEntity { return .init( missionId: missionId, missionContent: missionContent diff --git a/14th-team5-iOS/Data/Sources/Mission/MissionAPI/MissionAPIWorker.swift b/14th-team5-iOS/Data/Sources/Mission/MissionAPI/MissionAPIWorker.swift index 821754e78..d3679fd2b 100644 --- a/14th-team5-iOS/Data/Sources/Mission/MissionAPI/MissionAPIWorker.swift +++ b/14th-team5-iOS/Data/Sources/Mission/MissionAPI/MissionAPIWorker.swift @@ -27,33 +27,7 @@ extension MissionAPIs { } extension MissionAPIWorker { - private func getTodayMission(headers: [APIHeader]?) -> Single { - let spec = MissionAPIs.getTodayMission.spec - - return request(spec: spec, headers: headers) - .subscribe(on: Self.queue) - .do { - if let str = String(data: $0.1, encoding: .utf8) { - debugPrint("Join Family Result: \(str)") - } - } - .map(GetTodayMissionResponseDTO.self) - .catchAndReturn(nil) - .map { $0?.toDomain() } - .asSingle() - } - - func getTodayMission() -> Single { - return Observable.just(()) - .withLatestFrom(self._headers) - .observe(on: Self.queue) - .withUnretained(self) - .flatMap { $0.0.getTodayMission(headers: $0.1) } - .asSingle() - } - - - private func getMissionContent(spec: APISpec, headers: [APIHeader]?) -> Single { + private func getMissionContent(spec: APISpec, headers: [APIHeader]?) -> Single { return request(spec: spec, headers: headers) .subscribe(on: Self.queue) .do { @@ -68,7 +42,7 @@ extension MissionAPIWorker { } - func getMissionContent(missionId: String) -> Single { + func getMissionContent(missionId: String) -> Single { let spec = MissionAPIs.getMissionContent(missionId).spec return Observable.just(()) diff --git a/14th-team5-iOS/Data/Sources/Mission/Repository/MissionRepository.swift b/14th-team5-iOS/Data/Sources/Mission/Repository/MissionRepository.swift index f4eabce61..90d24b30e 100644 --- a/14th-team5-iOS/Data/Sources/Mission/Repository/MissionRepository.swift +++ b/14th-team5-iOS/Data/Sources/Mission/Repository/MissionRepository.swift @@ -15,20 +15,39 @@ import RxSwift public final class MissionRepository: MissionRepositoryProtocol { public let disposeBag: DisposeBag = DisposeBag() + private let lastMissionUploadDateId = "lastMissionUploadDateId" private let missionAPIWorker: MissionAPIWorker = MissionAPIWorker() public init() { } } extension MissionRepository { - public func getTodayMission() -> Observable { - return missionAPIWorker.getTodayMission() - .asObservable() + + public func getMissionContent(missionId: String) -> Single { + return missionAPIWorker.getMissionContent(missionId: missionId) } - public func getMissionContent(missionId: String) -> Observable { - return missionAPIWorker.getMissionContent(missionId: missionId) - .asObservable() + public func isAlreadyShowMissionAlert() -> Observable { + guard let lastDate = UserDefaults.standard.string(forKey: lastMissionUploadDateId) else { + saveMissionUploadDate() + return .just(false) + } + + if lastDate == Date().toFormatString(with: "yyyy-MM-dd") { + return .just(true) + } else { + saveMissionUploadDate() + return .just(false) + } } + private func saveMissionUploadDate() { + let isoDateFormatter = ISO8601DateFormatter() + isoDateFormatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds] + + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyy-MM-dd" + let extractedDate = dateFormatter.string(from: Date()) + UserDefaults.standard.set(extractedDate, forKey: lastMissionUploadDateId) + } } diff --git a/14th-team5-iOS/Data/Sources/Post/PostList/DataMapping/PostListResponseDTO.swift b/14th-team5-iOS/Data/Sources/Post/PostList/DataMapping/PostListResponseDTO.swift index 194466c27..e97e127da 100644 --- a/14th-team5-iOS/Data/Sources/Post/PostList/DataMapping/PostListResponseDTO.swift +++ b/14th-team5-iOS/Data/Sources/Post/PostList/DataMapping/PostListResponseDTO.swift @@ -47,7 +47,7 @@ struct PostListResponseDTO: Codable { } extension PostListResponseDTO { - func toDomain() -> PostListPage { + func toDomain() -> PostListPageEntity { return .init(isLast: !hasNext, postLists: results.map { $0.toDomain() }) } } diff --git a/14th-team5-iOS/Data/Sources/Post/PostList/PostAPI/PostListAPIWorker.swift b/14th-team5-iOS/Data/Sources/Post/PostList/PostAPI/PostListAPIWorker.swift index 0cb3928b1..c8a2d4d32 100644 --- a/14th-team5-iOS/Data/Sources/Post/PostList/PostAPI/PostListAPIWorker.swift +++ b/14th-team5-iOS/Data/Sources/Post/PostList/PostAPI/PostListAPIWorker.swift @@ -28,7 +28,7 @@ extension PostAPIs { } extension PostAPIWorker { - public func fetchTodayPostList(query: Domain.PostListQuery) -> RxSwift.Single { + public func fetchTodayPostList(query: Domain.PostListQuery) -> RxSwift.Single { let requestDTO = PostListRequestDTO(page: query.page, size: query.size, date: query.date, memberId: query.memberId, sort: query.sort, type: query.type.rawValue) let spec = PostAPIs.fetchPostList.spec return request(spec: spec, parameters: requestDTO) diff --git a/14th-team5-iOS/Data/Sources/Post/PostList/Repository/PostRepository.swift b/14th-team5-iOS/Data/Sources/Post/PostList/Repository/PostRepository.swift index 58433c087..da6a4aa15 100644 --- a/14th-team5-iOS/Data/Sources/Post/PostList/Repository/PostRepository.swift +++ b/14th-team5-iOS/Data/Sources/Post/PostList/Repository/PostRepository.swift @@ -17,7 +17,7 @@ public final class PostRepository: PostListRepositoryProtocol { public init() { } - public func fetchTodayPostList(query: Domain.PostListQuery) -> RxSwift.Single { + public func fetchTodayPostList(query: Domain.PostListQuery) -> RxSwift.Single { return postAPIWorker.fetchTodayPostList(query: query) } } diff --git a/14th-team5-iOS/Data/Sources/UserDefaults/MissionUserDefaultsRepository.swift b/14th-team5-iOS/Data/Sources/UserDefaults/MissionUserDefaultsRepository.swift deleted file mode 100644 index 262f41de9..000000000 --- a/14th-team5-iOS/Data/Sources/UserDefaults/MissionUserDefaultsRepository.swift +++ /dev/null @@ -1,43 +0,0 @@ -// -// MissionUserDefaultsRepository.swift -// Data -// -// Created by 마경미 on 03.06.24. -// - -import Foundation - -import Domain - -import RxSwift - -public final class MissionUserDefaultsRepository: MissionUserdefaultsRepositoryProtocol { - - private let lastMissionUploadDateId = "lastMissionUploadDateId" - - public init() { } - - public func isAlreadyShowMissionAlert() -> Observable { - guard let lastDate = UserDefaults.standard.string(forKey: lastMissionUploadDateId) else { - saveMissionUploadDate() - return .just(false) - } - - if lastDate == Date().toFormatString(with: "yyyy-MM-dd") { - return .just(true) - } else { - saveMissionUploadDate() - return .just(false) - } - } - - private func saveMissionUploadDate() { - let isoDateFormatter = ISO8601DateFormatter() - isoDateFormatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds] - - let dateFormatter = DateFormatter() - dateFormatter.dateFormat = "yyyy-MM-dd" - let extractedDate = dateFormatter.string(from: Date()) - UserDefaults.standard.set(extractedDate, forKey: lastMissionUploadDateId) - } -} diff --git a/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraUpdateRealEmojiResponse.swift b/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraCreateRealEmojiEntity.swift similarity index 53% rename from 14th-team5-iOS/Domain/Sources/Camera/Entity/CameraUpdateRealEmojiResponse.swift rename to 14th-team5-iOS/Domain/Sources/Camera/Entity/CameraCreateRealEmojiEntity.swift index 3dd1bc954..b5bb2446e 100644 --- a/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraUpdateRealEmojiResponse.swift +++ b/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraCreateRealEmojiEntity.swift @@ -1,23 +1,22 @@ // -// CameraUpdateRealEmojiResponse.swift +// CameraCreateRealEmojiEntity.swift // Domain // -// Created by Kim dohyun on 1/24/24. +// Created by Kim dohyun on 6/14/24. // import Foundation -public struct CameraUpdateRealEmojiResponse { - public var realEmojiId: String - public var realEmojiType: String - public var realEmojiImageURL: URL +public struct CameraCreateRealEmojiEntity { + public let realEmojiId: String + public let realEmojiType: String + public let realEmojiImageURL: URL + public init(realEmojiId: String, realEmojiType: String, realEmojiImageURL: URL) { self.realEmojiId = realEmojiId self.realEmojiType = realEmojiType self.realEmojiImageURL = realEmojiImageURL } - - } diff --git a/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraDisplayImageResponse.swift b/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraDisplayImageResponse.swift deleted file mode 100644 index 58a8a32fc..000000000 --- a/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraDisplayImageResponse.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// CameraDisplayImageResponse.swift -// Domain -// -// Created by Kim dohyun on 12/21/23. -// - -import Foundation - - -public struct CameraDisplayImageResponse { - - public var imageURL: String - - public init(imageURL: String) { - self.imageURL = imageURL - } - -} diff --git a/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraDisplayPostResponse.swift b/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraPostEntity.swift similarity index 60% rename from 14th-team5-iOS/Domain/Sources/Camera/Entity/CameraDisplayPostResponse.swift rename to 14th-team5-iOS/Domain/Sources/Camera/Entity/CameraPostEntity.swift index e4e1b6fcc..1b613a305 100644 --- a/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraDisplayPostResponse.swift +++ b/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraPostEntity.swift @@ -1,23 +1,22 @@ // -// CameraDisplayPostResponse.swift +// CameraPostEntity.swift // Domain // -// Created by Kim dohyun on 12/22/23. +// Created by Kim dohyun on 6/14/24. // import Foundation - -public struct CameraDisplayPostResponse { - public var postId: String - public var authorId: String - public var commentCount: Int - public var missionType: String - public var missionId: String - public var emojiCount: Int - public var imageURL: String - public var content: String - public var createdAt: String +public struct CameraPostEntity { + public let postId: String + public let authorId: String + public let commentCount: Int + public let missionType: String + public let missionId: String + public let emojiCount: Int + public let imageURL: String + public let content: String + public let createdAt: String public init( postId: String, @@ -40,5 +39,4 @@ public struct CameraDisplayPostResponse { self.content = content self.createdAt = createdAt } - } diff --git a/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraPreSignedEntity.swift b/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraPreSignedEntity.swift new file mode 100644 index 000000000..d1f545b63 --- /dev/null +++ b/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraPreSignedEntity.swift @@ -0,0 +1,16 @@ +// +// CameraPreSignedEntity.swift +// Domain +// +// Created by Kim dohyun on 6/13/24. +// + +import Foundation + +public struct CameraPreSignedEntity { + public let imageURL: String + + public init(imageURL: String) { + self.imageURL = imageURL + } +} diff --git a/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraCreateRealEmojiResponse.swift b/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraRealEmojiImageItemEntity.swift similarity index 53% rename from 14th-team5-iOS/Domain/Sources/Camera/Entity/CameraCreateRealEmojiResponse.swift rename to 14th-team5-iOS/Domain/Sources/Camera/Entity/CameraRealEmojiImageItemEntity.swift index 58507ec2b..2d9abccf3 100644 --- a/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraCreateRealEmojiResponse.swift +++ b/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraRealEmojiImageItemEntity.swift @@ -1,18 +1,17 @@ // -// CameraCreateRealEmojiResponse.swift +// CameraRealEmojiImageItemEntity.swift // Domain // -// Created by Kim dohyun on 1/22/24. +// Created by Kim dohyun on 6/14/24. // import Foundation -public struct CameraCreateRealEmojiResponse { - public var realEmojiId: String - public var realEmojiType: String - public var realEmojiImageURL: URL - +public struct CameraRealEmojiImageItemEntity: Hashable { + public let realEmojiId: String + public let realEmojiType: String + public let realEmojiImageURL: URL public init(realEmojiId: String, realEmojiType: String, realEmojiImageURL: URL) { self.realEmojiId = realEmojiId @@ -20,5 +19,4 @@ public struct CameraCreateRealEmojiResponse { self.realEmojiImageURL = realEmojiImageURL } - } diff --git a/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraRealEmojiPreSignedEntity.swift b/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraRealEmojiPreSignedEntity.swift new file mode 100644 index 000000000..a9ec296e7 --- /dev/null +++ b/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraRealEmojiPreSignedEntity.swift @@ -0,0 +1,16 @@ +// +// CameraRealEmojiPreSignedEntity.swift +// Domain +// +// Created by Kim dohyun on 6/14/24. +// + +import Foundation + +public struct CameraRealEmojiPreSignedEntity { + public let imageURL: String + + public init(imageURL: String) { + self.imageURL = imageURL + } +} diff --git a/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraRealEmojiPreSignedResponse.swift b/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraRealEmojiPreSignedResponse.swift deleted file mode 100644 index e0b46284c..000000000 --- a/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraRealEmojiPreSignedResponse.swift +++ /dev/null @@ -1,17 +0,0 @@ -// -// CameraRealEmojiPreSignedResponse.swift -// Domain -// -// Created by Kim dohyun on 1/22/24. -// - -import Foundation - - -public struct CameraRealEmojiPreSignedResponse { - public var imageURL: String - - public init(imageURL: String) { - self.imageURL = imageURL - } -} diff --git a/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraTodayMissionResponse.swift b/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraTodayMissionResponse.swift deleted file mode 100644 index 8df01d15b..000000000 --- a/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraTodayMissionResponse.swift +++ /dev/null @@ -1,22 +0,0 @@ -// -// CameraTodayMissionResponse.swift -// Domain -// -// Created by Kim dohyun on 4/30/24. -// - -import Foundation - - -public struct CameraTodayMissionResponse { - public var missionDate: Date - public var missionId: String - public var missionContent: String - - public init(missionDate: Date, missionId: String, missionContent: String) { - self.missionDate = missionDate - self.missionId = missionId - self.missionContent = missionContent - } - -} diff --git a/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraTodayMssionEntity.swift b/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraTodayMssionEntity.swift new file mode 100644 index 000000000..b93dfa8d8 --- /dev/null +++ b/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraTodayMssionEntity.swift @@ -0,0 +1,21 @@ +// +// CameraTodayMssionEntity.swift +// Domain +// +// Created by Kim dohyun on 6/14/24. +// + +import Foundation + + +public struct CameraTodayMssionEntity { + public let missionDate: Date + public let missionId: String + public let missionContent: String + + public init(missionDate: Date, missionId: String, missionContent: String) { + self.missionDate = missionDate + self.missionId = missionId + self.missionContent = missionContent + } +} diff --git a/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraRealEmojiImageItemResponse.swift b/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraUpdateRealEmojiEntity.swift similarity index 51% rename from 14th-team5-iOS/Domain/Sources/Camera/Entity/CameraRealEmojiImageItemResponse.swift rename to 14th-team5-iOS/Domain/Sources/Camera/Entity/CameraUpdateRealEmojiEntity.swift index 8f077fed6..644477508 100644 --- a/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraRealEmojiImageItemResponse.swift +++ b/14th-team5-iOS/Domain/Sources/Camera/Entity/CameraUpdateRealEmojiEntity.swift @@ -1,18 +1,17 @@ // -// CameraRealEmojiImageItemResponse.swift +// CameraUpdateRealEmojiEntity.swift // Domain // -// Created by Kim dohyun on 1/22/24. +// Created by Kim dohyun on 6/14/24. // import Foundation -import Core -public struct CameraRealEmojiImageItemResponse: Hashable { - public var realEmojiId: String - public var realEmojiType: String - public var realEmojiImageURL: URL +public struct CameraUpdateRealEmojiEntity { + public let realEmojiId: String + public let realEmojiType: String + public let realEmojiImageURL: URL public init(realEmojiId: String, realEmojiType: String, realEmojiImageURL: URL) { self.realEmojiId = realEmojiId diff --git a/14th-team5-iOS/Domain/Sources/Camera/Interfaces/CameraRepositoryProtocol.swift b/14th-team5-iOS/Domain/Sources/Camera/Interfaces/CameraRepositoryProtocol.swift index a44fc1e30..b2c0082a2 100644 --- a/14th-team5-iOS/Domain/Sources/Camera/Interfaces/CameraRepositoryProtocol.swift +++ b/14th-team5-iOS/Domain/Sources/Camera/Interfaces/CameraRepositoryProtocol.swift @@ -68,16 +68,14 @@ public protocol CameraRepositoryProtocol { var disposeBag: DisposeBag { get } var accessToken: String { get } - - func toggleCameraPosition(_ isState: Bool) -> Observable - func toggleCameraFlash(_ isState: Bool) -> Observable - func fetchPresignedeImageURL(parameters: CameraDisplayImageParameters) -> Observable - func uploadImageToS3(toURL url: String, imageData: Data) -> Observable - func editProfleImageToS3(memberId: String, parameter: ProfileImageEditParameter) -> Observable - func fetchRealEmojiImageURL(memberId: String, parameters: CameraRealEmojiParameters) -> Observable - func uploadRealEmojiImageToS3(memberId: String, parameters: CameraCreateRealEmojiParameters) -> Observable - func fetchRealEmojiItems(memberId: String) -> Observable<[CameraRealEmojiImageItemResponse?]> - func updateRealEmojiImage(memberId: String, realEmojiId: String, parameters: CameraUpdateRealEmojiParameters) -> Observable - func fetchTodayMissionItem() -> Observable - func combineWithTextImage(parameters: CameraDisplayPostParameters, query: CameraMissionFeedQuery) -> Observable + + func addPresignedeImageURL(parameters: CameraDisplayImageParameters) -> Single + func uploadImageToS3(to url: String, from image: Data) -> Single + func editProfleImageToS3(memberId: String, parameter: ProfileImageEditParameter) -> Single + func fetchRealEmojiImageURL(memberId: String, parameters: CameraRealEmojiParameters) -> Single + func uploadRealEmojiImageToS3(memberId: String, parameters: CameraCreateRealEmojiParameters) -> Single + func fetchRealEmojiItems(memberId: String) -> Single<[CameraRealEmojiImageItemEntity?]> + func updateRealEmojiImage(memberId: String, realEmojiId: String, parameters: CameraUpdateRealEmojiParameters) -> Single + func fetchTodayMissionItem() -> Single + func combineWithTextImage(parameters: CameraDisplayPostParameters, query: CameraMissionFeedQuery) -> Single } diff --git a/14th-team5-iOS/Domain/Sources/Camera/UseCases/Camera/CreateCameraImageUseCase.swift b/14th-team5-iOS/Domain/Sources/Camera/UseCases/Camera/CreateCameraImageUseCase.swift new file mode 100644 index 000000000..345f244df --- /dev/null +++ b/14th-team5-iOS/Domain/Sources/Camera/UseCases/Camera/CreateCameraImageUseCase.swift @@ -0,0 +1,29 @@ +// +// CreateCameraImageUseCase.swift +// Domain +// +// Created by Kim dohyun on 6/14/24. +// + +import Foundation + +import RxSwift +import RxCocoa + + +public protocol CreateCameraImageUseCaseProtocol { + func execute(parameter: CameraDisplayPostParameters, query: CameraMissionFeedQuery) -> Single +} + +public final class CreateCameraImageUseCase: CreateCameraImageUseCaseProtocol { + + private let cameraRepository: any CameraRepositoryProtocol + + public init(cameraRepository: any CameraRepositoryProtocol) { + self.cameraRepository = cameraRepository + } + + public func execute(parameter: CameraDisplayPostParameters, query: CameraMissionFeedQuery) -> Single { + return cameraRepository.combineWithTextImage(parameters: parameter, query: query) + } +} diff --git a/14th-team5-iOS/Domain/Sources/Camera/UseCases/Camera/CreateCameraUseCase.swift b/14th-team5-iOS/Domain/Sources/Camera/UseCases/Camera/CreateCameraUseCase.swift new file mode 100644 index 000000000..94b63f228 --- /dev/null +++ b/14th-team5-iOS/Domain/Sources/Camera/UseCases/Camera/CreateCameraUseCase.swift @@ -0,0 +1,32 @@ +// +// CreateCameraUseCase.swift +// Domain +// +// Created by Kim dohyun on 6/13/24. +// + +import Foundation + +import RxSwift +import RxCocoa + +public protocol CreateCameraUseCaseProtocol { + func execute(parameter: CameraDisplayImageParameters) -> Single +} + + +// Camera Presigned URL 생성 UseCase +public final class CreateCameraUseCase: CreateCameraUseCaseProtocol { + + private let cameraRepository: any CameraRepositoryProtocol + + public init(cameraRepository: any CameraRepositoryProtocol) { + self.cameraRepository = cameraRepository + } + + public func execute(parameter: CameraDisplayImageParameters) -> RxSwift.Single { + return cameraRepository.addPresignedeImageURL(parameters: parameter) + } +} + + diff --git a/14th-team5-iOS/Domain/Sources/Camera/UseCases/Camera/FetchCameraUploadImageUseCase.swift b/14th-team5-iOS/Domain/Sources/Camera/UseCases/Camera/FetchCameraUploadImageUseCase.swift new file mode 100644 index 000000000..913ece64b --- /dev/null +++ b/14th-team5-iOS/Domain/Sources/Camera/UseCases/Camera/FetchCameraUploadImageUseCase.swift @@ -0,0 +1,30 @@ +// +// FetchCameraUploadImageUseCase.swift +// Domain +// +// Created by Kim dohyun on 6/15/24. +// + +import Foundation + +import RxSwift +import RxCocoa + + +public protocol FetchCameraUploadImageUseCaseProtocol { + func execute(to url: String, from image: Data) -> Single +} + + +public final class FetchCameraUploadImageUseCase: FetchCameraUploadImageUseCaseProtocol { + + private let cameraRepository: any CameraRepositoryProtocol + + public init(cameraRepository: any CameraRepositoryProtocol) { + self.cameraRepository = cameraRepository + } + + public func execute(to url: String, from image: Data) -> Single { + return cameraRepository.uploadImageToS3(to: url, from: image) + } +} diff --git a/14th-team5-iOS/Domain/Sources/Camera/UseCases/CameraDisplayViewUseCase.swift b/14th-team5-iOS/Domain/Sources/Camera/UseCases/CameraDisplayViewUseCase.swift deleted file mode 100644 index 989726189..000000000 --- a/14th-team5-iOS/Domain/Sources/Camera/UseCases/CameraDisplayViewUseCase.swift +++ /dev/null @@ -1,47 +0,0 @@ -// -// CameraDisplayViewUseCase.swift -// Domain -// -// Created by Kim dohyun on 12/26/23. -// - -import Foundation - -import RxSwift -import RxCocoa - - -public protocol CameraDisplayViewUseCaseProtocol { - func executeDisplayImageURL(parameters: CameraDisplayImageParameters) -> Observable - func executeUploadToS3(toURL url: String, imageData: Data) -> Observable - func executeCombineWithTextImage(parameters: CameraDisplayPostParameters, query: CameraMissionFeedQuery) -> Observable - -} - - -public final class CameraDisplayViewUseCase: CameraDisplayViewUseCaseProtocol { - - private let cameraDisplayViewRepository: CameraRepositoryProtocol - - public init(cameraDisplayViewRepository: CameraRepositoryProtocol) { - self.cameraDisplayViewRepository = cameraDisplayViewRepository - } - - public func executeDisplayImageURL(parameters: CameraDisplayImageParameters) -> Observable { - return cameraDisplayViewRepository.fetchPresignedeImageURL(parameters: parameters) - } - - public func executeUploadToS3(toURL url: String, imageData: Data) -> Observable { - return cameraDisplayViewRepository.uploadImageToS3(toURL: url, imageData: imageData) - } - - public func executeCombineWithTextImage(parameters: CameraDisplayPostParameters, query: CameraMissionFeedQuery) -> Observable { - return cameraDisplayViewRepository.combineWithTextImage(parameters: parameters, query: query) - } - - - - - - -} diff --git a/14th-team5-iOS/Domain/Sources/Camera/UseCases/CameraViewUseCase.swift b/14th-team5-iOS/Domain/Sources/Camera/UseCases/CameraViewUseCase.swift deleted file mode 100644 index 91c5f798e..000000000 --- a/14th-team5-iOS/Domain/Sources/Camera/UseCases/CameraViewUseCase.swift +++ /dev/null @@ -1,78 +0,0 @@ -// -// CameraViewUseCase.swift -// Domain -// -// Created by Kim dohyun on 12/26/23. -// - -import Foundation - -import RxSwift -import RxCocoa - - -public protocol CameraViewUseCaseProtocol { - func executeToggleCameraPosition(_ isState: Bool) -> Observable - func executeToggleCameraFlash(_ isState: Bool) -> Observable - func executeProfileImageURL(parameter: CameraDisplayImageParameters) -> Observable - func executeUploadToS3(toURL url: String, imageData: Data) -> Observable - func executeEditProfileImage(memberId: String, parameter: ProfileImageEditParameter) -> Observable - func executeRealEmojiImageURL(memberId: String, parameter: CameraRealEmojiParameters) -> Observable - func executeRealEmojiUploadToS3(memberId: String, parameter: CameraCreateRealEmojiParameters) -> Observable - func executeRealEmojiItems(memberId: String) -> Observable<[CameraRealEmojiImageItemResponse?]> - func executeUpdateRealEmojiImage(memberId: String, realEmojiId: String ,parameter: CameraUpdateRealEmojiParameters) -> Observable - func executeTodayMission() -> Observable -} - - - -public final class CameraViewUseCase: CameraViewUseCaseProtocol { - - private let cameraRepository: CameraRepositoryProtocol - - public init(cameraRepository: CameraRepositoryProtocol) { - self.cameraRepository = cameraRepository - } - - public func executeToggleCameraPosition(_ isState: Bool) -> Observable { - return cameraRepository.toggleCameraPosition(isState) - } - - public func executeToggleCameraFlash(_ isState: Bool) -> Observable { - return cameraRepository.toggleCameraFlash(isState) - } - - public func executeProfileImageURL(parameter: CameraDisplayImageParameters) -> Observable { - return cameraRepository.fetchPresignedeImageURL(parameters: parameter) - } - - public func executeUploadToS3(toURL url: String, imageData: Data) -> Observable { - return cameraRepository.uploadImageToS3(toURL: url, imageData: imageData) - } - - public func executeEditProfileImage(memberId: String, parameter: ProfileImageEditParameter) -> Observable { - return cameraRepository.editProfleImageToS3(memberId: memberId, parameter: parameter) - } - - public func executeRealEmojiImageURL(memberId: String, parameter: CameraRealEmojiParameters) -> Observable { - return cameraRepository.fetchRealEmojiImageURL(memberId: memberId, parameters: parameter) - } - - public func executeRealEmojiUploadToS3(memberId: String, parameter: CameraCreateRealEmojiParameters) -> Observable { - return cameraRepository.uploadRealEmojiImageToS3(memberId: memberId, parameters: parameter) - } - - - public func executeRealEmojiItems(memberId: String) -> Observable<[CameraRealEmojiImageItemResponse?]> { - return cameraRepository.fetchRealEmojiItems(memberId: memberId) - } - - public func executeUpdateRealEmojiImage(memberId: String, realEmojiId: String, parameter: CameraUpdateRealEmojiParameters) -> Observable { - return cameraRepository.updateRealEmojiImage(memberId: memberId, realEmojiId: realEmojiId, parameters: parameter) - } - - public func executeTodayMission() -> Observable { - return cameraRepository.fetchTodayMissionItem() - } - -} diff --git a/14th-team5-iOS/Domain/Sources/Camera/UseCases/Mission/FetchCameraTodayMissionUseCase.swift b/14th-team5-iOS/Domain/Sources/Camera/UseCases/Mission/FetchCameraTodayMissionUseCase.swift new file mode 100644 index 000000000..8eb066361 --- /dev/null +++ b/14th-team5-iOS/Domain/Sources/Camera/UseCases/Mission/FetchCameraTodayMissionUseCase.swift @@ -0,0 +1,32 @@ +// +// FetchCameraTodayMissionUseCase.swift +// Domain +// +// Created by Kim dohyun on 6/14/24. +// + +import Foundation + +import RxSwift +import RxCocoa + + +public protocol FetchCameraTodayMissionUseCaseProtocol { + func execute() -> Single +} + + +public final class FetchCameraTodayMissionUseCase: FetchCameraTodayMissionUseCaseProtocol { + + private let cameraRepository: any CameraRepositoryProtocol + + public init(cameraRepository: any CameraRepositoryProtocol) { + self.cameraRepository = cameraRepository + } + + public func execute() -> Single { + return cameraRepository.fetchTodayMissionItem() + } + + +} diff --git a/14th-team5-iOS/Domain/Sources/Camera/UseCases/Profile/EditCameraProfileImageUseCase.swift b/14th-team5-iOS/Domain/Sources/Camera/UseCases/Profile/EditCameraProfileImageUseCase.swift new file mode 100644 index 000000000..84589cf10 --- /dev/null +++ b/14th-team5-iOS/Domain/Sources/Camera/UseCases/Profile/EditCameraProfileImageUseCase.swift @@ -0,0 +1,36 @@ +// +// EditCameraProfileImageUseCase.swift +// Domain +// +// Created by Kim dohyun on 6/14/24. +// + +import Foundation + +import RxSwift +import RxCocoa + +public protocol EditCameraProfileImageUseCaseProtocol { + func execute(memberId: String, parameter: ProfileImageEditParameter) -> Single +} + + +public final class EditCameraProfileImageUseCase: EditCameraProfileImageUseCaseProtocol { + + private let cameraRepository: any CameraRepositoryProtocol + + public init(cameraRepository: any CameraRepositoryProtocol) { + self.cameraRepository = cameraRepository + } + + + public func execute(memberId: String, parameter: ProfileImageEditParameter) -> Single { + return cameraRepository.editProfleImageToS3(memberId: memberId, parameter: parameter) + } + + + +} + + + diff --git a/14th-team5-iOS/Domain/Sources/Camera/UseCases/RealEmoji/FetchCameraRealEmojiListUseCase.swift b/14th-team5-iOS/Domain/Sources/Camera/UseCases/RealEmoji/FetchCameraRealEmojiListUseCase.swift new file mode 100644 index 000000000..1795ea577 --- /dev/null +++ b/14th-team5-iOS/Domain/Sources/Camera/UseCases/RealEmoji/FetchCameraRealEmojiListUseCase.swift @@ -0,0 +1,31 @@ +// +// FetchCameraRealEmojiListUseCase.swift +// Domain +// +// Created by Kim dohyun on 6/14/24. +// + +import Foundation + +import RxSwift +import RxCocoa + + +public protocol FetchCameraRealEmojiListUseCaseProtocol { + func execute(memberId: String) -> Single<[CameraRealEmojiImageItemEntity?]> +} + + +public final class FetchCameraRealEmojiListUseCase: FetchCameraRealEmojiListUseCaseProtocol { + + private let cameraRepository: any CameraRepositoryProtocol + + public init(cameraRepository: any CameraRepositoryProtocol) { + self.cameraRepository = cameraRepository + } + + public func execute(memberId: String) -> Single<[CameraRealEmojiImageItemEntity?]> { + return cameraRepository.fetchRealEmojiItems(memberId: memberId) + } + +} diff --git a/14th-team5-iOS/Domain/Sources/Camera/UseCases/RealEmoji/FetchCameraRealEmojiUpdateUseCase.swift b/14th-team5-iOS/Domain/Sources/Camera/UseCases/RealEmoji/FetchCameraRealEmojiUpdateUseCase.swift new file mode 100644 index 000000000..d0ad19af5 --- /dev/null +++ b/14th-team5-iOS/Domain/Sources/Camera/UseCases/RealEmoji/FetchCameraRealEmojiUpdateUseCase.swift @@ -0,0 +1,29 @@ +// +// FetchCameraRealEmojiUpdateUseCase.swift +// Domain +// +// Created by Kim dohyun on 6/14/24. +// + +import Foundation + +import RxSwift +import RxCocoa + +public protocol FetchCameraRealEmojiUpdateUseCaseProtocol { + + func execute(memberId: String, emojiId: String, parameter: CameraUpdateRealEmojiParameters) -> Single +} + + +public final class FetchCameraRealEmojiUpdateUseCase: FetchCameraRealEmojiUpdateUseCaseProtocol { + private let cameraRepostiroy: any CameraRepositoryProtocol + + public init(cameraRepostiroy: any CameraRepositoryProtocol) { + self.cameraRepostiroy = cameraRepostiroy + } + + public func execute(memberId: String, emojiId: String, parameter: CameraUpdateRealEmojiParameters) -> Single { + return cameraRepostiroy.updateRealEmojiImage(memberId: memberId, realEmojiId: emojiId, parameters: parameter) + } +} diff --git a/14th-team5-iOS/Domain/Sources/Camera/UseCases/RealEmoji/FetchCameraRealEmojiUploadUseCase.swift b/14th-team5-iOS/Domain/Sources/Camera/UseCases/RealEmoji/FetchCameraRealEmojiUploadUseCase.swift new file mode 100644 index 000000000..c24738ee4 --- /dev/null +++ b/14th-team5-iOS/Domain/Sources/Camera/UseCases/RealEmoji/FetchCameraRealEmojiUploadUseCase.swift @@ -0,0 +1,29 @@ +// +// FetchCameraRealEmojiUploadUseCase.swift +// Domain +// +// Created by Kim dohyun on 6/14/24. +// + +import Foundation + +import RxSwift +import RxCocoa + +public protocol FetchCameraRealEmojiUploadUseCaseProtocol { + func execute(memberId: String, parameter: CameraCreateRealEmojiParameters) -> Single +} + +public final class FetchCameraRealEmojiUploadUseCase: FetchCameraRealEmojiUploadUseCaseProtocol { + + private let cameraRepository: any CameraRepositoryProtocol + + public init(cameraRepository: any CameraRepositoryProtocol) { + self.cameraRepository = cameraRepository + } + + public func execute(memberId: String, parameter: CameraCreateRealEmojiParameters) -> Single { + return cameraRepository.uploadRealEmojiImageToS3(memberId: memberId, parameters: parameter) + } +} + diff --git a/14th-team5-iOS/Domain/Sources/Camera/UseCases/RealEmoji/FetchCameraRealEmojiUseCase.swift b/14th-team5-iOS/Domain/Sources/Camera/UseCases/RealEmoji/FetchCameraRealEmojiUseCase.swift new file mode 100644 index 000000000..b5bc3a91f --- /dev/null +++ b/14th-team5-iOS/Domain/Sources/Camera/UseCases/RealEmoji/FetchCameraRealEmojiUseCase.swift @@ -0,0 +1,34 @@ +// +// FetchCameraRealEmojiUseCase.swift +// Domain +// +// Created by Kim dohyun on 6/14/24. +// + +import Foundation + +import RxSwift +import RxCocoa + + +public protocol FetchCameraRealEmojiUseCaseProtocol { + func execute(memberId: String, parameter: CameraRealEmojiParameters) -> Single + +} + + + +public final class FetchCameraRealEmojiUseCase: FetchCameraRealEmojiUseCaseProtocol { + + private let cameraRepository: any CameraRepositoryProtocol + + public init(cameraRepository: any CameraRepositoryProtocol) { + self.cameraRepository = cameraRepository + } + + + public func execute(memberId: String, parameter: CameraRealEmojiParameters) -> Single { + return cameraRepository.fetchRealEmojiImageURL(memberId: memberId, parameters: parameter) + } + +} diff --git a/14th-team5-iOS/Domain/Sources/Entities/PostList/PostEntity.swift b/14th-team5-iOS/Domain/Sources/Entities/PostList/PostEntity.swift index 43ef1bd09..ab6434ce6 100644 --- a/14th-team5-iOS/Domain/Sources/Entities/PostList/PostEntity.swift +++ b/14th-team5-iOS/Domain/Sources/Entities/PostList/PostEntity.swift @@ -31,7 +31,7 @@ public struct PostEntity: Equatable, Hashable { } } -public struct PostListPage: Equatable { +public struct PostListPageEntity: Equatable { public let isLast: Bool public let postLists: [PostEntity] diff --git a/14th-team5-iOS/Domain/Sources/Members/Entities/MemberProfileResponse.swift b/14th-team5-iOS/Domain/Sources/Members/Entities/MembersProfileEntity.swift similarity index 59% rename from 14th-team5-iOS/Domain/Sources/Members/Entities/MemberProfileResponse.swift rename to 14th-team5-iOS/Domain/Sources/Members/Entities/MembersProfileEntity.swift index 876a9a22c..cc5f80b0e 100644 --- a/14th-team5-iOS/Domain/Sources/Members/Entities/MemberProfileResponse.swift +++ b/14th-team5-iOS/Domain/Sources/Members/Entities/MembersProfileEntity.swift @@ -1,22 +1,27 @@ // -// MemberProfileResponse.swift +// MembersProfileEntity.swift // Domain // -// Created by Kim dohyun on 6/3/24. +// Created by Kim dohyun on 6/15/24. // import Foundation - -public struct MembersProfileResponse { +public struct MembersProfileEntity { public let memberId: String public let memberName: String public let memberImage: URL public let dayOfBirth: Date public let familyJoinAt: String - - public init(memberId: String, memberName: String, memberImage: URL, dayOfBirth: Date, familyJoinAt: String) { + + public init( + memberId: String, + memberName: String, + memberImage: URL, + dayOfBirth: Date, + familyJoinAt: String + ) { self.memberId = memberId self.memberName = memberName self.memberImage = memberImage diff --git a/14th-team5-iOS/Domain/Sources/Members/Interfaces/MembersRepositoryProtocol.swift b/14th-team5-iOS/Domain/Sources/Members/Interfaces/MembersRepositoryProtocol.swift index c43a0e93b..a6b85ba63 100644 --- a/14th-team5-iOS/Domain/Sources/Members/Interfaces/MembersRepositoryProtocol.swift +++ b/14th-team5-iOS/Domain/Sources/Members/Interfaces/MembersRepositoryProtocol.swift @@ -14,9 +14,7 @@ import RxSwift public protocol MembersRepositoryProtocol { var disposeBag: DisposeBag { get } - func fetchProfileMemberItems(memberId: String) -> Observable - func fetchProfileAlbumImageURL(parameter: CameraDisplayImageParameters) -> Observable - func uploadProfileImageToPresingedURL(to url: String, imageData: Data) -> Observable - func updataProfileImageToS3(memberId: String, parameter: ProfileImageEditParameter) -> Observable - func deleteProfileImageToS3(memberId: String) -> Observable + func fetchProfileMemberItems(memberId: String) -> Single + func updataProfileImageToS3(memberId: String, parameter: ProfileImageEditParameter) -> Single + func deleteProfileImageToS3(memberId: String) -> Single } diff --git a/14th-team5-iOS/Domain/Sources/Members/UseCases/Members/DeleteMembersProfileUseCase.swift b/14th-team5-iOS/Domain/Sources/Members/UseCases/Members/DeleteMembersProfileUseCase.swift new file mode 100644 index 000000000..6145f3d11 --- /dev/null +++ b/14th-team5-iOS/Domain/Sources/Members/UseCases/Members/DeleteMembersProfileUseCase.swift @@ -0,0 +1,30 @@ +// +// DeleteMembersProfileUseCase.swift +// Domain +// +// Created by Kim dohyun on 6/15/24. +// + +import Foundation + +import RxSwift +import RxCocoa + +public protocol DeleteMembersProfileUseCaseProtocol { + func execute(memberId: String) -> Single +} + + +public final class DeleteMembersProfileUseCase: DeleteMembersProfileUseCaseProtocol { + + private let membersRepository: any MembersRepositoryProtocol + + + public init(membersRepository: any MembersRepositoryProtocol) { + self.membersRepository = membersRepository + } + + public func execute(memberId: String) -> Single { + return membersRepository.deleteProfileImageToS3(memberId: memberId) + } +} diff --git a/14th-team5-iOS/Domain/Sources/Members/UseCases/Members/FetchMembersPostListUseCase.swift b/14th-team5-iOS/Domain/Sources/Members/UseCases/Members/FetchMembersPostListUseCase.swift new file mode 100644 index 000000000..0be3bc34d --- /dev/null +++ b/14th-team5-iOS/Domain/Sources/Members/UseCases/Members/FetchMembersPostListUseCase.swift @@ -0,0 +1,32 @@ +// +// FetchMembersPostListUseCase.swift +// Domain +// +// Created by Kim dohyun on 6/16/24. +// + +import Foundation + +import RxSwift +import RxCocoa + +public protocol FetchMembersPostListUseCaseProtocol { + func execute(query: PostListQuery) -> Single +} + + +public final class FetchMembersPostListUseCase: FetchMembersPostListUseCaseProtocol { + + private let postListRepository: any PostListRepositoryProtocol + + + public init(postListRepository: any PostListRepositoryProtocol) { + self.postListRepository = postListRepository + } + + public func execute(query: PostListQuery) -> Single { + return postListRepository.fetchTodayPostList(query: query) + } + + +} diff --git a/14th-team5-iOS/Domain/Sources/Members/UseCases/Members/FetchMembersProfileUseCase.swift b/14th-team5-iOS/Domain/Sources/Members/UseCases/Members/FetchMembersProfileUseCase.swift new file mode 100644 index 000000000..5c79d623e --- /dev/null +++ b/14th-team5-iOS/Domain/Sources/Members/UseCases/Members/FetchMembersProfileUseCase.swift @@ -0,0 +1,31 @@ +// +// FetchMembersProfileUseCase.swift +// Domain +// +// Created by Kim dohyun on 6/15/24. +// + +import Foundation + +import RxSwift +import RxCocoa + + +public protocol FetchMembersProfileUseCaseProtocol { + func execute(memberId: String) -> Single +} + + +public final class FetchMembersProfileUseCase: FetchMembersProfileUseCaseProtocol { + + private let membersRepository: any MembersRepositoryProtocol + + + public init(membersRepository: any MembersRepositoryProtocol) { + self.membersRepository = membersRepository + } + + public func execute(memberId: String) -> Single { + return membersRepository.fetchProfileMemberItems(memberId: memberId) + } +} diff --git a/14th-team5-iOS/Domain/Sources/Members/UseCases/Members/UpdateMembersProfileUseCase.swift b/14th-team5-iOS/Domain/Sources/Members/UseCases/Members/UpdateMembersProfileUseCase.swift new file mode 100644 index 000000000..7e5f98b13 --- /dev/null +++ b/14th-team5-iOS/Domain/Sources/Members/UseCases/Members/UpdateMembersProfileUseCase.swift @@ -0,0 +1,30 @@ +// +// UpdateMembersProfileUseCase.swift +// Domain +// +// Created by Kim dohyun on 6/15/24. +// + +import Foundation + +import RxSwift +import RxCocoa + +public protocol UpdateMembersProfileUseCaseProtocol { + func execute(memberId: String, parameter: ProfileImageEditParameter) -> Single +} + + +public final class UpdateMembersProfileUseCase: UpdateMembersProfileUseCaseProtocol { + + private let membersRepository: any MembersRepositoryProtocol + + + public init(membersRepository: any MembersRepositoryProtocol) { + self.membersRepository = membersRepository + } + + public func execute(memberId: String, parameter: ProfileImageEditParameter) -> Single { + return membersRepository.updataProfileImageToS3(memberId: memberId, parameter: parameter) + } +} diff --git a/14th-team5-iOS/Domain/Sources/Members/UseCases/MembersUseCase.swift b/14th-team5-iOS/Domain/Sources/Members/UseCases/MembersUseCase.swift deleted file mode 100644 index 84b6c836d..000000000 --- a/14th-team5-iOS/Domain/Sources/Members/UseCases/MembersUseCase.swift +++ /dev/null @@ -1,51 +0,0 @@ -// -// MembersUseCase.swift -// Domain -// -// Created by Kim dohyun on 6/5/24. -// - -import Foundation - -import RxCocoa -import RxSwift - - -public protocol MembersUseCaseProtocol { - func executeProfileMemberItems(memberId: String) -> Observable - func executeProfileImageURLCreate(parameter: CameraDisplayImageParameters) -> Observable - func executeProfileImageToPresingedUpload(to url: String, data: Data) -> Observable - func executeReloadProfileImage(memberId: String, parameter: ProfileImageEditParameter) -> Observable - func executeDeleteProfileImage(memberId: String) -> Observable -} - -public final class MembersUseCase: MembersUseCaseProtocol { - private let membersRepository: MembersRepositoryProtocol - - public init(membersRepository: MembersRepositoryProtocol) { - self.membersRepository = membersRepository - } - - public func executeProfileMemberItems(memberId: String) -> Observable { - return membersRepository.fetchProfileMemberItems(memberId: memberId) - .asObservable() - } - - public func executeProfileImageURLCreate(parameter: CameraDisplayImageParameters) -> Observable { - return membersRepository.fetchProfileAlbumImageURL(parameter: parameter) - } - - - public func executeProfileImageToPresingedUpload(to url: String, data: Data) -> Observable { - return membersRepository.uploadProfileImageToPresingedURL(to: url, imageData: data) - } - - public func executeReloadProfileImage(memberId: String, parameter: ProfileImageEditParameter) -> Observable { - return membersRepository.updataProfileImageToS3(memberId: memberId, parameter: parameter) - } - - public func executeDeleteProfileImage(memberId: String) -> Observable { - return membersRepository.deleteProfileImageToS3(memberId: memberId) - } - -} diff --git a/14th-team5-iOS/Domain/Sources/Members/UseCases/ProfileFeedUseCase.swift b/14th-team5-iOS/Domain/Sources/Members/UseCases/ProfileFeedUseCase.swift deleted file mode 100644 index 819867687..000000000 --- a/14th-team5-iOS/Domain/Sources/Members/UseCases/ProfileFeedUseCase.swift +++ /dev/null @@ -1,35 +0,0 @@ -// -// ProfileFeedUseCase.swift -// Domain -// -// Created by Kim dohyun on 5/4/24. -// - -import Foundation - -import RxSwift -import RxCocoa - - -public protocol ProfileFeedUseCaseProtocol { - func execute(query: PostListQuery) -> Observable -} - - - -public final class ProfileFeedUseCase: ProfileFeedUseCaseProtocol { - - private let missionFeedRepository: PostListRepositoryProtocol - - public init(missionFeedRepository: PostListRepositoryProtocol) { - self.missionFeedRepository = missionFeedRepository - } - - public func execute(query: PostListQuery) -> RxSwift.Observable { - return missionFeedRepository.fetchTodayPostList(query: query) - .asObservable() - } - - - -} diff --git a/14th-team5-iOS/Domain/Sources/Mission/Entities/MissionContentResponse.swift b/14th-team5-iOS/Domain/Sources/Mission/Entities/MissionContentEntity.swift similarity index 70% rename from 14th-team5-iOS/Domain/Sources/Mission/Entities/MissionContentResponse.swift rename to 14th-team5-iOS/Domain/Sources/Mission/Entities/MissionContentEntity.swift index 25ef66092..f395c34a7 100644 --- a/14th-team5-iOS/Domain/Sources/Mission/Entities/MissionContentResponse.swift +++ b/14th-team5-iOS/Domain/Sources/Mission/Entities/MissionContentEntity.swift @@ -1,13 +1,14 @@ // -// MissionContentResponse.swift +// MissionContentEntity.swift // Domain // -// Created by Kim dohyun on 6/5/24. +// Created by Kim dohyun on 6/16/24. // import Foundation -public struct MissionContentResponse { + +public struct MissionContentEntity { public let missionId: String public let missionContent: String diff --git a/14th-team5-iOS/Domain/Sources/Mission/Entities/TodayMissionResponse.swift b/14th-team5-iOS/Domain/Sources/Mission/Entities/TodayMissionResponse.swift deleted file mode 100644 index 9dad60c2b..000000000 --- a/14th-team5-iOS/Domain/Sources/Mission/Entities/TodayMissionResponse.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// TodayMissionResponse.swift -// Domain -// -// Created by Kim dohyun on 6/5/24. -// - -import Foundation - -public struct TodayMissionResponse { - let id: String - public let content: String - - public init(id: String, content: String) { - self.id = id - self.content = content - } -} diff --git a/14th-team5-iOS/Domain/Sources/Mission/Interfaces/CheckMissionAlertShowUseCaseProtocol.swift b/14th-team5-iOS/Domain/Sources/Mission/Interfaces/CheckMissionAlertShowUseCaseProtocol.swift deleted file mode 100644 index 825b5734c..000000000 --- a/14th-team5-iOS/Domain/Sources/Mission/Interfaces/CheckMissionAlertShowUseCaseProtocol.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// MissionAlertUseCaseProtocol.swift -// Domain -// -// Created by 마경미 on 03.06.24. -// - -import Foundation - -import RxSwift - -public protocol CheckMissionAlertShowUseCaseProtocol { - func execute() -> Observable -} diff --git a/14th-team5-iOS/Domain/Sources/Mission/Interfaces/GetTodayMissionUseCaseProtocol.swift b/14th-team5-iOS/Domain/Sources/Mission/Interfaces/GetTodayMissionUseCaseProtocol.swift deleted file mode 100644 index d66ee1bbb..000000000 --- a/14th-team5-iOS/Domain/Sources/Mission/Interfaces/GetTodayMissionUseCaseProtocol.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// GetTodayUseCaseProtocol.swift -// Domain -// -// Created by 마경미 on 21.04.24. -// - -import Foundation - -import RxSwift - -public protocol GetTodayMissionUseCaseProtocol { - func execute() -> Observable -} diff --git a/14th-team5-iOS/Domain/Sources/Mission/Interfaces/MissionRepositoryProtocol.swift b/14th-team5-iOS/Domain/Sources/Mission/Interfaces/MissionRepositoryProtocol.swift index 751780dda..af158700d 100644 --- a/14th-team5-iOS/Domain/Sources/Mission/Interfaces/MissionRepositoryProtocol.swift +++ b/14th-team5-iOS/Domain/Sources/Mission/Interfaces/MissionRepositoryProtocol.swift @@ -10,6 +10,6 @@ import Foundation import RxSwift public protocol MissionRepositoryProtocol { - func getTodayMission() -> Observable - func getMissionContent(missionId: String) -> Observable + func getMissionContent(missionId: String) -> Single + func isAlreadyShowMissionAlert() -> Observable } diff --git a/14th-team5-iOS/Domain/Sources/Mission/Interfaces/MissionUserdefaultsRepositoryProtocol.swift b/14th-team5-iOS/Domain/Sources/Mission/Interfaces/MissionUserdefaultsRepositoryProtocol.swift deleted file mode 100644 index c26c8cc05..000000000 --- a/14th-team5-iOS/Domain/Sources/Mission/Interfaces/MissionUserdefaultsRepositoryProtocol.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// MissionUserdefaultsRepositoryProtocol.swift -// Domain -// -// Created by 마경미 on 03.06.24. -// - -import Foundation - -import RxSwift - -public protocol MissionUserdefaultsRepositoryProtocol { - func isAlreadyShowMissionAlert() -> Observable -} diff --git a/14th-team5-iOS/Domain/Sources/Mission/UseCases/CheckMissionAlertShowUseCase.swift b/14th-team5-iOS/Domain/Sources/Mission/UseCases/CheckMissionAlertShowUseCase.swift deleted file mode 100644 index 253667e8b..000000000 --- a/14th-team5-iOS/Domain/Sources/Mission/UseCases/CheckMissionAlertShowUseCase.swift +++ /dev/null @@ -1,22 +0,0 @@ -// -// CheckMissionUseCase.swift -// Domain -// -// Created by 마경미 on 03.06.24. -// - -import Foundation - -import RxSwift - -public class CheckMissionAlertShowUseCase: CheckMissionAlertShowUseCaseProtocol { - private let missionUserDefaultsRepository: MissionUserdefaultsRepositoryProtocol - - public init(missionUserDefaultsRepository: MissionUserdefaultsRepositoryProtocol) { - self.missionUserDefaultsRepository = missionUserDefaultsRepository - } - - public func execute() -> Observable { - return missionUserDefaultsRepository.isAlreadyShowMissionAlert().asObservable() - } -} diff --git a/14th-team5-iOS/Domain/Sources/Mission/UseCases/Mission/CheckMissionAlertShowUseCase.swift b/14th-team5-iOS/Domain/Sources/Mission/UseCases/Mission/CheckMissionAlertShowUseCase.swift new file mode 100644 index 000000000..9b0bca0d8 --- /dev/null +++ b/14th-team5-iOS/Domain/Sources/Mission/UseCases/Mission/CheckMissionAlertShowUseCase.swift @@ -0,0 +1,27 @@ +// +// CheckMissionUseCase.swift +// Domain +// +// Created by 마경미 on 03.06.24. +// + +import Foundation + +import RxSwift + +public protocol CheckMissionAlertShowUseCaseProtocol { + func execute() -> Observable +} + + +public class CheckMissionAlertShowUseCase: CheckMissionAlertShowUseCaseProtocol { + private let missionRepository: any MissionRepositoryProtocol + + public init(missionRepository: any MissionRepositoryProtocol) { + self.missionRepository = missionRepository + } + + public func execute() -> Observable { + return missionRepository.isAlreadyShowMissionAlert() + } +} diff --git a/14th-team5-iOS/Domain/Sources/Mission/UseCases/Mission/FetchMissionContentUseCase.swift b/14th-team5-iOS/Domain/Sources/Mission/UseCases/Mission/FetchMissionContentUseCase.swift new file mode 100644 index 000000000..a11803642 --- /dev/null +++ b/14th-team5-iOS/Domain/Sources/Mission/UseCases/Mission/FetchMissionContentUseCase.swift @@ -0,0 +1,29 @@ +// +// FetchMissionContentUseCase.swift +// Domain +// +// Created by Kim dohyun on 6/16/24. +// + +import Foundation + +import RxSwift +import RxCocoa + + +public protocol FetchMissionContentUseCaseProtocol { + func execute(missionId: String) -> Single +} + +public final class FetchMissionContentUseCase: FetchMissionContentUseCaseProtocol { + private let missionRepository: any MissionRepositoryProtocol + + public init(missionRepository: any MissionRepositoryProtocol) { + self.missionRepository = missionRepository + } + + public func execute(missionId: String) -> Single { + return missionRepository.getMissionContent(missionId: missionId) + } + +} diff --git a/14th-team5-iOS/Domain/Sources/Mission/UseCases/MissionContentUseCase.swift b/14th-team5-iOS/Domain/Sources/Mission/UseCases/MissionContentUseCase.swift deleted file mode 100644 index 89a4bb8d8..000000000 --- a/14th-team5-iOS/Domain/Sources/Mission/UseCases/MissionContentUseCase.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// MissionContentUseCase.swift -// Domain -// -// Created by Kim dohyun on 5/9/24. -// - -import Foundation - -import RxSwift - -public protocol MissionContentUseCaseProtocol { - func execute(missionId: String) -> Observable -} - - -public class MissionContentUseCase: MissionContentUseCaseProtocol { - - private let missionContentRepository: MissionRepositoryProtocol - - public init(missionContentRepository: MissionRepositoryProtocol) { - self.missionContentRepository = missionContentRepository - } - - public func execute(missionId: String) -> Observable { - return missionContentRepository.getMissionContent(missionId: missionId) - .compactMap { $0 } - .asObservable() - } - -} diff --git a/14th-team5-iOS/Domain/Sources/Repositories/PostListRepositoryProtocol.swift b/14th-team5-iOS/Domain/Sources/Repositories/PostListRepositoryProtocol.swift index 7de282731..e74ba50ac 100644 --- a/14th-team5-iOS/Domain/Sources/Repositories/PostListRepositoryProtocol.swift +++ b/14th-team5-iOS/Domain/Sources/Repositories/PostListRepositoryProtocol.swift @@ -9,5 +9,5 @@ import Foundation import RxSwift public protocol PostListRepositoryProtocol { - func fetchTodayPostList(query: PostListQuery) -> Single + func fetchTodayPostList(query: PostListQuery) -> Single } diff --git a/14th-team5-iOS/Domain/Sources/UseCases/MainView/FetchMainUseCase.swift b/14th-team5-iOS/Domain/Sources/UseCases/MainView/FetchMainUseCase.swift index 5c6b1d398..3e881c69a 100644 --- a/14th-team5-iOS/Domain/Sources/UseCases/MainView/FetchMainUseCase.swift +++ b/14th-team5-iOS/Domain/Sources/UseCases/MainView/FetchMainUseCase.swift @@ -14,9 +14,9 @@ public protocol FetchMainUseCaseProtocol { } public final class FetchMainUseCase: FetchMainUseCaseProtocol { - private let mainRepository: MainRepositoryProtocol + private let mainRepository: MainViewRepositoryProtocol - public init(mainRepository: MainRepositoryProtocol) { + public init(mainRepository: MainViewRepositoryProtocol) { self.mainRepository = mainRepository } diff --git a/14th-team5-iOS/Domain/Sources/UseCases/MainView/FetchNightMainViewUsecase.swift b/14th-team5-iOS/Domain/Sources/UseCases/MainView/FetchNightMainViewUsecase.swift index d5751b982..2ed78b6d8 100644 --- a/14th-team5-iOS/Domain/Sources/UseCases/MainView/FetchNightMainViewUsecase.swift +++ b/14th-team5-iOS/Domain/Sources/UseCases/MainView/FetchNightMainViewUsecase.swift @@ -14,9 +14,9 @@ public protocol FetchNightMainViewUseCaseProtocol { } public final class FetchNightMainViewUseCase: FetchNightMainViewUseCaseProtocol { - private let mainRepository: MainRepositoryProtocol + private let mainRepository: MainViewRepositoryProtocol - public init(mainRepository: MainRepositoryProtocol) { + public init(mainRepository: MainViewRepositoryProtocol) { self.mainRepository = mainRepository } diff --git a/14th-team5-iOS/Domain/Sources/UseCases/Post/FetchPostListUseCase.swift b/14th-team5-iOS/Domain/Sources/UseCases/Post/FetchPostListUseCase.swift index fd42c85f0..d061a776a 100644 --- a/14th-team5-iOS/Domain/Sources/UseCases/Post/FetchPostListUseCase.swift +++ b/14th-team5-iOS/Domain/Sources/UseCases/Post/FetchPostListUseCase.swift @@ -9,7 +9,7 @@ import Foundation import RxSwift public protocol FetchPostListUseCaseProtocol { - func excute(query: PostListQuery) -> Single + func execute(query: PostListQuery) -> Single } public class FetchPostListUseCase: FetchPostListUseCaseProtocol { @@ -19,7 +19,7 @@ public class FetchPostListUseCase: FetchPostListUseCaseProtocol { self.postListRepository = postListRepository } - public func excute(query: PostListQuery) -> Single { + public func execute(query: PostListQuery) -> Single { return postListRepository.fetchTodayPostList(query: query) } }