From 2675fd8843df03b13054059821febac25a2384ab Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Wed, 17 Apr 2024 20:21:59 +0900 Subject: [PATCH 01/44] =?UTF-8?q?feat=20#144:=20FirebaseAPI=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 67 +++++++++++++++++-- Project_Timer/Data/API/FirebaseAPI.swift | 56 ++++++++++++++++ .../Data/API/{ => lagacy}/AppVersionAPI.swift | 0 .../Data/API/{ => lagacy}/AuthAPI.swift | 0 .../Data/API/{ => lagacy}/DailysAPI.swift | 0 .../API/{ => lagacy}/NotificationAPI.swift | 0 .../API/{ => lagacy}/RecordTimesAPI.swift | 0 .../Data/API/{ => lagacy}/ServerURLAPI.swift | 0 .../Data/API/{ => lagacy}/SyncLogAPI.swift | 0 9 files changed, 116 insertions(+), 7 deletions(-) create mode 100644 Project_Timer/Data/API/FirebaseAPI.swift rename Project_Timer/Data/API/{ => lagacy}/AppVersionAPI.swift (100%) rename Project_Timer/Data/API/{ => lagacy}/AuthAPI.swift (100%) rename Project_Timer/Data/API/{ => lagacy}/DailysAPI.swift (100%) rename Project_Timer/Data/API/{ => lagacy}/NotificationAPI.swift (100%) rename Project_Timer/Data/API/{ => lagacy}/RecordTimesAPI.swift (100%) rename Project_Timer/Data/API/{ => lagacy}/ServerURLAPI.swift (100%) rename Project_Timer/Data/API/{ => lagacy}/SyncLogAPI.swift (100%) diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index cdd5cc46..96fbc72d 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -197,6 +197,11 @@ 8760FCBB29553F06000BCCD1 /* SyncDailysVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8760FCBA29553F06000BCCD1 /* SyncDailysVC.swift */; }; 87617E632A0CDFC800E312EA /* CalendarWidgetEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87617E612A0CDF1700E312EA /* CalendarWidgetEntry.swift */; }; 87617E682A0CE58900E312EA /* CalendarWidgetProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87617E662A0CE58400E312EA /* CalendarWidgetProvider.swift */; }; + 8761BDC02BCFE52E00E9281A /* FirebaseAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8761BDBF2BCFE52E00E9281A /* FirebaseAPI.swift */; }; + 8761BDC22BCFE64000E9281A /* CombineMoya in Frameworks */ = {isa = PBXBuildFile; productRef = 8761BDC12BCFE64000E9281A /* CombineMoya */; }; + 8761BDC42BCFE64000E9281A /* Moya in Frameworks */ = {isa = PBXBuildFile; productRef = 8761BDC32BCFE64000E9281A /* Moya */; }; + 8761BDC62BCFE64000E9281A /* ReactiveMoya in Frameworks */ = {isa = PBXBuildFile; productRef = 8761BDC52BCFE64000E9281A /* ReactiveMoya */; }; + 8761BDC82BCFE64000E9281A /* RxMoya in Frameworks */ = {isa = PBXBuildFile; productRef = 8761BDC72BCFE64000E9281A /* RxMoya */; }; 8765234628C76B6D00487BFB /* WeekSmallTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8765234528C76B6D00487BFB /* WeekSmallTime.swift */; }; 8765234828C76FFE00487BFB /* WeekSmallVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8765234728C76FFE00487BFB /* WeekSmallVM.swift */; }; 8765234A28C7709700487BFB /* WeekSmallView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8765234928C7709700487BFB /* WeekSmallView.swift */; }; @@ -617,6 +622,7 @@ 8760FCBA29553F06000BCCD1 /* SyncDailysVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncDailysVC.swift; sourceTree = ""; }; 87617E612A0CDF1700E312EA /* CalendarWidgetEntry.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarWidgetEntry.swift; sourceTree = ""; }; 87617E662A0CE58400E312EA /* CalendarWidgetProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarWidgetProvider.swift; sourceTree = ""; }; + 8761BDBF2BCFE52E00E9281A /* FirebaseAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseAPI.swift; sourceTree = ""; }; 8765234528C76B6D00487BFB /* WeekSmallTime.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeekSmallTime.swift; sourceTree = ""; }; 8765234728C76FFE00487BFB /* WeekSmallVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeekSmallVM.swift; sourceTree = ""; }; 8765234928C7709700487BFB /* WeekSmallView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeekSmallView.swift; sourceTree = ""; }; @@ -830,12 +836,16 @@ files = ( 8773AF4F27DCB59400739A09 /* FirebaseDatabase in Frameworks */, 87910828283876DD005D7B10 /* Alamofire in Frameworks */, + 8761BDC22BCFE64000E9281A /* CombineMoya in Frameworks */, 876C3B0D2B1045C5002A5132 /* GoogleSignInSwift in Frameworks */, 8773AF5227DCB5D100739A09 /* FSCalendar in Frameworks */, 8773AF4D27DCB59400739A09 /* FirebaseAnalytics in Frameworks */, + 8761BDC82BCFE64000E9281A /* RxMoya in Frameworks */, 876C3B0B2B1045C5002A5132 /* GoogleSignIn in Frameworks */, 87D4DCEB2BA6B04B00BB5AAB /* Lottie in Frameworks */, + 8761BDC42BCFE64000E9281A /* Moya in Frameworks */, 540418171CE07D46B1BD8E3B /* Pods_Project_Timer.framework in Frameworks */, + 8761BDC62BCFE64000E9281A /* ReactiveMoya in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1151,13 +1161,8 @@ 875FAE232B1C6710008F19D2 /* API */ = { isa = PBXGroup; children = ( - 875FAE242B1C6721008F19D2 /* AppVersionAPI.swift */, - 8708004F2B2C38F900830B39 /* ServerURLAPI.swift */, - 8708005B2B2C4D2D00830B39 /* AuthAPI.swift */, - 8708006A2B2CA57C00830B39 /* DailysAPI.swift */, - 870800782B2D4DE500830B39 /* RecordTimesAPI.swift */, - 870800842B2D593400830B39 /* SyncLogAPI.swift */, - 873731D02B2E92BD00D7BD9F /* NotificationAPI.swift */, + 8761BDBE2BCFE48D00E9281A /* lagacy */, + 8761BDBF2BCFE52E00E9281A /* FirebaseAPI.swift */, ); path = API; sourceTree = ""; @@ -1264,6 +1269,20 @@ path = CalendarWidget; sourceTree = ""; }; + 8761BDBE2BCFE48D00E9281A /* lagacy */ = { + isa = PBXGroup; + children = ( + 875FAE242B1C6721008F19D2 /* AppVersionAPI.swift */, + 8708004F2B2C38F900830B39 /* ServerURLAPI.swift */, + 8708005B2B2C4D2D00830B39 /* AuthAPI.swift */, + 8708006A2B2CA57C00830B39 /* DailysAPI.swift */, + 870800782B2D4DE500830B39 /* RecordTimesAPI.swift */, + 870800842B2D593400830B39 /* SyncLogAPI.swift */, + 873731D02B2E92BD00D7BD9F /* NotificationAPI.swift */, + ); + path = lagacy; + sourceTree = ""; + }; 8762717127DF83E400F812ED /* TaskSelect */ = { isa = PBXGroup; children = ( @@ -2051,6 +2070,10 @@ 876C3B0A2B1045C5002A5132 /* GoogleSignIn */, 876C3B0C2B1045C5002A5132 /* GoogleSignInSwift */, 87D4DCEA2BA6B04B00BB5AAB /* Lottie */, + 8761BDC12BCFE64000E9281A /* CombineMoya */, + 8761BDC32BCFE64000E9281A /* Moya */, + 8761BDC52BCFE64000E9281A /* ReactiveMoya */, + 8761BDC72BCFE64000E9281A /* RxMoya */, ); productName = Project_Timer; productReference = 93B0851D248DDF2F00E215BD /* TiTi.app */; @@ -2092,6 +2115,7 @@ 8760FCB529541B88000BCCD1 /* XCRemoteSwiftPackageReference "SwiftKeychainWrapper" */, 876C3B092B10361E002A5132 /* XCRemoteSwiftPackageReference "GoogleSignIn-iOS" */, 87D4DCE92BA6B04B00BB5AAB /* XCRemoteSwiftPackageReference "lottie-ios" */, + 8761BDBD2BCFE47000E9281A /* XCRemoteSwiftPackageReference "Moya" */, ); productRefGroup = 93B0851E248DDF2F00E215BD /* Products */; projectDirPath = ""; @@ -2423,6 +2447,7 @@ 879E849C29C83D5100D65F48 /* RoundedShape.swift in Sources */, 87199F582883F2E00017D01A /* TimelineVM.swift in Sources */, 870800562B2C3AC600830B39 /* ServerURLRepositoryInterface.swift in Sources */, + 8761BDC02BCFE52E00E9281A /* FirebaseAPI.swift in Sources */, 877036CA29CD7B3B0078A30C /* TaskManager.swift in Sources */, 878DA8212B0C62E1001E924E /* SignupNicknameView.swift in Sources */, 048D8ACB28AA49F800A2456D /* PopupEditHistoryVC.swift in Sources */, @@ -3003,6 +3028,14 @@ minimumVersion = 4.0.0; }; }; + 8761BDBD2BCFE47000E9281A /* XCRemoteSwiftPackageReference "Moya" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/Moya/Moya.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 15.0.3; + }; + }; 876C3B092B10361E002A5132 /* XCRemoteSwiftPackageReference "GoogleSignIn-iOS" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/google/GoogleSignIn-iOS"; @@ -3054,6 +3087,26 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ + 8761BDC12BCFE64000E9281A /* CombineMoya */ = { + isa = XCSwiftPackageProductDependency; + package = 8761BDBD2BCFE47000E9281A /* XCRemoteSwiftPackageReference "Moya" */; + productName = CombineMoya; + }; + 8761BDC32BCFE64000E9281A /* Moya */ = { + isa = XCSwiftPackageProductDependency; + package = 8761BDBD2BCFE47000E9281A /* XCRemoteSwiftPackageReference "Moya" */; + productName = Moya; + }; + 8761BDC52BCFE64000E9281A /* ReactiveMoya */ = { + isa = XCSwiftPackageProductDependency; + package = 8761BDBD2BCFE47000E9281A /* XCRemoteSwiftPackageReference "Moya" */; + productName = ReactiveMoya; + }; + 8761BDC72BCFE64000E9281A /* RxMoya */ = { + isa = XCSwiftPackageProductDependency; + package = 8761BDBD2BCFE47000E9281A /* XCRemoteSwiftPackageReference "Moya" */; + productName = RxMoya; + }; 876C3B0A2B1045C5002A5132 /* GoogleSignIn */ = { isa = XCSwiftPackageProductDependency; package = 876C3B092B10361E002A5132 /* XCRemoteSwiftPackageReference "GoogleSignIn-iOS" */; diff --git a/Project_Timer/Data/API/FirebaseAPI.swift b/Project_Timer/Data/API/FirebaseAPI.swift new file mode 100644 index 00000000..d16ee965 --- /dev/null +++ b/Project_Timer/Data/API/FirebaseAPI.swift @@ -0,0 +1,56 @@ +// +// FirebaseAPI.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/04/17. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Moya + +enum FirebaseAPI { + case getAppVersion + case getServerURL + case getNotification +} + +extension FirebaseAPI: TargetType { + var baseURL: URL { + return URL(string: Infos.FirestoreURL.value)! + } + + var path: String { + switch self { + case .getAppVersion: + #if targetEnvironment(macCatalyst) + return "/version/macos" + #else + return "/version/ios" + #endif + case .getServerURL: + return "/server/url" + case .getNotification: + switch Language.current { + case .ko: return "/notification/ko" + case .en: return "/notification/en" + case .zh: return "/notification/zh" + } + } + } + + var method: Moya.Method { + switch self { + case .getAppVersion, .getServerURL, .getNotification: + return .get + } + } + + var task: Moya.Task { + return .requestPlain + } + + var headers: [String : String]? { + return nil + } +} diff --git a/Project_Timer/Data/API/AppVersionAPI.swift b/Project_Timer/Data/API/lagacy/AppVersionAPI.swift similarity index 100% rename from Project_Timer/Data/API/AppVersionAPI.swift rename to Project_Timer/Data/API/lagacy/AppVersionAPI.swift diff --git a/Project_Timer/Data/API/AuthAPI.swift b/Project_Timer/Data/API/lagacy/AuthAPI.swift similarity index 100% rename from Project_Timer/Data/API/AuthAPI.swift rename to Project_Timer/Data/API/lagacy/AuthAPI.swift diff --git a/Project_Timer/Data/API/DailysAPI.swift b/Project_Timer/Data/API/lagacy/DailysAPI.swift similarity index 100% rename from Project_Timer/Data/API/DailysAPI.swift rename to Project_Timer/Data/API/lagacy/DailysAPI.swift diff --git a/Project_Timer/Data/API/NotificationAPI.swift b/Project_Timer/Data/API/lagacy/NotificationAPI.swift similarity index 100% rename from Project_Timer/Data/API/NotificationAPI.swift rename to Project_Timer/Data/API/lagacy/NotificationAPI.swift diff --git a/Project_Timer/Data/API/RecordTimesAPI.swift b/Project_Timer/Data/API/lagacy/RecordTimesAPI.swift similarity index 100% rename from Project_Timer/Data/API/RecordTimesAPI.swift rename to Project_Timer/Data/API/lagacy/RecordTimesAPI.swift diff --git a/Project_Timer/Data/API/ServerURLAPI.swift b/Project_Timer/Data/API/lagacy/ServerURLAPI.swift similarity index 100% rename from Project_Timer/Data/API/ServerURLAPI.swift rename to Project_Timer/Data/API/lagacy/ServerURLAPI.swift diff --git a/Project_Timer/Data/API/SyncLogAPI.swift b/Project_Timer/Data/API/lagacy/SyncLogAPI.swift similarity index 100% rename from Project_Timer/Data/API/SyncLogAPI.swift rename to Project_Timer/Data/API/lagacy/SyncLogAPI.swift From 6072374afa50aad2af27ee47293f7153aa44d109 Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Wed, 17 Apr 2024 20:36:29 +0900 Subject: [PATCH 02/44] =?UTF-8?q?feat=20#144:=20AuthAPI=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 60 ++++++++++--------- Project_Timer/Data/API/AuthAPI.swift | 54 +++++++++++++++++ ...rsionAPI.swift => AppVersionNetwork.swift} | 4 +- .../{AuthAPI.swift => AuthNetwork.swift} | 5 +- .../{DailysAPI.swift => DailysNetwork.swift} | 4 +- ...ionAPI.swift => NotificationNetwork.swift} | 4 +- ...imesAPI.swift => RecordTimesNetwork.swift} | 2 +- ...verURLAPI.swift => ServerURLNetwork.swift} | 4 +- ...{SyncLogAPI.swift => SyncLogNetwork.swift} | 4 +- .../AppLatestVersionRepository.swift | 2 +- .../Data/Repository/AuthRepository.swift | 2 +- .../Data/Repository/DailysRepository.swift | 2 +- .../Repository/NotificationRepository.swift | 2 +- .../Repository/RecordTimesRepository.swift | 2 +- .../Data/Repository/ServerURLRepository.swift | 2 +- .../Data/Repository/SyncLogRepository.swift | 2 +- 16 files changed, 107 insertions(+), 48 deletions(-) create mode 100644 Project_Timer/Data/API/AuthAPI.swift rename Project_Timer/Data/API/lagacy/{AppVersionAPI.swift => AppVersionNetwork.swift} (91%) rename Project_Timer/Data/API/lagacy/{AuthAPI.swift => AuthNetwork.swift} (97%) rename Project_Timer/Data/API/lagacy/{DailysAPI.swift => DailysNetwork.swift} (94%) rename Project_Timer/Data/API/lagacy/{NotificationAPI.swift => NotificationNetwork.swift} (91%) rename Project_Timer/Data/API/lagacy/{RecordTimesAPI.swift => RecordTimesNetwork.swift} (95%) rename Project_Timer/Data/API/lagacy/{ServerURLAPI.swift => ServerURLNetwork.swift} (89%) rename Project_Timer/Data/API/lagacy/{SyncLogAPI.swift => SyncLogNetwork.swift} (89%) diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index 96fbc72d..35b71981 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -46,33 +46,33 @@ 8706C32E2AEF878D00F7C842 /* TTSignupTextFieldUnderlineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8706C32D2AEF878D00F7C842 /* TTSignupTextFieldUnderlineView.swift */; }; 8706C3302AEF881500F7C842 /* TTSignupTextFieldWarning.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8706C32F2AEF881500F7C842 /* TTSignupTextFieldWarning.swift */; }; 8706C3322AEF8A0300F7C842 /* TTSignupNextButtonForMac.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8706C3312AEF8A0300F7C842 /* TTSignupNextButtonForMac.swift */; }; - 870800502B2C38F900830B39 /* ServerURLAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708004F2B2C38F900830B39 /* ServerURLAPI.swift */; }; + 870800502B2C38F900830B39 /* ServerURLNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708004F2B2C38F900830B39 /* ServerURLNetwork.swift */; }; 870800522B2C3A0800830B39 /* ServerURLDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800512B2C3A0800830B39 /* ServerURLDTO.swift */; }; 870800542B2C3A5400830B39 /* ServerURLRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800532B2C3A5400830B39 /* ServerURLRepository.swift */; }; 870800562B2C3AC600830B39 /* ServerURLRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800552B2C3AC600830B39 /* ServerURLRepositoryInterface.swift */; }; 870800582B2C3B0C00830B39 /* GetServerURLUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800572B2C3B0C00830B39 /* GetServerURLUseCase.swift */; }; 8708005A2B2C3B5800830B39 /* GetServerURLUseCaseInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800592B2C3B5800830B39 /* GetServerURLUseCaseInterface.swift */; }; - 8708005C2B2C4D2D00830B39 /* AuthAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708005B2B2C4D2D00830B39 /* AuthAPI.swift */; }; + 8708005C2B2C4D2D00830B39 /* AuthNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708005B2B2C4D2D00830B39 /* AuthNetwork.swift */; }; 8708005F2B2C5F5F00830B39 /* AuthDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708005E2B2C5F5F00830B39 /* AuthDTO.swift */; }; 870800612B2C5FDA00830B39 /* AuthRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800602B2C5FDA00830B39 /* AuthRepository.swift */; }; 870800632B2C604100830B39 /* AuthInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800622B2C604100830B39 /* AuthInfo.swift */; }; 870800652B2C623600830B39 /* AuthRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800642B2C623600830B39 /* AuthRepositoryInterface.swift */; }; 870800672B2C67E900830B39 /* AuthUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800662B2C67E900830B39 /* AuthUseCase.swift */; }; 870800692B2C68EF00830B39 /* AuthUseCaseInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800682B2C68EF00830B39 /* AuthUseCaseInterface.swift */; }; - 8708006B2B2CA57C00830B39 /* DailysAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708006A2B2CA57C00830B39 /* DailysAPI.swift */; }; + 8708006B2B2CA57C00830B39 /* DailysNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708006A2B2CA57C00830B39 /* DailysNetwork.swift */; }; 8708006D2B2CA7AB00830B39 /* DailysRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708006C2B2CA7AB00830B39 /* DailysRepository.swift */; }; 8708006F2B2CA92C00830B39 /* DailyDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708006E2B2CA92C00830B39 /* DailyDTO.swift */; }; 870800712B2CAD9900830B39 /* TaskHistory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800702B2CAD9900830B39 /* TaskHistory.swift */; }; 870800732B2CB11B00830B39 /* DailyRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800722B2CB11B00830B39 /* DailyRepositoryInterface.swift */; }; 870800752B2D3C9A00830B39 /* DailysUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800742B2D3C9A00830B39 /* DailysUseCase.swift */; }; 870800772B2D41EA00830B39 /* DailysUseCaseInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800762B2D41EA00830B39 /* DailysUseCaseInterface.swift */; }; - 870800792B2D4DE500830B39 /* RecordTimesAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800782B2D4DE500830B39 /* RecordTimesAPI.swift */; }; + 870800792B2D4DE500830B39 /* RecordTimesNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800782B2D4DE500830B39 /* RecordTimesNetwork.swift */; }; 8708007B2B2D4F0800830B39 /* RecordTimesRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708007A2B2D4F0800830B39 /* RecordTimesRepository.swift */; }; 8708007D2B2D503600830B39 /* RecordTimesRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708007C2B2D503600830B39 /* RecordTimesRepositoryInterface.swift */; }; 8708007F2B2D543500830B39 /* RecordTimesUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708007E2B2D543500830B39 /* RecordTimesUseCase.swift */; }; 870800812B2D54B500830B39 /* RecordTimesUseCaseInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800802B2D54B500830B39 /* RecordTimesUseCaseInterface.swift */; }; 870800832B2D551700830B39 /* RecordTimesDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800822B2D551700830B39 /* RecordTimesDTO.swift */; }; - 870800852B2D593400830B39 /* SyncLogAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800842B2D593400830B39 /* SyncLogAPI.swift */; }; + 870800852B2D593400830B39 /* SyncLogNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800842B2D593400830B39 /* SyncLogNetwork.swift */; }; 870800872B2D599800830B39 /* SyncLogRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800862B2D599800830B39 /* SyncLogRepository.swift */; }; 870800892B2D59EB00830B39 /* SyncLogDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800882B2D59EB00830B39 /* SyncLogDTO.swift */; }; 8708008B2B2D5A4400830B39 /* SyncLogRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708008A2B2D5A4400830B39 /* SyncLogRepositoryInterface.swift */; }; @@ -130,7 +130,7 @@ 87306D712B26CC7B001B7C14 /* MiSans-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 87306D652B26CC79001B7C14 /* MiSans-Regular.ttf */; }; 87306D792B26CC7B001B7C14 /* MiSans-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 87306D692B26CC7A001B7C14 /* MiSans-Bold.ttf */; }; 87306D872B26D00A001B7C14 /* Fonts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04FA75D7286F2AB900BAE2B2 /* Fonts.swift */; }; - 873731D12B2E92BD00D7BD9F /* NotificationAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D02B2E92BD00D7BD9F /* NotificationAPI.swift */; }; + 873731D12B2E92BD00D7BD9F /* NotificationNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D02B2E92BD00D7BD9F /* NotificationNetwork.swift */; }; 873731D32B2E931800D7BD9F /* NotificationRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D22B2E931800D7BD9F /* NotificationRepository.swift */; }; 873731D52B2E938400D7BD9F /* NotificationDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D42B2E938400D7BD9F /* NotificationDTO.swift */; }; 873731D72B2E97C100D7BD9F /* NotificationRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D62B2E97C100D7BD9F /* NotificationRepositoryInterface.swift */; }; @@ -178,7 +178,7 @@ 875C98CB2871C0A7008F7ADD /* UIImage+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875C98CA2871C0A7008F7ADD /* UIImage+Extension.swift */; }; 875EDA342957E0360037A7EB /* NetworkInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875EDA332957E0360037A7EB /* NetworkInterceptor.swift */; }; 875EDA362957F9510037A7EB /* LoadingIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875EDA352957F9510037A7EB /* LoadingIndicator.swift */; }; - 875FAE252B1C6721008F19D2 /* AppVersionAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE242B1C6721008F19D2 /* AppVersionAPI.swift */; }; + 875FAE252B1C6721008F19D2 /* AppVersionNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE242B1C6721008F19D2 /* AppVersionNetwork.swift */; }; 875FAE282B1C679D008F19D2 /* AppLatestVersionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE272B1C679D008F19D2 /* AppLatestVersionInfo.swift */; }; 875FAE2A2B1C6829008F19D2 /* AppLatestVersionDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE292B1C6829008F19D2 /* AppLatestVersionDTO.swift */; }; 875FAE2C2B1C6B57008F19D2 /* AppLatestVersionRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE2B2B1C6B57008F19D2 /* AppLatestVersionRepository.swift */; }; @@ -202,6 +202,7 @@ 8761BDC42BCFE64000E9281A /* Moya in Frameworks */ = {isa = PBXBuildFile; productRef = 8761BDC32BCFE64000E9281A /* Moya */; }; 8761BDC62BCFE64000E9281A /* ReactiveMoya in Frameworks */ = {isa = PBXBuildFile; productRef = 8761BDC52BCFE64000E9281A /* ReactiveMoya */; }; 8761BDC82BCFE64000E9281A /* RxMoya in Frameworks */ = {isa = PBXBuildFile; productRef = 8761BDC72BCFE64000E9281A /* RxMoya */; }; + 8761BDCA2BCFEA7A00E9281A /* AuthAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8761BDC92BCFEA7A00E9281A /* AuthAPI.swift */; }; 8765234628C76B6D00487BFB /* WeekSmallTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8765234528C76B6D00487BFB /* WeekSmallTime.swift */; }; 8765234828C76FFE00487BFB /* WeekSmallVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8765234728C76FFE00487BFB /* WeekSmallVM.swift */; }; 8765234A28C7709700487BFB /* WeekSmallView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8765234928C7709700487BFB /* WeekSmallView.swift */; }; @@ -476,33 +477,33 @@ 8706C32D2AEF878D00F7C842 /* TTSignupTextFieldUnderlineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TTSignupTextFieldUnderlineView.swift; sourceTree = ""; }; 8706C32F2AEF881500F7C842 /* TTSignupTextFieldWarning.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TTSignupTextFieldWarning.swift; sourceTree = ""; }; 8706C3312AEF8A0300F7C842 /* TTSignupNextButtonForMac.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TTSignupNextButtonForMac.swift; sourceTree = ""; }; - 8708004F2B2C38F900830B39 /* ServerURLAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerURLAPI.swift; sourceTree = ""; }; + 8708004F2B2C38F900830B39 /* ServerURLNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerURLNetwork.swift; sourceTree = ""; }; 870800512B2C3A0800830B39 /* ServerURLDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerURLDTO.swift; sourceTree = ""; }; 870800532B2C3A5400830B39 /* ServerURLRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerURLRepository.swift; sourceTree = ""; }; 870800552B2C3AC600830B39 /* ServerURLRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerURLRepositoryInterface.swift; sourceTree = ""; }; 870800572B2C3B0C00830B39 /* GetServerURLUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetServerURLUseCase.swift; sourceTree = ""; }; 870800592B2C3B5800830B39 /* GetServerURLUseCaseInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetServerURLUseCaseInterface.swift; sourceTree = ""; }; - 8708005B2B2C4D2D00830B39 /* AuthAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthAPI.swift; sourceTree = ""; }; + 8708005B2B2C4D2D00830B39 /* AuthNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthNetwork.swift; sourceTree = ""; }; 8708005E2B2C5F5F00830B39 /* AuthDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthDTO.swift; sourceTree = ""; }; 870800602B2C5FDA00830B39 /* AuthRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthRepository.swift; sourceTree = ""; }; 870800622B2C604100830B39 /* AuthInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthInfo.swift; sourceTree = ""; }; 870800642B2C623600830B39 /* AuthRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthRepositoryInterface.swift; sourceTree = ""; }; 870800662B2C67E900830B39 /* AuthUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthUseCase.swift; sourceTree = ""; }; 870800682B2C68EF00830B39 /* AuthUseCaseInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthUseCaseInterface.swift; sourceTree = ""; }; - 8708006A2B2CA57C00830B39 /* DailysAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailysAPI.swift; sourceTree = ""; }; + 8708006A2B2CA57C00830B39 /* DailysNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailysNetwork.swift; sourceTree = ""; }; 8708006C2B2CA7AB00830B39 /* DailysRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailysRepository.swift; sourceTree = ""; }; 8708006E2B2CA92C00830B39 /* DailyDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailyDTO.swift; sourceTree = ""; }; 870800702B2CAD9900830B39 /* TaskHistory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskHistory.swift; sourceTree = ""; }; 870800722B2CB11B00830B39 /* DailyRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailyRepositoryInterface.swift; sourceTree = ""; }; 870800742B2D3C9A00830B39 /* DailysUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailysUseCase.swift; sourceTree = ""; }; 870800762B2D41EA00830B39 /* DailysUseCaseInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailysUseCaseInterface.swift; sourceTree = ""; }; - 870800782B2D4DE500830B39 /* RecordTimesAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesAPI.swift; sourceTree = ""; }; + 870800782B2D4DE500830B39 /* RecordTimesNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesNetwork.swift; sourceTree = ""; }; 8708007A2B2D4F0800830B39 /* RecordTimesRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesRepository.swift; sourceTree = ""; }; 8708007C2B2D503600830B39 /* RecordTimesRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesRepositoryInterface.swift; sourceTree = ""; }; 8708007E2B2D543500830B39 /* RecordTimesUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesUseCase.swift; sourceTree = ""; }; 870800802B2D54B500830B39 /* RecordTimesUseCaseInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesUseCaseInterface.swift; sourceTree = ""; }; 870800822B2D551700830B39 /* RecordTimesDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesDTO.swift; sourceTree = ""; }; - 870800842B2D593400830B39 /* SyncLogAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncLogAPI.swift; sourceTree = ""; }; + 870800842B2D593400830B39 /* SyncLogNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncLogNetwork.swift; sourceTree = ""; }; 870800862B2D599800830B39 /* SyncLogRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncLogRepository.swift; sourceTree = ""; }; 870800882B2D59EB00830B39 /* SyncLogDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncLogDTO.swift; sourceTree = ""; }; 8708008A2B2D5A4400830B39 /* SyncLogRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncLogRepositoryInterface.swift; sourceTree = ""; }; @@ -558,7 +559,7 @@ 87306D692B26CC7A001B7C14 /* MiSans-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "MiSans-Bold.ttf"; sourceTree = ""; }; 873648A22B0D8CE10053B080 /* Project_TimerDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Project_TimerDebug.entitlements; sourceTree = ""; }; 873648A32B0D8DDF0053B080 /* Project_TimerDevelop.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Project_TimerDevelop.entitlements; sourceTree = ""; }; - 873731D02B2E92BD00D7BD9F /* NotificationAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationAPI.swift; sourceTree = ""; }; + 873731D02B2E92BD00D7BD9F /* NotificationNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationNetwork.swift; sourceTree = ""; }; 873731D22B2E931800D7BD9F /* NotificationRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationRepository.swift; sourceTree = ""; }; 873731D42B2E938400D7BD9F /* NotificationDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationDTO.swift; sourceTree = ""; }; 873731D62B2E97C100D7BD9F /* NotificationRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationRepositoryInterface.swift; sourceTree = ""; }; @@ -606,7 +607,7 @@ 875C98CA2871C0A7008F7ADD /* UIImage+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+Extension.swift"; sourceTree = ""; }; 875EDA332957E0360037A7EB /* NetworkInterceptor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkInterceptor.swift; sourceTree = ""; }; 875EDA352957F9510037A7EB /* LoadingIndicator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingIndicator.swift; sourceTree = ""; }; - 875FAE242B1C6721008F19D2 /* AppVersionAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppVersionAPI.swift; sourceTree = ""; }; + 875FAE242B1C6721008F19D2 /* AppVersionNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppVersionNetwork.swift; sourceTree = ""; }; 875FAE272B1C679D008F19D2 /* AppLatestVersionInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLatestVersionInfo.swift; sourceTree = ""; }; 875FAE292B1C6829008F19D2 /* AppLatestVersionDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLatestVersionDTO.swift; sourceTree = ""; }; 875FAE2B2B1C6B57008F19D2 /* AppLatestVersionRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLatestVersionRepository.swift; sourceTree = ""; }; @@ -623,6 +624,7 @@ 87617E612A0CDF1700E312EA /* CalendarWidgetEntry.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarWidgetEntry.swift; sourceTree = ""; }; 87617E662A0CE58400E312EA /* CalendarWidgetProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarWidgetProvider.swift; sourceTree = ""; }; 8761BDBF2BCFE52E00E9281A /* FirebaseAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseAPI.swift; sourceTree = ""; }; + 8761BDC92BCFEA7A00E9281A /* AuthAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthAPI.swift; sourceTree = ""; }; 8765234528C76B6D00487BFB /* WeekSmallTime.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeekSmallTime.swift; sourceTree = ""; }; 8765234728C76FFE00487BFB /* WeekSmallVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeekSmallVM.swift; sourceTree = ""; }; 8765234928C7709700487BFB /* WeekSmallView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeekSmallView.swift; sourceTree = ""; }; @@ -1163,6 +1165,7 @@ children = ( 8761BDBE2BCFE48D00E9281A /* lagacy */, 8761BDBF2BCFE52E00E9281A /* FirebaseAPI.swift */, + 8761BDC92BCFEA7A00E9281A /* AuthAPI.swift */, ); path = API; sourceTree = ""; @@ -1272,13 +1275,13 @@ 8761BDBE2BCFE48D00E9281A /* lagacy */ = { isa = PBXGroup; children = ( - 875FAE242B1C6721008F19D2 /* AppVersionAPI.swift */, - 8708004F2B2C38F900830B39 /* ServerURLAPI.swift */, - 8708005B2B2C4D2D00830B39 /* AuthAPI.swift */, - 8708006A2B2CA57C00830B39 /* DailysAPI.swift */, - 870800782B2D4DE500830B39 /* RecordTimesAPI.swift */, - 870800842B2D593400830B39 /* SyncLogAPI.swift */, - 873731D02B2E92BD00D7BD9F /* NotificationAPI.swift */, + 875FAE242B1C6721008F19D2 /* AppVersionNetwork.swift */, + 8708004F2B2C38F900830B39 /* ServerURLNetwork.swift */, + 8708005B2B2C4D2D00830B39 /* AuthNetwork.swift */, + 8708006A2B2CA57C00830B39 /* DailysNetwork.swift */, + 870800782B2D4DE500830B39 /* RecordTimesNetwork.swift */, + 870800842B2D593400830B39 /* SyncLogNetwork.swift */, + 873731D02B2E92BD00D7BD9F /* NotificationNetwork.swift */, ); path = lagacy; sourceTree = ""; @@ -2243,7 +2246,7 @@ 875A5F792A207BA600679A72 /* NavigationBarInformationButton.swift in Sources */, 879D20772A19101C00D8A420 /* BottomSheetViewController.swift in Sources */, 048D8AD028AABC9E00A2456D /* AddNewTaskHistoryCell.swift in Sources */, - 870800792B2D4DE500830B39 /* RecordTimesAPI.swift in Sources */, + 870800792B2D4DE500830B39 /* RecordTimesNetwork.swift in Sources */, 043706312869FB0E00A5D3AA /* StopwatchTimeLabelView.swift in Sources */, 04E0DFCB28A926C1004DABBE /* TaskInteractionView.swift in Sources */, 875A5F7B2A20836600679A72 /* HowToUseWidgetVC.swift in Sources */, @@ -2261,14 +2264,14 @@ 87EA022F2B9BF927003439F2 /* UIViewControllerPreview.swift in Sources */, 87EA02312B9BF941003439F2 /* UIViewPreview.swift in Sources */, 873C197A28D04B5B00E02ADC /* DayOfWeekText.swift in Sources */, - 870800852B2D593400830B39 /* SyncLogAPI.swift in Sources */, + 870800852B2D593400830B39 /* SyncLogNetwork.swift in Sources */, 87163DCA2ACAF89B008D4072 /* NetworkResult.swift in Sources */, 874F9C2B2ABFF51700675A86 /* SigninSelectView.swift in Sources */, 871C1A0328519CC200BDAE02 /* SettingDevInfoCell.swift in Sources */, 87ED9ABF28D16FC200186677 /* TasksCircularProgressDTO.swift in Sources */, 87D4DCD62BA5A7B100BB5AAB /* ResetPasswordEmailRoute.swift in Sources */, 049BBA9828AB3D94005BAB1B /* ModifyFinishButton.swift in Sources */, - 873731D12B2E92BD00D7BD9F /* NotificationAPI.swift in Sources */, + 873731D12B2E92BD00D7BD9F /* NotificationNetwork.swift in Sources */, 873731D52B2E938400D7BD9F /* NotificationDTO.swift in Sources */, 8708006D2B2CA7AB00830B39 /* DailysRepository.swift in Sources */, 8758E4F528C7124900A99484 /* MonthSmallView.swift in Sources */, @@ -2370,7 +2373,7 @@ 87E5C70D2AE0268C00BE46B0 /* SignupEmailView.swift in Sources */, 049BBA9A28AB5747005BAB1B /* TaskModifyInteractionView.swift in Sources */, 87A8CD272AF0C4B600D4C1D7 /* OverlayShowButtonForSecureFieldView.swift in Sources */, - 870800502B2C38F900830B39 /* ServerURLAPI.swift in Sources */, + 870800502B2C38F900830B39 /* ServerURLNetwork.swift in Sources */, 870E85012AD67E46000511BD /* KeyboardResponder.swift in Sources */, 870800872B2D599800830B39 /* SyncLogRepository.swift in Sources */, 87A48BCB27DF112B00F46D0F /* LogHomeVM.swift in Sources */, @@ -2396,6 +2399,7 @@ 87F1093B284C589A002E31EA /* SettingFunctionsListVM.swift in Sources */, 8708006F2B2CA92C00830B39 /* DailyDTO.swift in Sources */, 8788997C2894F00000B7F378 /* LogWeekVM.swift in Sources */, + 8761BDCA2BCFEA7A00E9281A /* AuthAPI.swift in Sources */, 87EFD6812AC115DB00C422B1 /* SigninSignupVC.swift in Sources */, 873C197828D044CC00E02ADC /* DailyVM.swift in Sources */, 87BF666C28F80EA500CD6F19 /* NormalTimeLabelVM.swift in Sources */, @@ -2455,7 +2459,7 @@ 87306D572B260AB8001B7C14 /* TLRkey.swift in Sources */, 043706332869FB9F00A5D3AA /* StopwatchTimeLabelVM.swift in Sources */, 87BEBEEF281CD7EC0095CD29 /* UIViewController+Extension.swift in Sources */, - 8708005C2B2C4D2D00830B39 /* AuthAPI.swift in Sources */, + 8708005C2B2C4D2D00830B39 /* AuthNetwork.swift in Sources */, 87D4C95A28950B4E008ECAA4 /* WeekDailysData.swift in Sources */, 87199F462883018C0017D01A /* TimelineDailyGraphView.swift in Sources */, 87476DAD28A2794B00FAD273 /* LastestVersionInfo.swift in Sources */, @@ -2486,7 +2490,7 @@ 876E27762AC1CD2A0054250D /* Infos.swift in Sources */, 049BBA9C28AB58D4005BAB1B /* InteractionLeftTitleLabel.swift in Sources */, 871AB69D2967C9D100AFED1C /* TimeTableVM.swift in Sources */, - 8708006B2B2CA57C00830B39 /* DailysAPI.swift in Sources */, + 8708006B2B2CA57C00830B39 /* DailysNetwork.swift in Sources */, 870800582B2C3B0C00830B39 /* GetServerURLUseCase.swift in Sources */, 87D4DCD22BA5A4C400BB5AAB /* ResetPasswordEmailView.swift in Sources */, 878813E52A209BA0000ED2C1 /* HowToAddWidgetVC.swift in Sources */, @@ -2514,7 +2518,7 @@ 0437062D2869EC2200A5D3AA /* TimerTimeLabelVM.swift in Sources */, 878899882894F0B900B7F378 /* WeekTimelineVM.swift in Sources */, 87910823283875CF005D7B10 /* NetworkProtocols.swift in Sources */, - 875FAE252B1C6721008F19D2 /* AppVersionAPI.swift in Sources */, + 875FAE252B1C6721008F19D2 /* AppVersionNetwork.swift in Sources */, 04F0D2B9286607A7007ED596 /* BaseSingleTimeLabelVM.swift in Sources */, 8751C6F428472066007FAFC4 /* SettingCell.swift in Sources */, 87035DF2282201A500055378 /* TimerVM.swift in Sources */, diff --git a/Project_Timer/Data/API/AuthAPI.swift b/Project_Timer/Data/API/AuthAPI.swift new file mode 100644 index 00000000..4b221679 --- /dev/null +++ b/Project_Timer/Data/API/AuthAPI.swift @@ -0,0 +1,54 @@ +// +// AuthAPI.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/04/17. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Moya + +enum AuthAPI { + case postSignup + case postSignin + case getCheckUsername + case getCheckEmail + case postUpdatePassword +} + +extension AuthAPI: TargetType { + var baseURL: URL { + return URL(string: NetworkURL.shared.serverURL ?? "nil")! + } + + var path: String { + switch self { + case .postSignup: + return "/auth/signup" + case .postSignin: + return "/auth/login" + case .getCheckUsername, .getCheckEmail: + return "/auth/users" + case .postUpdatePassword: + return "/auth/users/password" + } + } + + var method: Moya.Method { + switch self { + case .postSignup, .postSignin, .postUpdatePassword: + return .post + case .getCheckUsername, .getCheckEmail: + return .get + } + } + + var task: Moya.Task { + return .requestPlain + } + + var headers: [String : String]? { + return nil + } +} diff --git a/Project_Timer/Data/API/lagacy/AppVersionAPI.swift b/Project_Timer/Data/API/lagacy/AppVersionNetwork.swift similarity index 91% rename from Project_Timer/Data/API/lagacy/AppVersionAPI.swift rename to Project_Timer/Data/API/lagacy/AppVersionNetwork.swift index 669fabe3..064a4d82 100644 --- a/Project_Timer/Data/API/lagacy/AppVersionAPI.swift +++ b/Project_Timer/Data/API/lagacy/AppVersionNetwork.swift @@ -1,5 +1,5 @@ // -// AppVersionAPI.swift +// AppVersionNetwork.swift // Project_Timer // // Created by Kang Minsang on 2023/12/03. @@ -8,7 +8,7 @@ import Foundation -final class AppVersionAPI { +final class AppVersionNetwork { private let network = Network() private var latestVersionURL: String { let base = Infos.FirestoreURL.value diff --git a/Project_Timer/Data/API/lagacy/AuthAPI.swift b/Project_Timer/Data/API/lagacy/AuthNetwork.swift similarity index 97% rename from Project_Timer/Data/API/lagacy/AuthAPI.swift rename to Project_Timer/Data/API/lagacy/AuthNetwork.swift index 79bf7ced..65a9703c 100644 --- a/Project_Timer/Data/API/lagacy/AuthAPI.swift +++ b/Project_Timer/Data/API/lagacy/AuthNetwork.swift @@ -1,5 +1,5 @@ // -// AuthAPI.swift +// AuthNetwork.swift // Project_Timer // // Created by Kang Minsang on 2023/12/15. @@ -7,8 +7,9 @@ // import Foundation +import Moya -final class AuthAPI { +final class AuthNetwork { private let network = Network() private var signupURL: String { let base = NetworkURL.shared.serverURL ?? "nil" diff --git a/Project_Timer/Data/API/lagacy/DailysAPI.swift b/Project_Timer/Data/API/lagacy/DailysNetwork.swift similarity index 94% rename from Project_Timer/Data/API/lagacy/DailysAPI.swift rename to Project_Timer/Data/API/lagacy/DailysNetwork.swift index 71e09f9d..dc943522 100644 --- a/Project_Timer/Data/API/lagacy/DailysAPI.swift +++ b/Project_Timer/Data/API/lagacy/DailysNetwork.swift @@ -1,5 +1,5 @@ // -// DailysAPI.swift +// DailysNetwork.swift // Project_Timer // // Created by Kang Minsang on 2023/12/16. @@ -8,7 +8,7 @@ import Foundation -final class DailysAPI { +final class DailysNetwork { private let network = Network() private var uploadDailysURL: String { let base = NetworkURL.shared.serverURL ?? "nil" diff --git a/Project_Timer/Data/API/lagacy/NotificationAPI.swift b/Project_Timer/Data/API/lagacy/NotificationNetwork.swift similarity index 91% rename from Project_Timer/Data/API/lagacy/NotificationAPI.swift rename to Project_Timer/Data/API/lagacy/NotificationNetwork.swift index 96c24aa1..930f596c 100644 --- a/Project_Timer/Data/API/lagacy/NotificationAPI.swift +++ b/Project_Timer/Data/API/lagacy/NotificationNetwork.swift @@ -1,5 +1,5 @@ // -// NotificationAPI.swift +// NotificationNetwork.swift // Project_Timer // // Created by Kang Minsang on 2023/12/17. @@ -8,7 +8,7 @@ import Foundation -final class NotificationAPI { +final class NotificationNetwork { private let network = Network() private var url: String { let base = Infos.FirestoreURL.value diff --git a/Project_Timer/Data/API/lagacy/RecordTimesAPI.swift b/Project_Timer/Data/API/lagacy/RecordTimesNetwork.swift similarity index 95% rename from Project_Timer/Data/API/lagacy/RecordTimesAPI.swift rename to Project_Timer/Data/API/lagacy/RecordTimesNetwork.swift index f970ea0d..ecc452a2 100644 --- a/Project_Timer/Data/API/lagacy/RecordTimesAPI.swift +++ b/Project_Timer/Data/API/lagacy/RecordTimesNetwork.swift @@ -8,7 +8,7 @@ import Foundation -final class RecordTimesAPI { +final class RecordTimesNetwork { private let network = Network() private var url: String { let base = NetworkURL.shared.serverURL ?? "nil" diff --git a/Project_Timer/Data/API/lagacy/ServerURLAPI.swift b/Project_Timer/Data/API/lagacy/ServerURLNetwork.swift similarity index 89% rename from Project_Timer/Data/API/lagacy/ServerURLAPI.swift rename to Project_Timer/Data/API/lagacy/ServerURLNetwork.swift index 1b0811d8..feeff30b 100644 --- a/Project_Timer/Data/API/lagacy/ServerURLAPI.swift +++ b/Project_Timer/Data/API/lagacy/ServerURLNetwork.swift @@ -1,5 +1,5 @@ // -// ServerURLAPI.swift +// ServerURLNetwork.swift // Project_Timer // // Created by Kang Minsang on 2023/12/15. @@ -8,7 +8,7 @@ import Foundation -final class ServerURLAPI { +final class ServerURLNetwork { private let network = Network() private var url: String { let base = Infos.FirestoreURL.value diff --git a/Project_Timer/Data/API/lagacy/SyncLogAPI.swift b/Project_Timer/Data/API/lagacy/SyncLogNetwork.swift similarity index 89% rename from Project_Timer/Data/API/lagacy/SyncLogAPI.swift rename to Project_Timer/Data/API/lagacy/SyncLogNetwork.swift index 40876ad5..0a09aa5c 100644 --- a/Project_Timer/Data/API/lagacy/SyncLogAPI.swift +++ b/Project_Timer/Data/API/lagacy/SyncLogNetwork.swift @@ -1,5 +1,5 @@ // -// SyncLogAPI.swift +// SyncLogNetwork.swift // Project_Timer // // Created by Kang Minsang on 2023/12/16. @@ -8,7 +8,7 @@ import Foundation -final class SyncLogAPI { +final class SyncLogNetwork { private let network = Network() private var url: String { let base = NetworkURL.shared.serverURL ?? "nil" diff --git a/Project_Timer/Data/Repository/AppLatestVersionRepository.swift b/Project_Timer/Data/Repository/AppLatestVersionRepository.swift index a5489f89..92272fbd 100644 --- a/Project_Timer/Data/Repository/AppLatestVersionRepository.swift +++ b/Project_Timer/Data/Repository/AppLatestVersionRepository.swift @@ -9,7 +9,7 @@ import Foundation final class AppLatestVersionRepository: AppLatestVersionRepositoryInterface { - private let api = AppVersionAPI() + private let api = AppVersionNetwork() func get(completion: @escaping (Result) -> Void) { api.get { result in diff --git a/Project_Timer/Data/Repository/AuthRepository.swift b/Project_Timer/Data/Repository/AuthRepository.swift index f7076d03..3b19b3fa 100644 --- a/Project_Timer/Data/Repository/AuthRepository.swift +++ b/Project_Timer/Data/Repository/AuthRepository.swift @@ -9,7 +9,7 @@ import Foundation final class AuthRepository: AuthRepositoryInterface { - private let api = AuthAPI() + private let api = AuthNetwork() func signup(signupInfo: TestUserSignupInfo, completion: @escaping (Result) -> Void) { api.signup(signupInfo: signupInfo) { result in diff --git a/Project_Timer/Data/Repository/DailysRepository.swift b/Project_Timer/Data/Repository/DailysRepository.swift index 2c881834..beaed27f 100644 --- a/Project_Timer/Data/Repository/DailysRepository.swift +++ b/Project_Timer/Data/Repository/DailysRepository.swift @@ -9,7 +9,7 @@ import Foundation final class DailysRepository: DailysRepositoryInterface { - private let api = DailysAPI() + private let api = DailysNetwork() func upload(dailys: [Daily], completion: @escaping (Result) -> Void) { api.upload(dailys: dailys) { result in diff --git a/Project_Timer/Data/Repository/NotificationRepository.swift b/Project_Timer/Data/Repository/NotificationRepository.swift index a6585e97..91675762 100644 --- a/Project_Timer/Data/Repository/NotificationRepository.swift +++ b/Project_Timer/Data/Repository/NotificationRepository.swift @@ -9,7 +9,7 @@ import Foundation final class NotificationRepository: NotificationRepositoryInterface { - private let api = NotificationAPI() + private let api = NotificationNetwork() func get(completion: @escaping (Result) -> Void) { api.get { result in diff --git a/Project_Timer/Data/Repository/RecordTimesRepository.swift b/Project_Timer/Data/Repository/RecordTimesRepository.swift index ca64ddf5..fc5dc0b7 100644 --- a/Project_Timer/Data/Repository/RecordTimesRepository.swift +++ b/Project_Timer/Data/Repository/RecordTimesRepository.swift @@ -9,7 +9,7 @@ import Foundation final class RecordTimesRepository: RecordTimesRepositoryInterface { - private let api = RecordTimesAPI() + private let api = RecordTimesNetwork() func upload(recordTimes: RecordTimes, completion: @escaping (Result) -> Void) { api.upload(recordTimes: recordTimes) { result in diff --git a/Project_Timer/Data/Repository/ServerURLRepository.swift b/Project_Timer/Data/Repository/ServerURLRepository.swift index 2c4d8c2d..e819daa4 100644 --- a/Project_Timer/Data/Repository/ServerURLRepository.swift +++ b/Project_Timer/Data/Repository/ServerURLRepository.swift @@ -9,7 +9,7 @@ import Foundation final class ServerURLRepository: ServerURLRepositoryInterface { - private let api = ServerURLAPI() + private let api = ServerURLNetwork() func get(completion: @escaping (Result) -> Void) { api.get { result in diff --git a/Project_Timer/Data/Repository/SyncLogRepository.swift b/Project_Timer/Data/Repository/SyncLogRepository.swift index 91f45771..10ec8a70 100644 --- a/Project_Timer/Data/Repository/SyncLogRepository.swift +++ b/Project_Timer/Data/Repository/SyncLogRepository.swift @@ -9,7 +9,7 @@ import Foundation final class SyncLogRepository: SyncLogRepositoryInterface { - private let api = SyncLogAPI() + private let api = SyncLogNetwork() func get(completion: @escaping (Result) -> Void) { api.get { result in From 234bec5915f4978590acbcdec43608d4a4f06b5e Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Wed, 17 Apr 2024 20:46:25 +0900 Subject: [PATCH 03/44] =?UTF-8?q?feat=20#144:=20DailysAPI=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 4 ++ Project_Timer/Data/API/DailysAPI.swift | 52 +++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 Project_Timer/Data/API/DailysAPI.swift diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index 35b71981..ff4f87b0 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -203,6 +203,7 @@ 8761BDC62BCFE64000E9281A /* ReactiveMoya in Frameworks */ = {isa = PBXBuildFile; productRef = 8761BDC52BCFE64000E9281A /* ReactiveMoya */; }; 8761BDC82BCFE64000E9281A /* RxMoya in Frameworks */ = {isa = PBXBuildFile; productRef = 8761BDC72BCFE64000E9281A /* RxMoya */; }; 8761BDCA2BCFEA7A00E9281A /* AuthAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8761BDC92BCFEA7A00E9281A /* AuthAPI.swift */; }; + 8761BDCC2BCFEC8500E9281A /* DailysAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8761BDCB2BCFEC8500E9281A /* DailysAPI.swift */; }; 8765234628C76B6D00487BFB /* WeekSmallTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8765234528C76B6D00487BFB /* WeekSmallTime.swift */; }; 8765234828C76FFE00487BFB /* WeekSmallVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8765234728C76FFE00487BFB /* WeekSmallVM.swift */; }; 8765234A28C7709700487BFB /* WeekSmallView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8765234928C7709700487BFB /* WeekSmallView.swift */; }; @@ -625,6 +626,7 @@ 87617E662A0CE58400E312EA /* CalendarWidgetProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarWidgetProvider.swift; sourceTree = ""; }; 8761BDBF2BCFE52E00E9281A /* FirebaseAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseAPI.swift; sourceTree = ""; }; 8761BDC92BCFEA7A00E9281A /* AuthAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthAPI.swift; sourceTree = ""; }; + 8761BDCB2BCFEC8500E9281A /* DailysAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailysAPI.swift; sourceTree = ""; }; 8765234528C76B6D00487BFB /* WeekSmallTime.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeekSmallTime.swift; sourceTree = ""; }; 8765234728C76FFE00487BFB /* WeekSmallVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeekSmallVM.swift; sourceTree = ""; }; 8765234928C7709700487BFB /* WeekSmallView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeekSmallView.swift; sourceTree = ""; }; @@ -1166,6 +1168,7 @@ 8761BDBE2BCFE48D00E9281A /* lagacy */, 8761BDBF2BCFE52E00E9281A /* FirebaseAPI.swift */, 8761BDC92BCFEA7A00E9281A /* AuthAPI.swift */, + 8761BDCB2BCFEC8500E9281A /* DailysAPI.swift */, ); path = API; sourceTree = ""; @@ -2453,6 +2456,7 @@ 870800562B2C3AC600830B39 /* ServerURLRepositoryInterface.swift in Sources */, 8761BDC02BCFE52E00E9281A /* FirebaseAPI.swift in Sources */, 877036CA29CD7B3B0078A30C /* TaskManager.swift in Sources */, + 8761BDCC2BCFEC8500E9281A /* DailysAPI.swift in Sources */, 878DA8212B0C62E1001E924E /* SignupNicknameView.swift in Sources */, 048D8ACB28AA49F800A2456D /* PopupEditHistoryVC.swift in Sources */, 878DA81F2B0C62A9001E924E /* SignupNicknameModel.swift in Sources */, diff --git a/Project_Timer/Data/API/DailysAPI.swift b/Project_Timer/Data/API/DailysAPI.swift new file mode 100644 index 00000000..0cc71599 --- /dev/null +++ b/Project_Timer/Data/API/DailysAPI.swift @@ -0,0 +1,52 @@ +// +// DailysAPI.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/04/17. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Moya + +enum DailysAPI { + case postDailys + case getDailys + case postRecordTime + case getRecordTime + case getSyncLog +} + +extension DailysAPI: TargetType { + var baseURL: URL { + return URL(string: NetworkURL.shared.serverURL ?? "nil")! + } + + var path: String { + switch self { + case .postDailys, .getDailys: + return "/dailys/upload" + case .postRecordTime, .getRecordTime: + return "/recordTime" + case .getSyncLog: + return "/syncLog" + } + } + + var method: Moya.Method { + switch self { + case .postDailys, .postRecordTime: + return .post + case .getDailys, .getRecordTime, .getSyncLog: + return .get + } + } + + var task: Moya.Task { + return .requestPlain + } + + var headers: [String : String]? { + return nil + } +} From 0d80edf469c87e2d8ac76f7d4f8646de27a2e457 Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Wed, 17 Apr 2024 21:00:04 +0900 Subject: [PATCH 04/44] =?UTF-8?q?update=20#144:=20AuthAPI:=20task=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 4 ++++ Project_Timer/Data/API/API.swift | 22 ++++++++++++++++++ Project_Timer/Data/API/AuthAPI.swift | 31 +++++++++++++++++++------ 3 files changed, 50 insertions(+), 7 deletions(-) create mode 100644 Project_Timer/Data/API/API.swift diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index ff4f87b0..180532a8 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -204,6 +204,7 @@ 8761BDC82BCFE64000E9281A /* RxMoya in Frameworks */ = {isa = PBXBuildFile; productRef = 8761BDC72BCFE64000E9281A /* RxMoya */; }; 8761BDCA2BCFEA7A00E9281A /* AuthAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8761BDC92BCFEA7A00E9281A /* AuthAPI.swift */; }; 8761BDCC2BCFEC8500E9281A /* DailysAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8761BDCB2BCFEC8500E9281A /* DailysAPI.swift */; }; + 8761BDCE2BCFEFD500E9281A /* API.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8761BDCD2BCFEFD500E9281A /* API.swift */; }; 8765234628C76B6D00487BFB /* WeekSmallTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8765234528C76B6D00487BFB /* WeekSmallTime.swift */; }; 8765234828C76FFE00487BFB /* WeekSmallVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8765234728C76FFE00487BFB /* WeekSmallVM.swift */; }; 8765234A28C7709700487BFB /* WeekSmallView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8765234928C7709700487BFB /* WeekSmallView.swift */; }; @@ -627,6 +628,7 @@ 8761BDBF2BCFE52E00E9281A /* FirebaseAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseAPI.swift; sourceTree = ""; }; 8761BDC92BCFEA7A00E9281A /* AuthAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthAPI.swift; sourceTree = ""; }; 8761BDCB2BCFEC8500E9281A /* DailysAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailysAPI.swift; sourceTree = ""; }; + 8761BDCD2BCFEFD500E9281A /* API.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = API.swift; sourceTree = ""; }; 8765234528C76B6D00487BFB /* WeekSmallTime.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeekSmallTime.swift; sourceTree = ""; }; 8765234728C76FFE00487BFB /* WeekSmallVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeekSmallVM.swift; sourceTree = ""; }; 8765234928C7709700487BFB /* WeekSmallView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeekSmallView.swift; sourceTree = ""; }; @@ -1169,6 +1171,7 @@ 8761BDBF2BCFE52E00E9281A /* FirebaseAPI.swift */, 8761BDC92BCFEA7A00E9281A /* AuthAPI.swift */, 8761BDCB2BCFEC8500E9281A /* DailysAPI.swift */, + 8761BDCD2BCFEFD500E9281A /* API.swift */, ); path = API; sourceTree = ""; @@ -2392,6 +2395,7 @@ 87A4704826493D4D007B89D6 /* RecordTimes.swift in Sources */, 87A8CD252AF0C37200D4C1D7 /* TTSignupSecureFieldView.swift in Sources */, 872C0EE3284AF26A00E8E3F2 /* SettingUpdateHistoryVM.swift in Sources */, + 8761BDCE2BCFEFD500E9281A /* API.swift in Sources */, 87EFD6832AC12C3800C422B1 /* SigninSignupEnvironment.swift in Sources */, 93A892B124C14D4700F89180 /* CircularProgressView.swift in Sources */, 8791C1F427DCD120000D6BA9 /* UserDefaultsManager.swift in Sources */, diff --git a/Project_Timer/Data/API/API.swift b/Project_Timer/Data/API/API.swift new file mode 100644 index 00000000..2a6cf5d1 --- /dev/null +++ b/Project_Timer/Data/API/API.swift @@ -0,0 +1,22 @@ +// +// API.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/04/17. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Moya + +extension TargetType { + func parameters(from encodable: Encodable) -> [String: Any] { + let encoder = JSONEncoder() + guard let data = try? encoder.encode(encodable), + let dictionary = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any] else { + return [:] + } + + return dictionary + } +} diff --git a/Project_Timer/Data/API/AuthAPI.swift b/Project_Timer/Data/API/AuthAPI.swift index 4b221679..65d928c8 100644 --- a/Project_Timer/Data/API/AuthAPI.swift +++ b/Project_Timer/Data/API/AuthAPI.swift @@ -10,11 +10,11 @@ import Foundation import Moya enum AuthAPI { - case postSignup - case postSignin - case getCheckUsername - case getCheckEmail - case postUpdatePassword + case postSignup(TestUserSignupInfo) + case postSignin(TestUserSigninInfo) + case getCheckUsername(String) + case getCheckEmail(String, String) + case postUpdatePassword(ResetPasswordRequest) } extension AuthAPI: TargetType { @@ -45,10 +45,27 @@ extension AuthAPI: TargetType { } var task: Moya.Task { - return .requestPlain + switch self { + case .postSignup(let testUserSignupInfo): + return .requestJSONEncodable(testUserSignupInfo) + case .postSignin(let testUserSignupInfo): + return .requestJSONEncodable(testUserSignupInfo) + case .getCheckUsername(let username): + return .requestParameters(parameters: [ + "username" : username + ], encoding: URLEncoding.queryString) + case .getCheckEmail(let username, let email): + return .requestParameters(parameters: [ + "username": username, + "email": email + ], encoding: URLEncoding.queryString) + case .postUpdatePassword(let resetPasswordRequest): + return .requestJSONEncodable(resetPasswordRequest) + } } - var headers: [String : String]? { + var headers: [String: String]? { return nil } } + From f554462c518a99c1aaa1146cc14d0281eabf6d44 Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Wed, 15 May 2024 18:44:03 +0900 Subject: [PATCH 05/44] =?UTF-8?q?feat=20#144:=20getAppVersion=20RxMoya=20?= =?UTF-8?q?=EB=B0=A9=EC=8B=9D=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 78 ++++++++++++------- Project_Timer/Data/API/API.swift | 2 +- Project_Timer/Data/API/DailysAPI.swift | 13 +++- Project_Timer/Data/DTO/FunctionInfo.swift | 8 +- .../Data/DTO/LastestVersionInfo.swift | 8 +- Project_Timer/Data/DTO/NotificationDTO.swift | 20 ++--- Project_Timer/Data/DTO/ServerURLDTO.swift | 4 +- Project_Timer/Data/DTO/SurveyInfo.swift | 8 +- Project_Timer/Data/DTO/UpdateInfo.swift | 12 +-- Project_Timer/Data/DTO/YoutubeLinkInfo.swift | 4 +- .../Entity => Data/Error}/NetworkError.swift | 2 +- .../Data/Repository/FirebaseRepository.swift | 38 +++++++++ .../AppLatestVersionRepository.swift | 2 +- .../{ => lagacy}/AuthRepository.swift | 0 .../{ => lagacy}/DailysRepository.swift | 0 .../{ => lagacy}/NotificationRepository.swift | 0 .../{ => lagacy}/RecordTimesRepository.swift | 0 .../{ => lagacy}/ServerURLRepository.swift | 0 .../{ => lagacy}/SyncLogRepository.swift | 0 .../AppVersionResponse.swift} | 19 ++--- .../Data/Response/ErrorResponse.swift | 16 ++++ .../FirebaseValue/FirebaseBooleanValue.swift} | 4 +- .../FirebaseStringArrayValue.swift} | 6 +- .../FirebaseValue/FirebaseStringValue.swift} | 4 +- .../FirebaseValue}/FirestoreValue.swift | 4 +- .../Data/Response/SimpleResponse.swift | 1 + 26 files changed, 170 insertions(+), 83 deletions(-) rename Project_Timer/{Domain/Entity => Data/Error}/NetworkError.swift (97%) create mode 100644 Project_Timer/Data/Repository/FirebaseRepository.swift rename Project_Timer/Data/Repository/{ => lagacy}/AppLatestVersionRepository.swift (89%) rename Project_Timer/Data/Repository/{ => lagacy}/AuthRepository.swift (100%) rename Project_Timer/Data/Repository/{ => lagacy}/DailysRepository.swift (100%) rename Project_Timer/Data/Repository/{ => lagacy}/NotificationRepository.swift (100%) rename Project_Timer/Data/Repository/{ => lagacy}/RecordTimesRepository.swift (100%) rename Project_Timer/Data/Repository/{ => lagacy}/ServerURLRepository.swift (100%) rename Project_Timer/Data/Repository/{ => lagacy}/SyncLogRepository.swift (100%) rename Project_Timer/Data/{DTO/AppLatestVersionDTO.swift => Response/AppVersionResponse.swift} (56%) create mode 100644 Project_Timer/Data/Response/ErrorResponse.swift rename Project_Timer/Data/{DTO/firebaseValue/BooleanValue.swift => Response/FirebaseValue/FirebaseBooleanValue.swift} (80%) rename Project_Timer/Data/{DTO/firebaseValue/StringArrayValue.swift => Response/FirebaseValue/FirebaseStringArrayValue.swift} (64%) rename Project_Timer/Data/{DTO/firebaseValue/StringValue.swift => Response/FirebaseValue/FirebaseStringValue.swift} (82%) rename Project_Timer/Data/{DTO/firebaseValue => Response/FirebaseValue}/FirestoreValue.swift (69%) diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index 180532a8..8987f7ee 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -136,7 +136,7 @@ 873731D72B2E97C100D7BD9F /* NotificationRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D62B2E97C100D7BD9F /* NotificationRepositoryInterface.swift */; }; 873731D92B2E97FE00D7BD9F /* GetNotificationUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D82B2E97FE00D7BD9F /* GetNotificationUseCase.swift */; }; 873731DB2B2E983500D7BD9F /* GetNotificationUseCaseInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731DA2B2E983500D7BD9F /* GetNotificationUseCaseInterface.swift */; }; - 873731DD2B2E9AA900D7BD9F /* StringArrayValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731DC2B2E9AA900D7BD9F /* StringArrayValue.swift */; }; + 873731DD2B2E9AA900D7BD9F /* FirebaseStringArrayValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731DC2B2E9AA900D7BD9F /* FirebaseStringArrayValue.swift */; }; 873731DF2B2EA2B000D7BD9F /* FirestoreValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731DE2B2EA2AF00D7BD9F /* FirestoreValue.swift */; }; 873977EB288D3FAA0025EE73 /* LogDailyVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873977EA288D3FAA0025EE73 /* LogDailyVM.swift */; }; 873C197628D041DE00E02ADC /* DailyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873C197528D041DE00E02ADC /* DailyView.swift */; }; @@ -170,7 +170,7 @@ 875A5F792A207BA600679A72 /* NavigationBarInformationButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875A5F782A207BA600679A72 /* NavigationBarInformationButton.swift */; }; 875A5F7B2A20836600679A72 /* HowToUseWidgetVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875A5F7A2A20836500679A72 /* HowToUseWidgetVC.swift */; }; 875AA59C26494365005D15D6 /* TaskSelectVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875AA59B26494365005D15D6 /* TaskSelectVC.swift */; }; - 875C98BE287172A5008F7ADD /* StringValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875C98BD287172A5008F7ADD /* StringValue.swift */; }; + 875C98BE287172A5008F7ADD /* FirebaseStringValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875C98BD287172A5008F7ADD /* FirebaseStringValue.swift */; }; 875C98C1287175F7008F7ADD /* TiTiLabActionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875C98C0287175F7008F7ADD /* TiTiLabActionDelegate.swift */; }; 875C98C3287176E4008F7ADD /* FunctionsActionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875C98C2287176E4008F7ADD /* FunctionsActionDelegate.swift */; }; 875C98C72871BB26008F7ADD /* YoutubeLinkInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875C98C62871BB26008F7ADD /* YoutubeLinkInfo.swift */; }; @@ -180,12 +180,11 @@ 875EDA362957F9510037A7EB /* LoadingIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875EDA352957F9510037A7EB /* LoadingIndicator.swift */; }; 875FAE252B1C6721008F19D2 /* AppVersionNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE242B1C6721008F19D2 /* AppVersionNetwork.swift */; }; 875FAE282B1C679D008F19D2 /* AppLatestVersionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE272B1C679D008F19D2 /* AppLatestVersionInfo.swift */; }; - 875FAE2A2B1C6829008F19D2 /* AppLatestVersionDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE292B1C6829008F19D2 /* AppLatestVersionDTO.swift */; }; 875FAE2C2B1C6B57008F19D2 /* AppLatestVersionRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE2B2B1C6B57008F19D2 /* AppLatestVersionRepository.swift */; }; 875FAE2F2B1C7067008F19D2 /* AppLatestVersionRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE2E2B1C7067008F19D2 /* AppLatestVersionRepositoryInterface.swift */; }; 875FAE312B1C70C2008F19D2 /* GetLatestVersionUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE302B1C70C2008F19D2 /* GetLatestVersionUseCase.swift */; }; 875FAE352B1C718D008F19D2 /* GetLatestVersionUseCaseInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE342B1C718D008F19D2 /* GetLatestVersionUseCaseInterface.swift */; }; - 875FAE372B1C74AD008F19D2 /* BooleanValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE362B1C74AD008F19D2 /* BooleanValue.swift */; }; + 875FAE372B1C74AD008F19D2 /* FirebaseBooleanValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE362B1C74AD008F19D2 /* FirebaseBooleanValue.swift */; }; 875FBE252AC9116B00B28723 /* UITextField+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FBE242AC9116B00B28723 /* UITextField+Extension.swift */; }; 875FBE272AC91ED800B28723 /* CGPoint+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FBE262AC91ED800B28723 /* CGPoint+Extension.swift */; }; 8760FB092A1DAFA70068CEF5 /* SettingCalendarWidgetVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8760FB082A1DAFA70068CEF5 /* SettingCalendarWidgetVC.swift */; }; @@ -316,6 +315,9 @@ 87AEF671289D23400018FCC8 /* UITabBarController+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87AEF670289D23400018FCC8 /* UITabBarController+Extension.swift */; }; 87B539AB299BB710001E354C /* Versions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87B539AA299BB710001E354C /* Versions.swift */; }; 87B7A53C2AC02202002AFDFE /* SigninSelectRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87B7A53B2AC02202002AFDFE /* SigninSelectRoute.swift */; }; + 87B90B3A2BF4AEF600D6886E /* FirebaseRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87B90B392BF4AEF600D6886E /* FirebaseRepository.swift */; }; + 87B90B3C2BF4B13D00D6886E /* AppVersionResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87B90B3B2BF4B13D00D6886E /* AppVersionResponse.swift */; }; + 87B90B3F2BF4BC6D00D6886E /* ErrorResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87B90B3E2BF4BC6D00D6886E /* ErrorResponse.swift */; }; 87BE88E72AD425BE0010A84A /* SigninTextFieldView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87BE88E62AD425BE0010A84A /* SigninTextFieldView.swift */; }; 87BEBEE9281C17000095CD29 /* RecordsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87BEBEE8281C17000095CD29 /* RecordsManager.swift */; }; 87BEBEEB281C19CA0095CD29 /* StopwatchVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87BEBEEA281C19CA0095CD29 /* StopwatchVM.swift */; }; @@ -567,7 +569,7 @@ 873731D62B2E97C100D7BD9F /* NotificationRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationRepositoryInterface.swift; sourceTree = ""; }; 873731D82B2E97FE00D7BD9F /* GetNotificationUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetNotificationUseCase.swift; sourceTree = ""; }; 873731DA2B2E983500D7BD9F /* GetNotificationUseCaseInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetNotificationUseCaseInterface.swift; sourceTree = ""; }; - 873731DC2B2E9AA900D7BD9F /* StringArrayValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringArrayValue.swift; sourceTree = ""; }; + 873731DC2B2E9AA900D7BD9F /* FirebaseStringArrayValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseStringArrayValue.swift; sourceTree = ""; }; 873731DE2B2EA2AF00D7BD9F /* FirestoreValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirestoreValue.swift; sourceTree = ""; }; 873977EA288D3FAA0025EE73 /* LogDailyVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogDailyVM.swift; sourceTree = ""; }; 873C197528D041DE00E02ADC /* DailyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailyView.swift; sourceTree = ""; }; @@ -601,7 +603,7 @@ 875A5F782A207BA600679A72 /* NavigationBarInformationButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarInformationButton.swift; sourceTree = ""; }; 875A5F7A2A20836500679A72 /* HowToUseWidgetVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HowToUseWidgetVC.swift; sourceTree = ""; }; 875AA59B26494365005D15D6 /* TaskSelectVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskSelectVC.swift; sourceTree = ""; }; - 875C98BD287172A5008F7ADD /* StringValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringValue.swift; sourceTree = ""; }; + 875C98BD287172A5008F7ADD /* FirebaseStringValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseStringValue.swift; sourceTree = ""; }; 875C98C0287175F7008F7ADD /* TiTiLabActionDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TiTiLabActionDelegate.swift; sourceTree = ""; }; 875C98C2287176E4008F7ADD /* FunctionsActionDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FunctionsActionDelegate.swift; sourceTree = ""; }; 875C98C62871BB26008F7ADD /* YoutubeLinkInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YoutubeLinkInfo.swift; sourceTree = ""; }; @@ -611,12 +613,11 @@ 875EDA352957F9510037A7EB /* LoadingIndicator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingIndicator.swift; sourceTree = ""; }; 875FAE242B1C6721008F19D2 /* AppVersionNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppVersionNetwork.swift; sourceTree = ""; }; 875FAE272B1C679D008F19D2 /* AppLatestVersionInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLatestVersionInfo.swift; sourceTree = ""; }; - 875FAE292B1C6829008F19D2 /* AppLatestVersionDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLatestVersionDTO.swift; sourceTree = ""; }; 875FAE2B2B1C6B57008F19D2 /* AppLatestVersionRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLatestVersionRepository.swift; sourceTree = ""; }; 875FAE2E2B1C7067008F19D2 /* AppLatestVersionRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLatestVersionRepositoryInterface.swift; sourceTree = ""; }; 875FAE302B1C70C2008F19D2 /* GetLatestVersionUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetLatestVersionUseCase.swift; sourceTree = ""; }; 875FAE342B1C718D008F19D2 /* GetLatestVersionUseCaseInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetLatestVersionUseCaseInterface.swift; sourceTree = ""; }; - 875FAE362B1C74AD008F19D2 /* BooleanValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BooleanValue.swift; sourceTree = ""; }; + 875FAE362B1C74AD008F19D2 /* FirebaseBooleanValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseBooleanValue.swift; sourceTree = ""; }; 875FBE242AC9116B00B28723 /* UITextField+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITextField+Extension.swift"; sourceTree = ""; }; 875FBE262AC91ED800B28723 /* CGPoint+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CGPoint+Extension.swift"; sourceTree = ""; }; 8760FB082A1DAFA70068CEF5 /* SettingCalendarWidgetVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingCalendarWidgetVC.swift; sourceTree = ""; }; @@ -732,6 +733,9 @@ 87AEF670289D23400018FCC8 /* UITabBarController+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITabBarController+Extension.swift"; sourceTree = ""; }; 87B539AA299BB710001E354C /* Versions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Versions.swift; sourceTree = ""; }; 87B7A53B2AC02202002AFDFE /* SigninSelectRoute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SigninSelectRoute.swift; sourceTree = ""; }; + 87B90B392BF4AEF600D6886E /* FirebaseRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseRepository.swift; sourceTree = ""; }; + 87B90B3B2BF4B13D00D6886E /* AppVersionResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppVersionResponse.swift; sourceTree = ""; }; + 87B90B3E2BF4BC6D00D6886E /* ErrorResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorResponse.swift; sourceTree = ""; }; 87BE88E62AD425BE0010A84A /* SigninTextFieldView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SigninTextFieldView.swift; sourceTree = ""; }; 87BEBEE8281C17000095CD29 /* RecordsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordsManager.swift; sourceTree = ""; }; 87BEBEEA281C19CA0095CD29 /* StopwatchVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StopwatchVM.swift; sourceTree = ""; }; @@ -906,15 +910,15 @@ name = Frameworks; sourceTree = ""; }; - 8708005D2B2C5DF400830B39 /* firebaseValue */ = { + 8708005D2B2C5DF400830B39 /* FirebaseValue */ = { isa = PBXGroup; children = ( - 875C98BD287172A5008F7ADD /* StringValue.swift */, - 875FAE362B1C74AD008F19D2 /* BooleanValue.swift */, - 873731DC2B2E9AA900D7BD9F /* StringArrayValue.swift */, + 875C98BD287172A5008F7ADD /* FirebaseStringValue.swift */, + 875FAE362B1C74AD008F19D2 /* FirebaseBooleanValue.swift */, + 873731DC2B2E9AA900D7BD9F /* FirebaseStringArrayValue.swift */, 873731DE2B2EA2AF00D7BD9F /* FirestoreValue.swift */, ); - path = firebaseValue; + path = FirebaseValue; sourceTree = ""; }; 870800902B2D693800830B39 /* Signin */ = { @@ -1147,8 +1151,6 @@ 875FAE222B1C653A008F19D2 /* DTO */ = { isa = PBXGroup; children = ( - 8708005D2B2C5DF400830B39 /* firebaseValue */, - 875FAE292B1C6829008F19D2 /* AppLatestVersionDTO.swift */, 870800512B2C3A0800830B39 /* ServerURLDTO.swift */, 8708005E2B2C5F5F00830B39 /* AuthDTO.swift */, 8708006E2B2CA92C00830B39 /* DailyDTO.swift */, @@ -1179,7 +1181,6 @@ 875FAE262B1C678E008F19D2 /* Entity */ = { isa = PBXGroup; children = ( - 87163DC72ACAF2E8008D4072 /* NetworkError.swift */, 878DA1F52AEE617900C60CBF /* SignupInfo.swift */, 875FAE272B1C679D008F19D2 /* AppLatestVersionInfo.swift */, 870800622B2C604100830B39 /* AuthInfo.swift */, @@ -1601,6 +1602,28 @@ path = SharedCode; sourceTree = ""; }; + 87B90B382BF4AEE000D6886E /* lagacy */ = { + isa = PBXGroup; + children = ( + 875FAE2B2B1C6B57008F19D2 /* AppLatestVersionRepository.swift */, + 870800532B2C3A5400830B39 /* ServerURLRepository.swift */, + 870800602B2C5FDA00830B39 /* AuthRepository.swift */, + 8708006C2B2CA7AB00830B39 /* DailysRepository.swift */, + 8708007A2B2D4F0800830B39 /* RecordTimesRepository.swift */, + 870800862B2D599800830B39 /* SyncLogRepository.swift */, + 873731D22B2E931800D7BD9F /* NotificationRepository.swift */, + ); + path = lagacy; + sourceTree = ""; + }; + 87B90B3D2BF4BC0100D6886E /* Error */ = { + isa = PBXGroup; + children = ( + 87163DC72ACAF2E8008D4072 /* NetworkError.swift */, + ); + path = Error; + sourceTree = ""; + }; 87BE88E52AD425A80010A84A /* LoginView */ = { isa = PBXGroup; children = ( @@ -1703,7 +1726,10 @@ 87D4DCCD2BA548E300BB5AAB /* Response */ = { isa = PBXGroup; children = ( + 8708005D2B2C5DF400830B39 /* FirebaseValue */, 87D4DCCE2BA5492700BB5AAB /* SimpleResponse.swift */, + 87B90B3B2BF4B13D00D6886E /* AppVersionResponse.swift */, + 87B90B3E2BF4BC6D00D6886E /* ErrorResponse.swift */, ); path = Response; sourceTree = ""; @@ -1910,6 +1936,7 @@ 87F778DC2B196E8F00909511 /* Data */ = { isa = PBXGroup; children = ( + 87B90B3D2BF4BC0100D6886E /* Error */, 87D4DCCD2BA548E300BB5AAB /* Response */, 87D4DCCA2BA5476900BB5AAB /* Request */, 87F778E12B196F7400909511 /* Repository */, @@ -1948,13 +1975,8 @@ 87F778E12B196F7400909511 /* Repository */ = { isa = PBXGroup; children = ( - 875FAE2B2B1C6B57008F19D2 /* AppLatestVersionRepository.swift */, - 870800532B2C3A5400830B39 /* ServerURLRepository.swift */, - 870800602B2C5FDA00830B39 /* AuthRepository.swift */, - 8708006C2B2CA7AB00830B39 /* DailysRepository.swift */, - 8708007A2B2D4F0800830B39 /* RecordTimesRepository.swift */, - 870800862B2D599800830B39 /* SyncLogRepository.swift */, - 873731D22B2E931800D7BD9F /* NotificationRepository.swift */, + 87B90B382BF4AEE000D6886E /* lagacy */, + 87B90B392BF4AEF600D6886E /* FirebaseRepository.swift */, ); path = Repository; sourceTree = ""; @@ -2269,6 +2291,7 @@ 8708008D2B2D63D300830B39 /* SyncLogUseCase.swift in Sources */, 87EA022F2B9BF927003439F2 /* UIViewControllerPreview.swift in Sources */, 87EA02312B9BF941003439F2 /* UIViewPreview.swift in Sources */, + 87B90B3A2BF4AEF600D6886E /* FirebaseRepository.swift in Sources */, 873C197A28D04B5B00E02ADC /* DayOfWeekText.swift in Sources */, 870800852B2D593400830B39 /* SyncLogNetwork.swift in Sources */, 87163DCA2ACAF89B008D4072 /* NetworkResult.swift in Sources */, @@ -2298,14 +2321,14 @@ 87306D592B260E09001B7C14 /* Localized.swift in Sources */, 879D207B2A19B91C00D8A420 /* ColorButton.swift in Sources */, 877911BA2A1891B100F0A713 /* SettingSwitchListVM.swift in Sources */, - 875FAE372B1C74AD008F19D2 /* BooleanValue.swift in Sources */, + 875FAE372B1C74AD008F19D2 /* FirebaseBooleanValue.swift in Sources */, 87BEBEE9281C17000095CD29 /* RecordsManager.swift in Sources */, 87FB8D1D2B3C5F4D00EA5693 /* NotificationUseCaseInterface.swift in Sources */, 87A48BCD27DF182400F46D0F /* SubjectCell.swift in Sources */, 04172E982885453F00F962F2 /* MotionDetector.swift in Sources */, 87F10936284C47A1002E31EA /* SettingTiTiLabVM.swift in Sources */, 87B7A53C2AC02202002AFDFE /* SigninSelectRoute.swift in Sources */, - 873731DD2B2E9AA900D7BD9F /* StringArrayValue.swift in Sources */, + 873731DD2B2E9AA900D7BD9F /* FirebaseStringArrayValue.swift in Sources */, 8760FB0C2A1DBB490068CEF5 /* Widget+Extentions.swift in Sources */, 879BE32C2AC68EC7007AAC46 /* PortraitVC.swift in Sources */, 875FAE2F2B1C7067008F19D2 /* AppLatestVersionRepositoryInterface.swift in Sources */, @@ -2325,6 +2348,7 @@ 87D83E852B285D4D003C40AE /* SettingLanguageVC.swift in Sources */, 873C197628D041DE00E02ADC /* DailyView.swift in Sources */, 87D4DCCF2BA5492700BB5AAB /* SimpleResponse.swift in Sources */, + 87B90B3C2BF4B13D00D6886E /* AppVersionResponse.swift in Sources */, 875FAE282B1C679D008F19D2 /* AppLatestVersionInfo.swift in Sources */, 87DC6A4928D0104300455A06 /* WeekVM.swift in Sources */, 048D8AC628AA1B7700A2456D /* AddHistoryCell.swift in Sources */, @@ -2454,6 +2478,7 @@ 8791082F28387D1F005D7B10 /* String+Extension.swift in Sources */, 87D4DE112A0F83A500993C5C /* CalendarWidgetTaskData.swift in Sources */, 87459704263FEF6B00172C0F /* TimerVC.swift in Sources */, + 87B90B3F2BF4BC6D00D6886E /* ErrorResponse.swift in Sources */, 87A4704A26493D6E007B89D6 /* StaticCircularProgressView.swift in Sources */, 879E849C29C83D5100D65F48 /* RoundedShape.swift in Sources */, 87199F582883F2E00017D01A /* TimelineVM.swift in Sources */, @@ -2507,7 +2532,7 @@ 87A7F5D4267270F800F69EBA /* Todo.swift in Sources */, 879D207F2A19D40400D8A420 /* Updateable.swift in Sources */, 87AE748429062ACA00FA0A60 /* TimeSelectorPopupVC.swift in Sources */, - 875C98BE287172A5008F7ADD /* StringValue.swift in Sources */, + 875C98BE287172A5008F7ADD /* FirebaseStringValue.swift in Sources */, 87024B102AE154630095CCB4 /* SignupEmailRoute.swift in Sources */, 04573A992877FD78008F8D44 /* CountdownTimeLabelView.swift in Sources */, 87BEBEED281C282D0095CD29 /* Times.swift in Sources */, @@ -2569,7 +2594,6 @@ 87DE1177268AC9AD0012F043 /* DailyManager.swift in Sources */, 8708007F2B2D543500830B39 /* RecordTimesUseCase.swift in Sources */, 8708005F2B2C5F5F00830B39 /* AuthDTO.swift in Sources */, - 875FAE2A2B1C6829008F19D2 /* AppLatestVersionDTO.swift in Sources */, 8721C6D72969123E00410D57 /* IOUsecase.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/Project_Timer/Data/API/API.swift b/Project_Timer/Data/API/API.swift index 2a6cf5d1..7ee34f97 100644 --- a/Project_Timer/Data/API/API.swift +++ b/Project_Timer/Data/API/API.swift @@ -10,7 +10,7 @@ import Foundation import Moya extension TargetType { - func parameters(from encodable: Encodable) -> [String: Any] { + static func parameters(from encodable: Encodable) -> [String: Any] { let encoder = JSONEncoder() guard let data = try? encoder.encode(encodable), let dictionary = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any] else { diff --git a/Project_Timer/Data/API/DailysAPI.swift b/Project_Timer/Data/API/DailysAPI.swift index 0cc71599..cccb3e83 100644 --- a/Project_Timer/Data/API/DailysAPI.swift +++ b/Project_Timer/Data/API/DailysAPI.swift @@ -10,9 +10,9 @@ import Foundation import Moya enum DailysAPI { - case postDailys + case postDailys([Daily]) case getDailys - case postRecordTime + case postRecordTime(RecordTimes) case getRecordTime case getSyncLog } @@ -43,7 +43,14 @@ extension DailysAPI: TargetType { } var task: Moya.Task { - return .requestPlain + switch self { + case .postDailys(let dailys): + return .requestJSONEncodable(dailys) + case .postRecordTime(let recordTimes): + return .requestJSONEncodable(recordTimes) + default: + return .requestPlain + } } var headers: [String : String]? { diff --git a/Project_Timer/Data/DTO/FunctionInfo.swift b/Project_Timer/Data/DTO/FunctionInfo.swift index fb25ded3..9d26ab62 100644 --- a/Project_Timer/Data/DTO/FunctionInfo.swift +++ b/Project_Timer/Data/DTO/FunctionInfo.swift @@ -19,8 +19,8 @@ struct FunctionInfos: Decodable { /// survayInfos 내 DTO struct FunctionInfo: Decodable { - let title: StringValue - let url: StringValue + let title: FirebaseStringValue + let url: FirebaseStringValue private enum RootKey: String, CodingKey { case fields @@ -33,7 +33,7 @@ struct FunctionInfo: Decodable { let container = try decoder.container(keyedBy: RootKey.self) let fieldContainer = try container.nestedContainer(keyedBy: FieldKeys.self, forKey: .fields) - self.title = try fieldContainer.decode(StringValue.self, forKey: .title) - self.url = try fieldContainer.decode(StringValue.self, forKey: .url) + self.title = try fieldContainer.decode(FirebaseStringValue.self, forKey: .title) + self.url = try fieldContainer.decode(FirebaseStringValue.self, forKey: .url) } } diff --git a/Project_Timer/Data/DTO/LastestVersionInfo.swift b/Project_Timer/Data/DTO/LastestVersionInfo.swift index cc7851df..3d02ff9f 100644 --- a/Project_Timer/Data/DTO/LastestVersionInfo.swift +++ b/Project_Timer/Data/DTO/LastestVersionInfo.swift @@ -10,8 +10,8 @@ import Foundation /// latestVersionDTO struct LastestVersionInfo: Decodable { - let iOS: StringValue - let macOS: StringValue + let iOS: FirebaseStringValue + let macOS: FirebaseStringValue private enum RootKey: String, CodingKey { case fields @@ -25,7 +25,7 @@ struct LastestVersionInfo: Decodable { let container = try decoder.container(keyedBy: RootKey.self) let fieldContainer = try container.nestedContainer(keyedBy: FieldKeys.self, forKey: .fields) - self.iOS = try fieldContainer.decode(StringValue.self, forKey: .iOS) - self.macOS = try fieldContainer.decode(StringValue.self, forKey: .macOS) + self.iOS = try fieldContainer.decode(FirebaseStringValue.self, forKey: .iOS) + self.macOS = try fieldContainer.decode(FirebaseStringValue.self, forKey: .macOS) } } diff --git a/Project_Timer/Data/DTO/NotificationDTO.swift b/Project_Timer/Data/DTO/NotificationDTO.swift index 49a90cc9..816fad96 100644 --- a/Project_Timer/Data/DTO/NotificationDTO.swift +++ b/Project_Timer/Data/DTO/NotificationDTO.swift @@ -9,11 +9,11 @@ import Foundation struct NotificationDTO: Decodable, FirestoreValue { - var title: StringValue - var text: StringValue - var notiTitles: StringArrayValue - var notiTexts: StringArrayValue - var visible: BooleanValue + var title: FirebaseStringValue + var text: FirebaseStringValue + var notiTitles: FirebaseStringArrayValue + var notiTexts: FirebaseStringArrayValue + var visible: FirebaseBooleanValue private enum RootKey: String, CodingKey { case fields @@ -31,11 +31,11 @@ struct NotificationDTO: Decodable, FirestoreValue { let container = try decoder.container(keyedBy: RootKey.self) let fieldContainer = try container.nestedContainer(keyedBy: FieldKeys.self, forKey: .fields) - self.title = try fieldContainer.decode(StringValue.self, forKey: .title) - self.text = try fieldContainer.decode(StringValue.self, forKey: .text) - self.notiTitles = try fieldContainer.decode(StringArrayValue.self, forKey: .notiTitles) - self.notiTexts = try fieldContainer.decode(StringArrayValue.self, forKey: .notiTexts) - self.visible = try fieldContainer.decode(BooleanValue.self, forKey: .visible) + self.title = try fieldContainer.decode(FirebaseStringValue.self, forKey: .title) + self.text = try fieldContainer.decode(FirebaseStringValue.self, forKey: .text) + self.notiTitles = try fieldContainer.decode(FirebaseStringArrayValue.self, forKey: .notiTitles) + self.notiTexts = try fieldContainer.decode(FirebaseStringArrayValue.self, forKey: .notiTexts) + self.visible = try fieldContainer.decode(FirebaseBooleanValue.self, forKey: .visible) self.title = transString(self.title) self.text = transString(self.text) diff --git a/Project_Timer/Data/DTO/ServerURLDTO.swift b/Project_Timer/Data/DTO/ServerURLDTO.swift index 3acd0e16..147046f1 100644 --- a/Project_Timer/Data/DTO/ServerURLDTO.swift +++ b/Project_Timer/Data/DTO/ServerURLDTO.swift @@ -9,7 +9,7 @@ import Foundation struct ServerURLDTO: Decodable { - let base: StringValue + let base: FirebaseStringValue private enum RootKey: String, CodingKey { case fields @@ -23,6 +23,6 @@ struct ServerURLDTO: Decodable { let container = try decoder.container(keyedBy: RootKey.self) let fieldContainer = try container.nestedContainer(keyedBy: FieldKeys.self, forKey: .fields) - self.base = try fieldContainer.decode(StringValue.self, forKey: .base) + self.base = try fieldContainer.decode(FirebaseStringValue.self, forKey: .base) } } diff --git a/Project_Timer/Data/DTO/SurveyInfo.swift b/Project_Timer/Data/DTO/SurveyInfo.swift index 8d45a6f0..f29a56f4 100644 --- a/Project_Timer/Data/DTO/SurveyInfo.swift +++ b/Project_Timer/Data/DTO/SurveyInfo.swift @@ -19,8 +19,8 @@ struct SurveyInfos: Decodable { /// survayInfos 내 DTO struct SurveyInfo: Decodable { - let title: StringValue - let url: StringValue + let title: FirebaseStringValue + let url: FirebaseStringValue private enum RootKey: String, CodingKey { case fields @@ -33,7 +33,7 @@ struct SurveyInfo: Decodable { let container = try decoder.container(keyedBy: RootKey.self) let fieldContainer = try container.nestedContainer(keyedBy: FieldKeys.self, forKey: .fields) - self.title = try fieldContainer.decode(StringValue.self, forKey: .title) - self.url = try fieldContainer.decode(StringValue.self, forKey: .url) + self.title = try fieldContainer.decode(FirebaseStringValue.self, forKey: .title) + self.url = try fieldContainer.decode(FirebaseStringValue.self, forKey: .url) } } diff --git a/Project_Timer/Data/DTO/UpdateInfo.swift b/Project_Timer/Data/DTO/UpdateInfo.swift index 56c35718..abbc27e9 100644 --- a/Project_Timer/Data/DTO/UpdateInfo.swift +++ b/Project_Timer/Data/DTO/UpdateInfo.swift @@ -19,9 +19,9 @@ struct UpdateInfos: Decodable { /// updateInfos 내 DTO struct UpdateInfo: Decodable, FirestoreValue { - var version: StringValue - var date: StringValue - var text: StringValue + var version: FirebaseStringValue + var date: FirebaseStringValue + var text: FirebaseStringValue private enum RootKey: String, CodingKey { case fields @@ -34,9 +34,9 @@ struct UpdateInfo: Decodable, FirestoreValue { let container = try decoder.container(keyedBy: RootKey.self) let fieldContainer = try container.nestedContainer(keyedBy: FieldKeys.self, forKey: .fields) - self.version = try fieldContainer.decode(StringValue.self, forKey: .version) - self.date = try fieldContainer.decode(StringValue.self, forKey: .date) - self.text = try fieldContainer.decode(StringValue.self, forKey: .text) + self.version = try fieldContainer.decode(FirebaseStringValue.self, forKey: .version) + self.date = try fieldContainer.decode(FirebaseStringValue.self, forKey: .date) + self.text = try fieldContainer.decode(FirebaseStringValue.self, forKey: .text) self.text = transString(self.text) } diff --git a/Project_Timer/Data/DTO/YoutubeLinkInfo.swift b/Project_Timer/Data/DTO/YoutubeLinkInfo.swift index 79a89ea0..fab367bf 100644 --- a/Project_Timer/Data/DTO/YoutubeLinkInfo.swift +++ b/Project_Timer/Data/DTO/YoutubeLinkInfo.swift @@ -10,7 +10,7 @@ import Foundation /// youtubeInfo DTO struct YoutubeLinkInfo: Decodable { - let url: StringValue + let url: FirebaseStringValue private enum RootKey: String, CodingKey { case fields @@ -23,6 +23,6 @@ struct YoutubeLinkInfo: Decodable { let container = try decoder.container(keyedBy: RootKey.self) let fieldContainer = try container.nestedContainer(keyedBy: FieldKeys.self, forKey: .fields) - self.url = try fieldContainer.decode(StringValue.self, forKey: .url) + self.url = try fieldContainer.decode(FirebaseStringValue.self, forKey: .url) } } diff --git a/Project_Timer/Domain/Entity/NetworkError.swift b/Project_Timer/Data/Error/NetworkError.swift similarity index 97% rename from Project_Timer/Domain/Entity/NetworkError.swift rename to Project_Timer/Data/Error/NetworkError.swift index 4050e0cb..5573d032 100644 --- a/Project_Timer/Domain/Entity/NetworkError.swift +++ b/Project_Timer/Data/Error/NetworkError.swift @@ -29,7 +29,7 @@ enum NetworkError: Error { } } - private static func serverError(statusCode: Int, data: Data?) -> NetworkError { + static func serverError(statusCode: Int, data: Data? = nil) -> NetworkError { // MARK: Decoding 로직 필요 let errorMessage: String? = "" switch statusCode { diff --git a/Project_Timer/Data/Repository/FirebaseRepository.swift b/Project_Timer/Data/Repository/FirebaseRepository.swift new file mode 100644 index 00000000..34e26604 --- /dev/null +++ b/Project_Timer/Data/Repository/FirebaseRepository.swift @@ -0,0 +1,38 @@ +// +// FirebaseRepository.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/05/15. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Moya +import RxSwift +import RxMoya + +final class FirebaseRepository { + private let api: MoyaProvider + + init(api: MoyaProvider) { + self.api = api + } + + func getAppVersion() -> Single { + return self.api.rx.request(.getAppVersion) + .map(AppVersionResponse.self) + .map { $0.toDomain() } + .catch { error in + if let moyaError = error as? MoyaError { + switch moyaError { + case .statusCode(let response): + return Single.error(NetworkError.serverError(statusCode: response.statusCode)) + default: + return Single.error(NetworkError.FAIL) + } + } + + return Single.error(NetworkError.DECODEERROR) + } + } +} diff --git a/Project_Timer/Data/Repository/AppLatestVersionRepository.swift b/Project_Timer/Data/Repository/lagacy/AppLatestVersionRepository.swift similarity index 89% rename from Project_Timer/Data/Repository/AppLatestVersionRepository.swift rename to Project_Timer/Data/Repository/lagacy/AppLatestVersionRepository.swift index 92272fbd..40e495c5 100644 --- a/Project_Timer/Data/Repository/AppLatestVersionRepository.swift +++ b/Project_Timer/Data/Repository/lagacy/AppLatestVersionRepository.swift @@ -16,7 +16,7 @@ final class AppLatestVersionRepository: AppLatestVersionRepositoryInterface { switch result.status { case .SUCCESS: guard let data = result.data, - let dto = try? JSONDecoder().decode(AppLatestVersionDTO.self, from: data) else { + let dto = try? JSONDecoder().decode(AppVersionResponse.self, from: data) else { completion(.failure(.DECODEERROR)) return } diff --git a/Project_Timer/Data/Repository/AuthRepository.swift b/Project_Timer/Data/Repository/lagacy/AuthRepository.swift similarity index 100% rename from Project_Timer/Data/Repository/AuthRepository.swift rename to Project_Timer/Data/Repository/lagacy/AuthRepository.swift diff --git a/Project_Timer/Data/Repository/DailysRepository.swift b/Project_Timer/Data/Repository/lagacy/DailysRepository.swift similarity index 100% rename from Project_Timer/Data/Repository/DailysRepository.swift rename to Project_Timer/Data/Repository/lagacy/DailysRepository.swift diff --git a/Project_Timer/Data/Repository/NotificationRepository.swift b/Project_Timer/Data/Repository/lagacy/NotificationRepository.swift similarity index 100% rename from Project_Timer/Data/Repository/NotificationRepository.swift rename to Project_Timer/Data/Repository/lagacy/NotificationRepository.swift diff --git a/Project_Timer/Data/Repository/RecordTimesRepository.swift b/Project_Timer/Data/Repository/lagacy/RecordTimesRepository.swift similarity index 100% rename from Project_Timer/Data/Repository/RecordTimesRepository.swift rename to Project_Timer/Data/Repository/lagacy/RecordTimesRepository.swift diff --git a/Project_Timer/Data/Repository/ServerURLRepository.swift b/Project_Timer/Data/Repository/lagacy/ServerURLRepository.swift similarity index 100% rename from Project_Timer/Data/Repository/ServerURLRepository.swift rename to Project_Timer/Data/Repository/lagacy/ServerURLRepository.swift diff --git a/Project_Timer/Data/Repository/SyncLogRepository.swift b/Project_Timer/Data/Repository/lagacy/SyncLogRepository.swift similarity index 100% rename from Project_Timer/Data/Repository/SyncLogRepository.swift rename to Project_Timer/Data/Repository/lagacy/SyncLogRepository.swift diff --git a/Project_Timer/Data/DTO/AppLatestVersionDTO.swift b/Project_Timer/Data/Response/AppVersionResponse.swift similarity index 56% rename from Project_Timer/Data/DTO/AppLatestVersionDTO.swift rename to Project_Timer/Data/Response/AppVersionResponse.swift index 4747242e..eb818971 100644 --- a/Project_Timer/Data/DTO/AppLatestVersionDTO.swift +++ b/Project_Timer/Data/Response/AppVersionResponse.swift @@ -1,16 +1,17 @@ // -// AppLatestVersionDTO.swift +// AppVersionResponse.swift // Project_Timer // -// Created by Kang Minsang on 2023/12/03. -// Copyright © 2023 FDEE. All rights reserved. +// Created by Kang Minsang on 2024/05/15. +// Copyright © 2024 FDEE. All rights reserved. // import Foundation -struct AppLatestVersionDTO: Decodable { - let latestVersion: StringValue - let forced: BooleanValue +/// TiTi 최신버전 정보 +struct AppVersionResponse: Decodable { + let latestVersion: FirebaseStringValue + let forced: FirebaseBooleanValue private enum RootKey: String, CodingKey { case fields @@ -25,12 +26,12 @@ struct AppLatestVersionDTO: Decodable { let container = try decoder.container(keyedBy: RootKey.self) let fieldContainer = try container.nestedContainer(keyedBy: FieldKeys.self, forKey: .fields) - self.latestVersion = try fieldContainer.decode(StringValue.self, forKey: .latestVersion) - self.forced = try fieldContainer.decode(BooleanValue.self, forKey: .forced) + self.latestVersion = try fieldContainer.decode(FirebaseStringValue.self, forKey: .latestVersion) + self.forced = try fieldContainer.decode(FirebaseBooleanValue.self, forKey: .forced) } } -extension AppLatestVersionDTO { +extension AppVersionResponse { func toDomain() -> AppLatestVersionInfo { return .init( latestVersion: self.latestVersion.value, diff --git a/Project_Timer/Data/Response/ErrorResponse.swift b/Project_Timer/Data/Response/ErrorResponse.swift new file mode 100644 index 00000000..6cdc51f5 --- /dev/null +++ b/Project_Timer/Data/Response/ErrorResponse.swift @@ -0,0 +1,16 @@ +// +// ErrorResponse.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/05/15. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation + +/// 에러정보 +struct ErrorResponse: Decodable { + let code: String + let message: String + let errors: [String: String] +} diff --git a/Project_Timer/Data/DTO/firebaseValue/BooleanValue.swift b/Project_Timer/Data/Response/FirebaseValue/FirebaseBooleanValue.swift similarity index 80% rename from Project_Timer/Data/DTO/firebaseValue/BooleanValue.swift rename to Project_Timer/Data/Response/FirebaseValue/FirebaseBooleanValue.swift index fdfd8bb9..f9b69dd0 100644 --- a/Project_Timer/Data/DTO/firebaseValue/BooleanValue.swift +++ b/Project_Timer/Data/Response/FirebaseValue/FirebaseBooleanValue.swift @@ -1,12 +1,12 @@ // -// BooleanValue.swift +// FirebaseBooleanValue.swift // Project_Timer // // Created by Kang Minsang on 2023/12/03. // Copyright © 2023 FDEE. All rights reserved. // -struct BooleanValue: Decodable { +struct FirebaseBooleanValue: Decodable { let value: Bool init(value: Bool) { diff --git a/Project_Timer/Data/DTO/firebaseValue/StringArrayValue.swift b/Project_Timer/Data/Response/FirebaseValue/FirebaseStringArrayValue.swift similarity index 64% rename from Project_Timer/Data/DTO/firebaseValue/StringArrayValue.swift rename to Project_Timer/Data/Response/FirebaseValue/FirebaseStringArrayValue.swift index efd9e14c..4d71814b 100644 --- a/Project_Timer/Data/DTO/firebaseValue/StringArrayValue.swift +++ b/Project_Timer/Data/Response/FirebaseValue/FirebaseStringArrayValue.swift @@ -1,5 +1,5 @@ // -// StringArrayValue.swift +// FirebaseStringArrayValue.swift // Project_Timer // // Created by Kang Minsang on 2023/12/17. @@ -8,10 +8,10 @@ import Foundation -struct StringArrayValue: Decodable { +struct FirebaseStringArrayValue: Decodable { let arrayValue: StringValues } struct StringValues: Decodable { - let values: [StringValue] + let values: [FirebaseStringValue] } diff --git a/Project_Timer/Data/DTO/firebaseValue/StringValue.swift b/Project_Timer/Data/Response/FirebaseValue/FirebaseStringValue.swift similarity index 82% rename from Project_Timer/Data/DTO/firebaseValue/StringValue.swift rename to Project_Timer/Data/Response/FirebaseValue/FirebaseStringValue.swift index 1e7f8bee..b69fd906 100644 --- a/Project_Timer/Data/DTO/firebaseValue/StringValue.swift +++ b/Project_Timer/Data/Response/FirebaseValue/FirebaseStringValue.swift @@ -1,5 +1,5 @@ // -// StringValue.swift +// FirebaseStringValue.swift // Project_Timer // // Created by Kang Minsang on 2022/07/03. @@ -8,7 +8,7 @@ import Foundation -struct StringValue: Decodable { +struct FirebaseStringValue: Decodable { let value: String init(value: String) { diff --git a/Project_Timer/Data/DTO/firebaseValue/FirestoreValue.swift b/Project_Timer/Data/Response/FirebaseValue/FirestoreValue.swift similarity index 69% rename from Project_Timer/Data/DTO/firebaseValue/FirestoreValue.swift rename to Project_Timer/Data/Response/FirebaseValue/FirestoreValue.swift index 3e309e35..6080f43a 100644 --- a/Project_Timer/Data/DTO/firebaseValue/FirestoreValue.swift +++ b/Project_Timer/Data/Response/FirebaseValue/FirestoreValue.swift @@ -10,8 +10,8 @@ import Foundation protocol FirestoreValue {} extension FirestoreValue { - func transString(_ stringValue: StringValue) -> StringValue { + func transString(_ stringValue: FirebaseStringValue) -> FirebaseStringValue { let transString = stringValue.value.replacingOccurrences(of: "\\n", with: "\n") - return StringValue(value: transString) + return FirebaseStringValue(value: transString) } } diff --git a/Project_Timer/Data/Response/SimpleResponse.swift b/Project_Timer/Data/Response/SimpleResponse.swift index 0edc3ebd..2d7cfe3a 100644 --- a/Project_Timer/Data/Response/SimpleResponse.swift +++ b/Project_Timer/Data/Response/SimpleResponse.swift @@ -8,6 +8,7 @@ import Foundation +/// Node.js 에서 받는 간단한 형태 struct SimpleResponse: Decodable { let data: Bool let message: String From 8c90a0769fbcddee729a06a56119e99edd9cd66a Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Wed, 22 May 2024 20:14:11 +0900 Subject: [PATCH 06/44] =?UTF-8?q?feat=20#144:=20getServerURL=20RxMoya=20?= =?UTF-8?q?=EB=B0=A9=EC=8B=9D=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 14 +++++--- .../Data/Repository/FirebaseRepository.swift | 22 ++++++------ .../lagacy/ServerURLRepository.swift | 2 +- .../ServerURLResponse.swift} | 9 ++--- Project_Timer/Data/TTProvider.swift | 34 +++++++++++++++++++ 5 files changed, 60 insertions(+), 21 deletions(-) rename Project_Timer/Data/{DTO/ServerURLDTO.swift => Response/ServerURLResponse.swift} (75%) create mode 100644 Project_Timer/Data/TTProvider.swift diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index 8987f7ee..56fef71d 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -47,7 +47,7 @@ 8706C3302AEF881500F7C842 /* TTSignupTextFieldWarning.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8706C32F2AEF881500F7C842 /* TTSignupTextFieldWarning.swift */; }; 8706C3322AEF8A0300F7C842 /* TTSignupNextButtonForMac.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8706C3312AEF8A0300F7C842 /* TTSignupNextButtonForMac.swift */; }; 870800502B2C38F900830B39 /* ServerURLNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708004F2B2C38F900830B39 /* ServerURLNetwork.swift */; }; - 870800522B2C3A0800830B39 /* ServerURLDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800512B2C3A0800830B39 /* ServerURLDTO.swift */; }; + 870800522B2C3A0800830B39 /* ServerURLResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800512B2C3A0800830B39 /* ServerURLResponse.swift */; }; 870800542B2C3A5400830B39 /* ServerURLRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800532B2C3A5400830B39 /* ServerURLRepository.swift */; }; 870800562B2C3AC600830B39 /* ServerURLRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800552B2C3AC600830B39 /* ServerURLRepositoryInterface.swift */; }; 870800582B2C3B0C00830B39 /* GetServerURLUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800572B2C3B0C00830B39 /* GetServerURLUseCase.swift */; }; @@ -318,6 +318,7 @@ 87B90B3A2BF4AEF600D6886E /* FirebaseRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87B90B392BF4AEF600D6886E /* FirebaseRepository.swift */; }; 87B90B3C2BF4B13D00D6886E /* AppVersionResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87B90B3B2BF4B13D00D6886E /* AppVersionResponse.swift */; }; 87B90B3F2BF4BC6D00D6886E /* ErrorResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87B90B3E2BF4BC6D00D6886E /* ErrorResponse.swift */; }; + 87B90B412BF4BFEE00D6886E /* TTProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87B90B402BF4BFEE00D6886E /* TTProvider.swift */; }; 87BE88E72AD425BE0010A84A /* SigninTextFieldView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87BE88E62AD425BE0010A84A /* SigninTextFieldView.swift */; }; 87BEBEE9281C17000095CD29 /* RecordsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87BEBEE8281C17000095CD29 /* RecordsManager.swift */; }; 87BEBEEB281C19CA0095CD29 /* StopwatchVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87BEBEEA281C19CA0095CD29 /* StopwatchVM.swift */; }; @@ -482,7 +483,7 @@ 8706C32F2AEF881500F7C842 /* TTSignupTextFieldWarning.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TTSignupTextFieldWarning.swift; sourceTree = ""; }; 8706C3312AEF8A0300F7C842 /* TTSignupNextButtonForMac.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TTSignupNextButtonForMac.swift; sourceTree = ""; }; 8708004F2B2C38F900830B39 /* ServerURLNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerURLNetwork.swift; sourceTree = ""; }; - 870800512B2C3A0800830B39 /* ServerURLDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerURLDTO.swift; sourceTree = ""; }; + 870800512B2C3A0800830B39 /* ServerURLResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerURLResponse.swift; sourceTree = ""; }; 870800532B2C3A5400830B39 /* ServerURLRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerURLRepository.swift; sourceTree = ""; }; 870800552B2C3AC600830B39 /* ServerURLRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerURLRepositoryInterface.swift; sourceTree = ""; }; 870800572B2C3B0C00830B39 /* GetServerURLUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetServerURLUseCase.swift; sourceTree = ""; }; @@ -736,6 +737,7 @@ 87B90B392BF4AEF600D6886E /* FirebaseRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseRepository.swift; sourceTree = ""; }; 87B90B3B2BF4B13D00D6886E /* AppVersionResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppVersionResponse.swift; sourceTree = ""; }; 87B90B3E2BF4BC6D00D6886E /* ErrorResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorResponse.swift; sourceTree = ""; }; + 87B90B402BF4BFEE00D6886E /* TTProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TTProvider.swift; sourceTree = ""; }; 87BE88E62AD425BE0010A84A /* SigninTextFieldView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SigninTextFieldView.swift; sourceTree = ""; }; 87BEBEE8281C17000095CD29 /* RecordsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordsManager.swift; sourceTree = ""; }; 87BEBEEA281C19CA0095CD29 /* StopwatchVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StopwatchVM.swift; sourceTree = ""; }; @@ -1151,7 +1153,6 @@ 875FAE222B1C653A008F19D2 /* DTO */ = { isa = PBXGroup; children = ( - 870800512B2C3A0800830B39 /* ServerURLDTO.swift */, 8708005E2B2C5F5F00830B39 /* AuthDTO.swift */, 8708006E2B2CA92C00830B39 /* DailyDTO.swift */, 87F10938284C589A002E31EA /* FunctionInfo.swift */, @@ -1728,8 +1729,9 @@ children = ( 8708005D2B2C5DF400830B39 /* FirebaseValue */, 87D4DCCE2BA5492700BB5AAB /* SimpleResponse.swift */, - 87B90B3B2BF4B13D00D6886E /* AppVersionResponse.swift */, 87B90B3E2BF4BC6D00D6886E /* ErrorResponse.swift */, + 87B90B3B2BF4B13D00D6886E /* AppVersionResponse.swift */, + 870800512B2C3A0800830B39 /* ServerURLResponse.swift */, ); path = Response; sourceTree = ""; @@ -1936,6 +1938,7 @@ 87F778DC2B196E8F00909511 /* Data */ = { isa = PBXGroup; children = ( + 87B90B402BF4BFEE00D6886E /* TTProvider.swift */, 87B90B3D2BF4BC0100D6886E /* Error */, 87D4DCCD2BA548E300BB5AAB /* Response */, 87D4DCCA2BA5476900BB5AAB /* Request */, @@ -2437,6 +2440,7 @@ 87A8CD292AF0C5CB00D4C1D7 /* OverlayRemoveButtonForTextFieldView.swift in Sources */, 8751C6F628472133007FAFC4 /* SettingCellInfo.swift in Sources */, 87D4DCC72BA52F3800BB5AAB /* ResetPasswordInfo.swift in Sources */, + 87B90B412BF4BFEE00D6886E /* TTProvider.swift in Sources */, 8750082D2905998200E27B4A /* TargetTimeSettingPopupVC.swift in Sources */, 8760FCB929541BE3000BCCD1 /* KeyChain.swift in Sources */, 87D5E65328C7477100D53F8D /* MonthTime.swift in Sources */, @@ -2460,7 +2464,7 @@ 8706C32E2AEF878D00F7C842 /* TTSignupTextFieldUnderlineView.swift in Sources */, 87199F442882BC430017D01A /* StandardDailyGraphView.swift in Sources */, 93B08521248DDF2F00E215BD /* AppDelegate.swift in Sources */, - 870800522B2C3A0800830B39 /* ServerURLDTO.swift in Sources */, + 870800522B2C3A0800830B39 /* ServerURLResponse.swift in Sources */, 8791C1F227DCD050000D6BA9 /* Notification+Extension.swift in Sources */, 87F771BF2984101700BF1907 /* Todolist.swift in Sources */, 878BF7EF2955E73C0044C079 /* SyncLog.swift in Sources */, diff --git a/Project_Timer/Data/Repository/FirebaseRepository.swift b/Project_Timer/Data/Repository/FirebaseRepository.swift index 34e26604..8068f6bd 100644 --- a/Project_Timer/Data/Repository/FirebaseRepository.swift +++ b/Project_Timer/Data/Repository/FirebaseRepository.swift @@ -12,9 +12,9 @@ import RxSwift import RxMoya final class FirebaseRepository { - private let api: MoyaProvider + private let api: TTProvider - init(api: MoyaProvider) { + init(api: TTProvider) { self.api = api } @@ -23,15 +23,15 @@ final class FirebaseRepository { .map(AppVersionResponse.self) .map { $0.toDomain() } .catch { error in - if let moyaError = error as? MoyaError { - switch moyaError { - case .statusCode(let response): - return Single.error(NetworkError.serverError(statusCode: response.statusCode)) - default: - return Single.error(NetworkError.FAIL) - } - } - + return Single.error(NetworkError.DECODEERROR) + } + } + + func getServerURL() -> Single { + return self.api.rx.request(.getServerURL) + .map(ServerURLResponse.self) + .map { $0.base.value } + .catch { error in return Single.error(NetworkError.DECODEERROR) } } diff --git a/Project_Timer/Data/Repository/lagacy/ServerURLRepository.swift b/Project_Timer/Data/Repository/lagacy/ServerURLRepository.swift index e819daa4..cf692f0c 100644 --- a/Project_Timer/Data/Repository/lagacy/ServerURLRepository.swift +++ b/Project_Timer/Data/Repository/lagacy/ServerURLRepository.swift @@ -16,7 +16,7 @@ final class ServerURLRepository: ServerURLRepositoryInterface { switch result.status { case .SUCCESS: guard let data = result.data, - let dto = try? JSONDecoder().decode(ServerURLDTO.self, from: data) else { + let dto = try? JSONDecoder().decode(ServerURLResponse.self, from: data) else { completion(.failure(.DECODEERROR)) return } diff --git a/Project_Timer/Data/DTO/ServerURLDTO.swift b/Project_Timer/Data/Response/ServerURLResponse.swift similarity index 75% rename from Project_Timer/Data/DTO/ServerURLDTO.swift rename to Project_Timer/Data/Response/ServerURLResponse.swift index 147046f1..1fc92d5f 100644 --- a/Project_Timer/Data/DTO/ServerURLDTO.swift +++ b/Project_Timer/Data/Response/ServerURLResponse.swift @@ -1,14 +1,15 @@ // -// ServerURLDTO.swift +// ServerURLResponse.swift // Project_Timer // -// Created by Kang Minsang on 2023/12/15. -// Copyright © 2023 FDEE. All rights reserved. +// Created by Kang Minsang on 2024/05/15. +// Copyright © 2024 FDEE. All rights reserved. // import Foundation -struct ServerURLDTO: Decodable { +/// TiTi 서버 URL 정보 +struct ServerURLResponse: Decodable { let base: FirebaseStringValue private enum RootKey: String, CodingKey { diff --git a/Project_Timer/Data/TTProvider.swift b/Project_Timer/Data/TTProvider.swift new file mode 100644 index 00000000..b812674d --- /dev/null +++ b/Project_Timer/Data/TTProvider.swift @@ -0,0 +1,34 @@ +// +// TTProvider.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/05/15. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import RxSwift +import Moya +import RxMoya + +/// 공통적인 에러를 반환하는 Provider +final class TTProvider: MoyaProvider { + func request(_ token: T) -> Single { + return super.rx.request(token) + .catch { error in + self.handleError(error) + } + } + + private func handleError(_ error: Error) -> Single { + if let moyaError = error as? MoyaError { + switch moyaError { + case .statusCode(let response): + return Single.error(NetworkError.serverError(statusCode: response.statusCode)) + default: + return Single.error(NetworkError.FAIL) + } + } + return Single.error(NetworkError.FAIL) + } +} From 1bdfc68ee37904367721a6a9fe6fb592e193e779 Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Thu, 23 May 2024 08:47:48 +0900 Subject: [PATCH 07/44] =?UTF-8?q?feat=20#144:=20postSignup=20RxMoya=20?= =?UTF-8?q?=EB=B0=A9=EC=8B=9D=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 20 +++++++----- Project_Timer/Data/Network/Network.swift | 4 +-- .../Data/Network/NetworkInterceptor.swift | 5 ++- .../Data/Repository/AuthRepository.swift | 31 +++++++++++++++++++ ...tory.swift => AuthRepository_lagacy.swift} | 8 ++--- .../AuthResponse.swift} | 6 ++-- .../SettingTiTiLab/SettingTiTiLabVC.swift | 2 +- .../Email/ResetPasswordEmailView.swift | 4 +-- .../Nickname/ResetPasswordNicknameView.swift | 4 +-- .../Password/ResetPasswordView.swift | 2 +- .../ResetPassword/ResetPasswordVC.swift | 2 +- .../TestServer/SignupSigninVC.swift | 2 +- 12 files changed, 64 insertions(+), 26 deletions(-) create mode 100644 Project_Timer/Data/Repository/AuthRepository.swift rename Project_Timer/Data/Repository/lagacy/{AuthRepository.swift => AuthRepository_lagacy.swift} (92%) rename Project_Timer/Data/{DTO/AuthDTO.swift => Response/AuthResponse.swift} (83%) diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index 56fef71d..338d2a42 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -53,8 +53,8 @@ 870800582B2C3B0C00830B39 /* GetServerURLUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800572B2C3B0C00830B39 /* GetServerURLUseCase.swift */; }; 8708005A2B2C3B5800830B39 /* GetServerURLUseCaseInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800592B2C3B5800830B39 /* GetServerURLUseCaseInterface.swift */; }; 8708005C2B2C4D2D00830B39 /* AuthNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708005B2B2C4D2D00830B39 /* AuthNetwork.swift */; }; - 8708005F2B2C5F5F00830B39 /* AuthDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708005E2B2C5F5F00830B39 /* AuthDTO.swift */; }; - 870800612B2C5FDA00830B39 /* AuthRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800602B2C5FDA00830B39 /* AuthRepository.swift */; }; + 8708005F2B2C5F5F00830B39 /* AuthResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708005E2B2C5F5F00830B39 /* AuthResponse.swift */; }; + 870800612B2C5FDA00830B39 /* AuthRepository_lagacy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800602B2C5FDA00830B39 /* AuthRepository_lagacy.swift */; }; 870800632B2C604100830B39 /* AuthInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800622B2C604100830B39 /* AuthInfo.swift */; }; 870800652B2C623600830B39 /* AuthRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800642B2C623600830B39 /* AuthRepositoryInterface.swift */; }; 870800672B2C67E900830B39 /* AuthUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800662B2C67E900830B39 /* AuthUseCase.swift */; }; @@ -396,6 +396,7 @@ 87F1093C284C589A002E31EA /* FunctionInfoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87F10937284C589A002E31EA /* FunctionInfoCell.swift */; }; 87F50A17298FA3BD00ABF0CF /* newFeatures.strings in Resources */ = {isa = PBXBuildFile; fileRef = 87F50A19298FA3BD00ABF0CF /* newFeatures.strings */; }; 87F771BF2984101700BF1907 /* Todolist.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87F771BE2984101700BF1907 /* Todolist.swift */; }; + 87FB6B8D2BFE0B3F00CD7A9C /* AuthRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87FB6B8C2BFE0B3F00CD7A9C /* AuthRepository.swift */; }; 87FB8D1B2B3C5DF400EA5693 /* NotificationUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87FB8D1A2B3C5DF300EA5693 /* NotificationUseCase.swift */; }; 87FB8D1D2B3C5F4D00EA5693 /* NotificationUseCaseInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87FB8D1C2B3C5F4D00EA5693 /* NotificationUseCaseInterface.swift */; }; 87FD9FA72998D0BD00D9B0FF /* TimerStopwatchAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87FD9FA62998D0BD00D9B0FF /* TimerStopwatchAttributes.swift */; }; @@ -489,8 +490,8 @@ 870800572B2C3B0C00830B39 /* GetServerURLUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetServerURLUseCase.swift; sourceTree = ""; }; 870800592B2C3B5800830B39 /* GetServerURLUseCaseInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetServerURLUseCaseInterface.swift; sourceTree = ""; }; 8708005B2B2C4D2D00830B39 /* AuthNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthNetwork.swift; sourceTree = ""; }; - 8708005E2B2C5F5F00830B39 /* AuthDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthDTO.swift; sourceTree = ""; }; - 870800602B2C5FDA00830B39 /* AuthRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthRepository.swift; sourceTree = ""; }; + 8708005E2B2C5F5F00830B39 /* AuthResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthResponse.swift; sourceTree = ""; }; + 870800602B2C5FDA00830B39 /* AuthRepository_lagacy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthRepository_lagacy.swift; sourceTree = ""; }; 870800622B2C604100830B39 /* AuthInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthInfo.swift; sourceTree = ""; }; 870800642B2C623600830B39 /* AuthRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthRepositoryInterface.swift; sourceTree = ""; }; 870800662B2C67E900830B39 /* AuthUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthUseCase.swift; sourceTree = ""; }; @@ -815,6 +816,7 @@ 87F50A18298FA3BD00ABF0CF /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/newFeatures.strings; sourceTree = ""; }; 87F50A1A298FA3C100ABF0CF /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/newFeatures.strings; sourceTree = ""; }; 87F771BE2984101700BF1907 /* Todolist.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Todolist.swift; sourceTree = ""; }; + 87FB6B8C2BFE0B3F00CD7A9C /* AuthRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthRepository.swift; sourceTree = ""; }; 87FB8D1A2B3C5DF300EA5693 /* NotificationUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationUseCase.swift; sourceTree = ""; }; 87FB8D1C2B3C5F4D00EA5693 /* NotificationUseCaseInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationUseCaseInterface.swift; sourceTree = ""; }; 87FD9FA62998D0BD00D9B0FF /* TimerStopwatchAttributes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimerStopwatchAttributes.swift; sourceTree = ""; }; @@ -1153,7 +1155,6 @@ 875FAE222B1C653A008F19D2 /* DTO */ = { isa = PBXGroup; children = ( - 8708005E2B2C5F5F00830B39 /* AuthDTO.swift */, 8708006E2B2CA92C00830B39 /* DailyDTO.swift */, 87F10938284C589A002E31EA /* FunctionInfo.swift */, 877D69FB2871C1CB00215B6D /* SurveyInfo.swift */, @@ -1608,7 +1609,7 @@ children = ( 875FAE2B2B1C6B57008F19D2 /* AppLatestVersionRepository.swift */, 870800532B2C3A5400830B39 /* ServerURLRepository.swift */, - 870800602B2C5FDA00830B39 /* AuthRepository.swift */, + 870800602B2C5FDA00830B39 /* AuthRepository_lagacy.swift */, 8708006C2B2CA7AB00830B39 /* DailysRepository.swift */, 8708007A2B2D4F0800830B39 /* RecordTimesRepository.swift */, 870800862B2D599800830B39 /* SyncLogRepository.swift */, @@ -1732,6 +1733,7 @@ 87B90B3E2BF4BC6D00D6886E /* ErrorResponse.swift */, 87B90B3B2BF4B13D00D6886E /* AppVersionResponse.swift */, 870800512B2C3A0800830B39 /* ServerURLResponse.swift */, + 8708005E2B2C5F5F00830B39 /* AuthResponse.swift */, ); path = Response; sourceTree = ""; @@ -1980,6 +1982,7 @@ children = ( 87B90B382BF4AEE000D6886E /* lagacy */, 87B90B392BF4AEF600D6886E /* FirebaseRepository.swift */, + 87FB6B8C2BFE0B3F00CD7A9C /* AuthRepository.swift */, ); path = Repository; sourceTree = ""; @@ -2341,7 +2344,7 @@ 875EDA342957E0360037A7EB /* NetworkInterceptor.swift in Sources */, 870E11752A0E226D00CFA77C /* CalendarWidgetData.swift in Sources */, 870800752B2D3C9A00830B39 /* DailysUseCase.swift in Sources */, - 870800612B2C5FDA00830B39 /* AuthRepository.swift in Sources */, + 870800612B2C5FDA00830B39 /* AuthRepository_lagacy.swift in Sources */, 87CEDD3D28F5338B007ACF6E /* ColorSelectorVC.swift in Sources */, 878BF7F12955F4600044C079 /* JSONDecoder+Extension.swift in Sources */, 8706C32C2AEF864000F7C842 /* TTSignupTitleView.swift in Sources */, @@ -2543,6 +2546,7 @@ 879BE3222AC40444007AAC46 /* SignupSigninVM.swift in Sources */, 8791C1F627DCE703000D6BA9 /* UIView+Extension.swift in Sources */, 87D4DCC92BA52FC800BB5AAB /* ResetPasswordNicknameRoute.swift in Sources */, + 87FB6B8D2BFE0B3F00CD7A9C /* AuthRepository.swift in Sources */, 87D4DCC22BA5298B00BB5AAB /* ResetPasswordNicknameView.swift in Sources */, 87C2F97B28A6BFC700F44D98 /* ModifyRecordVC.swift in Sources */, 8708008B2B2D5A4400830B39 /* SyncLogRepositoryInterface.swift in Sources */, @@ -2597,7 +2601,7 @@ 87D4DCDB2BA5C19C00BB5AAB /* ResetPasswordModel.swift in Sources */, 87DE1177268AC9AD0012F043 /* DailyManager.swift in Sources */, 8708007F2B2D543500830B39 /* RecordTimesUseCase.swift in Sources */, - 8708005F2B2C5F5F00830B39 /* AuthDTO.swift in Sources */, + 8708005F2B2C5F5F00830B39 /* AuthResponse.swift in Sources */, 8721C6D72969123E00410D57 /* IOUsecase.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/Project_Timer/Data/Network/Network.swift b/Project_Timer/Data/Network/Network.swift index e3d731d6..95be3920 100644 --- a/Project_Timer/Data/Network/Network.swift +++ b/Project_Timer/Data/Network/Network.swift @@ -20,7 +20,7 @@ struct Network { } } - Session.default.request(url, method: method, interceptor: NetworkInterceptor()) { $0.timeoutInterval = 10 } + Session.default.request(url, method: method, interceptor: NetworkInterceptor.shared) { $0.timeoutInterval = 10 } .validate() .response { response in completion(self.configureNetworkResult(response: response)) @@ -38,7 +38,7 @@ struct Network { } } - Session.default.request(url, method: method, parameters: body, encoder: JSONParameterEncoder.dateFormatted, interceptor: NetworkInterceptor()) { $0.timeoutInterval = 10 } + Session.default.request(url, method: method, parameters: body, encoder: JSONParameterEncoder.dateFormatted, interceptor: NetworkInterceptor.shared) { $0.timeoutInterval = 10 } .validate() .response { response in completion(self.configureNetworkResult(response: response)) diff --git a/Project_Timer/Data/Network/NetworkInterceptor.swift b/Project_Timer/Data/Network/NetworkInterceptor.swift index e367ea73..5264db77 100644 --- a/Project_Timer/Data/Network/NetworkInterceptor.swift +++ b/Project_Timer/Data/Network/NetworkInterceptor.swift @@ -11,6 +11,9 @@ import Alamofire final class NetworkInterceptor: RequestInterceptor { static let retryLimit = 3 + static let shared = NetworkInterceptor() + private init() {} + /// network request 전에 token 설정 func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result) -> Void) { guard urlRequest.url?.absoluteString.hasPrefix(NetworkURL.shared.serverURL ?? "nil") == true else { @@ -63,7 +66,7 @@ extension NetworkInterceptor { guard let username = KeyChain.shared.get(key: .username), let password = KeyChain.shared.get(key: .password) else { return } let signinInfo = TestUserSigninInfo(username: username, password: password) - let authUseCase = AuthUseCase(repository: AuthRepository()) + let authUseCase = AuthUseCase(repository: AuthRepository_lagacy()) authUseCase.signin(signinInfo: signinInfo) { result in switch result { case .success(let token): diff --git a/Project_Timer/Data/Repository/AuthRepository.swift b/Project_Timer/Data/Repository/AuthRepository.swift new file mode 100644 index 00000000..8de058b7 --- /dev/null +++ b/Project_Timer/Data/Repository/AuthRepository.swift @@ -0,0 +1,31 @@ +// +// AuthRepository.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/05/22. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Moya +import RxSwift +import RxMoya + +final class AuthRepository { + private let api: TTProvider + + init(api: TTProvider) { + self.api = api + } + + func postSignup(info: TestUserSignupInfo) -> Single { + return self.api.rx.request(.postSignup(info)) + .map(AuthResponse.self) + .map { $0.toDomain() } + .catch { error in + return Single.error(NetworkError.DECODEERROR) + } + } + + +} diff --git a/Project_Timer/Data/Repository/lagacy/AuthRepository.swift b/Project_Timer/Data/Repository/lagacy/AuthRepository_lagacy.swift similarity index 92% rename from Project_Timer/Data/Repository/lagacy/AuthRepository.swift rename to Project_Timer/Data/Repository/lagacy/AuthRepository_lagacy.swift index 3b19b3fa..56645837 100644 --- a/Project_Timer/Data/Repository/lagacy/AuthRepository.swift +++ b/Project_Timer/Data/Repository/lagacy/AuthRepository_lagacy.swift @@ -1,5 +1,5 @@ // -// AuthRepository.swift +// AuthRepository_lagacy.swift // Project_Timer // // Created by Kang Minsang on 2023/12/15. @@ -8,7 +8,7 @@ import Foundation -final class AuthRepository: AuthRepositoryInterface { +final class AuthRepository_lagacy: AuthRepositoryInterface { private let api = AuthNetwork() func signup(signupInfo: TestUserSignupInfo, completion: @escaping (Result) -> Void) { @@ -16,7 +16,7 @@ final class AuthRepository: AuthRepositoryInterface { switch result.status { case .SUCCESS: guard let data = result.data, - let dto = try? JSONDecoder().decode(AuthDTO.self, from: data) else { + let dto = try? JSONDecoder().decode(AuthResponse.self, from: data) else { completion(.failure(.DECODEERROR)) return } @@ -35,7 +35,7 @@ final class AuthRepository: AuthRepositoryInterface { switch result.status { case .SUCCESS: guard let data = result.data, - let dto = try? JSONDecoder().decode(AuthDTO.self, from: data) else { + let dto = try? JSONDecoder().decode(AuthResponse.self, from: data) else { completion(.failure(.DECODEERROR)) return } diff --git a/Project_Timer/Data/DTO/AuthDTO.swift b/Project_Timer/Data/Response/AuthResponse.swift similarity index 83% rename from Project_Timer/Data/DTO/AuthDTO.swift rename to Project_Timer/Data/Response/AuthResponse.swift index 45389128..9494ee0c 100644 --- a/Project_Timer/Data/DTO/AuthDTO.swift +++ b/Project_Timer/Data/Response/AuthResponse.swift @@ -1,5 +1,5 @@ // -// AuthDTO.swift +// AuthResponse.swift // Project_Timer // // Created by Kang Minsang on 2023/12/15. @@ -8,14 +8,14 @@ import Foundation -struct AuthDTO: Decodable { +struct AuthResponse: Decodable { var id: Int var username: String var email: String var token: String } -extension AuthDTO { +extension AuthResponse { func toDomain() -> AuthInfo { return .init( id: self.id, diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/SettingTiTiLabVC.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/SettingTiTiLabVC.swift index 82e72b58..e62301be 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/SettingTiTiLabVC.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/SettingTiTiLabVC.swift @@ -107,7 +107,7 @@ extension SettingTiTiLabVC { } private func showBetaSigninSignupVC(signin: Bool) { - let authUseCase = AuthUseCase(repository: AuthRepository()) + let authUseCase = AuthUseCase(repository: AuthRepository_lagacy()) let viewModel = SignupSigninVM(authUseCase: authUseCase, isSignin: signin) let vc = SignupSigninVC(viewModel: viewModel) self.navigationController?.pushViewController(vc, animated: true) diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Email/ResetPasswordEmailView.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Email/ResetPasswordEmailView.swift index 568fe6bf..d47f5c87 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Email/ResetPasswordEmailView.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Email/ResetPasswordEmailView.swift @@ -100,11 +100,11 @@ struct ResetPasswordEmailView: View { struct ResetPasswordEmailView_Previews: PreviewProvider { static var previews: some View { ResetPasswordEmailView( - model: ResetPasswordEmailModel(authUseCase: AuthUseCase(repository: AuthRepository()), infos: ResetPasswordInfosForEmail(nickname: "minsang"))) + model: ResetPasswordEmailModel(authUseCase: AuthUseCase(repository: AuthRepository_lagacy()), infos: ResetPasswordInfosForEmail(nickname: "minsang"))) .environmentObject(ResetPasswordEnvironment()) ResetPasswordEmailView( - model: ResetPasswordEmailModel(authUseCase: AuthUseCase(repository: AuthRepository()), infos: ResetPasswordInfosForEmail(nickname: "minsang"))) + model: ResetPasswordEmailModel(authUseCase: AuthUseCase(repository: AuthRepository_lagacy()), infos: ResetPasswordInfosForEmail(nickname: "minsang"))) .environmentObject(ResetPasswordEnvironment()) .environment(\.locale, .init(identifier: "en")) } diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Nickname/ResetPasswordNicknameView.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Nickname/ResetPasswordNicknameView.swift index 5a13df3a..c00e8328 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Nickname/ResetPasswordNicknameView.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Nickname/ResetPasswordNicknameView.swift @@ -121,11 +121,11 @@ struct ResetPasswordNicknameView: View { struct ResetPasswordNicknameView_Previews: PreviewProvider { static var previews: some View { ResetPasswordNicknameView( - model: ResetPasswordNicknameModel(authUseCase: AuthUseCase(repository: AuthRepository()))) + model: ResetPasswordNicknameModel(authUseCase: AuthUseCase(repository: AuthRepository_lagacy()))) .environmentObject(ResetPasswordEnvironment()) ResetPasswordNicknameView( - model: ResetPasswordNicknameModel(authUseCase: AuthUseCase(repository: AuthRepository()))) + model: ResetPasswordNicknameModel(authUseCase: AuthUseCase(repository: AuthRepository_lagacy()))) .environmentObject(ResetPasswordEnvironment()) .environment(\.locale, .init(identifier: "en")) } diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Password/ResetPasswordView.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Password/ResetPasswordView.swift index 0cee0f3d..b60b4a26 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Password/ResetPasswordView.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Password/ResetPasswordView.swift @@ -136,7 +136,7 @@ struct ResetPasswordView_Previews: PreviewProvider { static var previews: some View { ResetPasswordView( - model: ResetPasswordModel(authUseCase: AuthUseCase(repository: AuthRepository()), infos: ResetPasswordInfosForPassword(nickname: "minsang", email: "freedeveloper97@gmail.com")) + model: ResetPasswordModel(authUseCase: AuthUseCase(repository: AuthRepository_lagacy()), infos: ResetPasswordInfosForPassword(nickname: "minsang", email: "freedeveloper97@gmail.com")) ).environmentObject(ResetPasswordEnvironment()) } } diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/ResetPasswordVC.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/ResetPasswordVC.swift index e43414c7..cad37226 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/ResetPasswordVC.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/ResetPasswordVC.swift @@ -30,7 +30,7 @@ final class ResetPasswordVC: PortraitVC { private func configureHostingVC() { guard let environment = self.environment else { return } - let authRepository = AuthRepository() + let authRepository = AuthRepository_lagacy() let authUseCase = AuthUseCase(repository: authRepository) let resetPasswordNicknameModel = ResetPasswordNicknameModel(authUseCase: authUseCase) let hostingVC = UIHostingController(rootView: ResetPasswordNicknameView(model: resetPasswordNicknameModel).environmentObject(environment)) diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVC.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVC.swift index ac138236..40a6def7 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVC.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVC.swift @@ -513,7 +513,7 @@ import SwiftUI #Preview { UIViewControllerPreview { - let authUseCase = AuthUseCase(repository: AuthRepository()) + let authUseCase = AuthUseCase(repository: AuthRepository_lagacy()) let viewModel = SignupSigninVM(authUseCase: authUseCase, isSignin: false) return SignupSigninVC(viewModel: viewModel) } From c6aa580dd9d70da5ab7879951878cbb8f1b97339 Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sat, 25 May 2024 09:15:56 +0900 Subject: [PATCH 08/44] =?UTF-8?q?feat=20#144:=20CombineMoya=20=EB=B0=A9?= =?UTF-8?q?=EC=8B=9D=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95=20&=20AuthRepo?= =?UTF-8?q?sitory=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Data/Repository/AuthRepository.swift | 38 +++++++++++++++---- .../Data/Repository/FirebaseRepository.swift | 20 ++++------ .../Data/Response/SimpleResponse.swift | 6 +++ Project_Timer/Data/TTProvider.swift | 34 ++++++++++++----- 4 files changed, 70 insertions(+), 28 deletions(-) diff --git a/Project_Timer/Data/Repository/AuthRepository.swift b/Project_Timer/Data/Repository/AuthRepository.swift index 8de058b7..183248eb 100644 --- a/Project_Timer/Data/Repository/AuthRepository.swift +++ b/Project_Timer/Data/Repository/AuthRepository.swift @@ -8,8 +8,8 @@ import Foundation import Moya -import RxSwift -import RxMoya +import Combine +import CombineMoya final class AuthRepository { private let api: TTProvider @@ -18,14 +18,38 @@ final class AuthRepository { self.api = api } - func postSignup(info: TestUserSignupInfo) -> Single { - return self.api.rx.request(.postSignup(info)) + func signup(info: TestUserSignupInfo) -> AnyPublisher { + return self.api.requestPublisher(.postSignup(info)) .map(AuthResponse.self) .map { $0.toDomain() } - .catch { error in - return Single.error(NetworkError.DECODEERROR) - } + .catchDecodeError() } + func signin(info: TestUserSigninInfo) -> AnyPublisher { + return self.api.requestPublisher(.postSignin(info)) + .map(AuthResponse.self) + .map { $0.toDomain() } + .catchDecodeError() + } + + func checkUsernameExit(username: String) -> AnyPublisher { + return self.api.requestPublisher(.getCheckUsername(username)) + .map(SimpleResponse.self) + .map { $0.toDomain() } + .catchDecodeError() + } + func checkEmailExit(username: String, email: String) -> AnyPublisher { + return self.api.requestPublisher(.getCheckEmail(username, email)) + .map(SimpleResponse.self) + .map { $0.toDomain() } + .catchDecodeError() + } + + func updatePassword(request: ResetPasswordRequest) -> AnyPublisher { + return self.api.requestPublisher(.postUpdatePassword(request)) + .map(SimpleResponse.self) + .map { $0.toDomain() } + .catchDecodeError() + } } diff --git a/Project_Timer/Data/Repository/FirebaseRepository.swift b/Project_Timer/Data/Repository/FirebaseRepository.swift index 8068f6bd..e78b0a1f 100644 --- a/Project_Timer/Data/Repository/FirebaseRepository.swift +++ b/Project_Timer/Data/Repository/FirebaseRepository.swift @@ -8,8 +8,8 @@ import Foundation import Moya -import RxSwift -import RxMoya +import Combine +import CombineMoya final class FirebaseRepository { private let api: TTProvider @@ -18,21 +18,17 @@ final class FirebaseRepository { self.api = api } - func getAppVersion() -> Single { - return self.api.rx.request(.getAppVersion) + func getAppVersion() -> AnyPublisher { + return self.api.requestPublisher(.getAppVersion) .map(AppVersionResponse.self) .map { $0.toDomain() } - .catch { error in - return Single.error(NetworkError.DECODEERROR) - } + .catchDecodeError() } - func getServerURL() -> Single { - return self.api.rx.request(.getServerURL) + func getServerURL() -> AnyPublisher { + return self.api.requestPublisher(.getServerURL) .map(ServerURLResponse.self) .map { $0.base.value } - .catch { error in - return Single.error(NetworkError.DECODEERROR) - } + .catchDecodeError() } } diff --git a/Project_Timer/Data/Response/SimpleResponse.swift b/Project_Timer/Data/Response/SimpleResponse.swift index 2d7cfe3a..ecc0200c 100644 --- a/Project_Timer/Data/Response/SimpleResponse.swift +++ b/Project_Timer/Data/Response/SimpleResponse.swift @@ -13,3 +13,9 @@ struct SimpleResponse: Decodable { let data: Bool let message: String } + +extension SimpleResponse { + func toDomain() -> Bool { + return self.data + } +} diff --git a/Project_Timer/Data/TTProvider.swift b/Project_Timer/Data/TTProvider.swift index b812674d..2eb9fff6 100644 --- a/Project_Timer/Data/TTProvider.swift +++ b/Project_Timer/Data/TTProvider.swift @@ -8,27 +8,43 @@ import Foundation import RxSwift +import Combine import Moya -import RxMoya /// 공통적인 에러를 반환하는 Provider final class TTProvider: MoyaProvider { - func request(_ token: T) -> Single { - return super.rx.request(token) - .catch { error in - self.handleError(error) + func request(_ token: T) -> AnyPublisher { + return Future { promise in + super.request(token) { result in + switch result { + case .success(let response): + promise(.success(response)) + case .failure(let error): + promise(.failure(self.handleError(error))) + } } + } + .eraseToAnyPublisher() } - private func handleError(_ error: Error) -> Single { + private func handleError(_ error: Error) -> NetworkError { if let moyaError = error as? MoyaError { switch moyaError { case .statusCode(let response): - return Single.error(NetworkError.serverError(statusCode: response.statusCode)) + return NetworkError.serverError(statusCode: response.statusCode) default: - return Single.error(NetworkError.FAIL) + return NetworkError.FAIL } } - return Single.error(NetworkError.FAIL) + return NetworkError.FAIL + } +} + +extension Publisher { + /// Repository의 공통적인 Decode 에러를 반환하는 Publisher + func catchDecodeError() -> AnyPublisher { + return self + .mapError { _ in NetworkError.DECODEERROR } + .eraseToAnyPublisher() } } From f80e638e2b8092488de68baff71ee23e0f01e66d Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sun, 9 Jun 2024 16:14:52 +0900 Subject: [PATCH 09/44] =?UTF-8?q?feat=20#144:=20200=EB=8C=80=20statusCode?= =?UTF-8?q?=EA=B0=80=20=EC=95=84=EB=8B=8C=20=EA=B2=BD=EC=9A=B0=20ErrorResp?= =?UTF-8?q?onse=20=EA=B0=92=20=EB=B0=98=ED=99=98=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 2 +- .../Data/{Response => Error}/ErrorResponse.swift | 2 +- Project_Timer/Data/Error/NetworkError.swift | 10 ++++++++++ Project_Timer/Data/TTProvider.swift | 6 ++++++ 4 files changed, 18 insertions(+), 2 deletions(-) rename Project_Timer/Data/{Response => Error}/ErrorResponse.swift (94%) diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index 338d2a42..e047b18e 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -1622,6 +1622,7 @@ isa = PBXGroup; children = ( 87163DC72ACAF2E8008D4072 /* NetworkError.swift */, + 87B90B3E2BF4BC6D00D6886E /* ErrorResponse.swift */, ); path = Error; sourceTree = ""; @@ -1730,7 +1731,6 @@ children = ( 8708005D2B2C5DF400830B39 /* FirebaseValue */, 87D4DCCE2BA5492700BB5AAB /* SimpleResponse.swift */, - 87B90B3E2BF4BC6D00D6886E /* ErrorResponse.swift */, 87B90B3B2BF4B13D00D6886E /* AppVersionResponse.swift */, 870800512B2C3A0800830B39 /* ServerURLResponse.swift */, 8708005E2B2C5F5F00830B39 /* AuthResponse.swift */, diff --git a/Project_Timer/Data/Response/ErrorResponse.swift b/Project_Timer/Data/Error/ErrorResponse.swift similarity index 94% rename from Project_Timer/Data/Response/ErrorResponse.swift rename to Project_Timer/Data/Error/ErrorResponse.swift index 6cdc51f5..7efdc75a 100644 --- a/Project_Timer/Data/Response/ErrorResponse.swift +++ b/Project_Timer/Data/Error/ErrorResponse.swift @@ -8,7 +8,7 @@ import Foundation -/// 에러정보 +/// TiTi 에러 struct ErrorResponse: Decodable { let code: String let message: String diff --git a/Project_Timer/Data/Error/NetworkError.swift b/Project_Timer/Data/Error/NetworkError.swift index 5573d032..bfbd7119 100644 --- a/Project_Timer/Data/Error/NetworkError.swift +++ b/Project_Timer/Data/Error/NetworkError.swift @@ -7,6 +7,7 @@ // import Foundation +import Moya enum NetworkError: Error { case FAIL @@ -17,6 +18,7 @@ enum NetworkError: Error { case NOTFOUND(String?) // 404 case CONFLICT(String?) // 409 case SERVERERROR(String?) // 500 + case ERRORRESPONSE(ErrorResponse) // TiTi ErrorResponse static func error(_ result: NetworkResult) -> NetworkError { switch result.status { @@ -48,6 +50,14 @@ enum NetworkError: Error { } } + /// ErrorResponse 반환 + static func errorResponse(_ response: Response) -> NetworkError { + guard let errorResponse = try? JSONDecoder().decode(ErrorResponse.self, from: response.data) else { + return .serverError(statusCode: response.statusCode) + } + return .ERRORRESPONSE(errorResponse) + } + /// 범용적으로 표시될 수 있는 alert title 값, CLIENTERROR의 경우 VM에서 처리 var title: String { switch self { diff --git a/Project_Timer/Data/TTProvider.swift b/Project_Timer/Data/TTProvider.swift index 2eb9fff6..875d56d3 100644 --- a/Project_Timer/Data/TTProvider.swift +++ b/Project_Timer/Data/TTProvider.swift @@ -18,6 +18,12 @@ final class TTProvider: MoyaProvider { super.request(token) { result in switch result { case .success(let response): + if (200...299).contains(response.statusCode) { + promise(.success(response)) + } else { + // ErrorResponse 디코딩 + promise(.failure(NetworkError.errorResponse(response))) + } promise(.success(response)) case .failure(let error): promise(.failure(self.handleError(error))) From 343511284ed4862d86ff361cc2104741dc1ee9b3 Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sun, 9 Jun 2024 16:28:38 +0900 Subject: [PATCH 10/44] =?UTF-8?q?rename=20#144:=20Info=20->=20Request=20?= =?UTF-8?q?=EB=AA=85=EC=B9=AD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 22 +++++++------ Project_Timer/Data/API/AuthAPI.swift | 31 ++++++++----------- .../Data/API/lagacy/AuthNetwork.swift | 4 +-- .../Data/Network/NetworkInterceptor.swift | 2 +- .../Data/Repository/AuthRepository.swift | 12 +++---- .../lagacy/AuthRepository_lagacy.swift | 4 +-- .../Data/Request/CheckEmailExitRequest.swift | 14 +++++++++ .../Request/TestUserSigninRequest.swift} | 4 +-- .../Request/TestUserSignupRequest.swift} | 4 +-- .../Interface/AuthRepositoryInterface.swift | 4 +-- .../Domain/UseCase/AuthUseCase.swift | 4 +-- .../Interface/AuthUseCaseInterface.swift | 4 +-- .../TestServer/SignupSigninVC.swift | 4 +-- .../TestServer/SignupSigninVM.swift | 4 +-- 14 files changed, 65 insertions(+), 52 deletions(-) create mode 100644 Project_Timer/Data/Request/CheckEmailExitRequest.swift rename Project_Timer/{Domain/Entity/TestUserSigninInfo.swift => Data/Request/TestUserSigninRequest.swift} (72%) rename Project_Timer/{Domain/Entity/TestUserSignupInfo.swift => Data/Request/TestUserSignupRequest.swift} (74%) diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index e047b18e..6e0c7048 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -148,6 +148,7 @@ 87459708263FF0F000172C0F /* Storage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87459707263FF0F000172C0F /* Storage.swift */; }; 87476DAD28A2794B00FAD273 /* LastestVersionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87476DAC28A2794B00FAD273 /* LastestVersionInfo.swift */; }; 874964F52649590700113E25 /* StopwatchVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 874964F42649590700113E25 /* StopwatchVC.swift */; }; + 874B54282C158F890062D0AC /* CheckEmailExitRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 874B54272C158F890062D0AC /* CheckEmailExitRequest.swift */; }; 874B9D1A25CAB233006FCD04 /* HGGGOTHICSSI_PRO_60G.otf in Resources */ = {isa = PBXBuildFile; fileRef = 874B9D1425CAB233006FCD04 /* HGGGOTHICSSI_PRO_60G.otf */; }; 874B9D1B25CAB233006FCD04 /* HGGGOTHICSSI_PRO_80G.otf in Resources */ = {isa = PBXBuildFile; fileRef = 874B9D1525CAB233006FCD04 /* HGGGOTHICSSI_PRO_80G.otf */; }; 874B9D1C25CAB233006FCD04 /* HGGGOTHICSSI_PRO_99G.otf in Resources */ = {isa = PBXBuildFile; fileRef = 874B9D1625CAB233006FCD04 /* HGGGOTHICSSI_PRO_99G.otf */; }; @@ -359,8 +360,8 @@ 87D4DE122A0F83A500993C5C /* CalendarWidgetTaskData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D4DE102A0F83A500993C5C /* CalendarWidgetTaskData.swift */; }; 87D5E65028C7460100D53F8D /* MonthSmallVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D5E64F28C7460100D53F8D /* MonthSmallVM.swift */; }; 87D5E65328C7477100D53F8D /* MonthTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D5E65228C7477100D53F8D /* MonthTime.swift */; }; - 87D7ED152952B3C100121DE6 /* TestUserSignupInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D7ED142952B3C100121DE6 /* TestUserSignupInfo.swift */; }; - 87D7ED172952B69200121DE6 /* TestUserSigninInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D7ED162952B69200121DE6 /* TestUserSigninInfo.swift */; }; + 87D7ED152952B3C100121DE6 /* TestUserSignupRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D7ED142952B3C100121DE6 /* TestUserSignupRequest.swift */; }; + 87D7ED172952B69200121DE6 /* TestUserSigninRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D7ED162952B69200121DE6 /* TestUserSigninRequest.swift */; }; 87D7ED1A2952BA8800121DE6 /* JSONParameterEncoder+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D7ED192952BA8800121DE6 /* JSONParameterEncoder+Extension.swift */; }; 87D83E852B285D4D003C40AE /* SettingLanguageVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D83E842B285D4D003C40AE /* SettingLanguageVC.swift */; }; 87D83E882B296069003C40AE /* TTSettingSelectableCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D83E872B296069003C40AE /* TTSettingSelectableCell.swift */; }; @@ -583,6 +584,7 @@ 87459707263FF0F000172C0F /* Storage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Storage.swift; sourceTree = ""; }; 87476DAC28A2794B00FAD273 /* LastestVersionInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LastestVersionInfo.swift; sourceTree = ""; }; 874964F42649590700113E25 /* StopwatchVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StopwatchVC.swift; sourceTree = ""; }; + 874B54272C158F890062D0AC /* CheckEmailExitRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckEmailExitRequest.swift; sourceTree = ""; }; 874B9D1425CAB233006FCD04 /* HGGGOTHICSSI_PRO_60G.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = HGGGOTHICSSI_PRO_60G.otf; sourceTree = ""; }; 874B9D1525CAB233006FCD04 /* HGGGOTHICSSI_PRO_80G.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = HGGGOTHICSSI_PRO_80G.otf; sourceTree = ""; }; 874B9D1625CAB233006FCD04 /* HGGGOTHICSSI_PRO_99G.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = HGGGOTHICSSI_PRO_99G.otf; sourceTree = ""; }; @@ -781,8 +783,8 @@ 87D4DE102A0F83A500993C5C /* CalendarWidgetTaskData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarWidgetTaskData.swift; sourceTree = ""; }; 87D5E64F28C7460100D53F8D /* MonthSmallVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MonthSmallVM.swift; sourceTree = ""; }; 87D5E65228C7477100D53F8D /* MonthTime.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MonthTime.swift; sourceTree = ""; }; - 87D7ED142952B3C100121DE6 /* TestUserSignupInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestUserSignupInfo.swift; sourceTree = ""; }; - 87D7ED162952B69200121DE6 /* TestUserSigninInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestUserSigninInfo.swift; sourceTree = ""; }; + 87D7ED142952B3C100121DE6 /* TestUserSignupRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestUserSignupRequest.swift; sourceTree = ""; }; + 87D7ED162952B69200121DE6 /* TestUserSigninRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestUserSigninRequest.swift; sourceTree = ""; }; 87D7ED192952BA8800121DE6 /* JSONParameterEncoder+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "JSONParameterEncoder+Extension.swift"; sourceTree = ""; }; 87D83E842B285D4D003C40AE /* SettingLanguageVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingLanguageVC.swift; sourceTree = ""; }; 87D83E872B296069003C40AE /* TTSettingSelectableCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TTSettingSelectableCell.swift; sourceTree = ""; }; @@ -1186,8 +1188,6 @@ 878DA1F52AEE617900C60CBF /* SignupInfo.swift */, 875FAE272B1C679D008F19D2 /* AppLatestVersionInfo.swift */, 870800622B2C604100830B39 /* AuthInfo.swift */, - 87D7ED142952B3C100121DE6 /* TestUserSignupInfo.swift */, - 87D7ED162952B69200121DE6 /* TestUserSigninInfo.swift */, 87459705263FF0D700172C0F /* Daily.swift */, 870800702B2CAD9900830B39 /* TaskHistory.swift */, 87A4704726493D4D007B89D6 /* RecordTimes.swift */, @@ -1722,6 +1722,9 @@ isa = PBXGroup; children = ( 87D4DCCB2BA5477400BB5AAB /* ResetPasswordRequest.swift */, + 874B54272C158F890062D0AC /* CheckEmailExitRequest.swift */, + 87D7ED142952B3C100121DE6 /* TestUserSignupRequest.swift */, + 87D7ED162952B69200121DE6 /* TestUserSigninRequest.swift */, ); path = Request; sourceTree = ""; @@ -1942,8 +1945,8 @@ children = ( 87B90B402BF4BFEE00D6886E /* TTProvider.swift */, 87B90B3D2BF4BC0100D6886E /* Error */, - 87D4DCCD2BA548E300BB5AAB /* Response */, 87D4DCCA2BA5476900BB5AAB /* Request */, + 87D4DCCD2BA548E300BB5AAB /* Response */, 87F778E12B196F7400909511 /* Repository */, 875FAE232B1C6710008F19D2 /* API */, 875FAE222B1C653A008F19D2 /* DTO */, @@ -2309,6 +2312,7 @@ 873731D12B2E92BD00D7BD9F /* NotificationNetwork.swift in Sources */, 873731D52B2E938400D7BD9F /* NotificationDTO.swift in Sources */, 8708006D2B2CA7AB00830B39 /* DailysRepository.swift in Sources */, + 874B54282C158F890062D0AC /* CheckEmailExitRequest.swift in Sources */, 8758E4F528C7124900A99484 /* MonthSmallView.swift in Sources */, 87A722A828CCB95C000DA304 /* MonthVM.swift in Sources */, 87A8BC3B288D1436007ED793 /* LogVC.swift in Sources */, @@ -2413,7 +2417,7 @@ 870E85012AD67E46000511BD /* KeyboardResponder.swift in Sources */, 870800872B2D599800830B39 /* SyncLogRepository.swift in Sources */, 87A48BCB27DF112B00F46D0F /* LogHomeVM.swift in Sources */, - 87D7ED172952B69200121DE6 /* TestUserSigninInfo.swift in Sources */, + 87D7ED172952B69200121DE6 /* TestUserSigninRequest.swift in Sources */, 87D4DCC02BA5253600BB5AAB /* ResetPasswordEnvironment.swift in Sources */, 8706C3322AEF8A0300F7C842 /* TTSignupNextButtonForMac.swift in Sources */, 87306D532B260969001B7C14 /* TLRen.swift in Sources */, @@ -2449,7 +2453,7 @@ 87D5E65328C7477100D53F8D /* MonthTime.swift in Sources */, 87D83E8A2B2964EC003C40AE /* SettingLanguageListView.swift in Sources */, 87D4DCD92BA5C17900BB5AAB /* ResetPasswordView.swift in Sources */, - 87D7ED152952B3C100121DE6 /* TestUserSignupInfo.swift in Sources */, + 87D7ED152952B3C100121DE6 /* TestUserSignupRequest.swift in Sources */, 878DA8232B0C6B1E001E924E /* SigninSelectModel.swift in Sources */, 04504C642864C7F500CA4C69 /* BaseTimeLabelView.swift in Sources */, 87D83E882B296069003C40AE /* TTSettingSelectableCell.swift in Sources */, diff --git a/Project_Timer/Data/API/AuthAPI.swift b/Project_Timer/Data/API/AuthAPI.swift index 65d928c8..a1b72021 100644 --- a/Project_Timer/Data/API/AuthAPI.swift +++ b/Project_Timer/Data/API/AuthAPI.swift @@ -10,10 +10,10 @@ import Foundation import Moya enum AuthAPI { - case postSignup(TestUserSignupInfo) - case postSignin(TestUserSigninInfo) + case postSignup(TestUserSignupRequest) + case postSignin(TestUserSigninRequest) case getCheckUsername(String) - case getCheckEmail(String, String) + case getCheckEmail(CheckEmailExitRequest) case postUpdatePassword(ResetPasswordRequest) } @@ -46,21 +46,16 @@ extension AuthAPI: TargetType { var task: Moya.Task { switch self { - case .postSignup(let testUserSignupInfo): - return .requestJSONEncodable(testUserSignupInfo) - case .postSignin(let testUserSignupInfo): - return .requestJSONEncodable(testUserSignupInfo) - case .getCheckUsername(let username): - return .requestParameters(parameters: [ - "username" : username - ], encoding: URLEncoding.queryString) - case .getCheckEmail(let username, let email): - return .requestParameters(parameters: [ - "username": username, - "email": email - ], encoding: URLEncoding.queryString) - case .postUpdatePassword(let resetPasswordRequest): - return .requestJSONEncodable(resetPasswordRequest) + case .postSignup(let request): + return .requestJSONEncodable(request) + case .postSignin(let request): + return .requestJSONEncodable(request) + case .getCheckUsername(let request): + return .requestJSONEncodable(request) + case .getCheckEmail(let request): + return .requestJSONEncodable(request) + case .postUpdatePassword(let request): + return .requestJSONEncodable(request) } } diff --git a/Project_Timer/Data/API/lagacy/AuthNetwork.swift b/Project_Timer/Data/API/lagacy/AuthNetwork.swift index 65a9703c..e6041dca 100644 --- a/Project_Timer/Data/API/lagacy/AuthNetwork.swift +++ b/Project_Timer/Data/API/lagacy/AuthNetwork.swift @@ -28,13 +28,13 @@ final class AuthNetwork { return base + "/auth/users/password" } - func signup(signupInfo: TestUserSignupInfo, completion: @escaping (NetworkResult) -> Void) { + func signup(signupInfo: TestUserSignupRequest, completion: @escaping (NetworkResult) -> Void) { self.network.request(url: self.signupURL, method: .post, param: nil, body: signupInfo) { result in completion(result) } } - func signin(signinInfo: TestUserSigninInfo, completion: @escaping (NetworkResult) -> Void) { + func signin(signinInfo: TestUserSigninRequest, completion: @escaping (NetworkResult) -> Void) { self.network.request(url: self.signinURL, method: .post, param: nil, body: signinInfo) { result in completion(result) } diff --git a/Project_Timer/Data/Network/NetworkInterceptor.swift b/Project_Timer/Data/Network/NetworkInterceptor.swift index 5264db77..2bb7c495 100644 --- a/Project_Timer/Data/Network/NetworkInterceptor.swift +++ b/Project_Timer/Data/Network/NetworkInterceptor.swift @@ -65,7 +65,7 @@ extension NetworkInterceptor { private func signinForToken(completion: @escaping (String?) -> Void) { guard let username = KeyChain.shared.get(key: .username), let password = KeyChain.shared.get(key: .password) else { return } - let signinInfo = TestUserSigninInfo(username: username, password: password) + let signinInfo = TestUserSigninRequest(username: username, password: password) let authUseCase = AuthUseCase(repository: AuthRepository_lagacy()) authUseCase.signin(signinInfo: signinInfo) { result in switch result { diff --git a/Project_Timer/Data/Repository/AuthRepository.swift b/Project_Timer/Data/Repository/AuthRepository.swift index 183248eb..8deb15d8 100644 --- a/Project_Timer/Data/Repository/AuthRepository.swift +++ b/Project_Timer/Data/Repository/AuthRepository.swift @@ -18,15 +18,15 @@ final class AuthRepository { self.api = api } - func signup(info: TestUserSignupInfo) -> AnyPublisher { - return self.api.requestPublisher(.postSignup(info)) + func signup(request: TestUserSignupRequest) -> AnyPublisher { + return self.api.requestPublisher(.postSignup(request)) .map(AuthResponse.self) .map { $0.toDomain() } .catchDecodeError() } - func signin(info: TestUserSigninInfo) -> AnyPublisher { - return self.api.requestPublisher(.postSignin(info)) + func signin(request: TestUserSigninRequest) -> AnyPublisher { + return self.api.requestPublisher(.postSignin(request)) .map(AuthResponse.self) .map { $0.toDomain() } .catchDecodeError() @@ -39,8 +39,8 @@ final class AuthRepository { .catchDecodeError() } - func checkEmailExit(username: String, email: String) -> AnyPublisher { - return self.api.requestPublisher(.getCheckEmail(username, email)) + func checkEmailExit(request: CheckEmailExitRequest) -> AnyPublisher { + return self.api.requestPublisher(.getCheckEmail(request)) .map(SimpleResponse.self) .map { $0.toDomain() } .catchDecodeError() diff --git a/Project_Timer/Data/Repository/lagacy/AuthRepository_lagacy.swift b/Project_Timer/Data/Repository/lagacy/AuthRepository_lagacy.swift index 56645837..c0667d7f 100644 --- a/Project_Timer/Data/Repository/lagacy/AuthRepository_lagacy.swift +++ b/Project_Timer/Data/Repository/lagacy/AuthRepository_lagacy.swift @@ -11,7 +11,7 @@ import Foundation final class AuthRepository_lagacy: AuthRepositoryInterface { private let api = AuthNetwork() - func signup(signupInfo: TestUserSignupInfo, completion: @escaping (Result) -> Void) { + func signup(signupInfo: TestUserSignupRequest, completion: @escaping (Result) -> Void) { api.signup(signupInfo: signupInfo) { result in switch result.status { case .SUCCESS: @@ -30,7 +30,7 @@ final class AuthRepository_lagacy: AuthRepositoryInterface { } } - func signin(signinInfo: TestUserSigninInfo, completion: @escaping (Result) -> Void) { + func signin(signinInfo: TestUserSigninRequest, completion: @escaping (Result) -> Void) { api.signin(signinInfo: signinInfo) { result in switch result.status { case .SUCCESS: diff --git a/Project_Timer/Data/Request/CheckEmailExitRequest.swift b/Project_Timer/Data/Request/CheckEmailExitRequest.swift new file mode 100644 index 00000000..76d22d31 --- /dev/null +++ b/Project_Timer/Data/Request/CheckEmailExitRequest.swift @@ -0,0 +1,14 @@ +// +// CheckEmailExitRequest.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/06/09. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation + +struct CheckEmailExitRequest: Encodable { + let username: String + let email: String +} diff --git a/Project_Timer/Domain/Entity/TestUserSigninInfo.swift b/Project_Timer/Data/Request/TestUserSigninRequest.swift similarity index 72% rename from Project_Timer/Domain/Entity/TestUserSigninInfo.swift rename to Project_Timer/Data/Request/TestUserSigninRequest.swift index 74e40008..aaa5e6d6 100644 --- a/Project_Timer/Domain/Entity/TestUserSigninInfo.swift +++ b/Project_Timer/Data/Request/TestUserSigninRequest.swift @@ -1,5 +1,5 @@ // -// TestUserSigninInfo.swift +// TestUserSigninRequest.swift // Project_Timer // // Created by Kang Minsang on 2022/12/21. @@ -8,7 +8,7 @@ import Foundation -struct TestUserSigninInfo: Encodable { +struct TestUserSigninRequest: Encodable { let username: String let password: String } diff --git a/Project_Timer/Domain/Entity/TestUserSignupInfo.swift b/Project_Timer/Data/Request/TestUserSignupRequest.swift similarity index 74% rename from Project_Timer/Domain/Entity/TestUserSignupInfo.swift rename to Project_Timer/Data/Request/TestUserSignupRequest.swift index 5d079ed5..0a54add3 100644 --- a/Project_Timer/Domain/Entity/TestUserSignupInfo.swift +++ b/Project_Timer/Data/Request/TestUserSignupRequest.swift @@ -1,5 +1,5 @@ // -// TestUserSignupInfo.swift +// TestUserSignupRequest.swift // Project_Timer // // Created by Kang Minsang on 2022/12/21. @@ -8,7 +8,7 @@ import Foundation -struct TestUserSignupInfo: Encodable { +struct TestUserSignupRequest: Encodable { let username: String let email: String let password: String diff --git a/Project_Timer/Domain/Interface/AuthRepositoryInterface.swift b/Project_Timer/Domain/Interface/AuthRepositoryInterface.swift index bc8ef903..51679acc 100644 --- a/Project_Timer/Domain/Interface/AuthRepositoryInterface.swift +++ b/Project_Timer/Domain/Interface/AuthRepositoryInterface.swift @@ -9,8 +9,8 @@ import Foundation protocol AuthRepositoryInterface { - func signup(signupInfo: TestUserSignupInfo, completion: @escaping (Result) -> Void) - func signin(signinInfo: TestUserSigninInfo, completion: @escaping (Result) -> Void) + func signup(signupInfo: TestUserSignupRequest, completion: @escaping (Result) -> Void) + func signin(signinInfo: TestUserSigninRequest, completion: @escaping (Result) -> Void) func checkUsername(username: String, completion: @escaping (Result) -> Void) func checkEmail(username: String, email: String, completion: @escaping (Result) -> Void) func updatePassword(request: ResetPasswordRequest, completion: @escaping (Result) -> Void) diff --git a/Project_Timer/Domain/UseCase/AuthUseCase.swift b/Project_Timer/Domain/UseCase/AuthUseCase.swift index 3d2fb506..5729fc13 100644 --- a/Project_Timer/Domain/UseCase/AuthUseCase.swift +++ b/Project_Timer/Domain/UseCase/AuthUseCase.swift @@ -15,7 +15,7 @@ final class AuthUseCase: AuthUseCaseInterface { self.repository = repository } - func signup(signupInfo: TestUserSignupInfo, completion: @escaping (Result) -> Void) { + func signup(signupInfo: TestUserSignupRequest, completion: @escaping (Result) -> Void) { self.repository.signup(signupInfo: signupInfo) { result in // AuthInfo -> token 값반 반환 switch result { @@ -27,7 +27,7 @@ final class AuthUseCase: AuthUseCaseInterface { } } - func signin(signinInfo: TestUserSigninInfo, completion: @escaping (Result) -> Void) { + func signin(signinInfo: TestUserSigninRequest, completion: @escaping (Result) -> Void) { self.repository.signin(signinInfo: signinInfo) { result in // AuthInfo -> token 값반 반환 switch result { diff --git a/Project_Timer/Present/Interface/AuthUseCaseInterface.swift b/Project_Timer/Present/Interface/AuthUseCaseInterface.swift index 8317a62f..ccd51839 100644 --- a/Project_Timer/Present/Interface/AuthUseCaseInterface.swift +++ b/Project_Timer/Present/Interface/AuthUseCaseInterface.swift @@ -10,8 +10,8 @@ import Foundation protocol AuthUseCaseInterface { var repository: AuthRepositoryInterface { get } - func signup(signupInfo: TestUserSignupInfo, completion: @escaping (Result) -> Void) - func signin(signinInfo: TestUserSigninInfo, completion: @escaping (Result) -> Void) + func signup(signupInfo: TestUserSignupRequest, completion: @escaping (Result) -> Void) + func signin(signinInfo: TestUserSigninRequest, completion: @escaping (Result) -> Void) func checkUsername(username: String, completion: @escaping (Result) -> Void) func checkEmail(username: String, email: String, completion: @escaping (Result) -> Void) func updatePassword(request: ResetPasswordRequest, completion: @escaping (Result) -> Void) diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVC.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVC.swift index 40a6def7..d5c0469e 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVC.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVC.swift @@ -316,10 +316,10 @@ extension SignupSigninVC { let password = self?.passwordTextField.textField.text else { return } if self?.viewModel.isSignin == true { - self?.viewModel.signin(info: TestUserSigninInfo(username: username, password: password)) + self?.viewModel.signin(info: TestUserSigninRequest(username: username, password: password)) } else { guard let email = self?.emailTextField.textField.text else { return } - self?.viewModel.signup(info: TestUserSignupInfo(username: username, email: email, password: password)) + self?.viewModel.signup(info: TestUserSignupRequest(username: username, email: email, password: password)) } }), for: .touchUpInside) diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVM.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVM.swift index 4dd1c2e7..aad704bb 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVM.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVM.swift @@ -33,7 +33,7 @@ final class SignupSigninVM { } } - func signup(info: TestUserSignupInfo) { + func signup(info: TestUserSignupRequest) { self.loadingText = "Waiting for Signup..." self.authUseCase.signup(signupInfo: info) { [weak self] result in self?.loadingText = nil @@ -52,7 +52,7 @@ final class SignupSigninVM { } } - func signin(info: TestUserSigninInfo) { + func signin(info: TestUserSigninRequest) { self.loadingText = "Waiting for Signin..." self.authUseCase.signin(signinInfo: info) { [weak self] result in self?.loadingText = nil From 51f480add119ea13b81a77dcf10f5e5ad35453fe Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sun, 9 Jun 2024 16:46:54 +0900 Subject: [PATCH 11/44] =?UTF-8?q?feat=20#144:=20DailysRepository=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 12 ++++-- .../Data/Repository/DailysRepository.swift | 37 +++++++++++++++++++ ...ry.swift => DailysRepository_lagacy.swift} | 4 +- .../TestServer/SyncDailys/SyncDailysVC.swift | 2 +- 4 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 Project_Timer/Data/Repository/DailysRepository.swift rename Project_Timer/Data/Repository/lagacy/{DailysRepository.swift => DailysRepository_lagacy.swift} (93%) diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index 6e0c7048..1645b4f5 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -60,7 +60,7 @@ 870800672B2C67E900830B39 /* AuthUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800662B2C67E900830B39 /* AuthUseCase.swift */; }; 870800692B2C68EF00830B39 /* AuthUseCaseInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800682B2C68EF00830B39 /* AuthUseCaseInterface.swift */; }; 8708006B2B2CA57C00830B39 /* DailysNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708006A2B2CA57C00830B39 /* DailysNetwork.swift */; }; - 8708006D2B2CA7AB00830B39 /* DailysRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708006C2B2CA7AB00830B39 /* DailysRepository.swift */; }; + 8708006D2B2CA7AB00830B39 /* DailysRepository_lagacy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708006C2B2CA7AB00830B39 /* DailysRepository_lagacy.swift */; }; 8708006F2B2CA92C00830B39 /* DailyDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708006E2B2CA92C00830B39 /* DailyDTO.swift */; }; 870800712B2CAD9900830B39 /* TaskHistory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800702B2CAD9900830B39 /* TaskHistory.swift */; }; 870800732B2CB11B00830B39 /* DailyRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800722B2CB11B00830B39 /* DailyRepositoryInterface.swift */; }; @@ -149,6 +149,7 @@ 87476DAD28A2794B00FAD273 /* LastestVersionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87476DAC28A2794B00FAD273 /* LastestVersionInfo.swift */; }; 874964F52649590700113E25 /* StopwatchVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 874964F42649590700113E25 /* StopwatchVC.swift */; }; 874B54282C158F890062D0AC /* CheckEmailExitRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 874B54272C158F890062D0AC /* CheckEmailExitRequest.swift */; }; + 874B542C2C1592460062D0AC /* DailysRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 874B542B2C1592460062D0AC /* DailysRepository.swift */; }; 874B9D1A25CAB233006FCD04 /* HGGGOTHICSSI_PRO_60G.otf in Resources */ = {isa = PBXBuildFile; fileRef = 874B9D1425CAB233006FCD04 /* HGGGOTHICSSI_PRO_60G.otf */; }; 874B9D1B25CAB233006FCD04 /* HGGGOTHICSSI_PRO_80G.otf in Resources */ = {isa = PBXBuildFile; fileRef = 874B9D1525CAB233006FCD04 /* HGGGOTHICSSI_PRO_80G.otf */; }; 874B9D1C25CAB233006FCD04 /* HGGGOTHICSSI_PRO_99G.otf in Resources */ = {isa = PBXBuildFile; fileRef = 874B9D1625CAB233006FCD04 /* HGGGOTHICSSI_PRO_99G.otf */; }; @@ -498,7 +499,7 @@ 870800662B2C67E900830B39 /* AuthUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthUseCase.swift; sourceTree = ""; }; 870800682B2C68EF00830B39 /* AuthUseCaseInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthUseCaseInterface.swift; sourceTree = ""; }; 8708006A2B2CA57C00830B39 /* DailysNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailysNetwork.swift; sourceTree = ""; }; - 8708006C2B2CA7AB00830B39 /* DailysRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailysRepository.swift; sourceTree = ""; }; + 8708006C2B2CA7AB00830B39 /* DailysRepository_lagacy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailysRepository_lagacy.swift; sourceTree = ""; }; 8708006E2B2CA92C00830B39 /* DailyDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailyDTO.swift; sourceTree = ""; }; 870800702B2CAD9900830B39 /* TaskHistory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskHistory.swift; sourceTree = ""; }; 870800722B2CB11B00830B39 /* DailyRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailyRepositoryInterface.swift; sourceTree = ""; }; @@ -585,6 +586,7 @@ 87476DAC28A2794B00FAD273 /* LastestVersionInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LastestVersionInfo.swift; sourceTree = ""; }; 874964F42649590700113E25 /* StopwatchVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StopwatchVC.swift; sourceTree = ""; }; 874B54272C158F890062D0AC /* CheckEmailExitRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckEmailExitRequest.swift; sourceTree = ""; }; + 874B542B2C1592460062D0AC /* DailysRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailysRepository.swift; sourceTree = ""; }; 874B9D1425CAB233006FCD04 /* HGGGOTHICSSI_PRO_60G.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = HGGGOTHICSSI_PRO_60G.otf; sourceTree = ""; }; 874B9D1525CAB233006FCD04 /* HGGGOTHICSSI_PRO_80G.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = HGGGOTHICSSI_PRO_80G.otf; sourceTree = ""; }; 874B9D1625CAB233006FCD04 /* HGGGOTHICSSI_PRO_99G.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = HGGGOTHICSSI_PRO_99G.otf; sourceTree = ""; }; @@ -1610,7 +1612,7 @@ 875FAE2B2B1C6B57008F19D2 /* AppLatestVersionRepository.swift */, 870800532B2C3A5400830B39 /* ServerURLRepository.swift */, 870800602B2C5FDA00830B39 /* AuthRepository_lagacy.swift */, - 8708006C2B2CA7AB00830B39 /* DailysRepository.swift */, + 8708006C2B2CA7AB00830B39 /* DailysRepository_lagacy.swift */, 8708007A2B2D4F0800830B39 /* RecordTimesRepository.swift */, 870800862B2D599800830B39 /* SyncLogRepository.swift */, 873731D22B2E931800D7BD9F /* NotificationRepository.swift */, @@ -1986,6 +1988,7 @@ 87B90B382BF4AEE000D6886E /* lagacy */, 87B90B392BF4AEF600D6886E /* FirebaseRepository.swift */, 87FB6B8C2BFE0B3F00CD7A9C /* AuthRepository.swift */, + 874B542B2C1592460062D0AC /* DailysRepository.swift */, ); path = Repository; sourceTree = ""; @@ -2311,7 +2314,7 @@ 049BBA9828AB3D94005BAB1B /* ModifyFinishButton.swift in Sources */, 873731D12B2E92BD00D7BD9F /* NotificationNetwork.swift in Sources */, 873731D52B2E938400D7BD9F /* NotificationDTO.swift in Sources */, - 8708006D2B2CA7AB00830B39 /* DailysRepository.swift in Sources */, + 8708006D2B2CA7AB00830B39 /* DailysRepository_lagacy.swift in Sources */, 874B54282C158F890062D0AC /* CheckEmailExitRequest.swift in Sources */, 8758E4F528C7124900A99484 /* MonthSmallView.swift in Sources */, 87A722A828CCB95C000DA304 /* MonthVM.swift in Sources */, @@ -2471,6 +2474,7 @@ 8706C32E2AEF878D00F7C842 /* TTSignupTextFieldUnderlineView.swift in Sources */, 87199F442882BC430017D01A /* StandardDailyGraphView.swift in Sources */, 93B08521248DDF2F00E215BD /* AppDelegate.swift in Sources */, + 874B542C2C1592460062D0AC /* DailysRepository.swift in Sources */, 870800522B2C3A0800830B39 /* ServerURLResponse.swift in Sources */, 8791C1F227DCD050000D6BA9 /* Notification+Extension.swift in Sources */, 87F771BF2984101700BF1907 /* Todolist.swift in Sources */, diff --git a/Project_Timer/Data/Repository/DailysRepository.swift b/Project_Timer/Data/Repository/DailysRepository.swift new file mode 100644 index 00000000..167f0922 --- /dev/null +++ b/Project_Timer/Data/Repository/DailysRepository.swift @@ -0,0 +1,37 @@ +// +// DailysRepository.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/06/09. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Moya +import Combine +import CombineMoya + +final class DailysRepository { + private let api: TTProvider + + init(api: TTProvider) { + self.api = api + } + + func uploadDailys(request: [Daily]) -> AnyPublisher { + return self.api.request(.postDailys(request)) + .map { _ in true } + .catchDecodeError() + } + + func getDailys() -> AnyPublisher<[Daily], NetworkError> { + return self.api.request(.getDailys) + .tryMap { response in + guard let dtos = try? JSONDecoder.dateFormatted.decode([DailyDTO].self, from: response.data) else { + throw NetworkError.DECODEERROR + } + return dtos.map { $0.toDomain() } + } + .catchDecodeError() + } +} diff --git a/Project_Timer/Data/Repository/lagacy/DailysRepository.swift b/Project_Timer/Data/Repository/lagacy/DailysRepository_lagacy.swift similarity index 93% rename from Project_Timer/Data/Repository/lagacy/DailysRepository.swift rename to Project_Timer/Data/Repository/lagacy/DailysRepository_lagacy.swift index beaed27f..e0ac4e00 100644 --- a/Project_Timer/Data/Repository/lagacy/DailysRepository.swift +++ b/Project_Timer/Data/Repository/lagacy/DailysRepository_lagacy.swift @@ -1,5 +1,5 @@ // -// DailysRepository.swift +// DailysRepository_lagacy.swift // Project_Timer // // Created by Kang Minsang on 2023/12/16. @@ -8,7 +8,7 @@ import Foundation -final class DailysRepository: DailysRepositoryInterface { +final class DailysRepository_lagacy: DailysRepositoryInterface { private let api = DailysNetwork() func upload(dailys: [Daily], completion: @escaping (Result) -> Void) { diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVC.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVC.swift index 0eeca955..693a787e 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVC.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVC.swift @@ -120,7 +120,7 @@ extension SyncDailysVC { extension SyncDailysVC { private func configureViewModel() { - let dailysUseCase = DailysUseCase(repository: DailysRepository()) + let dailysUseCase = DailysUseCase(repository: DailysRepository_lagacy()) let recordTimesUseCase = RecordTimesUseCase(repository: RecordTimesRepository()) let syncLogUseCase = SyncLogUseCase(repository: SyncLogRepository()) let targetDailys = self.syncDeviceStatusView.configureDailys() From 4dfe1af38ca5f825f4a912e05065ca105889eff6 Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sat, 29 Jun 2024 16:19:11 +0900 Subject: [PATCH 12/44] =?UTF-8?q?feat=20#144:=20RecordTimesRepository=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 12 ++++--- .../Repository/RecordTimesRepository.swift | 33 +++++++++++++++++++ ...ift => RecordTimesRepository_lagacy.swift} | 4 +-- .../TestServer/SyncDailys/SyncDailysVC.swift | 2 +- 4 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 Project_Timer/Data/Repository/RecordTimesRepository.swift rename Project_Timer/Data/Repository/lagacy/{RecordTimesRepository.swift => RecordTimesRepository_lagacy.swift} (91%) diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index 1645b4f5..eba7d94b 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -67,7 +67,7 @@ 870800752B2D3C9A00830B39 /* DailysUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800742B2D3C9A00830B39 /* DailysUseCase.swift */; }; 870800772B2D41EA00830B39 /* DailysUseCaseInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800762B2D41EA00830B39 /* DailysUseCaseInterface.swift */; }; 870800792B2D4DE500830B39 /* RecordTimesNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800782B2D4DE500830B39 /* RecordTimesNetwork.swift */; }; - 8708007B2B2D4F0800830B39 /* RecordTimesRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708007A2B2D4F0800830B39 /* RecordTimesRepository.swift */; }; + 8708007B2B2D4F0800830B39 /* RecordTimesRepository_lagacy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708007A2B2D4F0800830B39 /* RecordTimesRepository_lagacy.swift */; }; 8708007D2B2D503600830B39 /* RecordTimesRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708007C2B2D503600830B39 /* RecordTimesRepositoryInterface.swift */; }; 8708007F2B2D543500830B39 /* RecordTimesUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708007E2B2D543500830B39 /* RecordTimesUseCase.swift */; }; 870800812B2D54B500830B39 /* RecordTimesUseCaseInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800802B2D54B500830B39 /* RecordTimesUseCaseInterface.swift */; }; @@ -150,6 +150,7 @@ 874964F52649590700113E25 /* StopwatchVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 874964F42649590700113E25 /* StopwatchVC.swift */; }; 874B54282C158F890062D0AC /* CheckEmailExitRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 874B54272C158F890062D0AC /* CheckEmailExitRequest.swift */; }; 874B542C2C1592460062D0AC /* DailysRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 874B542B2C1592460062D0AC /* DailysRepository.swift */; }; + 874B542E2C1595A00062D0AC /* RecordTimesRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 874B542D2C1595A00062D0AC /* RecordTimesRepository.swift */; }; 874B9D1A25CAB233006FCD04 /* HGGGOTHICSSI_PRO_60G.otf in Resources */ = {isa = PBXBuildFile; fileRef = 874B9D1425CAB233006FCD04 /* HGGGOTHICSSI_PRO_60G.otf */; }; 874B9D1B25CAB233006FCD04 /* HGGGOTHICSSI_PRO_80G.otf in Resources */ = {isa = PBXBuildFile; fileRef = 874B9D1525CAB233006FCD04 /* HGGGOTHICSSI_PRO_80G.otf */; }; 874B9D1C25CAB233006FCD04 /* HGGGOTHICSSI_PRO_99G.otf in Resources */ = {isa = PBXBuildFile; fileRef = 874B9D1625CAB233006FCD04 /* HGGGOTHICSSI_PRO_99G.otf */; }; @@ -506,7 +507,7 @@ 870800742B2D3C9A00830B39 /* DailysUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailysUseCase.swift; sourceTree = ""; }; 870800762B2D41EA00830B39 /* DailysUseCaseInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailysUseCaseInterface.swift; sourceTree = ""; }; 870800782B2D4DE500830B39 /* RecordTimesNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesNetwork.swift; sourceTree = ""; }; - 8708007A2B2D4F0800830B39 /* RecordTimesRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesRepository.swift; sourceTree = ""; }; + 8708007A2B2D4F0800830B39 /* RecordTimesRepository_lagacy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesRepository_lagacy.swift; sourceTree = ""; }; 8708007C2B2D503600830B39 /* RecordTimesRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesRepositoryInterface.swift; sourceTree = ""; }; 8708007E2B2D543500830B39 /* RecordTimesUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesUseCase.swift; sourceTree = ""; }; 870800802B2D54B500830B39 /* RecordTimesUseCaseInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesUseCaseInterface.swift; sourceTree = ""; }; @@ -587,6 +588,7 @@ 874964F42649590700113E25 /* StopwatchVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StopwatchVC.swift; sourceTree = ""; }; 874B54272C158F890062D0AC /* CheckEmailExitRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckEmailExitRequest.swift; sourceTree = ""; }; 874B542B2C1592460062D0AC /* DailysRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailysRepository.swift; sourceTree = ""; }; + 874B542D2C1595A00062D0AC /* RecordTimesRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesRepository.swift; sourceTree = ""; }; 874B9D1425CAB233006FCD04 /* HGGGOTHICSSI_PRO_60G.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = HGGGOTHICSSI_PRO_60G.otf; sourceTree = ""; }; 874B9D1525CAB233006FCD04 /* HGGGOTHICSSI_PRO_80G.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = HGGGOTHICSSI_PRO_80G.otf; sourceTree = ""; }; 874B9D1625CAB233006FCD04 /* HGGGOTHICSSI_PRO_99G.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = HGGGOTHICSSI_PRO_99G.otf; sourceTree = ""; }; @@ -1613,7 +1615,7 @@ 870800532B2C3A5400830B39 /* ServerURLRepository.swift */, 870800602B2C5FDA00830B39 /* AuthRepository_lagacy.swift */, 8708006C2B2CA7AB00830B39 /* DailysRepository_lagacy.swift */, - 8708007A2B2D4F0800830B39 /* RecordTimesRepository.swift */, + 8708007A2B2D4F0800830B39 /* RecordTimesRepository_lagacy.swift */, 870800862B2D599800830B39 /* SyncLogRepository.swift */, 873731D22B2E931800D7BD9F /* NotificationRepository.swift */, ); @@ -1989,6 +1991,7 @@ 87B90B392BF4AEF600D6886E /* FirebaseRepository.swift */, 87FB6B8C2BFE0B3F00CD7A9C /* AuthRepository.swift */, 874B542B2C1592460062D0AC /* DailysRepository.swift */, + 874B542D2C1595A00062D0AC /* RecordTimesRepository.swift */, ); path = Repository; sourceTree = ""; @@ -2343,6 +2346,7 @@ 87B7A53C2AC02202002AFDFE /* SigninSelectRoute.swift in Sources */, 873731DD2B2E9AA900D7BD9F /* FirebaseStringArrayValue.swift in Sources */, 8760FB0C2A1DBB490068CEF5 /* Widget+Extentions.swift in Sources */, + 874B542E2C1595A00062D0AC /* RecordTimesRepository.swift in Sources */, 879BE32C2AC68EC7007AAC46 /* PortraitVC.swift in Sources */, 875FAE2F2B1C7067008F19D2 /* AppLatestVersionRepositoryInterface.swift in Sources */, 879053FF29558EF4008B9258 /* SyncUserStatusView.swift in Sources */, @@ -2542,7 +2546,7 @@ 870800582B2C3B0C00830B39 /* GetServerURLUseCase.swift in Sources */, 87D4DCD22BA5A4C400BB5AAB /* ResetPasswordEmailView.swift in Sources */, 878813E52A209BA0000ED2C1 /* HowToAddWidgetVC.swift in Sources */, - 8708007B2B2D4F0800830B39 /* RecordTimesRepository.swift in Sources */, + 8708007B2B2D4F0800830B39 /* RecordTimesRepository_lagacy.swift in Sources */, 8765234C28C7948700487BFB /* TotalTime.swift in Sources */, 87A7F5D4267270F800F69EBA /* Todo.swift in Sources */, 879D207F2A19D40400D8A420 /* Updateable.swift in Sources */, diff --git a/Project_Timer/Data/Repository/RecordTimesRepository.swift b/Project_Timer/Data/Repository/RecordTimesRepository.swift new file mode 100644 index 00000000..e4cd6c51 --- /dev/null +++ b/Project_Timer/Data/Repository/RecordTimesRepository.swift @@ -0,0 +1,33 @@ +// +// RecordTimesRepository.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/06/09. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Combine +import Moya +import CombineMoya + +final class RecordTimesRepository { + private let api: TTProvider + + init(api: TTProvider) { + self.api = api + } + + func upload(info: RecordTimes) -> AnyPublisher { + return self.api.request(.postRecordTime(info)) + .map { _ in true } + .catchDecodeError() + } + + func get() -> AnyPublisher { + return self.api.requestPublisher(.getRecordTime) + .map(RecordTimesDTO.self) + .map { $0.toDomain() } + .catchDecodeError() + } +} diff --git a/Project_Timer/Data/Repository/lagacy/RecordTimesRepository.swift b/Project_Timer/Data/Repository/lagacy/RecordTimesRepository_lagacy.swift similarity index 91% rename from Project_Timer/Data/Repository/lagacy/RecordTimesRepository.swift rename to Project_Timer/Data/Repository/lagacy/RecordTimesRepository_lagacy.swift index fc5dc0b7..9fc4dd95 100644 --- a/Project_Timer/Data/Repository/lagacy/RecordTimesRepository.swift +++ b/Project_Timer/Data/Repository/lagacy/RecordTimesRepository_lagacy.swift @@ -1,5 +1,5 @@ // -// RecordTimesRepository.swift +// RecordTimesRepository_lagacy.swift // Project_Timer // // Created by Kang Minsang on 2023/12/16. @@ -8,7 +8,7 @@ import Foundation -final class RecordTimesRepository: RecordTimesRepositoryInterface { +final class RecordTimesRepository_lagacy: RecordTimesRepositoryInterface { private let api = RecordTimesNetwork() func upload(recordTimes: RecordTimes, completion: @escaping (Result) -> Void) { diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVC.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVC.swift index 693a787e..a4d8cb21 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVC.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVC.swift @@ -121,7 +121,7 @@ extension SyncDailysVC { extension SyncDailysVC { private func configureViewModel() { let dailysUseCase = DailysUseCase(repository: DailysRepository_lagacy()) - let recordTimesUseCase = RecordTimesUseCase(repository: RecordTimesRepository()) + let recordTimesUseCase = RecordTimesUseCase(repository: RecordTimesRepository_lagacy()) let syncLogUseCase = SyncLogUseCase(repository: SyncLogRepository()) let targetDailys = self.syncDeviceStatusView.configureDailys() From 516c02de7664180f69187c6cb58321003413b9cb Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sat, 29 Jun 2024 16:32:31 +0900 Subject: [PATCH 13/44] =?UTF-8?q?feat=20#144:=20SyncLogRepository=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 36 ++++++++++--------- .../Data/Repository/DailysRepository.swift | 2 +- .../Repository/RecordTimesRepository.swift | 4 +-- .../Data/Repository/SyncLogRepository.swift | 27 ++++++++++++++ .../lagacy/DailysRepository_lagacy.swift | 2 +- .../lagacy/RecordTimesRepository_lagacy.swift | 2 +- ...y.swift => SyncLogRepository_lagacy.swift} | 6 ++-- .../DailyResponse.swift} | 4 +-- .../RecordTimesResponse.swift} | 4 +-- .../SyncLogResponse.swift} | 4 +-- .../TestServer/SyncDailys/SyncDailysVC.swift | 2 +- 11 files changed, 62 insertions(+), 31 deletions(-) create mode 100644 Project_Timer/Data/Repository/SyncLogRepository.swift rename Project_Timer/Data/Repository/lagacy/{SyncLogRepository.swift => SyncLogRepository_lagacy.swift} (85%) rename Project_Timer/Data/{DTO/DailyDTO.swift => Response/DailyResponse.swift} (95%) rename Project_Timer/Data/{DTO/RecordTimesDTO.swift => Response/RecordTimesResponse.swift} (94%) rename Project_Timer/Data/{DTO/SyncLogDTO.swift => Response/SyncLogResponse.swift} (84%) diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index eba7d94b..19145f1c 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -61,7 +61,7 @@ 870800692B2C68EF00830B39 /* AuthUseCaseInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800682B2C68EF00830B39 /* AuthUseCaseInterface.swift */; }; 8708006B2B2CA57C00830B39 /* DailysNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708006A2B2CA57C00830B39 /* DailysNetwork.swift */; }; 8708006D2B2CA7AB00830B39 /* DailysRepository_lagacy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708006C2B2CA7AB00830B39 /* DailysRepository_lagacy.swift */; }; - 8708006F2B2CA92C00830B39 /* DailyDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708006E2B2CA92C00830B39 /* DailyDTO.swift */; }; + 8708006F2B2CA92C00830B39 /* DailyResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708006E2B2CA92C00830B39 /* DailyResponse.swift */; }; 870800712B2CAD9900830B39 /* TaskHistory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800702B2CAD9900830B39 /* TaskHistory.swift */; }; 870800732B2CB11B00830B39 /* DailyRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800722B2CB11B00830B39 /* DailyRepositoryInterface.swift */; }; 870800752B2D3C9A00830B39 /* DailysUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800742B2D3C9A00830B39 /* DailysUseCase.swift */; }; @@ -71,10 +71,10 @@ 8708007D2B2D503600830B39 /* RecordTimesRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708007C2B2D503600830B39 /* RecordTimesRepositoryInterface.swift */; }; 8708007F2B2D543500830B39 /* RecordTimesUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708007E2B2D543500830B39 /* RecordTimesUseCase.swift */; }; 870800812B2D54B500830B39 /* RecordTimesUseCaseInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800802B2D54B500830B39 /* RecordTimesUseCaseInterface.swift */; }; - 870800832B2D551700830B39 /* RecordTimesDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800822B2D551700830B39 /* RecordTimesDTO.swift */; }; + 870800832B2D551700830B39 /* RecordTimesResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800822B2D551700830B39 /* RecordTimesResponse.swift */; }; 870800852B2D593400830B39 /* SyncLogNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800842B2D593400830B39 /* SyncLogNetwork.swift */; }; - 870800872B2D599800830B39 /* SyncLogRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800862B2D599800830B39 /* SyncLogRepository.swift */; }; - 870800892B2D59EB00830B39 /* SyncLogDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800882B2D59EB00830B39 /* SyncLogDTO.swift */; }; + 870800872B2D599800830B39 /* SyncLogRepository_lagacy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800862B2D599800830B39 /* SyncLogRepository_lagacy.swift */; }; + 870800892B2D59EB00830B39 /* SyncLogResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800882B2D59EB00830B39 /* SyncLogResponse.swift */; }; 8708008B2B2D5A4400830B39 /* SyncLogRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708008A2B2D5A4400830B39 /* SyncLogRepositoryInterface.swift */; }; 8708008D2B2D63D300830B39 /* SyncLogUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708008C2B2D63D300830B39 /* SyncLogUseCase.swift */; }; 8708008F2B2D646C00830B39 /* SyncLogUseCaseInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708008E2B2D646C00830B39 /* SyncLogUseCaseInterface.swift */; }; @@ -113,6 +113,7 @@ 8721C6D9296941F800410D57 /* UIScrollView+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8721C6D8296941F800410D57 /* UIScrollView+Extension.swift */; }; 8721C6DB296943C500410D57 /* ChangeNextGraphButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8721C6DA296943C500410D57 /* ChangeNextGraphButton.swift */; }; 8721C6DD296944EE00410D57 /* ChangePrevGraphButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8721C6DC296944EE00410D57 /* ChangePrevGraphButton.swift */; }; + 872210422C2FEE83003B97AD /* SyncLogRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872210412C2FEE83003B97AD /* SyncLogRepository.swift */; }; 872C0EDB284ADD8300E8E3F2 /* SettingUpdateHistoryVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872C0EDA284ADD8300E8E3F2 /* SettingUpdateHistoryVC.swift */; }; 872C0EDE284AE52800E8E3F2 /* SettingFunctionsListVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872C0EDD284AE52800E8E3F2 /* SettingFunctionsListVC.swift */; }; 872C0EE1284AE57200E8E3F2 /* SettingTiTiLabVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872C0EE0284AE57200E8E3F2 /* SettingTiTiLabVC.swift */; }; @@ -501,7 +502,7 @@ 870800682B2C68EF00830B39 /* AuthUseCaseInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthUseCaseInterface.swift; sourceTree = ""; }; 8708006A2B2CA57C00830B39 /* DailysNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailysNetwork.swift; sourceTree = ""; }; 8708006C2B2CA7AB00830B39 /* DailysRepository_lagacy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailysRepository_lagacy.swift; sourceTree = ""; }; - 8708006E2B2CA92C00830B39 /* DailyDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailyDTO.swift; sourceTree = ""; }; + 8708006E2B2CA92C00830B39 /* DailyResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailyResponse.swift; sourceTree = ""; }; 870800702B2CAD9900830B39 /* TaskHistory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskHistory.swift; sourceTree = ""; }; 870800722B2CB11B00830B39 /* DailyRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailyRepositoryInterface.swift; sourceTree = ""; }; 870800742B2D3C9A00830B39 /* DailysUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailysUseCase.swift; sourceTree = ""; }; @@ -511,10 +512,10 @@ 8708007C2B2D503600830B39 /* RecordTimesRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesRepositoryInterface.swift; sourceTree = ""; }; 8708007E2B2D543500830B39 /* RecordTimesUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesUseCase.swift; sourceTree = ""; }; 870800802B2D54B500830B39 /* RecordTimesUseCaseInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesUseCaseInterface.swift; sourceTree = ""; }; - 870800822B2D551700830B39 /* RecordTimesDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesDTO.swift; sourceTree = ""; }; + 870800822B2D551700830B39 /* RecordTimesResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesResponse.swift; sourceTree = ""; }; 870800842B2D593400830B39 /* SyncLogNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncLogNetwork.swift; sourceTree = ""; }; - 870800862B2D599800830B39 /* SyncLogRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncLogRepository.swift; sourceTree = ""; }; - 870800882B2D59EB00830B39 /* SyncLogDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncLogDTO.swift; sourceTree = ""; }; + 870800862B2D599800830B39 /* SyncLogRepository_lagacy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncLogRepository_lagacy.swift; sourceTree = ""; }; + 870800882B2D59EB00830B39 /* SyncLogResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncLogResponse.swift; sourceTree = ""; }; 8708008A2B2D5A4400830B39 /* SyncLogRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncLogRepositoryInterface.swift; sourceTree = ""; }; 8708008C2B2D63D300830B39 /* SyncLogUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncLogUseCase.swift; sourceTree = ""; }; 8708008E2B2D646C00830B39 /* SyncLogUseCaseInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncLogUseCaseInterface.swift; sourceTree = ""; }; @@ -550,6 +551,7 @@ 8721C6D8296941F800410D57 /* UIScrollView+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIScrollView+Extension.swift"; sourceTree = ""; }; 8721C6DA296943C500410D57 /* ChangeNextGraphButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeNextGraphButton.swift; sourceTree = ""; }; 8721C6DC296944EE00410D57 /* ChangePrevGraphButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangePrevGraphButton.swift; sourceTree = ""; }; + 872210412C2FEE83003B97AD /* SyncLogRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncLogRepository.swift; sourceTree = ""; }; 872B7552296A625B00D24394 /* production.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = production.xcconfig; sourceTree = ""; }; 872C0EDA284ADD8300E8E3F2 /* SettingUpdateHistoryVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingUpdateHistoryVC.swift; sourceTree = ""; }; 872C0EDD284AE52800E8E3F2 /* SettingFunctionsListVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingFunctionsListVC.swift; sourceTree = ""; }; @@ -1161,14 +1163,11 @@ 875FAE222B1C653A008F19D2 /* DTO */ = { isa = PBXGroup; children = ( - 8708006E2B2CA92C00830B39 /* DailyDTO.swift */, 87F10938284C589A002E31EA /* FunctionInfo.swift */, 877D69FB2871C1CB00215B6D /* SurveyInfo.swift */, 872C0EE5284AF31000E8E3F2 /* UpdateInfo.swift */, 875C98C62871BB26008F7ADD /* YoutubeLinkInfo.swift */, 87476DAC28A2794B00FAD273 /* LastestVersionInfo.swift */, - 870800822B2D551700830B39 /* RecordTimesDTO.swift */, - 870800882B2D59EB00830B39 /* SyncLogDTO.swift */, 873731D42B2E938400D7BD9F /* NotificationDTO.swift */, ); path = DTO; @@ -1616,7 +1615,7 @@ 870800602B2C5FDA00830B39 /* AuthRepository_lagacy.swift */, 8708006C2B2CA7AB00830B39 /* DailysRepository_lagacy.swift */, 8708007A2B2D4F0800830B39 /* RecordTimesRepository_lagacy.swift */, - 870800862B2D599800830B39 /* SyncLogRepository.swift */, + 870800862B2D599800830B39 /* SyncLogRepository_lagacy.swift */, 873731D22B2E931800D7BD9F /* NotificationRepository.swift */, ); path = lagacy; @@ -1741,6 +1740,9 @@ 87B90B3B2BF4B13D00D6886E /* AppVersionResponse.swift */, 870800512B2C3A0800830B39 /* ServerURLResponse.swift */, 8708005E2B2C5F5F00830B39 /* AuthResponse.swift */, + 8708006E2B2CA92C00830B39 /* DailyResponse.swift */, + 870800822B2D551700830B39 /* RecordTimesResponse.swift */, + 870800882B2D59EB00830B39 /* SyncLogResponse.swift */, ); path = Response; sourceTree = ""; @@ -1992,6 +1994,7 @@ 87FB6B8C2BFE0B3F00CD7A9C /* AuthRepository.swift */, 874B542B2C1592460062D0AC /* DailysRepository.swift */, 874B542D2C1595A00062D0AC /* RecordTimesRepository.swift */, + 872210412C2FEE83003B97AD /* SyncLogRepository.swift */, ); path = Repository; sourceTree = ""; @@ -2377,7 +2380,7 @@ 878DA1F62AEE617900C60CBF /* SignupInfo.swift in Sources */, 879BE3202AC402A8007AAC46 /* SignupSigninVC.swift in Sources */, 048D8AD328AAC5CF00A2456D /* TaskCreateInteractionView.swift in Sources */, - 870800832B2D551700830B39 /* RecordTimesDTO.swift in Sources */, + 870800832B2D551700830B39 /* RecordTimesResponse.swift in Sources */, 8757AA3B290511AB00D97517 /* TaskSelectVM.swift in Sources */, 87FD9FA72998D0BD00D9B0FF /* TimerStopwatchAttributes.swift in Sources */, 04573A9B2877FDDA008F8D44 /* CountdownTimeLabelVM.swift in Sources */, @@ -2422,7 +2425,7 @@ 87A8CD272AF0C4B600D4C1D7 /* OverlayShowButtonForSecureFieldView.swift in Sources */, 870800502B2C38F900830B39 /* ServerURLNetwork.swift in Sources */, 870E85012AD67E46000511BD /* KeyboardResponder.swift in Sources */, - 870800872B2D599800830B39 /* SyncLogRepository.swift in Sources */, + 870800872B2D599800830B39 /* SyncLogRepository_lagacy.swift in Sources */, 87A48BCB27DF112B00F46D0F /* LogHomeVM.swift in Sources */, 87D7ED172952B69200121DE6 /* TestUserSigninRequest.swift in Sources */, 87D4DCC02BA5253600BB5AAB /* ResetPasswordEnvironment.swift in Sources */, @@ -2445,7 +2448,7 @@ 878899852894F09600B7F378 /* WeekTimelineView.swift in Sources */, 87D83E8C2B29703A003C40AE /* SettingLanguageVM.swift in Sources */, 87F1093B284C589A002E31EA /* SettingFunctionsListVM.swift in Sources */, - 8708006F2B2CA92C00830B39 /* DailyDTO.swift in Sources */, + 8708006F2B2CA92C00830B39 /* DailyResponse.swift in Sources */, 8788997C2894F00000B7F378 /* LogWeekVM.swift in Sources */, 8761BDCA2BCFEA7A00E9281A /* AuthAPI.swift in Sources */, 87EFD6812AC115DB00C422B1 /* SigninSignupVC.swift in Sources */, @@ -2543,6 +2546,7 @@ 049BBA9C28AB58D4005BAB1B /* InteractionLeftTitleLabel.swift in Sources */, 871AB69D2967C9D100AFED1C /* TimeTableVM.swift in Sources */, 8708006B2B2CA57C00830B39 /* DailysNetwork.swift in Sources */, + 872210422C2FEE83003B97AD /* SyncLogRepository.swift in Sources */, 870800582B2C3B0C00830B39 /* GetServerURLUseCase.swift in Sources */, 87D4DCD22BA5A4C400BB5AAB /* ResetPasswordEmailView.swift in Sources */, 878813E52A209BA0000ED2C1 /* HowToAddWidgetVC.swift in Sources */, @@ -2580,7 +2584,7 @@ 87D4DCBE2BA51EEA00BB5AAB /* ResetPasswordVC.swift in Sources */, 879E849F29C8400700D65F48 /* TimeLabelData.swift in Sources */, 04FA75D3286EE4D900BAE2B2 /* Color+Extension.swift in Sources */, - 870800892B2D59EB00830B39 /* SyncLogDTO.swift in Sources */, + 870800892B2D59EB00830B39 /* SyncLogResponse.swift in Sources */, 8760FCBB29553F06000BCCD1 /* SyncDailysVC.swift in Sources */, 873977EB288D3FAA0025EE73 /* LogDailyVM.swift in Sources */, 87D3CF05288BAA1300ED33B7 /* ProgressDailyTaskCell.swift in Sources */, diff --git a/Project_Timer/Data/Repository/DailysRepository.swift b/Project_Timer/Data/Repository/DailysRepository.swift index 167f0922..2598cafc 100644 --- a/Project_Timer/Data/Repository/DailysRepository.swift +++ b/Project_Timer/Data/Repository/DailysRepository.swift @@ -27,7 +27,7 @@ final class DailysRepository { func getDailys() -> AnyPublisher<[Daily], NetworkError> { return self.api.request(.getDailys) .tryMap { response in - guard let dtos = try? JSONDecoder.dateFormatted.decode([DailyDTO].self, from: response.data) else { + guard let dtos = try? JSONDecoder.dateFormatted.decode([DailyResponse].self, from: response.data) else { throw NetworkError.DECODEERROR } return dtos.map { $0.toDomain() } diff --git a/Project_Timer/Data/Repository/RecordTimesRepository.swift b/Project_Timer/Data/Repository/RecordTimesRepository.swift index e4cd6c51..029f5de7 100644 --- a/Project_Timer/Data/Repository/RecordTimesRepository.swift +++ b/Project_Timer/Data/Repository/RecordTimesRepository.swift @@ -7,8 +7,8 @@ // import Foundation -import Combine import Moya +import Combine import CombineMoya final class RecordTimesRepository { @@ -26,7 +26,7 @@ final class RecordTimesRepository { func get() -> AnyPublisher { return self.api.requestPublisher(.getRecordTime) - .map(RecordTimesDTO.self) + .map(RecordTimesResponse.self) .map { $0.toDomain() } .catchDecodeError() } diff --git a/Project_Timer/Data/Repository/SyncLogRepository.swift b/Project_Timer/Data/Repository/SyncLogRepository.swift new file mode 100644 index 00000000..1674c0c8 --- /dev/null +++ b/Project_Timer/Data/Repository/SyncLogRepository.swift @@ -0,0 +1,27 @@ +// +// SyncLogRepository.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/06/29. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Moya +import Combine +import CombineMoya + +final class SyncLogRepository { + private let api: TTProvider + + init(api: TTProvider) { + self.api = api + } + + func get() -> AnyPublisher { + return self.api.requestPublisher(.getSyncLog) + .map(SyncLogResponse.self) + .map { $0.toDomain() } + .catchDecodeError() + } +} diff --git a/Project_Timer/Data/Repository/lagacy/DailysRepository_lagacy.swift b/Project_Timer/Data/Repository/lagacy/DailysRepository_lagacy.swift index e0ac4e00..e05db47a 100644 --- a/Project_Timer/Data/Repository/lagacy/DailysRepository_lagacy.swift +++ b/Project_Timer/Data/Repository/lagacy/DailysRepository_lagacy.swift @@ -27,7 +27,7 @@ final class DailysRepository_lagacy: DailysRepositoryInterface { switch result.status { case .SUCCESS: guard let data = result.data, - let dtos = try? JSONDecoder.dateFormatted.decode([DailyDTO].self, from: data) else { + let dtos = try? JSONDecoder.dateFormatted.decode([DailyResponse].self, from: data) else { completion(.failure(.DECODEERROR)) return } diff --git a/Project_Timer/Data/Repository/lagacy/RecordTimesRepository_lagacy.swift b/Project_Timer/Data/Repository/lagacy/RecordTimesRepository_lagacy.swift index 9fc4dd95..cb65462a 100644 --- a/Project_Timer/Data/Repository/lagacy/RecordTimesRepository_lagacy.swift +++ b/Project_Timer/Data/Repository/lagacy/RecordTimesRepository_lagacy.swift @@ -27,7 +27,7 @@ final class RecordTimesRepository_lagacy: RecordTimesRepositoryInterface { switch result.status { case .SUCCESS: guard let data = result.data, - let dto = try? JSONDecoder.dateFormatted.decode(RecordTimesDTO.self, from: data) else { + let dto = try? JSONDecoder.dateFormatted.decode(RecordTimesResponse.self, from: data) else { completion(.failure(.DECODEERROR)) return } diff --git a/Project_Timer/Data/Repository/lagacy/SyncLogRepository.swift b/Project_Timer/Data/Repository/lagacy/SyncLogRepository_lagacy.swift similarity index 85% rename from Project_Timer/Data/Repository/lagacy/SyncLogRepository.swift rename to Project_Timer/Data/Repository/lagacy/SyncLogRepository_lagacy.swift index 10ec8a70..6708730f 100644 --- a/Project_Timer/Data/Repository/lagacy/SyncLogRepository.swift +++ b/Project_Timer/Data/Repository/lagacy/SyncLogRepository_lagacy.swift @@ -1,5 +1,5 @@ // -// SyncLogRepository.swift +// SyncLogRepository_lagacy.swift // Project_Timer // // Created by Kang Minsang on 2023/12/16. @@ -8,7 +8,7 @@ import Foundation -final class SyncLogRepository: SyncLogRepositoryInterface { +final class SyncLogRepository_lagacy: SyncLogRepositoryInterface { private let api = SyncLogNetwork() func get(completion: @escaping (Result) -> Void) { @@ -16,7 +16,7 @@ final class SyncLogRepository: SyncLogRepositoryInterface { switch result.status { case .SUCCESS: if let data = result.data { - guard let dto = try? JSONDecoder.dateFormatted.decode(SyncLogDTO.self, from: data) else { + guard let dto = try? JSONDecoder.dateFormatted.decode(SyncLogResponse.self, from: data) else { completion(.failure(.DECODEERROR)) return } diff --git a/Project_Timer/Data/DTO/DailyDTO.swift b/Project_Timer/Data/Response/DailyResponse.swift similarity index 95% rename from Project_Timer/Data/DTO/DailyDTO.swift rename to Project_Timer/Data/Response/DailyResponse.swift index ab6d825e..d15c1c61 100644 --- a/Project_Timer/Data/DTO/DailyDTO.swift +++ b/Project_Timer/Data/Response/DailyResponse.swift @@ -8,7 +8,7 @@ import Foundation -struct DailyDTO: Decodable { +struct DailyResponse: Decodable { var id: Int? var status: String? var day: Date @@ -23,7 +23,7 @@ struct TaskHistoryDTO: Decodable { var endDate: Date } -extension DailyDTO { +extension DailyResponse { func toDomain() -> Daily { return .init( id: self.id, diff --git a/Project_Timer/Data/DTO/RecordTimesDTO.swift b/Project_Timer/Data/Response/RecordTimesResponse.swift similarity index 94% rename from Project_Timer/Data/DTO/RecordTimesDTO.swift rename to Project_Timer/Data/Response/RecordTimesResponse.swift index b4046d14..63bcaf80 100644 --- a/Project_Timer/Data/DTO/RecordTimesDTO.swift +++ b/Project_Timer/Data/Response/RecordTimesResponse.swift @@ -8,7 +8,7 @@ import Foundation -struct RecordTimesDTO: Decodable { +struct RecordTimesResponse: Decodable { var recordingMode: Int var recording: Bool var recordStartAt: Date @@ -24,7 +24,7 @@ struct RecordTimesDTO: Decodable { var recordStartTimeline: [Int] } -extension RecordTimesDTO { +extension RecordTimesResponse { func toDomain() -> RecordTimes { return .init( recordTask: self.recordTask, diff --git a/Project_Timer/Data/DTO/SyncLogDTO.swift b/Project_Timer/Data/Response/SyncLogResponse.swift similarity index 84% rename from Project_Timer/Data/DTO/SyncLogDTO.swift rename to Project_Timer/Data/Response/SyncLogResponse.swift index e01f2c0d..7545006c 100644 --- a/Project_Timer/Data/DTO/SyncLogDTO.swift +++ b/Project_Timer/Data/Response/SyncLogResponse.swift @@ -8,12 +8,12 @@ import Foundation -struct SyncLogDTO: Decodable { +struct SyncLogResponse: Decodable { let updatedAt: Date let dailysCount: Int } -extension SyncLogDTO { +extension SyncLogResponse { func toDomain() -> SyncLog { return .init( updatedAt: self.updatedAt, diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVC.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVC.swift index a4d8cb21..84557a93 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVC.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVC.swift @@ -122,7 +122,7 @@ extension SyncDailysVC { private func configureViewModel() { let dailysUseCase = DailysUseCase(repository: DailysRepository_lagacy()) let recordTimesUseCase = RecordTimesUseCase(repository: RecordTimesRepository_lagacy()) - let syncLogUseCase = SyncLogUseCase(repository: SyncLogRepository()) + let syncLogUseCase = SyncLogUseCase(repository: SyncLogRepository_lagacy()) let targetDailys = self.syncDeviceStatusView.configureDailys() self.viewModel = SyncDailysVM( From 115b640fdef188eba8e80792cd8625170837b72b Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sat, 29 Jun 2024 16:41:41 +0900 Subject: [PATCH 14/44] =?UTF-8?q?feat=20#144:=20NotificationRepository=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 12 ++++++--- Project_Timer/AppDelegate.swift | 2 +- .../Repository/NotificationRepository.swift | 27 +++++++++++++++++++ ...ft => NotificationRepository_lagacy.swift} | 2 +- 4 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 Project_Timer/Data/Repository/NotificationRepository.swift rename Project_Timer/Data/Repository/lagacy/{NotificationRepository.swift => NotificationRepository_lagacy.swift} (94%) diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index 19145f1c..1f8f8141 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -114,6 +114,7 @@ 8721C6DB296943C500410D57 /* ChangeNextGraphButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8721C6DA296943C500410D57 /* ChangeNextGraphButton.swift */; }; 8721C6DD296944EE00410D57 /* ChangePrevGraphButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8721C6DC296944EE00410D57 /* ChangePrevGraphButton.swift */; }; 872210422C2FEE83003B97AD /* SyncLogRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872210412C2FEE83003B97AD /* SyncLogRepository.swift */; }; + 872210442C2FF10B003B97AD /* NotificationRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872210432C2FF10B003B97AD /* NotificationRepository.swift */; }; 872C0EDB284ADD8300E8E3F2 /* SettingUpdateHistoryVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872C0EDA284ADD8300E8E3F2 /* SettingUpdateHistoryVC.swift */; }; 872C0EDE284AE52800E8E3F2 /* SettingFunctionsListVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872C0EDD284AE52800E8E3F2 /* SettingFunctionsListVC.swift */; }; 872C0EE1284AE57200E8E3F2 /* SettingTiTiLabVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872C0EE0284AE57200E8E3F2 /* SettingTiTiLabVC.swift */; }; @@ -132,7 +133,7 @@ 87306D792B26CC7B001B7C14 /* MiSans-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 87306D692B26CC7A001B7C14 /* MiSans-Bold.ttf */; }; 87306D872B26D00A001B7C14 /* Fonts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04FA75D7286F2AB900BAE2B2 /* Fonts.swift */; }; 873731D12B2E92BD00D7BD9F /* NotificationNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D02B2E92BD00D7BD9F /* NotificationNetwork.swift */; }; - 873731D32B2E931800D7BD9F /* NotificationRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D22B2E931800D7BD9F /* NotificationRepository.swift */; }; + 873731D32B2E931800D7BD9F /* NotificationRepository_lagacy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D22B2E931800D7BD9F /* NotificationRepository_lagacy.swift */; }; 873731D52B2E938400D7BD9F /* NotificationDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D42B2E938400D7BD9F /* NotificationDTO.swift */; }; 873731D72B2E97C100D7BD9F /* NotificationRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D62B2E97C100D7BD9F /* NotificationRepositoryInterface.swift */; }; 873731D92B2E97FE00D7BD9F /* GetNotificationUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D82B2E97FE00D7BD9F /* GetNotificationUseCase.swift */; }; @@ -552,6 +553,7 @@ 8721C6DA296943C500410D57 /* ChangeNextGraphButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeNextGraphButton.swift; sourceTree = ""; }; 8721C6DC296944EE00410D57 /* ChangePrevGraphButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangePrevGraphButton.swift; sourceTree = ""; }; 872210412C2FEE83003B97AD /* SyncLogRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncLogRepository.swift; sourceTree = ""; }; + 872210432C2FF10B003B97AD /* NotificationRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationRepository.swift; sourceTree = ""; }; 872B7552296A625B00D24394 /* production.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = production.xcconfig; sourceTree = ""; }; 872C0EDA284ADD8300E8E3F2 /* SettingUpdateHistoryVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingUpdateHistoryVC.swift; sourceTree = ""; }; 872C0EDD284AE52800E8E3F2 /* SettingFunctionsListVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingFunctionsListVC.swift; sourceTree = ""; }; @@ -571,7 +573,7 @@ 873648A22B0D8CE10053B080 /* Project_TimerDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Project_TimerDebug.entitlements; sourceTree = ""; }; 873648A32B0D8DDF0053B080 /* Project_TimerDevelop.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Project_TimerDevelop.entitlements; sourceTree = ""; }; 873731D02B2E92BD00D7BD9F /* NotificationNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationNetwork.swift; sourceTree = ""; }; - 873731D22B2E931800D7BD9F /* NotificationRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationRepository.swift; sourceTree = ""; }; + 873731D22B2E931800D7BD9F /* NotificationRepository_lagacy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationRepository_lagacy.swift; sourceTree = ""; }; 873731D42B2E938400D7BD9F /* NotificationDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationDTO.swift; sourceTree = ""; }; 873731D62B2E97C100D7BD9F /* NotificationRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationRepositoryInterface.swift; sourceTree = ""; }; 873731D82B2E97FE00D7BD9F /* GetNotificationUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetNotificationUseCase.swift; sourceTree = ""; }; @@ -1616,7 +1618,7 @@ 8708006C2B2CA7AB00830B39 /* DailysRepository_lagacy.swift */, 8708007A2B2D4F0800830B39 /* RecordTimesRepository_lagacy.swift */, 870800862B2D599800830B39 /* SyncLogRepository_lagacy.swift */, - 873731D22B2E931800D7BD9F /* NotificationRepository.swift */, + 873731D22B2E931800D7BD9F /* NotificationRepository_lagacy.swift */, ); path = lagacy; sourceTree = ""; @@ -1995,6 +1997,7 @@ 874B542B2C1592460062D0AC /* DailysRepository.swift */, 874B542D2C1595A00062D0AC /* RecordTimesRepository.swift */, 872210412C2FEE83003B97AD /* SyncLogRepository.swift */, + 872210432C2FF10B003B97AD /* NotificationRepository.swift */, ); path = Repository; sourceTree = ""; @@ -2585,6 +2588,7 @@ 879E849F29C8400700D65F48 /* TimeLabelData.swift in Sources */, 04FA75D3286EE4D900BAE2B2 /* Color+Extension.swift in Sources */, 870800892B2D59EB00830B39 /* SyncLogResponse.swift in Sources */, + 872210442C2FF10B003B97AD /* NotificationRepository.swift in Sources */, 8760FCBB29553F06000BCCD1 /* SyncDailysVC.swift in Sources */, 873977EB288D3FAA0025EE73 /* LogDailyVM.swift in Sources */, 87D3CF05288BAA1300ED33B7 /* ProgressDailyTaskCell.swift in Sources */, @@ -2599,7 +2603,7 @@ 870C70712AD4ECB700024CAC /* SigninRoute.swift in Sources */, 879A2BA6284741A500B69DA7 /* SettingHeaderView.swift in Sources */, 8721C6DB296943C500410D57 /* ChangeNextGraphButton.swift in Sources */, - 873731D32B2E931800D7BD9F /* NotificationRepository.swift in Sources */, + 873731D32B2E931800D7BD9F /* NotificationRepository_lagacy.swift in Sources */, 877D69FC2871C1CB00215B6D /* SurveyInfo.swift in Sources */, 874F9C2F2ABFF7CF00675A86 /* GoogleSigninButton.swift in Sources */, 87199F552883EB160017D01A /* TimelineView.swift in Sources */, diff --git a/Project_Timer/AppDelegate.swift b/Project_Timer/AppDelegate.swift index 498dcad9..c83613b8 100644 --- a/Project_Timer/AppDelegate.swift +++ b/Project_Timer/AppDelegate.swift @@ -225,7 +225,7 @@ extension AppDelegate { } private func checkNotification() { - let getNotficationUseCase = GetNotificationUseCase(repository: NotificationRepository()) + let getNotficationUseCase = GetNotificationUseCase(repository: NotificationRepository_lagacy()) let notificationUseCase = NotificationUseCase() getNotficationUseCase.getNoti { result in diff --git a/Project_Timer/Data/Repository/NotificationRepository.swift b/Project_Timer/Data/Repository/NotificationRepository.swift new file mode 100644 index 00000000..bb6628ac --- /dev/null +++ b/Project_Timer/Data/Repository/NotificationRepository.swift @@ -0,0 +1,27 @@ +// +// NotificationRepository.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/06/29. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Moya +import Combine +import CombineMoya + +final class NotificationRepository { + private let api: MoyaProvider + + init(api: MoyaProvider) { + self.api = api + } + + func get() -> AnyPublisher { + return self.api.requestPublisher(.getNotification) + .map(NotificationDTO.self) + .map { $0.toDomain() } + .catchDecodeError() + } +} diff --git a/Project_Timer/Data/Repository/lagacy/NotificationRepository.swift b/Project_Timer/Data/Repository/lagacy/NotificationRepository_lagacy.swift similarity index 94% rename from Project_Timer/Data/Repository/lagacy/NotificationRepository.swift rename to Project_Timer/Data/Repository/lagacy/NotificationRepository_lagacy.swift index 91675762..7e54008f 100644 --- a/Project_Timer/Data/Repository/lagacy/NotificationRepository.swift +++ b/Project_Timer/Data/Repository/lagacy/NotificationRepository_lagacy.swift @@ -8,7 +8,7 @@ import Foundation -final class NotificationRepository: NotificationRepositoryInterface { +final class NotificationRepository_lagacy: NotificationRepositoryInterface { private let api = NotificationNetwork() func get(completion: @escaping (Result) -> Void) { From 82539ac4d6c21c03618320cdf6264fc0c2ea2706 Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sat, 29 Jun 2024 16:53:00 +0900 Subject: [PATCH 15/44] =?UTF-8?q?feat=20#144:=20NetworkController=20?= =?UTF-8?q?=EB=82=B4=20func=EB=93=A4=20FirebaseAPI=20=EB=82=B4=20=EB=B0=98?= =?UTF-8?q?=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 10 ++++---- Project_Timer/Data/API/FirebaseAPI.swift | 23 ++++++++++++++++++- .../Data/Network/NetworkController.swift | 8 +++---- .../Data/Network/NetworkProtocols.swift | 8 +++---- .../Repository/NotificationRepository.swift | 2 +- .../NotificationRepository_lagacy.swift | 2 +- .../NotificationResponse.swift} | 4 ++-- .../Entity}/LastestVersionInfo.swift | 0 .../SettingFunctionsListVM.swift | 4 ++-- .../SettingTiTiLab/SettingTiTiLabVM.swift | 2 +- .../SettingUpdateHistoryVM.swift | 2 +- 11 files changed, 43 insertions(+), 22 deletions(-) rename Project_Timer/Data/{DTO/NotificationDTO.swift => Response/NotificationResponse.swift} (95%) rename Project_Timer/{Data/DTO => Domain/Entity}/LastestVersionInfo.swift (100%) diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index 1f8f8141..15f38983 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -134,7 +134,7 @@ 87306D872B26D00A001B7C14 /* Fonts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04FA75D7286F2AB900BAE2B2 /* Fonts.swift */; }; 873731D12B2E92BD00D7BD9F /* NotificationNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D02B2E92BD00D7BD9F /* NotificationNetwork.swift */; }; 873731D32B2E931800D7BD9F /* NotificationRepository_lagacy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D22B2E931800D7BD9F /* NotificationRepository_lagacy.swift */; }; - 873731D52B2E938400D7BD9F /* NotificationDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D42B2E938400D7BD9F /* NotificationDTO.swift */; }; + 873731D52B2E938400D7BD9F /* NotificationResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D42B2E938400D7BD9F /* NotificationResponse.swift */; }; 873731D72B2E97C100D7BD9F /* NotificationRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D62B2E97C100D7BD9F /* NotificationRepositoryInterface.swift */; }; 873731D92B2E97FE00D7BD9F /* GetNotificationUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D82B2E97FE00D7BD9F /* GetNotificationUseCase.swift */; }; 873731DB2B2E983500D7BD9F /* GetNotificationUseCaseInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731DA2B2E983500D7BD9F /* GetNotificationUseCaseInterface.swift */; }; @@ -574,7 +574,7 @@ 873648A32B0D8DDF0053B080 /* Project_TimerDevelop.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Project_TimerDevelop.entitlements; sourceTree = ""; }; 873731D02B2E92BD00D7BD9F /* NotificationNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationNetwork.swift; sourceTree = ""; }; 873731D22B2E931800D7BD9F /* NotificationRepository_lagacy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationRepository_lagacy.swift; sourceTree = ""; }; - 873731D42B2E938400D7BD9F /* NotificationDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationDTO.swift; sourceTree = ""; }; + 873731D42B2E938400D7BD9F /* NotificationResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationResponse.swift; sourceTree = ""; }; 873731D62B2E97C100D7BD9F /* NotificationRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationRepositoryInterface.swift; sourceTree = ""; }; 873731D82B2E97FE00D7BD9F /* GetNotificationUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetNotificationUseCase.swift; sourceTree = ""; }; 873731DA2B2E983500D7BD9F /* GetNotificationUseCaseInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetNotificationUseCaseInterface.swift; sourceTree = ""; }; @@ -1169,8 +1169,6 @@ 877D69FB2871C1CB00215B6D /* SurveyInfo.swift */, 872C0EE5284AF31000E8E3F2 /* UpdateInfo.swift */, 875C98C62871BB26008F7ADD /* YoutubeLinkInfo.swift */, - 87476DAC28A2794B00FAD273 /* LastestVersionInfo.swift */, - 873731D42B2E938400D7BD9F /* NotificationDTO.swift */, ); path = DTO; sourceTree = ""; @@ -1203,6 +1201,7 @@ 87862E832B2D989A004ED313 /* NotificationInfo.swift */, 87D4DCC62BA52F3800BB5AAB /* ResetPasswordInfo.swift */, 87D4DCE32BA6A18C00BB5AAB /* ChangeCompleteInfo.swift */, + 87476DAC28A2794B00FAD273 /* LastestVersionInfo.swift */, ); path = Entity; sourceTree = ""; @@ -1745,6 +1744,7 @@ 8708006E2B2CA92C00830B39 /* DailyResponse.swift */, 870800822B2D551700830B39 /* RecordTimesResponse.swift */, 870800882B2D59EB00830B39 /* SyncLogResponse.swift */, + 873731D42B2E938400D7BD9F /* NotificationResponse.swift */, ); path = Response; sourceTree = ""; @@ -2322,7 +2322,7 @@ 87D4DCD62BA5A7B100BB5AAB /* ResetPasswordEmailRoute.swift in Sources */, 049BBA9828AB3D94005BAB1B /* ModifyFinishButton.swift in Sources */, 873731D12B2E92BD00D7BD9F /* NotificationNetwork.swift in Sources */, - 873731D52B2E938400D7BD9F /* NotificationDTO.swift in Sources */, + 873731D52B2E938400D7BD9F /* NotificationResponse.swift in Sources */, 8708006D2B2CA7AB00830B39 /* DailysRepository_lagacy.swift in Sources */, 874B54282C158F890062D0AC /* CheckEmailExitRequest.swift in Sources */, 8758E4F528C7124900A99484 /* MonthSmallView.swift in Sources */, diff --git a/Project_Timer/Data/API/FirebaseAPI.swift b/Project_Timer/Data/API/FirebaseAPI.swift index d16ee965..e249acb4 100644 --- a/Project_Timer/Data/API/FirebaseAPI.swift +++ b/Project_Timer/Data/API/FirebaseAPI.swift @@ -13,6 +13,10 @@ enum FirebaseAPI { case getAppVersion case getServerURL case getNotification + case getTiTiFunctions + case getUpdateHistorys + case getYoutubeLink + case getSurveys } extension FirebaseAPI: TargetType { @@ -36,12 +40,29 @@ extension FirebaseAPI: TargetType { case .en: return "/notification/en" case .zh: return "/notification/zh" } + case .getTiTiFunctions: + switch Language.current { + case .ko: return "/titifuncs" + case .en, .zh: return "/titifuncs_eng" + } + case .getUpdateHistorys: + switch Language.current { + case .ko: return "/updates?pageSize=100" + case .en, .zh: return "/updates_eng?pageSize=100" + } + case .getYoutubeLink: + return "/youtube" + case .getSurveys: + switch Language.current { + case .ko: return "/surveys" + case .en, .zh: return "/surveys_eng" + } } } var method: Moya.Method { switch self { - case .getAppVersion, .getServerURL, .getNotification: + case .getAppVersion, .getServerURL, .getNotification, .getTiTiFunctions, .getUpdateHistorys, .getYoutubeLink, .getSurveys: return .get } } diff --git a/Project_Timer/Data/Network/NetworkController.swift b/Project_Timer/Data/Network/NetworkController.swift index 7c5593a0..9321debc 100644 --- a/Project_Timer/Data/Network/NetworkController.swift +++ b/Project_Timer/Data/Network/NetworkController.swift @@ -16,7 +16,7 @@ final class NetworkController { } extension NetworkController: TiTiFunctionsFetchable { - func getTiTiFunctions(completion: @escaping (Result<[FunctionInfo], NetworkError>) -> Void) { + func getTiTiFunctions_lagacy(completion: @escaping (Result<[FunctionInfo], NetworkError>) -> Void) { self.network.request(url: NetworkURL.Firestore.titifuncs, method: .get) { result in switch result.status { case .SUCCESS: @@ -34,7 +34,7 @@ extension NetworkController: TiTiFunctionsFetchable { } extension NetworkController: UpdateHistoryFetchable { - func getUpdateHistorys(completion: @escaping (Result<[UpdateInfo], NetworkError>) -> Void) { + func getUpdateHistorys_lagacy(completion: @escaping (Result<[UpdateInfo], NetworkError>) -> Void) { self.network.request(url: NetworkURL.Firestore.updates, method: .get) { result in switch result.status { case .SUCCESS: @@ -52,7 +52,7 @@ extension NetworkController: UpdateHistoryFetchable { } extension NetworkController: YoutubeLinkFetchable { - func getYoutubeLink(completion: @escaping (Result) -> Void) { + func getYoutubeLink_lagacy(completion: @escaping (Result) -> Void) { self.network.request(url: NetworkURL.Firestore.youtubeLink, method: .get) { result in switch result.status { case .SUCCESS: @@ -70,7 +70,7 @@ extension NetworkController: YoutubeLinkFetchable { } extension NetworkController: SurveysFetchable { - func getSurveys(completion: @escaping (Result<[SurveyInfo], NetworkError>) -> Void) { + func getSurveys_lagacy(completion: @escaping (Result<[SurveyInfo], NetworkError>) -> Void) { self.network.request(url: NetworkURL.Firestore.surveys, method: .get) { result in switch result.status { case .SUCCESS: diff --git a/Project_Timer/Data/Network/NetworkProtocols.swift b/Project_Timer/Data/Network/NetworkProtocols.swift index 9810120b..513d8fb7 100644 --- a/Project_Timer/Data/Network/NetworkProtocols.swift +++ b/Project_Timer/Data/Network/NetworkProtocols.swift @@ -10,17 +10,17 @@ import Foundation import Alamofire protocol TiTiFunctionsFetchable { - func getTiTiFunctions(completion: @escaping (Result<[FunctionInfo], NetworkError>) -> Void) + func getTiTiFunctions_lagacy(completion: @escaping (Result<[FunctionInfo], NetworkError>) -> Void) } protocol UpdateHistoryFetchable { - func getUpdateHistorys(completion: @escaping (Result<[UpdateInfo], NetworkError>) -> Void) + func getUpdateHistorys_lagacy(completion: @escaping (Result<[UpdateInfo], NetworkError>) -> Void) } protocol YoutubeLinkFetchable { - func getYoutubeLink(completion: @escaping (Result) -> Void) + func getYoutubeLink_lagacy(completion: @escaping (Result) -> Void) } protocol SurveysFetchable { - func getSurveys(completion: @escaping (Result<[SurveyInfo], NetworkError>) -> Void) + func getSurveys_lagacy(completion: @escaping (Result<[SurveyInfo], NetworkError>) -> Void) } diff --git a/Project_Timer/Data/Repository/NotificationRepository.swift b/Project_Timer/Data/Repository/NotificationRepository.swift index bb6628ac..ef938dd9 100644 --- a/Project_Timer/Data/Repository/NotificationRepository.swift +++ b/Project_Timer/Data/Repository/NotificationRepository.swift @@ -20,7 +20,7 @@ final class NotificationRepository { func get() -> AnyPublisher { return self.api.requestPublisher(.getNotification) - .map(NotificationDTO.self) + .map(NotificationResponse.self) .map { $0.toDomain() } .catchDecodeError() } diff --git a/Project_Timer/Data/Repository/lagacy/NotificationRepository_lagacy.swift b/Project_Timer/Data/Repository/lagacy/NotificationRepository_lagacy.swift index 7e54008f..80ea0639 100644 --- a/Project_Timer/Data/Repository/lagacy/NotificationRepository_lagacy.swift +++ b/Project_Timer/Data/Repository/lagacy/NotificationRepository_lagacy.swift @@ -16,7 +16,7 @@ final class NotificationRepository_lagacy: NotificationRepositoryInterface { switch result.status { case .SUCCESS: if let data = result.data { - guard let dto = try? JSONDecoder.dateFormatted.decode(NotificationDTO.self, from: data) else { + guard let dto = try? JSONDecoder.dateFormatted.decode(NotificationResponse.self, from: data) else { print(String(data: data, encoding: .utf8)!) completion(.failure(.DECODEERROR)) return diff --git a/Project_Timer/Data/DTO/NotificationDTO.swift b/Project_Timer/Data/Response/NotificationResponse.swift similarity index 95% rename from Project_Timer/Data/DTO/NotificationDTO.swift rename to Project_Timer/Data/Response/NotificationResponse.swift index 816fad96..75807eca 100644 --- a/Project_Timer/Data/DTO/NotificationDTO.swift +++ b/Project_Timer/Data/Response/NotificationResponse.swift @@ -8,7 +8,7 @@ import Foundation -struct NotificationDTO: Decodable, FirestoreValue { +struct NotificationResponse: Decodable, FirestoreValue { var title: FirebaseStringValue var text: FirebaseStringValue var notiTitles: FirebaseStringArrayValue @@ -42,7 +42,7 @@ struct NotificationDTO: Decodable, FirestoreValue { } } -extension NotificationDTO { +extension NotificationResponse { func toDomain() -> NotificationInfo { return .init( title: self.title.value, diff --git a/Project_Timer/Data/DTO/LastestVersionInfo.swift b/Project_Timer/Domain/Entity/LastestVersionInfo.swift similarity index 100% rename from Project_Timer/Data/DTO/LastestVersionInfo.swift rename to Project_Timer/Domain/Entity/LastestVersionInfo.swift diff --git a/Project_Timer/Present/Setting/Service/SettingFunctionsList/SettingFunctionsListVM.swift b/Project_Timer/Present/Setting/Service/SettingFunctionsList/SettingFunctionsListVM.swift index 5eb82994..af5474a4 100644 --- a/Project_Timer/Present/Setting/Service/SettingFunctionsList/SettingFunctionsListVM.swift +++ b/Project_Timer/Present/Setting/Service/SettingFunctionsList/SettingFunctionsListVM.swift @@ -24,7 +24,7 @@ final class SettingFunctionsListVM { } private func configureInfos() { - self.networkController.getTiTiFunctions { [weak self] result in + self.networkController.getTiTiFunctions_lagacy { [weak self] result in switch result { case .success(let functionInfos): self?.infos = functionInfos @@ -35,7 +35,7 @@ final class SettingFunctionsListVM { } private func configureYoutubeLink() { - self.networkController.getYoutubeLink { [weak self] result in + self.networkController.getYoutubeLink_lagacy { [weak self] result in switch result { case .success(let youtubeLinkInfo): self?.youtubeLink = youtubeLinkInfo.url.value diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/SettingTiTiLabVM.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/SettingTiTiLabVM.swift index 927bca06..c8d0a9f0 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/SettingTiTiLabVM.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/SettingTiTiLabVM.swift @@ -20,7 +20,7 @@ final class SettingTiTiLabVM { } private func configureInfos() { - self.networkController.getSurveys { [weak self] result in + self.networkController.getSurveys_lagacy { [weak self] result in switch result { case .success(let surveyInfos): self?.infos = surveyInfos diff --git a/Project_Timer/Present/Setting/UpdateHistory/SettingUpdateHistoryVM.swift b/Project_Timer/Present/Setting/UpdateHistory/SettingUpdateHistoryVM.swift index 04f131e6..82aa775d 100644 --- a/Project_Timer/Present/Setting/UpdateHistory/SettingUpdateHistoryVM.swift +++ b/Project_Timer/Present/Setting/UpdateHistory/SettingUpdateHistoryVM.swift @@ -20,7 +20,7 @@ final class SettingUpdateHistoryVM { } private func configureInfos() { - self.networkController.getUpdateHistorys { [weak self] result in + self.networkController.getUpdateHistorys_lagacy { [weak self] result in switch result { case .success(let updateInfo): self?.infos = updateInfo.sorted(by: { From dccb6d236c40fab81920afbab7787821b5cd3c59 Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sat, 29 Jun 2024 17:06:23 +0900 Subject: [PATCH 16/44] =?UTF-8?q?refact=20#144:=20DTO=20=ED=8F=B4=EB=8D=94?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C,=20Response=20=EB=B0=8F=20info=EB=A1=9C?= =?UTF-8?q?=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 110 +++++++++--------- .../Data/Network/NetworkProtocols.swift | 4 +- .../Data/Response/FunctionResponse.swift | 18 +++ .../Data/Response/SurveyResponse.swift | 18 +++ .../Data/Response/UpdateHistoryResponse.swift | 18 +++ .../YoutubeLinkResponse.swift} | 2 +- .../lagacy/AppLatestVersionRepository.swift | 0 .../{API => }/lagacy/AppVersionNetwork.swift | 0 .../Data/{API => }/lagacy/AuthNetwork.swift | 0 .../lagacy/AuthRepository_lagacy.swift | 0 .../Data/{API => }/lagacy/DailysNetwork.swift | 0 .../lagacy/DailysRepository_lagacy.swift | 0 .../Data/{Network => lagacy}/Network.swift | 0 .../NetworkController.swift | 12 +- .../{Network => lagacy}/NetworkResult.swift | 0 .../lagacy/NotificationNetwork.swift | 0 .../NotificationRepository_lagacy.swift | 0 .../{API => }/lagacy/RecordTimesNetwork.swift | 0 .../lagacy/RecordTimesRepository_lagacy.swift | 0 .../{API => }/lagacy/ServerURLNetwork.swift | 0 .../lagacy/ServerURLRepository.swift | 0 .../{API => }/lagacy/SyncLogNetwork.swift | 0 .../lagacy/SyncLogRepository_lagacy.swift | 0 .../DTO => Domain/Entity}/FunctionInfo.swift | 14 +-- .../DTO => Domain/Entity}/SurveyInfo.swift | 14 +-- .../Entity/UpdateHistoryInfo.swift} | 18 +-- .../SettingUpdateHistoryVM.swift | 2 +- .../UpdateHistory/UpdateInfoCell.swift | 2 +- 28 files changed, 126 insertions(+), 106 deletions(-) create mode 100644 Project_Timer/Data/Response/FunctionResponse.swift create mode 100644 Project_Timer/Data/Response/SurveyResponse.swift create mode 100644 Project_Timer/Data/Response/UpdateHistoryResponse.swift rename Project_Timer/Data/{DTO/YoutubeLinkInfo.swift => Response/YoutubeLinkResponse.swift} (94%) rename Project_Timer/Data/{Repository => }/lagacy/AppLatestVersionRepository.swift (100%) rename Project_Timer/Data/{API => }/lagacy/AppVersionNetwork.swift (100%) rename Project_Timer/Data/{API => }/lagacy/AuthNetwork.swift (100%) rename Project_Timer/Data/{Repository => }/lagacy/AuthRepository_lagacy.swift (100%) rename Project_Timer/Data/{API => }/lagacy/DailysNetwork.swift (100%) rename Project_Timer/Data/{Repository => }/lagacy/DailysRepository_lagacy.swift (100%) rename Project_Timer/Data/{Network => lagacy}/Network.swift (100%) rename Project_Timer/Data/{Network => lagacy}/NetworkController.swift (81%) rename Project_Timer/Data/{Network => lagacy}/NetworkResult.swift (100%) rename Project_Timer/Data/{API => }/lagacy/NotificationNetwork.swift (100%) rename Project_Timer/Data/{Repository => }/lagacy/NotificationRepository_lagacy.swift (100%) rename Project_Timer/Data/{API => }/lagacy/RecordTimesNetwork.swift (100%) rename Project_Timer/Data/{Repository => }/lagacy/RecordTimesRepository_lagacy.swift (100%) rename Project_Timer/Data/{API => }/lagacy/ServerURLNetwork.swift (100%) rename Project_Timer/Data/{Repository => }/lagacy/ServerURLRepository.swift (100%) rename Project_Timer/Data/{API => }/lagacy/SyncLogNetwork.swift (100%) rename Project_Timer/Data/{Repository => }/lagacy/SyncLogRepository_lagacy.swift (100%) rename Project_Timer/{Data/DTO => Domain/Entity}/FunctionInfo.swift (70%) rename Project_Timer/{Data/DTO => Domain/Entity}/SurveyInfo.swift (70%) rename Project_Timer/{Data/DTO/UpdateInfo.swift => Domain/Entity/UpdateHistoryInfo.swift} (70%) diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index 15f38983..4609f666 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -115,11 +115,14 @@ 8721C6DD296944EE00410D57 /* ChangePrevGraphButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8721C6DC296944EE00410D57 /* ChangePrevGraphButton.swift */; }; 872210422C2FEE83003B97AD /* SyncLogRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872210412C2FEE83003B97AD /* SyncLogRepository.swift */; }; 872210442C2FF10B003B97AD /* NotificationRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872210432C2FF10B003B97AD /* NotificationRepository.swift */; }; + 872210472C2FF676003B97AD /* SurveyInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872210462C2FF676003B97AD /* SurveyInfo.swift */; }; + 872210492C2FF6AF003B97AD /* FunctionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872210482C2FF6AF003B97AD /* FunctionInfo.swift */; }; + 8722104B2C2FF6E7003B97AD /* UpdateHistoryInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8722104A2C2FF6E7003B97AD /* UpdateHistoryInfo.swift */; }; 872C0EDB284ADD8300E8E3F2 /* SettingUpdateHistoryVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872C0EDA284ADD8300E8E3F2 /* SettingUpdateHistoryVC.swift */; }; 872C0EDE284AE52800E8E3F2 /* SettingFunctionsListVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872C0EDD284AE52800E8E3F2 /* SettingFunctionsListVC.swift */; }; 872C0EE1284AE57200E8E3F2 /* SettingTiTiLabVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872C0EE0284AE57200E8E3F2 /* SettingTiTiLabVC.swift */; }; 872C0EE3284AF26A00E8E3F2 /* SettingUpdateHistoryVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872C0EE2284AF26A00E8E3F2 /* SettingUpdateHistoryVM.swift */; }; - 872C0EE6284AF31000E8E3F2 /* UpdateInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872C0EE5284AF31000E8E3F2 /* UpdateInfo.swift */; }; + 872C0EE6284AF31000E8E3F2 /* UpdateHistoryResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872C0EE5284AF31000E8E3F2 /* UpdateHistoryResponse.swift */; }; 872C0EE8284AF5F600E8E3F2 /* UpdateInfoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872C0EE7284AF5F600E8E3F2 /* UpdateInfoCell.swift */; }; 87306D4F2B260609001B7C14 /* Language.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D1250028771AAD00018658 /* Language.swift */; }; 87306D512B26086D001B7C14 /* TLRko.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87306D502B26086D001B7C14 /* TLRko.swift */; }; @@ -178,7 +181,7 @@ 875C98BE287172A5008F7ADD /* FirebaseStringValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875C98BD287172A5008F7ADD /* FirebaseStringValue.swift */; }; 875C98C1287175F7008F7ADD /* TiTiLabActionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875C98C0287175F7008F7ADD /* TiTiLabActionDelegate.swift */; }; 875C98C3287176E4008F7ADD /* FunctionsActionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875C98C2287176E4008F7ADD /* FunctionsActionDelegate.swift */; }; - 875C98C72871BB26008F7ADD /* YoutubeLinkInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875C98C62871BB26008F7ADD /* YoutubeLinkInfo.swift */; }; + 875C98C72871BB26008F7ADD /* YoutubeLinkResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875C98C62871BB26008F7ADD /* YoutubeLinkResponse.swift */; }; 875C98C92871BFCF008F7ADD /* UserDefaults+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875C98C82871BFCF008F7ADD /* UserDefaults+Extension.swift */; }; 875C98CB2871C0A7008F7ADD /* UIImage+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875C98CA2871C0A7008F7ADD /* UIImage+Extension.swift */; }; 875EDA342957E0360037A7EB /* NetworkInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875EDA332957E0360037A7EB /* NetworkInterceptor.swift */; }; @@ -231,7 +234,7 @@ 877911B82A18903000F0A713 /* SettingListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 877911B72A18903000F0A713 /* SettingListCell.swift */; }; 877911BA2A1891B100F0A713 /* SettingSwitchListVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 877911B92A1891B100F0A713 /* SettingSwitchListVM.swift */; }; 877911BC2A18922400F0A713 /* SettingListCellInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 877911BB2A18922400F0A713 /* SettingListCellInfo.swift */; }; - 877D69FC2871C1CB00215B6D /* SurveyInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 877D69FB2871C1CB00215B6D /* SurveyInfo.swift */; }; + 877D69FC2871C1CB00215B6D /* SurveyResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 877D69FB2871C1CB00215B6D /* SurveyResponse.swift */; }; 878431AD27F6F461000A98B3 /* TodolistVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 878431AC27F6F461000A98B3 /* TodolistVM.swift */; }; 87862E822B2D8C22004ED313 /* TTNotificationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87862E812B2D8C22004ED313 /* TTNotificationView.swift */; }; 87862E842B2D989A004ED313 /* NotificationInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87862E832B2D989A004ED313 /* NotificationInfo.swift */; }; @@ -396,7 +399,7 @@ 87F10930284C4337002E31EA /* TiTiLabHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87F1092F284C4337002E31EA /* TiTiLabHeaderView.swift */; }; 87F10932284C4367002E31EA /* SurveyCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87F10931284C4367002E31EA /* SurveyCell.swift */; }; 87F10936284C47A1002E31EA /* SettingTiTiLabVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87F10935284C47A1002E31EA /* SettingTiTiLabVM.swift */; }; - 87F1093A284C589A002E31EA /* FunctionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87F10938284C589A002E31EA /* FunctionInfo.swift */; }; + 87F1093A284C589A002E31EA /* FunctionResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87F10938284C589A002E31EA /* FunctionResponse.swift */; }; 87F1093B284C589A002E31EA /* SettingFunctionsListVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87F10939284C589A002E31EA /* SettingFunctionsListVM.swift */; }; 87F1093C284C589A002E31EA /* FunctionInfoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87F10937284C589A002E31EA /* FunctionInfoCell.swift */; }; 87F50A17298FA3BD00ABF0CF /* newFeatures.strings in Resources */ = {isa = PBXBuildFile; fileRef = 87F50A19298FA3BD00ABF0CF /* newFeatures.strings */; }; @@ -554,12 +557,15 @@ 8721C6DC296944EE00410D57 /* ChangePrevGraphButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangePrevGraphButton.swift; sourceTree = ""; }; 872210412C2FEE83003B97AD /* SyncLogRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncLogRepository.swift; sourceTree = ""; }; 872210432C2FF10B003B97AD /* NotificationRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationRepository.swift; sourceTree = ""; }; + 872210462C2FF676003B97AD /* SurveyInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SurveyInfo.swift; sourceTree = ""; }; + 872210482C2FF6AF003B97AD /* FunctionInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FunctionInfo.swift; sourceTree = ""; }; + 8722104A2C2FF6E7003B97AD /* UpdateHistoryInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateHistoryInfo.swift; sourceTree = ""; }; 872B7552296A625B00D24394 /* production.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = production.xcconfig; sourceTree = ""; }; 872C0EDA284ADD8300E8E3F2 /* SettingUpdateHistoryVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingUpdateHistoryVC.swift; sourceTree = ""; }; 872C0EDD284AE52800E8E3F2 /* SettingFunctionsListVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingFunctionsListVC.swift; sourceTree = ""; }; 872C0EE0284AE57200E8E3F2 /* SettingTiTiLabVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingTiTiLabVC.swift; sourceTree = ""; }; 872C0EE2284AF26A00E8E3F2 /* SettingUpdateHistoryVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingUpdateHistoryVM.swift; sourceTree = ""; }; - 872C0EE5284AF31000E8E3F2 /* UpdateInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateInfo.swift; sourceTree = ""; }; + 872C0EE5284AF31000E8E3F2 /* UpdateHistoryResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateHistoryResponse.swift; sourceTree = ""; }; 872C0EE7284AF5F600E8E3F2 /* UpdateInfoCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateInfoCell.swift; sourceTree = ""; }; 87306D502B26086D001B7C14 /* TLRko.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TLRko.swift; sourceTree = ""; }; 87306D522B260969001B7C14 /* TLRen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TLRen.swift; sourceTree = ""; }; @@ -618,7 +624,7 @@ 875C98BD287172A5008F7ADD /* FirebaseStringValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseStringValue.swift; sourceTree = ""; }; 875C98C0287175F7008F7ADD /* TiTiLabActionDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TiTiLabActionDelegate.swift; sourceTree = ""; }; 875C98C2287176E4008F7ADD /* FunctionsActionDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FunctionsActionDelegate.swift; sourceTree = ""; }; - 875C98C62871BB26008F7ADD /* YoutubeLinkInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YoutubeLinkInfo.swift; sourceTree = ""; }; + 875C98C62871BB26008F7ADD /* YoutubeLinkResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YoutubeLinkResponse.swift; sourceTree = ""; }; 875C98C82871BFCF008F7ADD /* UserDefaults+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserDefaults+Extension.swift"; sourceTree = ""; }; 875C98CA2871C0A7008F7ADD /* UIImage+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+Extension.swift"; sourceTree = ""; }; 875EDA332957E0360037A7EB /* NetworkInterceptor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkInterceptor.swift; sourceTree = ""; }; @@ -660,7 +666,7 @@ 877911B72A18903000F0A713 /* SettingListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingListCell.swift; sourceTree = ""; }; 877911B92A1891B100F0A713 /* SettingSwitchListVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingSwitchListVM.swift; sourceTree = ""; }; 877911BB2A18922400F0A713 /* SettingListCellInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingListCellInfo.swift; sourceTree = ""; }; - 877D69FB2871C1CB00215B6D /* SurveyInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SurveyInfo.swift; sourceTree = ""; }; + 877D69FB2871C1CB00215B6D /* SurveyResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SurveyResponse.swift; sourceTree = ""; }; 878431AC27F6F461000A98B3 /* TodolistVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TodolistVM.swift; sourceTree = ""; }; 87862E812B2D8C22004ED313 /* TTNotificationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TTNotificationView.swift; sourceTree = ""; }; 87862E832B2D989A004ED313 /* NotificationInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationInfo.swift; sourceTree = ""; }; @@ -821,7 +827,7 @@ 87F10931284C4367002E31EA /* SurveyCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SurveyCell.swift; sourceTree = ""; }; 87F10935284C47A1002E31EA /* SettingTiTiLabVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingTiTiLabVM.swift; sourceTree = ""; }; 87F10937284C589A002E31EA /* FunctionInfoCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FunctionInfoCell.swift; sourceTree = ""; }; - 87F10938284C589A002E31EA /* FunctionInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FunctionInfo.swift; sourceTree = ""; }; + 87F10938284C589A002E31EA /* FunctionResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FunctionResponse.swift; sourceTree = ""; }; 87F10939284C589A002E31EA /* SettingFunctionsListVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingFunctionsListVM.swift; sourceTree = ""; }; 87F50A18298FA3BD00ABF0CF /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/newFeatures.strings; sourceTree = ""; }; 87F50A1A298FA3C100ABF0CF /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/newFeatures.strings; sourceTree = ""; }; @@ -1020,6 +1026,30 @@ path = ViewModel; sourceTree = ""; }; + 872210452C2FF575003B97AD /* lagacy */ = { + isa = PBXGroup; + children = ( + 87163DC92ACAF89B008D4072 /* NetworkResult.swift */, + 87910829283877A4005D7B10 /* Network.swift */, + 87910820283875C0005D7B10 /* NetworkController.swift */, + 875FAE242B1C6721008F19D2 /* AppVersionNetwork.swift */, + 8708004F2B2C38F900830B39 /* ServerURLNetwork.swift */, + 8708005B2B2C4D2D00830B39 /* AuthNetwork.swift */, + 8708006A2B2CA57C00830B39 /* DailysNetwork.swift */, + 870800782B2D4DE500830B39 /* RecordTimesNetwork.swift */, + 870800842B2D593400830B39 /* SyncLogNetwork.swift */, + 873731D02B2E92BD00D7BD9F /* NotificationNetwork.swift */, + 875FAE2B2B1C6B57008F19D2 /* AppLatestVersionRepository.swift */, + 870800532B2C3A5400830B39 /* ServerURLRepository.swift */, + 870800602B2C5FDA00830B39 /* AuthRepository_lagacy.swift */, + 8708006C2B2CA7AB00830B39 /* DailysRepository_lagacy.swift */, + 8708007A2B2D4F0800830B39 /* RecordTimesRepository_lagacy.swift */, + 870800862B2D599800830B39 /* SyncLogRepository_lagacy.swift */, + 873731D22B2E931800D7BD9F /* NotificationRepository_lagacy.swift */, + ); + path = lagacy; + sourceTree = ""; + }; 872C0ED9284ADD6800E8E3F2 /* UpdateHistory */ = { isa = PBXGroup; children = ( @@ -1162,21 +1192,9 @@ path = InteractionView; sourceTree = ""; }; - 875FAE222B1C653A008F19D2 /* DTO */ = { - isa = PBXGroup; - children = ( - 87F10938284C589A002E31EA /* FunctionInfo.swift */, - 877D69FB2871C1CB00215B6D /* SurveyInfo.swift */, - 872C0EE5284AF31000E8E3F2 /* UpdateInfo.swift */, - 875C98C62871BB26008F7ADD /* YoutubeLinkInfo.swift */, - ); - path = DTO; - sourceTree = ""; - }; 875FAE232B1C6710008F19D2 /* API */ = { isa = PBXGroup; children = ( - 8761BDBE2BCFE48D00E9281A /* lagacy */, 8761BDBF2BCFE52E00E9281A /* FirebaseAPI.swift */, 8761BDC92BCFEA7A00E9281A /* AuthAPI.swift */, 8761BDCB2BCFEC8500E9281A /* DailysAPI.swift */, @@ -1202,6 +1220,9 @@ 87D4DCC62BA52F3800BB5AAB /* ResetPasswordInfo.swift */, 87D4DCE32BA6A18C00BB5AAB /* ChangeCompleteInfo.swift */, 87476DAC28A2794B00FAD273 /* LastestVersionInfo.swift */, + 872210462C2FF676003B97AD /* SurveyInfo.swift */, + 872210482C2FF6AF003B97AD /* FunctionInfo.swift */, + 8722104A2C2FF6E7003B97AD /* UpdateHistoryInfo.swift */, ); path = Entity; sourceTree = ""; @@ -1285,20 +1306,6 @@ path = CalendarWidget; sourceTree = ""; }; - 8761BDBE2BCFE48D00E9281A /* lagacy */ = { - isa = PBXGroup; - children = ( - 875FAE242B1C6721008F19D2 /* AppVersionNetwork.swift */, - 8708004F2B2C38F900830B39 /* ServerURLNetwork.swift */, - 8708005B2B2C4D2D00830B39 /* AuthNetwork.swift */, - 8708006A2B2CA57C00830B39 /* DailysNetwork.swift */, - 870800782B2D4DE500830B39 /* RecordTimesNetwork.swift */, - 870800842B2D593400830B39 /* SyncLogNetwork.swift */, - 873731D02B2E92BD00D7BD9F /* NotificationNetwork.swift */, - ); - path = lagacy; - sourceTree = ""; - }; 8762717127DF83E400F812ED /* TaskSelect */ = { isa = PBXGroup; children = ( @@ -1468,13 +1475,10 @@ 8791081D2838752D005D7B10 /* Network */ = { isa = PBXGroup; children = ( - 87910829283877A4005D7B10 /* Network.swift */, - 87163DC92ACAF89B008D4072 /* NetworkResult.swift */, 875EDA332957E0360037A7EB /* NetworkInterceptor.swift */, 87D7ED182952BA7200121DE6 /* Extension */, 8791081E28387537005D7B10 /* NetworkURL.swift */, 87910822283875CF005D7B10 /* NetworkProtocols.swift */, - 87910820283875C0005D7B10 /* NetworkController.swift */, ); path = Network; sourceTree = ""; @@ -1608,20 +1612,6 @@ path = SharedCode; sourceTree = ""; }; - 87B90B382BF4AEE000D6886E /* lagacy */ = { - isa = PBXGroup; - children = ( - 875FAE2B2B1C6B57008F19D2 /* AppLatestVersionRepository.swift */, - 870800532B2C3A5400830B39 /* ServerURLRepository.swift */, - 870800602B2C5FDA00830B39 /* AuthRepository_lagacy.swift */, - 8708006C2B2CA7AB00830B39 /* DailysRepository_lagacy.swift */, - 8708007A2B2D4F0800830B39 /* RecordTimesRepository_lagacy.swift */, - 870800862B2D599800830B39 /* SyncLogRepository_lagacy.swift */, - 873731D22B2E931800D7BD9F /* NotificationRepository_lagacy.swift */, - ); - path = lagacy; - sourceTree = ""; - }; 87B90B3D2BF4BC0100D6886E /* Error */ = { isa = PBXGroup; children = ( @@ -1745,6 +1735,10 @@ 870800822B2D551700830B39 /* RecordTimesResponse.swift */, 870800882B2D59EB00830B39 /* SyncLogResponse.swift */, 873731D42B2E938400D7BD9F /* NotificationResponse.swift */, + 877D69FB2871C1CB00215B6D /* SurveyResponse.swift */, + 87F10938284C589A002E31EA /* FunctionResponse.swift */, + 872C0EE5284AF31000E8E3F2 /* UpdateHistoryResponse.swift */, + 875C98C62871BB26008F7ADD /* YoutubeLinkResponse.swift */, ); path = Response; sourceTree = ""; @@ -1951,13 +1945,13 @@ 87F778DC2B196E8F00909511 /* Data */ = { isa = PBXGroup; children = ( + 872210452C2FF575003B97AD /* lagacy */, 87B90B402BF4BFEE00D6886E /* TTProvider.swift */, 87B90B3D2BF4BC0100D6886E /* Error */, 87D4DCCA2BA5476900BB5AAB /* Request */, 87D4DCCD2BA548E300BB5AAB /* Response */, 87F778E12B196F7400909511 /* Repository */, 875FAE232B1C6710008F19D2 /* API */, - 875FAE222B1C653A008F19D2 /* DTO */, 8791081D2838752D005D7B10 /* Network */, ); path = Data; @@ -1991,7 +1985,6 @@ 87F778E12B196F7400909511 /* Repository */ = { isa = PBXGroup; children = ( - 87B90B382BF4AEE000D6886E /* lagacy */, 87B90B392BF4AEF600D6886E /* FirebaseRepository.swift */, 87FB6B8C2BFE0B3F00CD7A9C /* AuthRepository.swift */, 874B542B2C1592460062D0AC /* DailysRepository.swift */, @@ -2297,6 +2290,7 @@ 048D8AD028AABC9E00A2456D /* AddNewTaskHistoryCell.swift in Sources */, 870800792B2D4DE500830B39 /* RecordTimesNetwork.swift in Sources */, 043706312869FB0E00A5D3AA /* StopwatchTimeLabelView.swift in Sources */, + 8722104B2C2FF6E7003B97AD /* UpdateHistoryInfo.swift in Sources */, 04E0DFCB28A926C1004DABBE /* TaskInteractionView.swift in Sources */, 875A5F7B2A20836600679A72 /* HowToUseWidgetVC.swift in Sources */, 87199F512883D0B00017D01A /* TaskInfo.swift in Sources */, @@ -2403,9 +2397,9 @@ 877911B82A18903000F0A713 /* SettingListCell.swift in Sources */, 870F90E32AEFF7FC00854DDB /* SignupPasswordView.swift in Sources */, 87BEBEEB281C19CA0095CD29 /* StopwatchVM.swift in Sources */, - 87F1093A284C589A002E31EA /* FunctionInfo.swift in Sources */, + 87F1093A284C589A002E31EA /* FunctionResponse.swift in Sources */, 875AA59C26494365005D15D6 /* TaskSelectVC.swift in Sources */, - 875C98C72871BB26008F7ADD /* YoutubeLinkInfo.swift in Sources */, + 875C98C72871BB26008F7ADD /* YoutubeLinkResponse.swift in Sources */, 87D4DCE22BA6A12B00BB5AAB /* ResetPasswordCompleteModel.swift in Sources */, 04B5293B28B4E40500906C86 /* PopupEditTaskNameVC.swift in Sources */, 8765234828C76FFE00487BFB /* WeekSmallVM.swift in Sources */, @@ -2449,6 +2443,7 @@ 873731D72B2E97C100D7BD9F /* NotificationRepositoryInterface.swift in Sources */, 8765234F28C7964500487BFB /* TotalVM.swift in Sources */, 878899852894F09600B7F378 /* WeekTimelineView.swift in Sources */, + 872210472C2FF676003B97AD /* SurveyInfo.swift in Sources */, 87D83E8C2B29703A003C40AE /* SettingLanguageVM.swift in Sources */, 87F1093B284C589A002E31EA /* SettingFunctionsListVM.swift in Sources */, 8708006F2B2CA92C00830B39 /* DailyResponse.swift in Sources */, @@ -2528,13 +2523,14 @@ 8757AA3D290511FF00D97517 /* Task.swift in Sources */, 04E0DFCD28A94460004DABBE /* PaddingLabel.swift in Sources */, 87405D6628F5869D00576D2C /* ColorofTextSelectorVC.swift in Sources */, + 872210492C2FF6AF003B97AD /* FunctionInfo.swift in Sources */, 872C0EDB284ADD8300E8E3F2 /* SettingUpdateHistoryVC.swift in Sources */, 87F1093C284C589A002E31EA /* FunctionInfoCell.swift in Sources */, 87D4DCE42BA6A18C00BB5AAB /* ChangeCompleteInfo.swift in Sources */, 8788997A2894EFEE00B7F378 /* LogWeekVC.swift in Sources */, 872C0EE1284AE57200E8E3F2 /* SettingTiTiLabVC.swift in Sources */, 875EDA362957F9510037A7EB /* LoadingIndicator.swift in Sources */, - 872C0EE6284AF31000E8E3F2 /* UpdateInfo.swift in Sources */, + 872C0EE6284AF31000E8E3F2 /* UpdateHistoryResponse.swift in Sources */, 87BF666A28F80E9400CD6F19 /* NormalTimeLabelView.swift in Sources */, 87E6004B28426EBF008D17B9 /* SettingVC.swift in Sources */, 93B08523248DDF2F00E215BD /* SceneDelegate.swift in Sources */, @@ -2604,7 +2600,7 @@ 879A2BA6284741A500B69DA7 /* SettingHeaderView.swift in Sources */, 8721C6DB296943C500410D57 /* ChangeNextGraphButton.swift in Sources */, 873731D32B2E931800D7BD9F /* NotificationRepository_lagacy.swift in Sources */, - 877D69FC2871C1CB00215B6D /* SurveyInfo.swift in Sources */, + 877D69FC2871C1CB00215B6D /* SurveyResponse.swift in Sources */, 874F9C2F2ABFF7CF00675A86 /* GoogleSigninButton.swift in Sources */, 87199F552883EB160017D01A /* TimelineView.swift in Sources */, 87306D552B2609CE001B7C14 /* TLRzh.swift in Sources */, diff --git a/Project_Timer/Data/Network/NetworkProtocols.swift b/Project_Timer/Data/Network/NetworkProtocols.swift index 513d8fb7..1d45863b 100644 --- a/Project_Timer/Data/Network/NetworkProtocols.swift +++ b/Project_Timer/Data/Network/NetworkProtocols.swift @@ -14,11 +14,11 @@ protocol TiTiFunctionsFetchable { } protocol UpdateHistoryFetchable { - func getUpdateHistorys_lagacy(completion: @escaping (Result<[UpdateInfo], NetworkError>) -> Void) + func getUpdateHistorys_lagacy(completion: @escaping (Result<[UpdateHistoryInfo], NetworkError>) -> Void) } protocol YoutubeLinkFetchable { - func getYoutubeLink_lagacy(completion: @escaping (Result) -> Void) + func getYoutubeLink_lagacy(completion: @escaping (Result) -> Void) } protocol SurveysFetchable { diff --git a/Project_Timer/Data/Response/FunctionResponse.swift b/Project_Timer/Data/Response/FunctionResponse.swift new file mode 100644 index 00000000..3172c444 --- /dev/null +++ b/Project_Timer/Data/Response/FunctionResponse.swift @@ -0,0 +1,18 @@ +// +// FunctionResponse.swift +// Project_Timer +// +// Created by Kang Minsang on 2022/06/05. +// Copyright © 2022 FDEE. All rights reserved. +// + +import Foundation + +/// Network 수신 DTO +struct FunctionResponse: Decodable { + let functionInfos: [FunctionInfo] + + enum CodingKeys: String, CodingKey { + case functionInfos = "documents" + } +} diff --git a/Project_Timer/Data/Response/SurveyResponse.swift b/Project_Timer/Data/Response/SurveyResponse.swift new file mode 100644 index 00000000..5a3c6e5a --- /dev/null +++ b/Project_Timer/Data/Response/SurveyResponse.swift @@ -0,0 +1,18 @@ +// +// SurveyResponse.swift +// Project_Timer +// +// Created by Kang Minsang on 2022/07/03. +// Copyright © 2022 FDEE. All rights reserved. +// + +import Foundation + +/// Network 수신 DTO +struct SurveyResponse: Decodable { + let surveyInfos: [SurveyInfo]? + + enum CodingKeys: String, CodingKey { + case surveyInfos = "documents" + } +} diff --git a/Project_Timer/Data/Response/UpdateHistoryResponse.swift b/Project_Timer/Data/Response/UpdateHistoryResponse.swift new file mode 100644 index 00000000..ea5d6523 --- /dev/null +++ b/Project_Timer/Data/Response/UpdateHistoryResponse.swift @@ -0,0 +1,18 @@ +// +// UpdateHistoryResponse.swift +// Project_Timer +// +// Created by Kang Minsang on 2022/06/04. +// Copyright © 2022 FDEE. All rights reserved. +// + +import Foundation + +/// Network 수신 DTO +struct UpdateHistoryResponse: Decodable { + var updateInfos: [UpdateHistoryInfo] + + enum CodingKeys: String, CodingKey { + case updateInfos = "documents" + } +} diff --git a/Project_Timer/Data/DTO/YoutubeLinkInfo.swift b/Project_Timer/Data/Response/YoutubeLinkResponse.swift similarity index 94% rename from Project_Timer/Data/DTO/YoutubeLinkInfo.swift rename to Project_Timer/Data/Response/YoutubeLinkResponse.swift index fab367bf..c3b4ed38 100644 --- a/Project_Timer/Data/DTO/YoutubeLinkInfo.swift +++ b/Project_Timer/Data/Response/YoutubeLinkResponse.swift @@ -9,7 +9,7 @@ import Foundation /// youtubeInfo DTO -struct YoutubeLinkInfo: Decodable { +struct YoutubeLinkResponse: Decodable { let url: FirebaseStringValue private enum RootKey: String, CodingKey { diff --git a/Project_Timer/Data/Repository/lagacy/AppLatestVersionRepository.swift b/Project_Timer/Data/lagacy/AppLatestVersionRepository.swift similarity index 100% rename from Project_Timer/Data/Repository/lagacy/AppLatestVersionRepository.swift rename to Project_Timer/Data/lagacy/AppLatestVersionRepository.swift diff --git a/Project_Timer/Data/API/lagacy/AppVersionNetwork.swift b/Project_Timer/Data/lagacy/AppVersionNetwork.swift similarity index 100% rename from Project_Timer/Data/API/lagacy/AppVersionNetwork.swift rename to Project_Timer/Data/lagacy/AppVersionNetwork.swift diff --git a/Project_Timer/Data/API/lagacy/AuthNetwork.swift b/Project_Timer/Data/lagacy/AuthNetwork.swift similarity index 100% rename from Project_Timer/Data/API/lagacy/AuthNetwork.swift rename to Project_Timer/Data/lagacy/AuthNetwork.swift diff --git a/Project_Timer/Data/Repository/lagacy/AuthRepository_lagacy.swift b/Project_Timer/Data/lagacy/AuthRepository_lagacy.swift similarity index 100% rename from Project_Timer/Data/Repository/lagacy/AuthRepository_lagacy.swift rename to Project_Timer/Data/lagacy/AuthRepository_lagacy.swift diff --git a/Project_Timer/Data/API/lagacy/DailysNetwork.swift b/Project_Timer/Data/lagacy/DailysNetwork.swift similarity index 100% rename from Project_Timer/Data/API/lagacy/DailysNetwork.swift rename to Project_Timer/Data/lagacy/DailysNetwork.swift diff --git a/Project_Timer/Data/Repository/lagacy/DailysRepository_lagacy.swift b/Project_Timer/Data/lagacy/DailysRepository_lagacy.swift similarity index 100% rename from Project_Timer/Data/Repository/lagacy/DailysRepository_lagacy.swift rename to Project_Timer/Data/lagacy/DailysRepository_lagacy.swift diff --git a/Project_Timer/Data/Network/Network.swift b/Project_Timer/Data/lagacy/Network.swift similarity index 100% rename from Project_Timer/Data/Network/Network.swift rename to Project_Timer/Data/lagacy/Network.swift diff --git a/Project_Timer/Data/Network/NetworkController.swift b/Project_Timer/Data/lagacy/NetworkController.swift similarity index 81% rename from Project_Timer/Data/Network/NetworkController.swift rename to Project_Timer/Data/lagacy/NetworkController.swift index 9321debc..1f4700ab 100644 --- a/Project_Timer/Data/Network/NetworkController.swift +++ b/Project_Timer/Data/lagacy/NetworkController.swift @@ -21,7 +21,7 @@ extension NetworkController: TiTiFunctionsFetchable { switch result.status { case .SUCCESS: guard let data = result.data, - let functionInfos: FunctionInfos = try? JSONDecoder().decode(FunctionInfos.self, from: data) else { + let functionInfos: FunctionResponse = try? JSONDecoder().decode(FunctionResponse.self, from: data) else { completion(.failure(.DECODEERROR)) return } @@ -34,12 +34,12 @@ extension NetworkController: TiTiFunctionsFetchable { } extension NetworkController: UpdateHistoryFetchable { - func getUpdateHistorys_lagacy(completion: @escaping (Result<[UpdateInfo], NetworkError>) -> Void) { + func getUpdateHistorys_lagacy(completion: @escaping (Result<[UpdateHistoryInfo], NetworkError>) -> Void) { self.network.request(url: NetworkURL.Firestore.updates, method: .get) { result in switch result.status { case .SUCCESS: guard let data = result.data, - let updateInfos: UpdateInfos = try? JSONDecoder().decode(UpdateInfos.self, from: data) else { + let updateInfos: UpdateHistoryResponse = try? JSONDecoder().decode(UpdateHistoryResponse.self, from: data) else { completion(.failure(.DECODEERROR)) return } @@ -52,12 +52,12 @@ extension NetworkController: UpdateHistoryFetchable { } extension NetworkController: YoutubeLinkFetchable { - func getYoutubeLink_lagacy(completion: @escaping (Result) -> Void) { + func getYoutubeLink_lagacy(completion: @escaping (Result) -> Void) { self.network.request(url: NetworkURL.Firestore.youtubeLink, method: .get) { result in switch result.status { case .SUCCESS: guard let data = result.data, - let youtubeLinkInfo: YoutubeLinkInfo = try? JSONDecoder().decode(YoutubeLinkInfo.self, from: data) else { + let youtubeLinkInfo: YoutubeLinkResponse = try? JSONDecoder().decode(YoutubeLinkResponse.self, from: data) else { completion(.failure(.DECODEERROR)) return } @@ -75,7 +75,7 @@ extension NetworkController: SurveysFetchable { switch result.status { case .SUCCESS: guard let data = result.data, - let surveys: SurveyInfos = try? JSONDecoder().decode(SurveyInfos.self, from: data) else { + let surveys: SurveyResponse = try? JSONDecoder().decode(SurveyResponse.self, from: data) else { completion(.failure(.DECODEERROR)) return } diff --git a/Project_Timer/Data/Network/NetworkResult.swift b/Project_Timer/Data/lagacy/NetworkResult.swift similarity index 100% rename from Project_Timer/Data/Network/NetworkResult.swift rename to Project_Timer/Data/lagacy/NetworkResult.swift diff --git a/Project_Timer/Data/API/lagacy/NotificationNetwork.swift b/Project_Timer/Data/lagacy/NotificationNetwork.swift similarity index 100% rename from Project_Timer/Data/API/lagacy/NotificationNetwork.swift rename to Project_Timer/Data/lagacy/NotificationNetwork.swift diff --git a/Project_Timer/Data/Repository/lagacy/NotificationRepository_lagacy.swift b/Project_Timer/Data/lagacy/NotificationRepository_lagacy.swift similarity index 100% rename from Project_Timer/Data/Repository/lagacy/NotificationRepository_lagacy.swift rename to Project_Timer/Data/lagacy/NotificationRepository_lagacy.swift diff --git a/Project_Timer/Data/API/lagacy/RecordTimesNetwork.swift b/Project_Timer/Data/lagacy/RecordTimesNetwork.swift similarity index 100% rename from Project_Timer/Data/API/lagacy/RecordTimesNetwork.swift rename to Project_Timer/Data/lagacy/RecordTimesNetwork.swift diff --git a/Project_Timer/Data/Repository/lagacy/RecordTimesRepository_lagacy.swift b/Project_Timer/Data/lagacy/RecordTimesRepository_lagacy.swift similarity index 100% rename from Project_Timer/Data/Repository/lagacy/RecordTimesRepository_lagacy.swift rename to Project_Timer/Data/lagacy/RecordTimesRepository_lagacy.swift diff --git a/Project_Timer/Data/API/lagacy/ServerURLNetwork.swift b/Project_Timer/Data/lagacy/ServerURLNetwork.swift similarity index 100% rename from Project_Timer/Data/API/lagacy/ServerURLNetwork.swift rename to Project_Timer/Data/lagacy/ServerURLNetwork.swift diff --git a/Project_Timer/Data/Repository/lagacy/ServerURLRepository.swift b/Project_Timer/Data/lagacy/ServerURLRepository.swift similarity index 100% rename from Project_Timer/Data/Repository/lagacy/ServerURLRepository.swift rename to Project_Timer/Data/lagacy/ServerURLRepository.swift diff --git a/Project_Timer/Data/API/lagacy/SyncLogNetwork.swift b/Project_Timer/Data/lagacy/SyncLogNetwork.swift similarity index 100% rename from Project_Timer/Data/API/lagacy/SyncLogNetwork.swift rename to Project_Timer/Data/lagacy/SyncLogNetwork.swift diff --git a/Project_Timer/Data/Repository/lagacy/SyncLogRepository_lagacy.swift b/Project_Timer/Data/lagacy/SyncLogRepository_lagacy.swift similarity index 100% rename from Project_Timer/Data/Repository/lagacy/SyncLogRepository_lagacy.swift rename to Project_Timer/Data/lagacy/SyncLogRepository_lagacy.swift diff --git a/Project_Timer/Data/DTO/FunctionInfo.swift b/Project_Timer/Domain/Entity/FunctionInfo.swift similarity index 70% rename from Project_Timer/Data/DTO/FunctionInfo.swift rename to Project_Timer/Domain/Entity/FunctionInfo.swift index 9d26ab62..36343c52 100644 --- a/Project_Timer/Data/DTO/FunctionInfo.swift +++ b/Project_Timer/Domain/Entity/FunctionInfo.swift @@ -2,22 +2,12 @@ // FunctionInfo.swift // Project_Timer // -// Created by Kang Minsang on 2022/06/05. -// Copyright © 2022 FDEE. All rights reserved. +// Created by Kang Minsang on 2024/06/29. +// Copyright © 2024 FDEE. All rights reserved. // import Foundation -/// Network 수신 DTO -struct FunctionInfos: Decodable { - let functionInfos: [FunctionInfo] - - enum CodingKeys: String, CodingKey { - case functionInfos = "documents" - } -} - -/// survayInfos 내 DTO struct FunctionInfo: Decodable { let title: FirebaseStringValue let url: FirebaseStringValue diff --git a/Project_Timer/Data/DTO/SurveyInfo.swift b/Project_Timer/Domain/Entity/SurveyInfo.swift similarity index 70% rename from Project_Timer/Data/DTO/SurveyInfo.swift rename to Project_Timer/Domain/Entity/SurveyInfo.swift index f29a56f4..939af8be 100644 --- a/Project_Timer/Data/DTO/SurveyInfo.swift +++ b/Project_Timer/Domain/Entity/SurveyInfo.swift @@ -2,22 +2,12 @@ // SurveyInfo.swift // Project_Timer // -// Created by Kang Minsang on 2022/07/03. -// Copyright © 2022 FDEE. All rights reserved. +// Created by Kang Minsang on 2024/06/29. +// Copyright © 2024 FDEE. All rights reserved. // import Foundation -/// Network 수신 DTO -struct SurveyInfos: Decodable { - let surveyInfos: [SurveyInfo]? - - enum CodingKeys: String, CodingKey { - case surveyInfos = "documents" - } -} - -/// survayInfos 내 DTO struct SurveyInfo: Decodable { let title: FirebaseStringValue let url: FirebaseStringValue diff --git a/Project_Timer/Data/DTO/UpdateInfo.swift b/Project_Timer/Domain/Entity/UpdateHistoryInfo.swift similarity index 70% rename from Project_Timer/Data/DTO/UpdateInfo.swift rename to Project_Timer/Domain/Entity/UpdateHistoryInfo.swift index abbc27e9..3456ca29 100644 --- a/Project_Timer/Data/DTO/UpdateInfo.swift +++ b/Project_Timer/Domain/Entity/UpdateHistoryInfo.swift @@ -1,24 +1,14 @@ // -// UpdateInfo.swift +// UpdateHistoryInfo.swift // Project_Timer // -// Created by Kang Minsang on 2022/06/04. -// Copyright © 2022 FDEE. All rights reserved. +// Created by Kang Minsang on 2024/06/29. +// Copyright © 2024 FDEE. All rights reserved. // import Foundation -/// Network 수신 DTO -struct UpdateInfos: Decodable { - var updateInfos: [UpdateInfo] - - enum CodingKeys: String, CodingKey { - case updateInfos = "documents" - } -} - -/// updateInfos 내 DTO -struct UpdateInfo: Decodable, FirestoreValue { +struct UpdateHistoryInfo: Decodable, FirestoreValue { var version: FirebaseStringValue var date: FirebaseStringValue var text: FirebaseStringValue diff --git a/Project_Timer/Present/Setting/UpdateHistory/SettingUpdateHistoryVM.swift b/Project_Timer/Present/Setting/UpdateHistory/SettingUpdateHistoryVM.swift index 82aa775d..cb670fb3 100644 --- a/Project_Timer/Present/Setting/UpdateHistory/SettingUpdateHistoryVM.swift +++ b/Project_Timer/Present/Setting/UpdateHistory/SettingUpdateHistoryVM.swift @@ -11,7 +11,7 @@ import Combine final class SettingUpdateHistoryVM { let networkController: UpdateHistoryFetchable - @Published private(set) var infos: [UpdateInfo] = [] + @Published private(set) var infos: [UpdateHistoryInfo] = [] @Published private(set) var warning: (title: String, text: String)? init(networkController: UpdateHistoryFetchable) { diff --git a/Project_Timer/Present/Setting/UpdateHistory/UpdateInfoCell.swift b/Project_Timer/Present/Setting/UpdateHistory/UpdateInfoCell.swift index 7b4b3e45..4ad51ece 100644 --- a/Project_Timer/Present/Setting/UpdateHistory/UpdateInfoCell.swift +++ b/Project_Timer/Present/Setting/UpdateHistory/UpdateInfoCell.swift @@ -15,7 +15,7 @@ final class UpdateInfoCell: UICollectionViewCell { @IBOutlet weak var dateLabel: UILabel! @IBOutlet weak var textLabel: UILabel! - func configure(with info: UpdateInfo, superWidth: CGFloat) { + func configure(with info: UpdateHistoryInfo, superWidth: CGFloat) { self.versionLabel.text = "ver \(info.version.value)" self.dateLabel.text = "\(info.date.value)" self.textLabel.text = info.text.value From c8bb161b0d0f857eeb9b0ff7fa7e674e5ed50b8f Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sat, 29 Jun 2024 17:33:39 +0900 Subject: [PATCH 17/44] =?UTF-8?q?chore=20#144:=20=EB=94=94=EB=A0=89?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 64 ++++++------------- .../Foundation}/JSONDecoder+Extension.swift | 4 +- .../JSONParameterEncoder+Extension.swift | 18 ------ .../Data/Network/NetworkProtocols.swift | 26 -------- .../Data/{Error => }/NetworkError.swift | 5 +- .../{Network => }/NetworkInterceptor.swift | 1 + .../Data/{Network => }/NetworkURL.swift | 0 .../TTErrorResponse.swift} | 4 +- Project_Timer/Data/Response/TTResponse.swift | 14 ++++ Project_Timer/Data/lagacy/Network.swift | 8 +++ .../Data/lagacy/NetworkController.swift | 17 +++++ 11 files changed, 65 insertions(+), 96 deletions(-) rename Project_Timer/{Data/Network/Extension => Core/Extension/Foundation}/JSONDecoder+Extension.swift (74%) delete mode 100644 Project_Timer/Data/Network/Extension/JSONParameterEncoder+Extension.swift delete mode 100644 Project_Timer/Data/Network/NetworkProtocols.swift rename Project_Timer/Data/{Error => }/NetworkError.swift (94%) rename Project_Timer/Data/{Network => }/NetworkInterceptor.swift (98%) rename Project_Timer/Data/{Network => }/NetworkURL.swift (100%) rename Project_Timer/Data/{Error/ErrorResponse.swift => Response/TTErrorResponse.swift} (79%) create mode 100644 Project_Timer/Data/Response/TTResponse.swift diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index 4609f666..4dc9749b 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -118,6 +118,8 @@ 872210472C2FF676003B97AD /* SurveyInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872210462C2FF676003B97AD /* SurveyInfo.swift */; }; 872210492C2FF6AF003B97AD /* FunctionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872210482C2FF6AF003B97AD /* FunctionInfo.swift */; }; 8722104B2C2FF6E7003B97AD /* UpdateHistoryInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8722104A2C2FF6E7003B97AD /* UpdateHistoryInfo.swift */; }; + 8722104D2C2FFA66003B97AD /* TTResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8722104C2C2FFA66003B97AD /* TTResponse.swift */; }; + 8722104F2C2FFD41003B97AD /* JSONDecoder+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8722104E2C2FFD41003B97AD /* JSONDecoder+Extension.swift */; }; 872C0EDB284ADD8300E8E3F2 /* SettingUpdateHistoryVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872C0EDA284ADD8300E8E3F2 /* SettingUpdateHistoryVC.swift */; }; 872C0EDE284AE52800E8E3F2 /* SettingFunctionsListVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872C0EDD284AE52800E8E3F2 /* SettingFunctionsListVC.swift */; }; 872C0EE1284AE57200E8E3F2 /* SettingTiTiLabVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872C0EE0284AE57200E8E3F2 /* SettingTiTiLabVC.swift */; }; @@ -260,7 +262,6 @@ 878B507225B6E31600B9EFD7 /* timer.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 878B507125B6E31600B9EFD7 /* timer.mp3 */; }; 878BF7ED2955E5430044C079 /* SyncDailysVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 878BF7EC2955E5430044C079 /* SyncDailysVM.swift */; }; 878BF7EF2955E73C0044C079 /* SyncLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 878BF7EE2955E73C0044C079 /* SyncLog.swift */; }; - 878BF7F12955F4600044C079 /* JSONDecoder+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 878BF7F02955F4600044C079 /* JSONDecoder+Extension.swift */; }; 878C98BF2B78A40F0081CFAB /* Localized.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87306D582B260E09001B7C14 /* Localized.swift */; }; 878C98C02B78A41A0081CFAB /* TLRkey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87306D562B260AB8001B7C14 /* TLRkey.swift */; }; 878C98C12B78A41C0081CFAB /* TLRko.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87306D502B26086D001B7C14 /* TLRko.swift */; }; @@ -278,7 +279,6 @@ 87906C812B9BF759000EC960 /* MiSans-Semibold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 87906C802B9BF759000EC960 /* MiSans-Semibold.ttf */; }; 8791081F28387537005D7B10 /* NetworkURL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8791081E28387537005D7B10 /* NetworkURL.swift */; }; 87910821283875C0005D7B10 /* NetworkController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87910820283875C0005D7B10 /* NetworkController.swift */; }; - 87910823283875CF005D7B10 /* NetworkProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87910822283875CF005D7B10 /* NetworkProtocols.swift */; }; 87910828283876DD005D7B10 /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = 87910827283876DD005D7B10 /* Alamofire */; }; 8791082A283877A4005D7B10 /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87910829283877A4005D7B10 /* Network.swift */; }; 8791082F28387D1F005D7B10 /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8791082E28387D1F005D7B10 /* String+Extension.swift */; }; @@ -325,7 +325,7 @@ 87B7A53C2AC02202002AFDFE /* SigninSelectRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87B7A53B2AC02202002AFDFE /* SigninSelectRoute.swift */; }; 87B90B3A2BF4AEF600D6886E /* FirebaseRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87B90B392BF4AEF600D6886E /* FirebaseRepository.swift */; }; 87B90B3C2BF4B13D00D6886E /* AppVersionResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87B90B3B2BF4B13D00D6886E /* AppVersionResponse.swift */; }; - 87B90B3F2BF4BC6D00D6886E /* ErrorResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87B90B3E2BF4BC6D00D6886E /* ErrorResponse.swift */; }; + 87B90B3F2BF4BC6D00D6886E /* TTErrorResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87B90B3E2BF4BC6D00D6886E /* TTErrorResponse.swift */; }; 87B90B412BF4BFEE00D6886E /* TTProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87B90B402BF4BFEE00D6886E /* TTProvider.swift */; }; 87BE88E72AD425BE0010A84A /* SigninTextFieldView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87BE88E62AD425BE0010A84A /* SigninTextFieldView.swift */; }; 87BEBEE9281C17000095CD29 /* RecordsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87BEBEE8281C17000095CD29 /* RecordsManager.swift */; }; @@ -369,7 +369,6 @@ 87D5E65328C7477100D53F8D /* MonthTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D5E65228C7477100D53F8D /* MonthTime.swift */; }; 87D7ED152952B3C100121DE6 /* TestUserSignupRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D7ED142952B3C100121DE6 /* TestUserSignupRequest.swift */; }; 87D7ED172952B69200121DE6 /* TestUserSigninRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D7ED162952B69200121DE6 /* TestUserSigninRequest.swift */; }; - 87D7ED1A2952BA8800121DE6 /* JSONParameterEncoder+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D7ED192952BA8800121DE6 /* JSONParameterEncoder+Extension.swift */; }; 87D83E852B285D4D003C40AE /* SettingLanguageVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D83E842B285D4D003C40AE /* SettingLanguageVC.swift */; }; 87D83E882B296069003C40AE /* TTSettingSelectableCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D83E872B296069003C40AE /* TTSettingSelectableCell.swift */; }; 87D83E8A2B2964EC003C40AE /* SettingLanguageListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D83E892B2964EC003C40AE /* SettingLanguageListView.swift */; }; @@ -560,6 +559,8 @@ 872210462C2FF676003B97AD /* SurveyInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SurveyInfo.swift; sourceTree = ""; }; 872210482C2FF6AF003B97AD /* FunctionInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FunctionInfo.swift; sourceTree = ""; }; 8722104A2C2FF6E7003B97AD /* UpdateHistoryInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateHistoryInfo.swift; sourceTree = ""; }; + 8722104C2C2FFA66003B97AD /* TTResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TTResponse.swift; sourceTree = ""; }; + 8722104E2C2FFD41003B97AD /* JSONDecoder+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "JSONDecoder+Extension.swift"; sourceTree = ""; }; 872B7552296A625B00D24394 /* production.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = production.xcconfig; sourceTree = ""; }; 872C0EDA284ADD8300E8E3F2 /* SettingUpdateHistoryVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingUpdateHistoryVC.swift; sourceTree = ""; }; 872C0EDD284AE52800E8E3F2 /* SettingFunctionsListVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingFunctionsListVC.swift; sourceTree = ""; }; @@ -694,7 +695,6 @@ 878B507125B6E31600B9EFD7 /* timer.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = timer.mp3; sourceTree = ""; }; 878BF7EC2955E5430044C079 /* SyncDailysVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncDailysVM.swift; sourceTree = ""; }; 878BF7EE2955E73C0044C079 /* SyncLog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncLog.swift; sourceTree = ""; }; - 878BF7F02955F4600044C079 /* JSONDecoder+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "JSONDecoder+Extension.swift"; sourceTree = ""; }; 878DA1F52AEE617900C60CBF /* SignupInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignupInfo.swift; sourceTree = ""; }; 878DA1F72AEE68DA00C60CBF /* SignupEmailModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignupEmailModel.swift; sourceTree = ""; }; 878DA1FC2AEF7CEF00C60CBF /* ConfigureForTextFieldRootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfigureForTextFieldRootView.swift; sourceTree = ""; }; @@ -707,7 +707,6 @@ 87906C802B9BF759000EC960 /* MiSans-Semibold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "MiSans-Semibold.ttf"; sourceTree = ""; }; 8791081E28387537005D7B10 /* NetworkURL.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkURL.swift; sourceTree = ""; }; 87910820283875C0005D7B10 /* NetworkController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkController.swift; sourceTree = ""; }; - 87910822283875CF005D7B10 /* NetworkProtocols.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkProtocols.swift; sourceTree = ""; }; 87910829283877A4005D7B10 /* Network.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Network.swift; sourceTree = ""; }; 8791082E28387D1F005D7B10 /* String+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Extension.swift"; sourceTree = ""; }; 8791C1F127DCD050000D6BA9 /* Notification+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Notification+Extension.swift"; sourceTree = ""; }; @@ -753,7 +752,7 @@ 87B7A53B2AC02202002AFDFE /* SigninSelectRoute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SigninSelectRoute.swift; sourceTree = ""; }; 87B90B392BF4AEF600D6886E /* FirebaseRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseRepository.swift; sourceTree = ""; }; 87B90B3B2BF4B13D00D6886E /* AppVersionResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppVersionResponse.swift; sourceTree = ""; }; - 87B90B3E2BF4BC6D00D6886E /* ErrorResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorResponse.swift; sourceTree = ""; }; + 87B90B3E2BF4BC6D00D6886E /* TTErrorResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TTErrorResponse.swift; sourceTree = ""; }; 87B90B402BF4BFEE00D6886E /* TTProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TTProvider.swift; sourceTree = ""; }; 87BE88E62AD425BE0010A84A /* SigninTextFieldView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SigninTextFieldView.swift; sourceTree = ""; }; 87BEBEE8281C17000095CD29 /* RecordsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordsManager.swift; sourceTree = ""; }; @@ -799,7 +798,6 @@ 87D5E65228C7477100D53F8D /* MonthTime.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MonthTime.swift; sourceTree = ""; }; 87D7ED142952B3C100121DE6 /* TestUserSignupRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestUserSignupRequest.swift; sourceTree = ""; }; 87D7ED162952B69200121DE6 /* TestUserSigninRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestUserSigninRequest.swift; sourceTree = ""; }; - 87D7ED192952BA8800121DE6 /* JSONParameterEncoder+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "JSONParameterEncoder+Extension.swift"; sourceTree = ""; }; 87D83E842B285D4D003C40AE /* SettingLanguageVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingLanguageVC.swift; sourceTree = ""; }; 87D83E872B296069003C40AE /* TTSettingSelectableCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TTSettingSelectableCell.swift; sourceTree = ""; }; 87D83E892B2964EC003C40AE /* SettingLanguageListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingLanguageListView.swift; sourceTree = ""; }; @@ -1472,17 +1470,6 @@ path = SyncDailys; sourceTree = ""; }; - 8791081D2838752D005D7B10 /* Network */ = { - isa = PBXGroup; - children = ( - 875EDA332957E0360037A7EB /* NetworkInterceptor.swift */, - 87D7ED182952BA7200121DE6 /* Extension */, - 8791081E28387537005D7B10 /* NetworkURL.swift */, - 87910822283875CF005D7B10 /* NetworkProtocols.swift */, - ); - path = Network; - sourceTree = ""; - }; 8791C1EA27DCCDF4000D6BA9 /* Timer */ = { isa = PBXGroup; children = ( @@ -1612,15 +1599,6 @@ path = SharedCode; sourceTree = ""; }; - 87B90B3D2BF4BC0100D6886E /* Error */ = { - isa = PBXGroup; - children = ( - 87163DC72ACAF2E8008D4072 /* NetworkError.swift */, - 87B90B3E2BF4BC6D00D6886E /* ErrorResponse.swift */, - ); - path = Error; - sourceTree = ""; - }; 87BE88E52AD425A80010A84A /* LoginView */ = { isa = PBXGroup; children = ( @@ -1739,6 +1717,8 @@ 87F10938284C589A002E31EA /* FunctionResponse.swift */, 872C0EE5284AF31000E8E3F2 /* UpdateHistoryResponse.swift */, 875C98C62871BB26008F7ADD /* YoutubeLinkResponse.swift */, + 87B90B3E2BF4BC6D00D6886E /* TTErrorResponse.swift */, + 8722104C2C2FFA66003B97AD /* TTResponse.swift */, ); path = Response; sourceTree = ""; @@ -1805,15 +1785,6 @@ path = Model; sourceTree = ""; }; - 87D7ED182952BA7200121DE6 /* Extension */ = { - isa = PBXGroup; - children = ( - 87D7ED192952BA8800121DE6 /* JSONParameterEncoder+Extension.swift */, - 878BF7F02955F4600044C079 /* JSONDecoder+Extension.swift */, - ); - path = Extension; - sourceTree = ""; - }; 87D7ED1B2952E3DF00121DE6 /* TestServer */ = { isa = PBXGroup; children = ( @@ -1908,6 +1879,7 @@ 8751C6F928472A8D007FAFC4 /* Collection+Extension.swift */, 875FBE262AC91ED800B28723 /* CGPoint+Extension.swift */, 879BE31D2AC317DB007AAC46 /* CGSize+Extension.swift */, + 8722104E2C2FFD41003B97AD /* JSONDecoder+Extension.swift */, ); path = Foundation; sourceTree = ""; @@ -1945,14 +1917,15 @@ 87F778DC2B196E8F00909511 /* Data */ = { isa = PBXGroup; children = ( - 872210452C2FF575003B97AD /* lagacy */, 87B90B402BF4BFEE00D6886E /* TTProvider.swift */, - 87B90B3D2BF4BC0100D6886E /* Error */, + 87163DC72ACAF2E8008D4072 /* NetworkError.swift */, + 875EDA332957E0360037A7EB /* NetworkInterceptor.swift */, + 8791081E28387537005D7B10 /* NetworkURL.swift */, + 875FAE232B1C6710008F19D2 /* API */, + 87F778E12B196F7400909511 /* Repository */, 87D4DCCA2BA5476900BB5AAB /* Request */, 87D4DCCD2BA548E300BB5AAB /* Response */, - 87F778E12B196F7400909511 /* Repository */, - 875FAE232B1C6710008F19D2 /* API */, - 8791081D2838752D005D7B10 /* Network */, + 872210452C2FF575003B97AD /* lagacy */, ); path = Data; sourceTree = ""; @@ -2357,7 +2330,6 @@ 870800752B2D3C9A00830B39 /* DailysUseCase.swift in Sources */, 870800612B2C5FDA00830B39 /* AuthRepository_lagacy.swift in Sources */, 87CEDD3D28F5338B007ACF6E /* ColorSelectorVC.swift in Sources */, - 878BF7F12955F4600044C079 /* JSONDecoder+Extension.swift in Sources */, 8706C32C2AEF864000F7C842 /* TTSignupTitleView.swift in Sources */, 877911BC2A18922400F0A713 /* SettingListCellInfo.swift in Sources */, 8791081F28387537005D7B10 /* NetworkURL.swift in Sources */, @@ -2498,7 +2470,8 @@ 8791082F28387D1F005D7B10 /* String+Extension.swift in Sources */, 87D4DE112A0F83A500993C5C /* CalendarWidgetTaskData.swift in Sources */, 87459704263FEF6B00172C0F /* TimerVC.swift in Sources */, - 87B90B3F2BF4BC6D00D6886E /* ErrorResponse.swift in Sources */, + 87B90B3F2BF4BC6D00D6886E /* TTErrorResponse.swift in Sources */, + 8722104F2C2FFD41003B97AD /* JSONDecoder+Extension.swift in Sources */, 87A4704A26493D6E007B89D6 /* StaticCircularProgressView.swift in Sources */, 879E849C29C83D5100D65F48 /* RoundedShape.swift in Sources */, 87199F582883F2E00017D01A /* TimelineVM.swift in Sources */, @@ -2534,7 +2507,6 @@ 87BF666A28F80E9400CD6F19 /* NormalTimeLabelView.swift in Sources */, 87E6004B28426EBF008D17B9 /* SettingVC.swift in Sources */, 93B08523248DDF2F00E215BD /* SceneDelegate.swift in Sources */, - 87D7ED1A2952BA8800121DE6 /* JSONParameterEncoder+Extension.swift in Sources */, 875C98CB2871C0A7008F7ADD /* UIImage+Extension.swift in Sources */, 87459708263FF0F000172C0F /* Storage.swift in Sources */, 8788997F2894F03300B7F378 /* StandardWeekGraphView.swift in Sources */, @@ -2556,6 +2528,7 @@ 87AE748429062ACA00FA0A60 /* TimeSelectorPopupVC.swift in Sources */, 875C98BE287172A5008F7ADD /* FirebaseStringValue.swift in Sources */, 87024B102AE154630095CCB4 /* SignupEmailRoute.swift in Sources */, + 8722104D2C2FFA66003B97AD /* TTResponse.swift in Sources */, 04573A992877FD78008F8D44 /* CountdownTimeLabelView.swift in Sources */, 87BEBEED281C282D0095CD29 /* Times.swift in Sources */, 879BE3222AC40444007AAC46 /* SignupSigninVM.swift in Sources */, @@ -2573,7 +2546,6 @@ 8769349727E1BBAF00D33F51 /* TodoCell.swift in Sources */, 0437062D2869EC2200A5D3AA /* TimerTimeLabelVM.swift in Sources */, 878899882894F0B900B7F378 /* WeekTimelineVM.swift in Sources */, - 87910823283875CF005D7B10 /* NetworkProtocols.swift in Sources */, 875FAE252B1C6721008F19D2 /* AppVersionNetwork.swift in Sources */, 04F0D2B9286607A7007ED596 /* BaseSingleTimeLabelVM.swift in Sources */, 8751C6F428472066007FAFC4 /* SettingCell.swift in Sources */, diff --git a/Project_Timer/Data/Network/Extension/JSONDecoder+Extension.swift b/Project_Timer/Core/Extension/Foundation/JSONDecoder+Extension.swift similarity index 74% rename from Project_Timer/Data/Network/Extension/JSONDecoder+Extension.swift rename to Project_Timer/Core/Extension/Foundation/JSONDecoder+Extension.swift index 04b25ce6..d3d38c20 100644 --- a/Project_Timer/Data/Network/Extension/JSONDecoder+Extension.swift +++ b/Project_Timer/Core/Extension/Foundation/JSONDecoder+Extension.swift @@ -2,8 +2,8 @@ // JSONDecoder+Extension.swift // Project_Timer // -// Created by Kang Minsang on 2022/12/23. -// Copyright © 2022 FDEE. All rights reserved. +// Created by Kang Minsang on 2024/06/29. +// Copyright © 2024 FDEE. All rights reserved. // import Foundation diff --git a/Project_Timer/Data/Network/Extension/JSONParameterEncoder+Extension.swift b/Project_Timer/Data/Network/Extension/JSONParameterEncoder+Extension.swift deleted file mode 100644 index 46ed7e74..00000000 --- a/Project_Timer/Data/Network/Extension/JSONParameterEncoder+Extension.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// JSONParameterEncoder+Extension.swift -// Project_Timer -// -// Created by Kang Minsang on 2022/12/21. -// Copyright © 2022 FDEE. All rights reserved. -// - -import Foundation -import Alamofire - -extension JSONParameterEncoder { - static var dateFormatted: JSONParameterEncoder = { - let encoder = JSONEncoder() - encoder.dateEncodingStrategy = .iso8601 - return JSONParameterEncoder(encoder: encoder) - }() -} diff --git a/Project_Timer/Data/Network/NetworkProtocols.swift b/Project_Timer/Data/Network/NetworkProtocols.swift deleted file mode 100644 index 1d45863b..00000000 --- a/Project_Timer/Data/Network/NetworkProtocols.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// NetworkProtocols.swift -// Project_Timer -// -// Created by Kang Minsang on 2022/05/21. -// Copyright © 2022 FDEE. All rights reserved. -// - -import Foundation -import Alamofire - -protocol TiTiFunctionsFetchable { - func getTiTiFunctions_lagacy(completion: @escaping (Result<[FunctionInfo], NetworkError>) -> Void) -} - -protocol UpdateHistoryFetchable { - func getUpdateHistorys_lagacy(completion: @escaping (Result<[UpdateHistoryInfo], NetworkError>) -> Void) -} - -protocol YoutubeLinkFetchable { - func getYoutubeLink_lagacy(completion: @escaping (Result) -> Void) -} - -protocol SurveysFetchable { - func getSurveys_lagacy(completion: @escaping (Result<[SurveyInfo], NetworkError>) -> Void) -} diff --git a/Project_Timer/Data/Error/NetworkError.swift b/Project_Timer/Data/NetworkError.swift similarity index 94% rename from Project_Timer/Data/Error/NetworkError.swift rename to Project_Timer/Data/NetworkError.swift index bfbd7119..58474f31 100644 --- a/Project_Timer/Data/Error/NetworkError.swift +++ b/Project_Timer/Data/NetworkError.swift @@ -9,6 +9,7 @@ import Foundation import Moya +/// 네트워크 에러 enum NetworkError: Error { case FAIL case TIMEOUT @@ -18,7 +19,7 @@ enum NetworkError: Error { case NOTFOUND(String?) // 404 case CONFLICT(String?) // 409 case SERVERERROR(String?) // 500 - case ERRORRESPONSE(ErrorResponse) // TiTi ErrorResponse + case ERRORRESPONSE(TTErrorResponse) // TiTi ErrorResponse static func error(_ result: NetworkResult) -> NetworkError { switch result.status { @@ -52,7 +53,7 @@ enum NetworkError: Error { /// ErrorResponse 반환 static func errorResponse(_ response: Response) -> NetworkError { - guard let errorResponse = try? JSONDecoder().decode(ErrorResponse.self, from: response.data) else { + guard let errorResponse = try? JSONDecoder().decode(TTErrorResponse.self, from: response.data) else { return .serverError(statusCode: response.statusCode) } return .ERRORRESPONSE(errorResponse) diff --git a/Project_Timer/Data/Network/NetworkInterceptor.swift b/Project_Timer/Data/NetworkInterceptor.swift similarity index 98% rename from Project_Timer/Data/Network/NetworkInterceptor.swift rename to Project_Timer/Data/NetworkInterceptor.swift index 2bb7c495..a261cf51 100644 --- a/Project_Timer/Data/Network/NetworkInterceptor.swift +++ b/Project_Timer/Data/NetworkInterceptor.swift @@ -9,6 +9,7 @@ import Foundation import Alamofire +/// accessToken, refreshToken 주입 final class NetworkInterceptor: RequestInterceptor { static let retryLimit = 3 static let shared = NetworkInterceptor() diff --git a/Project_Timer/Data/Network/NetworkURL.swift b/Project_Timer/Data/NetworkURL.swift similarity index 100% rename from Project_Timer/Data/Network/NetworkURL.swift rename to Project_Timer/Data/NetworkURL.swift diff --git a/Project_Timer/Data/Error/ErrorResponse.swift b/Project_Timer/Data/Response/TTErrorResponse.swift similarity index 79% rename from Project_Timer/Data/Error/ErrorResponse.swift rename to Project_Timer/Data/Response/TTErrorResponse.swift index 7efdc75a..f2d3905c 100644 --- a/Project_Timer/Data/Error/ErrorResponse.swift +++ b/Project_Timer/Data/Response/TTErrorResponse.swift @@ -1,5 +1,5 @@ // -// ErrorResponse.swift +// TTErrorResponse.swift // Project_Timer // // Created by Kang Minsang on 2024/05/15. @@ -9,7 +9,7 @@ import Foundation /// TiTi 에러 -struct ErrorResponse: Decodable { +struct TTErrorResponse: Decodable { let code: String let message: String let errors: [String: String] diff --git a/Project_Timer/Data/Response/TTResponse.swift b/Project_Timer/Data/Response/TTResponse.swift new file mode 100644 index 00000000..24167fa7 --- /dev/null +++ b/Project_Timer/Data/Response/TTResponse.swift @@ -0,0 +1,14 @@ +// +// TTResponse.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/06/29. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation + +struct TTResponse: Decodable { + let code: String + let message: String +} diff --git a/Project_Timer/Data/lagacy/Network.swift b/Project_Timer/Data/lagacy/Network.swift index 95be3920..04fb1ca6 100644 --- a/Project_Timer/Data/lagacy/Network.swift +++ b/Project_Timer/Data/lagacy/Network.swift @@ -76,3 +76,11 @@ extension Network { return NetworkResult(status: status, data: data) } } + +extension JSONParameterEncoder { + static var dateFormatted: JSONParameterEncoder = { + let encoder = JSONEncoder() + encoder.dateEncodingStrategy = .iso8601 + return JSONParameterEncoder(encoder: encoder) + }() +} diff --git a/Project_Timer/Data/lagacy/NetworkController.swift b/Project_Timer/Data/lagacy/NetworkController.swift index 1f4700ab..51ee681c 100644 --- a/Project_Timer/Data/lagacy/NetworkController.swift +++ b/Project_Timer/Data/lagacy/NetworkController.swift @@ -7,6 +7,23 @@ // import Foundation +import Alamofire + +protocol TiTiFunctionsFetchable { + func getTiTiFunctions_lagacy(completion: @escaping (Result<[FunctionInfo], NetworkError>) -> Void) +} + +protocol UpdateHistoryFetchable { + func getUpdateHistorys_lagacy(completion: @escaping (Result<[UpdateHistoryInfo], NetworkError>) -> Void) +} + +protocol YoutubeLinkFetchable { + func getYoutubeLink_lagacy(completion: @escaping (Result) -> Void) +} + +protocol SurveysFetchable { + func getSurveys_lagacy(completion: @escaping (Result<[SurveyInfo], NetworkError>) -> Void) +} final class NetworkController { let network: Network From 138d552f1e98a581583cc2a11ac716db16da12a2 Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sat, 29 Jun 2024 18:00:42 +0900 Subject: [PATCH 18/44] =?UTF-8?q?chore=20#144:=20=EA=B8=B0=EC=A1=B4=20UseC?= =?UTF-8?q?ase=EB=93=A4=20lagacy=20=ED=8F=B4=EB=8D=94=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 44 +++++++++++-------- Project_Timer/AppDelegate.swift | 2 +- .../AppLatestVersionRepositoryInterface.swift | 0 .../AuthRepositoryInterface.swift | 0 .../{UseCase => lagacy}/AuthUseCase.swift | 0 .../DailyRepositoryInterface.swift | 0 .../{UseCase => lagacy}/DailysUseCase.swift | 0 .../GetLatestVersionUseCase_lagacy.swift} | 4 +- .../GetNotificationUseCase.swift | 0 .../GetServerURLUseCase.swift | 0 .../NotificationRepositoryInterface.swift | 0 .../NotificationUseCase.swift | 0 .../RecordTimesRepositoryInterface.swift | 0 .../RecordTimesUseCase.swift | 0 .../ServerURLRepositoryInterface.swift | 0 .../SyncLogRepositoryInterface.swift | 0 .../{UseCase => lagacy}/SyncLogUseCase.swift | 0 .../Present/Setting/Main/SettingVC.swift | 2 +- 18 files changed, 30 insertions(+), 22 deletions(-) rename Project_Timer/Domain/{Interface => lagacy}/AppLatestVersionRepositoryInterface.swift (100%) rename Project_Timer/Domain/{Interface => lagacy}/AuthRepositoryInterface.swift (100%) rename Project_Timer/Domain/{UseCase => lagacy}/AuthUseCase.swift (100%) rename Project_Timer/Domain/{Interface => lagacy}/DailyRepositoryInterface.swift (100%) rename Project_Timer/Domain/{UseCase => lagacy}/DailysUseCase.swift (100%) rename Project_Timer/Domain/{UseCase/GetLatestVersionUseCase.swift => lagacy/GetLatestVersionUseCase_lagacy.swift} (80%) rename Project_Timer/Domain/{UseCase => lagacy}/GetNotificationUseCase.swift (100%) rename Project_Timer/Domain/{UseCase => lagacy}/GetServerURLUseCase.swift (100%) rename Project_Timer/Domain/{Interface => lagacy}/NotificationRepositoryInterface.swift (100%) rename Project_Timer/Domain/{UseCase => lagacy}/NotificationUseCase.swift (100%) rename Project_Timer/Domain/{Interface => lagacy}/RecordTimesRepositoryInterface.swift (100%) rename Project_Timer/Domain/{UseCase => lagacy}/RecordTimesUseCase.swift (100%) rename Project_Timer/Domain/{Interface => lagacy}/ServerURLRepositoryInterface.swift (100%) rename Project_Timer/Domain/{Interface => lagacy}/SyncLogRepositoryInterface.swift (100%) rename Project_Timer/Domain/{UseCase => lagacy}/SyncLogUseCase.swift (100%) diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index 4dc9749b..54ae173b 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -192,7 +192,7 @@ 875FAE282B1C679D008F19D2 /* AppLatestVersionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE272B1C679D008F19D2 /* AppLatestVersionInfo.swift */; }; 875FAE2C2B1C6B57008F19D2 /* AppLatestVersionRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE2B2B1C6B57008F19D2 /* AppLatestVersionRepository.swift */; }; 875FAE2F2B1C7067008F19D2 /* AppLatestVersionRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE2E2B1C7067008F19D2 /* AppLatestVersionRepositoryInterface.swift */; }; - 875FAE312B1C70C2008F19D2 /* GetLatestVersionUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE302B1C70C2008F19D2 /* GetLatestVersionUseCase.swift */; }; + 875FAE312B1C70C2008F19D2 /* GetLatestVersionUseCase_lagacy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE302B1C70C2008F19D2 /* GetLatestVersionUseCase_lagacy.swift */; }; 875FAE352B1C718D008F19D2 /* GetLatestVersionUseCaseInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE342B1C718D008F19D2 /* GetLatestVersionUseCaseInterface.swift */; }; 875FAE372B1C74AD008F19D2 /* FirebaseBooleanValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE362B1C74AD008F19D2 /* FirebaseBooleanValue.swift */; }; 875FBE252AC9116B00B28723 /* UITextField+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FBE242AC9116B00B28723 /* UITextField+Extension.swift */; }; @@ -634,7 +634,7 @@ 875FAE272B1C679D008F19D2 /* AppLatestVersionInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLatestVersionInfo.swift; sourceTree = ""; }; 875FAE2B2B1C6B57008F19D2 /* AppLatestVersionRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLatestVersionRepository.swift; sourceTree = ""; }; 875FAE2E2B1C7067008F19D2 /* AppLatestVersionRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLatestVersionRepositoryInterface.swift; sourceTree = ""; }; - 875FAE302B1C70C2008F19D2 /* GetLatestVersionUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetLatestVersionUseCase.swift; sourceTree = ""; }; + 875FAE302B1C70C2008F19D2 /* GetLatestVersionUseCase_lagacy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetLatestVersionUseCase_lagacy.swift; sourceTree = ""; }; 875FAE342B1C718D008F19D2 /* GetLatestVersionUseCaseInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetLatestVersionUseCaseInterface.swift; sourceTree = ""; }; 875FAE362B1C74AD008F19D2 /* FirebaseBooleanValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseBooleanValue.swift; sourceTree = ""; }; 875FBE242AC9116B00B28723 /* UITextField+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITextField+Extension.swift"; sourceTree = ""; }; @@ -1048,6 +1048,28 @@ path = lagacy; sourceTree = ""; }; + 872210502C3003EB003B97AD /* lagacy */ = { + isa = PBXGroup; + children = ( + 875FAE2E2B1C7067008F19D2 /* AppLatestVersionRepositoryInterface.swift */, + 870800552B2C3AC600830B39 /* ServerURLRepositoryInterface.swift */, + 870800642B2C623600830B39 /* AuthRepositoryInterface.swift */, + 870800722B2CB11B00830B39 /* DailyRepositoryInterface.swift */, + 8708007C2B2D503600830B39 /* RecordTimesRepositoryInterface.swift */, + 8708008A2B2D5A4400830B39 /* SyncLogRepositoryInterface.swift */, + 873731D62B2E97C100D7BD9F /* NotificationRepositoryInterface.swift */, + 875FAE302B1C70C2008F19D2 /* GetLatestVersionUseCase_lagacy.swift */, + 870800572B2C3B0C00830B39 /* GetServerURLUseCase.swift */, + 870800662B2C67E900830B39 /* AuthUseCase.swift */, + 870800742B2D3C9A00830B39 /* DailysUseCase.swift */, + 8708007E2B2D543500830B39 /* RecordTimesUseCase.swift */, + 8708008C2B2D63D300830B39 /* SyncLogUseCase.swift */, + 873731D82B2E97FE00D7BD9F /* GetNotificationUseCase.swift */, + 87FB8D1A2B3C5DF300EA5693 /* NotificationUseCase.swift */, + ); + path = lagacy; + sourceTree = ""; + }; 872C0ED9284ADD6800E8E3F2 /* UpdateHistory */ = { isa = PBXGroup; children = ( @@ -1228,13 +1250,6 @@ 875FAE2D2B1C7058008F19D2 /* Interface */ = { isa = PBXGroup; children = ( - 875FAE2E2B1C7067008F19D2 /* AppLatestVersionRepositoryInterface.swift */, - 870800552B2C3AC600830B39 /* ServerURLRepositoryInterface.swift */, - 870800642B2C623600830B39 /* AuthRepositoryInterface.swift */, - 870800722B2CB11B00830B39 /* DailyRepositoryInterface.swift */, - 8708007C2B2D503600830B39 /* RecordTimesRepositoryInterface.swift */, - 8708008A2B2D5A4400830B39 /* SyncLogRepositoryInterface.swift */, - 873731D62B2E97C100D7BD9F /* NotificationRepositoryInterface.swift */, ); path = Interface; sourceTree = ""; @@ -1936,6 +1951,7 @@ 875FAE262B1C678E008F19D2 /* Entity */, 87F778E02B196EDF00909511 /* UseCase */, 875FAE2D2B1C7058008F19D2 /* Interface */, + 872210502C3003EB003B97AD /* lagacy */, ); path = Domain; sourceTree = ""; @@ -1943,14 +1959,6 @@ 87F778E02B196EDF00909511 /* UseCase */ = { isa = PBXGroup; children = ( - 875FAE302B1C70C2008F19D2 /* GetLatestVersionUseCase.swift */, - 870800572B2C3B0C00830B39 /* GetServerURLUseCase.swift */, - 870800662B2C67E900830B39 /* AuthUseCase.swift */, - 870800742B2D3C9A00830B39 /* DailysUseCase.swift */, - 8708007E2B2D543500830B39 /* RecordTimesUseCase.swift */, - 8708008C2B2D63D300830B39 /* SyncLogUseCase.swift */, - 873731D82B2E97FE00D7BD9F /* GetNotificationUseCase.swift */, - 87FB8D1A2B3C5DF300EA5693 /* NotificationUseCase.swift */, ); path = UseCase; sourceTree = ""; @@ -2560,7 +2568,7 @@ 8760FCBB29553F06000BCCD1 /* SyncDailysVC.swift in Sources */, 873977EB288D3FAA0025EE73 /* LogDailyVM.swift in Sources */, 87D3CF05288BAA1300ED33B7 /* ProgressDailyTaskCell.swift in Sources */, - 875FAE312B1C70C2008F19D2 /* GetLatestVersionUseCase.swift in Sources */, + 875FAE312B1C70C2008F19D2 /* GetLatestVersionUseCase_lagacy.swift in Sources */, 87199F48288303B60017D01A /* TasksProgressDailyGraphView.swift in Sources */, 87585AE22955A49F007E9139 /* SyncDeviceStatusView.swift in Sources */, 87789E44288BC1FC00759C01 /* TimeView.swift in Sources */, diff --git a/Project_Timer/AppDelegate.swift b/Project_Timer/AppDelegate.swift index c83613b8..298db1ce 100644 --- a/Project_Timer/AppDelegate.swift +++ b/Project_Timer/AppDelegate.swift @@ -103,7 +103,7 @@ extension AppDelegate: UNUserNotificationCenterDelegate { extension AppDelegate { private func checkLatestVersion(isLaunch: Bool) { /// 최신버전 체크로직 - let getLatestVersionUseCase = GetLatestVersionUseCase(repository: AppLatestVersionRepository()) + let getLatestVersionUseCase = GetLatestVersionUseCase_lagacy(repository: AppLatestVersionRepository()) getLatestVersionUseCase.getLatestVersion { result in switch result { diff --git a/Project_Timer/Domain/Interface/AppLatestVersionRepositoryInterface.swift b/Project_Timer/Domain/lagacy/AppLatestVersionRepositoryInterface.swift similarity index 100% rename from Project_Timer/Domain/Interface/AppLatestVersionRepositoryInterface.swift rename to Project_Timer/Domain/lagacy/AppLatestVersionRepositoryInterface.swift diff --git a/Project_Timer/Domain/Interface/AuthRepositoryInterface.swift b/Project_Timer/Domain/lagacy/AuthRepositoryInterface.swift similarity index 100% rename from Project_Timer/Domain/Interface/AuthRepositoryInterface.swift rename to Project_Timer/Domain/lagacy/AuthRepositoryInterface.swift diff --git a/Project_Timer/Domain/UseCase/AuthUseCase.swift b/Project_Timer/Domain/lagacy/AuthUseCase.swift similarity index 100% rename from Project_Timer/Domain/UseCase/AuthUseCase.swift rename to Project_Timer/Domain/lagacy/AuthUseCase.swift diff --git a/Project_Timer/Domain/Interface/DailyRepositoryInterface.swift b/Project_Timer/Domain/lagacy/DailyRepositoryInterface.swift similarity index 100% rename from Project_Timer/Domain/Interface/DailyRepositoryInterface.swift rename to Project_Timer/Domain/lagacy/DailyRepositoryInterface.swift diff --git a/Project_Timer/Domain/UseCase/DailysUseCase.swift b/Project_Timer/Domain/lagacy/DailysUseCase.swift similarity index 100% rename from Project_Timer/Domain/UseCase/DailysUseCase.swift rename to Project_Timer/Domain/lagacy/DailysUseCase.swift diff --git a/Project_Timer/Domain/UseCase/GetLatestVersionUseCase.swift b/Project_Timer/Domain/lagacy/GetLatestVersionUseCase_lagacy.swift similarity index 80% rename from Project_Timer/Domain/UseCase/GetLatestVersionUseCase.swift rename to Project_Timer/Domain/lagacy/GetLatestVersionUseCase_lagacy.swift index f726fa6e..01b30b87 100644 --- a/Project_Timer/Domain/UseCase/GetLatestVersionUseCase.swift +++ b/Project_Timer/Domain/lagacy/GetLatestVersionUseCase_lagacy.swift @@ -1,5 +1,5 @@ // -// GetLatestVersionUseCase.swift +// GetLatestVersionUseCase_lagacy.swift // Project_Timer // // Created by Kang Minsang on 2023/12/03. @@ -8,7 +8,7 @@ import Foundation -final class GetLatestVersionUseCase: GetLatestVersionUseCaseInterface { +final class GetLatestVersionUseCase_lagacy: GetLatestVersionUseCaseInterface { let repository: AppLatestVersionRepositoryInterface init(repository: AppLatestVersionRepositoryInterface) { diff --git a/Project_Timer/Domain/UseCase/GetNotificationUseCase.swift b/Project_Timer/Domain/lagacy/GetNotificationUseCase.swift similarity index 100% rename from Project_Timer/Domain/UseCase/GetNotificationUseCase.swift rename to Project_Timer/Domain/lagacy/GetNotificationUseCase.swift diff --git a/Project_Timer/Domain/UseCase/GetServerURLUseCase.swift b/Project_Timer/Domain/lagacy/GetServerURLUseCase.swift similarity index 100% rename from Project_Timer/Domain/UseCase/GetServerURLUseCase.swift rename to Project_Timer/Domain/lagacy/GetServerURLUseCase.swift diff --git a/Project_Timer/Domain/Interface/NotificationRepositoryInterface.swift b/Project_Timer/Domain/lagacy/NotificationRepositoryInterface.swift similarity index 100% rename from Project_Timer/Domain/Interface/NotificationRepositoryInterface.swift rename to Project_Timer/Domain/lagacy/NotificationRepositoryInterface.swift diff --git a/Project_Timer/Domain/UseCase/NotificationUseCase.swift b/Project_Timer/Domain/lagacy/NotificationUseCase.swift similarity index 100% rename from Project_Timer/Domain/UseCase/NotificationUseCase.swift rename to Project_Timer/Domain/lagacy/NotificationUseCase.swift diff --git a/Project_Timer/Domain/Interface/RecordTimesRepositoryInterface.swift b/Project_Timer/Domain/lagacy/RecordTimesRepositoryInterface.swift similarity index 100% rename from Project_Timer/Domain/Interface/RecordTimesRepositoryInterface.swift rename to Project_Timer/Domain/lagacy/RecordTimesRepositoryInterface.swift diff --git a/Project_Timer/Domain/UseCase/RecordTimesUseCase.swift b/Project_Timer/Domain/lagacy/RecordTimesUseCase.swift similarity index 100% rename from Project_Timer/Domain/UseCase/RecordTimesUseCase.swift rename to Project_Timer/Domain/lagacy/RecordTimesUseCase.swift diff --git a/Project_Timer/Domain/Interface/ServerURLRepositoryInterface.swift b/Project_Timer/Domain/lagacy/ServerURLRepositoryInterface.swift similarity index 100% rename from Project_Timer/Domain/Interface/ServerURLRepositoryInterface.swift rename to Project_Timer/Domain/lagacy/ServerURLRepositoryInterface.swift diff --git a/Project_Timer/Domain/Interface/SyncLogRepositoryInterface.swift b/Project_Timer/Domain/lagacy/SyncLogRepositoryInterface.swift similarity index 100% rename from Project_Timer/Domain/Interface/SyncLogRepositoryInterface.swift rename to Project_Timer/Domain/lagacy/SyncLogRepositoryInterface.swift diff --git a/Project_Timer/Domain/UseCase/SyncLogUseCase.swift b/Project_Timer/Domain/lagacy/SyncLogUseCase.swift similarity index 100% rename from Project_Timer/Domain/UseCase/SyncLogUseCase.swift rename to Project_Timer/Domain/lagacy/SyncLogUseCase.swift diff --git a/Project_Timer/Present/Setting/Main/SettingVC.swift b/Project_Timer/Present/Setting/Main/SettingVC.swift index a426e187..e65c95b5 100644 --- a/Project_Timer/Present/Setting/Main/SettingVC.swift +++ b/Project_Timer/Present/Setting/Main/SettingVC.swift @@ -60,7 +60,7 @@ extension SettingVC { } private func configureViewModel() { - let getLatestVersionUseCase = GetLatestVersionUseCase(repository: AppLatestVersionRepository()) + let getLatestVersionUseCase = GetLatestVersionUseCase_lagacy(repository: AppLatestVersionRepository()) self.viewModel = SettingVM(getLatestVersionUseCase: getLatestVersionUseCase, isIpad: UIDevice.current.userInterfaceIdiom == .pad) } From 1a7e0db18967c8abd0b53f3c407e9cb4eacfbf18 Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sat, 29 Jun 2024 18:12:46 +0900 Subject: [PATCH 19/44] =?UTF-8?q?feat=20#144:=20NetworkController=20?= =?UTF-8?q?=EB=82=B4=20=ED=95=A8=EC=88=98=EB=93=A4=20FirebaseRepository=20?= =?UTF-8?q?=EB=82=B4=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Data/Repository/FirebaseRepository.swift | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/Project_Timer/Data/Repository/FirebaseRepository.swift b/Project_Timer/Data/Repository/FirebaseRepository.swift index e78b0a1f..f9b04b11 100644 --- a/Project_Timer/Data/Repository/FirebaseRepository.swift +++ b/Project_Timer/Data/Repository/FirebaseRepository.swift @@ -31,4 +31,32 @@ final class FirebaseRepository { .map { $0.base.value } .catchDecodeError() } + + func getTiTiFunctions() -> AnyPublisher<[FunctionInfo], NetworkError> { + return self.api.requestPublisher(.getTiTiFunctions) + .map(FunctionResponse.self) + .map { $0.functionInfos } + .catchDecodeError() + } + + func getUpdateHistorys() -> AnyPublisher<[UpdateHistoryInfo], NetworkError> { + return self.api.requestPublisher(.getUpdateHistorys) + .map(UpdateHistoryResponse.self) + .map { $0.updateInfos } + .catchDecodeError() + } + + func getYoutubeLink() -> AnyPublisher { + return self.api.requestPublisher(.getYoutubeLink) + .map(YoutubeLinkResponse.self) + .map { $0.url.value } + .catchDecodeError() + } + + func getSurveys() -> AnyPublisher<[SurveyInfo], NetworkError> { + return self.api.requestPublisher(.getSurveys) + .map(SurveyResponse.self) + .map { $0.surveyInfos ?? [] } + .catchDecodeError() + } } From 60b8304b39fe467adacf0ccfb4533fa8964735cd Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sat, 29 Jun 2024 18:19:13 +0900 Subject: [PATCH 20/44] =?UTF-8?q?feat=20#144:=20FirebaseUseCase=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 4 ++ .../Domain/UseCase/FirebaseUseCase.swift | 39 +++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 Project_Timer/Domain/UseCase/FirebaseUseCase.swift diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index 54ae173b..91278f55 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -120,6 +120,7 @@ 8722104B2C2FF6E7003B97AD /* UpdateHistoryInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8722104A2C2FF6E7003B97AD /* UpdateHistoryInfo.swift */; }; 8722104D2C2FFA66003B97AD /* TTResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8722104C2C2FFA66003B97AD /* TTResponse.swift */; }; 8722104F2C2FFD41003B97AD /* JSONDecoder+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8722104E2C2FFD41003B97AD /* JSONDecoder+Extension.swift */; }; + 872210522C3007FD003B97AD /* FirebaseUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872210512C3007FD003B97AD /* FirebaseUseCase.swift */; }; 872C0EDB284ADD8300E8E3F2 /* SettingUpdateHistoryVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872C0EDA284ADD8300E8E3F2 /* SettingUpdateHistoryVC.swift */; }; 872C0EDE284AE52800E8E3F2 /* SettingFunctionsListVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872C0EDD284AE52800E8E3F2 /* SettingFunctionsListVC.swift */; }; 872C0EE1284AE57200E8E3F2 /* SettingTiTiLabVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872C0EE0284AE57200E8E3F2 /* SettingTiTiLabVC.swift */; }; @@ -561,6 +562,7 @@ 8722104A2C2FF6E7003B97AD /* UpdateHistoryInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateHistoryInfo.swift; sourceTree = ""; }; 8722104C2C2FFA66003B97AD /* TTResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TTResponse.swift; sourceTree = ""; }; 8722104E2C2FFD41003B97AD /* JSONDecoder+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "JSONDecoder+Extension.swift"; sourceTree = ""; }; + 872210512C3007FD003B97AD /* FirebaseUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseUseCase.swift; sourceTree = ""; }; 872B7552296A625B00D24394 /* production.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = production.xcconfig; sourceTree = ""; }; 872C0EDA284ADD8300E8E3F2 /* SettingUpdateHistoryVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingUpdateHistoryVC.swift; sourceTree = ""; }; 872C0EDD284AE52800E8E3F2 /* SettingFunctionsListVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingFunctionsListVC.swift; sourceTree = ""; }; @@ -1959,6 +1961,7 @@ 87F778E02B196EDF00909511 /* UseCase */ = { isa = PBXGroup; children = ( + 872210512C3007FD003B97AD /* FirebaseUseCase.swift */, ); path = UseCase; sourceTree = ""; @@ -2454,6 +2457,7 @@ 878813E32A2084F5000ED2C1 /* CloseButton.swift in Sources */, 87A48BC727DEF0C200F46D0F /* Date+Extension.swift in Sources */, 871AB699296709C100AFED1C /* TimeTableDailyGraphView.swift in Sources */, + 872210522C3007FD003B97AD /* FirebaseUseCase.swift in Sources */, 87DC6A4728D00DF400455A06 /* WeekView.swift in Sources */, 873731DF2B2EA2B000D7BD9F /* FirestoreValue.swift in Sources */, 8706C32E2AEF878D00F7C842 /* TTSignupTextFieldUnderlineView.swift in Sources */, diff --git a/Project_Timer/Domain/UseCase/FirebaseUseCase.swift b/Project_Timer/Domain/UseCase/FirebaseUseCase.swift new file mode 100644 index 00000000..3d491c42 --- /dev/null +++ b/Project_Timer/Domain/UseCase/FirebaseUseCase.swift @@ -0,0 +1,39 @@ +// +// FirebaseUseCase.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/06/29. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Combine + +final class FirebaseUseCase { + private let repository: FirebaseRepository // TODO: 프로토콜로 수정 + + init(repository: FirebaseRepository) { + self.repository = repository + } + + func getAppVersion() -> AnyPublisher { + return self.repository.getAppVersion() + } + + func getServerURL() -> AnyPublisher { + return self.repository.getServerURL() + } + + func getTiTiFunctions() -> AnyPublisher<[FunctionInfo], NetworkError> { + return self.repository.getTiTiFunctions() + } + + func getUpdateHistorys() -> AnyPublisher<[UpdateHistoryInfo], NetworkError> { + return self.repository.getUpdateHistorys() + } + + func getYoutubeLink() -> AnyPublisher { + return self.repository.getYoutubeLink() + } +} + From c367b9c56d14352efa6d3a6e5d4ea3b998fd62ca Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sat, 29 Jun 2024 18:27:07 +0900 Subject: [PATCH 21/44] =?UTF-8?q?feat=20#144:=20Firebase=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20UseCase=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 44 +++++++++++++++---- Project_Timer/Data/NetworkURL.swift | 2 +- .../Firebase/GetAppVersionUseCase.swift | 22 ++++++++++ .../Firebase/GetServerURLUseCase.swift | 22 ++++++++++ .../UseCase/Firebase/GetSurveysUseCase.swift | 22 ++++++++++ .../Firebase/GetTiTiFunctionsUseCase.swift | 22 ++++++++++ .../Firebase/GetUpdateHistorysUseCase.swift | 22 ++++++++++ .../Firebase/GetYoutubeLinkUseCase.swift | 22 ++++++++++ .../Domain/UseCase/FirebaseUseCase.swift | 39 ---------------- ...swift => GetServerURLUseCase_lagacy.swift} | 4 +- 10 files changed, 171 insertions(+), 50 deletions(-) create mode 100644 Project_Timer/Domain/UseCase/Firebase/GetAppVersionUseCase.swift create mode 100644 Project_Timer/Domain/UseCase/Firebase/GetServerURLUseCase.swift create mode 100644 Project_Timer/Domain/UseCase/Firebase/GetSurveysUseCase.swift create mode 100644 Project_Timer/Domain/UseCase/Firebase/GetTiTiFunctionsUseCase.swift create mode 100644 Project_Timer/Domain/UseCase/Firebase/GetUpdateHistorysUseCase.swift create mode 100644 Project_Timer/Domain/UseCase/Firebase/GetYoutubeLinkUseCase.swift delete mode 100644 Project_Timer/Domain/UseCase/FirebaseUseCase.swift rename Project_Timer/Domain/lagacy/{GetServerURLUseCase.swift => GetServerURLUseCase_lagacy.swift} (81%) diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index 91278f55..815b3162 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -50,7 +50,7 @@ 870800522B2C3A0800830B39 /* ServerURLResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800512B2C3A0800830B39 /* ServerURLResponse.swift */; }; 870800542B2C3A5400830B39 /* ServerURLRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800532B2C3A5400830B39 /* ServerURLRepository.swift */; }; 870800562B2C3AC600830B39 /* ServerURLRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800552B2C3AC600830B39 /* ServerURLRepositoryInterface.swift */; }; - 870800582B2C3B0C00830B39 /* GetServerURLUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800572B2C3B0C00830B39 /* GetServerURLUseCase.swift */; }; + 870800582B2C3B0C00830B39 /* GetServerURLUseCase_lagacy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800572B2C3B0C00830B39 /* GetServerURLUseCase_lagacy.swift */; }; 8708005A2B2C3B5800830B39 /* GetServerURLUseCaseInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800592B2C3B5800830B39 /* GetServerURLUseCaseInterface.swift */; }; 8708005C2B2C4D2D00830B39 /* AuthNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708005B2B2C4D2D00830B39 /* AuthNetwork.swift */; }; 8708005F2B2C5F5F00830B39 /* AuthResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708005E2B2C5F5F00830B39 /* AuthResponse.swift */; }; @@ -120,7 +120,12 @@ 8722104B2C2FF6E7003B97AD /* UpdateHistoryInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8722104A2C2FF6E7003B97AD /* UpdateHistoryInfo.swift */; }; 8722104D2C2FFA66003B97AD /* TTResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8722104C2C2FFA66003B97AD /* TTResponse.swift */; }; 8722104F2C2FFD41003B97AD /* JSONDecoder+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8722104E2C2FFD41003B97AD /* JSONDecoder+Extension.swift */; }; - 872210522C3007FD003B97AD /* FirebaseUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872210512C3007FD003B97AD /* FirebaseUseCase.swift */; }; + 872210522C3007FD003B97AD /* GetAppVersionUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872210512C3007FD003B97AD /* GetAppVersionUseCase.swift */; }; + 872210552C30094F003B97AD /* GetServerURLUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872210542C30094F003B97AD /* GetServerURLUseCase.swift */; }; + 872210572C3009DA003B97AD /* GetTiTiFunctionsUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872210562C3009DA003B97AD /* GetTiTiFunctionsUseCase.swift */; }; + 872210592C300A08003B97AD /* GetUpdateHistorysUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872210582C300A08003B97AD /* GetUpdateHistorysUseCase.swift */; }; + 8722105B2C300A5C003B97AD /* GetYoutubeLinkUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8722105A2C300A5C003B97AD /* GetYoutubeLinkUseCase.swift */; }; + 8722105D2C300A8C003B97AD /* GetSurveysUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8722105C2C300A8C003B97AD /* GetSurveysUseCase.swift */; }; 872C0EDB284ADD8300E8E3F2 /* SettingUpdateHistoryVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872C0EDA284ADD8300E8E3F2 /* SettingUpdateHistoryVC.swift */; }; 872C0EDE284AE52800E8E3F2 /* SettingFunctionsListVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872C0EDD284AE52800E8E3F2 /* SettingFunctionsListVC.swift */; }; 872C0EE1284AE57200E8E3F2 /* SettingTiTiLabVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872C0EE0284AE57200E8E3F2 /* SettingTiTiLabVC.swift */; }; @@ -495,7 +500,7 @@ 870800512B2C3A0800830B39 /* ServerURLResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerURLResponse.swift; sourceTree = ""; }; 870800532B2C3A5400830B39 /* ServerURLRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerURLRepository.swift; sourceTree = ""; }; 870800552B2C3AC600830B39 /* ServerURLRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerURLRepositoryInterface.swift; sourceTree = ""; }; - 870800572B2C3B0C00830B39 /* GetServerURLUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetServerURLUseCase.swift; sourceTree = ""; }; + 870800572B2C3B0C00830B39 /* GetServerURLUseCase_lagacy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetServerURLUseCase_lagacy.swift; sourceTree = ""; }; 870800592B2C3B5800830B39 /* GetServerURLUseCaseInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetServerURLUseCaseInterface.swift; sourceTree = ""; }; 8708005B2B2C4D2D00830B39 /* AuthNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthNetwork.swift; sourceTree = ""; }; 8708005E2B2C5F5F00830B39 /* AuthResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthResponse.swift; sourceTree = ""; }; @@ -562,7 +567,12 @@ 8722104A2C2FF6E7003B97AD /* UpdateHistoryInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateHistoryInfo.swift; sourceTree = ""; }; 8722104C2C2FFA66003B97AD /* TTResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TTResponse.swift; sourceTree = ""; }; 8722104E2C2FFD41003B97AD /* JSONDecoder+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "JSONDecoder+Extension.swift"; sourceTree = ""; }; - 872210512C3007FD003B97AD /* FirebaseUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseUseCase.swift; sourceTree = ""; }; + 872210512C3007FD003B97AD /* GetAppVersionUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetAppVersionUseCase.swift; sourceTree = ""; }; + 872210542C30094F003B97AD /* GetServerURLUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetServerURLUseCase.swift; sourceTree = ""; }; + 872210562C3009DA003B97AD /* GetTiTiFunctionsUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetTiTiFunctionsUseCase.swift; sourceTree = ""; }; + 872210582C300A08003B97AD /* GetUpdateHistorysUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetUpdateHistorysUseCase.swift; sourceTree = ""; }; + 8722105A2C300A5C003B97AD /* GetYoutubeLinkUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetYoutubeLinkUseCase.swift; sourceTree = ""; }; + 8722105C2C300A8C003B97AD /* GetSurveysUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetSurveysUseCase.swift; sourceTree = ""; }; 872B7552296A625B00D24394 /* production.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = production.xcconfig; sourceTree = ""; }; 872C0EDA284ADD8300E8E3F2 /* SettingUpdateHistoryVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingUpdateHistoryVC.swift; sourceTree = ""; }; 872C0EDD284AE52800E8E3F2 /* SettingFunctionsListVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingFunctionsListVC.swift; sourceTree = ""; }; @@ -1061,7 +1071,7 @@ 8708008A2B2D5A4400830B39 /* SyncLogRepositoryInterface.swift */, 873731D62B2E97C100D7BD9F /* NotificationRepositoryInterface.swift */, 875FAE302B1C70C2008F19D2 /* GetLatestVersionUseCase_lagacy.swift */, - 870800572B2C3B0C00830B39 /* GetServerURLUseCase.swift */, + 870800572B2C3B0C00830B39 /* GetServerURLUseCase_lagacy.swift */, 870800662B2C67E900830B39 /* AuthUseCase.swift */, 870800742B2D3C9A00830B39 /* DailysUseCase.swift */, 8708007E2B2D543500830B39 /* RecordTimesUseCase.swift */, @@ -1072,6 +1082,19 @@ path = lagacy; sourceTree = ""; }; + 872210532C300922003B97AD /* Firebase */ = { + isa = PBXGroup; + children = ( + 872210512C3007FD003B97AD /* GetAppVersionUseCase.swift */, + 872210542C30094F003B97AD /* GetServerURLUseCase.swift */, + 872210562C3009DA003B97AD /* GetTiTiFunctionsUseCase.swift */, + 872210582C300A08003B97AD /* GetUpdateHistorysUseCase.swift */, + 8722105A2C300A5C003B97AD /* GetYoutubeLinkUseCase.swift */, + 8722105C2C300A8C003B97AD /* GetSurveysUseCase.swift */, + ); + path = Firebase; + sourceTree = ""; + }; 872C0ED9284ADD6800E8E3F2 /* UpdateHistory */ = { isa = PBXGroup; children = ( @@ -1961,7 +1984,7 @@ 87F778E02B196EDF00909511 /* UseCase */ = { isa = PBXGroup; children = ( - 872210512C3007FD003B97AD /* FirebaseUseCase.swift */, + 872210532C300922003B97AD /* Firebase */, ); path = UseCase; sourceTree = ""; @@ -2265,6 +2288,7 @@ 877911B22A188A3200F0A713 /* SettingSwitchListVC.swift in Sources */, 870800712B2CAD9900830B39 /* TaskHistory.swift in Sources */, 87163DC82ACAF2E8008D4072 /* NetworkError.swift in Sources */, + 872210572C3009DA003B97AD /* GetTiTiFunctionsUseCase.swift in Sources */, 87D5E65028C7460100D53F8D /* MonthSmallVM.swift in Sources */, 879D20742A190DE900D8A420 /* LogSettingVC.swift in Sources */, 8721C6DD296944EE00410D57 /* ChangePrevGraphButton.swift in Sources */, @@ -2457,7 +2481,7 @@ 878813E32A2084F5000ED2C1 /* CloseButton.swift in Sources */, 87A48BC727DEF0C200F46D0F /* Date+Extension.swift in Sources */, 871AB699296709C100AFED1C /* TimeTableDailyGraphView.swift in Sources */, - 872210522C3007FD003B97AD /* FirebaseUseCase.swift in Sources */, + 872210522C3007FD003B97AD /* GetAppVersionUseCase.swift in Sources */, 87DC6A4728D00DF400455A06 /* WeekView.swift in Sources */, 873731DF2B2EA2B000D7BD9F /* FirestoreValue.swift in Sources */, 8706C32E2AEF878D00F7C842 /* TTSignupTextFieldUnderlineView.swift in Sources */, @@ -2530,10 +2554,11 @@ 871AB69D2967C9D100AFED1C /* TimeTableVM.swift in Sources */, 8708006B2B2CA57C00830B39 /* DailysNetwork.swift in Sources */, 872210422C2FEE83003B97AD /* SyncLogRepository.swift in Sources */, - 870800582B2C3B0C00830B39 /* GetServerURLUseCase.swift in Sources */, + 870800582B2C3B0C00830B39 /* GetServerURLUseCase_lagacy.swift in Sources */, 87D4DCD22BA5A4C400BB5AAB /* ResetPasswordEmailView.swift in Sources */, 878813E52A209BA0000ED2C1 /* HowToAddWidgetVC.swift in Sources */, 8708007B2B2D4F0800830B39 /* RecordTimesRepository_lagacy.swift in Sources */, + 8722105D2C300A8C003B97AD /* GetSurveysUseCase.swift in Sources */, 8765234C28C7948700487BFB /* TotalTime.swift in Sources */, 87A7F5D4267270F800F69EBA /* Todo.swift in Sources */, 879D207F2A19D40400D8A420 /* Updateable.swift in Sources */, @@ -2557,6 +2582,7 @@ 875FAE352B1C718D008F19D2 /* GetLatestVersionUseCaseInterface.swift in Sources */, 8769349727E1BBAF00D33F51 /* TodoCell.swift in Sources */, 0437062D2869EC2200A5D3AA /* TimerTimeLabelVM.swift in Sources */, + 872210592C300A08003B97AD /* GetUpdateHistorysUseCase.swift in Sources */, 878899882894F0B900B7F378 /* WeekTimelineVM.swift in Sources */, 875FAE252B1C6721008F19D2 /* AppVersionNetwork.swift in Sources */, 04F0D2B9286607A7007ED596 /* BaseSingleTimeLabelVM.swift in Sources */, @@ -2591,6 +2617,7 @@ 87D4DCE82BA6A8AA00BB5AAB /* TTBottomRoundButtonView.swift in Sources */, 875FAE2C2B1C6B57008F19D2 /* AppLatestVersionRepository.swift in Sources */, 04504C602864AC3C00CA4C69 /* BaseTimeLabelVM.swift in Sources */, + 8722105B2C300A5C003B97AD /* GetYoutubeLinkUseCase.swift in Sources */, 8772E91626705EE100A191BF /* TodolistVC.swift in Sources */, 87B539AB299BB710001E354C /* Versions.swift in Sources */, 87862E892B2DBBDA004ED313 /* PopupVC.swift in Sources */, @@ -2603,6 +2630,7 @@ 8708007F2B2D543500830B39 /* RecordTimesUseCase.swift in Sources */, 8708005F2B2C5F5F00830B39 /* AuthResponse.swift in Sources */, 8721C6D72969123E00410D57 /* IOUsecase.swift in Sources */, + 872210552C30094F003B97AD /* GetServerURLUseCase.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Project_Timer/Data/NetworkURL.swift b/Project_Timer/Data/NetworkURL.swift index 90ab13c0..55272242 100644 --- a/Project_Timer/Data/NetworkURL.swift +++ b/Project_Timer/Data/NetworkURL.swift @@ -18,7 +18,7 @@ class NetworkURL { } func updateServerURL(completion: @escaping () -> Void) { - let getServerURLUseCase = GetServerURLUseCase(repository: ServerURLRepository()) + let getServerURLUseCase = GetServerURLUseCase_lagacy(repository: ServerURLRepository()) getServerURLUseCase.getServerURL { [weak self] result in switch result { case .success(let url): diff --git a/Project_Timer/Domain/UseCase/Firebase/GetAppVersionUseCase.swift b/Project_Timer/Domain/UseCase/Firebase/GetAppVersionUseCase.swift new file mode 100644 index 00000000..f518c90b --- /dev/null +++ b/Project_Timer/Domain/UseCase/Firebase/GetAppVersionUseCase.swift @@ -0,0 +1,22 @@ +// +// GetAppVersionUseCase.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/06/29. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Combine + +final class GetAppVersionUseCase { + private let repository: FirebaseRepository // TODO: 프로토콜로 수정 + + init(repository: FirebaseRepository) { + self.repository = repository + } + + func execute() -> AnyPublisher { + return self.repository.getAppVersion() + } +} diff --git a/Project_Timer/Domain/UseCase/Firebase/GetServerURLUseCase.swift b/Project_Timer/Domain/UseCase/Firebase/GetServerURLUseCase.swift new file mode 100644 index 00000000..b7e80602 --- /dev/null +++ b/Project_Timer/Domain/UseCase/Firebase/GetServerURLUseCase.swift @@ -0,0 +1,22 @@ +// +// GetServerURLUseCase.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/06/29. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Combine + +final class GetServerURLUseCasee { + private let repository: FirebaseRepository // TODO: 프로토콜로 수정 + + init(repository: FirebaseRepository) { + self.repository = repository + } + + func execute() -> AnyPublisher { + return self.repository.getServerURL() + } +} diff --git a/Project_Timer/Domain/UseCase/Firebase/GetSurveysUseCase.swift b/Project_Timer/Domain/UseCase/Firebase/GetSurveysUseCase.swift new file mode 100644 index 00000000..d80ce932 --- /dev/null +++ b/Project_Timer/Domain/UseCase/Firebase/GetSurveysUseCase.swift @@ -0,0 +1,22 @@ +// +// GetSurveysUseCase.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/06/29. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Combine + +final class GetSurveysUseCase { + private let repository: FirebaseRepository // TODO: 프로토콜로 수정 + + init(repository: FirebaseRepository) { + self.repository = repository + } + + func execute() -> AnyPublisher<[SurveyInfo], NetworkError> { + return self.repository.getSurveys() + } +} diff --git a/Project_Timer/Domain/UseCase/Firebase/GetTiTiFunctionsUseCase.swift b/Project_Timer/Domain/UseCase/Firebase/GetTiTiFunctionsUseCase.swift new file mode 100644 index 00000000..334dbfb7 --- /dev/null +++ b/Project_Timer/Domain/UseCase/Firebase/GetTiTiFunctionsUseCase.swift @@ -0,0 +1,22 @@ +// +// GetTiTiFunctionsUseCase.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/06/29. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Combine + +final class GetTiTiFunctionsUseCase { + private let repository: FirebaseRepository // TODO: 프로토콜로 수정 + + init(repository: FirebaseRepository) { + self.repository = repository + } + + func execute() -> AnyPublisher<[FunctionInfo], NetworkError> { + return self.repository.getTiTiFunctions() + } +} diff --git a/Project_Timer/Domain/UseCase/Firebase/GetUpdateHistorysUseCase.swift b/Project_Timer/Domain/UseCase/Firebase/GetUpdateHistorysUseCase.swift new file mode 100644 index 00000000..1a44d996 --- /dev/null +++ b/Project_Timer/Domain/UseCase/Firebase/GetUpdateHistorysUseCase.swift @@ -0,0 +1,22 @@ +// +// GetUpdateHistorysUseCase.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/06/29. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Combine + +final class GetUpdateHistorysUseCase { + private let repository: FirebaseRepository // TODO: 프로토콜로 수정 + + init(repository: FirebaseRepository) { + self.repository = repository + } + + func execute() -> AnyPublisher<[UpdateHistoryInfo], NetworkError> { + return self.repository.getUpdateHistorys() + } +} diff --git a/Project_Timer/Domain/UseCase/Firebase/GetYoutubeLinkUseCase.swift b/Project_Timer/Domain/UseCase/Firebase/GetYoutubeLinkUseCase.swift new file mode 100644 index 00000000..0fad765d --- /dev/null +++ b/Project_Timer/Domain/UseCase/Firebase/GetYoutubeLinkUseCase.swift @@ -0,0 +1,22 @@ +// +// GetYoutubeLinkUseCase.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/06/29. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Combine + +final class GetYoutubeLinkUseCase { + private let repository: FirebaseRepository // TODO: 프로토콜로 수정 + + init(repository: FirebaseRepository) { + self.repository = repository + } + + func execute() -> AnyPublisher { + return self.repository.getYoutubeLink() + } +} diff --git a/Project_Timer/Domain/UseCase/FirebaseUseCase.swift b/Project_Timer/Domain/UseCase/FirebaseUseCase.swift deleted file mode 100644 index 3d491c42..00000000 --- a/Project_Timer/Domain/UseCase/FirebaseUseCase.swift +++ /dev/null @@ -1,39 +0,0 @@ -// -// FirebaseUseCase.swift -// Project_Timer -// -// Created by Kang Minsang on 2024/06/29. -// Copyright © 2024 FDEE. All rights reserved. -// - -import Foundation -import Combine - -final class FirebaseUseCase { - private let repository: FirebaseRepository // TODO: 프로토콜로 수정 - - init(repository: FirebaseRepository) { - self.repository = repository - } - - func getAppVersion() -> AnyPublisher { - return self.repository.getAppVersion() - } - - func getServerURL() -> AnyPublisher { - return self.repository.getServerURL() - } - - func getTiTiFunctions() -> AnyPublisher<[FunctionInfo], NetworkError> { - return self.repository.getTiTiFunctions() - } - - func getUpdateHistorys() -> AnyPublisher<[UpdateHistoryInfo], NetworkError> { - return self.repository.getUpdateHistorys() - } - - func getYoutubeLink() -> AnyPublisher { - return self.repository.getYoutubeLink() - } -} - diff --git a/Project_Timer/Domain/lagacy/GetServerURLUseCase.swift b/Project_Timer/Domain/lagacy/GetServerURLUseCase_lagacy.swift similarity index 81% rename from Project_Timer/Domain/lagacy/GetServerURLUseCase.swift rename to Project_Timer/Domain/lagacy/GetServerURLUseCase_lagacy.swift index 88f402a8..63d0c09c 100644 --- a/Project_Timer/Domain/lagacy/GetServerURLUseCase.swift +++ b/Project_Timer/Domain/lagacy/GetServerURLUseCase_lagacy.swift @@ -1,5 +1,5 @@ // -// GetServerURLUseCase.swift +// GetServerURLUseCase_lagacy.swift // Project_Timer // // Created by Kang Minsang on 2023/12/15. @@ -8,7 +8,7 @@ import Foundation -final class GetServerURLUseCase: GetServerURLUseCaseInterface { +final class GetServerURLUseCase_lagacy: GetServerURLUseCaseInterface { let repository: ServerURLRepositoryInterface init(repository: ServerURLRepositoryInterface) { From e83bd72ff55f48fc35873d7528ff5c8e3d8e0b2c Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sun, 30 Jun 2024 16:53:04 +0900 Subject: [PATCH 22/44] =?UTF-8?q?feat=20#144:=20GetAppVersionUseCase=20?= =?UTF-8?q?=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer/AppDelegate.swift | 33 +++++++++++-------- .../Present/Setting/Main/SettingVC.swift | 9 +++-- .../Present/Setting/Main/SettingVM.swift | 27 ++++++++------- 3 files changed, 42 insertions(+), 27 deletions(-) diff --git a/Project_Timer/AppDelegate.swift b/Project_Timer/AppDelegate.swift index 298db1ce..4ff9195c 100644 --- a/Project_Timer/AppDelegate.swift +++ b/Project_Timer/AppDelegate.swift @@ -12,6 +12,8 @@ import FirebaseAnalytics import GoogleMobileAds import WidgetKit import GoogleSignIn +import Moya +import Combine @UIApplicationMain final class AppDelegate: UIResponder, UIApplicationDelegate { @@ -21,6 +23,8 @@ final class AppDelegate: UIResponder, UIApplicationDelegate { } // 화면 회전을 제어할 변수 선언 var shouldSupportPortraitOrientation = false + // Combine binding + private var cancellables = Set() func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { self.checkLatestVersion(isLaunch: true) @@ -101,17 +105,23 @@ extension AppDelegate: UNUserNotificationCenterDelegate { // MARK: Configure extension AppDelegate { + /// 최신버전 체크 private func checkLatestVersion(isLaunch: Bool) { - /// 최신버전 체크로직 - let getLatestVersionUseCase = GetLatestVersionUseCase_lagacy(repository: AppLatestVersionRepository()) + // TODO: DI 수정 + let api = TTProvider(session: Session(interceptor: NetworkInterceptor.shared)) + let repository = FirebaseRepository(api: api) + let getAppVersionUseCase = GetAppVersionUseCase(repository: repository) - getLatestVersionUseCase.getLatestVersion { result in - switch result { - case .success(let latestVersionInfo): - let storeVersion = latestVersionInfo.latestVersion + getAppVersionUseCase.execute() + .sink { completion in + if case .failure(let networkError) = completion { + print("ERROR", #function, networkError) + } + } receiveValue: { [weak self] appLatestVersionInfo in + let storeVersion = appLatestVersionInfo.latestVersion guard storeVersion.compare(String.currentVersion, options: .numeric) == .orderedDescending else { return } - if latestVersionInfo.forced == true { + if appLatestVersionInfo.forced == true { // MARK: 강제 업데이트 필요 Alert 표시 let title = Localized.string(.Update_Popup_HardUpdateTitle) let text = Localized.string(.Update_Popup_HardUpdateDesc) @@ -124,7 +134,7 @@ extension AppDelegate { } } } - self.showAlert(title: title, text: text, actions: [ok]) + self?.showAlert(title: title, text: text, actions: [ok]) } else if isLaunch == true && UserDefaultsManager.get(forKey: .updatePushable) as? Bool ?? true { // MARK: 업데이트 Alert 표시 let title = Localized.string(.Update_Pupup_SoftUpdateTitle) @@ -137,13 +147,10 @@ extension AppDelegate { UIApplication.shared.open(url, options: [:]) } } - self.showAlert(title: title, text: text, actions: [pass, update]) + self?.showAlert(title: title, text: text, actions: [pass, update]) } - - case .failure(let networkError): - print(networkError.alertMessage) } - } + .store(in: &self.cancellables) } private func showAlert(title: String, text: String?, actions: [UIAlertAction]) { diff --git a/Project_Timer/Present/Setting/Main/SettingVC.swift b/Project_Timer/Present/Setting/Main/SettingVC.swift index e65c95b5..a75a1b83 100644 --- a/Project_Timer/Present/Setting/Main/SettingVC.swift +++ b/Project_Timer/Present/Setting/Main/SettingVC.swift @@ -9,6 +9,8 @@ import UIKit import Combine import MessageUI +import Moya +import Combine final class SettingVC: UIViewController { static let identifier = "SettingVC" @@ -60,8 +62,11 @@ extension SettingVC { } private func configureViewModel() { - let getLatestVersionUseCase = GetLatestVersionUseCase_lagacy(repository: AppLatestVersionRepository()) - self.viewModel = SettingVM(getLatestVersionUseCase: getLatestVersionUseCase, isIpad: UIDevice.current.userInterfaceIdiom == .pad) + // TODO: DI 수정 + let api = TTProvider(session: Session(interceptor: NetworkInterceptor.shared)) + let repository = FirebaseRepository(api: api) + let getAppVersionUseCase = GetAppVersionUseCase(repository: repository) + self.viewModel = SettingVM(getAppVersionUseCase: getAppVersionUseCase, isIpad: UIDevice.current.userInterfaceIdiom == .pad) } private func bindAll() { diff --git a/Project_Timer/Present/Setting/Main/SettingVM.swift b/Project_Timer/Present/Setting/Main/SettingVM.swift index 1fa5e8d4..c36d96ab 100644 --- a/Project_Timer/Present/Setting/Main/SettingVM.swift +++ b/Project_Timer/Present/Setting/Main/SettingVM.swift @@ -10,14 +10,16 @@ import Foundation import Combine final class SettingVM { - private let getLatestVersionUseCase: GetLatestVersionUseCaseInterface + private let getAppVersionUseCase: GetAppVersionUseCase @Published private(set) var cells: [[SettingCellInfo]] = [] @Published private(set) var latestVersionFetched: Bool = false private(set) var sections: [String] = [] private let isIpad: Bool + // Combine binding + private var cancellables = Set() - init(getLatestVersionUseCase: GetLatestVersionUseCaseInterface, isIpad: Bool) { - self.getLatestVersionUseCase = getLatestVersionUseCase + init(getAppVersionUseCase: GetAppVersionUseCase, isIpad: Bool) { + self.getAppVersionUseCase = getAppVersionUseCase self.isIpad = isIpad self.configureSections() self.configureCells() @@ -85,14 +87,15 @@ final class SettingVM { self.cells = cells - self.getLatestVersionUseCase.getLatestVersion { [weak self] result in - switch result { - case .success(let latestVersionInfo): - versionCell.updateSubTitle(to: Localized.string(.Settings_Button_VersionInfoDesc)+": \(latestVersionInfo.latestVersion)") - self?.latestVersionFetched = true - case .failure(let error): - print(error.alertMessage) - } - } + self.getAppVersionUseCase.execute() + .sink { completion in + if case .failure(let networkError) = completion { + print("ERROR", #function, networkError) + } + } receiveValue: { [weak self] appLatestVersionInfo in + versionCell.updateSubTitle(to: Localized.string(.Settings_Button_VersionInfoDesc)+": \(appLatestVersionInfo.latestVersion)") + self?.latestVersionFetched = true + } + .store(in: &self.cancellables) } } From ec27002540ffc18cc654145b45b939d56554d1b4 Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sun, 30 Jun 2024 16:56:46 +0900 Subject: [PATCH 23/44] =?UTF-8?q?delete=20#144:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=8C=8C=EC=9D=BC=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 20 ------------ Project_Timer/Data/NetworkURL.swift | 8 ----- .../lagacy/AppLatestVersionRepository.swift | 32 ------------------- .../Data/lagacy/AppVersionNetwork.swift | 27 ---------------- .../AppLatestVersionRepositoryInterface.swift | 13 -------- .../GetLatestVersionUseCase_lagacy.swift | 23 ------------- .../GetLatestVersionUseCaseInterface.swift | 14 -------- 7 files changed, 137 deletions(-) delete mode 100644 Project_Timer/Data/lagacy/AppLatestVersionRepository.swift delete mode 100644 Project_Timer/Data/lagacy/AppVersionNetwork.swift delete mode 100644 Project_Timer/Domain/lagacy/AppLatestVersionRepositoryInterface.swift delete mode 100644 Project_Timer/Domain/lagacy/GetLatestVersionUseCase_lagacy.swift delete mode 100644 Project_Timer/Present/Interface/GetLatestVersionUseCaseInterface.swift diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index 815b3162..e95641fb 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -194,12 +194,7 @@ 875C98CB2871C0A7008F7ADD /* UIImage+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875C98CA2871C0A7008F7ADD /* UIImage+Extension.swift */; }; 875EDA342957E0360037A7EB /* NetworkInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875EDA332957E0360037A7EB /* NetworkInterceptor.swift */; }; 875EDA362957F9510037A7EB /* LoadingIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875EDA352957F9510037A7EB /* LoadingIndicator.swift */; }; - 875FAE252B1C6721008F19D2 /* AppVersionNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE242B1C6721008F19D2 /* AppVersionNetwork.swift */; }; 875FAE282B1C679D008F19D2 /* AppLatestVersionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE272B1C679D008F19D2 /* AppLatestVersionInfo.swift */; }; - 875FAE2C2B1C6B57008F19D2 /* AppLatestVersionRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE2B2B1C6B57008F19D2 /* AppLatestVersionRepository.swift */; }; - 875FAE2F2B1C7067008F19D2 /* AppLatestVersionRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE2E2B1C7067008F19D2 /* AppLatestVersionRepositoryInterface.swift */; }; - 875FAE312B1C70C2008F19D2 /* GetLatestVersionUseCase_lagacy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE302B1C70C2008F19D2 /* GetLatestVersionUseCase_lagacy.swift */; }; - 875FAE352B1C718D008F19D2 /* GetLatestVersionUseCaseInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE342B1C718D008F19D2 /* GetLatestVersionUseCaseInterface.swift */; }; 875FAE372B1C74AD008F19D2 /* FirebaseBooleanValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FAE362B1C74AD008F19D2 /* FirebaseBooleanValue.swift */; }; 875FBE252AC9116B00B28723 /* UITextField+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FBE242AC9116B00B28723 /* UITextField+Extension.swift */; }; 875FBE272AC91ED800B28723 /* CGPoint+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875FBE262AC91ED800B28723 /* CGPoint+Extension.swift */; }; @@ -642,12 +637,7 @@ 875C98CA2871C0A7008F7ADD /* UIImage+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+Extension.swift"; sourceTree = ""; }; 875EDA332957E0360037A7EB /* NetworkInterceptor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkInterceptor.swift; sourceTree = ""; }; 875EDA352957F9510037A7EB /* LoadingIndicator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingIndicator.swift; sourceTree = ""; }; - 875FAE242B1C6721008F19D2 /* AppVersionNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppVersionNetwork.swift; sourceTree = ""; }; 875FAE272B1C679D008F19D2 /* AppLatestVersionInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLatestVersionInfo.swift; sourceTree = ""; }; - 875FAE2B2B1C6B57008F19D2 /* AppLatestVersionRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLatestVersionRepository.swift; sourceTree = ""; }; - 875FAE2E2B1C7067008F19D2 /* AppLatestVersionRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLatestVersionRepositoryInterface.swift; sourceTree = ""; }; - 875FAE302B1C70C2008F19D2 /* GetLatestVersionUseCase_lagacy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetLatestVersionUseCase_lagacy.swift; sourceTree = ""; }; - 875FAE342B1C718D008F19D2 /* GetLatestVersionUseCaseInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetLatestVersionUseCaseInterface.swift; sourceTree = ""; }; 875FAE362B1C74AD008F19D2 /* FirebaseBooleanValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseBooleanValue.swift; sourceTree = ""; }; 875FBE242AC9116B00B28723 /* UITextField+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITextField+Extension.swift"; sourceTree = ""; }; 875FBE262AC91ED800B28723 /* CGPoint+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CGPoint+Extension.swift"; sourceTree = ""; }; @@ -1042,14 +1032,12 @@ 87163DC92ACAF89B008D4072 /* NetworkResult.swift */, 87910829283877A4005D7B10 /* Network.swift */, 87910820283875C0005D7B10 /* NetworkController.swift */, - 875FAE242B1C6721008F19D2 /* AppVersionNetwork.swift */, 8708004F2B2C38F900830B39 /* ServerURLNetwork.swift */, 8708005B2B2C4D2D00830B39 /* AuthNetwork.swift */, 8708006A2B2CA57C00830B39 /* DailysNetwork.swift */, 870800782B2D4DE500830B39 /* RecordTimesNetwork.swift */, 870800842B2D593400830B39 /* SyncLogNetwork.swift */, 873731D02B2E92BD00D7BD9F /* NotificationNetwork.swift */, - 875FAE2B2B1C6B57008F19D2 /* AppLatestVersionRepository.swift */, 870800532B2C3A5400830B39 /* ServerURLRepository.swift */, 870800602B2C5FDA00830B39 /* AuthRepository_lagacy.swift */, 8708006C2B2CA7AB00830B39 /* DailysRepository_lagacy.swift */, @@ -1063,14 +1051,12 @@ 872210502C3003EB003B97AD /* lagacy */ = { isa = PBXGroup; children = ( - 875FAE2E2B1C7067008F19D2 /* AppLatestVersionRepositoryInterface.swift */, 870800552B2C3AC600830B39 /* ServerURLRepositoryInterface.swift */, 870800642B2C623600830B39 /* AuthRepositoryInterface.swift */, 870800722B2CB11B00830B39 /* DailyRepositoryInterface.swift */, 8708007C2B2D503600830B39 /* RecordTimesRepositoryInterface.swift */, 8708008A2B2D5A4400830B39 /* SyncLogRepositoryInterface.swift */, 873731D62B2E97C100D7BD9F /* NotificationRepositoryInterface.swift */, - 875FAE302B1C70C2008F19D2 /* GetLatestVersionUseCase_lagacy.swift */, 870800572B2C3B0C00830B39 /* GetServerURLUseCase_lagacy.swift */, 870800662B2C67E900830B39 /* AuthUseCase.swift */, 870800742B2D3C9A00830B39 /* DailysUseCase.swift */, @@ -1300,7 +1286,6 @@ 875FAE332B1C717E008F19D2 /* Interface */ = { isa = PBXGroup; children = ( - 875FAE342B1C718D008F19D2 /* GetLatestVersionUseCaseInterface.swift */, 870800592B2C3B5800830B39 /* GetServerURLUseCaseInterface.swift */, 870800682B2C68EF00830B39 /* AuthUseCaseInterface.swift */, 870800762B2D41EA00830B39 /* DailysUseCaseInterface.swift */, @@ -2356,7 +2341,6 @@ 8760FB0C2A1DBB490068CEF5 /* Widget+Extentions.swift in Sources */, 874B542E2C1595A00062D0AC /* RecordTimesRepository.swift in Sources */, 879BE32C2AC68EC7007AAC46 /* PortraitVC.swift in Sources */, - 875FAE2F2B1C7067008F19D2 /* AppLatestVersionRepositoryInterface.swift in Sources */, 879053FF29558EF4008B9258 /* SyncUserStatusView.swift in Sources */, 875FBE272AC91ED800B28723 /* CGPoint+Extension.swift in Sources */, 870800542B2C3A5400830B39 /* ServerURLRepository.swift in Sources */, @@ -2579,12 +2563,10 @@ 87D4DCCC2BA5477400BB5AAB /* ResetPasswordRequest.swift in Sources */, 879A2BA8284746A500B69DA7 /* SettingFooterView.swift in Sources */, 04E0DFC328A9031A004DABBE /* ModifyRecordVM.swift in Sources */, - 875FAE352B1C718D008F19D2 /* GetLatestVersionUseCaseInterface.swift in Sources */, 8769349727E1BBAF00D33F51 /* TodoCell.swift in Sources */, 0437062D2869EC2200A5D3AA /* TimerTimeLabelVM.swift in Sources */, 872210592C300A08003B97AD /* GetUpdateHistorysUseCase.swift in Sources */, 878899882894F0B900B7F378 /* WeekTimelineVM.swift in Sources */, - 875FAE252B1C6721008F19D2 /* AppVersionNetwork.swift in Sources */, 04F0D2B9286607A7007ED596 /* BaseSingleTimeLabelVM.swift in Sources */, 8751C6F428472066007FAFC4 /* SettingCell.swift in Sources */, 87035DF2282201A500055378 /* TimerVM.swift in Sources */, @@ -2598,7 +2580,6 @@ 8760FCBB29553F06000BCCD1 /* SyncDailysVC.swift in Sources */, 873977EB288D3FAA0025EE73 /* LogDailyVM.swift in Sources */, 87D3CF05288BAA1300ED33B7 /* ProgressDailyTaskCell.swift in Sources */, - 875FAE312B1C70C2008F19D2 /* GetLatestVersionUseCase_lagacy.swift in Sources */, 87199F48288303B60017D01A /* TasksProgressDailyGraphView.swift in Sources */, 87585AE22955A49F007E9139 /* SyncDeviceStatusView.swift in Sources */, 87789E44288BC1FC00759C01 /* TimeView.swift in Sources */, @@ -2615,7 +2596,6 @@ 87199F552883EB160017D01A /* TimelineView.swift in Sources */, 87306D552B2609CE001B7C14 /* TLRzh.swift in Sources */, 87D4DCE82BA6A8AA00BB5AAB /* TTBottomRoundButtonView.swift in Sources */, - 875FAE2C2B1C6B57008F19D2 /* AppLatestVersionRepository.swift in Sources */, 04504C602864AC3C00CA4C69 /* BaseTimeLabelVM.swift in Sources */, 8722105B2C300A5C003B97AD /* GetYoutubeLinkUseCase.swift in Sources */, 8772E91626705EE100A191BF /* TodolistVC.swift in Sources */, diff --git a/Project_Timer/Data/NetworkURL.swift b/Project_Timer/Data/NetworkURL.swift index 55272242..bf6d1e02 100644 --- a/Project_Timer/Data/NetworkURL.swift +++ b/Project_Timer/Data/NetworkURL.swift @@ -37,7 +37,6 @@ class NetworkURL { } } - static let appstoreVersion: String = "https://itunes.apple.com/lookup?id=1519159240&country=kr" static let appstore: String = "itms-apps://itunes.apple.com/app/id1519159240" static let developmentList: String = "https://deeply-eggplant-5ec.notion.site/TiTi-Development-List-b089afc1a4eb4cdb8c06840ca9cb1273" static let instagramToTiTi: String = "https://www.instagram.com/study_withtiti/" @@ -48,13 +47,6 @@ class NetworkURL { static let domain: String = Infos.FirestoreURL.value static let links: String = domain + "/links" static let youtubeLink: String = links + "/youtube" - static var latestVersion: String { - #if targetEnvironment(macCatalyst) - return domain + "/version/macos" - #else - return domain + "version/ios" - #endif - } static var surveys: String { switch Language.current { diff --git a/Project_Timer/Data/lagacy/AppLatestVersionRepository.swift b/Project_Timer/Data/lagacy/AppLatestVersionRepository.swift deleted file mode 100644 index 40e495c5..00000000 --- a/Project_Timer/Data/lagacy/AppLatestVersionRepository.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// AppLatestVersionRepository.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/03. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -final class AppLatestVersionRepository: AppLatestVersionRepositoryInterface { - private let api = AppVersionNetwork() - - func get(completion: @escaping (Result) -> Void) { - api.get { result in - switch result.status { - case .SUCCESS: - guard let data = result.data, - let dto = try? JSONDecoder().decode(AppVersionResponse.self, from: data) else { - completion(.failure(.DECODEERROR)) - return - } - - let info = dto.toDomain() - completion(.success(info)) - - default: - completion(.failure(.error(result))) - } - } - } -} diff --git a/Project_Timer/Data/lagacy/AppVersionNetwork.swift b/Project_Timer/Data/lagacy/AppVersionNetwork.swift deleted file mode 100644 index 064a4d82..00000000 --- a/Project_Timer/Data/lagacy/AppVersionNetwork.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// AppVersionNetwork.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/03. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -final class AppVersionNetwork { - private let network = Network() - private var latestVersionURL: String { - let base = Infos.FirestoreURL.value - #if targetEnvironment(macCatalyst) - return base + "/version/macos" - #else - return base + "/version/ios" - #endif - } - - func get(completion: @escaping (NetworkResult) -> Void) { - self.network.request(url: latestVersionURL, method: .get) { result in - completion(result) - } - } -} diff --git a/Project_Timer/Domain/lagacy/AppLatestVersionRepositoryInterface.swift b/Project_Timer/Domain/lagacy/AppLatestVersionRepositoryInterface.swift deleted file mode 100644 index 21b67b62..00000000 --- a/Project_Timer/Domain/lagacy/AppLatestVersionRepositoryInterface.swift +++ /dev/null @@ -1,13 +0,0 @@ -// -// AppLatestVersionRepositoryInterface.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/03. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -protocol AppLatestVersionRepositoryInterface { - func get(completion: @escaping (Result) -> Void) -} diff --git a/Project_Timer/Domain/lagacy/GetLatestVersionUseCase_lagacy.swift b/Project_Timer/Domain/lagacy/GetLatestVersionUseCase_lagacy.swift deleted file mode 100644 index 01b30b87..00000000 --- a/Project_Timer/Domain/lagacy/GetLatestVersionUseCase_lagacy.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// GetLatestVersionUseCase_lagacy.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/03. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -final class GetLatestVersionUseCase_lagacy: GetLatestVersionUseCaseInterface { - let repository: AppLatestVersionRepositoryInterface - - init(repository: AppLatestVersionRepositoryInterface) { - self.repository = repository - } - - func getLatestVersion(completion: @escaping (Result) -> Void) { - self.repository.get { result in - completion(result) - } - } -} diff --git a/Project_Timer/Present/Interface/GetLatestVersionUseCaseInterface.swift b/Project_Timer/Present/Interface/GetLatestVersionUseCaseInterface.swift deleted file mode 100644 index 946c3fce..00000000 --- a/Project_Timer/Present/Interface/GetLatestVersionUseCaseInterface.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// GetLatestVersionUseCaseInterface.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/03. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -protocol GetLatestVersionUseCaseInterface { - var repository: AppLatestVersionRepositoryInterface { get } - func getLatestVersion(completion: @escaping (Result) -> Void) -} From a1531f511186cc7632f59920180636f9dd1781b4 Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sun, 30 Jun 2024 17:39:21 +0900 Subject: [PATCH 24/44] =?UTF-8?q?feat=20#144:=20GetServerURLUseCase=20?= =?UTF-8?q?=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer/Data/NetworkURL.swift | 55 +++++++++++++------ .../Firebase/GetServerURLUseCase.swift | 2 +- .../TestServer/SignupSigninVM.swift | 13 +++-- .../TestServer/SyncDailys/SyncDailysVM.swift | 18 +++--- 4 files changed, 58 insertions(+), 30 deletions(-) diff --git a/Project_Timer/Data/NetworkURL.swift b/Project_Timer/Data/NetworkURL.swift index bf6d1e02..c1abb5aa 100644 --- a/Project_Timer/Data/NetworkURL.swift +++ b/Project_Timer/Data/NetworkURL.swift @@ -8,33 +8,52 @@ import Foundation import SwiftUI +import Moya +import Combine -class NetworkURL { +final class NetworkURL { static let shared = NetworkURL() private(set) var serverURL: String? + // Combine binding + private var cancellables = Set() private init() { - self.updateServerURL() {} + self.getServerURL() + .sink { version in + print(version ?? "nil") + } + .store(in: &self.cancellables) } - func updateServerURL(completion: @escaping () -> Void) { - let getServerURLUseCase = GetServerURLUseCase_lagacy(repository: ServerURLRepository()) - getServerURLUseCase.getServerURL { [weak self] result in - switch result { - case .success(let url): - guard url != "nil" else { - self?.serverURL = nil - completion() - return + func getServerURL() -> AnyPublisher { + // TODO: DI 수정 + let api = TTProvider(session: Session(interceptor: NetworkInterceptor.shared)) + let repository = FirebaseRepository(api: api) + let getServerURLUseCase = GetServerURLUseCase(repository: repository) + + return Future { [weak self] promise in + guard let self else { promise(.success(nil)); return } + + getServerURLUseCase.execute() + .sink { [weak self] completion in + if case .failure(let networkError) = completion { + print("ERROR", #function, networkError) + self?.serverURL = nil + promise(.success(nil)) + } + } receiveValue: { [weak self] url in + guard url != "nil" else { + self?.serverURL = nil + promise(.success(nil)) + return + } + + self?.serverURL = url + promise(.success(url)) } - - self?.serverURL = url - completion() - case .failure(_): - self?.serverURL = nil - completion() - } + .store(in: &self.cancellables) } + .eraseToAnyPublisher() } static let appstore: String = "itms-apps://itunes.apple.com/app/id1519159240" diff --git a/Project_Timer/Domain/UseCase/Firebase/GetServerURLUseCase.swift b/Project_Timer/Domain/UseCase/Firebase/GetServerURLUseCase.swift index b7e80602..eadce9da 100644 --- a/Project_Timer/Domain/UseCase/Firebase/GetServerURLUseCase.swift +++ b/Project_Timer/Domain/UseCase/Firebase/GetServerURLUseCase.swift @@ -9,7 +9,7 @@ import Foundation import Combine -final class GetServerURLUseCasee { +final class GetServerURLUseCase { private let repository: FirebaseRepository // TODO: 프로토콜로 수정 init(repository: FirebaseRepository) { diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVM.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVM.swift index aad704bb..b58877e8 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVM.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVM.swift @@ -16,6 +16,8 @@ final class SignupSigninVM { @Published var alert: (title: String, text: String)? @Published var postable: Bool = false @Published var signinSuccess: Bool = false + // Combine binding + private var cancellables = Set() init(authUseCase: AuthUseCaseInterface, isSignin: Bool) { @@ -26,11 +28,14 @@ final class SignupSigninVM { } private func checkServerURL() { - NetworkURL.shared.updateServerURL { [weak self] in - if NetworkURL.shared.serverURL == nil { - self?.alert = (title: Localized.string(.Server_Popup_ServerCantUseTitle), text: Localized.string(.Server_Popup_ServerCantUseDesc)) + NetworkURL.shared.getServerURL() + .sink { [weak self] url in + if url == nil { + self?.alert = (title: Localized.string(.Server_Popup_ServerCantUseTitle), text: Localized.string(.Server_Popup_ServerCantUseDesc)) + } } - } + .store(in: &self.cancellables) + } func signup(info: TestUserSignupRequest) { diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVM.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVM.swift index 4894bdd6..7a3a9cc5 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVM.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVM.swift @@ -19,6 +19,8 @@ final class SyncDailysVM { @Published private(set) var loading: Bool = false @Published private(set) var saveDailysSuccess: Bool = false private(set) var loadingText: SyncDailysVC.LoadingStatus? + // Combine binding + private var cancellables = Set() init(dailysUseCase: DailysUseCaseInterface, recordTimesUseCase: RecordTimesUseCaseInterface, @@ -33,14 +35,16 @@ final class SyncDailysVM { } private func checkServerURL() { - NetworkURL.shared.updateServerURL { [weak self] in - if NetworkURL.shared.serverURL == nil { - self?.alert = (title: Localized.string(.Server_Popup_ServerCantUseTitle), text: Localized.string(.Server_Popup_ServerCantUseDesc)) - } else { - // fetch 서버 syncLog - self?.getSyncLog(afterUploaded: false) + NetworkURL.shared.getServerURL() + .sink { [weak self] url in + if url == nil { + self?.alert = (title: Localized.string(.Server_Popup_ServerCantUseTitle), text: Localized.string(.Server_Popup_ServerCantUseDesc)) + } else { + // fetch 서버 syncLog + self?.getSyncLog(afterUploaded: false) + } } - } + .store(in: &self.cancellables) } } From b77f417032af8e7ca5acfdd81f9d3429cfe64088 Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sun, 30 Jun 2024 17:45:26 +0900 Subject: [PATCH 25/44] =?UTF-8?q?delete=20#144:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=8C=8C=EC=9D=BC=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 20 ------------ .../Data/lagacy/ServerURLNetwork.swift | 23 ------------- .../Data/lagacy/ServerURLRepository.swift | 32 ------------------- .../lagacy/GetServerURLUseCase_lagacy.swift | 23 ------------- .../lagacy/ServerURLRepositoryInterface.swift | 13 -------- .../GetServerURLUseCaseInterface.swift | 14 -------- 6 files changed, 125 deletions(-) delete mode 100644 Project_Timer/Data/lagacy/ServerURLNetwork.swift delete mode 100644 Project_Timer/Data/lagacy/ServerURLRepository.swift delete mode 100644 Project_Timer/Domain/lagacy/GetServerURLUseCase_lagacy.swift delete mode 100644 Project_Timer/Domain/lagacy/ServerURLRepositoryInterface.swift delete mode 100644 Project_Timer/Present/Interface/GetServerURLUseCaseInterface.swift diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index e95641fb..bd48083b 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -46,12 +46,7 @@ 8706C32E2AEF878D00F7C842 /* TTSignupTextFieldUnderlineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8706C32D2AEF878D00F7C842 /* TTSignupTextFieldUnderlineView.swift */; }; 8706C3302AEF881500F7C842 /* TTSignupTextFieldWarning.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8706C32F2AEF881500F7C842 /* TTSignupTextFieldWarning.swift */; }; 8706C3322AEF8A0300F7C842 /* TTSignupNextButtonForMac.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8706C3312AEF8A0300F7C842 /* TTSignupNextButtonForMac.swift */; }; - 870800502B2C38F900830B39 /* ServerURLNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708004F2B2C38F900830B39 /* ServerURLNetwork.swift */; }; 870800522B2C3A0800830B39 /* ServerURLResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800512B2C3A0800830B39 /* ServerURLResponse.swift */; }; - 870800542B2C3A5400830B39 /* ServerURLRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800532B2C3A5400830B39 /* ServerURLRepository.swift */; }; - 870800562B2C3AC600830B39 /* ServerURLRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800552B2C3AC600830B39 /* ServerURLRepositoryInterface.swift */; }; - 870800582B2C3B0C00830B39 /* GetServerURLUseCase_lagacy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800572B2C3B0C00830B39 /* GetServerURLUseCase_lagacy.swift */; }; - 8708005A2B2C3B5800830B39 /* GetServerURLUseCaseInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800592B2C3B5800830B39 /* GetServerURLUseCaseInterface.swift */; }; 8708005C2B2C4D2D00830B39 /* AuthNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708005B2B2C4D2D00830B39 /* AuthNetwork.swift */; }; 8708005F2B2C5F5F00830B39 /* AuthResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708005E2B2C5F5F00830B39 /* AuthResponse.swift */; }; 870800612B2C5FDA00830B39 /* AuthRepository_lagacy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800602B2C5FDA00830B39 /* AuthRepository_lagacy.swift */; }; @@ -491,12 +486,7 @@ 8706C32D2AEF878D00F7C842 /* TTSignupTextFieldUnderlineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TTSignupTextFieldUnderlineView.swift; sourceTree = ""; }; 8706C32F2AEF881500F7C842 /* TTSignupTextFieldWarning.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TTSignupTextFieldWarning.swift; sourceTree = ""; }; 8706C3312AEF8A0300F7C842 /* TTSignupNextButtonForMac.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TTSignupNextButtonForMac.swift; sourceTree = ""; }; - 8708004F2B2C38F900830B39 /* ServerURLNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerURLNetwork.swift; sourceTree = ""; }; 870800512B2C3A0800830B39 /* ServerURLResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerURLResponse.swift; sourceTree = ""; }; - 870800532B2C3A5400830B39 /* ServerURLRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerURLRepository.swift; sourceTree = ""; }; - 870800552B2C3AC600830B39 /* ServerURLRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerURLRepositoryInterface.swift; sourceTree = ""; }; - 870800572B2C3B0C00830B39 /* GetServerURLUseCase_lagacy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetServerURLUseCase_lagacy.swift; sourceTree = ""; }; - 870800592B2C3B5800830B39 /* GetServerURLUseCaseInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetServerURLUseCaseInterface.swift; sourceTree = ""; }; 8708005B2B2C4D2D00830B39 /* AuthNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthNetwork.swift; sourceTree = ""; }; 8708005E2B2C5F5F00830B39 /* AuthResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthResponse.swift; sourceTree = ""; }; 870800602B2C5FDA00830B39 /* AuthRepository_lagacy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthRepository_lagacy.swift; sourceTree = ""; }; @@ -1032,13 +1022,11 @@ 87163DC92ACAF89B008D4072 /* NetworkResult.swift */, 87910829283877A4005D7B10 /* Network.swift */, 87910820283875C0005D7B10 /* NetworkController.swift */, - 8708004F2B2C38F900830B39 /* ServerURLNetwork.swift */, 8708005B2B2C4D2D00830B39 /* AuthNetwork.swift */, 8708006A2B2CA57C00830B39 /* DailysNetwork.swift */, 870800782B2D4DE500830B39 /* RecordTimesNetwork.swift */, 870800842B2D593400830B39 /* SyncLogNetwork.swift */, 873731D02B2E92BD00D7BD9F /* NotificationNetwork.swift */, - 870800532B2C3A5400830B39 /* ServerURLRepository.swift */, 870800602B2C5FDA00830B39 /* AuthRepository_lagacy.swift */, 8708006C2B2CA7AB00830B39 /* DailysRepository_lagacy.swift */, 8708007A2B2D4F0800830B39 /* RecordTimesRepository_lagacy.swift */, @@ -1051,13 +1039,11 @@ 872210502C3003EB003B97AD /* lagacy */ = { isa = PBXGroup; children = ( - 870800552B2C3AC600830B39 /* ServerURLRepositoryInterface.swift */, 870800642B2C623600830B39 /* AuthRepositoryInterface.swift */, 870800722B2CB11B00830B39 /* DailyRepositoryInterface.swift */, 8708007C2B2D503600830B39 /* RecordTimesRepositoryInterface.swift */, 8708008A2B2D5A4400830B39 /* SyncLogRepositoryInterface.swift */, 873731D62B2E97C100D7BD9F /* NotificationRepositoryInterface.swift */, - 870800572B2C3B0C00830B39 /* GetServerURLUseCase_lagacy.swift */, 870800662B2C67E900830B39 /* AuthUseCase.swift */, 870800742B2D3C9A00830B39 /* DailysUseCase.swift */, 8708007E2B2D543500830B39 /* RecordTimesUseCase.swift */, @@ -1286,7 +1272,6 @@ 875FAE332B1C717E008F19D2 /* Interface */ = { isa = PBXGroup; children = ( - 870800592B2C3B5800830B39 /* GetServerURLUseCaseInterface.swift */, 870800682B2C68EF00830B39 /* AuthUseCaseInterface.swift */, 870800762B2D41EA00830B39 /* DailysUseCaseInterface.swift */, 870800802B2D54B500830B39 /* RecordTimesUseCaseInterface.swift */, @@ -2343,7 +2328,6 @@ 879BE32C2AC68EC7007AAC46 /* PortraitVC.swift in Sources */, 879053FF29558EF4008B9258 /* SyncUserStatusView.swift in Sources */, 875FBE272AC91ED800B28723 /* CGPoint+Extension.swift in Sources */, - 870800542B2C3A5400830B39 /* ServerURLRepository.swift in Sources */, 875EDA342957E0360037A7EB /* NetworkInterceptor.swift in Sources */, 870E11752A0E226D00CFA77C /* CalendarWidgetData.swift in Sources */, 870800752B2D3C9A00830B39 /* DailysUseCase.swift in Sources */, @@ -2411,7 +2395,6 @@ 87E5C70D2AE0268C00BE46B0 /* SignupEmailView.swift in Sources */, 049BBA9A28AB5747005BAB1B /* TaskModifyInteractionView.swift in Sources */, 87A8CD272AF0C4B600D4C1D7 /* OverlayShowButtonForSecureFieldView.swift in Sources */, - 870800502B2C38F900830B39 /* ServerURLNetwork.swift in Sources */, 870E85012AD67E46000511BD /* KeyboardResponder.swift in Sources */, 870800872B2D599800830B39 /* SyncLogRepository_lagacy.swift in Sources */, 87A48BCB27DF112B00F46D0F /* LogHomeVM.swift in Sources */, @@ -2495,7 +2478,6 @@ 87A4704A26493D6E007B89D6 /* StaticCircularProgressView.swift in Sources */, 879E849C29C83D5100D65F48 /* RoundedShape.swift in Sources */, 87199F582883F2E00017D01A /* TimelineVM.swift in Sources */, - 870800562B2C3AC600830B39 /* ServerURLRepositoryInterface.swift in Sources */, 8761BDC02BCFE52E00E9281A /* FirebaseAPI.swift in Sources */, 877036CA29CD7B3B0078A30C /* TaskManager.swift in Sources */, 8761BDCC2BCFEC8500E9281A /* DailysAPI.swift in Sources */, @@ -2510,7 +2492,6 @@ 87199F462883018C0017D01A /* TimelineDailyGraphView.swift in Sources */, 87476DAD28A2794B00FAD273 /* LastestVersionInfo.swift in Sources */, 870800812B2D54B500830B39 /* RecordTimesUseCaseInterface.swift in Sources */, - 8708005A2B2C3B5800830B39 /* GetServerURLUseCaseInterface.swift in Sources */, 87459706263FF0D700172C0F /* Daily.swift in Sources */, 87FB8D1B2B3C5DF400EA5693 /* NotificationUseCase.swift in Sources */, 8757AA3D290511FF00D97517 /* Task.swift in Sources */, @@ -2538,7 +2519,6 @@ 871AB69D2967C9D100AFED1C /* TimeTableVM.swift in Sources */, 8708006B2B2CA57C00830B39 /* DailysNetwork.swift in Sources */, 872210422C2FEE83003B97AD /* SyncLogRepository.swift in Sources */, - 870800582B2C3B0C00830B39 /* GetServerURLUseCase_lagacy.swift in Sources */, 87D4DCD22BA5A4C400BB5AAB /* ResetPasswordEmailView.swift in Sources */, 878813E52A209BA0000ED2C1 /* HowToAddWidgetVC.swift in Sources */, 8708007B2B2D4F0800830B39 /* RecordTimesRepository_lagacy.swift in Sources */, diff --git a/Project_Timer/Data/lagacy/ServerURLNetwork.swift b/Project_Timer/Data/lagacy/ServerURLNetwork.swift deleted file mode 100644 index feeff30b..00000000 --- a/Project_Timer/Data/lagacy/ServerURLNetwork.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// ServerURLNetwork.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/15. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -final class ServerURLNetwork { - private let network = Network() - private var url: String { - let base = Infos.FirestoreURL.value - return base + "/server/url" - } - - func get(completion: @escaping (NetworkResult) -> Void) { - self.network.request(url: url, method: .get) { result in - completion(result) - } - } -} diff --git a/Project_Timer/Data/lagacy/ServerURLRepository.swift b/Project_Timer/Data/lagacy/ServerURLRepository.swift deleted file mode 100644 index cf692f0c..00000000 --- a/Project_Timer/Data/lagacy/ServerURLRepository.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// ServerURLRepository.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/15. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -final class ServerURLRepository: ServerURLRepositoryInterface { - private let api = ServerURLNetwork() - - func get(completion: @escaping (Result) -> Void) { - api.get { result in - switch result.status { - case .SUCCESS: - guard let data = result.data, - let dto = try? JSONDecoder().decode(ServerURLResponse.self, from: data) else { - completion(.failure(.DECODEERROR)) - return - } - - let url = dto.base.value - completion(.success(url)) - - default: - completion(.failure(.error(result))) - } - } - } -} diff --git a/Project_Timer/Domain/lagacy/GetServerURLUseCase_lagacy.swift b/Project_Timer/Domain/lagacy/GetServerURLUseCase_lagacy.swift deleted file mode 100644 index 63d0c09c..00000000 --- a/Project_Timer/Domain/lagacy/GetServerURLUseCase_lagacy.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// GetServerURLUseCase_lagacy.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/15. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -final class GetServerURLUseCase_lagacy: GetServerURLUseCaseInterface { - let repository: ServerURLRepositoryInterface - - init(repository: ServerURLRepositoryInterface) { - self.repository = repository - } - - func getServerURL(completion: @escaping (Result) -> Void) { - self.repository.get { result in - completion(result) - } - } -} diff --git a/Project_Timer/Domain/lagacy/ServerURLRepositoryInterface.swift b/Project_Timer/Domain/lagacy/ServerURLRepositoryInterface.swift deleted file mode 100644 index 00fbbf36..00000000 --- a/Project_Timer/Domain/lagacy/ServerURLRepositoryInterface.swift +++ /dev/null @@ -1,13 +0,0 @@ -// -// ServerURLRepositoryInterface.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/15. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -protocol ServerURLRepositoryInterface { - func get(completion: @escaping (Result) -> Void) -} diff --git a/Project_Timer/Present/Interface/GetServerURLUseCaseInterface.swift b/Project_Timer/Present/Interface/GetServerURLUseCaseInterface.swift deleted file mode 100644 index 5a7fc481..00000000 --- a/Project_Timer/Present/Interface/GetServerURLUseCaseInterface.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// GetServerURLUseCaseInterface.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/15. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -protocol GetServerURLUseCaseInterface { - var repository: ServerURLRepositoryInterface { get } - func getServerURL(completion: @escaping (Result) -> Void) -} From ebb5afa4175c874dfb134f60f7ab0893ab92ba00 Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sat, 6 Jul 2024 11:58:35 +0900 Subject: [PATCH 26/44] =?UTF-8?q?feat=20#144:=20GetTiTiFunctionsUseCase=20?= =?UTF-8?q?=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer/Data/NetworkURL.swift | 8 ---- .../Data/lagacy/NetworkController.swift | 44 ------------------- .../SettingFunctionsListVC.swift | 16 +++---- .../SettingFunctionsListVM.swift | 36 ++++++--------- 4 files changed, 20 insertions(+), 84 deletions(-) diff --git a/Project_Timer/Data/NetworkURL.swift b/Project_Timer/Data/NetworkURL.swift index c1abb5aa..18875760 100644 --- a/Project_Timer/Data/NetworkURL.swift +++ b/Project_Timer/Data/NetworkURL.swift @@ -65,7 +65,6 @@ final class NetworkURL { enum Firestore { static let domain: String = Infos.FirestoreURL.value static let links: String = domain + "/links" - static let youtubeLink: String = links + "/youtube" static var surveys: String { switch Language.current { @@ -74,13 +73,6 @@ final class NetworkURL { } } - static var titifuncs: String { - switch Language.current { - case .ko: return domain + "/titifuncs" - default: return domain + "/titifuncs_eng" - } - } - static var updates: String { switch Language.current { case .ko: return domain + "/updates?pageSize=100" diff --git a/Project_Timer/Data/lagacy/NetworkController.swift b/Project_Timer/Data/lagacy/NetworkController.swift index 51ee681c..67ddcfd2 100644 --- a/Project_Timer/Data/lagacy/NetworkController.swift +++ b/Project_Timer/Data/lagacy/NetworkController.swift @@ -9,18 +9,10 @@ import Foundation import Alamofire -protocol TiTiFunctionsFetchable { - func getTiTiFunctions_lagacy(completion: @escaping (Result<[FunctionInfo], NetworkError>) -> Void) -} - protocol UpdateHistoryFetchable { func getUpdateHistorys_lagacy(completion: @escaping (Result<[UpdateHistoryInfo], NetworkError>) -> Void) } -protocol YoutubeLinkFetchable { - func getYoutubeLink_lagacy(completion: @escaping (Result) -> Void) -} - protocol SurveysFetchable { func getSurveys_lagacy(completion: @escaping (Result<[SurveyInfo], NetworkError>) -> Void) } @@ -32,24 +24,6 @@ final class NetworkController { } } -extension NetworkController: TiTiFunctionsFetchable { - func getTiTiFunctions_lagacy(completion: @escaping (Result<[FunctionInfo], NetworkError>) -> Void) { - self.network.request(url: NetworkURL.Firestore.titifuncs, method: .get) { result in - switch result.status { - case .SUCCESS: - guard let data = result.data, - let functionInfos: FunctionResponse = try? JSONDecoder().decode(FunctionResponse.self, from: data) else { - completion(.failure(.DECODEERROR)) - return - } - completion(.success(functionInfos.functionInfos)) - default: - completion(.failure(NetworkError.error(result))) - } - } - } -} - extension NetworkController: UpdateHistoryFetchable { func getUpdateHistorys_lagacy(completion: @escaping (Result<[UpdateHistoryInfo], NetworkError>) -> Void) { self.network.request(url: NetworkURL.Firestore.updates, method: .get) { result in @@ -68,24 +42,6 @@ extension NetworkController: UpdateHistoryFetchable { } } -extension NetworkController: YoutubeLinkFetchable { - func getYoutubeLink_lagacy(completion: @escaping (Result) -> Void) { - self.network.request(url: NetworkURL.Firestore.youtubeLink, method: .get) { result in - switch result.status { - case .SUCCESS: - guard let data = result.data, - let youtubeLinkInfo: YoutubeLinkResponse = try? JSONDecoder().decode(YoutubeLinkResponse.self, from: data) else { - completion(.failure(.DECODEERROR)) - return - } - completion(.success(youtubeLinkInfo)) - default: - completion(.failure(NetworkError.error(result))) - } - } - } -} - extension NetworkController: SurveysFetchable { func getSurveys_lagacy(completion: @escaping (Result<[SurveyInfo], NetworkError>) -> Void) { self.network.request(url: NetworkURL.Firestore.surveys, method: .get) { result in diff --git a/Project_Timer/Present/Setting/Service/SettingFunctionsList/SettingFunctionsListVC.swift b/Project_Timer/Present/Setting/Service/SettingFunctionsList/SettingFunctionsListVC.swift index bf72249d..161114b5 100644 --- a/Project_Timer/Present/Setting/Service/SettingFunctionsList/SettingFunctionsListVC.swift +++ b/Project_Timer/Present/Setting/Service/SettingFunctionsList/SettingFunctionsListVC.swift @@ -8,6 +8,7 @@ import UIKit import Combine +import Moya final class SettingFunctionsListVC: UIViewController { static let identifier = "SettingFunctionsListVC" @@ -40,12 +41,6 @@ final class SettingFunctionsListVC: UIViewController { self?.functionList.collectionViewLayout.invalidateLayout() } } - - @IBAction func goToYoutube(_ sender: Any) { - guard let link = self.viewModel?.youtubeLink, - let url = URL(string: link) else { return } - UIApplication.shared.open(url, options: [:]) - } } extension SettingFunctionsListVC { @@ -64,9 +59,12 @@ extension SettingFunctionsListVC { } private func configureViewModel() { - // MARK: NetworkController 를 생성하는 부분에 대한 고민이 필요 - let networkController = NetworkController(network: Network()) - self.viewModel = SettingFunctionsListVM(networkController: networkController) + // TODO: DI 수정 + let api = TTProvider(session: Session(interceptor: NetworkInterceptor.shared)) + let repository = FirebaseRepository(api: api) + let getTiTiFunctionsUseCase = GetTiTiFunctionsUseCase(repository: repository) + + self.viewModel = SettingFunctionsListVM(getTiTiFunctionsUseCase: getTiTiFunctionsUseCase) } private func stopLoader() { diff --git a/Project_Timer/Present/Setting/Service/SettingFunctionsList/SettingFunctionsListVM.swift b/Project_Timer/Present/Setting/Service/SettingFunctionsList/SettingFunctionsListVM.swift index af5474a4..affaa61e 100644 --- a/Project_Timer/Present/Setting/Service/SettingFunctionsList/SettingFunctionsListVM.swift +++ b/Project_Timer/Present/Setting/Service/SettingFunctionsList/SettingFunctionsListVM.swift @@ -9,39 +9,29 @@ import Foundation import Combine -typealias FunctionInfoFetchable = (TiTiFunctionsFetchable & YoutubeLinkFetchable) - final class SettingFunctionsListVM { - private let networkController: FunctionInfoFetchable + private let getTiTiFunctionsUseCase: GetTiTiFunctionsUseCase @Published private(set) var infos: [FunctionInfo] = [] @Published private(set) var warning: (title: String, text: String)? private(set) var youtubeLink: String? + // Combine binding + private var cancellables = Set() - init(networkController: FunctionInfoFetchable) { - self.networkController = networkController + init(getTiTiFunctionsUseCase: GetTiTiFunctionsUseCase) { + self.getTiTiFunctionsUseCase = getTiTiFunctionsUseCase self.configureInfos() - self.configureYoutubeLink() } private func configureInfos() { - self.networkController.getTiTiFunctions_lagacy { [weak self] result in - switch result { - case .success(let functionInfos): + self.getTiTiFunctionsUseCase.execute() + .sink { [weak self] completion in + if case .failure(let networkError) = completion { + print("ERROR", #function, networkError) + self?.warning = networkError.alertMessage + } + } receiveValue: { [weak self] functionInfos in self?.infos = functionInfos - case .failure(let error): - self?.warning = error.alertMessage - } - } - } - - private func configureYoutubeLink() { - self.networkController.getYoutubeLink_lagacy { [weak self] result in - switch result { - case .success(let youtubeLinkInfo): - self?.youtubeLink = youtubeLinkInfo.url.value - case .failure(let error): - self?.warning = error.alertMessage } - } + .store(in: &self.cancellables) } } From 9c517cb98a1f46a71a0da7c276d53dc648e605ab Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sat, 6 Jul 2024 14:08:01 +0900 Subject: [PATCH 27/44] =?UTF-8?q?fix=20#144:=20TTProvider=EC=9D=98=20reque?= =?UTF-8?q?st=EB=A5=BC=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95,=20map=20operator=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Data/Repository/AuthRepository.swift | 10 ++++----- .../Data/Repository/FirebaseRepository.swift | 12 +++++----- .../Repository/NotificationRepository.swift | 6 ++--- .../Repository/RecordTimesRepository.swift | 2 +- .../Data/Repository/SyncLogRepository.swift | 2 +- Project_Timer/Data/TTProvider.swift | 22 +++++++++++++++++++ 6 files changed, 38 insertions(+), 16 deletions(-) diff --git a/Project_Timer/Data/Repository/AuthRepository.swift b/Project_Timer/Data/Repository/AuthRepository.swift index 8deb15d8..cf7e508e 100644 --- a/Project_Timer/Data/Repository/AuthRepository.swift +++ b/Project_Timer/Data/Repository/AuthRepository.swift @@ -19,35 +19,35 @@ final class AuthRepository { } func signup(request: TestUserSignupRequest) -> AnyPublisher { - return self.api.requestPublisher(.postSignup(request)) + return self.api.request(.postSignup(request)) .map(AuthResponse.self) .map { $0.toDomain() } .catchDecodeError() } func signin(request: TestUserSigninRequest) -> AnyPublisher { - return self.api.requestPublisher(.postSignin(request)) + return self.api.request(.postSignin(request)) .map(AuthResponse.self) .map { $0.toDomain() } .catchDecodeError() } func checkUsernameExit(username: String) -> AnyPublisher { - return self.api.requestPublisher(.getCheckUsername(username)) + return self.api.request(.getCheckUsername(username)) .map(SimpleResponse.self) .map { $0.toDomain() } .catchDecodeError() } func checkEmailExit(request: CheckEmailExitRequest) -> AnyPublisher { - return self.api.requestPublisher(.getCheckEmail(request)) + return self.api.request(.getCheckEmail(request)) .map(SimpleResponse.self) .map { $0.toDomain() } .catchDecodeError() } func updatePassword(request: ResetPasswordRequest) -> AnyPublisher { - return self.api.requestPublisher(.postUpdatePassword(request)) + return self.api.request(.postUpdatePassword(request)) .map(SimpleResponse.self) .map { $0.toDomain() } .catchDecodeError() diff --git a/Project_Timer/Data/Repository/FirebaseRepository.swift b/Project_Timer/Data/Repository/FirebaseRepository.swift index f9b04b11..9367d90f 100644 --- a/Project_Timer/Data/Repository/FirebaseRepository.swift +++ b/Project_Timer/Data/Repository/FirebaseRepository.swift @@ -19,42 +19,42 @@ final class FirebaseRepository { } func getAppVersion() -> AnyPublisher { - return self.api.requestPublisher(.getAppVersion) + return self.api.request(.getAppVersion) .map(AppVersionResponse.self) .map { $0.toDomain() } .catchDecodeError() } func getServerURL() -> AnyPublisher { - return self.api.requestPublisher(.getServerURL) + return self.api.request(.getServerURL) .map(ServerURLResponse.self) .map { $0.base.value } .catchDecodeError() } func getTiTiFunctions() -> AnyPublisher<[FunctionInfo], NetworkError> { - return self.api.requestPublisher(.getTiTiFunctions) + return self.api.request(.getTiTiFunctions) .map(FunctionResponse.self) .map { $0.functionInfos } .catchDecodeError() } func getUpdateHistorys() -> AnyPublisher<[UpdateHistoryInfo], NetworkError> { - return self.api.requestPublisher(.getUpdateHistorys) + return self.api.request(.getUpdateHistorys) .map(UpdateHistoryResponse.self) .map { $0.updateInfos } .catchDecodeError() } func getYoutubeLink() -> AnyPublisher { - return self.api.requestPublisher(.getYoutubeLink) + return self.api.request(.getYoutubeLink) .map(YoutubeLinkResponse.self) .map { $0.url.value } .catchDecodeError() } func getSurveys() -> AnyPublisher<[SurveyInfo], NetworkError> { - return self.api.requestPublisher(.getSurveys) + return self.api.request(.getSurveys) .map(SurveyResponse.self) .map { $0.surveyInfos ?? [] } .catchDecodeError() diff --git a/Project_Timer/Data/Repository/NotificationRepository.swift b/Project_Timer/Data/Repository/NotificationRepository.swift index ef938dd9..04b854bb 100644 --- a/Project_Timer/Data/Repository/NotificationRepository.swift +++ b/Project_Timer/Data/Repository/NotificationRepository.swift @@ -12,14 +12,14 @@ import Combine import CombineMoya final class NotificationRepository { - private let api: MoyaProvider + private let api: TTProvider - init(api: MoyaProvider) { + init(api: TTProvider) { self.api = api } func get() -> AnyPublisher { - return self.api.requestPublisher(.getNotification) + return self.api.request(.getNotification) .map(NotificationResponse.self) .map { $0.toDomain() } .catchDecodeError() diff --git a/Project_Timer/Data/Repository/RecordTimesRepository.swift b/Project_Timer/Data/Repository/RecordTimesRepository.swift index 029f5de7..b5f459f1 100644 --- a/Project_Timer/Data/Repository/RecordTimesRepository.swift +++ b/Project_Timer/Data/Repository/RecordTimesRepository.swift @@ -25,7 +25,7 @@ final class RecordTimesRepository { } func get() -> AnyPublisher { - return self.api.requestPublisher(.getRecordTime) + return self.api.request(.getRecordTime) .map(RecordTimesResponse.self) .map { $0.toDomain() } .catchDecodeError() diff --git a/Project_Timer/Data/Repository/SyncLogRepository.swift b/Project_Timer/Data/Repository/SyncLogRepository.swift index 1674c0c8..dbdf77d8 100644 --- a/Project_Timer/Data/Repository/SyncLogRepository.swift +++ b/Project_Timer/Data/Repository/SyncLogRepository.swift @@ -19,7 +19,7 @@ final class SyncLogRepository { } func get() -> AnyPublisher { - return self.api.requestPublisher(.getSyncLog) + return self.api.request(.getSyncLog) .map(SyncLogResponse.self) .map { $0.toDomain() } .catchDecodeError() diff --git a/Project_Timer/Data/TTProvider.swift b/Project_Timer/Data/TTProvider.swift index 875d56d3..51d79cbf 100644 --- a/Project_Timer/Data/TTProvider.swift +++ b/Project_Timer/Data/TTProvider.swift @@ -18,6 +18,8 @@ final class TTProvider: MoyaProvider { super.request(token) { result in switch result { case .success(let response): + print("\nTTProvider success", token, "\(token.baseURL)\(token.path)") +// print("-->", String(data: response.data, encoding: .utf8), "\n") if (200...299).contains(response.statusCode) { promise(.success(response)) } else { @@ -26,6 +28,8 @@ final class TTProvider: MoyaProvider { } promise(.success(response)) case .failure(let error): + print("\nTTProvider failure", token, "\(token.baseURL)\(token.path)") +// print("-->", error.localizedDescription, "\n") promise(.failure(self.handleError(error))) } } @@ -54,3 +58,21 @@ extension Publisher { .eraseToAnyPublisher() } } + +extension Publisher where Output == Response, Failure == NetworkError { + /// TTProvider를 사용한 경우 map operator 사용 + func map(_ type: D.Type) -> AnyPublisher { + return self.tryMap { response in + do { + let decodedData = try JSONDecoder().decode(D.self, from: response.data) + return decodedData + } catch { + throw NetworkError.DECODEERROR + } + } + .mapError { error in + error as? NetworkError ?? NetworkError.FAIL + } + .eraseToAnyPublisher() + } +} From 89c5ef3ac9899ae15558f850e0f967b96d2613c7 Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sat, 6 Jul 2024 14:08:37 +0900 Subject: [PATCH 28/44] =?UTF-8?q?feat=20#144:=20GetUpdateHistorysUseCase?= =?UTF-8?q?=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer/Data/API/FirebaseAPI.swift | 4 ++-- Project_Timer/Data/NetworkURL.swift | 7 ------ .../Data/lagacy/NetworkController.swift | 22 ----------------- .../SettingUpdateHistoryVC.swift | 10 +++++--- .../SettingUpdateHistoryVM.swift | 24 +++++++++++-------- 5 files changed, 23 insertions(+), 44 deletions(-) diff --git a/Project_Timer/Data/API/FirebaseAPI.swift b/Project_Timer/Data/API/FirebaseAPI.swift index e249acb4..7bc058f1 100644 --- a/Project_Timer/Data/API/FirebaseAPI.swift +++ b/Project_Timer/Data/API/FirebaseAPI.swift @@ -47,8 +47,8 @@ extension FirebaseAPI: TargetType { } case .getUpdateHistorys: switch Language.current { - case .ko: return "/updates?pageSize=100" - case .en, .zh: return "/updates_eng?pageSize=100" + case .ko: return "/updates" + case .en, .zh: return "/updates_eng" } case .getYoutubeLink: return "/youtube" diff --git a/Project_Timer/Data/NetworkURL.swift b/Project_Timer/Data/NetworkURL.swift index 18875760..897c4345 100644 --- a/Project_Timer/Data/NetworkURL.swift +++ b/Project_Timer/Data/NetworkURL.swift @@ -72,13 +72,6 @@ final class NetworkURL { default: return domain + "/surveys_eng" } } - - static var updates: String { - switch Language.current { - case .ko: return domain + "/updates?pageSize=100" - default: return domain + "/updates_eng?pageSize=100" - } - } } enum WidgetInfo { diff --git a/Project_Timer/Data/lagacy/NetworkController.swift b/Project_Timer/Data/lagacy/NetworkController.swift index 67ddcfd2..b144b9ad 100644 --- a/Project_Timer/Data/lagacy/NetworkController.swift +++ b/Project_Timer/Data/lagacy/NetworkController.swift @@ -9,10 +9,6 @@ import Foundation import Alamofire -protocol UpdateHistoryFetchable { - func getUpdateHistorys_lagacy(completion: @escaping (Result<[UpdateHistoryInfo], NetworkError>) -> Void) -} - protocol SurveysFetchable { func getSurveys_lagacy(completion: @escaping (Result<[SurveyInfo], NetworkError>) -> Void) } @@ -24,24 +20,6 @@ final class NetworkController { } } -extension NetworkController: UpdateHistoryFetchable { - func getUpdateHistorys_lagacy(completion: @escaping (Result<[UpdateHistoryInfo], NetworkError>) -> Void) { - self.network.request(url: NetworkURL.Firestore.updates, method: .get) { result in - switch result.status { - case .SUCCESS: - guard let data = result.data, - let updateInfos: UpdateHistoryResponse = try? JSONDecoder().decode(UpdateHistoryResponse.self, from: data) else { - completion(.failure(.DECODEERROR)) - return - } - completion(.success(updateInfos.updateInfos)) - default: - completion(.failure(NetworkError.error(result))) - } - } - } -} - extension NetworkController: SurveysFetchable { func getSurveys_lagacy(completion: @escaping (Result<[SurveyInfo], NetworkError>) -> Void) { self.network.request(url: NetworkURL.Firestore.surveys, method: .get) { result in diff --git a/Project_Timer/Present/Setting/UpdateHistory/SettingUpdateHistoryVC.swift b/Project_Timer/Present/Setting/UpdateHistory/SettingUpdateHistoryVC.swift index 97a5adec..7e545271 100644 --- a/Project_Timer/Present/Setting/UpdateHistory/SettingUpdateHistoryVC.swift +++ b/Project_Timer/Present/Setting/UpdateHistory/SettingUpdateHistoryVC.swift @@ -8,6 +8,7 @@ import UIKit import Combine +import Moya final class SettingUpdateHistoryVC: UIViewController { static let identifier = "SettingUpdateHistoryVC" @@ -58,9 +59,12 @@ extension SettingUpdateHistoryVC { } private func configureViewModel() { - // MARK: NetworkController 주입 고민이 필요 - let networkController = NetworkController(network: Network()) - self.viewModel = SettingUpdateHistoryVM(networkController: networkController) + // TODO: DI 수정 + let api = TTProvider(session: Session(interceptor: NetworkInterceptor.shared)) + let repository = FirebaseRepository(api: api) + let getUpdateHistorysUseCase = GetUpdateHistorysUseCase(repository: repository) + + self.viewModel = SettingUpdateHistoryVM(getUpdateHistorysUseCase: getUpdateHistorysUseCase) } private func stopLoader() { diff --git a/Project_Timer/Present/Setting/UpdateHistory/SettingUpdateHistoryVM.swift b/Project_Timer/Present/Setting/UpdateHistory/SettingUpdateHistoryVM.swift index cb670fb3..2bc8f98e 100644 --- a/Project_Timer/Present/Setting/UpdateHistory/SettingUpdateHistoryVM.swift +++ b/Project_Timer/Present/Setting/UpdateHistory/SettingUpdateHistoryVM.swift @@ -10,25 +10,29 @@ import Foundation import Combine final class SettingUpdateHistoryVM { - let networkController: UpdateHistoryFetchable + let getUpdateHistorysUseCase: GetUpdateHistorysUseCase @Published private(set) var infos: [UpdateHistoryInfo] = [] @Published private(set) var warning: (title: String, text: String)? + // Combine binding + private var cancellables = Set() - init(networkController: UpdateHistoryFetchable) { - self.networkController = networkController + init(getUpdateHistorysUseCase: GetUpdateHistorysUseCase) { + self.getUpdateHistorysUseCase = getUpdateHistorysUseCase self.configureInfos() } private func configureInfos() { - self.networkController.getUpdateHistorys_lagacy { [weak self] result in - switch result { - case .success(let updateInfo): - self?.infos = updateInfo.sorted(by: { + self.getUpdateHistorysUseCase.execute() + .sink { [weak self] completion in + if case .failure(let networkError) = completion { + print("ERROR", #function, networkError) + self?.warning = networkError.alertMessage + } + } receiveValue: { [weak self] updateHistoryInfos in + self?.infos = updateHistoryInfos.sorted(by: { $0.version.value.compare($1.version.value, options: .numeric) == .orderedDescending }) - case .failure(let error): - self?.warning = error.alertMessage } - } + .store(in: &self.cancellables) } } From fd8ef4dc6b6fab78db378b80fcdeb3fe76c6aaed Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sat, 6 Jul 2024 14:20:06 +0900 Subject: [PATCH 29/44] =?UTF-8?q?feat=20#144:=20GetSurveysUseCase=20?= =?UTF-8?q?=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 4 -- Project_Timer/Data/NetworkURL.swift | 12 ------ .../Data/lagacy/NetworkController.swift | 39 ------------------- .../SettingTiTiLab/SettingTiTiLabVC.swift | 10 +++-- .../SettingTiTiLab/SettingTiTiLabVM.swift | 22 ++++++----- 5 files changed, 20 insertions(+), 67 deletions(-) delete mode 100644 Project_Timer/Data/lagacy/NetworkController.swift diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index a42889fd..f778b705 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -274,7 +274,6 @@ 87906C7F2B9BF749000EC960 /* MiSans-Normal.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 87906C7E2B9BF749000EC960 /* MiSans-Normal.ttf */; }; 87906C812B9BF759000EC960 /* MiSans-Semibold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 87906C802B9BF759000EC960 /* MiSans-Semibold.ttf */; }; 8791081F28387537005D7B10 /* NetworkURL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8791081E28387537005D7B10 /* NetworkURL.swift */; }; - 87910821283875C0005D7B10 /* NetworkController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87910820283875C0005D7B10 /* NetworkController.swift */; }; 87910828283876DD005D7B10 /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = 87910827283876DD005D7B10 /* Alamofire */; }; 8791082A283877A4005D7B10 /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87910829283877A4005D7B10 /* Network.swift */; }; 8791082F28387D1F005D7B10 /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8791082E28387D1F005D7B10 /* String+Extension.swift */; }; @@ -698,7 +697,6 @@ 87906C7E2B9BF749000EC960 /* MiSans-Normal.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "MiSans-Normal.ttf"; sourceTree = ""; }; 87906C802B9BF759000EC960 /* MiSans-Semibold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "MiSans-Semibold.ttf"; sourceTree = ""; }; 8791081E28387537005D7B10 /* NetworkURL.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkURL.swift; sourceTree = ""; }; - 87910820283875C0005D7B10 /* NetworkController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkController.swift; sourceTree = ""; }; 87910829283877A4005D7B10 /* Network.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Network.swift; sourceTree = ""; }; 8791082E28387D1F005D7B10 /* String+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Extension.swift"; sourceTree = ""; }; 8791C1F127DCD050000D6BA9 /* Notification+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Notification+Extension.swift"; sourceTree = ""; }; @@ -1021,7 +1019,6 @@ children = ( 87163DC92ACAF89B008D4072 /* NetworkResult.swift */, 87910829283877A4005D7B10 /* Network.swift */, - 87910820283875C0005D7B10 /* NetworkController.swift */, 8708005B2B2C4D2D00830B39 /* AuthNetwork.swift */, 8708006A2B2CA57C00830B39 /* DailysNetwork.swift */, 870800782B2D4DE500830B39 /* RecordTimesNetwork.swift */, @@ -2275,7 +2272,6 @@ 870E117C2A0F7EF000CFA77C /* CalendarWidgetCellData.swift in Sources */, 879BE31E2AC317DB007AAC46 /* CGSize+Extension.swift in Sources */, 87862E822B2D8C22004ED313 /* TTNotificationView.swift in Sources */, - 87910821283875C0005D7B10 /* NetworkController.swift in Sources */, 878BF7ED2955E5430044C079 /* SyncDailysVM.swift in Sources */, 870C70732AD51BEB00024CAC /* PredicateChecker.swift in Sources */, 879BE3242AC42758007AAC46 /* TiTiImage.swift in Sources */, diff --git a/Project_Timer/Data/NetworkURL.swift b/Project_Timer/Data/NetworkURL.swift index 897c4345..de37eda6 100644 --- a/Project_Timer/Data/NetworkURL.swift +++ b/Project_Timer/Data/NetworkURL.swift @@ -62,18 +62,6 @@ final class NetworkURL { static let instagramToDeveloper: String = "https://www.instagram.com/dev_mindsang/" static let github: String = "https://github.com/TimerTiTi" - enum Firestore { - static let domain: String = Infos.FirestoreURL.value - static let links: String = domain + "/links" - - static var surveys: String { - switch Language.current { - case .ko: return domain + "/surveys" - default: return domain + "/surveys_eng" - } - } - } - enum WidgetInfo { static var calendarWidget: String { switch Language.current { diff --git a/Project_Timer/Data/lagacy/NetworkController.swift b/Project_Timer/Data/lagacy/NetworkController.swift deleted file mode 100644 index b144b9ad..00000000 --- a/Project_Timer/Data/lagacy/NetworkController.swift +++ /dev/null @@ -1,39 +0,0 @@ -// -// NetworkController.swift -// Project_Timer -// -// Created by Kang Minsang on 2022/05/21. -// Copyright © 2022 FDEE. All rights reserved. -// - -import Foundation -import Alamofire - -protocol SurveysFetchable { - func getSurveys_lagacy(completion: @escaping (Result<[SurveyInfo], NetworkError>) -> Void) -} - -final class NetworkController { - let network: Network - init(network: Network) { - self.network = network - } -} - -extension NetworkController: SurveysFetchable { - func getSurveys_lagacy(completion: @escaping (Result<[SurveyInfo], NetworkError>) -> Void) { - self.network.request(url: NetworkURL.Firestore.surveys, method: .get) { result in - switch result.status { - case .SUCCESS: - guard let data = result.data, - let surveys: SurveyResponse = try? JSONDecoder().decode(SurveyResponse.self, from: data) else { - completion(.failure(.DECODEERROR)) - return - } - completion(.success(surveys.surveyInfos ?? [])) - default: - completion(.failure(NetworkError.error(result))) - } - } - } -} diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/SettingTiTiLabVC.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/SettingTiTiLabVC.swift index e62301be..8d79fa5f 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/SettingTiTiLabVC.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/SettingTiTiLabVC.swift @@ -8,6 +8,7 @@ import UIKit import Combine +import Moya final class SettingTiTiLabVC: UIViewController { static let identifier = "SettingTiTiLabVC" @@ -150,9 +151,12 @@ extension SettingTiTiLabVC { } private func configureViewModel() { - // MARK: NetworkController 생성 관련 로직고민이 필요 - let networkController = NetworkController(network: Network()) - self.viewModel = SettingTiTiLabVM(networkController: networkController) + // TODO: DI 수정 + let api = TTProvider(session: Session(interceptor: NetworkInterceptor.shared)) + let repository = FirebaseRepository(api: api) + let getSurveysUseCase = GetSurveysUseCase(repository: repository) + + self.viewModel = SettingTiTiLabVM(getSurveysUseCase: getSurveysUseCase) } private func stopLoader() { diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/SettingTiTiLabVM.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/SettingTiTiLabVM.swift index c8d0a9f0..f548c3f2 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/SettingTiTiLabVM.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/SettingTiTiLabVM.swift @@ -10,23 +10,27 @@ import Foundation import Combine final class SettingTiTiLabVM { - let networkController: SurveysFetchable + let getSurveysUseCase: GetSurveysUseCase @Published private(set) var infos: [SurveyInfo] = [] @Published private(set) var warning: (title: String, text: String)? + // Combine binding + private var cancellables = Set() - init(networkController: SurveysFetchable) { - self.networkController = networkController + init(getSurveysUseCase: GetSurveysUseCase) { + self.getSurveysUseCase = getSurveysUseCase self.configureInfos() } private func configureInfos() { - self.networkController.getSurveys_lagacy { [weak self] result in - switch result { - case .success(let surveyInfos): + self.getSurveysUseCase.execute() + .sink { [weak self] completion in + if case .failure(let networkError) = completion { + print("ERROR", #function, networkError) + self?.warning = networkError.alertMessage + } + } receiveValue: { [weak self] surveyInfos in self?.infos = surveyInfos - case .failure(let error): - self?.warning = error.alertMessage } - } + .store(in: &self.cancellables) } } From e5503108c4a40a1357f9fd2aacb9a2f71222498f Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sat, 6 Jul 2024 14:29:56 +0900 Subject: [PATCH 30/44] =?UTF-8?q?feat=20#144:=20AuthRepository=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20UseCase=EB=93=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 36 ++++++++++++++++--- Project_Timer/Data/API/AuthAPI.swift | 2 +- .../Data/Repository/AuthRepository.swift | 2 +- ...uest.swift => UpdatePasswordRequest.swift} | 4 +-- Project_Timer/Data/lagacy/AuthNetwork.swift | 2 +- .../Data/lagacy/AuthRepository_lagacy.swift | 2 +- .../UseCase/Auth/CheckEmailExitUseCase.swift | 22 ++++++++++++ .../Auth/CheckUsernameExitUseCsae.swift | 22 ++++++++++++ .../Domain/UseCase/Auth/SigninUseCase.swift | 22 ++++++++++++ .../Domain/UseCase/Auth/SignupUseCase.swift | 22 ++++++++++++ .../UseCase/Auth/UpdatePasswordUseCase.swift | 22 ++++++++++++ .../lagacy/AuthRepositoryInterface.swift | 2 +- Project_Timer/Domain/lagacy/AuthUseCase.swift | 2 +- .../Interface/AuthUseCaseInterface.swift | 2 +- .../Password/ResetPasswordModel.swift | 2 +- 15 files changed, 152 insertions(+), 14 deletions(-) rename Project_Timer/Data/Request/{ResetPasswordRequest.swift => UpdatePasswordRequest.swift} (74%) create mode 100644 Project_Timer/Domain/UseCase/Auth/CheckEmailExitUseCase.swift create mode 100644 Project_Timer/Domain/UseCase/Auth/CheckUsernameExitUseCsae.swift create mode 100644 Project_Timer/Domain/UseCase/Auth/SigninUseCase.swift create mode 100644 Project_Timer/Domain/UseCase/Auth/SignupUseCase.swift create mode 100644 Project_Timer/Domain/UseCase/Auth/UpdatePasswordUseCase.swift diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index f778b705..5e596c74 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -232,6 +232,11 @@ 877911B82A18903000F0A713 /* SettingListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 877911B72A18903000F0A713 /* SettingListCell.swift */; }; 877911BA2A1891B100F0A713 /* SettingSwitchListVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 877911B92A1891B100F0A713 /* SettingSwitchListVM.swift */; }; 877911BC2A18922400F0A713 /* SettingListCellInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 877911BB2A18922400F0A713 /* SettingListCellInfo.swift */; }; + 877BDCE12C390BCE00A50231 /* SignupUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 877BDCE02C390BCE00A50231 /* SignupUseCase.swift */; }; + 877BDCE32C390C7900A50231 /* SigninUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 877BDCE22C390C7900A50231 /* SigninUseCase.swift */; }; + 877BDCE52C390C8800A50231 /* CheckUsernameExitUseCsae.swift in Sources */ = {isa = PBXBuildFile; fileRef = 877BDCE42C390C8800A50231 /* CheckUsernameExitUseCsae.swift */; }; + 877BDCE72C390C9300A50231 /* CheckEmailExitUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 877BDCE62C390C9300A50231 /* CheckEmailExitUseCase.swift */; }; + 877BDCE92C390CA800A50231 /* UpdatePasswordUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 877BDCE82C390CA800A50231 /* UpdatePasswordUseCase.swift */; }; 877D69FC2871C1CB00215B6D /* SurveyResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 877D69FB2871C1CB00215B6D /* SurveyResponse.swift */; }; 878431AD27F6F461000A98B3 /* TodolistVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 878431AC27F6F461000A98B3 /* TodolistVM.swift */; }; 87862E822B2D8C22004ED313 /* TTNotificationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87862E812B2D8C22004ED313 /* TTNotificationView.swift */; }; @@ -344,7 +349,7 @@ 87D4DCC52BA52CDF00BB5AAB /* ResetPasswordNicknameModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D4DCC42BA52CDF00BB5AAB /* ResetPasswordNicknameModel.swift */; }; 87D4DCC72BA52F3800BB5AAB /* ResetPasswordInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D4DCC62BA52F3800BB5AAB /* ResetPasswordInfo.swift */; }; 87D4DCC92BA52FC800BB5AAB /* ResetPasswordNicknameRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D4DCC82BA52FC800BB5AAB /* ResetPasswordNicknameRoute.swift */; }; - 87D4DCCC2BA5477400BB5AAB /* ResetPasswordRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D4DCCB2BA5477400BB5AAB /* ResetPasswordRequest.swift */; }; + 87D4DCCC2BA5477400BB5AAB /* UpdatePasswordRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D4DCCB2BA5477400BB5AAB /* UpdatePasswordRequest.swift */; }; 87D4DCCF2BA5492700BB5AAB /* SimpleResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D4DCCE2BA5492700BB5AAB /* SimpleResponse.swift */; }; 87D4DCD22BA5A4C400BB5AAB /* ResetPasswordEmailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D4DCD12BA5A4C400BB5AAB /* ResetPasswordEmailView.swift */; }; 87D4DCD42BA5A53F00BB5AAB /* ResetPasswordEmailModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D4DCD32BA5A53F00BB5AAB /* ResetPasswordEmailModel.swift */; }; @@ -658,6 +663,11 @@ 877911B72A18903000F0A713 /* SettingListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingListCell.swift; sourceTree = ""; }; 877911B92A1891B100F0A713 /* SettingSwitchListVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingSwitchListVM.swift; sourceTree = ""; }; 877911BB2A18922400F0A713 /* SettingListCellInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingListCellInfo.swift; sourceTree = ""; }; + 877BDCE02C390BCE00A50231 /* SignupUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignupUseCase.swift; sourceTree = ""; }; + 877BDCE22C390C7900A50231 /* SigninUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SigninUseCase.swift; sourceTree = ""; }; + 877BDCE42C390C8800A50231 /* CheckUsernameExitUseCsae.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckUsernameExitUseCsae.swift; sourceTree = ""; }; + 877BDCE62C390C9300A50231 /* CheckEmailExitUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckEmailExitUseCase.swift; sourceTree = ""; }; + 877BDCE82C390CA800A50231 /* UpdatePasswordUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdatePasswordUseCase.swift; sourceTree = ""; }; 877D69FB2871C1CB00215B6D /* SurveyResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SurveyResponse.swift; sourceTree = ""; }; 878431AC27F6F461000A98B3 /* TodolistVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TodolistVM.swift; sourceTree = ""; }; 87862E812B2D8C22004ED313 /* TTNotificationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TTNotificationView.swift; sourceTree = ""; }; @@ -769,7 +779,7 @@ 87D4DCC42BA52CDF00BB5AAB /* ResetPasswordNicknameModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResetPasswordNicknameModel.swift; sourceTree = ""; }; 87D4DCC62BA52F3800BB5AAB /* ResetPasswordInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResetPasswordInfo.swift; sourceTree = ""; }; 87D4DCC82BA52FC800BB5AAB /* ResetPasswordNicknameRoute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResetPasswordNicknameRoute.swift; sourceTree = ""; }; - 87D4DCCB2BA5477400BB5AAB /* ResetPasswordRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResetPasswordRequest.swift; sourceTree = ""; }; + 87D4DCCB2BA5477400BB5AAB /* UpdatePasswordRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdatePasswordRequest.swift; sourceTree = ""; }; 87D4DCCE2BA5492700BB5AAB /* SimpleResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimpleResponse.swift; sourceTree = ""; }; 87D4DCD12BA5A4C400BB5AAB /* ResetPasswordEmailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResetPasswordEmailView.swift; sourceTree = ""; }; 87D4DCD32BA5A53F00BB5AAB /* ResetPasswordEmailModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResetPasswordEmailModel.swift; sourceTree = ""; }; @@ -1378,6 +1388,18 @@ path = Setting; sourceTree = ""; }; + 877BDCDF2C390BAE00A50231 /* Auth */ = { + isa = PBXGroup; + children = ( + 877BDCE02C390BCE00A50231 /* SignupUseCase.swift */, + 877BDCE22C390C7900A50231 /* SigninUseCase.swift */, + 877BDCE42C390C8800A50231 /* CheckUsernameExitUseCsae.swift */, + 877BDCE62C390C9300A50231 /* CheckEmailExitUseCase.swift */, + 877BDCE82C390CA800A50231 /* UpdatePasswordUseCase.swift */, + ); + path = Auth; + sourceTree = ""; + }; 87862E852B2D9F8D004ED313 /* Notification */ = { isa = PBXGroup; children = ( @@ -1700,7 +1722,7 @@ 87D4DCCA2BA5476900BB5AAB /* Request */ = { isa = PBXGroup; children = ( - 87D4DCCB2BA5477400BB5AAB /* ResetPasswordRequest.swift */, + 87D4DCCB2BA5477400BB5AAB /* UpdatePasswordRequest.swift */, 874B54272C158F890062D0AC /* CheckEmailExitRequest.swift */, 87D7ED142952B3C100121DE6 /* TestUserSignupRequest.swift */, 87D7ED162952B69200121DE6 /* TestUserSigninRequest.swift */, @@ -1952,6 +1974,7 @@ isa = PBXGroup; children = ( 872210532C300922003B97AD /* Firebase */, + 877BDCDF2C390BAE00A50231 /* Auth */, ); path = UseCase; sourceTree = ""; @@ -2390,6 +2413,7 @@ 049BBA9A28AB5747005BAB1B /* TaskModifyInteractionView.swift in Sources */, 87A8CD272AF0C4B600D4C1D7 /* OverlayShowButtonForSecureFieldView.swift in Sources */, 870E85012AD67E46000511BD /* KeyboardResponder.swift in Sources */, + 877BDCE92C390CA800A50231 /* UpdatePasswordUseCase.swift in Sources */, 870800872B2D599800830B39 /* SyncLogRepository_lagacy.swift in Sources */, 87A48BCB27DF112B00F46D0F /* LogHomeVM.swift in Sources */, 87D7ED172952B69200121DE6 /* TestUserSigninRequest.swift in Sources */, @@ -2448,6 +2472,7 @@ 8706C32E2AEF878D00F7C842 /* TTSignupTextFieldUnderlineView.swift in Sources */, 87199F442882BC430017D01A /* StandardDailyGraphView.swift in Sources */, 93B08521248DDF2F00E215BD /* AppDelegate.swift in Sources */, + 877BDCE32C390C7900A50231 /* SigninUseCase.swift in Sources */, 874B542C2C1592460062D0AC /* DailysRepository.swift in Sources */, 870800522B2C3A0800830B39 /* ServerURLResponse.swift in Sources */, 8791C1F227DCD050000D6BA9 /* Notification+Extension.swift in Sources */, @@ -2495,6 +2520,7 @@ 872C0EDB284ADD8300E8E3F2 /* SettingUpdateHistoryVC.swift in Sources */, 87F1093C284C589A002E31EA /* FunctionInfoCell.swift in Sources */, 87D4DCE42BA6A18C00BB5AAB /* ChangeCompleteInfo.swift in Sources */, + 877BDCE12C390BCE00A50231 /* SignupUseCase.swift in Sources */, 8788997A2894EFEE00B7F378 /* LogWeekVC.swift in Sources */, 872C0EE1284AE57200E8E3F2 /* SettingTiTiLabVC.swift in Sources */, 875EDA362957F9510037A7EB /* LoadingIndicator.swift in Sources */, @@ -2534,7 +2560,7 @@ 87C2F97B28A6BFC700F44D98 /* ModifyRecordVC.swift in Sources */, 8708008B2B2D5A4400830B39 /* SyncLogRepositoryInterface.swift in Sources */, 873731D92B2E97FE00D7BD9F /* GetNotificationUseCase.swift in Sources */, - 87D4DCCC2BA5477400BB5AAB /* ResetPasswordRequest.swift in Sources */, + 87D4DCCC2BA5477400BB5AAB /* UpdatePasswordRequest.swift in Sources */, 879A2BA8284746A500B69DA7 /* SettingFooterView.swift in Sources */, 04E0DFC328A9031A004DABBE /* ModifyRecordVM.swift in Sources */, 8769349727E1BBAF00D33F51 /* TodoCell.swift in Sources */, @@ -2577,10 +2603,12 @@ 87862E892B2DBBDA004ED313 /* PopupVC.swift in Sources */, 8760FB112A1DED3F0068CEF5 /* CalendarWidgetView.swift in Sources */, 875C98C92871BFCF008F7ADD /* UserDefaults+Extension.swift in Sources */, + 877BDCE52C390C8800A50231 /* CheckUsernameExitUseCsae.swift in Sources */, 87D4DCE62BA6A2AB00BB5AAB /* TTChangeCompleteTitleView.swift in Sources */, 874F9C332ABFFDDF00675A86 /* SigninView.swift in Sources */, 87D4DCDB2BA5C19C00BB5AAB /* ResetPasswordModel.swift in Sources */, 87DE1177268AC9AD0012F043 /* DailyManager.swift in Sources */, + 877BDCE72C390C9300A50231 /* CheckEmailExitUseCase.swift in Sources */, 8708007F2B2D543500830B39 /* RecordTimesUseCase.swift in Sources */, 8708005F2B2C5F5F00830B39 /* AuthResponse.swift in Sources */, 8721C6D72969123E00410D57 /* IOUsecase.swift in Sources */, diff --git a/Project_Timer/Data/API/AuthAPI.swift b/Project_Timer/Data/API/AuthAPI.swift index a1b72021..e152dc6a 100644 --- a/Project_Timer/Data/API/AuthAPI.swift +++ b/Project_Timer/Data/API/AuthAPI.swift @@ -14,7 +14,7 @@ enum AuthAPI { case postSignin(TestUserSigninRequest) case getCheckUsername(String) case getCheckEmail(CheckEmailExitRequest) - case postUpdatePassword(ResetPasswordRequest) + case postUpdatePassword(UpdatePasswordRequest) } extension AuthAPI: TargetType { diff --git a/Project_Timer/Data/Repository/AuthRepository.swift b/Project_Timer/Data/Repository/AuthRepository.swift index cf7e508e..7a520e6e 100644 --- a/Project_Timer/Data/Repository/AuthRepository.swift +++ b/Project_Timer/Data/Repository/AuthRepository.swift @@ -46,7 +46,7 @@ final class AuthRepository { .catchDecodeError() } - func updatePassword(request: ResetPasswordRequest) -> AnyPublisher { + func updatePassword(request: UpdatePasswordRequest) -> AnyPublisher { return self.api.request(.postUpdatePassword(request)) .map(SimpleResponse.self) .map { $0.toDomain() } diff --git a/Project_Timer/Data/Request/ResetPasswordRequest.swift b/Project_Timer/Data/Request/UpdatePasswordRequest.swift similarity index 74% rename from Project_Timer/Data/Request/ResetPasswordRequest.swift rename to Project_Timer/Data/Request/UpdatePasswordRequest.swift index 8379acbd..759191fe 100644 --- a/Project_Timer/Data/Request/ResetPasswordRequest.swift +++ b/Project_Timer/Data/Request/UpdatePasswordRequest.swift @@ -1,5 +1,5 @@ // -// ResetPasswordRequest.swift +// UpdatePasswordRequest.swift // Project_Timer // // Created by Kang Minsang on 2024/03/16. @@ -8,7 +8,7 @@ import Foundation -struct ResetPasswordRequest: Encodable { +struct UpdatePasswordRequest: Encodable { let username: String let email: String let newPassword: String diff --git a/Project_Timer/Data/lagacy/AuthNetwork.swift b/Project_Timer/Data/lagacy/AuthNetwork.swift index e6041dca..176b87f7 100644 --- a/Project_Timer/Data/lagacy/AuthNetwork.swift +++ b/Project_Timer/Data/lagacy/AuthNetwork.swift @@ -57,7 +57,7 @@ final class AuthNetwork { } } - func updatePassword(request: ResetPasswordRequest, completion: @escaping (NetworkResult) -> Void) { + func updatePassword(request: UpdatePasswordRequest, completion: @escaping (NetworkResult) -> Void) { self.network.request(url: self.resetPasswordURL, method: .post, body: request) { result in completion(result) } diff --git a/Project_Timer/Data/lagacy/AuthRepository_lagacy.swift b/Project_Timer/Data/lagacy/AuthRepository_lagacy.swift index c0667d7f..78a09b9a 100644 --- a/Project_Timer/Data/lagacy/AuthRepository_lagacy.swift +++ b/Project_Timer/Data/lagacy/AuthRepository_lagacy.swift @@ -85,7 +85,7 @@ final class AuthRepository_lagacy: AuthRepositoryInterface { } } - func updatePassword(request: ResetPasswordRequest, completion: @escaping (Result) -> Void) { + func updatePassword(request: UpdatePasswordRequest, completion: @escaping (Result) -> Void) { api.updatePassword(request: request) { result in switch result.status { case .SUCCESS: diff --git a/Project_Timer/Domain/UseCase/Auth/CheckEmailExitUseCase.swift b/Project_Timer/Domain/UseCase/Auth/CheckEmailExitUseCase.swift new file mode 100644 index 00000000..02c6e973 --- /dev/null +++ b/Project_Timer/Domain/UseCase/Auth/CheckEmailExitUseCase.swift @@ -0,0 +1,22 @@ +// +// CheckEmailExitUseCase.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/07/06. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Combine + +final class CheckEmailExitUseCase { + private let repository: AuthRepository // TODO: 프로토콜로 수정 + + init(repository: AuthRepository) { + self.repository = repository + } + + func execute(request: CheckEmailExitRequest) -> AnyPublisher { + return self.repository.checkEmailExit(request: request) + } +} diff --git a/Project_Timer/Domain/UseCase/Auth/CheckUsernameExitUseCsae.swift b/Project_Timer/Domain/UseCase/Auth/CheckUsernameExitUseCsae.swift new file mode 100644 index 00000000..03354480 --- /dev/null +++ b/Project_Timer/Domain/UseCase/Auth/CheckUsernameExitUseCsae.swift @@ -0,0 +1,22 @@ +// +// CheckUsernameExitUseCsae.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/07/06. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Combine + +final class CheckUsernameExitUseCsae { + private let repository: AuthRepository // TODO: 프로토콜로 수정 + + init(repository: AuthRepository) { + self.repository = repository + } + + func execute(username: String) -> AnyPublisher { + return self.repository.checkUsernameExit(username: username) + } +} diff --git a/Project_Timer/Domain/UseCase/Auth/SigninUseCase.swift b/Project_Timer/Domain/UseCase/Auth/SigninUseCase.swift new file mode 100644 index 00000000..87e6c513 --- /dev/null +++ b/Project_Timer/Domain/UseCase/Auth/SigninUseCase.swift @@ -0,0 +1,22 @@ +// +// SigninUseCase.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/07/06. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Combine + +final class SigninUseCase { + private let repository: AuthRepository // TODO: 프로토콜로 수정 + + init(repository: AuthRepository) { + self.repository = repository + } + + func execute(request: TestUserSigninRequest) -> AnyPublisher { + return self.repository.signin(request: request) + } +} diff --git a/Project_Timer/Domain/UseCase/Auth/SignupUseCase.swift b/Project_Timer/Domain/UseCase/Auth/SignupUseCase.swift new file mode 100644 index 00000000..f4d68ec0 --- /dev/null +++ b/Project_Timer/Domain/UseCase/Auth/SignupUseCase.swift @@ -0,0 +1,22 @@ +// +// PostSignupUseCase.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/07/06. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Combine + +final class SignupUseCase { + private let repository: AuthRepository // TODO: 프로토콜로 수정 + + init(repository: AuthRepository) { + self.repository = repository + } + + func execute(request: TestUserSignupRequest) -> AnyPublisher { + return self.repository.signup(request: request) + } +} diff --git a/Project_Timer/Domain/UseCase/Auth/UpdatePasswordUseCase.swift b/Project_Timer/Domain/UseCase/Auth/UpdatePasswordUseCase.swift new file mode 100644 index 00000000..8b0c6f34 --- /dev/null +++ b/Project_Timer/Domain/UseCase/Auth/UpdatePasswordUseCase.swift @@ -0,0 +1,22 @@ +// +// UpdatePasswordUseCase.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/07/06. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Combine + +final class UpdatePasswordUseCase { + private let repository: AuthRepository // TODO: 프로토콜로 수정 + + init(repository: AuthRepository) { + self.repository = repository + } + + func execute(request: UpdatePasswordRequest) -> AnyPublisher { + return self.repository.updatePassword(request: request) + } +} diff --git a/Project_Timer/Domain/lagacy/AuthRepositoryInterface.swift b/Project_Timer/Domain/lagacy/AuthRepositoryInterface.swift index 51679acc..da22d72b 100644 --- a/Project_Timer/Domain/lagacy/AuthRepositoryInterface.swift +++ b/Project_Timer/Domain/lagacy/AuthRepositoryInterface.swift @@ -13,5 +13,5 @@ protocol AuthRepositoryInterface { func signin(signinInfo: TestUserSigninRequest, completion: @escaping (Result) -> Void) func checkUsername(username: String, completion: @escaping (Result) -> Void) func checkEmail(username: String, email: String, completion: @escaping (Result) -> Void) - func updatePassword(request: ResetPasswordRequest, completion: @escaping (Result) -> Void) + func updatePassword(request: UpdatePasswordRequest, completion: @escaping (Result) -> Void) } diff --git a/Project_Timer/Domain/lagacy/AuthUseCase.swift b/Project_Timer/Domain/lagacy/AuthUseCase.swift index 5729fc13..ccbd4bd7 100644 --- a/Project_Timer/Domain/lagacy/AuthUseCase.swift +++ b/Project_Timer/Domain/lagacy/AuthUseCase.swift @@ -61,7 +61,7 @@ final class AuthUseCase: AuthUseCaseInterface { } } - func updatePassword(request: ResetPasswordRequest, completion: @escaping (Result) -> Void) { + func updatePassword(request: UpdatePasswordRequest, completion: @escaping (Result) -> Void) { self.repository.updatePassword(request: request) { result in switch result { case .success(let simpleResponse): diff --git a/Project_Timer/Present/Interface/AuthUseCaseInterface.swift b/Project_Timer/Present/Interface/AuthUseCaseInterface.swift index ccd51839..caff67c4 100644 --- a/Project_Timer/Present/Interface/AuthUseCaseInterface.swift +++ b/Project_Timer/Present/Interface/AuthUseCaseInterface.swift @@ -14,5 +14,5 @@ protocol AuthUseCaseInterface { func signin(signinInfo: TestUserSigninRequest, completion: @escaping (Result) -> Void) func checkUsername(username: String, completion: @escaping (Result) -> Void) func checkEmail(username: String, email: String, completion: @escaping (Result) -> Void) - func updatePassword(request: ResetPasswordRequest, completion: @escaping (Result) -> Void) + func updatePassword(request: UpdatePasswordRequest, completion: @escaping (Result) -> Void) } diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Password/ResetPasswordModel.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Password/ResetPasswordModel.swift index 76a057de..2f83e78b 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Password/ResetPasswordModel.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Password/ResetPasswordModel.swift @@ -130,7 +130,7 @@ extension ResetPasswordModel { } // 비밀번호가 일치하는 경우 서버 통신 else { - let request = ResetPasswordRequest( + let request = UpdatePasswordRequest( username: self.infos.nickname, email: self.infos.email, newPassword: self.password2 From 9238ebcc7937e072d74611a09054de3fe13f42a2 Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sat, 6 Jul 2024 23:34:30 +0900 Subject: [PATCH 31/44] =?UTF-8?q?feat=20#144:=20SignupUseCase,=20SigninUse?= =?UTF-8?q?Case=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SettingTiTiLab/SettingTiTiLabVC.swift | 8 +- .../TestServer/SignupSigninVC.swift | 14 +++- .../TestServer/SignupSigninVM.swift | 81 ++++++++++--------- 3 files changed, 59 insertions(+), 44 deletions(-) diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/SettingTiTiLabVC.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/SettingTiTiLabVC.swift index 8d79fa5f..b1ef71d3 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/SettingTiTiLabVC.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/SettingTiTiLabVC.swift @@ -108,8 +108,12 @@ extension SettingTiTiLabVC { } private func showBetaSigninSignupVC(signin: Bool) { - let authUseCase = AuthUseCase(repository: AuthRepository_lagacy()) - let viewModel = SignupSigninVM(authUseCase: authUseCase, isSignin: signin) + // TODO: DI 수정 + let api = TTProvider(session: Session(interceptor: NetworkInterceptor.shared)) + let repository = AuthRepository(api: api) + let signupUseCase = SignupUseCase(repository: repository) + let signinUseCase = SigninUseCase(repository: repository) + let viewModel = SignupSigninVM(signupUseCase: signupUseCase, signinUseCase: signinUseCase, isSignin: signin) let vc = SignupSigninVC(viewModel: viewModel) self.navigationController?.pushViewController(vc, animated: true) } diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVC.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVC.swift index d5c0469e..8ddace1d 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVC.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVC.swift @@ -8,6 +8,7 @@ import UIKit import Combine +import Moya import MessageUI class SignupSigninVC: WhiteNavigationVC { @@ -316,10 +317,10 @@ extension SignupSigninVC { let password = self?.passwordTextField.textField.text else { return } if self?.viewModel.isSignin == true { - self?.viewModel.signin(info: TestUserSigninRequest(username: username, password: password)) + self?.viewModel.signin(request: TestUserSigninRequest(username: username, password: password)) } else { guard let email = self?.emailTextField.textField.text else { return } - self?.viewModel.signup(info: TestUserSignupRequest(username: username, email: email, password: password)) + self?.viewModel.signup(request: TestUserSignupRequest(username: username, email: email, password: password)) } }), for: .touchUpInside) @@ -513,8 +514,13 @@ import SwiftUI #Preview { UIViewControllerPreview { - let authUseCase = AuthUseCase(repository: AuthRepository_lagacy()) - let viewModel = SignupSigninVM(authUseCase: authUseCase, isSignin: false) + // TODO: DI 수정 + let api = TTProvider(session: Session(interceptor: NetworkInterceptor.shared)) + let repository = AuthRepository(api: api) + let signupUseCase = SignupUseCase(repository: repository) + let signinUseCase = SigninUseCase(repository: repository) + + let viewModel = SignupSigninVM(signupUseCase: signupUseCase, signinUseCase: signinUseCase, isSignin: false) return SignupSigninVC(viewModel: viewModel) } } diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVM.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVM.swift index b58877e8..f0b220e7 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVM.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVM.swift @@ -10,7 +10,8 @@ import Foundation import Combine final class SignupSigninVM { - private let authUseCase: AuthUseCaseInterface + private let signupUseCase: SignupUseCase + private let signinUseCase: SigninUseCase let isSignin: Bool @Published var loadingText: String? @Published var alert: (title: String, text: String)? @@ -19,9 +20,9 @@ final class SignupSigninVM { // Combine binding private var cancellables = Set() - init(authUseCase: AuthUseCaseInterface, - isSignin: Bool) { - self.authUseCase = authUseCase + init(signupUseCase: SignupUseCase, signinUseCase: SigninUseCase, isSignin: Bool) { + self.signupUseCase = signupUseCase + self.signinUseCase = signinUseCase self.isSignin = isSignin self.checkServerURL() @@ -38,45 +39,49 @@ final class SignupSigninVM { } - func signup(info: TestUserSignupRequest) { + func signup(request: TestUserSignupRequest) { self.loadingText = "Waiting for Signup..." - self.authUseCase.signup(signupInfo: info) { [weak self] result in - self?.loadingText = nil - switch result { - case .success(let token): - self?.saveUserInfo(username: info.username, password: info.password, token: token) - case .failure(let error): - switch error { - // signup 관련 error message 추가 - case .CLIENTERROR(_): - self?.alert = (title: Localized.string(.SignUp_Error_SignupError), text: Localized.string(.SignUp_Error_CheckNicknameOrEmail)) - default: - self?.alert = error.alertMessage + self.signupUseCase.execute(request: request) + .sink { [weak self] completion in + self?.loadingText = nil + if case .failure(let networkError) = completion { + print("ERROR", #function, networkError) + switch networkError { + // signup 관련 error message 추가 + case .CLIENTERROR(_): + self?.alert = (title: Localized.string(.SignUp_Error_SignupError), text: Localized.string(.SignUp_Error_CheckNicknameOrEmail)) + default: + self?.alert = networkError.alertMessage + } } + } receiveValue: { [weak self] authInfo in + self?.saveUserInfo(authInfo: authInfo, password: request.password) } - } + .store(in: &self.cancellables) } - func signin(info: TestUserSigninRequest) { + func signin(request: TestUserSigninRequest) { self.loadingText = "Waiting for Signin..." - self.authUseCase.signin(signinInfo: info) { [weak self] result in - self?.loadingText = nil - switch result { - case .success(let token): - self?.saveUserInfo(username: info.username, password: info.password, token: token) - case .failure(let error): - switch error { - // signin 관련 error message 추가 - case .CLIENTERROR(_): - self?.alert = (title: Localized.string(.SignIn_Error_SigninFail), text: Localized.string(.SignIn_Error_CheckNicknameOrPassword)) - // TestServer 에러핸들링 이슈로 404코드 추가 - case .NOTFOUND(_): - self?.alert = (title: Localized.string(.SignIn_Error_SigninFail), text: Localized.string(.SignIn_Error_CheckNicknameOrPassword)) - default: - self?.alert = error.alertMessage + self.signinUseCase.execute(request: request) + .sink { [weak self] completion in + self?.loadingText = nil + if case .failure(let networkError) = completion { + print("ERROR", #function, networkError) + switch networkError { + // signin 관련 error message 추가 + case .CLIENTERROR(_): + self?.alert = (title: Localized.string(.SignIn_Error_SigninFail), text: Localized.string(.SignIn_Error_CheckNicknameOrPassword)) + // TestServer 에러핸들링 이슈로 404코드 추가 + case .NOTFOUND(_): + self?.alert = (title: Localized.string(.SignIn_Error_SigninFail), text: Localized.string(.SignIn_Error_CheckNicknameOrPassword)) + default: + self?.alert = networkError.alertMessage + } } + } receiveValue: { [weak self] authInfo in + self?.saveUserInfo(authInfo: authInfo, password: request.password) } - } + .store(in: &self.cancellables) } func check(nickname: String?, email: String?, password: String?) { @@ -87,11 +92,11 @@ final class SignupSigninVM { } } - private func saveUserInfo(username: String, password: String, token: String) { + private func saveUserInfo(authInfo: AuthInfo, password: String) { // MARK: Token 저장, Noti signined - guard [KeyChain.shared.save(key: .username, value: username), + guard [KeyChain.shared.save(key: .username, value: authInfo.username), KeyChain.shared.save(key: .password, value: password), - KeyChain.shared.save(key: .token, value: token)].allSatisfy({ $0 }) == true else { + KeyChain.shared.save(key: .token, value: authInfo.token)].allSatisfy({ $0 }) == true else { self.alert = (title: "Keychain save fail", text: "") return } From 0a65a67d2781dfa7224f25af63a45ec9d4f40622 Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sun, 7 Jul 2024 00:14:18 +0900 Subject: [PATCH 32/44] =?UTF-8?q?feat=20#144:=20CheckUsernameExitUseCase?= =?UTF-8?q?=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 4 ++ Project_Timer/Data/API/AuthAPI.swift | 6 +-- .../Data/Repository/AuthRepository.swift | 4 +- .../Data/Request/CheckUsernameRequest.swift | 13 +++++++ .../Auth/CheckUsernameExitUseCsae.swift | 4 +- .../Nickname/ResetPasswordNicknameModel.swift | 38 ++++++++++--------- .../Nickname/ResetPasswordNicknameView.swift | 15 +++++--- .../ResetPassword/ResetPasswordVC.swift | 11 ++++-- 8 files changed, 61 insertions(+), 34 deletions(-) create mode 100644 Project_Timer/Data/Request/CheckUsernameRequest.swift diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index 5e596c74..163584eb 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -83,6 +83,7 @@ 870F90E32AEFF7FC00854DDB /* SignupPasswordView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870F90E22AEFF7FC00854DDB /* SignupPasswordView.swift */; }; 870F90E52AEFFA9300854DDB /* SignupPasswordModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870F90E42AEFFA9300854DDB /* SignupPasswordModel.swift */; }; 870F90E72AEFFF1A00854DDB /* SignupPasswordRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870F90E62AEFFF1A00854DDB /* SignupPasswordRoute.swift */; }; + 871616912C39956E00C4EF25 /* CheckUsernameRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 871616902C39956E00C4EF25 /* CheckUsernameRequest.swift */; }; 87163DC82ACAF2E8008D4072 /* NetworkError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87163DC72ACAF2E8008D4072 /* NetworkError.swift */; }; 87163DCA2ACAF89B008D4072 /* NetworkResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87163DC92ACAF89B008D4072 /* NetworkResult.swift */; }; 87168D99299A819F003ED502 /* UserDefaults+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875C98C82871BFCF008F7ADD /* UserDefaults+Extension.swift */; }; @@ -525,6 +526,7 @@ 870F90E22AEFF7FC00854DDB /* SignupPasswordView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignupPasswordView.swift; sourceTree = ""; }; 870F90E42AEFFA9300854DDB /* SignupPasswordModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignupPasswordModel.swift; sourceTree = ""; }; 870F90E62AEFFF1A00854DDB /* SignupPasswordRoute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignupPasswordRoute.swift; sourceTree = ""; }; + 871616902C39956E00C4EF25 /* CheckUsernameRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckUsernameRequest.swift; sourceTree = ""; }; 87163DC72ACAF2E8008D4072 /* NetworkError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkError.swift; sourceTree = ""; }; 87163DC92ACAF89B008D4072 /* NetworkResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkResult.swift; sourceTree = ""; }; 87199F432882BC430017D01A /* StandardDailyGraphView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StandardDailyGraphView.swift; sourceTree = ""; }; @@ -1726,6 +1728,7 @@ 874B54272C158F890062D0AC /* CheckEmailExitRequest.swift */, 87D7ED142952B3C100121DE6 /* TestUserSignupRequest.swift */, 87D7ED162952B69200121DE6 /* TestUserSigninRequest.swift */, + 871616902C39956E00C4EF25 /* CheckUsernameRequest.swift */, ); path = Request; sourceTree = ""; @@ -2358,6 +2361,7 @@ 873C197628D041DE00E02ADC /* DailyView.swift in Sources */, 87D4DCCF2BA5492700BB5AAB /* SimpleResponse.swift in Sources */, 87B90B3C2BF4B13D00D6886E /* AppVersionResponse.swift in Sources */, + 871616912C39956E00C4EF25 /* CheckUsernameRequest.swift in Sources */, 875FAE282B1C679D008F19D2 /* AppLatestVersionInfo.swift in Sources */, 87DC6A4928D0104300455A06 /* WeekVM.swift in Sources */, 048D8AC628AA1B7700A2456D /* AddHistoryCell.swift in Sources */, diff --git a/Project_Timer/Data/API/AuthAPI.swift b/Project_Timer/Data/API/AuthAPI.swift index e152dc6a..dd2fecce 100644 --- a/Project_Timer/Data/API/AuthAPI.swift +++ b/Project_Timer/Data/API/AuthAPI.swift @@ -12,7 +12,7 @@ import Moya enum AuthAPI { case postSignup(TestUserSignupRequest) case postSignin(TestUserSigninRequest) - case getCheckUsername(String) + case getCheckUsername(CheckUsernameRequest) case getCheckEmail(CheckEmailExitRequest) case postUpdatePassword(UpdatePasswordRequest) } @@ -51,9 +51,9 @@ extension AuthAPI: TargetType { case .postSignin(let request): return .requestJSONEncodable(request) case .getCheckUsername(let request): - return .requestJSONEncodable(request) + return .requestParameters(parameters: Self.parameters(from: request), encoding: URLEncoding.queryString) case .getCheckEmail(let request): - return .requestJSONEncodable(request) + return .requestParameters(parameters: Self.parameters(from: request), encoding: URLEncoding.queryString) case .postUpdatePassword(let request): return .requestJSONEncodable(request) } diff --git a/Project_Timer/Data/Repository/AuthRepository.swift b/Project_Timer/Data/Repository/AuthRepository.swift index 7a520e6e..d770b469 100644 --- a/Project_Timer/Data/Repository/AuthRepository.swift +++ b/Project_Timer/Data/Repository/AuthRepository.swift @@ -32,8 +32,8 @@ final class AuthRepository { .catchDecodeError() } - func checkUsernameExit(username: String) -> AnyPublisher { - return self.api.request(.getCheckUsername(username)) + func checkUsernameExit(request: CheckUsernameRequest) -> AnyPublisher { + return self.api.request(.getCheckUsername(request)) .map(SimpleResponse.self) .map { $0.toDomain() } .catchDecodeError() diff --git a/Project_Timer/Data/Request/CheckUsernameRequest.swift b/Project_Timer/Data/Request/CheckUsernameRequest.swift new file mode 100644 index 00000000..654caac5 --- /dev/null +++ b/Project_Timer/Data/Request/CheckUsernameRequest.swift @@ -0,0 +1,13 @@ +// +// CheckUsernameRequest.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/07/07. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation + +struct CheckUsernameRequest: Encodable { + let username: String +} diff --git a/Project_Timer/Domain/UseCase/Auth/CheckUsernameExitUseCsae.swift b/Project_Timer/Domain/UseCase/Auth/CheckUsernameExitUseCsae.swift index 03354480..fe16e0a0 100644 --- a/Project_Timer/Domain/UseCase/Auth/CheckUsernameExitUseCsae.swift +++ b/Project_Timer/Domain/UseCase/Auth/CheckUsernameExitUseCsae.swift @@ -16,7 +16,7 @@ final class CheckUsernameExitUseCsae { self.repository = repository } - func execute(username: String) -> AnyPublisher { - return self.repository.checkUsernameExit(username: username) + func execute(request: CheckUsernameRequest) -> AnyPublisher { + return self.repository.checkUsernameExit(request: request) } } diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Nickname/ResetPasswordNicknameModel.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Nickname/ResetPasswordNicknameModel.swift index abe7836b..813bb1ed 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Nickname/ResetPasswordNicknameModel.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Nickname/ResetPasswordNicknameModel.swift @@ -8,6 +8,7 @@ import Foundation import SwiftUI +import Combine // MARK: State final class ResetPasswordNicknameModel: ObservableObject { @@ -28,13 +29,14 @@ final class ResetPasswordNicknameModel: ObservableObject { @Published var focus: TTSignupTextFieldView.type? @Published var validNickname: Bool? @Published var errorMessage: ErrorMessage? - @Published var nickname: String = "" + // Combine binding + private var cancellables = Set() - let authUseCase: AuthUseCaseInterface + let checkUsenameExitUseCase: CheckUsernameExitUseCsae - init(authUseCase: AuthUseCaseInterface) { - self.authUseCase = authUseCase + init(checkUsenameExitUseCase: CheckUsernameExitUseCsae) { + self.checkUsenameExitUseCase = checkUsenameExitUseCase } var nicknameWarningVisible: Bool { @@ -76,20 +78,22 @@ extension ResetPasswordNicknameModel { // nickname done 액션 func checkNickname() { - self.authUseCase.checkUsername(username: self.nickname) { [weak self] result in - switch result { - case .success(let simpleResponse): - self?.validNickname = simpleResponse.data - case .failure(let error): - self?.validNickname = false - switch error { - case .NOTFOUND(_): - self?.errorMessage = .notExist - default: - self?.errorMessage = .serverError - print("Error: \(error.title), \(error.message)") + self.checkUsenameExitUseCase.execute(request: .init(username: self.nickname)) + .sink { [weak self] completion in + if case .failure(let networkError) = completion { + print("ERROR", #function, networkError) + self?.validNickname = false + switch networkError { + case .NOTFOUND(_): + self?.errorMessage = .notExist + default: + self?.errorMessage = .serverError + print(networkError.alertMessage) + } } + } receiveValue: { [weak self] valid in + self?.validNickname = valid } - } + .store(in: &self.cancellables) } } diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Nickname/ResetPasswordNicknameView.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Nickname/ResetPasswordNicknameView.swift index c00e8328..567ec770 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Nickname/ResetPasswordNicknameView.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Nickname/ResetPasswordNicknameView.swift @@ -7,6 +7,8 @@ // import SwiftUI +import Combine +import Moya struct ResetPasswordNicknameView: View { @ObservedObject private var keyboard = KeyboardResponder.shared @@ -50,7 +52,7 @@ struct ResetPasswordNicknameView: View { .navigationDestination(for: ResetPasswordNicknameRoute.self) { destination in switch destination { case .resetPasswordEmail: - let authUseCase = self.model.authUseCase + let authUseCase = AuthUseCase(repository: AuthRepository_lagacy()) let infos = model.resetPasswordInfosForEmail let viewModel = ResetPasswordEmailModel( authUseCase: authUseCase, @@ -120,13 +122,14 @@ struct ResetPasswordNicknameView: View { struct ResetPasswordNicknameView_Previews: PreviewProvider { static var previews: some View { - ResetPasswordNicknameView( - model: ResetPasswordNicknameModel(authUseCase: AuthUseCase(repository: AuthRepository_lagacy()))) - .environmentObject(ResetPasswordEnvironment()) + // TODO: DI 수정 + let api = TTProvider(session: Session(interceptor: NetworkInterceptor.shared)) + let repository = AuthRepository(api: api) + let checkUsernameExitUseCase = CheckUsernameExitUseCsae(repository: repository) + let viewModel = ResetPasswordNicknameModel(checkUsenameExitUseCase: checkUsernameExitUseCase) ResetPasswordNicknameView( - model: ResetPasswordNicknameModel(authUseCase: AuthUseCase(repository: AuthRepository_lagacy()))) + model: ResetPasswordNicknameModel(checkUsenameExitUseCase: checkUsernameExitUseCase)) .environmentObject(ResetPasswordEnvironment()) - .environment(\.locale, .init(identifier: "en")) } } diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/ResetPasswordVC.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/ResetPasswordVC.swift index cad37226..a3688c24 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/ResetPasswordVC.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/ResetPasswordVC.swift @@ -8,6 +8,7 @@ import UIKit import Combine +import Moya import SwiftUI final class ResetPasswordVC: PortraitVC { @@ -30,10 +31,12 @@ final class ResetPasswordVC: PortraitVC { private func configureHostingVC() { guard let environment = self.environment else { return } - let authRepository = AuthRepository_lagacy() - let authUseCase = AuthUseCase(repository: authRepository) - let resetPasswordNicknameModel = ResetPasswordNicknameModel(authUseCase: authUseCase) - let hostingVC = UIHostingController(rootView: ResetPasswordNicknameView(model: resetPasswordNicknameModel).environmentObject(environment)) + // TODO: DI 수정 + let api = TTProvider(session: Session(interceptor: NetworkInterceptor.shared)) + let repository = AuthRepository(api: api) + let checkUsernameExitUseCase = CheckUsernameExitUseCsae(repository: repository) + let viewModel = ResetPasswordNicknameModel(checkUsenameExitUseCase: checkUsernameExitUseCase) + let hostingVC = UIHostingController(rootView: ResetPasswordNicknameView(model: viewModel).environmentObject(environment)) self.addChild(hostingVC) hostingVC.didMove(toParent: self) From d4e899f2f0eb1f7ba1441dc4dd5300c38727e385 Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sun, 7 Jul 2024 14:30:06 +0900 Subject: [PATCH 33/44] =?UTF-8?q?feat=20#144:=20GetDailysUseCase=20?= =?UTF-8?q?=EC=85=8D=EC=84=B1=20&=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 12 +++++++ Project_Timer/Data/API/DailysAPI.swift | 4 ++- .../Data/Repository/DailysRepository.swift | 8 ++--- Project_Timer/Data/TTProvider.swift | 4 ++- .../UseCase/Dailys/GetDailysUseCase.swift | 22 ++++++++++++ .../TestServer/SyncDailys/SyncDailysVC.swift | 7 ++++ .../TestServer/SyncDailys/SyncDailysVM.swift | 35 +++++++++++-------- 7 files changed, 69 insertions(+), 23 deletions(-) create mode 100644 Project_Timer/Domain/UseCase/Dailys/GetDailysUseCase.swift diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index 163584eb..56274fa5 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -84,6 +84,7 @@ 870F90E52AEFFA9300854DDB /* SignupPasswordModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870F90E42AEFFA9300854DDB /* SignupPasswordModel.swift */; }; 870F90E72AEFFF1A00854DDB /* SignupPasswordRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870F90E62AEFFF1A00854DDB /* SignupPasswordRoute.swift */; }; 871616912C39956E00C4EF25 /* CheckUsernameRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 871616902C39956E00C4EF25 /* CheckUsernameRequest.swift */; }; + 871616962C3A149000C4EF25 /* GetDailysUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 871616952C3A149000C4EF25 /* GetDailysUseCase.swift */; }; 87163DC82ACAF2E8008D4072 /* NetworkError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87163DC72ACAF2E8008D4072 /* NetworkError.swift */; }; 87163DCA2ACAF89B008D4072 /* NetworkResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87163DC92ACAF89B008D4072 /* NetworkResult.swift */; }; 87168D99299A819F003ED502 /* UserDefaults+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875C98C82871BFCF008F7ADD /* UserDefaults+Extension.swift */; }; @@ -527,6 +528,7 @@ 870F90E42AEFFA9300854DDB /* SignupPasswordModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignupPasswordModel.swift; sourceTree = ""; }; 870F90E62AEFFF1A00854DDB /* SignupPasswordRoute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignupPasswordRoute.swift; sourceTree = ""; }; 871616902C39956E00C4EF25 /* CheckUsernameRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckUsernameRequest.swift; sourceTree = ""; }; + 871616952C3A149000C4EF25 /* GetDailysUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetDailysUseCase.swift; sourceTree = ""; }; 87163DC72ACAF2E8008D4072 /* NetworkError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkError.swift; sourceTree = ""; }; 87163DC92ACAF89B008D4072 /* NetworkResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkResult.swift; sourceTree = ""; }; 87199F432882BC430017D01A /* StandardDailyGraphView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StandardDailyGraphView.swift; sourceTree = ""; }; @@ -993,6 +995,14 @@ path = Password; sourceTree = ""; }; + 871616922C3A146400C4EF25 /* Dailys */ = { + isa = PBXGroup; + children = ( + 871616952C3A149000C4EF25 /* GetDailysUseCase.swift */, + ); + path = Dailys; + sourceTree = ""; + }; 87199F422882BC0C0017D01A /* Graph */ = { isa = PBXGroup; children = ( @@ -1978,6 +1988,7 @@ children = ( 872210532C300922003B97AD /* Firebase */, 877BDCDF2C390BAE00A50231 /* Auth */, + 871616922C3A146400C4EF25 /* Dailys */, ); path = UseCase; sourceTree = ""; @@ -2386,6 +2397,7 @@ 043706272869D58C00A5D3AA /* TimerTimeLabelView.swift in Sources */, 874F9C312ABFF81300675A86 /* EmailSigninButton.swift in Sources */, 870800692B2C68EF00830B39 /* AuthUseCaseInterface.swift in Sources */, + 871616962C3A149000C4EF25 /* GetDailysUseCase.swift in Sources */, 878DA8252B0C78D8001E924E /* SignupNicknameRoute.swift in Sources */, 870F90E52AEFFA9300854DDB /* SignupPasswordModel.swift in Sources */, 87D4DCD42BA5A53F00BB5AAB /* ResetPasswordEmailModel.swift in Sources */, diff --git a/Project_Timer/Data/API/DailysAPI.swift b/Project_Timer/Data/API/DailysAPI.swift index cccb3e83..6eb9e9c3 100644 --- a/Project_Timer/Data/API/DailysAPI.swift +++ b/Project_Timer/Data/API/DailysAPI.swift @@ -24,8 +24,10 @@ extension DailysAPI: TargetType { var path: String { switch self { - case .postDailys, .getDailys: + case .postDailys: return "/dailys/upload" + case .getDailys: + return "/dailys" case .postRecordTime, .getRecordTime: return "/recordTime" case .getSyncLog: diff --git a/Project_Timer/Data/Repository/DailysRepository.swift b/Project_Timer/Data/Repository/DailysRepository.swift index 2598cafc..dac2a407 100644 --- a/Project_Timer/Data/Repository/DailysRepository.swift +++ b/Project_Timer/Data/Repository/DailysRepository.swift @@ -26,12 +26,8 @@ final class DailysRepository { func getDailys() -> AnyPublisher<[Daily], NetworkError> { return self.api.request(.getDailys) - .tryMap { response in - guard let dtos = try? JSONDecoder.dateFormatted.decode([DailyResponse].self, from: response.data) else { - throw NetworkError.DECODEERROR - } - return dtos.map { $0.toDomain() } - } + .map([DailyResponse].self) + .map { $0.map { $0.toDomain() } } .catchDecodeError() } } diff --git a/Project_Timer/Data/TTProvider.swift b/Project_Timer/Data/TTProvider.swift index 51d79cbf..7b67624c 100644 --- a/Project_Timer/Data/TTProvider.swift +++ b/Project_Timer/Data/TTProvider.swift @@ -64,7 +64,9 @@ extension Publisher where Output == Response, Failure == NetworkError { func map(_ type: D.Type) -> AnyPublisher { return self.tryMap { response in do { - let decodedData = try JSONDecoder().decode(D.self, from: response.data) + let jsonDecoder = JSONDecoder() + jsonDecoder.dateDecodingStrategy = .iso8601 + let decodedData = try jsonDecoder.decode(D.self, from: response.data) return decodedData } catch { throw NetworkError.DECODEERROR diff --git a/Project_Timer/Domain/UseCase/Dailys/GetDailysUseCase.swift b/Project_Timer/Domain/UseCase/Dailys/GetDailysUseCase.swift new file mode 100644 index 00000000..0f925c00 --- /dev/null +++ b/Project_Timer/Domain/UseCase/Dailys/GetDailysUseCase.swift @@ -0,0 +1,22 @@ +// +// GetDailysUseCase.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/07/07. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Combine + +final class GetDailysUseCase { + let repository: DailysRepository + + init(repository: DailysRepository) { + self.repository = repository + } + + func execute() -> AnyPublisher<[Daily], NetworkError> { + return self.repository.getDailys() + } +} diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVC.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVC.swift index 84557a93..3c71ff62 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVC.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVC.swift @@ -8,6 +8,7 @@ import UIKit import Combine +import Moya final class SyncDailysVC: UIViewController { static let identifier = "SyncDailysVC" @@ -125,10 +126,16 @@ extension SyncDailysVC { let syncLogUseCase = SyncLogUseCase(repository: SyncLogRepository_lagacy()) let targetDailys = self.syncDeviceStatusView.configureDailys() + // TODO: DI 수정 + let api = TTProvider(session: Session(interceptor: NetworkInterceptor.shared)) + let repository = DailysRepository(api: api) + let getDailysUseCase = GetDailysUseCase(repository: repository) + self.viewModel = SyncDailysVM( dailysUseCase: dailysUseCase, recordTimesUseCase: recordTimesUseCase, syncLogUseCase: syncLogUseCase, + getDailysUseCase: getDailysUseCase, targetDailys: targetDailys) } } diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVM.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVM.swift index 7a3a9cc5..39a934eb 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVM.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVM.swift @@ -13,6 +13,7 @@ final class SyncDailysVM { private let dailysUseCase: DailysUseCaseInterface private let recordTimesUseCase: RecordTimesUseCaseInterface private let syncLogUseCase: SyncLogUseCaseInterface + private let getDailysUseCase: GetDailysUseCase private var targetDailys: [Daily] @Published private(set) var syncLog: SyncLog? @Published private(set) var alert: (title: String, text: String)? @@ -25,10 +26,12 @@ final class SyncDailysVM { init(dailysUseCase: DailysUseCaseInterface, recordTimesUseCase: RecordTimesUseCaseInterface, syncLogUseCase: SyncLogUseCaseInterface, + getDailysUseCase: GetDailysUseCase, targetDailys: [Daily]) { self.dailysUseCase = dailysUseCase self.recordTimesUseCase = recordTimesUseCase self.syncLogUseCase = syncLogUseCase + self.getDailysUseCase = getDailysUseCase self.targetDailys = targetDailys self.checkServerURL() @@ -126,25 +129,27 @@ extension SyncDailysVM { private func getDailys() { self.loadingText = .getDailys self.loading = true - self.dailysUseCase.getDailys { [weak self] result in - switch result { - case .success(let dailys): + self.getDailysUseCase.execute() + .sink { [weak self] completion in + if case .failure(let networkError) = completion { + print("ERROR", #function, networkError) + self?.loading = false + switch networkError { + case .CLIENTERROR(let message): + if let message = message { + print("[get Dailys ERROR] \(message)") + } + self?.alert = (title: Localized.string(.Server_Error_DownloadError), text: Localized.string(.Server_Error_DecodeError)) + default: + self?.alert = networkError.alertMessage + } + } + } receiveValue: { [weak self] dailys in self?.saveDailys(dailys) self?.loading = false self?.checkRecordTimes() - case .failure(let error): - self?.loading = false - switch error { - case .CLIENTERROR(let message): - if let message = message { - print("[get Dailys ERROR] \(message)") - } - self?.alert = (title: Localized.string(.Server_Error_DownloadError), text: Localized.string(.Server_Error_DecodeError)) - default: - self?.alert = error.alertMessage - } } - } + .store(in: &self.cancellables) } /// getRecordTime -> getSyncLog 진행 From 2c2ca7ab9dbb75018b3d7e51fc5a15379cd9483c Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sun, 7 Jul 2024 18:09:20 +0900 Subject: [PATCH 34/44] =?UTF-8?q?feat=20#144:=20=EB=82=98=EB=A8=B8?= =?UTF-8?q?=EC=A7=80=20UseCase=EB=93=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 32 ++++++++++++++----- Project_Timer/AppDelegate.swift | 2 +- .../Data/Repository/FirebaseRepository.swift | 7 ++++ .../Repository/NotificationRepository.swift | 27 ---------------- .../Repository/RecordTimesRepository.swift | 4 +-- .../UseCase/Dailys/GetRecordTimeUseCase.swift | 22 +++++++++++++ .../UseCase/Dailys/GetSyncLogUseCase.swift | 22 +++++++++++++ .../UseCase/Dailys/PostDailysUseCase.swift | 22 +++++++++++++ .../Dailys/PostRecordTimeUseCase.swift | 22 +++++++++++++ .../Firebase/GetNotificationUseCase.swift | 22 +++++++++++++ ...ft => GetNotificationUseCase_lagacy.swift} | 4 +-- 11 files changed, 146 insertions(+), 40 deletions(-) delete mode 100644 Project_Timer/Data/Repository/NotificationRepository.swift create mode 100644 Project_Timer/Domain/UseCase/Dailys/GetRecordTimeUseCase.swift create mode 100644 Project_Timer/Domain/UseCase/Dailys/GetSyncLogUseCase.swift create mode 100644 Project_Timer/Domain/UseCase/Dailys/PostDailysUseCase.swift create mode 100644 Project_Timer/Domain/UseCase/Dailys/PostRecordTimeUseCase.swift create mode 100644 Project_Timer/Domain/UseCase/Firebase/GetNotificationUseCase.swift rename Project_Timer/Domain/lagacy/{GetNotificationUseCase.swift => GetNotificationUseCase_lagacy.swift} (80%) diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index 56274fa5..f9fd086e 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -85,6 +85,11 @@ 870F90E72AEFFF1A00854DDB /* SignupPasswordRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870F90E62AEFFF1A00854DDB /* SignupPasswordRoute.swift */; }; 871616912C39956E00C4EF25 /* CheckUsernameRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 871616902C39956E00C4EF25 /* CheckUsernameRequest.swift */; }; 871616962C3A149000C4EF25 /* GetDailysUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 871616952C3A149000C4EF25 /* GetDailysUseCase.swift */; }; + 8716169E2C3A604C00C4EF25 /* PostDailysUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8716169D2C3A604C00C4EF25 /* PostDailysUseCase.swift */; }; + 871616A02C3A605600C4EF25 /* PostRecordTimeUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8716169F2C3A605600C4EF25 /* PostRecordTimeUseCase.swift */; }; + 871616A22C3A606C00C4EF25 /* GetRecordTimeUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 871616A12C3A606C00C4EF25 /* GetRecordTimeUseCase.swift */; }; + 871616A42C3A607700C4EF25 /* GetSyncLogUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 871616A32C3A607700C4EF25 /* GetSyncLogUseCase.swift */; }; + 871616A62C3A91F900C4EF25 /* GetNotificationUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 871616A52C3A91F900C4EF25 /* GetNotificationUseCase.swift */; }; 87163DC82ACAF2E8008D4072 /* NetworkError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87163DC72ACAF2E8008D4072 /* NetworkError.swift */; }; 87163DCA2ACAF89B008D4072 /* NetworkResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87163DC92ACAF89B008D4072 /* NetworkResult.swift */; }; 87168D99299A819F003ED502 /* UserDefaults+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875C98C82871BFCF008F7ADD /* UserDefaults+Extension.swift */; }; @@ -111,7 +116,6 @@ 8721C6DB296943C500410D57 /* ChangeNextGraphButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8721C6DA296943C500410D57 /* ChangeNextGraphButton.swift */; }; 8721C6DD296944EE00410D57 /* ChangePrevGraphButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8721C6DC296944EE00410D57 /* ChangePrevGraphButton.swift */; }; 872210422C2FEE83003B97AD /* SyncLogRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872210412C2FEE83003B97AD /* SyncLogRepository.swift */; }; - 872210442C2FF10B003B97AD /* NotificationRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872210432C2FF10B003B97AD /* NotificationRepository.swift */; }; 872210472C2FF676003B97AD /* SurveyInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872210462C2FF676003B97AD /* SurveyInfo.swift */; }; 872210492C2FF6AF003B97AD /* FunctionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872210482C2FF6AF003B97AD /* FunctionInfo.swift */; }; 8722104B2C2FF6E7003B97AD /* UpdateHistoryInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8722104A2C2FF6E7003B97AD /* UpdateHistoryInfo.swift */; }; @@ -144,7 +148,7 @@ 873731D32B2E931800D7BD9F /* NotificationRepository_lagacy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D22B2E931800D7BD9F /* NotificationRepository_lagacy.swift */; }; 873731D52B2E938400D7BD9F /* NotificationResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D42B2E938400D7BD9F /* NotificationResponse.swift */; }; 873731D72B2E97C100D7BD9F /* NotificationRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D62B2E97C100D7BD9F /* NotificationRepositoryInterface.swift */; }; - 873731D92B2E97FE00D7BD9F /* GetNotificationUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D82B2E97FE00D7BD9F /* GetNotificationUseCase.swift */; }; + 873731D92B2E97FE00D7BD9F /* GetNotificationUseCase_lagacy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D82B2E97FE00D7BD9F /* GetNotificationUseCase_lagacy.swift */; }; 873731DB2B2E983500D7BD9F /* GetNotificationUseCaseInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731DA2B2E983500D7BD9F /* GetNotificationUseCaseInterface.swift */; }; 873731DD2B2E9AA900D7BD9F /* FirebaseStringArrayValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731DC2B2E9AA900D7BD9F /* FirebaseStringArrayValue.swift */; }; 873731DF2B2EA2B000D7BD9F /* FirestoreValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731DE2B2EA2AF00D7BD9F /* FirestoreValue.swift */; }; @@ -529,6 +533,11 @@ 870F90E62AEFFF1A00854DDB /* SignupPasswordRoute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignupPasswordRoute.swift; sourceTree = ""; }; 871616902C39956E00C4EF25 /* CheckUsernameRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckUsernameRequest.swift; sourceTree = ""; }; 871616952C3A149000C4EF25 /* GetDailysUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetDailysUseCase.swift; sourceTree = ""; }; + 8716169D2C3A604C00C4EF25 /* PostDailysUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostDailysUseCase.swift; sourceTree = ""; }; + 8716169F2C3A605600C4EF25 /* PostRecordTimeUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostRecordTimeUseCase.swift; sourceTree = ""; }; + 871616A12C3A606C00C4EF25 /* GetRecordTimeUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetRecordTimeUseCase.swift; sourceTree = ""; }; + 871616A32C3A607700C4EF25 /* GetSyncLogUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetSyncLogUseCase.swift; sourceTree = ""; }; + 871616A52C3A91F900C4EF25 /* GetNotificationUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetNotificationUseCase.swift; sourceTree = ""; }; 87163DC72ACAF2E8008D4072 /* NetworkError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkError.swift; sourceTree = ""; }; 87163DC92ACAF89B008D4072 /* NetworkResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkResult.swift; sourceTree = ""; }; 87199F432882BC430017D01A /* StandardDailyGraphView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StandardDailyGraphView.swift; sourceTree = ""; }; @@ -554,7 +563,6 @@ 8721C6DA296943C500410D57 /* ChangeNextGraphButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeNextGraphButton.swift; sourceTree = ""; }; 8721C6DC296944EE00410D57 /* ChangePrevGraphButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangePrevGraphButton.swift; sourceTree = ""; }; 872210412C2FEE83003B97AD /* SyncLogRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncLogRepository.swift; sourceTree = ""; }; - 872210432C2FF10B003B97AD /* NotificationRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationRepository.swift; sourceTree = ""; }; 872210462C2FF676003B97AD /* SurveyInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SurveyInfo.swift; sourceTree = ""; }; 872210482C2FF6AF003B97AD /* FunctionInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FunctionInfo.swift; sourceTree = ""; }; 8722104A2C2FF6E7003B97AD /* UpdateHistoryInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateHistoryInfo.swift; sourceTree = ""; }; @@ -588,7 +596,7 @@ 873731D22B2E931800D7BD9F /* NotificationRepository_lagacy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationRepository_lagacy.swift; sourceTree = ""; }; 873731D42B2E938400D7BD9F /* NotificationResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationResponse.swift; sourceTree = ""; }; 873731D62B2E97C100D7BD9F /* NotificationRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationRepositoryInterface.swift; sourceTree = ""; }; - 873731D82B2E97FE00D7BD9F /* GetNotificationUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetNotificationUseCase.swift; sourceTree = ""; }; + 873731D82B2E97FE00D7BD9F /* GetNotificationUseCase_lagacy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetNotificationUseCase_lagacy.swift; sourceTree = ""; }; 873731DA2B2E983500D7BD9F /* GetNotificationUseCaseInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetNotificationUseCaseInterface.swift; sourceTree = ""; }; 873731DC2B2E9AA900D7BD9F /* FirebaseStringArrayValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseStringArrayValue.swift; sourceTree = ""; }; 873731DE2B2EA2AF00D7BD9F /* FirestoreValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirestoreValue.swift; sourceTree = ""; }; @@ -999,6 +1007,10 @@ isa = PBXGroup; children = ( 871616952C3A149000C4EF25 /* GetDailysUseCase.swift */, + 8716169D2C3A604C00C4EF25 /* PostDailysUseCase.swift */, + 8716169F2C3A605600C4EF25 /* PostRecordTimeUseCase.swift */, + 871616A12C3A606C00C4EF25 /* GetRecordTimeUseCase.swift */, + 871616A32C3A607700C4EF25 /* GetSyncLogUseCase.swift */, ); path = Dailys; sourceTree = ""; @@ -1067,7 +1079,7 @@ 870800742B2D3C9A00830B39 /* DailysUseCase.swift */, 8708007E2B2D543500830B39 /* RecordTimesUseCase.swift */, 8708008C2B2D63D300830B39 /* SyncLogUseCase.swift */, - 873731D82B2E97FE00D7BD9F /* GetNotificationUseCase.swift */, + 873731D82B2E97FE00D7BD9F /* GetNotificationUseCase_lagacy.swift */, 87FB8D1A2B3C5DF300EA5693 /* NotificationUseCase.swift */, ); path = lagacy; @@ -1082,6 +1094,7 @@ 872210582C300A08003B97AD /* GetUpdateHistorysUseCase.swift */, 8722105A2C300A5C003B97AD /* GetYoutubeLinkUseCase.swift */, 8722105C2C300A8C003B97AD /* GetSurveysUseCase.swift */, + 871616A52C3A91F900C4EF25 /* GetNotificationUseCase.swift */, ); path = Firebase; sourceTree = ""; @@ -2001,7 +2014,6 @@ 874B542B2C1592460062D0AC /* DailysRepository.swift */, 874B542D2C1595A00062D0AC /* RecordTimesRepository.swift */, 872210412C2FEE83003B97AD /* SyncLogRepository.swift */, - 872210432C2FF10B003B97AD /* NotificationRepository.swift */, ); path = Repository; sourceTree = ""; @@ -2366,6 +2378,7 @@ 87CEDD3D28F5338B007ACF6E /* ColorSelectorVC.swift in Sources */, 8706C32C2AEF864000F7C842 /* TTSignupTitleView.swift in Sources */, 877911BC2A18922400F0A713 /* SettingListCellInfo.swift in Sources */, + 871616A02C3A605600C4EF25 /* PostRecordTimeUseCase.swift in Sources */, 8791081F28387537005D7B10 /* NetworkURL.swift in Sources */, 873731DB2B2E983500D7BD9F /* GetNotificationUseCaseInterface.swift in Sources */, 87D83E852B285D4D003C40AE /* SettingLanguageVC.swift in Sources */, @@ -2389,8 +2402,10 @@ 87FD9FA72998D0BD00D9B0FF /* TimerStopwatchAttributes.swift in Sources */, 04573A9B2877FDDA008F8D44 /* CountdownTimeLabelVM.swift in Sources */, 87306D5D2B26CB5C001B7C14 /* Typographys.swift in Sources */, + 8716169E2C3A604C00C4EF25 /* PostDailysUseCase.swift in Sources */, 87306D612B26CBBC001B7C14 /* Icons.swift in Sources */, 87199F4B2883C6D80017D01A /* StandardDailyTaskCell.swift in Sources */, + 871616A42C3A607700C4EF25 /* GetSyncLogUseCase.swift in Sources */, 048D8ACD28AA608900A2456D /* PopupSelectDateVC.swift in Sources */, 87035DF7282225C800055378 /* Protocols.swift in Sources */, 87DB923E2AC2D06C00FE6453 /* View+Extension.swift in Sources */, @@ -2426,6 +2441,7 @@ 87DC6A4B28D010A400455A06 /* WeekTime.swift in Sources */, 87BE88E72AD425BE0010A84A /* SigninTextFieldView.swift in Sources */, 87E5C70D2AE0268C00BE46B0 /* SignupEmailView.swift in Sources */, + 871616A62C3A91F900C4EF25 /* GetNotificationUseCase.swift in Sources */, 049BBA9A28AB5747005BAB1B /* TaskModifyInteractionView.swift in Sources */, 87A8CD272AF0C4B600D4C1D7 /* OverlayShowButtonForSecureFieldView.swift in Sources */, 870E85012AD67E46000511BD /* KeyboardResponder.swift in Sources */, @@ -2468,6 +2484,7 @@ 8760FCB929541BE3000BCCD1 /* KeyChain.swift in Sources */, 87D5E65328C7477100D53F8D /* MonthTime.swift in Sources */, 87D83E8A2B2964EC003C40AE /* SettingLanguageListView.swift in Sources */, + 871616A22C3A606C00C4EF25 /* GetRecordTimeUseCase.swift in Sources */, 87D4DCD92BA5C17900BB5AAB /* ResetPasswordView.swift in Sources */, 87D7ED152952B3C100121DE6 /* TestUserSignupRequest.swift in Sources */, 878DA8232B0C6B1E001E924E /* SigninSelectModel.swift in Sources */, @@ -2575,7 +2592,7 @@ 87D4DCC22BA5298B00BB5AAB /* ResetPasswordNicknameView.swift in Sources */, 87C2F97B28A6BFC700F44D98 /* ModifyRecordVC.swift in Sources */, 8708008B2B2D5A4400830B39 /* SyncLogRepositoryInterface.swift in Sources */, - 873731D92B2E97FE00D7BD9F /* GetNotificationUseCase.swift in Sources */, + 873731D92B2E97FE00D7BD9F /* GetNotificationUseCase_lagacy.swift in Sources */, 87D4DCCC2BA5477400BB5AAB /* UpdatePasswordRequest.swift in Sources */, 879A2BA8284746A500B69DA7 /* SettingFooterView.swift in Sources */, 04E0DFC328A9031A004DABBE /* ModifyRecordVM.swift in Sources */, @@ -2592,7 +2609,6 @@ 879E849F29C8400700D65F48 /* TimeLabelData.swift in Sources */, 04FA75D3286EE4D900BAE2B2 /* Color+Extension.swift in Sources */, 870800892B2D59EB00830B39 /* SyncLogResponse.swift in Sources */, - 872210442C2FF10B003B97AD /* NotificationRepository.swift in Sources */, 8760FCBB29553F06000BCCD1 /* SyncDailysVC.swift in Sources */, 873977EB288D3FAA0025EE73 /* LogDailyVM.swift in Sources */, 87D3CF05288BAA1300ED33B7 /* ProgressDailyTaskCell.swift in Sources */, diff --git a/Project_Timer/AppDelegate.swift b/Project_Timer/AppDelegate.swift index 926ef044..47fd90b5 100644 --- a/Project_Timer/AppDelegate.swift +++ b/Project_Timer/AppDelegate.swift @@ -224,7 +224,7 @@ extension AppDelegate { } private func checkNotification() { - let getNotficationUseCase = GetNotificationUseCase(repository: NotificationRepository_lagacy()) + let getNotficationUseCase = GetNotificationUseCase_lagacy(repository: NotificationRepository_lagacy()) let notificationUseCase = NotificationUseCase() getNotficationUseCase.getNoti { result in diff --git a/Project_Timer/Data/Repository/FirebaseRepository.swift b/Project_Timer/Data/Repository/FirebaseRepository.swift index 9367d90f..f33dcfe0 100644 --- a/Project_Timer/Data/Repository/FirebaseRepository.swift +++ b/Project_Timer/Data/Repository/FirebaseRepository.swift @@ -59,4 +59,11 @@ final class FirebaseRepository { .map { $0.surveyInfos ?? [] } .catchDecodeError() } + + func getNotification() -> AnyPublisher { + return self.api.request(.getNotification) + .map(NotificationResponse.self) + .map { $0.toDomain() } + .catchDecodeError() + } } diff --git a/Project_Timer/Data/Repository/NotificationRepository.swift b/Project_Timer/Data/Repository/NotificationRepository.swift deleted file mode 100644 index 04b854bb..00000000 --- a/Project_Timer/Data/Repository/NotificationRepository.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// NotificationRepository.swift -// Project_Timer -// -// Created by Kang Minsang on 2024/06/29. -// Copyright © 2024 FDEE. All rights reserved. -// - -import Foundation -import Moya -import Combine -import CombineMoya - -final class NotificationRepository { - private let api: TTProvider - - init(api: TTProvider) { - self.api = api - } - - func get() -> AnyPublisher { - return self.api.request(.getNotification) - .map(NotificationResponse.self) - .map { $0.toDomain() } - .catchDecodeError() - } -} diff --git a/Project_Timer/Data/Repository/RecordTimesRepository.swift b/Project_Timer/Data/Repository/RecordTimesRepository.swift index b5f459f1..a694a57d 100644 --- a/Project_Timer/Data/Repository/RecordTimesRepository.swift +++ b/Project_Timer/Data/Repository/RecordTimesRepository.swift @@ -18,8 +18,8 @@ final class RecordTimesRepository { self.api = api } - func upload(info: RecordTimes) -> AnyPublisher { - return self.api.request(.postRecordTime(info)) + func upload(request: RecordTimes) -> AnyPublisher { + return self.api.request(.postRecordTime(request)) .map { _ in true } .catchDecodeError() } diff --git a/Project_Timer/Domain/UseCase/Dailys/GetRecordTimeUseCase.swift b/Project_Timer/Domain/UseCase/Dailys/GetRecordTimeUseCase.swift new file mode 100644 index 00000000..b4d3e014 --- /dev/null +++ b/Project_Timer/Domain/UseCase/Dailys/GetRecordTimeUseCase.swift @@ -0,0 +1,22 @@ +// +// GetRecordTimeUseCase.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/07/07. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Combine + +final class GetRecordTimeUseCase { + private let repository: RecordTimesRepository + + init(repository: RecordTimesRepository) { + self.repository = repository + } + + func execute() -> AnyPublisher { + return self.repository.get() + } +} diff --git a/Project_Timer/Domain/UseCase/Dailys/GetSyncLogUseCase.swift b/Project_Timer/Domain/UseCase/Dailys/GetSyncLogUseCase.swift new file mode 100644 index 00000000..5c5a650e --- /dev/null +++ b/Project_Timer/Domain/UseCase/Dailys/GetSyncLogUseCase.swift @@ -0,0 +1,22 @@ +// +// GetSyncLogUseCase.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/07/07. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Combine + +final class GetSyncLogUseCase { + private let repository: SyncLogRepository + + init(repository: SyncLogRepository) { + self.repository = repository + } + + func execute() -> AnyPublisher { + return self.repository.get() + } +} diff --git a/Project_Timer/Domain/UseCase/Dailys/PostDailysUseCase.swift b/Project_Timer/Domain/UseCase/Dailys/PostDailysUseCase.swift new file mode 100644 index 00000000..58f6d365 --- /dev/null +++ b/Project_Timer/Domain/UseCase/Dailys/PostDailysUseCase.swift @@ -0,0 +1,22 @@ +// +// PostDailysUseCase.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/07/07. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Combine + +final class PostDailysUseCase { + private let repository: DailysRepository + + init(repository: DailysRepository) { + self.repository = repository + } + + func execute(request: [Daily]) -> AnyPublisher { + return self.repository.uploadDailys(request: request) + } +} diff --git a/Project_Timer/Domain/UseCase/Dailys/PostRecordTimeUseCase.swift b/Project_Timer/Domain/UseCase/Dailys/PostRecordTimeUseCase.swift new file mode 100644 index 00000000..1c792365 --- /dev/null +++ b/Project_Timer/Domain/UseCase/Dailys/PostRecordTimeUseCase.swift @@ -0,0 +1,22 @@ +// +// PostRecordTimeUseCase.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/07/07. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Combine + +final class PostRecordTimeUseCase { + private let repository: RecordTimesRepository + + init(repository: RecordTimesRepository) { + self.repository = repository + } + + func execute(request: RecordTimes) -> AnyPublisher { + self.repository.upload(request: request) + } +} diff --git a/Project_Timer/Domain/UseCase/Firebase/GetNotificationUseCase.swift b/Project_Timer/Domain/UseCase/Firebase/GetNotificationUseCase.swift new file mode 100644 index 00000000..7471b7ba --- /dev/null +++ b/Project_Timer/Domain/UseCase/Firebase/GetNotificationUseCase.swift @@ -0,0 +1,22 @@ +// +// GetNotificationUseCase.swift +// Project_Timer +// +// Created by Kang Minsang on 2024/07/07. +// Copyright © 2024 FDEE. All rights reserved. +// + +import Foundation +import Combine + +final class GetNotificationUseCase { + private let repository: FirebaseRepository + + init(repository: FirebaseRepository) { + self.repository = repository + } + + func execute() -> AnyPublisher { + return self.repository.getNotification() + } +} diff --git a/Project_Timer/Domain/lagacy/GetNotificationUseCase.swift b/Project_Timer/Domain/lagacy/GetNotificationUseCase_lagacy.swift similarity index 80% rename from Project_Timer/Domain/lagacy/GetNotificationUseCase.swift rename to Project_Timer/Domain/lagacy/GetNotificationUseCase_lagacy.swift index c48bb243..1707be5b 100644 --- a/Project_Timer/Domain/lagacy/GetNotificationUseCase.swift +++ b/Project_Timer/Domain/lagacy/GetNotificationUseCase_lagacy.swift @@ -1,5 +1,5 @@ // -// GetNotificationUseCase.swift +// GetNotificationUseCase_lagacy.swift // Project_Timer // // Created by Kang Minsang on 2023/12/17. @@ -8,7 +8,7 @@ import Foundation -final class GetNotificationUseCase: GetNotificationUseCaseInterface { +final class GetNotificationUseCase_lagacy: GetNotificationUseCaseInterface { let repository: NotificationRepositoryInterface init(repository: NotificationRepositoryInterface) { From 3091d08323cbdb5d7727e09df977c82e954b215f Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sun, 7 Jul 2024 20:03:26 +0900 Subject: [PATCH 35/44] =?UTF-8?q?fix=20#144:=20statusCode=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=A5=B8=20NetworkError=EA=B0=80=20=EA=B7=B8=EB=8C=80?= =?UTF-8?q?=EB=A1=9C=20=EC=A0=84=EB=8B=AC=EB=90=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer/Data/TTProvider.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project_Timer/Data/TTProvider.swift b/Project_Timer/Data/TTProvider.swift index 7b67624c..3cdced39 100644 --- a/Project_Timer/Data/TTProvider.swift +++ b/Project_Timer/Data/TTProvider.swift @@ -54,7 +54,7 @@ extension Publisher { /// Repository의 공통적인 Decode 에러를 반환하는 Publisher func catchDecodeError() -> AnyPublisher { return self - .mapError { _ in NetworkError.DECODEERROR } + .mapError { error in return error as? NetworkError ?? .DECODEERROR } .eraseToAnyPublisher() } } From 9e8cd74b13c300bba018168bd5e2caf695e10780 Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sat, 10 Aug 2024 21:28:55 +0900 Subject: [PATCH 36/44] =?UTF-8?q?feat=20#144:=20UploadDailys=20=EB=8F=99?= =?UTF-8?q?=EC=9E=91=20=EA=B5=AC=ED=98=84,=20header=20=EB=A5=BC=20?= =?UTF-8?q?=ED=86=B5=ED=95=B4=20gmt=20=EC=A0=84=EB=8B=AC=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 28 ++--------- Project_Timer/Data/API/API.swift | 8 +++ Project_Timer/Data/API/DailysAPI.swift | 15 ++++-- .../Data/Repository/DailysRepository.swift | 5 +- Project_Timer/Data/lagacy/DailysNetwork.swift | 34 ------------- .../Data/lagacy/DailysRepository_lagacy.swift | 50 ------------------- .../lagacy/DailyRepositoryInterface.swift | 14 ------ .../Domain/lagacy/DailysUseCase.swift | 29 ----------- .../Interface/DailysUseCaseInterface.swift | 15 ------ .../TestServer/SyncDailys/SyncDailysVC.swift | 4 +- .../TestServer/SyncDailys/SyncDailysVM.swift | 44 +++++++++------- 11 files changed, 52 insertions(+), 194 deletions(-) delete mode 100644 Project_Timer/Data/lagacy/DailysNetwork.swift delete mode 100644 Project_Timer/Data/lagacy/DailysRepository_lagacy.swift delete mode 100644 Project_Timer/Domain/lagacy/DailyRepositoryInterface.swift delete mode 100644 Project_Timer/Domain/lagacy/DailysUseCase.swift delete mode 100644 Project_Timer/Present/Interface/DailysUseCaseInterface.swift diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index f9fd086e..caf48c8d 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -54,13 +54,8 @@ 870800652B2C623600830B39 /* AuthRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800642B2C623600830B39 /* AuthRepositoryInterface.swift */; }; 870800672B2C67E900830B39 /* AuthUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800662B2C67E900830B39 /* AuthUseCase.swift */; }; 870800692B2C68EF00830B39 /* AuthUseCaseInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800682B2C68EF00830B39 /* AuthUseCaseInterface.swift */; }; - 8708006B2B2CA57C00830B39 /* DailysNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708006A2B2CA57C00830B39 /* DailysNetwork.swift */; }; - 8708006D2B2CA7AB00830B39 /* DailysRepository_lagacy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708006C2B2CA7AB00830B39 /* DailysRepository_lagacy.swift */; }; 8708006F2B2CA92C00830B39 /* DailyResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708006E2B2CA92C00830B39 /* DailyResponse.swift */; }; 870800712B2CAD9900830B39 /* TaskHistory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800702B2CAD9900830B39 /* TaskHistory.swift */; }; - 870800732B2CB11B00830B39 /* DailyRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800722B2CB11B00830B39 /* DailyRepositoryInterface.swift */; }; - 870800752B2D3C9A00830B39 /* DailysUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800742B2D3C9A00830B39 /* DailysUseCase.swift */; }; - 870800772B2D41EA00830B39 /* DailysUseCaseInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800762B2D41EA00830B39 /* DailysUseCaseInterface.swift */; }; 870800792B2D4DE500830B39 /* RecordTimesNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800782B2D4DE500830B39 /* RecordTimesNetwork.swift */; }; 8708007B2B2D4F0800830B39 /* RecordTimesRepository_lagacy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708007A2B2D4F0800830B39 /* RecordTimesRepository_lagacy.swift */; }; 8708007D2B2D503600830B39 /* RecordTimesRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708007C2B2D503600830B39 /* RecordTimesRepositoryInterface.swift */; }; @@ -504,13 +499,8 @@ 870800642B2C623600830B39 /* AuthRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthRepositoryInterface.swift; sourceTree = ""; }; 870800662B2C67E900830B39 /* AuthUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthUseCase.swift; sourceTree = ""; }; 870800682B2C68EF00830B39 /* AuthUseCaseInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthUseCaseInterface.swift; sourceTree = ""; }; - 8708006A2B2CA57C00830B39 /* DailysNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailysNetwork.swift; sourceTree = ""; }; - 8708006C2B2CA7AB00830B39 /* DailysRepository_lagacy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailysRepository_lagacy.swift; sourceTree = ""; }; 8708006E2B2CA92C00830B39 /* DailyResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailyResponse.swift; sourceTree = ""; }; 870800702B2CAD9900830B39 /* TaskHistory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskHistory.swift; sourceTree = ""; }; - 870800722B2CB11B00830B39 /* DailyRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailyRepositoryInterface.swift; sourceTree = ""; }; - 870800742B2D3C9A00830B39 /* DailysUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailysUseCase.swift; sourceTree = ""; }; - 870800762B2D41EA00830B39 /* DailysUseCaseInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailysUseCaseInterface.swift; sourceTree = ""; }; 870800782B2D4DE500830B39 /* RecordTimesNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesNetwork.swift; sourceTree = ""; }; 8708007A2B2D4F0800830B39 /* RecordTimesRepository_lagacy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesRepository_lagacy.swift; sourceTree = ""; }; 8708007C2B2D503600830B39 /* RecordTimesRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesRepositoryInterface.swift; sourceTree = ""; }; @@ -1054,12 +1044,10 @@ 87163DC92ACAF89B008D4072 /* NetworkResult.swift */, 87910829283877A4005D7B10 /* Network.swift */, 8708005B2B2C4D2D00830B39 /* AuthNetwork.swift */, - 8708006A2B2CA57C00830B39 /* DailysNetwork.swift */, 870800782B2D4DE500830B39 /* RecordTimesNetwork.swift */, 870800842B2D593400830B39 /* SyncLogNetwork.swift */, 873731D02B2E92BD00D7BD9F /* NotificationNetwork.swift */, 870800602B2C5FDA00830B39 /* AuthRepository_lagacy.swift */, - 8708006C2B2CA7AB00830B39 /* DailysRepository_lagacy.swift */, 8708007A2B2D4F0800830B39 /* RecordTimesRepository_lagacy.swift */, 870800862B2D599800830B39 /* SyncLogRepository_lagacy.swift */, 873731D22B2E931800D7BD9F /* NotificationRepository_lagacy.swift */, @@ -1071,12 +1059,10 @@ isa = PBXGroup; children = ( 870800642B2C623600830B39 /* AuthRepositoryInterface.swift */, - 870800722B2CB11B00830B39 /* DailyRepositoryInterface.swift */, 8708007C2B2D503600830B39 /* RecordTimesRepositoryInterface.swift */, 8708008A2B2D5A4400830B39 /* SyncLogRepositoryInterface.swift */, 873731D62B2E97C100D7BD9F /* NotificationRepositoryInterface.swift */, 870800662B2C67E900830B39 /* AuthUseCase.swift */, - 870800742B2D3C9A00830B39 /* DailysUseCase.swift */, 8708007E2B2D543500830B39 /* RecordTimesUseCase.swift */, 8708008C2B2D63D300830B39 /* SyncLogUseCase.swift */, 873731D82B2E97FE00D7BD9F /* GetNotificationUseCase_lagacy.swift */, @@ -1305,7 +1291,6 @@ isa = PBXGroup; children = ( 870800682B2C68EF00830B39 /* AuthUseCaseInterface.swift */, - 870800762B2D41EA00830B39 /* DailysUseCaseInterface.swift */, 870800802B2D54B500830B39 /* RecordTimesUseCaseInterface.swift */, 8708008E2B2D646C00830B39 /* SyncLogUseCaseInterface.swift */, 873731DA2B2E983500D7BD9F /* GetNotificationUseCaseInterface.swift */, @@ -2338,7 +2323,6 @@ 049BBA9828AB3D94005BAB1B /* ModifyFinishButton.swift in Sources */, 873731D12B2E92BD00D7BD9F /* NotificationNetwork.swift in Sources */, 873731D52B2E938400D7BD9F /* NotificationResponse.swift in Sources */, - 8708006D2B2CA7AB00830B39 /* DailysRepository_lagacy.swift in Sources */, 874B54282C158F890062D0AC /* CheckEmailExitRequest.swift in Sources */, 8758E4F528C7124900A99484 /* MonthSmallView.swift in Sources */, 87A722A828CCB95C000DA304 /* MonthVM.swift in Sources */, @@ -2347,7 +2331,6 @@ 879BE3262AC42919007AAC46 /* SigninInputTextfield.swift in Sources */, 049BBA9E28AB76B8005BAB1B /* TaskInteractionViewPlaceholder.swift in Sources */, 87A722A628CCB928000DA304 /* LogHomeTaskCellView.swift in Sources */, - 870800772B2D41EA00830B39 /* DailysUseCaseInterface.swift in Sources */, 875C98C3287176E4008F7ADD /* FunctionsActionDelegate.swift in Sources */, 8765234A28C7709700487BFB /* WeekSmallView.swift in Sources */, 8765235128C79C4400487BFB /* TotalView.swift in Sources */, @@ -2373,7 +2356,6 @@ 875FBE272AC91ED800B28723 /* CGPoint+Extension.swift in Sources */, 875EDA342957E0360037A7EB /* NetworkInterceptor.swift in Sources */, 870E11752A0E226D00CFA77C /* CalendarWidgetData.swift in Sources */, - 870800752B2D3C9A00830B39 /* DailysUseCase.swift in Sources */, 870800612B2C5FDA00830B39 /* AuthRepository_lagacy.swift in Sources */, 87CEDD3D28F5338B007ACF6E /* ColorSelectorVC.swift in Sources */, 8706C32C2AEF864000F7C842 /* TTSignupTitleView.swift in Sources */, @@ -2514,7 +2496,6 @@ 87306D512B26086D001B7C14 /* TLRko.swift in Sources */, 878431AD27F6F461000A98B3 /* TodolistVM.swift in Sources */, 878DA1F82AEE68DA00C60CBF /* SignupEmailModel.swift in Sources */, - 870800732B2CB11B00830B39 /* DailyRepositoryInterface.swift in Sources */, 04FA75D8286F2AB900BAE2B2 /* Fonts.swift in Sources */, 87862E872B2D9FA1004ED313 /* NotificationVC.swift in Sources */, 8751C6F82847234A007FAFC4 /* SettingVM.swift in Sources */, @@ -2570,7 +2551,6 @@ 876E27762AC1CD2A0054250D /* Infos.swift in Sources */, 049BBA9C28AB58D4005BAB1B /* InteractionLeftTitleLabel.swift in Sources */, 871AB69D2967C9D100AFED1C /* TimeTableVM.swift in Sources */, - 8708006B2B2CA57C00830B39 /* DailysNetwork.swift in Sources */, 872210422C2FEE83003B97AD /* SyncLogRepository.swift in Sources */, 87D4DCD22BA5A4C400BB5AAB /* ResetPasswordEmailView.swift in Sources */, 878813E52A209BA0000ED2C1 /* HowToAddWidgetVC.swift in Sources */, @@ -2784,11 +2764,10 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = Project_Timer/Project_TimerDevelop.entitlements; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Manual; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 2; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 2C96RNDN63; + DEVELOPMENT_TEAM = 2C96RNDN63; "ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES; INFOPLIST_FILE = Project_Timer/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 16.0; @@ -2800,7 +2779,6 @@ PRODUCT_BUNDLE_IDENTIFIER = "$(APP_BUNDLE_ID)"; PRODUCT_NAME = "$(APP_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = profile_grin_dev; SUPPORTS_MACCATALYST = YES; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_VERSION = 5.0; diff --git a/Project_Timer/Data/API/API.swift b/Project_Timer/Data/API/API.swift index 7ee34f97..db58ffd1 100644 --- a/Project_Timer/Data/API/API.swift +++ b/Project_Timer/Data/API/API.swift @@ -20,3 +20,11 @@ extension TargetType { return dictionary } } + +extension JSONEncoder { + static var dateFormatted: JSONEncoder { + let encoder = JSONEncoder() + encoder.dateEncodingStrategy = .iso8601 + return encoder + } +} diff --git a/Project_Timer/Data/API/DailysAPI.swift b/Project_Timer/Data/API/DailysAPI.swift index 6eb9e9c3..8dc39566 100644 --- a/Project_Timer/Data/API/DailysAPI.swift +++ b/Project_Timer/Data/API/DailysAPI.swift @@ -10,7 +10,7 @@ import Foundation import Moya enum DailysAPI { - case postDailys([Daily]) + case postDailys(body: [Daily], headers: [String: String]) case getDailys case postRecordTime(RecordTimes) case getRecordTime @@ -46,16 +46,21 @@ extension DailysAPI: TargetType { var task: Moya.Task { switch self { - case .postDailys(let dailys): - return .requestJSONEncodable(dailys) + case .postDailys(let body, _): + return .requestCustomJSONEncodable(body, encoder: .dateFormatted) case .postRecordTime(let recordTimes): - return .requestJSONEncodable(recordTimes) + return .requestCustomJSONEncodable(recordTimes, encoder: .dateFormatted) default: return .requestPlain } } var headers: [String : String]? { - return nil + switch self { + case .postDailys(_, let headers): + return headers + default: + return nil + } } } diff --git a/Project_Timer/Data/Repository/DailysRepository.swift b/Project_Timer/Data/Repository/DailysRepository.swift index dac2a407..897d3d2f 100644 --- a/Project_Timer/Data/Repository/DailysRepository.swift +++ b/Project_Timer/Data/Repository/DailysRepository.swift @@ -19,7 +19,10 @@ final class DailysRepository { } func uploadDailys(request: [Daily]) -> AnyPublisher { - return self.api.request(.postDailys(request)) + let headers: [String: String] = [ + "gmt": "\(TimeZone.current.secondsFromGMT())" + ] + return self.api.request(.postDailys(body: request, headers: headers)) .map { _ in true } .catchDecodeError() } diff --git a/Project_Timer/Data/lagacy/DailysNetwork.swift b/Project_Timer/Data/lagacy/DailysNetwork.swift deleted file mode 100644 index dc943522..00000000 --- a/Project_Timer/Data/lagacy/DailysNetwork.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// DailysNetwork.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/16. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -final class DailysNetwork { - private let network = Network() - private var uploadDailysURL: String { - let base = NetworkURL.shared.serverURL ?? "nil" - return base + "/dailys/upload" - } - private var getDailysURL: String { - let base = NetworkURL.shared.serverURL ?? "nil" - return base + "/dailys" - } - - func upload(dailys: [Daily], completion: @escaping (NetworkResult) -> Void) { - let param = ["gmt": TimeZone.current.secondsFromGMT()] - self.network.request(url: uploadDailysURL, method: .post, param: param, body: dailys) { result in - completion(result) - } - } - - func get(completion: @escaping (NetworkResult) -> Void) { - self.network.request(url: getDailysURL, method: .get) { result in - completion(result) - } - } -} diff --git a/Project_Timer/Data/lagacy/DailysRepository_lagacy.swift b/Project_Timer/Data/lagacy/DailysRepository_lagacy.swift deleted file mode 100644 index e05db47a..00000000 --- a/Project_Timer/Data/lagacy/DailysRepository_lagacy.swift +++ /dev/null @@ -1,50 +0,0 @@ -// -// DailysRepository_lagacy.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/16. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -final class DailysRepository_lagacy: DailysRepositoryInterface { - private let api = DailysNetwork() - - func upload(dailys: [Daily], completion: @escaping (Result) -> Void) { - api.upload(dailys: dailys) { result in - switch result.status { - case .SUCCESS: - completion(.success(true)) - default: - completion(.failure(.error(result))) - } - } - } - - func get(completion: @escaping (Result<[Daily], NetworkError>) -> Void) { - api.get { result in - switch result.status { - case .SUCCESS: - guard let data = result.data, - let dtos = try? JSONDecoder.dateFormatted.decode([DailyResponse].self, from: data) else { - completion(.failure(.DECODEERROR)) - return - } - - let dailys = dtos.map { $0.toDomain() } - completion(.success(dailys)) - default: - completion(.failure(.error(result))) - } - } - } - - func store(dailys: [Daily], completion: @escaping (Result) -> Void) { - - } - - func fetch(completion: @escaping (Result<[Daily], Error>) -> Void) { - - } -} diff --git a/Project_Timer/Domain/lagacy/DailyRepositoryInterface.swift b/Project_Timer/Domain/lagacy/DailyRepositoryInterface.swift deleted file mode 100644 index 84a952a8..00000000 --- a/Project_Timer/Domain/lagacy/DailyRepositoryInterface.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// DailysRepositoryInterface.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/16. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -protocol DailysRepositoryInterface { - func upload(dailys: [Daily], completion: @escaping (Result) -> Void) - func get(completion: @escaping (Result<[Daily], NetworkError>) -> Void) -} diff --git a/Project_Timer/Domain/lagacy/DailysUseCase.swift b/Project_Timer/Domain/lagacy/DailysUseCase.swift deleted file mode 100644 index 4ef1e7a9..00000000 --- a/Project_Timer/Domain/lagacy/DailysUseCase.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// DailysUseCase.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/16. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -final class DailysUseCase: DailysUseCaseInterface { - let repository: DailysRepositoryInterface - - init(repository: DailysRepositoryInterface) { - self.repository = repository - } - - func uploadDailys(dailys: [Daily], completion: @escaping (Result) -> Void) { - self.repository.upload(dailys: dailys) { result in - completion(result) - } - } - - func getDailys(completion: @escaping (Result<[Daily], NetworkError>) -> Void) { - self.repository.get() { result in - completion(result) - } - } -} diff --git a/Project_Timer/Present/Interface/DailysUseCaseInterface.swift b/Project_Timer/Present/Interface/DailysUseCaseInterface.swift deleted file mode 100644 index a268ad1b..00000000 --- a/Project_Timer/Present/Interface/DailysUseCaseInterface.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// DailysUseCaseInterface.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/16. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -protocol DailysUseCaseInterface { - var repository: DailysRepositoryInterface { get } - func uploadDailys(dailys: [Daily], completion: @escaping (Result) -> Void) - func getDailys(completion: @escaping (Result<[Daily], NetworkError>) -> Void) -} diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVC.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVC.swift index 3c71ff62..e0d72f34 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVC.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVC.swift @@ -121,7 +121,6 @@ extension SyncDailysVC { extension SyncDailysVC { private func configureViewModel() { - let dailysUseCase = DailysUseCase(repository: DailysRepository_lagacy()) let recordTimesUseCase = RecordTimesUseCase(repository: RecordTimesRepository_lagacy()) let syncLogUseCase = SyncLogUseCase(repository: SyncLogRepository_lagacy()) let targetDailys = self.syncDeviceStatusView.configureDailys() @@ -130,12 +129,13 @@ extension SyncDailysVC { let api = TTProvider(session: Session(interceptor: NetworkInterceptor.shared)) let repository = DailysRepository(api: api) let getDailysUseCase = GetDailysUseCase(repository: repository) + let postDailysUseCase = PostDailysUseCase(repository: repository) self.viewModel = SyncDailysVM( - dailysUseCase: dailysUseCase, recordTimesUseCase: recordTimesUseCase, syncLogUseCase: syncLogUseCase, getDailysUseCase: getDailysUseCase, + postDailysUseCase: postDailysUseCase, targetDailys: targetDailys) } } diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVM.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVM.swift index 39a934eb..e6b30564 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVM.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVM.swift @@ -10,10 +10,10 @@ import Foundation import Combine final class SyncDailysVM { - private let dailysUseCase: DailysUseCaseInterface private let recordTimesUseCase: RecordTimesUseCaseInterface private let syncLogUseCase: SyncLogUseCaseInterface private let getDailysUseCase: GetDailysUseCase + private let postDailysUseCase: PostDailysUseCase private var targetDailys: [Daily] @Published private(set) var syncLog: SyncLog? @Published private(set) var alert: (title: String, text: String)? @@ -23,15 +23,15 @@ final class SyncDailysVM { // Combine binding private var cancellables = Set() - init(dailysUseCase: DailysUseCaseInterface, - recordTimesUseCase: RecordTimesUseCaseInterface, + init(recordTimesUseCase: RecordTimesUseCaseInterface, syncLogUseCase: SyncLogUseCaseInterface, getDailysUseCase: GetDailysUseCase, + postDailysUseCase: PostDailysUseCase, targetDailys: [Daily]) { - self.dailysUseCase = dailysUseCase self.recordTimesUseCase = recordTimesUseCase self.syncLogUseCase = syncLogUseCase self.getDailysUseCase = getDailysUseCase + self.postDailysUseCase = postDailysUseCase self.targetDailys = targetDailys self.checkServerURL() @@ -79,23 +79,24 @@ extension SyncDailysVM { private func uploadDailys() { self.loadingText = .uploadDailys self.loading = true - self.dailysUseCase.uploadDailys(dailys: self.targetDailys) { [weak self] result in - self?.loading = false - switch result { - case .success(_): - self?.getDailys() - case .failure(let error): - switch error { - case .CLIENTERROR(let message): - if let message = message { - print("[upload Dailys ERROR] \(message)") + self.postDailysUseCase.execute(request: self.targetDailys) + .sink { [weak self] completion in + if case .failure(let networkError) = completion { + print("ERROR", #function, networkError) + switch networkError { + case .CLIENTERROR(let message): + if let message = message { + print("[upload Dailys ERROR] \(message)") + } + self?.alert = (title: Localized.string(.Server_Error_UploadError), text: Localized.string(.Server_Error_DecodeError)) + default: + self?.alert = networkError.alertMessage } - self?.alert = (title: Localized.string(.Server_Error_UploadError), text: Localized.string(.Server_Error_DecodeError)) - default: - self?.alert = error.alertMessage } + } receiveValue: { [weak self] _ in + self?.getDailys() } - } + .store(in: &self.cancellables) } /// uploadRecordTime -> getSyncLog 진행 @@ -235,7 +236,12 @@ extension SyncDailysVM { let dailyStartAt = lastDaily.taskHistorys?.values .flatMap({ $0 }) .sorted(by: { $0.endDate < $1.endDate }) - .last?.startDate else { return } + .last?.startDate else { + // 정보가 없는 경우 + self.getSyncLog(afterUploaded: true) + return + } + let localStartAt = RecordsManager.shared.recordTimes.recordStartAt if (dailyStartAt.YYYYMMDDHMSstyleString == localStartAt.YYYYMMDDHMSstyleString) { From 4d76aa8b4557a158945f5d4037a70b6b7b2ab59e Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sun, 11 Aug 2024 09:23:54 +0900 Subject: [PATCH 37/44] =?UTF-8?q?feat=20#144:=20GetNotificationUseCase=20?= =?UTF-8?q?=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 26 +++++------- Project_Timer/AppDelegate.swift | 27 ++++++------- Project_Timer/Data/NetworkURL.swift | 4 +- .../Data/Repository/FirebaseRepository.swift | 4 +- .../NotificationRepository_lagacy.swift | 40 ------------------- .../Firebase/GetNotificationUseCase.swift | 4 +- .../Notification}/NotificationUseCase.swift | 0 .../GetNotificationUseCase_lagacy.swift | 23 ----------- .../NotificationRepositoryInterface.swift | 13 ------ .../GetNotificationUseCaseInterface.swift | 14 ------- 10 files changed, 27 insertions(+), 128 deletions(-) delete mode 100644 Project_Timer/Data/lagacy/NotificationRepository_lagacy.swift rename Project_Timer/Domain/{lagacy => UseCase/Notification}/NotificationUseCase.swift (100%) delete mode 100644 Project_Timer/Domain/lagacy/GetNotificationUseCase_lagacy.swift delete mode 100644 Project_Timer/Domain/lagacy/NotificationRepositoryInterface.swift delete mode 100644 Project_Timer/Present/Interface/GetNotificationUseCaseInterface.swift diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index caf48c8d..ec31b678 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -140,11 +140,7 @@ 87306D792B26CC7B001B7C14 /* MiSans-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 87306D692B26CC7A001B7C14 /* MiSans-Bold.ttf */; }; 87306D872B26D00A001B7C14 /* Fonts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04FA75D7286F2AB900BAE2B2 /* Fonts.swift */; }; 873731D12B2E92BD00D7BD9F /* NotificationNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D02B2E92BD00D7BD9F /* NotificationNetwork.swift */; }; - 873731D32B2E931800D7BD9F /* NotificationRepository_lagacy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D22B2E931800D7BD9F /* NotificationRepository_lagacy.swift */; }; 873731D52B2E938400D7BD9F /* NotificationResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D42B2E938400D7BD9F /* NotificationResponse.swift */; }; - 873731D72B2E97C100D7BD9F /* NotificationRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D62B2E97C100D7BD9F /* NotificationRepositoryInterface.swift */; }; - 873731D92B2E97FE00D7BD9F /* GetNotificationUseCase_lagacy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D82B2E97FE00D7BD9F /* GetNotificationUseCase_lagacy.swift */; }; - 873731DB2B2E983500D7BD9F /* GetNotificationUseCaseInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731DA2B2E983500D7BD9F /* GetNotificationUseCaseInterface.swift */; }; 873731DD2B2E9AA900D7BD9F /* FirebaseStringArrayValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731DC2B2E9AA900D7BD9F /* FirebaseStringArrayValue.swift */; }; 873731DF2B2EA2B000D7BD9F /* FirestoreValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731DE2B2EA2AF00D7BD9F /* FirestoreValue.swift */; }; 873977EB288D3FAA0025EE73 /* LogDailyVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873977EA288D3FAA0025EE73 /* LogDailyVM.swift */; }; @@ -583,11 +579,7 @@ 873648A22B0D8CE10053B080 /* Project_TimerDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Project_TimerDebug.entitlements; sourceTree = ""; }; 873648A32B0D8DDF0053B080 /* Project_TimerDevelop.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Project_TimerDevelop.entitlements; sourceTree = ""; }; 873731D02B2E92BD00D7BD9F /* NotificationNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationNetwork.swift; sourceTree = ""; }; - 873731D22B2E931800D7BD9F /* NotificationRepository_lagacy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationRepository_lagacy.swift; sourceTree = ""; }; 873731D42B2E938400D7BD9F /* NotificationResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationResponse.swift; sourceTree = ""; }; - 873731D62B2E97C100D7BD9F /* NotificationRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationRepositoryInterface.swift; sourceTree = ""; }; - 873731D82B2E97FE00D7BD9F /* GetNotificationUseCase_lagacy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetNotificationUseCase_lagacy.swift; sourceTree = ""; }; - 873731DA2B2E983500D7BD9F /* GetNotificationUseCaseInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetNotificationUseCaseInterface.swift; sourceTree = ""; }; 873731DC2B2E9AA900D7BD9F /* FirebaseStringArrayValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseStringArrayValue.swift; sourceTree = ""; }; 873731DE2B2EA2AF00D7BD9F /* FirestoreValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirestoreValue.swift; sourceTree = ""; }; 873977EA288D3FAA0025EE73 /* LogDailyVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogDailyVM.swift; sourceTree = ""; }; @@ -1050,7 +1042,6 @@ 870800602B2C5FDA00830B39 /* AuthRepository_lagacy.swift */, 8708007A2B2D4F0800830B39 /* RecordTimesRepository_lagacy.swift */, 870800862B2D599800830B39 /* SyncLogRepository_lagacy.swift */, - 873731D22B2E931800D7BD9F /* NotificationRepository_lagacy.swift */, ); path = lagacy; sourceTree = ""; @@ -1061,12 +1052,9 @@ 870800642B2C623600830B39 /* AuthRepositoryInterface.swift */, 8708007C2B2D503600830B39 /* RecordTimesRepositoryInterface.swift */, 8708008A2B2D5A4400830B39 /* SyncLogRepositoryInterface.swift */, - 873731D62B2E97C100D7BD9F /* NotificationRepositoryInterface.swift */, 870800662B2C67E900830B39 /* AuthUseCase.swift */, 8708007E2B2D543500830B39 /* RecordTimesUseCase.swift */, 8708008C2B2D63D300830B39 /* SyncLogUseCase.swift */, - 873731D82B2E97FE00D7BD9F /* GetNotificationUseCase_lagacy.swift */, - 87FB8D1A2B3C5DF300EA5693 /* NotificationUseCase.swift */, ); path = lagacy; sourceTree = ""; @@ -1204,6 +1192,14 @@ path = Resource; sourceTree = ""; }; + 874A9DF42C6837BF006D2E19 /* Notification */ = { + isa = PBXGroup; + children = ( + 87FB8D1A2B3C5DF300EA5693 /* NotificationUseCase.swift */, + ); + path = Notification; + sourceTree = ""; + }; 874F9C342ABFFDE900675A86 /* LoginSelect */ = { isa = PBXGroup; children = ( @@ -1293,7 +1289,6 @@ 870800682B2C68EF00830B39 /* AuthUseCaseInterface.swift */, 870800802B2D54B500830B39 /* RecordTimesUseCaseInterface.swift */, 8708008E2B2D646C00830B39 /* SyncLogUseCaseInterface.swift */, - 873731DA2B2E983500D7BD9F /* GetNotificationUseCaseInterface.swift */, 87FB8D1C2B3C5F4D00EA5693 /* NotificationUseCaseInterface.swift */, ); path = Interface; @@ -1984,6 +1979,7 @@ 87F778E02B196EDF00909511 /* UseCase */ = { isa = PBXGroup; children = ( + 874A9DF42C6837BF006D2E19 /* Notification */, 872210532C300922003B97AD /* Firebase */, 877BDCDF2C390BAE00A50231 /* Auth */, 871616922C3A146400C4EF25 /* Dailys */, @@ -2362,7 +2358,6 @@ 877911BC2A18922400F0A713 /* SettingListCellInfo.swift in Sources */, 871616A02C3A605600C4EF25 /* PostRecordTimeUseCase.swift in Sources */, 8791081F28387537005D7B10 /* NetworkURL.swift in Sources */, - 873731DB2B2E983500D7BD9F /* GetNotificationUseCaseInterface.swift in Sources */, 87D83E852B285D4D003C40AE /* SettingLanguageVC.swift in Sources */, 873C197628D041DE00E02ADC /* DailyView.swift in Sources */, 87D4DCCF2BA5492700BB5AAB /* SimpleResponse.swift in Sources */, @@ -2446,7 +2441,6 @@ 87EFD6832AC12C3800C422B1 /* SigninSignupEnvironment.swift in Sources */, 93A892B124C14D4700F89180 /* CircularProgressView.swift in Sources */, 8791C1F427DCD120000D6BA9 /* UserDefaultsManager.swift in Sources */, - 873731D72B2E97C100D7BD9F /* NotificationRepositoryInterface.swift in Sources */, 8765234F28C7964500487BFB /* TotalVM.swift in Sources */, 878899852894F09600B7F378 /* WeekTimelineView.swift in Sources */, 872210472C2FF676003B97AD /* SurveyInfo.swift in Sources */, @@ -2572,7 +2566,6 @@ 87D4DCC22BA5298B00BB5AAB /* ResetPasswordNicknameView.swift in Sources */, 87C2F97B28A6BFC700F44D98 /* ModifyRecordVC.swift in Sources */, 8708008B2B2D5A4400830B39 /* SyncLogRepositoryInterface.swift in Sources */, - 873731D92B2E97FE00D7BD9F /* GetNotificationUseCase_lagacy.swift in Sources */, 87D4DCCC2BA5477400BB5AAB /* UpdatePasswordRequest.swift in Sources */, 879A2BA8284746A500B69DA7 /* SettingFooterView.swift in Sources */, 04E0DFC328A9031A004DABBE /* ModifyRecordVM.swift in Sources */, @@ -2602,7 +2595,6 @@ 870C70712AD4ECB700024CAC /* SigninRoute.swift in Sources */, 879A2BA6284741A500B69DA7 /* SettingHeaderView.swift in Sources */, 8721C6DB296943C500410D57 /* ChangeNextGraphButton.swift in Sources */, - 873731D32B2E931800D7BD9F /* NotificationRepository_lagacy.swift in Sources */, 877D69FC2871C1CB00215B6D /* SurveyResponse.swift in Sources */, 874F9C2F2ABFF7CF00675A86 /* GoogleSigninButton.swift in Sources */, 87199F552883EB160017D01A /* TimelineView.swift in Sources */, diff --git a/Project_Timer/AppDelegate.swift b/Project_Timer/AppDelegate.swift index 47fd90b5..92c443d3 100644 --- a/Project_Timer/AppDelegate.swift +++ b/Project_Timer/AppDelegate.swift @@ -224,28 +224,27 @@ extension AppDelegate { } private func checkNotification() { - let getNotficationUseCase = GetNotificationUseCase_lagacy(repository: NotificationRepository_lagacy()) + // TODO: DI 수정 + let api = TTProvider(session: Session(interceptor: NetworkInterceptor.shared)) + let repository = FirebaseRepository(api: api) + let getNotificationUseCase = GetNotificationUseCase(repository: repository) let notificationUseCase = NotificationUseCase() - getNotficationUseCase.getNoti { result in - switch result { - case .success(let noti): - guard let noti = noti else { return } + getNotificationUseCase.execute() + .sink { completion in + if case .failure(let networkError) = completion { + print("ERROR", #function, networkError) + } + } receiveValue: { notificationInfo in + guard let notificationInfo = notificationInfo else { return } guard notificationUseCase.isShowNotification() else { return } DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { - let notificationVC = NotificationVC(noti: noti, notificationUseCase: notificationUseCase) + let notificationVC = NotificationVC(noti: notificationInfo, notificationUseCase: notificationUseCase) SceneDelegate.sharedWindow?.rootViewController?.present(notificationVC, animated: true) } - case .failure(let networkError): - switch networkError { - case .NOTFOUND(_): - return - default: - print(networkError.alertMessage) - } } - } + .store(in: &self.cancellables) } private func updateToLastestVersion() { diff --git a/Project_Timer/Data/NetworkURL.swift b/Project_Timer/Data/NetworkURL.swift index de37eda6..8418f740 100644 --- a/Project_Timer/Data/NetworkURL.swift +++ b/Project_Timer/Data/NetworkURL.swift @@ -19,9 +19,7 @@ final class NetworkURL { private init() { self.getServerURL() - .sink { version in - print(version ?? "nil") - } + .sink { _ in } .store(in: &self.cancellables) } diff --git a/Project_Timer/Data/Repository/FirebaseRepository.swift b/Project_Timer/Data/Repository/FirebaseRepository.swift index f33dcfe0..f5acbafa 100644 --- a/Project_Timer/Data/Repository/FirebaseRepository.swift +++ b/Project_Timer/Data/Repository/FirebaseRepository.swift @@ -60,10 +60,10 @@ final class FirebaseRepository { .catchDecodeError() } - func getNotification() -> AnyPublisher { + func getNotification() -> AnyPublisher { return self.api.request(.getNotification) .map(NotificationResponse.self) - .map { $0.toDomain() } + .map { $0.visible.value == true ? $0.toDomain() : nil } .catchDecodeError() } } diff --git a/Project_Timer/Data/lagacy/NotificationRepository_lagacy.swift b/Project_Timer/Data/lagacy/NotificationRepository_lagacy.swift deleted file mode 100644 index 80ea0639..00000000 --- a/Project_Timer/Data/lagacy/NotificationRepository_lagacy.swift +++ /dev/null @@ -1,40 +0,0 @@ -// -// NotificationRepository.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/17. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -final class NotificationRepository_lagacy: NotificationRepositoryInterface { - private let api = NotificationNetwork() - - func get(completion: @escaping (Result) -> Void) { - api.get { result in - switch result.status { - case .SUCCESS: - if let data = result.data { - guard let dto = try? JSONDecoder.dateFormatted.decode(NotificationResponse.self, from: data) else { - print(String(data: data, encoding: .utf8)!) - completion(.failure(.DECODEERROR)) - return - } - - guard dto.visible.value else { - completion(.success(nil)) - return - } - - let info = dto.toDomain() - completion(.success(info)) - } else { - completion(.success(nil)) - } - default: - completion(.failure(.error(result))) - } - } - } -} diff --git a/Project_Timer/Domain/UseCase/Firebase/GetNotificationUseCase.swift b/Project_Timer/Domain/UseCase/Firebase/GetNotificationUseCase.swift index 7471b7ba..44bd8b63 100644 --- a/Project_Timer/Domain/UseCase/Firebase/GetNotificationUseCase.swift +++ b/Project_Timer/Domain/UseCase/Firebase/GetNotificationUseCase.swift @@ -10,13 +10,13 @@ import Foundation import Combine final class GetNotificationUseCase { - private let repository: FirebaseRepository + private let repository: FirebaseRepository // TODO: 프로토콜로 수정 init(repository: FirebaseRepository) { self.repository = repository } - func execute() -> AnyPublisher { + func execute() -> AnyPublisher { return self.repository.getNotification() } } diff --git a/Project_Timer/Domain/lagacy/NotificationUseCase.swift b/Project_Timer/Domain/UseCase/Notification/NotificationUseCase.swift similarity index 100% rename from Project_Timer/Domain/lagacy/NotificationUseCase.swift rename to Project_Timer/Domain/UseCase/Notification/NotificationUseCase.swift diff --git a/Project_Timer/Domain/lagacy/GetNotificationUseCase_lagacy.swift b/Project_Timer/Domain/lagacy/GetNotificationUseCase_lagacy.swift deleted file mode 100644 index 1707be5b..00000000 --- a/Project_Timer/Domain/lagacy/GetNotificationUseCase_lagacy.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// GetNotificationUseCase_lagacy.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/17. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -final class GetNotificationUseCase_lagacy: GetNotificationUseCaseInterface { - let repository: NotificationRepositoryInterface - - init(repository: NotificationRepositoryInterface) { - self.repository = repository - } - - func getNoti(completion: @escaping (Result) -> Void) { - self.repository.get() { result in - completion(result) - } - } -} diff --git a/Project_Timer/Domain/lagacy/NotificationRepositoryInterface.swift b/Project_Timer/Domain/lagacy/NotificationRepositoryInterface.swift deleted file mode 100644 index b440f9d9..00000000 --- a/Project_Timer/Domain/lagacy/NotificationRepositoryInterface.swift +++ /dev/null @@ -1,13 +0,0 @@ -// -// NotificationRepositoryInterface.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/17. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -protocol NotificationRepositoryInterface { - func get(completion: @escaping (Result) -> Void) -} diff --git a/Project_Timer/Present/Interface/GetNotificationUseCaseInterface.swift b/Project_Timer/Present/Interface/GetNotificationUseCaseInterface.swift deleted file mode 100644 index 3695ac3a..00000000 --- a/Project_Timer/Present/Interface/GetNotificationUseCaseInterface.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// GetNotificationUseCaseInterface.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/17. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -protocol GetNotificationUseCaseInterface { - var repository: NotificationRepositoryInterface { get } - func getNoti(completion: @escaping (Result) -> Void) -} From c98a398a09ed74f1c9bfcb5aafae00be9e26b21f Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sun, 11 Aug 2024 22:18:31 +0900 Subject: [PATCH 38/44] =?UTF-8?q?feat=20#144:=20CheckEmailExitUseCase,=20U?= =?UTF-8?q?pdatePasswordUseCase=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 20 ---- Project_Timer/Data/NetworkInterceptor.swift | 31 ++++-- .../Data/lagacy/AuthRepository_lagacy.swift | 105 ------------------ .../Data/lagacy/NotificationNetwork.swift | 28 ----- .../lagacy/AuthRepositoryInterface.swift | 17 --- Project_Timer/Domain/lagacy/AuthUseCase.swift | 74 ------------ .../Interface/AuthUseCaseInterface.swift | 18 --- .../Email/ResetPasswordEmailModel.swift | 37 +++--- .../Email/ResetPasswordEmailView.swift | 25 +++-- .../Nickname/ResetPasswordNicknameModel.swift | 2 +- .../Nickname/ResetPasswordNicknameView.swift | 13 +-- .../Password/ResetPasswordModel.swift | 36 +++--- .../Password/ResetPasswordView.swift | 15 ++- 13 files changed, 92 insertions(+), 329 deletions(-) delete mode 100644 Project_Timer/Data/lagacy/AuthRepository_lagacy.swift delete mode 100644 Project_Timer/Data/lagacy/NotificationNetwork.swift delete mode 100644 Project_Timer/Domain/lagacy/AuthRepositoryInterface.swift delete mode 100644 Project_Timer/Domain/lagacy/AuthUseCase.swift delete mode 100644 Project_Timer/Present/Interface/AuthUseCaseInterface.swift diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index ec31b678..af17ce0b 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -49,11 +49,7 @@ 870800522B2C3A0800830B39 /* ServerURLResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800512B2C3A0800830B39 /* ServerURLResponse.swift */; }; 8708005C2B2C4D2D00830B39 /* AuthNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708005B2B2C4D2D00830B39 /* AuthNetwork.swift */; }; 8708005F2B2C5F5F00830B39 /* AuthResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708005E2B2C5F5F00830B39 /* AuthResponse.swift */; }; - 870800612B2C5FDA00830B39 /* AuthRepository_lagacy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800602B2C5FDA00830B39 /* AuthRepository_lagacy.swift */; }; 870800632B2C604100830B39 /* AuthInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800622B2C604100830B39 /* AuthInfo.swift */; }; - 870800652B2C623600830B39 /* AuthRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800642B2C623600830B39 /* AuthRepositoryInterface.swift */; }; - 870800672B2C67E900830B39 /* AuthUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800662B2C67E900830B39 /* AuthUseCase.swift */; }; - 870800692B2C68EF00830B39 /* AuthUseCaseInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800682B2C68EF00830B39 /* AuthUseCaseInterface.swift */; }; 8708006F2B2CA92C00830B39 /* DailyResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708006E2B2CA92C00830B39 /* DailyResponse.swift */; }; 870800712B2CAD9900830B39 /* TaskHistory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800702B2CAD9900830B39 /* TaskHistory.swift */; }; 870800792B2D4DE500830B39 /* RecordTimesNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800782B2D4DE500830B39 /* RecordTimesNetwork.swift */; }; @@ -139,7 +135,6 @@ 87306D712B26CC7B001B7C14 /* MiSans-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 87306D652B26CC79001B7C14 /* MiSans-Regular.ttf */; }; 87306D792B26CC7B001B7C14 /* MiSans-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 87306D692B26CC7A001B7C14 /* MiSans-Bold.ttf */; }; 87306D872B26D00A001B7C14 /* Fonts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04FA75D7286F2AB900BAE2B2 /* Fonts.swift */; }; - 873731D12B2E92BD00D7BD9F /* NotificationNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D02B2E92BD00D7BD9F /* NotificationNetwork.swift */; }; 873731D52B2E938400D7BD9F /* NotificationResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731D42B2E938400D7BD9F /* NotificationResponse.swift */; }; 873731DD2B2E9AA900D7BD9F /* FirebaseStringArrayValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731DC2B2E9AA900D7BD9F /* FirebaseStringArrayValue.swift */; }; 873731DF2B2EA2B000D7BD9F /* FirestoreValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873731DE2B2EA2AF00D7BD9F /* FirestoreValue.swift */; }; @@ -490,11 +485,7 @@ 870800512B2C3A0800830B39 /* ServerURLResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerURLResponse.swift; sourceTree = ""; }; 8708005B2B2C4D2D00830B39 /* AuthNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthNetwork.swift; sourceTree = ""; }; 8708005E2B2C5F5F00830B39 /* AuthResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthResponse.swift; sourceTree = ""; }; - 870800602B2C5FDA00830B39 /* AuthRepository_lagacy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthRepository_lagacy.swift; sourceTree = ""; }; 870800622B2C604100830B39 /* AuthInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthInfo.swift; sourceTree = ""; }; - 870800642B2C623600830B39 /* AuthRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthRepositoryInterface.swift; sourceTree = ""; }; - 870800662B2C67E900830B39 /* AuthUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthUseCase.swift; sourceTree = ""; }; - 870800682B2C68EF00830B39 /* AuthUseCaseInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthUseCaseInterface.swift; sourceTree = ""; }; 8708006E2B2CA92C00830B39 /* DailyResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailyResponse.swift; sourceTree = ""; }; 870800702B2CAD9900830B39 /* TaskHistory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskHistory.swift; sourceTree = ""; }; 870800782B2D4DE500830B39 /* RecordTimesNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesNetwork.swift; sourceTree = ""; }; @@ -578,7 +569,6 @@ 87306D692B26CC7A001B7C14 /* MiSans-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "MiSans-Bold.ttf"; sourceTree = ""; }; 873648A22B0D8CE10053B080 /* Project_TimerDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Project_TimerDebug.entitlements; sourceTree = ""; }; 873648A32B0D8DDF0053B080 /* Project_TimerDevelop.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Project_TimerDevelop.entitlements; sourceTree = ""; }; - 873731D02B2E92BD00D7BD9F /* NotificationNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationNetwork.swift; sourceTree = ""; }; 873731D42B2E938400D7BD9F /* NotificationResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationResponse.swift; sourceTree = ""; }; 873731DC2B2E9AA900D7BD9F /* FirebaseStringArrayValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseStringArrayValue.swift; sourceTree = ""; }; 873731DE2B2EA2AF00D7BD9F /* FirestoreValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirestoreValue.swift; sourceTree = ""; }; @@ -1038,8 +1028,6 @@ 8708005B2B2C4D2D00830B39 /* AuthNetwork.swift */, 870800782B2D4DE500830B39 /* RecordTimesNetwork.swift */, 870800842B2D593400830B39 /* SyncLogNetwork.swift */, - 873731D02B2E92BD00D7BD9F /* NotificationNetwork.swift */, - 870800602B2C5FDA00830B39 /* AuthRepository_lagacy.swift */, 8708007A2B2D4F0800830B39 /* RecordTimesRepository_lagacy.swift */, 870800862B2D599800830B39 /* SyncLogRepository_lagacy.swift */, ); @@ -1049,10 +1037,8 @@ 872210502C3003EB003B97AD /* lagacy */ = { isa = PBXGroup; children = ( - 870800642B2C623600830B39 /* AuthRepositoryInterface.swift */, 8708007C2B2D503600830B39 /* RecordTimesRepositoryInterface.swift */, 8708008A2B2D5A4400830B39 /* SyncLogRepositoryInterface.swift */, - 870800662B2C67E900830B39 /* AuthUseCase.swift */, 8708007E2B2D543500830B39 /* RecordTimesUseCase.swift */, 8708008C2B2D63D300830B39 /* SyncLogUseCase.swift */, ); @@ -1286,7 +1272,6 @@ 875FAE332B1C717E008F19D2 /* Interface */ = { isa = PBXGroup; children = ( - 870800682B2C68EF00830B39 /* AuthUseCaseInterface.swift */, 870800802B2D54B500830B39 /* RecordTimesUseCaseInterface.swift */, 8708008E2B2D646C00830B39 /* SyncLogUseCaseInterface.swift */, 87FB8D1C2B3C5F4D00EA5693 /* NotificationUseCaseInterface.swift */, @@ -2317,7 +2302,6 @@ 87ED9ABF28D16FC200186677 /* TasksCircularProgressDTO.swift in Sources */, 87D4DCD62BA5A7B100BB5AAB /* ResetPasswordEmailRoute.swift in Sources */, 049BBA9828AB3D94005BAB1B /* ModifyFinishButton.swift in Sources */, - 873731D12B2E92BD00D7BD9F /* NotificationNetwork.swift in Sources */, 873731D52B2E938400D7BD9F /* NotificationResponse.swift in Sources */, 874B54282C158F890062D0AC /* CheckEmailExitRequest.swift in Sources */, 8758E4F528C7124900A99484 /* MonthSmallView.swift in Sources */, @@ -2352,7 +2336,6 @@ 875FBE272AC91ED800B28723 /* CGPoint+Extension.swift in Sources */, 875EDA342957E0360037A7EB /* NetworkInterceptor.swift in Sources */, 870E11752A0E226D00CFA77C /* CalendarWidgetData.swift in Sources */, - 870800612B2C5FDA00830B39 /* AuthRepository_lagacy.swift in Sources */, 87CEDD3D28F5338B007ACF6E /* ColorSelectorVC.swift in Sources */, 8706C32C2AEF864000F7C842 /* TTSignupTitleView.swift in Sources */, 877911BC2A18922400F0A713 /* SettingListCellInfo.swift in Sources */, @@ -2388,7 +2371,6 @@ 87DB923E2AC2D06C00FE6453 /* View+Extension.swift in Sources */, 043706272869D58C00A5D3AA /* TimerTimeLabelView.swift in Sources */, 874F9C312ABFF81300675A86 /* EmailSigninButton.swift in Sources */, - 870800692B2C68EF00830B39 /* AuthUseCaseInterface.swift in Sources */, 871616962C3A149000C4EF25 /* GetDailysUseCase.swift in Sources */, 878DA8252B0C78D8001E924E /* SignupNicknameRoute.swift in Sources */, 870F90E52AEFFA9300854DDB /* SignupPasswordModel.swift in Sources */, @@ -2406,7 +2388,6 @@ 87A48BC927DF026800F46D0F /* Int+Extension.swift in Sources */, 872C0EDE284AE52800E8E3F2 /* SettingFunctionsListVC.swift in Sources */, 8708007D2B2D503600830B39 /* RecordTimesRepositoryInterface.swift in Sources */, - 870800672B2C67E900830B39 /* AuthUseCase.swift in Sources */, 87D1250128771AAD00018658 /* Language.swift in Sources */, 87CAC06228B8711D0036CF24 /* FirebaseEvent.swift in Sources */, 879D20792A19B3D300D8A420 /* ThemeColorSelectorView.swift in Sources */, @@ -2431,7 +2412,6 @@ 87306D532B260969001B7C14 /* TLRen.swift in Sources */, 8708008F2B2D646C00830B39 /* SyncLogUseCaseInterface.swift in Sources */, 87199F5E28842F0E0017D01A /* CheckGraphButton.swift in Sources */, - 870800652B2C623600830B39 /* AuthRepositoryInterface.swift in Sources */, 87F10930284C4337002E31EA /* TiTiLabHeaderView.swift in Sources */, 879D20812A19E44B00D8A420 /* TargetTimeView.swift in Sources */, 87A4704826493D4D007B89D6 /* RecordTimes.swift in Sources */, diff --git a/Project_Timer/Data/NetworkInterceptor.swift b/Project_Timer/Data/NetworkInterceptor.swift index a261cf51..59db227b 100644 --- a/Project_Timer/Data/NetworkInterceptor.swift +++ b/Project_Timer/Data/NetworkInterceptor.swift @@ -8,6 +8,7 @@ import Foundation import Alamofire +import Combine /// accessToken, refreshToken 주입 final class NetworkInterceptor: RequestInterceptor { @@ -15,6 +16,9 @@ final class NetworkInterceptor: RequestInterceptor { static let shared = NetworkInterceptor() private init() {} + // Combine binding + private var cancellables = Set() + /// network request 전에 token 설정 func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result) -> Void) { guard urlRequest.url?.absoluteString.hasPrefix(NetworkURL.shared.serverURL ?? "nil") == true else { @@ -63,20 +67,27 @@ final class NetworkInterceptor: RequestInterceptor { } extension NetworkInterceptor { + /// signin 과정을 통해 token 재발급 private func signinForToken(completion: @escaping (String?) -> Void) { guard let username = KeyChain.shared.get(key: .username), let password = KeyChain.shared.get(key: .password) else { return } + + // TODO: DI 수정 + let api = TTProvider() + let repository = AuthRepository(api: api) + let signinUseCase = SigninUseCase(repository: repository) + let signinInfo = TestUserSigninRequest(username: username, password: password) - let authUseCase = AuthUseCase(repository: AuthRepository_lagacy()) - authUseCase.signin(signinInfo: signinInfo) { result in - switch result { - case .success(let token): - completion(token) - case .failure(let error): - let message = error.alertMessage - print("title: \(error.title)/nmessage: \(error.message)") - completion(nil) + signinUseCase.execute(request: signinInfo) + .sink { comp in + if case .failure(let networkError) = comp { + print("ERROR", #function, networkError) + print(networkError.alertMessage) + completion(nil) + } + } receiveValue: { authInfo in + completion(authInfo.token) } - } + .store(in: &self.cancellables) } } diff --git a/Project_Timer/Data/lagacy/AuthRepository_lagacy.swift b/Project_Timer/Data/lagacy/AuthRepository_lagacy.swift deleted file mode 100644 index 78a09b9a..00000000 --- a/Project_Timer/Data/lagacy/AuthRepository_lagacy.swift +++ /dev/null @@ -1,105 +0,0 @@ -// -// AuthRepository_lagacy.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/15. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -final class AuthRepository_lagacy: AuthRepositoryInterface { - private let api = AuthNetwork() - - func signup(signupInfo: TestUserSignupRequest, completion: @escaping (Result) -> Void) { - api.signup(signupInfo: signupInfo) { result in - switch result.status { - case .SUCCESS: - guard let data = result.data, - let dto = try? JSONDecoder().decode(AuthResponse.self, from: data) else { - completion(.failure(.DECODEERROR)) - return - } - - let info = dto.toDomain() - completion(.success(info)) - - default: - completion(.failure(.error(result))) - } - } - } - - func signin(signinInfo: TestUserSigninRequest, completion: @escaping (Result) -> Void) { - api.signin(signinInfo: signinInfo) { result in - switch result.status { - case .SUCCESS: - guard let data = result.data, - let dto = try? JSONDecoder().decode(AuthResponse.self, from: data) else { - completion(.failure(.DECODEERROR)) - return - } - - let info = dto.toDomain() - completion(.success(info)) - - default: - completion(.failure(.error(result))) - } - } - } - - func checkUsername(username: String, completion: @escaping (Result) -> Void) { - api.checkUsername(username: username) { result in - switch result.status { - case .SUCCESS: - guard let data = result.data, - let dto = try? JSONDecoder().decode(SimpleResponse.self, from: data) else { - completion(.failure(.DECODEERROR)) - return - } - - completion(.success(dto)) - - default: - completion(.failure(.error(result))) - } - } - } - - func checkEmail(username: String, email: String, completion: @escaping (Result) -> Void) { - api.checkEmail(username: username, email: email) { result in - switch result.status { - case .SUCCESS: - guard let data = result.data, - let dto = try? JSONDecoder().decode(SimpleResponse.self, from: data) else { - completion(.failure(.DECODEERROR)) - return - } - - completion(.success(dto)) - - default: - completion(.failure(.error(result))) - } - } - } - - func updatePassword(request: UpdatePasswordRequest, completion: @escaping (Result) -> Void) { - api.updatePassword(request: request) { result in - switch result.status { - case .SUCCESS: - guard let data = result.data, - let dto = try? JSONDecoder().decode(SimpleResponse.self, from: data) else { - completion(.failure(.DECODEERROR)) - return - } - - completion(.success(dto)) - - default: - completion(.failure(.error(result))) - } - } - } -} diff --git a/Project_Timer/Data/lagacy/NotificationNetwork.swift b/Project_Timer/Data/lagacy/NotificationNetwork.swift deleted file mode 100644 index 930f596c..00000000 --- a/Project_Timer/Data/lagacy/NotificationNetwork.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// NotificationNetwork.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/17. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -final class NotificationNetwork { - private let network = Network() - private var url: String { - let base = Infos.FirestoreURL.value - let path = "/notification" - switch Language.current { - case .ko: return base + path + "/ko" - case .en: return base + path + "/en" - case .zh: return base + path + "/zh" - } - } - - func get(completion: @escaping (NetworkResult) -> Void) { - self.network.request(url: url, method: .get) { result in - completion(result) - } - } -} diff --git a/Project_Timer/Domain/lagacy/AuthRepositoryInterface.swift b/Project_Timer/Domain/lagacy/AuthRepositoryInterface.swift deleted file mode 100644 index da22d72b..00000000 --- a/Project_Timer/Domain/lagacy/AuthRepositoryInterface.swift +++ /dev/null @@ -1,17 +0,0 @@ -// -// AuthRepositoryInterface.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/15. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -protocol AuthRepositoryInterface { - func signup(signupInfo: TestUserSignupRequest, completion: @escaping (Result) -> Void) - func signin(signinInfo: TestUserSigninRequest, completion: @escaping (Result) -> Void) - func checkUsername(username: String, completion: @escaping (Result) -> Void) - func checkEmail(username: String, email: String, completion: @escaping (Result) -> Void) - func updatePassword(request: UpdatePasswordRequest, completion: @escaping (Result) -> Void) -} diff --git a/Project_Timer/Domain/lagacy/AuthUseCase.swift b/Project_Timer/Domain/lagacy/AuthUseCase.swift deleted file mode 100644 index ccbd4bd7..00000000 --- a/Project_Timer/Domain/lagacy/AuthUseCase.swift +++ /dev/null @@ -1,74 +0,0 @@ -// -// AuthUseCase.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/15. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -final class AuthUseCase: AuthUseCaseInterface { - let repository: AuthRepositoryInterface - - init(repository: AuthRepositoryInterface) { - self.repository = repository - } - - func signup(signupInfo: TestUserSignupRequest, completion: @escaping (Result) -> Void) { - self.repository.signup(signupInfo: signupInfo) { result in - // AuthInfo -> token 값반 반환 - switch result { - case .success(let authInfo): - completion(.success(authInfo.token)) - case .failure(let networkError): - completion(.failure(networkError)) - } - } - } - - func signin(signinInfo: TestUserSigninRequest, completion: @escaping (Result) -> Void) { - self.repository.signin(signinInfo: signinInfo) { result in - // AuthInfo -> token 값반 반환 - switch result { - case .success(let authInfo): - completion(.success(authInfo.token)) - case .failure(let networkError): - completion(.failure(networkError)) - } - } - } - - func checkUsername(username: String, completion: @escaping (Result) -> Void) { - self.repository.checkUsername(username: username) { result in - switch result { - case .success(let simpleResponse): - completion(.success(simpleResponse)) - case .failure(let networkError): - completion(.failure(networkError)) - } - } - } - - func checkEmail(username: String, email: String, completion: @escaping (Result) -> Void) { - self.repository.checkEmail(username: username, email: email) { result in - switch result { - case .success(let simpleResponse): - completion(.success(simpleResponse)) - case .failure(let networkError): - completion(.failure(networkError)) - } - } - } - - func updatePassword(request: UpdatePasswordRequest, completion: @escaping (Result) -> Void) { - self.repository.updatePassword(request: request) { result in - switch result { - case .success(let simpleResponse): - completion(.success(simpleResponse)) - case .failure(let networkError): - completion(.failure(networkError)) - } - } - } -} diff --git a/Project_Timer/Present/Interface/AuthUseCaseInterface.swift b/Project_Timer/Present/Interface/AuthUseCaseInterface.swift deleted file mode 100644 index caff67c4..00000000 --- a/Project_Timer/Present/Interface/AuthUseCaseInterface.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// AuthUseCaseInterface.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/15. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -protocol AuthUseCaseInterface { - var repository: AuthRepositoryInterface { get } - func signup(signupInfo: TestUserSignupRequest, completion: @escaping (Result) -> Void) - func signin(signinInfo: TestUserSigninRequest, completion: @escaping (Result) -> Void) - func checkUsername(username: String, completion: @escaping (Result) -> Void) - func checkEmail(username: String, email: String, completion: @escaping (Result) -> Void) - func updatePassword(request: UpdatePasswordRequest, completion: @escaping (Result) -> Void) -} diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Email/ResetPasswordEmailModel.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Email/ResetPasswordEmailModel.swift index 8d5ab4f7..c0495426 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Email/ResetPasswordEmailModel.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Email/ResetPasswordEmailModel.swift @@ -8,6 +8,7 @@ import Foundation import SwiftUI +import Combine // MARK: State final class ResetPasswordEmailModel: ObservableObject { @@ -30,12 +31,14 @@ final class ResetPasswordEmailModel: ObservableObject { @Published var errorMessage: ErrorMessage? @Published var email: String = "" + // Combine binding + private var cancellables = Set() - let authUseCase: AuthUseCaseInterface + private let checkEmailExitUseCase: CheckEmailExitUseCase private let infos: ResetPasswordInfosForEmail - init(authUseCase: AuthUseCaseInterface, infos: ResetPasswordInfosForEmail) { - self.authUseCase = authUseCase + init(checkEmailExitUseCase: CheckEmailExitUseCase, infos: ResetPasswordInfosForEmail) { + self.checkEmailExitUseCase = checkEmailExitUseCase self.infos = infos } @@ -79,20 +82,22 @@ extension ResetPasswordEmailModel { // email done 액션 func checkEmail() { - self.authUseCase.checkEmail(username: self.infos.nickname, email: self.email) { [weak self] result in - switch result { - case .success(let simpleResponse): - self?.validEmail = simpleResponse.data - case .failure(let error): - self?.validEmail = false - switch error { - case .NOTFOUND(_): - self?.errorMessage = .notExist - default: - self?.errorMessage = .serverError - print("Error: \(error.title), \(error.message)") + self.checkEmailExitUseCase.execute(request: .init(username: self.infos.nickname, email: self.email)) + .sink { [weak self] completion in + if case .failure(let networkError) = completion { + print("ERROR", #function, networkError) + self?.validEmail = false + switch networkError { + case .NOTFOUND(_): + self?.errorMessage = .notExist + default: + self?.errorMessage = .serverError + print(networkError.alertMessage) + } } + } receiveValue: { [weak self] valid in + self?.validEmail = valid } - } + .store(in: &self.cancellables) } } diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Email/ResetPasswordEmailView.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Email/ResetPasswordEmailView.swift index d47f5c87..be7b59f4 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Email/ResetPasswordEmailView.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Email/ResetPasswordEmailView.swift @@ -7,6 +7,8 @@ // import SwiftUI +import Combine +import Moya struct ResetPasswordEmailView: View { @ObservedObject private var keyboard = KeyboardResponder.shared @@ -32,12 +34,11 @@ struct ResetPasswordEmailView: View { .navigationDestination(for: ResetPasswordEmailRoute.self) { destination in switch destination { case .resetPassword: - let authUseCase = self.model.authUseCase - let infos = self.model.resetPasswordInfosForPassword - let viewModel = ResetPasswordModel( - authUseCase: authUseCase, - infos: infos - ) + // TODO: DI 수정 + let api = TTProvider(session: Session(interceptor: NetworkInterceptor.shared)) + let repository = AuthRepository(api: api) + let updatePasswordUseCase = UpdatePasswordUseCase(repository: repository) + let viewModel = ResetPasswordModel(updatePasswordUseCase: updatePasswordUseCase, infos: model.resetPasswordInfosForPassword) ResetPasswordView(model: viewModel) } } @@ -99,13 +100,13 @@ struct ResetPasswordEmailView: View { struct ResetPasswordEmailView_Previews: PreviewProvider { static var previews: some View { - ResetPasswordEmailView( - model: ResetPasswordEmailModel(authUseCase: AuthUseCase(repository: AuthRepository_lagacy()), infos: ResetPasswordInfosForEmail(nickname: "minsang"))) - .environmentObject(ResetPasswordEnvironment()) + // TODO: DI 수정 + let api = TTProvider(session: Session(interceptor: NetworkInterceptor.shared)) + let repository = AuthRepository(api: api) + let checkEmailExitUseCase = CheckEmailExitUseCase(repository: repository) + let viewModel = ResetPasswordEmailModel(checkEmailExitUseCase: checkEmailExitUseCase, infos: .init(nickname: "minsang")) - ResetPasswordEmailView( - model: ResetPasswordEmailModel(authUseCase: AuthUseCase(repository: AuthRepository_lagacy()), infos: ResetPasswordInfosForEmail(nickname: "minsang"))) + ResetPasswordEmailView(model: viewModel) .environmentObject(ResetPasswordEnvironment()) - .environment(\.locale, .init(identifier: "en")) } } diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Nickname/ResetPasswordNicknameModel.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Nickname/ResetPasswordNicknameModel.swift index 813bb1ed..aaeab93b 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Nickname/ResetPasswordNicknameModel.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Nickname/ResetPasswordNicknameModel.swift @@ -33,7 +33,7 @@ final class ResetPasswordNicknameModel: ObservableObject { // Combine binding private var cancellables = Set() - let checkUsenameExitUseCase: CheckUsernameExitUseCsae + private let checkUsenameExitUseCase: CheckUsernameExitUseCsae init(checkUsenameExitUseCase: CheckUsernameExitUseCsae) { self.checkUsenameExitUseCase = checkUsenameExitUseCase diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Nickname/ResetPasswordNicknameView.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Nickname/ResetPasswordNicknameView.swift index 567ec770..7d916547 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Nickname/ResetPasswordNicknameView.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Nickname/ResetPasswordNicknameView.swift @@ -52,12 +52,11 @@ struct ResetPasswordNicknameView: View { .navigationDestination(for: ResetPasswordNicknameRoute.self) { destination in switch destination { case .resetPasswordEmail: - let authUseCase = AuthUseCase(repository: AuthRepository_lagacy()) - let infos = model.resetPasswordInfosForEmail - let viewModel = ResetPasswordEmailModel( - authUseCase: authUseCase, - infos: infos - ) + // TODO: DI 수정 + let api = TTProvider(session: Session(interceptor: NetworkInterceptor.shared)) + let repository = AuthRepository(api: api) + let checkEmailExitUseCase = CheckEmailExitUseCase(repository: repository) + let viewModel = ResetPasswordEmailModel(checkEmailExitUseCase: checkEmailExitUseCase, infos: model.resetPasswordInfosForEmail) ResetPasswordEmailView(model: viewModel) } } @@ -129,7 +128,7 @@ struct ResetPasswordNicknameView_Previews: PreviewProvider { let viewModel = ResetPasswordNicknameModel(checkUsenameExitUseCase: checkUsernameExitUseCase) ResetPasswordNicknameView( - model: ResetPasswordNicknameModel(checkUsenameExitUseCase: checkUsernameExitUseCase)) + model: viewModel) .environmentObject(ResetPasswordEnvironment()) } } diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Password/ResetPasswordModel.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Password/ResetPasswordModel.swift index 2f83e78b..f2f67b65 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Password/ResetPasswordModel.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Password/ResetPasswordModel.swift @@ -42,12 +42,14 @@ final class ResetPasswordModel: ObservableObject { @Published var password: String = "" @Published var password2: String = "" + // Combine binding + private var cancellables = Set() - let authUseCase: AuthUseCaseInterface + private let updatePasswordUseCase: UpdatePasswordUseCase private let infos: ResetPasswordInfosForPassword - init(authUseCase: AuthUseCaseInterface, infos: ResetPasswordInfosForPassword) { - self.authUseCase = authUseCase + init(updatePasswordUseCase: UpdatePasswordUseCase, infos: ResetPasswordInfosForPassword) { + self.updatePasswordUseCase = updatePasswordUseCase self.infos = infos } @@ -136,21 +138,23 @@ extension ResetPasswordModel { newPassword: self.password2 ) - self.authUseCase.updatePassword(request: request) { [weak self] result in - switch result { - case .success(let simpleResponse): - self?.validPassword2 = simpleResponse.data - case .failure(let error): - self?.validPassword2 = false - switch error { - case .NOTFOUND(_): - self?.errorMessage = .notExist - default: - self?.errorMessage = .serverError - print("Error: \(error.title), \(error.message)") + self.updatePasswordUseCase.execute(request: request) + .sink { [weak self] completion in + if case .failure(let networkError) = completion { + print("ERROR", #function, networkError) + self?.validPassword2 = false + switch networkError { + case .NOTFOUND(_): + self?.errorMessage = .notExist + default: + self?.errorMessage = .serverError + print(networkError.alertMessage) + } } + } receiveValue: { [weak self] success in + self?.validPassword2 = success } - } + .store(in: &self.cancellables) } } diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Password/ResetPasswordView.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Password/ResetPasswordView.swift index b60b4a26..9f8dffea 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Password/ResetPasswordView.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Password/ResetPasswordView.swift @@ -7,6 +7,8 @@ // import SwiftUI +import Combine +import Moya struct ResetPasswordView: View { @ObservedObject private var keyboard = KeyboardResponder.shared @@ -132,11 +134,14 @@ struct ResetPasswordView: View { } struct ResetPasswordView_Previews: PreviewProvider { - static let infos = SignupInfosForPassword(type: .normal, venderInfo: nil, emailInfo: SignupEmailInfo(email: "freedeveloper97@gmail.com", verificationKey: "abcd1234")) - static var previews: some View { - ResetPasswordView( - model: ResetPasswordModel(authUseCase: AuthUseCase(repository: AuthRepository_lagacy()), infos: ResetPasswordInfosForPassword(nickname: "minsang", email: "freedeveloper97@gmail.com")) - ).environmentObject(ResetPasswordEnvironment()) + // TODO: DI 수정 + let api = TTProvider(session: Session(interceptor: NetworkInterceptor.shared)) + let repository = AuthRepository(api: api) + let updatePasswordUseCase = UpdatePasswordUseCase(repository: repository) + let viewModel = ResetPasswordModel(updatePasswordUseCase: updatePasswordUseCase, infos: .init(nickname: "minsang", email: "freedeveloper97@gmail.com")) + + ResetPasswordView(model: viewModel) + .environmentObject(ResetPasswordEnvironment()) } } From c0d089219e3faff32d374583a066a60d3bbdaa13 Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sun, 11 Aug 2024 22:46:45 +0900 Subject: [PATCH 39/44] =?UTF-8?q?feat=20#144:=20Post=20&=20GetRecordTimeUs?= =?UTF-8?q?eCase,=20GetSyncLogUseCase=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 34 +++--- .../UseCase/Dailys/GetDailysUseCase.swift | 2 +- .../UseCase/Dailys/PostDailysUseCase.swift | 2 +- .../GetRecordTimeUseCase.swift | 2 +- .../PostRecordTimeUseCase.swift | 2 +- .../GetSyncLogUseCase.swift | 2 +- .../{ => Password}/ResetPasswordRoute.swift | 0 .../TestServer/SyncDailys/SyncDailysVC.swift | 21 ++-- .../TestServer/SyncDailys/SyncDailysVM.swift | 115 ++++++++++-------- 9 files changed, 102 insertions(+), 78 deletions(-) rename Project_Timer/Domain/UseCase/{Dailys => RecordTimes}/GetRecordTimeUseCase.swift (83%) rename Project_Timer/Domain/UseCase/{Dailys => RecordTimes}/PostRecordTimeUseCase.swift (84%) rename Project_Timer/Domain/UseCase/{Dailys => SyncLog}/GetSyncLogUseCase.swift (84%) rename Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/{ => Password}/ResetPasswordRoute.swift (100%) diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index af17ce0b..69731ba8 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -770,7 +770,6 @@ 87D4DCD52BA5A7B100BB5AAB /* ResetPasswordEmailRoute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResetPasswordEmailRoute.swift; sourceTree = ""; }; 87D4DCD82BA5C17900BB5AAB /* ResetPasswordView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResetPasswordView.swift; sourceTree = ""; }; 87D4DCDA2BA5C19C00BB5AAB /* ResetPasswordModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResetPasswordModel.swift; sourceTree = ""; }; - 87D4DCDC2BA5C1E800BB5AAB /* ResetPasswordRoute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ResetPasswordRoute.swift; path = ../../../../../../../../../../Downloads/ResetPasswordRoute.swift; sourceTree = ""; }; 87D4DCDF2BA69FA500BB5AAB /* ResetPasswordCompleteView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResetPasswordCompleteView.swift; sourceTree = ""; }; 87D4DCE12BA6A12B00BB5AAB /* ResetPasswordCompleteModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResetPasswordCompleteModel.swift; sourceTree = ""; }; 87D4DCE32BA6A18C00BB5AAB /* ChangeCompleteInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeCompleteInfo.swift; sourceTree = ""; }; @@ -980,9 +979,6 @@ children = ( 871616952C3A149000C4EF25 /* GetDailysUseCase.swift */, 8716169D2C3A604C00C4EF25 /* PostDailysUseCase.swift */, - 8716169F2C3A605600C4EF25 /* PostRecordTimeUseCase.swift */, - 871616A12C3A606C00C4EF25 /* GetRecordTimeUseCase.swift */, - 871616A32C3A607700C4EF25 /* GetSyncLogUseCase.swift */, ); path = Dailys; sourceTree = ""; @@ -1186,6 +1182,23 @@ path = Notification; sourceTree = ""; }; + 874A9DF52C68F279006D2E19 /* RecordTimes */ = { + isa = PBXGroup; + children = ( + 871616A12C3A606C00C4EF25 /* GetRecordTimeUseCase.swift */, + 8716169F2C3A605600C4EF25 /* PostRecordTimeUseCase.swift */, + ); + path = RecordTimes; + sourceTree = ""; + }; + 874A9DF62C68F295006D2E19 /* SyncLog */ = { + isa = PBXGroup; + children = ( + 871616A32C3A607700C4EF25 /* GetSyncLogUseCase.swift */, + ); + path = SyncLog; + sourceTree = ""; + }; 874F9C342ABFFDE900675A86 /* LoginSelect */ = { isa = PBXGroup; children = ( @@ -1244,13 +1257,6 @@ path = Entity; sourceTree = ""; }; - 875FAE2D2B1C7058008F19D2 /* Interface */ = { - isa = PBXGroup; - children = ( - ); - path = Interface; - sourceTree = ""; - }; 875FAE322B1C7173008F19D2 /* Present */ = { isa = PBXGroup; children = ( @@ -1690,7 +1696,6 @@ children = ( 87D4DCBD2BA51EEA00BB5AAB /* ResetPasswordVC.swift */, 87D4DCBF2BA5253600BB5AAB /* ResetPasswordEnvironment.swift */, - 87CBC7DD2BDCDF0400DADB72 /* ResetPasswordRoute.swift */, 87D4DCC32BA52CBF00BB5AAB /* Nickname */, 87D4DCD02BA5A4A300BB5AAB /* Email */, 87D4DCD72BA5C15C00BB5AAB /* Password */, @@ -1756,7 +1761,7 @@ 87D4DCD72BA5C15C00BB5AAB /* Password */ = { isa = PBXGroup; children = ( - 87D4DCDC2BA5C1E800BB5AAB /* ResetPasswordRoute.swift */, + 87CBC7DD2BDCDF0400DADB72 /* ResetPasswordRoute.swift */, 87D4DCD82BA5C17900BB5AAB /* ResetPasswordView.swift */, 87D4DCDA2BA5C19C00BB5AAB /* ResetPasswordModel.swift */, ); @@ -1955,7 +1960,6 @@ children = ( 875FAE262B1C678E008F19D2 /* Entity */, 87F778E02B196EDF00909511 /* UseCase */, - 875FAE2D2B1C7058008F19D2 /* Interface */, 872210502C3003EB003B97AD /* lagacy */, ); path = Domain; @@ -1968,6 +1972,8 @@ 872210532C300922003B97AD /* Firebase */, 877BDCDF2C390BAE00A50231 /* Auth */, 871616922C3A146400C4EF25 /* Dailys */, + 874A9DF52C68F279006D2E19 /* RecordTimes */, + 874A9DF62C68F295006D2E19 /* SyncLog */, ); path = UseCase; sourceTree = ""; diff --git a/Project_Timer/Domain/UseCase/Dailys/GetDailysUseCase.swift b/Project_Timer/Domain/UseCase/Dailys/GetDailysUseCase.swift index 0f925c00..6a5228a2 100644 --- a/Project_Timer/Domain/UseCase/Dailys/GetDailysUseCase.swift +++ b/Project_Timer/Domain/UseCase/Dailys/GetDailysUseCase.swift @@ -10,7 +10,7 @@ import Foundation import Combine final class GetDailysUseCase { - let repository: DailysRepository + let repository: DailysRepository // TODO: 프로토콜로 수정 init(repository: DailysRepository) { self.repository = repository diff --git a/Project_Timer/Domain/UseCase/Dailys/PostDailysUseCase.swift b/Project_Timer/Domain/UseCase/Dailys/PostDailysUseCase.swift index 58f6d365..0ebe05d1 100644 --- a/Project_Timer/Domain/UseCase/Dailys/PostDailysUseCase.swift +++ b/Project_Timer/Domain/UseCase/Dailys/PostDailysUseCase.swift @@ -10,7 +10,7 @@ import Foundation import Combine final class PostDailysUseCase { - private let repository: DailysRepository + private let repository: DailysRepository // TODO: 프로토콜로 수정 init(repository: DailysRepository) { self.repository = repository diff --git a/Project_Timer/Domain/UseCase/Dailys/GetRecordTimeUseCase.swift b/Project_Timer/Domain/UseCase/RecordTimes/GetRecordTimeUseCase.swift similarity index 83% rename from Project_Timer/Domain/UseCase/Dailys/GetRecordTimeUseCase.swift rename to Project_Timer/Domain/UseCase/RecordTimes/GetRecordTimeUseCase.swift index b4d3e014..39a6d269 100644 --- a/Project_Timer/Domain/UseCase/Dailys/GetRecordTimeUseCase.swift +++ b/Project_Timer/Domain/UseCase/RecordTimes/GetRecordTimeUseCase.swift @@ -10,7 +10,7 @@ import Foundation import Combine final class GetRecordTimeUseCase { - private let repository: RecordTimesRepository + private let repository: RecordTimesRepository // TODO: 프로토콜로 수정 init(repository: RecordTimesRepository) { self.repository = repository diff --git a/Project_Timer/Domain/UseCase/Dailys/PostRecordTimeUseCase.swift b/Project_Timer/Domain/UseCase/RecordTimes/PostRecordTimeUseCase.swift similarity index 84% rename from Project_Timer/Domain/UseCase/Dailys/PostRecordTimeUseCase.swift rename to Project_Timer/Domain/UseCase/RecordTimes/PostRecordTimeUseCase.swift index 1c792365..bb0ac2e8 100644 --- a/Project_Timer/Domain/UseCase/Dailys/PostRecordTimeUseCase.swift +++ b/Project_Timer/Domain/UseCase/RecordTimes/PostRecordTimeUseCase.swift @@ -10,7 +10,7 @@ import Foundation import Combine final class PostRecordTimeUseCase { - private let repository: RecordTimesRepository + private let repository: RecordTimesRepository // TODO: 프로토콜로 수정 init(repository: RecordTimesRepository) { self.repository = repository diff --git a/Project_Timer/Domain/UseCase/Dailys/GetSyncLogUseCase.swift b/Project_Timer/Domain/UseCase/SyncLog/GetSyncLogUseCase.swift similarity index 84% rename from Project_Timer/Domain/UseCase/Dailys/GetSyncLogUseCase.swift rename to Project_Timer/Domain/UseCase/SyncLog/GetSyncLogUseCase.swift index 5c5a650e..7702ecf7 100644 --- a/Project_Timer/Domain/UseCase/Dailys/GetSyncLogUseCase.swift +++ b/Project_Timer/Domain/UseCase/SyncLog/GetSyncLogUseCase.swift @@ -10,7 +10,7 @@ import Foundation import Combine final class GetSyncLogUseCase { - private let repository: SyncLogRepository + private let repository: SyncLogRepository // TODO: 프로토콜로 수정 init(repository: SyncLogRepository) { self.repository = repository diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/ResetPasswordRoute.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Password/ResetPasswordRoute.swift similarity index 100% rename from Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/ResetPasswordRoute.swift rename to Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Password/ResetPasswordRoute.swift diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVC.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVC.swift index e0d72f34..19052f52 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVC.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVC.swift @@ -121,21 +121,26 @@ extension SyncDailysVC { extension SyncDailysVC { private func configureViewModel() { - let recordTimesUseCase = RecordTimesUseCase(repository: RecordTimesRepository_lagacy()) - let syncLogUseCase = SyncLogUseCase(repository: SyncLogRepository_lagacy()) let targetDailys = self.syncDeviceStatusView.configureDailys() // TODO: DI 수정 let api = TTProvider(session: Session(interceptor: NetworkInterceptor.shared)) - let repository = DailysRepository(api: api) - let getDailysUseCase = GetDailysUseCase(repository: repository) - let postDailysUseCase = PostDailysUseCase(repository: repository) + let dailyRepository = DailysRepository(api: api) + let recordTimeRepository = RecordTimesRepository(api: api) + let syncLogRepository = SyncLogRepository(api: api) + let getDailysUseCase = GetDailysUseCase(repository: dailyRepository) + let postDailysUseCase = PostDailysUseCase(repository: dailyRepository) + let getRecordTimeUseCase = GetRecordTimeUseCase(repository: recordTimeRepository) + let postRecordTimeUseCase = PostRecordTimeUseCase(repository: recordTimeRepository) + let getSyncLogUseCase = GetSyncLogUseCase(repository: syncLogRepository) self.viewModel = SyncDailysVM( - recordTimesUseCase: recordTimesUseCase, - syncLogUseCase: syncLogUseCase, getDailysUseCase: getDailysUseCase, postDailysUseCase: postDailysUseCase, - targetDailys: targetDailys) + getRecordTimeUseCase: getRecordTimeUseCase, + postRecordTimeUseCase: postRecordTimeUseCase, + getSyncLogUseCase: getSyncLogUseCase, + targetDailys: targetDailys + ) } } diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVM.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVM.swift index e6b30564..003c1165 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVM.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVM.swift @@ -10,10 +10,11 @@ import Foundation import Combine final class SyncDailysVM { - private let recordTimesUseCase: RecordTimesUseCaseInterface - private let syncLogUseCase: SyncLogUseCaseInterface private let getDailysUseCase: GetDailysUseCase private let postDailysUseCase: PostDailysUseCase + private let getRecordTimeUseCase: GetRecordTimeUseCase + private let postRecordTimeUseCase: PostRecordTimeUseCase + private let getSyncLogUseCase: GetSyncLogUseCase private var targetDailys: [Daily] @Published private(set) var syncLog: SyncLog? @Published private(set) var alert: (title: String, text: String)? @@ -23,16 +24,18 @@ final class SyncDailysVM { // Combine binding private var cancellables = Set() - init(recordTimesUseCase: RecordTimesUseCaseInterface, - syncLogUseCase: SyncLogUseCaseInterface, - getDailysUseCase: GetDailysUseCase, + init(getDailysUseCase: GetDailysUseCase, postDailysUseCase: PostDailysUseCase, + getRecordTimeUseCase: GetRecordTimeUseCase, + postRecordTimeUseCase: PostRecordTimeUseCase, + getSyncLogUseCase: GetSyncLogUseCase, targetDailys: [Daily]) { - self.recordTimesUseCase = recordTimesUseCase - self.syncLogUseCase = syncLogUseCase self.getDailysUseCase = getDailysUseCase self.postDailysUseCase = postDailysUseCase self.targetDailys = targetDailys + self.getRecordTimeUseCase = getRecordTimeUseCase + self.postRecordTimeUseCase = postRecordTimeUseCase + self.getSyncLogUseCase = getSyncLogUseCase self.checkServerURL() } @@ -83,6 +86,7 @@ extension SyncDailysVM { .sink { [weak self] completion in if case .failure(let networkError) = completion { print("ERROR", #function, networkError) + self?.loading = false switch networkError { case .CLIENTERROR(let message): if let message = message { @@ -104,23 +108,26 @@ extension SyncDailysVM { let recordTimes = RecordsManager.shared.recordTimes self.loadingText = .uploadRecordTime self.loading = true - self.recordTimesUseCase.uploadRecordTimes(recordTimes: recordTimes) { [weak self] result in - self?.loading = false - switch result { - case .success(_): - self?.getSyncLog(afterUploaded: true) - case .failure(let error): - switch error { - case .CLIENTERROR(let message): - if let message = message { - print("[upload Recordtime ERROR] \(message)") + self.postRecordTimeUseCase.execute(request: recordTimes) + .sink { [weak self] completion in + if case .failure(let networkError) = completion { + print("ERROR", #function, networkError) + self?.loading = false + switch networkError { + case .CLIENTERROR(let message): + if let message = message { + print("[upload Recordtime ERROR] \(message)") + } + self?.alert = (title: Localized.string(.Server_Error_UploadError), text: Localized.string(.Server_Error_DecodeError)) + default: + self?.alert = networkError.alertMessage } - self?.alert = (title: Localized.string(.Server_Error_UploadError), text: Localized.string(.Server_Error_DecodeError)) - default: - self?.alert = error.alertMessage } + } receiveValue: { [weak self] _ in + self?.loading = false + self?.getSyncLog(afterUploaded: true) } - } + .store(in: &self.cancellables) } } @@ -157,52 +164,58 @@ extension SyncDailysVM { private func getRecordtime() { self.loadingText = .getRecordTime self.loading = true - self.recordTimesUseCase.getRecordTimes { [weak self] result in - switch result { - case .success(let recordTimes): + self.getRecordTimeUseCase.execute() + .sink { [weak self] completion in + if case .failure(let networkError) = completion { + print("ERROR", #function, networkError) + self?.loading = false + switch networkError { + case .CLIENTERROR(let message): + if let message = message { + print("[get RecordTimes ERROR] \(message)") + } + self?.alert = (title: Localized.string(.Server_Error_DownloadError), text: Localized.string(.Server_Error_DecodeError)) + default: + self?.alert = networkError.alertMessage + } + } + } receiveValue: { [weak self] recordTimes in self?.saveRecordTimes(recordTimes) self?.loading = false self?.getSyncLog(afterUploaded: true) - case .failure(let error): - switch error { - case .CLIENTERROR(let message): - if let message = message { - print("[get RecordTimes ERROR] \(message)") - } - self?.alert = (title: Localized.string(.Server_Error_DownloadError), text: Localized.string(.Server_Error_DecodeError)) - default: - self?.alert = error.alertMessage - } } - } + .store(in: &self.cancellables) } /// sync 로직 후 getSyncLog, 또는 화면진입시 진행 private func getSyncLog(afterUploaded: Bool) { self.loadingText = .getSyncLog self.loading = true - self.syncLogUseCase.getSyncLog { [weak self] result in - self?.loading = false - switch result { - case .success(let syncLog): - if let syncLog = syncLog, afterUploaded { + self.getSyncLogUseCase.execute() + .sink { [weak self] completion in + if case .failure(let networkError) = completion { + print("ERROR", #function, networkError) + self?.loading = false + switch networkError { + case .CLIENTERROR(let message): + if let message = message { + print("[get SyncLog ERROR] \(message)") + } + self?.alert = (title: Localized.string(.Server_Error_DownloadError), text: Localized.string(.Server_Error_DecodeError)) + default: + self?.alert = networkError.alertMessage + } + } + } receiveValue: { [weak self] syncLog in + self?.loading = false + if afterUploaded { self?.saveLastUploadedDate(to: syncLog.updatedAt) self?.targetDailys = [] self?.saveDailysSuccess = true } self?.syncLog = syncLog - case .failure(let error): - switch error { - case .CLIENTERROR(let message): - if let message = message { - print("[get SyncLog ERROR] \(message)") - } - self?.alert = (title: Localized.string(.Server_Error_DownloadError), text: Localized.string(.Server_Error_DecodeError)) - default: - self?.alert = error.alertMessage - } } - } + .store(in: &self.cancellables) } } From 7a357a2aca437e7e3c6c331f6873bbc63d99702c Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sun, 11 Aug 2024 22:58:44 +0900 Subject: [PATCH 40/44] =?UTF-8?q?feat=20#144:=20Network=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=A0=9C=EA=B1=B0,=20=EB=A6=AC=ED=8E=99?= =?UTF-8?q?=ED=86=A0=EB=A7=81=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer.xcodeproj/project.pbxproj | 68 --------------- Project_Timer/Data/NetworkError.swift | 11 --- Project_Timer/Data/NetworkURL.swift | 2 - Project_Timer/Data/lagacy/AuthNetwork.swift | 65 -------------- Project_Timer/Data/lagacy/Network.swift | 86 ------------------- Project_Timer/Data/lagacy/NetworkResult.swift | 29 ------- .../Data/lagacy/RecordTimesNetwork.swift | 29 ------- .../lagacy/RecordTimesRepository_lagacy.swift | 42 --------- .../Data/lagacy/SyncLogNetwork.swift | 23 ----- .../lagacy/SyncLogRepository_lagacy.swift | 34 -------- .../RecordTimesRepositoryInterface.swift | 14 --- .../Domain/lagacy/RecordTimesUseCase.swift | 29 ------- .../lagacy/SyncLogRepositoryInterface.swift | 13 --- .../Domain/lagacy/SyncLogUseCase.swift | 23 ----- .../RecordTimesUseCaseInterface.swift | 15 ---- .../Interface/SyncLogUseCaseInterface.swift | 14 --- 16 files changed, 497 deletions(-) delete mode 100644 Project_Timer/Data/lagacy/AuthNetwork.swift delete mode 100644 Project_Timer/Data/lagacy/Network.swift delete mode 100644 Project_Timer/Data/lagacy/NetworkResult.swift delete mode 100644 Project_Timer/Data/lagacy/RecordTimesNetwork.swift delete mode 100644 Project_Timer/Data/lagacy/RecordTimesRepository_lagacy.swift delete mode 100644 Project_Timer/Data/lagacy/SyncLogNetwork.swift delete mode 100644 Project_Timer/Data/lagacy/SyncLogRepository_lagacy.swift delete mode 100644 Project_Timer/Domain/lagacy/RecordTimesRepositoryInterface.swift delete mode 100644 Project_Timer/Domain/lagacy/RecordTimesUseCase.swift delete mode 100644 Project_Timer/Domain/lagacy/SyncLogRepositoryInterface.swift delete mode 100644 Project_Timer/Domain/lagacy/SyncLogUseCase.swift delete mode 100644 Project_Timer/Present/Interface/RecordTimesUseCaseInterface.swift delete mode 100644 Project_Timer/Present/Interface/SyncLogUseCaseInterface.swift diff --git a/Project_Timer.xcodeproj/project.pbxproj b/Project_Timer.xcodeproj/project.pbxproj index 69731ba8..92ab436d 100644 --- a/Project_Timer.xcodeproj/project.pbxproj +++ b/Project_Timer.xcodeproj/project.pbxproj @@ -47,23 +47,12 @@ 8706C3302AEF881500F7C842 /* TTSignupTextFieldWarning.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8706C32F2AEF881500F7C842 /* TTSignupTextFieldWarning.swift */; }; 8706C3322AEF8A0300F7C842 /* TTSignupNextButtonForMac.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8706C3312AEF8A0300F7C842 /* TTSignupNextButtonForMac.swift */; }; 870800522B2C3A0800830B39 /* ServerURLResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800512B2C3A0800830B39 /* ServerURLResponse.swift */; }; - 8708005C2B2C4D2D00830B39 /* AuthNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708005B2B2C4D2D00830B39 /* AuthNetwork.swift */; }; 8708005F2B2C5F5F00830B39 /* AuthResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708005E2B2C5F5F00830B39 /* AuthResponse.swift */; }; 870800632B2C604100830B39 /* AuthInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800622B2C604100830B39 /* AuthInfo.swift */; }; 8708006F2B2CA92C00830B39 /* DailyResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708006E2B2CA92C00830B39 /* DailyResponse.swift */; }; 870800712B2CAD9900830B39 /* TaskHistory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800702B2CAD9900830B39 /* TaskHistory.swift */; }; - 870800792B2D4DE500830B39 /* RecordTimesNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800782B2D4DE500830B39 /* RecordTimesNetwork.swift */; }; - 8708007B2B2D4F0800830B39 /* RecordTimesRepository_lagacy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708007A2B2D4F0800830B39 /* RecordTimesRepository_lagacy.swift */; }; - 8708007D2B2D503600830B39 /* RecordTimesRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708007C2B2D503600830B39 /* RecordTimesRepositoryInterface.swift */; }; - 8708007F2B2D543500830B39 /* RecordTimesUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708007E2B2D543500830B39 /* RecordTimesUseCase.swift */; }; - 870800812B2D54B500830B39 /* RecordTimesUseCaseInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800802B2D54B500830B39 /* RecordTimesUseCaseInterface.swift */; }; 870800832B2D551700830B39 /* RecordTimesResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800822B2D551700830B39 /* RecordTimesResponse.swift */; }; - 870800852B2D593400830B39 /* SyncLogNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800842B2D593400830B39 /* SyncLogNetwork.swift */; }; - 870800872B2D599800830B39 /* SyncLogRepository_lagacy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800862B2D599800830B39 /* SyncLogRepository_lagacy.swift */; }; 870800892B2D59EB00830B39 /* SyncLogResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870800882B2D59EB00830B39 /* SyncLogResponse.swift */; }; - 8708008B2B2D5A4400830B39 /* SyncLogRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708008A2B2D5A4400830B39 /* SyncLogRepositoryInterface.swift */; }; - 8708008D2B2D63D300830B39 /* SyncLogUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708008C2B2D63D300830B39 /* SyncLogUseCase.swift */; }; - 8708008F2B2D646C00830B39 /* SyncLogUseCaseInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8708008E2B2D646C00830B39 /* SyncLogUseCaseInterface.swift */; }; 870C70712AD4ECB700024CAC /* SigninRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870C70702AD4ECB700024CAC /* SigninRoute.swift */; }; 870C70732AD51BEB00024CAC /* PredicateChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870C70722AD51BEB00024CAC /* PredicateChecker.swift */; }; 870E11752A0E226D00CFA77C /* CalendarWidgetData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870E11742A0E226D00CFA77C /* CalendarWidgetData.swift */; }; @@ -82,7 +71,6 @@ 871616A42C3A607700C4EF25 /* GetSyncLogUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 871616A32C3A607700C4EF25 /* GetSyncLogUseCase.swift */; }; 871616A62C3A91F900C4EF25 /* GetNotificationUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 871616A52C3A91F900C4EF25 /* GetNotificationUseCase.swift */; }; 87163DC82ACAF2E8008D4072 /* NetworkError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87163DC72ACAF2E8008D4072 /* NetworkError.swift */; }; - 87163DCA2ACAF89B008D4072 /* NetworkResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87163DC92ACAF89B008D4072 /* NetworkResult.swift */; }; 87168D99299A819F003ED502 /* UserDefaults+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875C98C82871BFCF008F7ADD /* UserDefaults+Extension.swift */; }; 87199F442882BC430017D01A /* StandardDailyGraphView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87199F432882BC430017D01A /* StandardDailyGraphView.swift */; }; 87199F462883018C0017D01A /* TimelineDailyGraphView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87199F452883018C0017D01A /* TimelineDailyGraphView.swift */; }; @@ -272,7 +260,6 @@ 87906C812B9BF759000EC960 /* MiSans-Semibold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 87906C802B9BF759000EC960 /* MiSans-Semibold.ttf */; }; 8791081F28387537005D7B10 /* NetworkURL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8791081E28387537005D7B10 /* NetworkURL.swift */; }; 87910828283876DD005D7B10 /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = 87910827283876DD005D7B10 /* Alamofire */; }; - 8791082A283877A4005D7B10 /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87910829283877A4005D7B10 /* Network.swift */; }; 8791082F28387D1F005D7B10 /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8791082E28387D1F005D7B10 /* String+Extension.swift */; }; 8791C1F227DCD050000D6BA9 /* Notification+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8791C1F127DCD050000D6BA9 /* Notification+Extension.swift */; }; 8791C1F427DCD120000D6BA9 /* UserDefaultsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8791C1F327DCD120000D6BA9 /* UserDefaultsManager.swift */; }; @@ -483,23 +470,12 @@ 8706C32F2AEF881500F7C842 /* TTSignupTextFieldWarning.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TTSignupTextFieldWarning.swift; sourceTree = ""; }; 8706C3312AEF8A0300F7C842 /* TTSignupNextButtonForMac.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TTSignupNextButtonForMac.swift; sourceTree = ""; }; 870800512B2C3A0800830B39 /* ServerURLResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerURLResponse.swift; sourceTree = ""; }; - 8708005B2B2C4D2D00830B39 /* AuthNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthNetwork.swift; sourceTree = ""; }; 8708005E2B2C5F5F00830B39 /* AuthResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthResponse.swift; sourceTree = ""; }; 870800622B2C604100830B39 /* AuthInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthInfo.swift; sourceTree = ""; }; 8708006E2B2CA92C00830B39 /* DailyResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailyResponse.swift; sourceTree = ""; }; 870800702B2CAD9900830B39 /* TaskHistory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskHistory.swift; sourceTree = ""; }; - 870800782B2D4DE500830B39 /* RecordTimesNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesNetwork.swift; sourceTree = ""; }; - 8708007A2B2D4F0800830B39 /* RecordTimesRepository_lagacy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesRepository_lagacy.swift; sourceTree = ""; }; - 8708007C2B2D503600830B39 /* RecordTimesRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesRepositoryInterface.swift; sourceTree = ""; }; - 8708007E2B2D543500830B39 /* RecordTimesUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesUseCase.swift; sourceTree = ""; }; - 870800802B2D54B500830B39 /* RecordTimesUseCaseInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesUseCaseInterface.swift; sourceTree = ""; }; 870800822B2D551700830B39 /* RecordTimesResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTimesResponse.swift; sourceTree = ""; }; - 870800842B2D593400830B39 /* SyncLogNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncLogNetwork.swift; sourceTree = ""; }; - 870800862B2D599800830B39 /* SyncLogRepository_lagacy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncLogRepository_lagacy.swift; sourceTree = ""; }; 870800882B2D59EB00830B39 /* SyncLogResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncLogResponse.swift; sourceTree = ""; }; - 8708008A2B2D5A4400830B39 /* SyncLogRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncLogRepositoryInterface.swift; sourceTree = ""; }; - 8708008C2B2D63D300830B39 /* SyncLogUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncLogUseCase.swift; sourceTree = ""; }; - 8708008E2B2D646C00830B39 /* SyncLogUseCaseInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncLogUseCaseInterface.swift; sourceTree = ""; }; 870C70702AD4ECB700024CAC /* SigninRoute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SigninRoute.swift; sourceTree = ""; }; 870C70722AD51BEB00024CAC /* PredicateChecker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PredicateChecker.swift; sourceTree = ""; }; 870E11742A0E226D00CFA77C /* CalendarWidgetData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarWidgetData.swift; sourceTree = ""; }; @@ -516,7 +492,6 @@ 871616A32C3A607700C4EF25 /* GetSyncLogUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetSyncLogUseCase.swift; sourceTree = ""; }; 871616A52C3A91F900C4EF25 /* GetNotificationUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetNotificationUseCase.swift; sourceTree = ""; }; 87163DC72ACAF2E8008D4072 /* NetworkError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkError.swift; sourceTree = ""; }; - 87163DC92ACAF89B008D4072 /* NetworkResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkResult.swift; sourceTree = ""; }; 87199F432882BC430017D01A /* StandardDailyGraphView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StandardDailyGraphView.swift; sourceTree = ""; }; 87199F452883018C0017D01A /* TimelineDailyGraphView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineDailyGraphView.swift; sourceTree = ""; }; 87199F47288303B60017D01A /* TasksProgressDailyGraphView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TasksProgressDailyGraphView.swift; sourceTree = ""; }; @@ -691,7 +666,6 @@ 87906C7E2B9BF749000EC960 /* MiSans-Normal.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "MiSans-Normal.ttf"; sourceTree = ""; }; 87906C802B9BF759000EC960 /* MiSans-Semibold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "MiSans-Semibold.ttf"; sourceTree = ""; }; 8791081E28387537005D7B10 /* NetworkURL.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkURL.swift; sourceTree = ""; }; - 87910829283877A4005D7B10 /* Network.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Network.swift; sourceTree = ""; }; 8791082E28387D1F005D7B10 /* String+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Extension.swift"; sourceTree = ""; }; 8791C1F127DCD050000D6BA9 /* Notification+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Notification+Extension.swift"; sourceTree = ""; }; 8791C1F327DCD120000D6BA9 /* UserDefaultsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaultsManager.swift; sourceTree = ""; }; @@ -1016,31 +990,6 @@ path = ViewModel; sourceTree = ""; }; - 872210452C2FF575003B97AD /* lagacy */ = { - isa = PBXGroup; - children = ( - 87163DC92ACAF89B008D4072 /* NetworkResult.swift */, - 87910829283877A4005D7B10 /* Network.swift */, - 8708005B2B2C4D2D00830B39 /* AuthNetwork.swift */, - 870800782B2D4DE500830B39 /* RecordTimesNetwork.swift */, - 870800842B2D593400830B39 /* SyncLogNetwork.swift */, - 8708007A2B2D4F0800830B39 /* RecordTimesRepository_lagacy.swift */, - 870800862B2D599800830B39 /* SyncLogRepository_lagacy.swift */, - ); - path = lagacy; - sourceTree = ""; - }; - 872210502C3003EB003B97AD /* lagacy */ = { - isa = PBXGroup; - children = ( - 8708007C2B2D503600830B39 /* RecordTimesRepositoryInterface.swift */, - 8708008A2B2D5A4400830B39 /* SyncLogRepositoryInterface.swift */, - 8708007E2B2D543500830B39 /* RecordTimesUseCase.swift */, - 8708008C2B2D63D300830B39 /* SyncLogUseCase.swift */, - ); - path = lagacy; - sourceTree = ""; - }; 872210532C300922003B97AD /* Firebase */ = { isa = PBXGroup; children = ( @@ -1278,8 +1227,6 @@ 875FAE332B1C717E008F19D2 /* Interface */ = { isa = PBXGroup; children = ( - 870800802B2D54B500830B39 /* RecordTimesUseCaseInterface.swift */, - 8708008E2B2D646C00830B39 /* SyncLogUseCaseInterface.swift */, 87FB8D1C2B3C5F4D00EA5693 /* NotificationUseCaseInterface.swift */, ); path = Interface; @@ -1950,7 +1897,6 @@ 87F778E12B196F7400909511 /* Repository */, 87D4DCCA2BA5476900BB5AAB /* Request */, 87D4DCCD2BA548E300BB5AAB /* Response */, - 872210452C2FF575003B97AD /* lagacy */, ); path = Data; sourceTree = ""; @@ -1960,7 +1906,6 @@ children = ( 875FAE262B1C678E008F19D2 /* Entity */, 87F778E02B196EDF00909511 /* UseCase */, - 872210502C3003EB003B97AD /* lagacy */, ); path = Domain; sourceTree = ""; @@ -2282,7 +2227,6 @@ 875A5F792A207BA600679A72 /* NavigationBarInformationButton.swift in Sources */, 879D20772A19101C00D8A420 /* BottomSheetViewController.swift in Sources */, 048D8AD028AABC9E00A2456D /* AddNewTaskHistoryCell.swift in Sources */, - 870800792B2D4DE500830B39 /* RecordTimesNetwork.swift in Sources */, 043706312869FB0E00A5D3AA /* StopwatchTimeLabelView.swift in Sources */, 8722104B2C2FF6E7003B97AD /* UpdateHistoryInfo.swift in Sources */, 04E0DFCB28A926C1004DABBE /* TaskInteractionView.swift in Sources */, @@ -2296,13 +2240,10 @@ 878BF7ED2955E5430044C079 /* SyncDailysVM.swift in Sources */, 870C70732AD51BEB00024CAC /* PredicateChecker.swift in Sources */, 879BE3242AC42758007AAC46 /* TiTiImage.swift in Sources */, - 8708008D2B2D63D300830B39 /* SyncLogUseCase.swift in Sources */, 87EA022F2B9BF927003439F2 /* UIViewControllerPreview.swift in Sources */, 87EA02312B9BF941003439F2 /* UIViewPreview.swift in Sources */, 87B90B3A2BF4AEF600D6886E /* FirebaseRepository.swift in Sources */, 873C197A28D04B5B00E02ADC /* DayOfWeekText.swift in Sources */, - 870800852B2D593400830B39 /* SyncLogNetwork.swift in Sources */, - 87163DCA2ACAF89B008D4072 /* NetworkResult.swift in Sources */, 874F9C2B2ABFF51700675A86 /* SigninSelectView.swift in Sources */, 871C1A0328519CC200BDAE02 /* SettingDevInfoCell.swift in Sources */, 87ED9ABF28D16FC200186677 /* TasksCircularProgressDTO.swift in Sources */, @@ -2393,14 +2334,12 @@ 8765234828C76FFE00487BFB /* WeekSmallVM.swift in Sources */, 87A48BC927DF026800F46D0F /* Int+Extension.swift in Sources */, 872C0EDE284AE52800E8E3F2 /* SettingFunctionsListVC.swift in Sources */, - 8708007D2B2D503600830B39 /* RecordTimesRepositoryInterface.swift in Sources */, 87D1250128771AAD00018658 /* Language.swift in Sources */, 87CAC06228B8711D0036CF24 /* FirebaseEvent.swift in Sources */, 879D20792A19B3D300D8A420 /* ThemeColorSelectorView.swift in Sources */, 871AB69B2967C9C500AFED1C /* TimeTableView.swift in Sources */, 87E5C70F2AE0C0E500BE46B0 /* TTSignupTextFieldView.swift in Sources */, 87AEF671289D23400018FCC8 /* UITabBarController+Extension.swift in Sources */, - 8791082A283877A4005D7B10 /* Network.swift in Sources */, 87199F5C28840E970017D01A /* TasksCircularProgressView.swift in Sources */, 87DC6A4B28D010A400455A06 /* WeekTime.swift in Sources */, 87BE88E72AD425BE0010A84A /* SigninTextFieldView.swift in Sources */, @@ -2410,13 +2349,11 @@ 87A8CD272AF0C4B600D4C1D7 /* OverlayShowButtonForSecureFieldView.swift in Sources */, 870E85012AD67E46000511BD /* KeyboardResponder.swift in Sources */, 877BDCE92C390CA800A50231 /* UpdatePasswordUseCase.swift in Sources */, - 870800872B2D599800830B39 /* SyncLogRepository_lagacy.swift in Sources */, 87A48BCB27DF112B00F46D0F /* LogHomeVM.swift in Sources */, 87D7ED172952B69200121DE6 /* TestUserSigninRequest.swift in Sources */, 87D4DCC02BA5253600BB5AAB /* ResetPasswordEnvironment.swift in Sources */, 8706C3322AEF8A0300F7C842 /* TTSignupNextButtonForMac.swift in Sources */, 87306D532B260969001B7C14 /* TLRen.swift in Sources */, - 8708008F2B2D646C00830B39 /* SyncLogUseCaseInterface.swift in Sources */, 87199F5E28842F0E0017D01A /* CheckGraphButton.swift in Sources */, 87F10930284C4337002E31EA /* TiTiLabHeaderView.swift in Sources */, 879D20812A19E44B00D8A420 /* TargetTimeView.swift in Sources */, @@ -2500,11 +2437,9 @@ 87306D572B260AB8001B7C14 /* TLRkey.swift in Sources */, 043706332869FB9F00A5D3AA /* StopwatchTimeLabelVM.swift in Sources */, 87BEBEEF281CD7EC0095CD29 /* UIViewController+Extension.swift in Sources */, - 8708005C2B2C4D2D00830B39 /* AuthNetwork.swift in Sources */, 87D4C95A28950B4E008ECAA4 /* WeekDailysData.swift in Sources */, 87199F462883018C0017D01A /* TimelineDailyGraphView.swift in Sources */, 87476DAD28A2794B00FAD273 /* LastestVersionInfo.swift in Sources */, - 870800812B2D54B500830B39 /* RecordTimesUseCaseInterface.swift in Sources */, 87459706263FF0D700172C0F /* Daily.swift in Sources */, 87FB8D1B2B3C5DF400EA5693 /* NotificationUseCase.swift in Sources */, 8757AA3D290511FF00D97517 /* Task.swift in Sources */, @@ -2534,7 +2469,6 @@ 872210422C2FEE83003B97AD /* SyncLogRepository.swift in Sources */, 87D4DCD22BA5A4C400BB5AAB /* ResetPasswordEmailView.swift in Sources */, 878813E52A209BA0000ED2C1 /* HowToAddWidgetVC.swift in Sources */, - 8708007B2B2D4F0800830B39 /* RecordTimesRepository_lagacy.swift in Sources */, 8722105D2C300A8C003B97AD /* GetSurveysUseCase.swift in Sources */, 8765234C28C7948700487BFB /* TotalTime.swift in Sources */, 87A7F5D4267270F800F69EBA /* Todo.swift in Sources */, @@ -2551,7 +2485,6 @@ 87FB6B8D2BFE0B3F00CD7A9C /* AuthRepository.swift in Sources */, 87D4DCC22BA5298B00BB5AAB /* ResetPasswordNicknameView.swift in Sources */, 87C2F97B28A6BFC700F44D98 /* ModifyRecordVC.swift in Sources */, - 8708008B2B2D5A4400830B39 /* SyncLogRepositoryInterface.swift in Sources */, 87D4DCCC2BA5477400BB5AAB /* UpdatePasswordRequest.swift in Sources */, 879A2BA8284746A500B69DA7 /* SettingFooterView.swift in Sources */, 04E0DFC328A9031A004DABBE /* ModifyRecordVM.swift in Sources */, @@ -2599,7 +2532,6 @@ 87D4DCDB2BA5C19C00BB5AAB /* ResetPasswordModel.swift in Sources */, 87DE1177268AC9AD0012F043 /* DailyManager.swift in Sources */, 877BDCE72C390C9300A50231 /* CheckEmailExitUseCase.swift in Sources */, - 8708007F2B2D543500830B39 /* RecordTimesUseCase.swift in Sources */, 8708005F2B2C5F5F00830B39 /* AuthResponse.swift in Sources */, 8721C6D72969123E00410D57 /* IOUsecase.swift in Sources */, 872210552C30094F003B97AD /* GetServerURLUseCase.swift in Sources */, diff --git a/Project_Timer/Data/NetworkError.swift b/Project_Timer/Data/NetworkError.swift index 58474f31..c56812b5 100644 --- a/Project_Timer/Data/NetworkError.swift +++ b/Project_Timer/Data/NetworkError.swift @@ -21,17 +21,6 @@ enum NetworkError: Error { case SERVERERROR(String?) // 500 case ERRORRESPONSE(TTErrorResponse) // TiTi ErrorResponse - static func error(_ result: NetworkResult) -> NetworkError { - switch result.status { - case .TIMEOUT: - return .TIMEOUT - case .SERVER(let statusCode): - return serverError(statusCode: statusCode, data: result.data) - default: - return .FAIL - } - } - static func serverError(statusCode: Int, data: Data? = nil) -> NetworkError { // MARK: Decoding 로직 필요 let errorMessage: String? = "" diff --git a/Project_Timer/Data/NetworkURL.swift b/Project_Timer/Data/NetworkURL.swift index 8418f740..955070b3 100644 --- a/Project_Timer/Data/NetworkURL.swift +++ b/Project_Timer/Data/NetworkURL.swift @@ -55,9 +55,7 @@ final class NetworkURL { } static let appstore: String = "itms-apps://itunes.apple.com/app/id1519159240" - static let developmentList: String = "https://deeply-eggplant-5ec.notion.site/TiTi-Development-List-b089afc1a4eb4cdb8c06840ca9cb1273" static let instagramToTiTi: String = "https://www.instagram.com/study_withtiti/" - static let instagramToDeveloper: String = "https://www.instagram.com/dev_mindsang/" static let github: String = "https://github.com/TimerTiTi" enum WidgetInfo { diff --git a/Project_Timer/Data/lagacy/AuthNetwork.swift b/Project_Timer/Data/lagacy/AuthNetwork.swift deleted file mode 100644 index 176b87f7..00000000 --- a/Project_Timer/Data/lagacy/AuthNetwork.swift +++ /dev/null @@ -1,65 +0,0 @@ -// -// AuthNetwork.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/15. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation -import Moya - -final class AuthNetwork { - private let network = Network() - private var signupURL: String { - let base = NetworkURL.shared.serverURL ?? "nil" - return base + "/auth/signup" - } - private var signinURL: String { - let base = NetworkURL.shared.serverURL ?? "nil" - return base + "/auth/login" - } - private var checkUsersURL: String { - let base = NetworkURL.shared.serverURL ?? "nil" - return base + "/auth/users" - } - private var resetPasswordURL: String { - let base = NetworkURL.shared.serverURL ?? "nil" - return base + "/auth/users/password" - } - - func signup(signupInfo: TestUserSignupRequest, completion: @escaping (NetworkResult) -> Void) { - self.network.request(url: self.signupURL, method: .post, param: nil, body: signupInfo) { result in - completion(result) - } - } - - func signin(signinInfo: TestUserSigninRequest, completion: @escaping (NetworkResult) -> Void) { - self.network.request(url: self.signinURL, method: .post, param: nil, body: signinInfo) { result in - completion(result) - } - } - - func checkUsername(username: String, completion: @escaping (NetworkResult) -> Void) { - self.network.request(url: self.checkUsersURL, method: .get, param: [ - "username": username - ]) { result in - completion(result) - } - } - - func checkEmail(username: String, email: String, completion: @escaping (NetworkResult) -> Void) { - self.network.request(url: self.checkUsersURL, method: .get, param: [ - "username": username, - "email": email - ]) { result in - completion(result) - } - } - - func updatePassword(request: UpdatePasswordRequest, completion: @escaping (NetworkResult) -> Void) { - self.network.request(url: self.resetPasswordURL, method: .post, body: request) { result in - completion(result) - } - } -} diff --git a/Project_Timer/Data/lagacy/Network.swift b/Project_Timer/Data/lagacy/Network.swift deleted file mode 100644 index 04fb1ca6..00000000 --- a/Project_Timer/Data/lagacy/Network.swift +++ /dev/null @@ -1,86 +0,0 @@ -// -// Network.swift -// Project_Timer -// -// Created by Kang Minsang on 2022/05/21. -// Copyright © 2022 FDEE. All rights reserved. -// - -import Foundation -import Alamofire - -struct Network { - func request(url: String, method: HTTPMethod, param: [String: Any]? = nil, completion: @escaping (NetworkResult) -> Void) { - var url = url - if let param = param { - var components = URLComponents(string: url) - components?.queryItems = param.map({ key, value in URLQueryItem(name: key, value: "\(value)")}) - if let urlWithQuery = components?.url?.absoluteString { - url = urlWithQuery - } - } - - Session.default.request(url, method: method, interceptor: NetworkInterceptor.shared) { $0.timeoutInterval = 10 } - .validate() - .response { response in - completion(self.configureNetworkResult(response: response)) - } - .resume() - } - - func request(url: String, method: HTTPMethod, param: [String: Any]? = nil, body: T, completion: @escaping (NetworkResult) -> Void) { - var url = url - if let param = param { - var components = URLComponents(string: url) - components?.queryItems = param.map({ key, value in URLQueryItem(name: key, value: "\(value)")}) - if let urlWithQuery = components?.url?.absoluteString { - url = urlWithQuery - } - } - - Session.default.request(url, method: method, parameters: body, encoder: JSONParameterEncoder.dateFormatted, interceptor: NetworkInterceptor.shared) { $0.timeoutInterval = 10 } - .validate() - .response { response in - completion(self.configureNetworkResult(response: response)) - } - .resume() - } -} - -extension Network { - private func configureNetworkResult(response: AFDataResponse) -> NetworkResult { - guard let statusCode = response.response?.statusCode else { - print("[Network] Fail: No Status Code, \(String(describing: response.error))") - return NetworkResult(status: response.error?.isRequestRetryError == true ? .FAIL : .TIMEOUT, data: nil) - } - - let status = NetworkStatus.status(statusCode) - - guard let data = response.data else { - print("[Network] Warning(\(statusCode)): No Data") - return NetworkResult(status: status, data: nil) - } - - // server로부터 받은 data가 'null' 값인 경우 추가처리 - if String(data: data, encoding: .utf8) == "null" { - print("[Network] Warning(\(statusCode)): null") - return NetworkResult(status: status, data: nil) - } - - if Infos.isDevMode { - print("[Network] url: \(String(describing: response.request?.url))") - print("[Network] statusCode: \(statusCode)") - print("[Network] data: \(String(data: data, encoding: .utf8)!)") - } - - return NetworkResult(status: status, data: data) - } -} - -extension JSONParameterEncoder { - static var dateFormatted: JSONParameterEncoder = { - let encoder = JSONEncoder() - encoder.dateEncodingStrategy = .iso8601 - return JSONParameterEncoder(encoder: encoder) - }() -} diff --git a/Project_Timer/Data/lagacy/NetworkResult.swift b/Project_Timer/Data/lagacy/NetworkResult.swift deleted file mode 100644 index 65ba57d2..00000000 --- a/Project_Timer/Data/lagacy/NetworkResult.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// NetworkResult.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/10/02. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -struct NetworkResult { - let status: NetworkStatus - let data: Data? -} - -enum NetworkStatus { - case SUCCESS // 200~204, 304 - case FAIL // -1 - case TIMEOUT // -2 - case SERVER(Int) - - static func status(_ statusCode: Int) -> NetworkStatus { - switch statusCode { - case (200...209): return .SUCCESS - case 304: return .SUCCESS - default: return .SERVER(statusCode) - } - } -} diff --git a/Project_Timer/Data/lagacy/RecordTimesNetwork.swift b/Project_Timer/Data/lagacy/RecordTimesNetwork.swift deleted file mode 100644 index ecc452a2..00000000 --- a/Project_Timer/Data/lagacy/RecordTimesNetwork.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// RecordTimesAPI.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/16. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -final class RecordTimesNetwork { - private let network = Network() - private var url: String { - let base = NetworkURL.shared.serverURL ?? "nil" - return base + "/recordTime" - } - - func upload(recordTimes: RecordTimes, completion: @escaping (NetworkResult) -> Void) { - self.network.request(url: url, method: .post, param: nil, body: recordTimes) { result in - completion(result) - } - } - - func get(completion: @escaping (NetworkResult) -> Void) { - self.network.request(url: url, method: .get) { result in - completion(result) - } - } -} diff --git a/Project_Timer/Data/lagacy/RecordTimesRepository_lagacy.swift b/Project_Timer/Data/lagacy/RecordTimesRepository_lagacy.swift deleted file mode 100644 index cb65462a..00000000 --- a/Project_Timer/Data/lagacy/RecordTimesRepository_lagacy.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// RecordTimesRepository_lagacy.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/16. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -final class RecordTimesRepository_lagacy: RecordTimesRepositoryInterface { - private let api = RecordTimesNetwork() - - func upload(recordTimes: RecordTimes, completion: @escaping (Result) -> Void) { - api.upload(recordTimes: recordTimes) { result in - switch result.status { - case .SUCCESS: - completion(.success(true)) - default: - completion(.failure(.error(result))) - } - } - } - - func get(completion: @escaping (Result) -> Void) { - api.get { result in - switch result.status { - case .SUCCESS: - guard let data = result.data, - let dto = try? JSONDecoder.dateFormatted.decode(RecordTimesResponse.self, from: data) else { - completion(.failure(.DECODEERROR)) - return - } - - let info = dto.toDomain() - completion(.success(info)) - default: - completion(.failure(.error(result))) - } - } - } -} diff --git a/Project_Timer/Data/lagacy/SyncLogNetwork.swift b/Project_Timer/Data/lagacy/SyncLogNetwork.swift deleted file mode 100644 index 0a09aa5c..00000000 --- a/Project_Timer/Data/lagacy/SyncLogNetwork.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// SyncLogNetwork.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/16. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -final class SyncLogNetwork { - private let network = Network() - private var url: String { - let base = NetworkURL.shared.serverURL ?? "nil" - return base + "/syncLog" - } - - func get(completion: @escaping (NetworkResult) -> Void) { - self.network.request(url: url, method: .get) { result in - completion(result) - } - } -} diff --git a/Project_Timer/Data/lagacy/SyncLogRepository_lagacy.swift b/Project_Timer/Data/lagacy/SyncLogRepository_lagacy.swift deleted file mode 100644 index 6708730f..00000000 --- a/Project_Timer/Data/lagacy/SyncLogRepository_lagacy.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// SyncLogRepository_lagacy.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/16. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -final class SyncLogRepository_lagacy: SyncLogRepositoryInterface { - private let api = SyncLogNetwork() - - func get(completion: @escaping (Result) -> Void) { - api.get { result in - switch result.status { - case .SUCCESS: - if let data = result.data { - guard let dto = try? JSONDecoder.dateFormatted.decode(SyncLogResponse.self, from: data) else { - completion(.failure(.DECODEERROR)) - return - } - - let info = dto.toDomain() - completion(.success(info)) - } else { - completion(.success(nil)) - } - default: - completion(.failure(.error(result))) - } - } - } -} diff --git a/Project_Timer/Domain/lagacy/RecordTimesRepositoryInterface.swift b/Project_Timer/Domain/lagacy/RecordTimesRepositoryInterface.swift deleted file mode 100644 index c8abcb51..00000000 --- a/Project_Timer/Domain/lagacy/RecordTimesRepositoryInterface.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// RecordTimesRepositoryInterface.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/16. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -protocol RecordTimesRepositoryInterface { - func upload(recordTimes: RecordTimes, completion: @escaping (Result) -> Void) - func get(completion: @escaping (Result) -> Void) -} diff --git a/Project_Timer/Domain/lagacy/RecordTimesUseCase.swift b/Project_Timer/Domain/lagacy/RecordTimesUseCase.swift deleted file mode 100644 index a9104688..00000000 --- a/Project_Timer/Domain/lagacy/RecordTimesUseCase.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// RecordTimesUseCase.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/16. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -final class RecordTimesUseCase: RecordTimesUseCaseInterface { - let repository: RecordTimesRepositoryInterface - - init(repository: RecordTimesRepositoryInterface) { - self.repository = repository - } - - func uploadRecordTimes(recordTimes: RecordTimes, completion: @escaping (Result) -> Void) { - self.repository.upload(recordTimes: recordTimes) { result in - completion(result) - } - } - - func getRecordTimes(completion: @escaping (Result) -> Void) { - self.repository.get() { result in - completion(result) - } - } -} diff --git a/Project_Timer/Domain/lagacy/SyncLogRepositoryInterface.swift b/Project_Timer/Domain/lagacy/SyncLogRepositoryInterface.swift deleted file mode 100644 index e5b90c75..00000000 --- a/Project_Timer/Domain/lagacy/SyncLogRepositoryInterface.swift +++ /dev/null @@ -1,13 +0,0 @@ -// -// SyncLogRepositoryInterface.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/16. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -protocol SyncLogRepositoryInterface { - func get(completion: @escaping (Result) -> Void) -} diff --git a/Project_Timer/Domain/lagacy/SyncLogUseCase.swift b/Project_Timer/Domain/lagacy/SyncLogUseCase.swift deleted file mode 100644 index 0d16aa1a..00000000 --- a/Project_Timer/Domain/lagacy/SyncLogUseCase.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// SyncLogUseCase.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/16. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -final class SyncLogUseCase: SyncLogUseCaseInterface { - let repository: SyncLogRepositoryInterface - - init(repository: SyncLogRepositoryInterface) { - self.repository = repository - } - - func getSyncLog(completion: @escaping (Result) -> Void) { - self.repository.get() { result in - completion(result) - } - } -} diff --git a/Project_Timer/Present/Interface/RecordTimesUseCaseInterface.swift b/Project_Timer/Present/Interface/RecordTimesUseCaseInterface.swift deleted file mode 100644 index 290bf1c8..00000000 --- a/Project_Timer/Present/Interface/RecordTimesUseCaseInterface.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// RecordTimesUseCaseInterface.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/16. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -protocol RecordTimesUseCaseInterface { - var repository: RecordTimesRepositoryInterface { get } - func uploadRecordTimes(recordTimes: RecordTimes, completion: @escaping (Result) -> Void) - func getRecordTimes(completion: @escaping (Result) -> Void) -} diff --git a/Project_Timer/Present/Interface/SyncLogUseCaseInterface.swift b/Project_Timer/Present/Interface/SyncLogUseCaseInterface.swift deleted file mode 100644 index 55631a5a..00000000 --- a/Project_Timer/Present/Interface/SyncLogUseCaseInterface.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// SyncLogUseCaseInterface.swift -// Project_Timer -// -// Created by Kang Minsang on 2023/12/16. -// Copyright © 2023 FDEE. All rights reserved. -// - -import Foundation - -protocol SyncLogUseCaseInterface { - var repository: SyncLogRepositoryInterface { get } - func getSyncLog(completion: @escaping (Result) -> Void) -} From 10b99ef4c894f7136d48e231dfba80edecc73270 Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sun, 24 Nov 2024 21:41:12 +0900 Subject: [PATCH 41/44] =?UTF-8?q?feat=20#144:=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0-=EB=B2=84=EC=A0=84=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=88=98=EC=8B=A0=EC=98=A4=EB=A5=98=EC=8B=9C=20=ED=8C=9D?= =?UTF-8?q?=EC=97=85=20=ED=91=9C=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer/AppDelegate.swift | 10 +++++++--- Project_Timer/Core/Localize/TLRen.swift | 3 +++ Project_Timer/Core/Localize/TLRkey.swift | 5 +++++ Project_Timer/Core/Localize/TLRko.swift | 3 +++ Project_Timer/Core/Localize/TLRzh.swift | 3 +++ .../Domain/UseCase/Firebase/GetAppVersionUseCase.swift | 2 ++ 6 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Project_Timer/AppDelegate.swift b/Project_Timer/AppDelegate.swift index 92c443d3..3f887feb 100644 --- a/Project_Timer/AppDelegate.swift +++ b/Project_Timer/AppDelegate.swift @@ -113,9 +113,13 @@ extension AppDelegate { let getAppVersionUseCase = GetAppVersionUseCase(repository: repository) getAppVersionUseCase.execute() - .sink { completion in - if case .failure(let networkError) = completion { - print("ERROR", #function, networkError) + .sink { [weak self] completion in + if case .failure = completion { + // MARK: 버전 불러오기 실패 Alert 표시 + let title = Localized.string(.App_Popup_FetchVersionErrorTitle) + let text = Localized.string(.App_Popup_FetchVersionErrorDesc) + let ok = UIAlertAction(title: Localized.string(.Common_Text_OK), style: .default) + self?.showAlert(title: title, text: text, actions: [ok]) } } receiveValue: { [weak self] appLatestVersionInfo in let storeVersion = appLatestVersionInfo.latestVersion diff --git a/Project_Timer/Core/Localize/TLRen.swift b/Project_Timer/Core/Localize/TLRen.swift index 677d5a82..dcb0f974 100644 --- a/Project_Timer/Core/Localize/TLRen.swift +++ b/Project_Timer/Core/Localize/TLRen.swift @@ -31,6 +31,9 @@ struct TLRen { case .Common_Popup_Warning: value = "Warning" case .Common_Popup_Inform: value = "Inform" + case .App_Popup_FetchVersionErrorTitle: value = "Failed to fetch the latest version information" + case .App_Popup_FetchVersionErrorDesc: value = "If the issue persists, please contact support." + case .System_Noti_StopwatchHourPassed: value = "{}hours passed." case .System_Noti_TimerFinished: value = "Timer finished!" case .System_Noti_Timer5Left: value = "5 minutes left" diff --git a/Project_Timer/Core/Localize/TLRkey.swift b/Project_Timer/Core/Localize/TLRkey.swift index 33bbe5a4..3c93eb25 100644 --- a/Project_Timer/Core/Localize/TLRkey.swift +++ b/Project_Timer/Core/Localize/TLRkey.swift @@ -46,6 +46,11 @@ enum TLRkey: String { /// 안내 case Common_Popup_Inform + /// 최신버전 정보를 불러오지 못했어요 + case App_Popup_FetchVersionErrorTitle + /// 문제가 계속될 경우 문의 부탁드려요. + case App_Popup_FetchVersionErrorDesc + /// {}시간 경과되었습니다. case System_Noti_StopwatchHourPassed /// 타이머가 종료되었습니다! diff --git a/Project_Timer/Core/Localize/TLRko.swift b/Project_Timer/Core/Localize/TLRko.swift index b7d0353c..e99b42ff 100644 --- a/Project_Timer/Core/Localize/TLRko.swift +++ b/Project_Timer/Core/Localize/TLRko.swift @@ -31,6 +31,9 @@ struct TLRko { case .Common_Popup_Warning: value = "경고" case .Common_Popup_Inform: value = "안내" + case .App_Popup_FetchVersionErrorTitle: value = "최신버전 정보를 불러오지 못했어요" + case .App_Popup_FetchVersionErrorDesc: value = "문제가 계속될 경우 문의 부탁드려요." + case .System_Noti_StopwatchHourPassed: value = "{}시간 경과되었습니다." case .System_Noti_TimerFinished: value = "타이머가 종료되었습니다!" case .System_Noti_Timer5Left: value = "5분 남았습니다" diff --git a/Project_Timer/Core/Localize/TLRzh.swift b/Project_Timer/Core/Localize/TLRzh.swift index 11fd0c8a..d45540ea 100644 --- a/Project_Timer/Core/Localize/TLRzh.swift +++ b/Project_Timer/Core/Localize/TLRzh.swift @@ -31,6 +31,9 @@ struct TLRzh { case .Common_Popup_Warning: value = "警告" case .Common_Popup_Inform: value = "向导" + case .App_Popup_FetchVersionErrorTitle: value = "无法获取最新版本信息。" + case .App_Popup_FetchVersionErrorDesc: value = "如果问题仍然存在,请联系客服。" + case .System_Noti_StopwatchHourPassed: value = "{}时间已过。" case .System_Noti_TimerFinished: value = "计时器已结束 !" case .System_Noti_Timer5Left: value = "还剩5分钟" diff --git a/Project_Timer/Domain/UseCase/Firebase/GetAppVersionUseCase.swift b/Project_Timer/Domain/UseCase/Firebase/GetAppVersionUseCase.swift index f518c90b..530d8118 100644 --- a/Project_Timer/Domain/UseCase/Firebase/GetAppVersionUseCase.swift +++ b/Project_Timer/Domain/UseCase/Firebase/GetAppVersionUseCase.swift @@ -18,5 +18,7 @@ final class GetAppVersionUseCase { func execute() -> AnyPublisher { return self.repository.getAppVersion() + .flatMap { _ in Fail(error: NetworkError.FAIL) } + .eraseToAnyPublisher() } } From bc51802f48a32d81ad4287a261f6e7dc2d6632a6 Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sun, 24 Nov 2024 21:46:00 +0900 Subject: [PATCH 42/44] =?UTF-8?q?feat=20#144:=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0-extension=20TargetType=20static=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer/Data/API/API.swift | 2 +- Project_Timer/Data/API/AuthAPI.swift | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Project_Timer/Data/API/API.swift b/Project_Timer/Data/API/API.swift index db58ffd1..0a2358f0 100644 --- a/Project_Timer/Data/API/API.swift +++ b/Project_Timer/Data/API/API.swift @@ -10,7 +10,7 @@ import Foundation import Moya extension TargetType { - static func parameters(from encodable: Encodable) -> [String: Any] { + func parameters(from encodable: Encodable) -> [String: Any] { let encoder = JSONEncoder() guard let data = try? encoder.encode(encodable), let dictionary = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any] else { diff --git a/Project_Timer/Data/API/AuthAPI.swift b/Project_Timer/Data/API/AuthAPI.swift index dd2fecce..b5092e2d 100644 --- a/Project_Timer/Data/API/AuthAPI.swift +++ b/Project_Timer/Data/API/AuthAPI.swift @@ -51,9 +51,9 @@ extension AuthAPI: TargetType { case .postSignin(let request): return .requestJSONEncodable(request) case .getCheckUsername(let request): - return .requestParameters(parameters: Self.parameters(from: request), encoding: URLEncoding.queryString) + return .requestParameters(parameters: self.parameters(from: request), encoding: URLEncoding.queryString) case .getCheckEmail(let request): - return .requestParameters(parameters: Self.parameters(from: request), encoding: URLEncoding.queryString) + return .requestParameters(parameters: self.parameters(from: request), encoding: URLEncoding.queryString) case .postUpdatePassword(let request): return .requestJSONEncodable(request) } From aa72f116f3b6add1f68afaf4a27843187af14be0 Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sun, 24 Nov 2024 21:53:37 +0900 Subject: [PATCH 43/44] =?UTF-8?q?feat=20#144:=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0-uppercase=20=EB=B3=80=EC=88=98=EB=AA=85=20lo?= =?UTF-8?q?wercase=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project_Timer/Data/NetworkError.swift | 60 +++++++++---------- Project_Timer/Data/TTProvider.swift | 10 ++-- .../Firebase/GetAppVersionUseCase.swift | 2 +- .../Email/ResetPasswordEmailModel.swift | 2 +- .../Nickname/ResetPasswordNicknameModel.swift | 2 +- .../Password/ResetPasswordModel.swift | 2 +- .../TestServer/SignupSigninVM.swift | 6 +- .../TestServer/SyncDailys/SyncDailysVM.swift | 10 ++-- 8 files changed, 47 insertions(+), 47 deletions(-) diff --git a/Project_Timer/Data/NetworkError.swift b/Project_Timer/Data/NetworkError.swift index c56812b5..8291d9cc 100644 --- a/Project_Timer/Data/NetworkError.swift +++ b/Project_Timer/Data/NetworkError.swift @@ -11,32 +11,32 @@ import Moya /// 네트워크 에러 enum NetworkError: Error { - case FAIL - case TIMEOUT - case DECODEERROR - case CLIENTERROR(String?) // 400 - case AUTHENTICATION(String?) // 401 - case NOTFOUND(String?) // 404 - case CONFLICT(String?) // 409 - case SERVERERROR(String?) // 500 - case ERRORRESPONSE(TTErrorResponse) // TiTi ErrorResponse + case fail + case timeout + case decode + case client(String?) // 400 + case authentication(String?) // 401 + case notFound(String?) // 404 + case conflict(String?) // 409 + case server(String?) // 500 + case errorResponse(TTErrorResponse) // TiTi ErrorResponse static func serverError(statusCode: Int, data: Data? = nil) -> NetworkError { // MARK: Decoding 로직 필요 let errorMessage: String? = "" switch statusCode { case 400: - return .CLIENTERROR(errorMessage) + return .client(errorMessage) case 401: - return .AUTHENTICATION(errorMessage) + return .authentication(errorMessage) case 404: - return .NOTFOUND(errorMessage) + return .notFound(errorMessage) case 409: - return .CONFLICT(errorMessage) + return .conflict(errorMessage) case 500: - return .SERVERERROR(errorMessage) + return .server(errorMessage) default: - return .FAIL + return .fail } } @@ -45,25 +45,25 @@ enum NetworkError: Error { guard let errorResponse = try? JSONDecoder().decode(TTErrorResponse.self, from: response.data) else { return .serverError(statusCode: response.statusCode) } - return .ERRORRESPONSE(errorResponse) + return .errorResponse(errorResponse) } /// 범용적으로 표시될 수 있는 alert title 값, CLIENTERROR의 경우 VM에서 처리 var title: String { switch self { - case .FAIL: + case .fail: return Localized.string(.Server_Error_NetworkError) - case .TIMEOUT: + case .timeout: return Localized.string(.Server_Error_NetworkTimeout) - case .DECODEERROR: + case .decode: return Localized.string(.Server_Error_NetworkFetchError) - case .AUTHENTICATION(_): + case .authentication(_): return Localized.string(.SignIn_Error_AuthenticationError) - case .NOTFOUND(_): + case .notFound(_): return Localized.string(.Server_Error_NetworkFetchError) - case .CONFLICT(_): + case .conflict(_): return Localized.string(.SignUp_Error_SignupError) - case .SERVERERROR(_): + case .server(_): return Localized.string(.Server_Error_ServerError) default: return Localized.string(.Server_Error_NetworkError) @@ -73,19 +73,19 @@ enum NetworkError: Error { /// 범용적으로 표시될 수 있는 alert message 값, CLIENTERROR의 경우 VM에서 처리 var message: String { switch self { - case .FAIL: + case .fail: return Localized.string(.Server_Error_CheckNetwork) - case .TIMEOUT: + case .timeout: return Localized.string(.Server_Error_CheckNetwork) - case .DECODEERROR: + case .decode: return Localized.string(.Server_Error_DecodeError) - case .AUTHENTICATION(_): + case .authentication(_): return Localized.string(.SignIn_Error_SigninAgain) - case .NOTFOUND(_): + case .notFound(_): return Localized.string(.Server_Error_DecodeError) - case .CONFLICT(_): + case .conflict(_): return Localized.string(.SignUp_Error_EnterDifferentValue) - case .SERVERERROR(_): + case .server(_): return Localized.string(.Server_Error_ServerErrorTryAgain) default: return Localized.string(.Server_Error_CheckNetwork) diff --git a/Project_Timer/Data/TTProvider.swift b/Project_Timer/Data/TTProvider.swift index 3cdced39..2f33b12b 100644 --- a/Project_Timer/Data/TTProvider.swift +++ b/Project_Timer/Data/TTProvider.swift @@ -43,10 +43,10 @@ final class TTProvider: MoyaProvider { case .statusCode(let response): return NetworkError.serverError(statusCode: response.statusCode) default: - return NetworkError.FAIL + return NetworkError.fail } } - return NetworkError.FAIL + return NetworkError.fail } } @@ -54,7 +54,7 @@ extension Publisher { /// Repository의 공통적인 Decode 에러를 반환하는 Publisher func catchDecodeError() -> AnyPublisher { return self - .mapError { error in return error as? NetworkError ?? .DECODEERROR } + .mapError { error in return error as? NetworkError ?? .decode } .eraseToAnyPublisher() } } @@ -69,11 +69,11 @@ extension Publisher where Output == Response, Failure == NetworkError { let decodedData = try jsonDecoder.decode(D.self, from: response.data) return decodedData } catch { - throw NetworkError.DECODEERROR + throw NetworkError.decode } } .mapError { error in - error as? NetworkError ?? NetworkError.FAIL + error as? NetworkError ?? NetworkError.fail } .eraseToAnyPublisher() } diff --git a/Project_Timer/Domain/UseCase/Firebase/GetAppVersionUseCase.swift b/Project_Timer/Domain/UseCase/Firebase/GetAppVersionUseCase.swift index 530d8118..b82aae1c 100644 --- a/Project_Timer/Domain/UseCase/Firebase/GetAppVersionUseCase.swift +++ b/Project_Timer/Domain/UseCase/Firebase/GetAppVersionUseCase.swift @@ -18,7 +18,7 @@ final class GetAppVersionUseCase { func execute() -> AnyPublisher { return self.repository.getAppVersion() - .flatMap { _ in Fail(error: NetworkError.FAIL) } + .flatMap { _ in Fail(error: NetworkError.fail) } .eraseToAnyPublisher() } } diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Email/ResetPasswordEmailModel.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Email/ResetPasswordEmailModel.swift index c0495426..49ecb9d5 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Email/ResetPasswordEmailModel.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Email/ResetPasswordEmailModel.swift @@ -88,7 +88,7 @@ extension ResetPasswordEmailModel { print("ERROR", #function, networkError) self?.validEmail = false switch networkError { - case .NOTFOUND(_): + case .notFound(_): self?.errorMessage = .notExist default: self?.errorMessage = .serverError diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Nickname/ResetPasswordNicknameModel.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Nickname/ResetPasswordNicknameModel.swift index aaeab93b..006c2b13 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Nickname/ResetPasswordNicknameModel.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Nickname/ResetPasswordNicknameModel.swift @@ -84,7 +84,7 @@ extension ResetPasswordNicknameModel { print("ERROR", #function, networkError) self?.validNickname = false switch networkError { - case .NOTFOUND(_): + case .notFound(_): self?.errorMessage = .notExist default: self?.errorMessage = .serverError diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Password/ResetPasswordModel.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Password/ResetPasswordModel.swift index f2f67b65..f79f3c2f 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Password/ResetPasswordModel.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/ResetPassword/Password/ResetPasswordModel.swift @@ -144,7 +144,7 @@ extension ResetPasswordModel { print("ERROR", #function, networkError) self?.validPassword2 = false switch networkError { - case .NOTFOUND(_): + case .notFound(_): self?.errorMessage = .notExist default: self?.errorMessage = .serverError diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVM.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVM.swift index f0b220e7..74bba9b5 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVM.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SignupSigninVM.swift @@ -48,7 +48,7 @@ final class SignupSigninVM { print("ERROR", #function, networkError) switch networkError { // signup 관련 error message 추가 - case .CLIENTERROR(_): + case .client(_): self?.alert = (title: Localized.string(.SignUp_Error_SignupError), text: Localized.string(.SignUp_Error_CheckNicknameOrEmail)) default: self?.alert = networkError.alertMessage @@ -69,10 +69,10 @@ final class SignupSigninVM { print("ERROR", #function, networkError) switch networkError { // signin 관련 error message 추가 - case .CLIENTERROR(_): + case .client(_): self?.alert = (title: Localized.string(.SignIn_Error_SigninFail), text: Localized.string(.SignIn_Error_CheckNicknameOrPassword)) // TestServer 에러핸들링 이슈로 404코드 추가 - case .NOTFOUND(_): + case .notFound(_): self?.alert = (title: Localized.string(.SignIn_Error_SigninFail), text: Localized.string(.SignIn_Error_CheckNicknameOrPassword)) default: self?.alert = networkError.alertMessage diff --git a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVM.swift b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVM.swift index 003c1165..d32197e6 100644 --- a/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVM.swift +++ b/Project_Timer/Present/Setting/Service/SettingTiTiLab/TestServer/SyncDailys/SyncDailysVM.swift @@ -88,7 +88,7 @@ extension SyncDailysVM { print("ERROR", #function, networkError) self?.loading = false switch networkError { - case .CLIENTERROR(let message): + case .client(let message): if let message = message { print("[upload Dailys ERROR] \(message)") } @@ -114,7 +114,7 @@ extension SyncDailysVM { print("ERROR", #function, networkError) self?.loading = false switch networkError { - case .CLIENTERROR(let message): + case .client(let message): if let message = message { print("[upload Recordtime ERROR] \(message)") } @@ -143,7 +143,7 @@ extension SyncDailysVM { print("ERROR", #function, networkError) self?.loading = false switch networkError { - case .CLIENTERROR(let message): + case .client(let message): if let message = message { print("[get Dailys ERROR] \(message)") } @@ -170,7 +170,7 @@ extension SyncDailysVM { print("ERROR", #function, networkError) self?.loading = false switch networkError { - case .CLIENTERROR(let message): + case .client(let message): if let message = message { print("[get RecordTimes ERROR] \(message)") } @@ -197,7 +197,7 @@ extension SyncDailysVM { print("ERROR", #function, networkError) self?.loading = false switch networkError { - case .CLIENTERROR(let message): + case .client(let message): if let message = message { print("[get SyncLog ERROR] \(message)") } From b78ecae08b4a26099594edda5d78cbe6453412fd Mon Sep 17 00:00:00 2001 From: FreeDeveloper97 Date: Sun, 24 Nov 2024 22:13:29 +0900 Subject: [PATCH 44/44] =?UTF-8?q?=EA=B0=95=EC=A0=9C=EB=A1=9C=20error=20?= =?UTF-8?q?=EB=B0=9C=EC=83=9D=EC=8B=9C=ED=82=A8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Domain/UseCase/Firebase/GetAppVersionUseCase.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/Project_Timer/Domain/UseCase/Firebase/GetAppVersionUseCase.swift b/Project_Timer/Domain/UseCase/Firebase/GetAppVersionUseCase.swift index b82aae1c..f518c90b 100644 --- a/Project_Timer/Domain/UseCase/Firebase/GetAppVersionUseCase.swift +++ b/Project_Timer/Domain/UseCase/Firebase/GetAppVersionUseCase.swift @@ -18,7 +18,5 @@ final class GetAppVersionUseCase { func execute() -> AnyPublisher { return self.repository.getAppVersion() - .flatMap { _ in Fail(error: NetworkError.fail) } - .eraseToAnyPublisher() } }