From e107d329f2a9667775ce8890976dc716f1dcd311 Mon Sep 17 00:00:00 2001 From: Kota Date: Sat, 8 Jul 2023 08:31:42 +0900 Subject: [PATCH 1/5] =?UTF-8?q?fix:=20=E3=83=95=E3=82=A9=E3=83=AB=E3=83=80?= =?UTF-8?q?=E6=A7=8B=E6=88=90=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CommonWallet.xcodeproj/project.pbxproj | 38 +++++++++++-------- .../CoreData/SelectedEditTransaction.swift | 0 .../CoreData/TransactionData.swift | 0 .../{ => Models}/Domain/Partner.swift | 0 .../{ => Models}/Domain/Transaction.swift | 0 CommonWallet/{ => Models}/Domain/User.swift | 0 .../Firebase/{ => Firebase}/AuthManager.swift | 0 .../FireStorePartnerManager.swift | 0 .../FireStoreTransactionManager.swift | 0 .../{ => Firebase}/FireStoreUserManager.swift | 0 .../{ => Firebase}/ShareNumberManager.swift | 0 .../{ => Firebase}/StorageManager.swift | 0 .../Protocol/AuthManaging.swift | 0 .../Protocol/FireStorePartnerManaging.swift | 0 .../FireStoreTransactionManaging.swift | 0 .../Protocol/FireStoreUserManaging.swift | 0 .../Protocol/ShareNumberManaging.swift | 0 .../Protocol/StorageManaging.swift | 0 .../ImageNameProperty.swift | 0 .../UserDefaultsKey.swift | 0 .../UserDefaultsManager.swift | 0 .../UserDefaultsManaging.swift | 0 CommonWallet/{Source => ViewTools}/Flip.swift | 0 .../{Source => ViewTools}/ImagePicker.swift | 0 .../{Source => ViewTools}/PKHUDView.swift | 0 .../WebView/WebView.swift | 0 .../WebView/WebViewController.swift | 0 .../WebView/WebViewController.xib | 0 28 files changed, 23 insertions(+), 15 deletions(-) rename CommonWallet/{ => Models}/CoreData/SelectedEditTransaction.swift (100%) rename CommonWallet/{ => Models}/CoreData/TransactionData.swift (100%) rename CommonWallet/{ => Models}/Domain/Partner.swift (100%) rename CommonWallet/{ => Models}/Domain/Transaction.swift (100%) rename CommonWallet/{ => Models}/Domain/User.swift (100%) rename CommonWallet/Models/Firebase/{ => Firebase}/AuthManager.swift (100%) rename CommonWallet/Models/Firebase/{ => Firebase}/FireStorePartnerManager.swift (100%) rename CommonWallet/Models/Firebase/{ => Firebase}/FireStoreTransactionManager.swift (100%) rename CommonWallet/Models/Firebase/{ => Firebase}/FireStoreUserManager.swift (100%) rename CommonWallet/Models/Firebase/{ => Firebase}/ShareNumberManager.swift (100%) rename CommonWallet/Models/Firebase/{ => Firebase}/StorageManager.swift (100%) rename CommonWallet/Models/{ => Firebase}/Protocol/AuthManaging.swift (100%) rename CommonWallet/Models/{ => Firebase}/Protocol/FireStorePartnerManaging.swift (100%) rename CommonWallet/Models/{ => Firebase}/Protocol/FireStoreTransactionManaging.swift (100%) rename CommonWallet/Models/{ => Firebase}/Protocol/FireStoreUserManaging.swift (100%) rename CommonWallet/Models/{ => Firebase}/Protocol/ShareNumberManaging.swift (100%) rename CommonWallet/Models/{ => Firebase}/Protocol/StorageManaging.swift (100%) rename CommonWallet/Models/{General => UserDefaults}/ImageNameProperty.swift (100%) rename CommonWallet/Models/{General => UserDefaults}/UserDefaultsKey.swift (100%) rename CommonWallet/Models/{General => UserDefaults}/UserDefaultsManager.swift (100%) rename CommonWallet/Models/{Protocol => UserDefaults}/UserDefaultsManaging.swift (100%) rename CommonWallet/{Source => ViewTools}/Flip.swift (100%) rename CommonWallet/{Source => ViewTools}/ImagePicker.swift (100%) rename CommonWallet/{Source => ViewTools}/PKHUDView.swift (100%) rename CommonWallet/{Source => ViewTools}/WebView/WebView.swift (100%) rename CommonWallet/{Source => ViewTools}/WebView/WebViewController.swift (100%) rename CommonWallet/{Source => ViewTools}/WebView/WebViewController.xib (100%) diff --git a/CommonWallet.xcodeproj/project.pbxproj b/CommonWallet.xcodeproj/project.pbxproj index 9ee021e..3e851f9 100644 --- a/CommonWallet.xcodeproj/project.pbxproj +++ b/CommonWallet.xcodeproj/project.pbxproj @@ -320,13 +320,24 @@ 87402F4229F377D70007320D /* FireStoreUserManaging.swift */, 87402F4029F377C40007320D /* FireStoreTransactionManaging.swift */, 87402F4629F37B040007320D /* FireStorePartnerManaging.swift */, - 87402F4429F378330007320D /* UserDefaultsManaging.swift */, 871F09EB2A11945000F96394 /* ShareNumberManaging.swift */, 874DBA072A2C1FF8000E1FD1 /* StorageManaging.swift */, ); path = Protocol; sourceTree = ""; }; + 874C19792A58D6F6002812D5 /* Models */ = { + isa = PBXGroup; + children = ( + 87830E6A297A1A6000184A7C /* Firebase */, + 87ABC57B29907C54003E94F3 /* UserDefaults */, + 87D1A05329E770E30058A98F /* Error */, + 87C162DB2A2ACE9300382061 /* Domain */, + 8702F3F22A51068E002925A0 /* CoreData */, + ); + path = Models; + sourceTree = ""; + }; 874EF93D297D040000C94233 /* Extentions */ = { isa = PBXGroup; children = ( @@ -382,15 +393,13 @@ path = ViewModel; sourceTree = ""; }; - 87830E6A297A1A6000184A7C /* Models */ = { + 87830E6A297A1A6000184A7C /* Firebase */ = { isa = PBXGroup; children = ( 87402F3F29F377210007320D /* Protocol */, - 87D1A05329E770E30058A98F /* Error */, 874EF943297D0F3700C94233 /* Firebase */, - 87ABC57B29907C54003E94F3 /* General */, ); - path = Models; + path = Firebase; sourceTree = ""; }; 87830E76297A1C1900184A7C /* Frameworks */ = { @@ -518,14 +527,15 @@ path = Model; sourceTree = ""; }; - 87ABC57B29907C54003E94F3 /* General */ = { + 87ABC57B29907C54003E94F3 /* UserDefaults */ = { isa = PBXGroup; children = ( + 87402F4429F378330007320D /* UserDefaultsManaging.swift */, 874EF93B297CFC3900C94233 /* UserDefaultsManager.swift */, 874EF93E297D04DF00C94233 /* UserDefaultsKey.swift */, 879310232A2FF28200FDD061 /* ImageNameProperty.swift */, ); - path = General; + path = UserDefaults; sourceTree = ""; }; 87ABC57C29907CD3003E94F3 /* Sceans */ = { @@ -541,7 +551,7 @@ path = Sceans; sourceTree = ""; }; - 87ABC57D29907DA2003E94F3 /* Source */ = { + 87ABC57D29907DA2003E94F3 /* ViewTools */ = { isa = PBXGroup; children = ( 876EE23B2A26AEFC0073F1C3 /* WebView */, @@ -549,7 +559,7 @@ 874613A52A2954A50068383B /* ImagePicker.swift */, 87DDCDCB2A18373200F51DC8 /* PKHUDView.swift */, ); - path = Source; + path = ViewTools; sourceTree = ""; }; 87ABC58229908B65003E94F3 /* Log */ = { @@ -641,11 +651,9 @@ 87EE8D49297A1369005CCB6F /* CommonWalletApp.swift */, 87EE8D7C297A1790005CCB6F /* AppDelegate.swift */, 87EE8D4B297A1369005CCB6F /* ContentView.swift */, - 87830E6A297A1A6000184A7C /* Models */, - 8702F3F22A51068E002925A0 /* CoreData */, - 87C162DB2A2ACE9300382061 /* Domain */, + 874C19792A58D6F6002812D5 /* Models */, 87ABC57C29907CD3003E94F3 /* Sceans */, - 87ABC57D29907DA2003E94F3 /* Source */, + 87ABC57D29907DA2003E94F3 /* ViewTools */, 874EF93D297D040000C94233 /* Extentions */, 87EE8D4D297A136A005CCB6F /* Assets.xcassets */, 87EE8D4F297A136A005CCB6F /* Preview Content */, @@ -1018,7 +1026,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -1072,7 +1080,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; diff --git a/CommonWallet/CoreData/SelectedEditTransaction.swift b/CommonWallet/Models/CoreData/SelectedEditTransaction.swift similarity index 100% rename from CommonWallet/CoreData/SelectedEditTransaction.swift rename to CommonWallet/Models/CoreData/SelectedEditTransaction.swift diff --git a/CommonWallet/CoreData/TransactionData.swift b/CommonWallet/Models/CoreData/TransactionData.swift similarity index 100% rename from CommonWallet/CoreData/TransactionData.swift rename to CommonWallet/Models/CoreData/TransactionData.swift diff --git a/CommonWallet/Domain/Partner.swift b/CommonWallet/Models/Domain/Partner.swift similarity index 100% rename from CommonWallet/Domain/Partner.swift rename to CommonWallet/Models/Domain/Partner.swift diff --git a/CommonWallet/Domain/Transaction.swift b/CommonWallet/Models/Domain/Transaction.swift similarity index 100% rename from CommonWallet/Domain/Transaction.swift rename to CommonWallet/Models/Domain/Transaction.swift diff --git a/CommonWallet/Domain/User.swift b/CommonWallet/Models/Domain/User.swift similarity index 100% rename from CommonWallet/Domain/User.swift rename to CommonWallet/Models/Domain/User.swift diff --git a/CommonWallet/Models/Firebase/AuthManager.swift b/CommonWallet/Models/Firebase/Firebase/AuthManager.swift similarity index 100% rename from CommonWallet/Models/Firebase/AuthManager.swift rename to CommonWallet/Models/Firebase/Firebase/AuthManager.swift diff --git a/CommonWallet/Models/Firebase/FireStorePartnerManager.swift b/CommonWallet/Models/Firebase/Firebase/FireStorePartnerManager.swift similarity index 100% rename from CommonWallet/Models/Firebase/FireStorePartnerManager.swift rename to CommonWallet/Models/Firebase/Firebase/FireStorePartnerManager.swift diff --git a/CommonWallet/Models/Firebase/FireStoreTransactionManager.swift b/CommonWallet/Models/Firebase/Firebase/FireStoreTransactionManager.swift similarity index 100% rename from CommonWallet/Models/Firebase/FireStoreTransactionManager.swift rename to CommonWallet/Models/Firebase/Firebase/FireStoreTransactionManager.swift diff --git a/CommonWallet/Models/Firebase/FireStoreUserManager.swift b/CommonWallet/Models/Firebase/Firebase/FireStoreUserManager.swift similarity index 100% rename from CommonWallet/Models/Firebase/FireStoreUserManager.swift rename to CommonWallet/Models/Firebase/Firebase/FireStoreUserManager.swift diff --git a/CommonWallet/Models/Firebase/ShareNumberManager.swift b/CommonWallet/Models/Firebase/Firebase/ShareNumberManager.swift similarity index 100% rename from CommonWallet/Models/Firebase/ShareNumberManager.swift rename to CommonWallet/Models/Firebase/Firebase/ShareNumberManager.swift diff --git a/CommonWallet/Models/Firebase/StorageManager.swift b/CommonWallet/Models/Firebase/Firebase/StorageManager.swift similarity index 100% rename from CommonWallet/Models/Firebase/StorageManager.swift rename to CommonWallet/Models/Firebase/Firebase/StorageManager.swift diff --git a/CommonWallet/Models/Protocol/AuthManaging.swift b/CommonWallet/Models/Firebase/Protocol/AuthManaging.swift similarity index 100% rename from CommonWallet/Models/Protocol/AuthManaging.swift rename to CommonWallet/Models/Firebase/Protocol/AuthManaging.swift diff --git a/CommonWallet/Models/Protocol/FireStorePartnerManaging.swift b/CommonWallet/Models/Firebase/Protocol/FireStorePartnerManaging.swift similarity index 100% rename from CommonWallet/Models/Protocol/FireStorePartnerManaging.swift rename to CommonWallet/Models/Firebase/Protocol/FireStorePartnerManaging.swift diff --git a/CommonWallet/Models/Protocol/FireStoreTransactionManaging.swift b/CommonWallet/Models/Firebase/Protocol/FireStoreTransactionManaging.swift similarity index 100% rename from CommonWallet/Models/Protocol/FireStoreTransactionManaging.swift rename to CommonWallet/Models/Firebase/Protocol/FireStoreTransactionManaging.swift diff --git a/CommonWallet/Models/Protocol/FireStoreUserManaging.swift b/CommonWallet/Models/Firebase/Protocol/FireStoreUserManaging.swift similarity index 100% rename from CommonWallet/Models/Protocol/FireStoreUserManaging.swift rename to CommonWallet/Models/Firebase/Protocol/FireStoreUserManaging.swift diff --git a/CommonWallet/Models/Protocol/ShareNumberManaging.swift b/CommonWallet/Models/Firebase/Protocol/ShareNumberManaging.swift similarity index 100% rename from CommonWallet/Models/Protocol/ShareNumberManaging.swift rename to CommonWallet/Models/Firebase/Protocol/ShareNumberManaging.swift diff --git a/CommonWallet/Models/Protocol/StorageManaging.swift b/CommonWallet/Models/Firebase/Protocol/StorageManaging.swift similarity index 100% rename from CommonWallet/Models/Protocol/StorageManaging.swift rename to CommonWallet/Models/Firebase/Protocol/StorageManaging.swift diff --git a/CommonWallet/Models/General/ImageNameProperty.swift b/CommonWallet/Models/UserDefaults/ImageNameProperty.swift similarity index 100% rename from CommonWallet/Models/General/ImageNameProperty.swift rename to CommonWallet/Models/UserDefaults/ImageNameProperty.swift diff --git a/CommonWallet/Models/General/UserDefaultsKey.swift b/CommonWallet/Models/UserDefaults/UserDefaultsKey.swift similarity index 100% rename from CommonWallet/Models/General/UserDefaultsKey.swift rename to CommonWallet/Models/UserDefaults/UserDefaultsKey.swift diff --git a/CommonWallet/Models/General/UserDefaultsManager.swift b/CommonWallet/Models/UserDefaults/UserDefaultsManager.swift similarity index 100% rename from CommonWallet/Models/General/UserDefaultsManager.swift rename to CommonWallet/Models/UserDefaults/UserDefaultsManager.swift diff --git a/CommonWallet/Models/Protocol/UserDefaultsManaging.swift b/CommonWallet/Models/UserDefaults/UserDefaultsManaging.swift similarity index 100% rename from CommonWallet/Models/Protocol/UserDefaultsManaging.swift rename to CommonWallet/Models/UserDefaults/UserDefaultsManaging.swift diff --git a/CommonWallet/Source/Flip.swift b/CommonWallet/ViewTools/Flip.swift similarity index 100% rename from CommonWallet/Source/Flip.swift rename to CommonWallet/ViewTools/Flip.swift diff --git a/CommonWallet/Source/ImagePicker.swift b/CommonWallet/ViewTools/ImagePicker.swift similarity index 100% rename from CommonWallet/Source/ImagePicker.swift rename to CommonWallet/ViewTools/ImagePicker.swift diff --git a/CommonWallet/Source/PKHUDView.swift b/CommonWallet/ViewTools/PKHUDView.swift similarity index 100% rename from CommonWallet/Source/PKHUDView.swift rename to CommonWallet/ViewTools/PKHUDView.swift diff --git a/CommonWallet/Source/WebView/WebView.swift b/CommonWallet/ViewTools/WebView/WebView.swift similarity index 100% rename from CommonWallet/Source/WebView/WebView.swift rename to CommonWallet/ViewTools/WebView/WebView.swift diff --git a/CommonWallet/Source/WebView/WebViewController.swift b/CommonWallet/ViewTools/WebView/WebViewController.swift similarity index 100% rename from CommonWallet/Source/WebView/WebViewController.swift rename to CommonWallet/ViewTools/WebView/WebViewController.swift diff --git a/CommonWallet/Source/WebView/WebViewController.xib b/CommonWallet/ViewTools/WebView/WebViewController.xib similarity index 100% rename from CommonWallet/Source/WebView/WebViewController.xib rename to CommonWallet/ViewTools/WebView/WebViewController.xib From b56229e8e3641dbcaa8538596f8a285bf888c6bf Mon Sep 17 00:00:00 2001 From: Kota Date: Sat, 8 Jul 2023 14:24:54 +0900 Subject: [PATCH 2/5] =?UTF-8?q?fix:=20=E5=8C=BF=E5=90=8D=E3=83=AD=E3=82=B0?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CommonWallet.xcodeproj/project.pbxproj | 38 ++--- CommonWallet/ContentView.swift | 70 -------- CommonWallet/Models/Domain/Partner.swift | 8 +- CommonWallet/Models/Domain/User.swift | 29 ++-- .../Firebase/Firebase/AuthManager.swift | 157 +----------------- .../FireStoreTransactionManager.swift | 86 +++++++++- .../Firebase/FireStoreUserManager.swift | 8 +- .../Firebase/ShareNumberManager.swift | 35 ++-- .../Firebase/Protocol/AuthManaging.swift | 6 +- .../FireStoreTransactionManaging.swift | 4 + .../Protocol/FireStoreUserManaging.swift | 5 +- .../Protocol/ShareNumberManaging.swift | 2 +- .../{ => Protocol}/UserDefaultsManaging.swift | 5 +- .../Models/UserDefaults/UserDefaultsKey.swift | 1 - .../UserDefaults/UserDefaultsManager.swift | 39 ++--- .../Authentication/View/CreateUserView.swift | 86 +++++----- .../Authentication/View/SignInView.swift | 100 +++++------ .../ViewModels/CreateUserViewModel.swift | 79 +++++---- .../ViewModels/SignInViewModel.swift | 38 ++--- .../Sceans/Launch/View/LaunchScreen.swift | 25 ++- .../Launch/ViewModels/LaunchViewModel.swift | 45 +++-- .../MainTab/{View => }/MainTabView.swift | 2 - .../MainTab/ViewMdels/MainTabViewModel.swift | 9 - .../Sceans/Setting/View/AccountView.swift | 6 +- .../Sceans/Setting/View/SettingView.swift | 2 +- .../Setting/ViewModels/AccountViewModel.swift | 75 ++++++++- .../ViewModels/PartnerInfoViewModel.swift | 2 +- 27 files changed, 455 insertions(+), 507 deletions(-) delete mode 100644 CommonWallet/ContentView.swift rename CommonWallet/Models/UserDefaults/{ => Protocol}/UserDefaultsManaging.swift (93%) rename CommonWallet/Sceans/MainTab/{View => }/MainTabView.swift (93%) delete mode 100644 CommonWallet/Sceans/MainTab/ViewMdels/MainTabViewModel.swift diff --git a/CommonWallet.xcodeproj/project.pbxproj b/CommonWallet.xcodeproj/project.pbxproj index 3e851f9..d424f29 100644 --- a/CommonWallet.xcodeproj/project.pbxproj +++ b/CommonWallet.xcodeproj/project.pbxproj @@ -13,7 +13,6 @@ 871073B42990B7A600A0518C /* AllLogView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 871073B32990B7A600A0518C /* AllLogView.swift */; }; 871073B92990CDBE00A0518C /* DateCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 871073B82990CDBE00A0518C /* DateCalculator.swift */; }; 871F09EC2A11945000F96394 /* ShareNumberManaging.swift in Sources */ = {isa = PBXBuildFile; fileRef = 871F09EB2A11945000F96394 /* ShareNumberManaging.swift */; }; - 871F09EE2A11979600F96394 /* MainTabViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 871F09ED2A11979600F96394 /* MainTabViewModel.swift */; }; 8724AD8E29FDF50A0023AEC5 /* LaunchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8724AD8D29FDF50A0023AEC5 /* LaunchViewModel.swift */; }; 872652F3297B92A8002C76D6 /* FirebaseErrorManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872652F2297B92A8002C76D6 /* FirebaseErrorManager.swift */; }; 872652F6297BB8AB002C76D6 /* SignInViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872652F5297BB8AB002C76D6 /* SignInViewModel.swift */; }; @@ -69,7 +68,6 @@ 87830E73297A1ACB00184A7C /* CreateUserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87830E71297A1ACB00184A7C /* CreateUserTests.swift */; }; 87830E74297A1B9E00184A7C /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87EE8D7C297A1790005CCB6F /* AppDelegate.swift */; }; 87830E75297A1BA100184A7C /* CommonWalletApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87EE8D49297A1369005CCB6F /* CommonWalletApp.swift */; }; - 87830E7B297A1C6A00184A7C /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87EE8D4B297A1369005CCB6F /* ContentView.swift */; }; 87830E7D297A201F00184A7C /* SignInView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87830E7C297A201F00184A7C /* SignInView.swift */; }; 87830E7E297A201F00184A7C /* SignInView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87830E7C297A201F00184A7C /* SignInView.swift */; }; 87830E80297A20DB00184A7C /* CreateUserView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87830E7F297A20DB00184A7C /* CreateUserView.swift */; }; @@ -113,7 +111,6 @@ 87E5E9342A2E9857002CF7B2 /* MyNameEditView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87E5E9332A2E9857002CF7B2 /* MyNameEditView.swift */; }; 87E5E9362A2E9880002CF7B2 /* MyNameEditViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87E5E9352A2E9880002CF7B2 /* MyNameEditViewModel.swift */; }; 87EE8D4A297A1369005CCB6F /* CommonWalletApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87EE8D49297A1369005CCB6F /* CommonWalletApp.swift */; }; - 87EE8D4C297A1369005CCB6F /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87EE8D4B297A1369005CCB6F /* ContentView.swift */; }; 87EE8D4E297A136A005CCB6F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 87EE8D4D297A136A005CCB6F /* Assets.xcassets */; }; 87EE8D51297A136A005CCB6F /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 87EE8D50297A136A005CCB6F /* Preview Assets.xcassets */; }; 87EE8D65297A136A005CCB6F /* CommonWalletUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87EE8D64297A136A005CCB6F /* CommonWalletUITests.swift */; }; @@ -151,7 +148,6 @@ 871073B32990B7A600A0518C /* AllLogView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AllLogView.swift; sourceTree = ""; }; 871073B82990CDBE00A0518C /* DateCalculator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateCalculator.swift; sourceTree = ""; }; 871F09EB2A11945000F96394 /* ShareNumberManaging.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareNumberManaging.swift; sourceTree = ""; }; - 871F09ED2A11979600F96394 /* MainTabViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainTabViewModel.swift; sourceTree = ""; }; 871F09F12A12E4D600F96394 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 8724AD8D29FDF50A0023AEC5 /* LaunchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchViewModel.swift; sourceTree = ""; }; 872652F2297B92A8002C76D6 /* FirebaseErrorManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseErrorManager.swift; sourceTree = ""; }; @@ -224,7 +220,6 @@ 87E5E9352A2E9880002CF7B2 /* MyNameEditViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyNameEditViewModel.swift; sourceTree = ""; }; 87EE8D46297A1369005CCB6F /* CommonWallet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CommonWallet.app; sourceTree = BUILT_PRODUCTS_DIR; }; 87EE8D49297A1369005CCB6F /* CommonWalletApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommonWalletApp.swift; sourceTree = ""; }; - 87EE8D4B297A1369005CCB6F /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 87EE8D4D297A136A005CCB6F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 87EE8D50297A136A005CCB6F /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 87EE8D56297A136A005CCB6F /* CommonWalletTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CommonWalletTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -289,22 +284,6 @@ path = Model; sourceTree = ""; }; - 871F09EF2A11979F00F96394 /* View */ = { - isa = PBXGroup; - children = ( - 87ABC58029908B17003E94F3 /* MainTabView.swift */, - ); - path = View; - sourceTree = ""; - }; - 871F09F02A1197A700F96394 /* ViewMdels */ = { - isa = PBXGroup; - children = ( - 871F09ED2A11979600F96394 /* MainTabViewModel.swift */, - ); - path = ViewMdels; - sourceTree = ""; - }; 8724AD8C29FDF4E40023AEC5 /* ViewModels */ = { isa = PBXGroup; children = ( @@ -338,6 +317,14 @@ path = Models; sourceTree = ""; }; + 874C197A2A58D885002812D5 /* Protocol */ = { + isa = PBXGroup; + children = ( + 87402F4429F378330007320D /* UserDefaultsManaging.swift */, + ); + path = Protocol; + sourceTree = ""; + }; 874EF93D297D040000C94233 /* Extentions */ = { isa = PBXGroup; children = ( @@ -530,7 +517,7 @@ 87ABC57B29907C54003E94F3 /* UserDefaults */ = { isa = PBXGroup; children = ( - 87402F4429F378330007320D /* UserDefaultsManaging.swift */, + 874C197A2A58D885002812D5 /* Protocol */, 874EF93B297CFC3900C94233 /* UserDefaultsManager.swift */, 874EF93E297D04DF00C94233 /* UserDefaultsKey.swift */, 879310232A2FF28200FDD061 /* ImageNameProperty.swift */, @@ -592,8 +579,7 @@ 87C0BADB2A03C50200A02978 /* MainTab */ = { isa = PBXGroup; children = ( - 871F09EF2A11979F00F96394 /* View */, - 871F09F02A1197A700F96394 /* ViewMdels */, + 87ABC58029908B17003E94F3 /* MainTabView.swift */, ); path = MainTab; sourceTree = ""; @@ -650,7 +636,6 @@ 874EF931297CB4C600C94233 /* GoogleService-Info.plist */, 87EE8D49297A1369005CCB6F /* CommonWalletApp.swift */, 87EE8D7C297A1790005CCB6F /* AppDelegate.swift */, - 87EE8D4B297A1369005CCB6F /* ContentView.swift */, 874C19792A58D6F6002812D5 /* Models */, 87ABC57C29907CD3003E94F3 /* Sceans */, 87ABC57D29907DA2003E94F3 /* ViewTools */, @@ -840,7 +825,6 @@ files = ( 87402F4329F377D70007320D /* FireStoreUserManaging.swift in Sources */, 879310242A2FF28200FDD061 /* ImageNameProperty.swift in Sources */, - 871F09EE2A11979600F96394 /* MainTabViewModel.swift in Sources */, 874EF93F297D04DF00C94233 /* UserDefaultsKey.swift in Sources */, 87E5E9342A2E9857002CF7B2 /* MyNameEditView.swift in Sources */, 87EE8D7D297A1790005CCB6F /* AppDelegate.swift in Sources */, @@ -877,7 +861,6 @@ 872652F6297BB8AB002C76D6 /* SignInViewModel.swift in Sources */, 87391E50298A189900897A96 /* String.swift in Sources */, 87F53FE0297EA44E00293176 /* FireStoreTransactionManager.swift in Sources */, - 87EE8D4C297A1369005CCB6F /* ContentView.swift in Sources */, 87CDAABC297E6ADB00F52887 /* AccountView.swift in Sources */, 879379E0298B444500D3A47B /* ConnectPartnerView.swift in Sources */, 879379EF298BBDB800D3A47B /* PartnerNameEditViewModel.swift in Sources */, @@ -932,7 +915,6 @@ 8737FCEA297E0BDF0064E40D /* LaunchScreen.swift in Sources */, 87830E70297A1AB900184A7C /* SignInTests.swift in Sources */, 87F53FE1297EA44E00293176 /* FireStoreTransactionManager.swift in Sources */, - 87830E7B297A1C6A00184A7C /* ContentView.swift in Sources */, 87C162DC2A2ACEA300382061 /* Transaction.swift in Sources */, 87CDAAC0297E8CF900F52887 /* AddTransactionView.swift in Sources */, 87CDAAB6297E5C8000F52887 /* CommonWalletViewModel.swift in Sources */, diff --git a/CommonWallet/ContentView.swift b/CommonWallet/ContentView.swift deleted file mode 100644 index 19d6bae..0000000 --- a/CommonWallet/ContentView.swift +++ /dev/null @@ -1,70 +0,0 @@ -// -// ContentView.swift -// CommonWallet -// -// Created by 前田航汰 on 2023/01/20. -// - -import SwiftUI -import FirebaseAuth - -struct ContentView: View { - let authManager = AuthManager() - @State var fireStoreUserManager = FireStoreUserManager() - @State var user: User? - - var body: some View { - VStack { - Image(systemName: "globe") - .imageScale(.large) - .foregroundColor(.accentColor) - Text("Hello, world!") - - Text(user?.id ?? "") - Text(user?.name ?? "") - Text(user?.email ?? "") - - Button(action: { - Task { - do { - try await authManager.signOut() - } catch { - print("サインアウト失敗", error) - } - } - }) { - Text("サインアウト") - } - - Button(action: { - Task { - do { - try await authManager.deleteUser() - } catch { - print("アカウント削除失敗", error) - } - } - }) { - Text("アカウント削除") - } - - } - .padding() - .onAppear { - Task { - let uid = Auth.auth().currentUser!.uid - fireStoreUserManager.realtimeFetchInfo(userId: uid, completion: { userr, error in - if let user = userr { - self.user = user - } - }) - } - } - } -} - -struct ContentView_Previews: PreviewProvider { - static var previews: some View { - ContentView() - } -} diff --git a/CommonWallet/Models/Domain/Partner.swift b/CommonWallet/Models/Domain/Partner.swift index 5988ce9..ecbf90b 100644 --- a/CommonWallet/Models/Domain/Partner.swift +++ b/CommonWallet/Models/Domain/Partner.swift @@ -6,9 +6,9 @@ import Foundation struct Partner { - var userId: String + var userId: String? var userName: String - var shareNumber: String - var iconPath: String - var iconData: Data + var shareNumber: String? + var iconPath: String? + var iconData: Data? } diff --git a/CommonWallet/Models/Domain/User.swift b/CommonWallet/Models/Domain/User.swift index 77a4d2f..6da35b7 100644 --- a/CommonWallet/Models/Domain/User.swift +++ b/CommonWallet/Models/Domain/User.swift @@ -11,11 +11,11 @@ struct User: Codable, Identifiable { // TODO: @DocumentID付けときたい // @DocumentID var id : String? = UUID().uuidString - var id : String = UUID().uuidString + var id : String var name: String - var email: String var shareNumber: String // 共有番号 var iconPath: String // アイコンのパス情報 + var iconData: Data? // アイコンのパス情報 var createdAt: Date? // アカウント作成日時 var partnerUserId: String? var partnerName: String? @@ -24,17 +24,18 @@ struct User: Codable, Identifiable { var oldestResolvedDate: Date? // 精算の最も古い日時 var partnerShareNumber: String? - enum CodingKeys: String, CodingKey { - case id - case name - case email - case shareNumber - case iconPath - case createdAt - case oldestResolvedDate - case partnerUserId - case partnerName - case partnerShareNumber - } +// enum CodingKeys: String, CodingKey { +// case id +// case name +// case email +// case shareNumber +// case iconPath +// case iconData +// case createdAt +// case oldestResolvedDate +// case partnerUserId +// case partnerName +// case partnerShareNumber +// } } diff --git a/CommonWallet/Models/Firebase/Firebase/AuthManager.swift b/CommonWallet/Models/Firebase/Firebase/AuthManager.swift index 9e8e384..07015c2 100644 --- a/CommonWallet/Models/Firebase/Firebase/AuthManager.swift +++ b/CommonWallet/Models/Firebase/Firebase/AuthManager.swift @@ -5,164 +5,11 @@ import Foundation import FirebaseAuth -import Firebase -import FirebaseFirestore class AuthManager: AuthManaging { - private static let shared = AuthManager() - private let db = Firestore.firestore() - private var fireStoreUserManager = FireStoreUserManager() - private var userDefaultsManager = UserDefaultsManager() - private var storageManager = StorageManager() - - // MARK: - サインイン処理 - func signIn(email:String, password:String) async throws { - - var userId = String() - var fireStoreError: Error! - - do { - // 通信して認証を行う - let result = try await Auth.auth().signIn(withEmail: email, password: password) - userId = result.user.uid - } catch { - throw FirebaseErrorType.Auth(error as NSError) - } - - // サインインと同時に、UserDefaultsの情報も追加する処理 - fireStoreUserManager.realtimeFetchInfo(userId: userId, completion: { user, error in - if let user = user { - self.userDefaultsManager.setUser(user: user) - } else { - fireStoreError = error - } - }) - if let error = fireStoreError { - throw error - } - - userDefaultsManager.setIsSignedIn(isSignedIn: true) - - } - - // MARK: - サインアウト処理 - func signOut() async throws { - - var fireStoreError: Error! - - guard let userId = Auth.auth().currentUser?.uid else { - throw NSError(domain: "サインインができていません。", code: 0) - } - - // Authのサインアウト処理 - do { - try Auth.auth().signOut() - userDefaultsManager.clearUser() - } catch { - throw FirebaseErrorType.Auth(error as NSError) - } - - // サインアウトと同時に、UserDefaultsの情報も削除する処理 - fireStoreUserManager.realtimeFetchInfo(userId: userId, completion: { user, error in - if let user = user { - self.userDefaultsManager.setUser(user: user) - } else { - fireStoreError = error - } - }) - if let error = fireStoreError { - throw error - } - - userDefaultsManager.setIsSignedIn(isSignedIn: false) - - } - - // MARK: - アカウント登録処理 - func createUser(email: String, password: String, name: String, shareNumber: String) async throws { - - var userId = String() - var fireStoreError: Error! - // 20枚サンプル画像がある下のパスから、ランダムに取得 - let sampleMyIconPath = "icon-sample-images/sample\(Int.random(in: 1...20)).jpeg" - let samplePartnerIconPath = "icon-sample-images/initial-partner-icon.jpeg" - - // FirebaseAuthへのアカウント登録 - do { - let result = try await Auth.auth().createUser(withEmail: email, password: password) - userId = result.user.uid - } catch { - throw FirebaseErrorType.Auth(error as NSError) - } - - // FireStoreへのアカウント情報追加 - do { - try await fireStoreUserManager.createUser(userId: userId, userName: name, email: email, iconPath: sampleMyIconPath, shareNumber: shareNumber) - } catch { - throw FirebaseErrorType.FireStore(error as NSError) - } - - // sampleIconを取得して、ユーザーデフォルトに入れる - // 自分のアイコン - storageManager.download(path: sampleMyIconPath, completion: { data, error in - if let data = data { - self.userDefaultsManager.setMyIcon(path: sampleMyIconPath, imageData: data) - } else { - print("AuthManager: アカウント作成時、サンプルアイコンエラー") - - } - }) - // パートナーのアイコン - storageManager.download(path: samplePartnerIconPath, completion: { data, error in - if let data = data { - self.userDefaultsManager.setPartnerIcon(path: samplePartnerIconPath, imageData: data) - } else { - print("AuthManager: アカウント作成時、サンプルアイコンエラー") - } - }) - - // アカウント登録と同時に、UserDefaultsの情報も追加する処理 - fireStoreUserManager.realtimeFetchInfo(userId: userId, completion: { user, error in - if let user = user { - self.userDefaultsManager.setUser(user: user) - } else { - fireStoreError = error - } - }) - if let error = fireStoreError { - throw error - } - - userDefaultsManager.setIsSignedIn(isSignedIn: true) - - } - - // MARK: - アカウント削除処理 - func deleteUser() async throws { - - guard let userId = Auth.auth().currentUser?.uid else { - throw FirebaseErrorType.other("uidが見つからない") - } - - // ①FireStoreのユーザデータ削除。この順番でないとFireStoreのユーザデータが削除できない - do { - try await fireStoreUserManager.deleteUser(userId: userId) - // アカウント削除と同時に、UserDefaultsの情報も削除する処理 - userDefaultsManager.clearUser() - } catch { - throw FirebaseErrorType.FireStore(error as NSError) - } - - // ②FirebaseAuthのユーザデータ削除。この順番でないとFireStoreのユーザデータが削除できない - do { - try await Auth.auth().currentUser?.delete() - userDefaultsManager.clearUser() - } catch { - throw FirebaseErrorType.Auth(error as NSError) - } - - userDefaultsManager.setIsSignedIn(isSignedIn: false) + func signInAnonymously() async throws -> AuthDataResult { + return try await Auth.auth().signInAnonymously() } } diff --git a/CommonWallet/Models/Firebase/Firebase/FireStoreTransactionManager.swift b/CommonWallet/Models/Firebase/Firebase/FireStoreTransactionManager.swift index 5dd9da3..19509d5 100644 --- a/CommonWallet/Models/Firebase/Firebase/FireStoreTransactionManager.swift +++ b/CommonWallet/Models/Firebase/Firebase/FireStoreTransactionManager.swift @@ -48,7 +48,6 @@ struct FireStoreTransactionManager: FireStoreTransactionManaging { - parameter resolvedAt: 精算日時 */ func updateResolvedAt(transactionIds: [String], resolvedAt: Date) async throws { - let splitTransactionIds = transactionIds.splitIntoChunks(ofSize: 300) for transactionIds in splitTransactionIds { let batch = db.batch() @@ -99,16 +98,95 @@ struct FireStoreTransactionManager: FireStoreTransactionManaging { .setData(data, merge: true) } + /** + 複数のFireStorageのトランザクションを上書きする + - parameter transaction: 上書きするtransactionデータの配列 + */ + func updateTransactions(transactions: [Transaction]) async throws { + let splitTransactions = transactions.splitIntoChunks(ofSize: 300) + + for transactions in splitTransactions { + let batch = db.batch() + for transaction in transactions { + let document = db.collection("Transactions").document(transaction.id) + let data: Dictionary = ["id": transaction.id, + "creditorId": transaction.creditorId ?? NSNull(), + "debtorId": transaction.debtorId ?? NSNull(), + "title": transaction.title, + "description": transaction.description, + "amount": transaction.amount, + "createdAt": transaction.createdAt, + "resolvedAt": transaction.resolvedAt ?? NSNull()] + batch.updateData(data, forDocument: document) + } + try await batch.commit() + } + } + + /** + FireStorageトランザクションのCreditorをNullにする + - parameter transaction: Nullにするtransactionデータの配列 + */ + func updateCreditorNullOnTransactionIds(transactionIds: [String]) async throws { + let creditorNullOnTransaction: Dictionary = ["creditorId": NSNull()] + let splitTransactionIds = transactionIds.splitIntoChunks(ofSize: 300) + + for transactionIds in splitTransactionIds { + let batch = db.batch() + for transactionId in transactionIds { + let document = db.collection("Transactions").document(transactionId) + batch.updateData(creditorNullOnTransaction, forDocument: document) + } + try await batch.commit() + } + } + + /** + FireStorageトランザクションのdebtorをNullにする + - parameter transaction: Nullにするtransactionデータの配列 + */ + func updateDebtorNullOnTransactionIds(transactionIds: [String]) async throws { + let creditorNullOnTransaction: Dictionary = ["debtorId": NSNull()] + let splitTransactionIds = transactionIds.splitIntoChunks(ofSize: 300) + + for transactionIds in splitTransactionIds { + let batch = db.batch() + for transactionId in transactionIds { + let document = db.collection("Transactions").document(transactionId) + batch.updateData(creditorNullOnTransaction, forDocument: document) + } + try await batch.commit() + } + } + // MARK: - Delete /** - FireStorageのトランザクションを削除する + 単一のFireStorageのトランザクションを削除する - parameter transactionId: 削除するtransactionId */ func deleteTransaction(transactionId: String) async throws { try await db.collection("Transactions").document(transactionId).delete() } + /** + 複数のFireStorageのトランザクションを削除する + - Description + - アカウント削除する際に利用 + - parameter transactionIds: 削除するtransactionIdの配列 + */ + func deleteTransactions(transactionIds: [String]) async throws { + let splitTransactionIds = transactionIds.splitIntoChunks(ofSize: 300) + for transactionIds in splitTransactionIds { + let batch = db.batch() + for transactionId in transactionIds { + let document = db.collection("Transactions").document(transactionId) + batch.deleteDocument(document) + } + try await batch.commit() + } + } + // MARK: - GET /** @@ -242,12 +320,8 @@ struct FireStoreTransactionManager: FireStoreTransactionManaging { let querySnapshot = try await db.collection("Transactions") .whereField("resolvedAt", isNotEqualTo: NSNull()) .whereField("creditorId", in: [partnerUserId, myUserId]) -// .order(by: "createdAt") -// .limit(to: 1) .getDocuments() - print("here") - // トランザクションを時系列ごとに並べ替える let sortedDocuments = querySnapshot.documents.sorted(by: { (a, b) -> Bool in return (a.get("createdAt") as? Timestamp)?.dateValue() ?? currentDate < (b.get("createdAt") as? Timestamp)?.dateValue() ?? currentDate diff --git a/CommonWallet/Models/Firebase/Firebase/FireStoreUserManager.swift b/CommonWallet/Models/Firebase/Firebase/FireStoreUserManager.swift index 1df87a2..40a4407 100644 --- a/CommonWallet/Models/Firebase/Firebase/FireStoreUserManager.swift +++ b/CommonWallet/Models/Firebase/Firebase/FireStoreUserManager.swift @@ -12,21 +12,18 @@ import FirebaseFirestoreSwift struct FireStoreUserManager: FireStoreUserManaging { private let db = Firestore.firestore() - private var userDefaultsManager = UserDefaultsManager() // MARK: POST /** User情報を初期登録 - parameter userId: ユーザーID - parameter userName: ユーザー名 - - parameter email: メール - parameter iconPath: アイコンのパス - parameter shareNumber: 共有番号 */ - func createUser(userId: String, userName: String, email: String, iconPath: String, shareNumber: String) async throws { + func createUser(userId: String, userName: String, iconPath: String, shareNumber: String) async throws { let user: Dictionary = ["id": userId, "name": userName, - "email": email, "iconPath": iconPath, "shareNumber": shareNumber, "createdAt": Timestamp(), @@ -85,7 +82,6 @@ struct FireStoreUserManager: FireStoreUserManaging { guard let data = snapShot?.data(), let userId = data["id"] as? String, let userName = data["name"] as? String, - let email = data["email"] as? String, let iconPath = data["iconPath"] as? String, let shareNumber = data["shareNumber"] as? String, let createdAt = data["createdAt"] as? Timestamp else { return } @@ -94,7 +90,7 @@ struct FireStoreUserManager: FireStoreUserManaging { let partnerName = data["partnerName"] as? String let partnerShareNumber = data["partnerShareNumber"] as? String - let user = User(id: userId, name: userName, email: email, shareNumber: shareNumber, iconPath: iconPath, createdAt: createdAt.dateValue(), partnerUserId: partnerUserId, partnerName: partnerName, partnerShareNumber: partnerShareNumber) + let user = User(id: userId, name: userName, shareNumber: shareNumber, iconPath: iconPath, createdAt: createdAt.dateValue(), partnerUserId: partnerUserId, partnerName: partnerName, partnerShareNumber: partnerShareNumber) completion(user, nil) } diff --git a/CommonWallet/Models/Firebase/Firebase/ShareNumberManager.swift b/CommonWallet/Models/Firebase/Firebase/ShareNumberManager.swift index cc1ff6c..52183e7 100644 --- a/CommonWallet/Models/Firebase/Firebase/ShareNumberManager.swift +++ b/CommonWallet/Models/Firebase/Firebase/ShareNumberManager.swift @@ -11,43 +11,36 @@ class ShareNumberManager: ShareNumberManaging { private let db = Firestore.firestore() - /* + /** 12桁をランダムで生成 */ - func createShareNumber() async -> String { + func createShareNumber() async throws -> String { var shareNumber = createRandom16NumberString() - var duplicateCheck = await checkDuplicateNumber(number: shareNumber) + var duplicateCheck = try await checkDuplicateNumber(number: shareNumber) // もしshareNumberが重複した場合に作り直す処理 while !duplicateCheck { sleep(1) shareNumber = createRandom16NumberString() - duplicateCheck = await checkDuplicateNumber(number: shareNumber) + duplicateCheck = try await checkDuplicateNumber(number: shareNumber) } return shareNumber } - private func checkDuplicateNumber(number: String) async -> Bool { - - do { - let snapShots = try await db.collection("Users") - .whereField("shareNumber", isEqualTo: number) - .getDocuments() - - // もしドキュメントに同じ値が存在しなければtrueを返す - if snapShots.documents.count == 0 { - return true - } else { - return false - } - } catch { - print("Firebase Check Duplicate Number Error") - } + private func checkDuplicateNumber(number: String) async throws -> Bool { + let snapShots = try await db.collection("Users") + .whereField("shareNumber", isEqualTo: number) + .getDocuments() - return false + // もしドキュメントに同じ値が存在しなければtrueを返す + if snapShots.documents.count == 0 { + return true + } else { + return false + } } // 12桁の乱数を生成する関数 diff --git a/CommonWallet/Models/Firebase/Protocol/AuthManaging.swift b/CommonWallet/Models/Firebase/Protocol/AuthManaging.swift index 01881a8..a4166d6 100644 --- a/CommonWallet/Models/Firebase/Protocol/AuthManaging.swift +++ b/CommonWallet/Models/Firebase/Protocol/AuthManaging.swift @@ -4,10 +4,8 @@ // import Foundation +import FirebaseAuth protocol AuthManaging { - func signIn(email:String, password:String) async throws - func signOut() async throws - func createUser(email: String, password: String, name: String, shareNumber: String) async throws - func deleteUser() async throws + func signInAnonymously() async throws -> AuthDataResult } diff --git a/CommonWallet/Models/Firebase/Protocol/FireStoreTransactionManaging.swift b/CommonWallet/Models/Firebase/Protocol/FireStoreTransactionManaging.swift index ad0fa20..abfed35 100644 --- a/CommonWallet/Models/Firebase/Protocol/FireStoreTransactionManaging.swift +++ b/CommonWallet/Models/Firebase/Protocol/FireStoreTransactionManaging.swift @@ -14,10 +14,14 @@ protocol FireStoreTransactionManaging { func updateResolvedAt(transactionIds: [String], resolvedAt: Date) async throws func updateResolvedAt(transactionId: String, resolvedAt: Date) async throws func updateTransaction(transaction: Transaction) async throws + func updateTransactions(transactions: [Transaction]) async throws func updateCancelResolvedAt(transactionId: String) async throws + func updateCreditorNullOnTransactionIds(transactionIds: [String]) async throws + func updateDebtorNullOnTransactionIds(transactionIds: [String]) async throws // DELETE func deleteTransaction(transactionId: String) async throws + func deleteTransactions(transactionIds: [String]) async throws // GET func fetchTransactions(myUserId: String, partnerUserId: String?, completion: @escaping([Transaction]?, Error?) -> Void) diff --git a/CommonWallet/Models/Firebase/Protocol/FireStoreUserManaging.swift b/CommonWallet/Models/Firebase/Protocol/FireStoreUserManaging.swift index a7239e8..61121cc 100644 --- a/CommonWallet/Models/Firebase/Protocol/FireStoreUserManaging.swift +++ b/CommonWallet/Models/Firebase/Protocol/FireStoreUserManaging.swift @@ -8,14 +8,11 @@ import Foundation protocol FireStoreUserManaging { // MARK: POST - func createUser(userId: String, userName: String, email: String, iconPath: String, shareNumber: String) async throws + func createUser(userId: String, userName: String, iconPath: String, shareNumber: String) async throws // MARK: PUT func putUserName(userId: String, userName: String) async throws - // MARK: Delete - func deleteUser(userId: String) async throws - // MARK: Fetch func fetchInfo(userId: String) async throws -> User? func realtimeFetchInfo(userId: String, completion: @escaping(User?, Error?) -> Void) diff --git a/CommonWallet/Models/Firebase/Protocol/ShareNumberManaging.swift b/CommonWallet/Models/Firebase/Protocol/ShareNumberManaging.swift index dc36f07..e528091 100644 --- a/CommonWallet/Models/Firebase/Protocol/ShareNumberManaging.swift +++ b/CommonWallet/Models/Firebase/Protocol/ShareNumberManaging.swift @@ -6,5 +6,5 @@ import Foundation protocol ShareNumberManaging { - func createShareNumber() async -> String + func createShareNumber() async throws -> String } diff --git a/CommonWallet/Models/UserDefaults/UserDefaultsManaging.swift b/CommonWallet/Models/UserDefaults/Protocol/UserDefaultsManaging.swift similarity index 93% rename from CommonWallet/Models/UserDefaults/UserDefaultsManaging.swift rename to CommonWallet/Models/UserDefaults/Protocol/UserDefaultsManaging.swift index 45b7d89..0e254b8 100644 --- a/CommonWallet/Models/UserDefaults/UserDefaultsManaging.swift +++ b/CommonWallet/Models/UserDefaults/Protocol/UserDefaultsManaging.swift @@ -10,7 +10,8 @@ protocol UserDefaultsManaging { var userDefaultsKey: UserDefaultsKey { get } // MARK: - Setter - func setUser(user: User) + func createUser(user: User) + func createPartner(partner: Partner) func setMyUserName(userName: String) func setPartner(partner: Partner) func setPartner(userId: String, name: String, modifiedName: String, iconPath: String, iconData: Data, shareNumber: String) @@ -42,6 +43,6 @@ protocol UserDefaultsManaging { // MARK: Delete func clearUser() - func deletePartner() + func clearPartner() } diff --git a/CommonWallet/Models/UserDefaults/UserDefaultsKey.swift b/CommonWallet/Models/UserDefaults/UserDefaultsKey.swift index 993a0ea..7b875ab 100644 --- a/CommonWallet/Models/UserDefaults/UserDefaultsKey.swift +++ b/CommonWallet/Models/UserDefaults/UserDefaultsKey.swift @@ -35,7 +35,6 @@ struct UserDefaultsKey { let userId = "userId" let userName = "userName" let shareNumber = "shareNumber" - let email = "email" let myIconPath = "myIconPath" let myIconData = "myIconData" let createdAt = "createdAt" diff --git a/CommonWallet/Models/UserDefaults/UserDefaultsManager.swift b/CommonWallet/Models/UserDefaults/UserDefaultsManager.swift index 55a58f0..a957a9c 100644 --- a/CommonWallet/Models/UserDefaults/UserDefaultsManager.swift +++ b/CommonWallet/Models/UserDefaults/UserDefaultsManager.swift @@ -11,24 +11,21 @@ struct UserDefaultsManager: UserDefaultsManaging { internal let userDefaultsKey = UserDefaultsKey() // MARK: - Setter - func setUser(user: User) { + func createUser(user: User) { + // 非オプショナル UserDefaults.standard.set(user.id, forKey: userDefaultsKey.userId) UserDefaults.standard.set(user.name, forKey: userDefaultsKey.userName) - UserDefaults.standard.set(user.email, forKey: userDefaultsKey.email) UserDefaults.standard.set(user.iconPath, forKey: userDefaultsKey.myIconPath) UserDefaults.standard.set(user.shareNumber, forKey: userDefaultsKey.shareNumber) + UserDefaults.standard.set(user.createdAt, forKey: userDefaultsKey.createdAt) + } - if let partnerUserId = user.partnerUserId { - UserDefaults.standard.set(partnerUserId, forKey: userDefaultsKey.partnerUserId) - } - - if let partnerName = user.partnerName { - UserDefaults.standard.set(partnerName, forKey: userDefaultsKey.partnerName) - } - - if let createdAt = user.createdAt { - UserDefaults.standard.set(createdAt, forKey: userDefaultsKey.createdAt) - } + func createPartner(partner: Partner) { + UserDefaults.standard.set(partner.userId, forKey: userDefaultsKey.partnerUserId) + UserDefaults.standard.set(partner.userName, forKey: userDefaultsKey.partnerModifiedName) + UserDefaults.standard.set(partner.iconPath, forKey: userDefaultsKey.partnerIconPath) + UserDefaults.standard.set(partner.iconData, forKey: userDefaultsKey.partnerIconData) + UserDefaults.standard.set(partner.shareNumber, forKey: userDefaultsKey.partnerShareNumber) } func setMyUserName(userName: String) { @@ -101,7 +98,6 @@ struct UserDefaultsManager: UserDefaultsManaging { // MARK: - Getter func getUser() -> User? { guard let userName = UserDefaults.standard.string(forKey: userDefaultsKey.userName), - let email = UserDefaults.standard.string(forKey: userDefaultsKey.email), let userId = UserDefaults.standard.string(forKey: userDefaultsKey.userId), let myIconPath = UserDefaults.standard.string(forKey: userDefaultsKey.myIconPath), let shareNumber = UserDefaults.standard.string(forKey: userDefaultsKey.shareNumber) @@ -113,7 +109,7 @@ struct UserDefaultsManager: UserDefaultsManaging { let partnerName = UserDefaults.standard.string(forKey: userDefaultsKey.partnerName) let createdAt = UserDefaults.standard.object(forKey: userDefaultsKey.createdAt) as? Date - let user = User(id: userId, name: userName, email: email, shareNumber: shareNumber, iconPath: myIconPath, createdAt: createdAt, partnerUserId: partnerUserId, partnerName: partnerName) + let user = User(id: userId, name: userName, shareNumber: shareNumber, iconPath: myIconPath, createdAt: createdAt, partnerUserId: partnerUserId, partnerName: partnerName) return user } @@ -171,17 +167,22 @@ struct UserDefaultsManager: UserDefaultsManaging { // MARK: Delete func clearUser() { + // Myユーザー情報 UserDefaults.standard.set(nil, forKey: userDefaultsKey.userId) UserDefaults.standard.set(nil, forKey: userDefaultsKey.userName) - UserDefaults.standard.set(nil, forKey: userDefaultsKey.email) UserDefaults.standard.set(nil, forKey: userDefaultsKey.shareNumber) - UserDefaults.standard.set(nil, forKey: userDefaultsKey.partnerUserId) - UserDefaults.standard.set(nil, forKey: userDefaultsKey.partnerName) + UserDefaults.standard.set(nil, forKey: userDefaultsKey.myIconPath) + UserDefaults.standard.set(nil, forKey: userDefaultsKey.myIconData) + UserDefaults.standard.set(nil, forKey: userDefaultsKey.createdAt) + UserDefaults.standard.set(nil, forKey: userDefaultsKey.oldestResolvedDate) } - func deletePartner() { + func clearPartner() { UserDefaults.standard.set(nil, forKey: userDefaultsKey.partnerUserId) UserDefaults.standard.set(nil, forKey: userDefaultsKey.partnerName) + UserDefaults.standard.set(nil, forKey: userDefaultsKey.partnerIconPath) + UserDefaults.standard.set(nil, forKey: userDefaultsKey.partnerIconPath) + UserDefaults.standard.set(nil, forKey: userDefaultsKey.partnerModifiedName) UserDefaults.standard.set(nil, forKey: userDefaultsKey.partnerShareNumber) } diff --git a/CommonWallet/Sceans/Authentication/View/CreateUserView.swift b/CommonWallet/Sceans/Authentication/View/CreateUserView.swift index 291269d..8582774 100644 --- a/CommonWallet/Sceans/Authentication/View/CreateUserView.swift +++ b/CommonWallet/Sceans/Authentication/View/CreateUserView.swift @@ -5,49 +5,49 @@ import SwiftUI -struct CreateUserView: View { - - @ObservedObject var createUserViewModel = CreateUserViewModel() - - @State var name = "" - @State var mailAdress = "" - @State var password = "" - @State private var isSecondView: Bool = false - @Binding var isShow: Bool - - var body: some View { - VStack { - Text("アカウント登録") - TextField("名前", text: $name) - TextField("メールアドレス", text: $mailAdress) - TextField("パスワード", text: $password) - - Button(action: { - - Task { - await createUserViewModel.createUser(email: mailAdress, password: password, name: name, complition: { isSuccess, message in - isSecondView = isSuccess - print(isSuccess, message) - }) - } - - }) { - Text("アカウント登録").fontWeight(.bold).font(.largeTitle) - } - .fullScreenCover(isPresented: self.$isSecondView) { - // trueになれば下からふわっと表示 - MainTabView() - } - - Button { - isShow = false - } label: { - Text("ログインはこちら") - } - } - .padding() - } -} +//struct CreateUserView: View { +// +// @ObservedObject var createUserViewModel = CreateUserViewModel() +// +// @State var name = "" +// @State var mailAdress = "" +// @State var password = "" +// @State private var isSecondView: Bool = false +// @Binding var isShow: Bool +// +// var body: some View { +// VStack { +// Text("アカウント登録") +// TextField("名前", text: $name) +// TextField("メールアドレス", text: $mailAdress) +// TextField("パスワード", text: $password) +// +// Button(action: { +// +// Task { +// await createUserViewModel.createUser(email: mailAdress, password: password, name: name, complition: { isSuccess, message in +// isSecondView = isSuccess +// print(isSuccess, message) +// }) +// } +// +// }) { +// Text("アカウント登録").fontWeight(.bold).font(.largeTitle) +// } +// .fullScreenCover(isPresented: self.$isSecondView) { +// // trueになれば下からふわっと表示 +// MainTabView() +// } +// +// Button { +// isShow = false +// } label: { +// Text("ログインはこちら") +// } +// } +// .padding() +// } +//} //struct CreateUserView_Previews: PreviewProvider { // static var previews: some View { diff --git a/CommonWallet/Sceans/Authentication/View/SignInView.swift b/CommonWallet/Sceans/Authentication/View/SignInView.swift index dafdea7..68cf34f 100644 --- a/CommonWallet/Sceans/Authentication/View/SignInView.swift +++ b/CommonWallet/Sceans/Authentication/View/SignInView.swift @@ -3,53 +3,53 @@ // CommonWallet // -import SwiftUI -import FirebaseAuth - -struct SignInView: View { - - @ObservedObject var signInViewModel = SignInViewModel() - - @State var email = "" - @State var password = "" - @State private var isSecondView: Bool = false - @State private var isCreateUserView: Bool = false - - var body: some View { - VStack { - Text("ログイン") - TextField("メールアドレス", text: $email) - TextField("パスワード", text: $password) - - Button(action: { - Task { - await signInViewModel.signIn(email: email, password: password, complition:{ isSuccess, message in - print(isSuccess, message) - }) - } - }) { - Text("ログイン").fontWeight(.bold).font(.largeTitle) - } - .fullScreenCover(isPresented: self.$isSecondView) { - MainTabView() - } - - Button { - isCreateUserView.toggle() - } label: { - Text("アカウント登録はこちら") - } - .fullScreenCover(isPresented: $isCreateUserView) { - CreateUserView(isShow: $isCreateUserView) - } - } - .padding() - } - -} - -struct SignInView_Previews: PreviewProvider { - static var previews: some View { - SignInView() - } -} +//import SwiftUI +//import FirebaseAuth +// +//struct SignInView: View { +// +// @ObservedObject var signInViewModel = SignInViewModel() +// +// @State var email = "" +// @State var password = "" +// @State private var isSecondView: Bool = false +// @State private var isCreateUserView: Bool = false +// +// var body: some View { +// VStack { +// Text("ログイン") +// TextField("メールアドレス", text: $email) +// TextField("パスワード", text: $password) +// +// Button(action: { +// Task { +// await signInViewModel.signIn(email: email, password: password, complition:{ isSuccess, message in +// print(isSuccess, message) +// }) +// } +// }) { +// Text("ログイン").fontWeight(.bold).font(.largeTitle) +// } +// .fullScreenCover(isPresented: self.$isSecondView) { +// MainTabView() +// } +// +// Button { +// isCreateUserView.toggle() +// } label: { +// Text("アカウント登録はこちら") +// } +// .fullScreenCover(isPresented: $isCreateUserView) { +// //CreateUserView(isShow: $isCreateUserView) +// } +// } +// .padding() +// } +// +//} +// +//struct SignInView_Previews: PreviewProvider { +// static var previews: some View { +// SignInView() +// } +//} diff --git a/CommonWallet/Sceans/Authentication/ViewModels/CreateUserViewModel.swift b/CommonWallet/Sceans/Authentication/ViewModels/CreateUserViewModel.swift index d0e4970..c7bffea 100644 --- a/CommonWallet/Sceans/Authentication/ViewModels/CreateUserViewModel.swift +++ b/CommonWallet/Sceans/Authentication/ViewModels/CreateUserViewModel.swift @@ -5,31 +5,54 @@ import Foundation -class CreateUserViewModel: ObservableObject { - let authManager = AuthManager() - let errorMessageManegar = FirebaseErrorManager() - let shareNumberManager = ShareNumberManager() - - func createUser(email: String, password: String, name: String, complition: @escaping (Bool, String) -> Void) async { - - // ユーザーの共有番号を作る - var shareNumber = "" - do { - shareNumber = await shareNumberManager.createShareNumber() - } - - do { - try await authManager.createUser(email: email, password: password, name: name, shareNumber: shareNumber) - complition(true, "アカウント登録成功") - - } catch FirebaseErrorType.Auth(let error) { - let errorMessage = errorMessageManegar.getAuthErrorMessage(error) - complition(false, errorMessage) - } catch FirebaseErrorType.FireStore(let error) { - let errorMessage = errorMessageManegar.getFireStoreErrorMessage(error) - complition(false, errorMessage) - } catch { - complition(false, "不明なエラー") - } - } -} +//class CreateUserViewModel: ObservableObject { +// let authManager = AuthManager() +// let errorMessageManegar = FirebaseErrorManager() +// let shareNumberManager = ShareNumberManager() +// +// func createUser(email: String, password: String, name: String, complition: @escaping (Bool, String) -> Void) async { +// +// // ユーザーの共有番号を作る +// var shareNumber = "" +// do { +// shareNumber = await shareNumberManager.createShareNumber() +// } +// +// do { +// try await authManager.createUser(email: email, password: password, name: name, shareNumber: shareNumber) +// complition(true, "アカウント登録成功") +// +// } catch FirebaseErrorType.Auth(let error) { +// let errorMessage = errorMessageManegar.getAuthErrorMessage(error) +// complition(false, errorMessage) +// } catch FirebaseErrorType.FireStore(let error) { +// let errorMessage = errorMessageManegar.getFireStoreErrorMessage(error) +// complition(false, errorMessage) +// } catch { +// complition(false, "不明なエラー") +// } +// } +// +// func createUser() async { +// +// // ユーザーの共有番号を作る +// var shareNumber = "" +// do { +// shareNumber = await shareNumberManager.createShareNumber() +// } +// +// do { +// try await authManager.createUser(email: email, password: password, name: name, shareNumber: shareNumber) +// complition(true, "アカウント登録成功") +// +// } catch FirebaseErrorType.Auth(let error) { +// let errorMessage = errorMessageManegar.getAuthErrorMessage(error) +// complition(false, errorMessage) +// } catch FirebaseErrorType.FireStore(let error) { +// let errorMessage = errorMessageManegar.getFireStoreErrorMessage(error) +// complition(false, errorMessage) +// } catch { +// complition(false, "不明なエラー") +// } +// } +//} diff --git a/CommonWallet/Sceans/Authentication/ViewModels/SignInViewModel.swift b/CommonWallet/Sceans/Authentication/ViewModels/SignInViewModel.swift index 0d1e0a3..46b1708 100644 --- a/CommonWallet/Sceans/Authentication/ViewModels/SignInViewModel.swift +++ b/CommonWallet/Sceans/Authentication/ViewModels/SignInViewModel.swift @@ -3,22 +3,22 @@ // CommonWallet // -import Foundation - -class SignInViewModel: ObservableObject { - let authManager = AuthManager() - let errorMessageManegar = FirebaseErrorManager() - - func signIn(email: String, password: String, complition: @escaping (Bool, String) -> Void) async { - do { - try await authManager.signIn(email: email, password: password) - complition(true, "サインインの成功") - } catch FirebaseErrorType.Auth(let error){ - let errorMessage = errorMessageManegar.getAuthErrorMessage(error) - complition(false, errorMessage) - } catch { - complition(false, "不明なエラー") - } - } - -} +//import Foundation +// +//class SignInViewModel: ObservableObject { +// let authManager = AuthManager() +// let errorMessageManegar = FirebaseErrorManager() +// +// func signIn(email: String, password: String, complition: @escaping (Bool, String) -> Void) async { +// do { +// try await authManager.signIn(email: email, password: password) +// complition(true, "サインインの成功") +// } catch FirebaseErrorType.Auth(let error){ +// let errorMessage = errorMessageManegar.getAuthErrorMessage(error) +// complition(false, errorMessage) +// } catch { +// complition(false, "不明なエラー") +// } +// } +// +//} diff --git a/CommonWallet/Sceans/Launch/View/LaunchScreen.swift b/CommonWallet/Sceans/Launch/View/LaunchScreen.swift index 519935a..bc2a8be 100644 --- a/CommonWallet/Sceans/Launch/View/LaunchScreen.swift +++ b/CommonWallet/Sceans/Launch/View/LaunchScreen.swift @@ -22,10 +22,11 @@ struct LaunchScreen: View { @State private var fireStoreUserManager = FireStoreUserManager() @State private var fireStorePartnerManager = FireStorePartnerManager() - @ObservedObject var launchViewModel = LaunchViewModel() + @ObservedObject var viewModel = LaunchViewModel() var body: some View { + // 既に匿名ログインが済んでいる場合 if let _ = Auth.auth().currentUser?.uid { if isMainTabViewLoading { ZStack { @@ -35,8 +36,10 @@ struct LaunchScreen: View { } .onAppear { Task { - await launchViewModel.fetchPartnerInfo() - await launchViewModel.fetchUserInfo() + await viewModel.fetchPartnerInfo() + await viewModel.fetchUserInfo() + print("アカウント作成済んでました!") + } DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { withAnimation { @@ -48,18 +51,29 @@ struct LaunchScreen: View { MainTabView() } + // 匿名ログインが済んでいない場合 } else { - if isSignInViewLoading { ZStack { Color(.red) .ignoresSafeArea() // ステータスバーまで塗り潰すために必要 + Text("アカウント作成中...") Image("Sample1") .resizable() .aspectRatio(contentMode: .fit) .padding() } .onAppear { + // アカウント作成 + Task { + do { + try await viewModel.createUser(myUserName: "ユーザー", partnerUserName: "パートナー") + print("アカウント作成しました!") + } catch { + print(#function, error) + } + } + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { withAnimation { isSignInViewLoading = false @@ -67,7 +81,8 @@ struct LaunchScreen: View { } } } else { - SignInView() + //SignInView() + MainTabView() } } } diff --git a/CommonWallet/Sceans/Launch/ViewModels/LaunchViewModel.swift b/CommonWallet/Sceans/Launch/ViewModels/LaunchViewModel.swift index d2efaea..68c3fd1 100644 --- a/CommonWallet/Sceans/Launch/ViewModels/LaunchViewModel.swift +++ b/CommonWallet/Sceans/Launch/ViewModels/LaunchViewModel.swift @@ -8,9 +8,12 @@ import FirebaseAuth class LaunchViewModel: ObservableObject { + private var authManager = AuthManager() + private var shareNumberManager = ShareNumberManager() private var fireStoreTransactionManager = FireStoreTransactionManager() private var fireStoreUserManager = FireStoreUserManager() private var fireStorePartnerManager = FireStorePartnerManager() + private var storageManager = StorageManager() private var userDefaultsManager = UserDefaultsManager() // ここでUserInfoをfetchする @@ -29,7 +32,7 @@ class LaunchViewModel: ObservableObject { print("haven't user") return } - self.userDefaultsManager.setUser(user: user) + self.userDefaultsManager.createUser(user: user) }) } @@ -49,16 +52,38 @@ class LaunchViewModel: ObservableObject { return } - let partnerUserDefaultsName = self.userDefaultsManager.getPartnerName() ?? partner.userName - self.userDefaultsManager.setPartner( - userId: partner.userId, - name: partner.userName, - modifiedName: partnerUserDefaultsName, - iconPath: partner.iconPath, - iconData: partner.iconData, - shareNumber: partner.shareNumber - ) +// let partnerUserDefaultsName = self.userDefaultsManager.getPartnerName() ?? partner.userName +// self.userDefaultsManager.setPartner( +// userId: partner.userId, +// name: partner.userName, +// modifiedName: partnerUserDefaultsName, +// iconPath: partner.iconPath, +// iconData: partner.iconData, +// shareNumber: partner.shareNumber +// ) }) } + func createUser(myUserName: String, partnerUserName: String) async throws { + // アカウント作成 + let authResult = try await authManager.signInAnonymously() + + // 自分の情報定義 + let myUserId = authResult.user.uid + let sampleMyIconPath = "icon-sample-images/sample\(Int.random(in: 1...20)).jpeg" + let samplePartnerIconPath = "icon-sample-images/initial-partner-icon.jpeg" + let sampleMyIconData = try await storageManager.download(path: sampleMyIconPath) + let samplePartnerIconData = try await storageManager.download(path: samplePartnerIconPath) + let shareNumber = try await shareNumberManager.createShareNumber() + + // トランザクションにアカウント登録 + try await fireStoreUserManager.createUser(userId: myUserId, userName: myUserName, iconPath: sampleMyIconPath, shareNumber: shareNumber) + + // Userdefaultsに保存 + let user = User(id: myUserId, name: myUserName, shareNumber: shareNumber, iconPath: sampleMyIconPath, iconData: sampleMyIconData, createdAt: Date()) + let partner = Partner(userName: partnerUserName, iconPath: samplePartnerIconPath, iconData: samplePartnerIconData) + userDefaultsManager.createUser(user: user) + userDefaultsManager.createPartner(partner: partner) + } + } diff --git a/CommonWallet/Sceans/MainTab/View/MainTabView.swift b/CommonWallet/Sceans/MainTab/MainTabView.swift similarity index 93% rename from CommonWallet/Sceans/MainTab/View/MainTabView.swift rename to CommonWallet/Sceans/MainTab/MainTabView.swift index 457bf30..651e18e 100644 --- a/CommonWallet/Sceans/MainTab/View/MainTabView.swift +++ b/CommonWallet/Sceans/MainTab/MainTabView.swift @@ -7,8 +7,6 @@ import SwiftUI struct MainTabView: View { - @ObservedObject var mainTabViewModel = MainTabViewModel() - var body: some View { TabView { CommonWalletView(viewModel: CommonWalletViewModel(fireStoreTransactionManager: FireStoreTransactionManager(), fireStoreUserManager: FireStoreUserManager())) diff --git a/CommonWallet/Sceans/MainTab/ViewMdels/MainTabViewModel.swift b/CommonWallet/Sceans/MainTab/ViewMdels/MainTabViewModel.swift deleted file mode 100644 index d2fe6b8..0000000 --- a/CommonWallet/Sceans/MainTab/ViewMdels/MainTabViewModel.swift +++ /dev/null @@ -1,9 +0,0 @@ -// -// MainTabViewModel.swift -// CommonWallet -// - -import Foundation - -class MainTabViewModel: ObservableObject { -} diff --git a/CommonWallet/Sceans/Setting/View/AccountView.swift b/CommonWallet/Sceans/Setting/View/AccountView.swift index 9058dff..ce10f1d 100644 --- a/CommonWallet/Sceans/Setting/View/AccountView.swift +++ b/CommonWallet/Sceans/Setting/View/AccountView.swift @@ -8,6 +8,7 @@ import SwiftUI struct AccountView: View { @StateObject var viewModel: AccountViewModel + @EnvironmentObject var transactionData: TransactionData @AppStorage(UserDefaultsKey().userName) private var userName = String() @AppStorage(UserDefaultsKey().myIconData) private var myIconData = Data() @@ -63,7 +64,7 @@ struct AccountView: View { Button("リセット", role: .destructive){ Task { do { - try await authManager.deleteUser() + try await viewModel.clearAccount(transactions: transactionData.transactions) } catch { print("アカウント削除", error) } @@ -75,7 +76,6 @@ struct AccountView: View { } // MARK: - Section - /** アイコンを表示するView, タップでアイコン変更 - Returns: View(Section) @@ -169,6 +169,6 @@ struct AccountView: View { struct AccountView_Previews: PreviewProvider { static var previews: some View { - AccountView(viewModel: AccountViewModel(userDefaultsManager: UserDefaultsManager(), storageManager: StorageManager())) + AccountView(viewModel: AccountViewModel(fireStoreTransactionManager: FireStoreTransactionManager(), fireStoreUserManager: FireStoreUserManager(), userDefaultsManager: UserDefaultsManager(), storageManager: StorageManager(), authManager: AuthManager())) } } diff --git a/CommonWallet/Sceans/Setting/View/SettingView.swift b/CommonWallet/Sceans/Setting/View/SettingView.swift index bcd6e67..501fb88 100644 --- a/CommonWallet/Sceans/Setting/View/SettingView.swift +++ b/CommonWallet/Sceans/Setting/View/SettingView.swift @@ -64,7 +64,7 @@ struct SettingView: View { Section { // タップ後: AccountViewへNavigation遷移 - NavigationLink(destination: AccountView(viewModel: AccountViewModel(userDefaultsManager: UserDefaultsManager(), storageManager: StorageManager()))) { + NavigationLink(destination:AccountView(viewModel: AccountViewModel(fireStoreTransactionManager: FireStoreTransactionManager(), fireStoreUserManager: FireStoreUserManager(), userDefaultsManager: UserDefaultsManager(), storageManager: StorageManager(), authManager: AuthManager()))) { HStack { Image(uiImage: UIImage(data: myIconData) ?? UIImage(named: imageNameProperty.iconNotFound)!) .resizable() diff --git a/CommonWallet/Sceans/Setting/ViewModels/AccountViewModel.swift b/CommonWallet/Sceans/Setting/ViewModels/AccountViewModel.swift index 0e1cec7..df1d316 100644 --- a/CommonWallet/Sceans/Setting/ViewModels/AccountViewModel.swift +++ b/CommonWallet/Sceans/Setting/ViewModels/AccountViewModel.swift @@ -4,16 +4,28 @@ // import Foundation +import FirebaseAuth import SwiftUI class AccountViewModel: ObservableObject { + private var fireStoreTransactionManager: FireStoreTransactionManaging + private var shareNumberManager = ShareNumberManager() + private var fireStoreUserManager: FireStoreUserManaging private var userDefaultsManager: UserDefaultsManaging private var storageManager: StorageManaging + private var authManager: AuthManaging - init(userDefaultsManager: UserDefaultsManaging, storageManager: StorageManaging) { + init(fireStoreTransactionManager: FireStoreTransactionManaging, + fireStoreUserManager: FireStoreUserManaging, + userDefaultsManager: UserDefaultsManaging, + storageManager: StorageManaging, + authManager: AuthManaging) { + self.fireStoreTransactionManager = fireStoreTransactionManager + self.fireStoreUserManager = fireStoreUserManager self.userDefaultsManager = userDefaultsManager self.storageManager = storageManager + self.authManager = authManager } /** @@ -50,4 +62,65 @@ class AccountViewModel: ObservableObject { } + /** + アカウントリセットを行う + - Description + - トランザクションの削除 + - fireStoreのUserを削除 + - authから削除 + - UserDefaultsのクリーン + - parameter transactions: 今持っている全てのトランザクション + */ + internal func clearAccount(transactions: [Transaction]) async throws { + + guard let myUserId = Auth.auth().currentUser?.uid else { return } + + // トランザクションの削除 + // パートナーが空の場合、そのトランザションは削除 + let userNullTransactionIds = transactions + .filter{ + ($0.debtorId == myUserId && $0.creditorId == nil) || + ($0.debtorId == nil && $0.creditorId == myUserId) + } + .map { $0.id } + // creditorIdに自分のIdが含まれていて、パートナーが存在する場合は、そこをnullにしてアップデート + let myCreditorTransactionIds = transactions + .filter{ ($0.creditorId == myUserId && $0.debtorId != nil) } + .map { $0.id } + // debtorIdに自分のIdが含まれていて、パートナーが存在する場合は、そこをnullにしてアップデート + let myDebtorTransactionIds = transactions + .filter{ ($0.debtorId == myUserId && $0.creditorId != nil) } + .map { $0.id } + + // ここは非同期で並列処理。関数を抜けるまでには必ず処理される。 + async let _ = fireStoreTransactionManager.deleteTransactions(transactionIds: userNullTransactionIds) + async let _ = fireStoreTransactionManager.updateCreditorNullOnTransactionIds(transactionIds: myCreditorTransactionIds) + async let _ = fireStoreTransactionManager.updateDebtorNullOnTransactionIds(transactionIds: myDebtorTransactionIds) + + // IconImageの削除 + if let myIconPath = userDefaultsManager.getMyIconImagePath() { + storageManager.deleteImage(path: myIconPath) + } + + // 初期情報定義 + let myUserName = "ユーザー" + let partnerUserName = "パートナー" + let sampleMyIconPath = "icon-sample-images/sample\(Int.random(in: 1...20)).jpeg" + let samplePartnerIconPath = "icon-sample-images/initial-partner-icon.jpeg" + let sampleMyIconData = try await storageManager.download(path: sampleMyIconPath) + let samplePartnerIconData = try await storageManager.download(path: samplePartnerIconPath) + let shareNumber = try await shareNumberManager.createShareNumber() + + // トランザクションにアカウント登録 + try await fireStoreUserManager.createUser(userId: myUserId, userName: myUserName, iconPath: sampleMyIconPath, shareNumber: shareNumber) + + // Userdefaultsに保存 + userDefaultsManager.clearUser() + userDefaultsManager.clearPartner() + let user = User(id: myUserId, name: myUserName, shareNumber: shareNumber, iconPath: sampleMyIconPath, iconData: sampleMyIconData, createdAt: Date()) + let partner = Partner(userName: partnerUserName, iconPath: samplePartnerIconPath, iconData: samplePartnerIconData) + userDefaultsManager.createUser(user: user) + userDefaultsManager.createPartner(partner: partner) + } + } diff --git a/CommonWallet/Sceans/Setting/ViewModels/PartnerInfoViewModel.swift b/CommonWallet/Sceans/Setting/ViewModels/PartnerInfoViewModel.swift index fa84f11..bf1f7a5 100644 --- a/CommonWallet/Sceans/Setting/ViewModels/PartnerInfoViewModel.swift +++ b/CommonWallet/Sceans/Setting/ViewModels/PartnerInfoViewModel.swift @@ -27,7 +27,7 @@ class PartnerInfoViewModel: ObservableObject { throw UserDefaultsError.emptyMyUserId } try await fireStorePartnerManager.deletePartner(myUserId: myUserId, partnerUserId: partnerUserId) - userDefaultsManager.deletePartner() + userDefaultsManager.clearPartner() } } From 91231b07b38c5caba061a3b4287ae5ede18b14d6 Mon Sep 17 00:00:00 2001 From: Kota Date: Sat, 8 Jul 2023 15:11:38 +0900 Subject: [PATCH 3/5] =?UTF-8?q?fix:=20addSnapshotListener=E3=81=AE?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CommonWallet.xcodeproj/project.pbxproj | 4 ++ CommonWallet/AppDelegate.swift | 1 - .../Models/CoreData/TransactionData.swift | 9 ++- CommonWallet/Models/Domain/Partner.swift | 1 + .../Protocol/UserDefaultsManaging.swift | 3 +- .../UserDefaults/UserDefaultsManager.swift | 11 ++- .../Sceans/Launch/View/LaunchScreen.swift | 8 +-- .../Launch/ViewModels/LaunchViewModel.swift | 54 +------------- CommonWallet/Sceans/MainTab/MainTabView.swift | 7 ++ .../Sceans/MainTab/MainTabViewModel.swift | 72 +++++++++++++++++++ 10 files changed, 103 insertions(+), 67 deletions(-) create mode 100644 CommonWallet/Sceans/MainTab/MainTabViewModel.swift diff --git a/CommonWallet.xcodeproj/project.pbxproj b/CommonWallet.xcodeproj/project.pbxproj index d424f29..66bae2d 100644 --- a/CommonWallet.xcodeproj/project.pbxproj +++ b/CommonWallet.xcodeproj/project.pbxproj @@ -43,6 +43,7 @@ 87402F4929F37B960007320D /* AuthManaging.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87402F4829F37B960007320D /* AuthManaging.swift */; }; 874613A62A2954A50068383B /* ImagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 874613A52A2954A50068383B /* ImagePicker.swift */; }; 874A988529F206DB007CFB74 /* UserDefaultsError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 874A988429F206DB007CFB74 /* UserDefaultsError.swift */; }; + 874C19802A5933AB002812D5 /* MainTabViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 874C197F2A5933AB002812D5 /* MainTabViewModel.swift */; }; 874DBA062A2C1392000E1FD1 /* Userdefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 874DBA052A2C1392000E1FD1 /* Userdefaults.swift */; }; 874DBA082A2C1FF8000E1FD1 /* StorageManaging.swift in Sources */ = {isa = PBXBuildFile; fileRef = 874DBA072A2C1FF8000E1FD1 /* StorageManaging.swift */; }; 874EF932297CB4C600C94233 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 874EF931297CB4C600C94233 /* GoogleService-Info.plist */; }; @@ -165,6 +166,7 @@ 87402F4829F37B960007320D /* AuthManaging.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthManaging.swift; sourceTree = ""; }; 874613A52A2954A50068383B /* ImagePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImagePicker.swift; sourceTree = ""; }; 874A988429F206DB007CFB74 /* UserDefaultsError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaultsError.swift; sourceTree = ""; }; + 874C197F2A5933AB002812D5 /* MainTabViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainTabViewModel.swift; sourceTree = ""; }; 874DBA052A2C1392000E1FD1 /* Userdefaults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Userdefaults.swift; sourceTree = ""; }; 874DBA072A2C1FF8000E1FD1 /* StorageManaging.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StorageManaging.swift; sourceTree = ""; }; 874EF931297CB4C600C94233 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; @@ -580,6 +582,7 @@ isa = PBXGroup; children = ( 87ABC58029908B17003E94F3 /* MainTabView.swift */, + 874C197F2A5933AB002812D5 /* MainTabViewModel.swift */, ); path = MainTab; sourceTree = ""; @@ -829,6 +832,7 @@ 87E5E9342A2E9857002CF7B2 /* MyNameEditView.swift in Sources */, 87EE8D7D297A1790005CCB6F /* AppDelegate.swift in Sources */, 872B9FDB2A42F9B100D15A84 /* FetchPartnerError.swift in Sources */, + 874C19802A5933AB002812D5 /* MainTabViewModel.swift in Sources */, 874EF93A297CC8B200C94233 /* FireStoreUserManager.swift in Sources */, 87830E80297A20DB00184A7C /* CreateUserView.swift in Sources */, 879379E2298B4C8D00D3A47B /* PartnerNameEditView.swift in Sources */, diff --git a/CommonWallet/AppDelegate.swift b/CommonWallet/AppDelegate.swift index bbffaf4..9af7785 100644 --- a/CommonWallet/AppDelegate.swift +++ b/CommonWallet/AppDelegate.swift @@ -11,7 +11,6 @@ class AppDelegate: NSObject, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { FirebaseApp.configure() - return true } } diff --git a/CommonWallet/Models/CoreData/TransactionData.swift b/CommonWallet/Models/CoreData/TransactionData.swift index c7bbec4..1852f6d 100644 --- a/CommonWallet/Models/CoreData/TransactionData.swift +++ b/CommonWallet/Models/CoreData/TransactionData.swift @@ -53,21 +53,20 @@ final public class TransactionData: ObservableObject { private var addSnapShotListenerCount: Int = 0 init() { - fetchTransactions() + realtimeFetchTransactions() } - private func fetchTransactions() { + private func realtimeFetchTransactions() { fireStoreTransactionManager.fetchTransactions(myUserId: myUserId, partnerUserId: partnerUserId, completion: { [weak self] transactions, error in if let error = error { print(error) - } - - guard let transactions = transactions else { return } + guard let transactions = transactions else { return } + // トランザクションを時系列ごとに並べ替える let sortedTransactions = transactions.sorted(by: { (a, b) -> Bool in return a.createdAt > b.createdAt diff --git a/CommonWallet/Models/Domain/Partner.swift b/CommonWallet/Models/Domain/Partner.swift index ecbf90b..a5483b6 100644 --- a/CommonWallet/Models/Domain/Partner.swift +++ b/CommonWallet/Models/Domain/Partner.swift @@ -8,6 +8,7 @@ import Foundation struct Partner { var userId: String? var userName: String + var modifiedName: String? var shareNumber: String? var iconPath: String? var iconData: Data? diff --git a/CommonWallet/Models/UserDefaults/Protocol/UserDefaultsManaging.swift b/CommonWallet/Models/UserDefaults/Protocol/UserDefaultsManaging.swift index 0e254b8..b5c2a55 100644 --- a/CommonWallet/Models/UserDefaults/Protocol/UserDefaultsManaging.swift +++ b/CommonWallet/Models/UserDefaults/Protocol/UserDefaultsManaging.swift @@ -12,8 +12,9 @@ protocol UserDefaultsManaging { // MARK: - Setter func createUser(user: User) func createPartner(partner: Partner) - func setMyUserName(userName: String) + func setUser(user: User) func setPartner(partner: Partner) + func setMyUserName(userName: String) func setPartner(userId: String, name: String, modifiedName: String, iconPath: String, iconData: Data, shareNumber: String) func setPartner(userId: String, name: String, modifiedName: String, shareNumber: String) func setPartnerUserId(userId: String) diff --git a/CommonWallet/Models/UserDefaults/UserDefaultsManager.swift b/CommonWallet/Models/UserDefaults/UserDefaultsManager.swift index a957a9c..fd5324a 100644 --- a/CommonWallet/Models/UserDefaults/UserDefaultsManager.swift +++ b/CommonWallet/Models/UserDefaults/UserDefaultsManager.swift @@ -12,10 +12,19 @@ struct UserDefaultsManager: UserDefaultsManaging { // MARK: - Setter func createUser(user: User) { - // 非オプショナル UserDefaults.standard.set(user.id, forKey: userDefaultsKey.userId) UserDefaults.standard.set(user.name, forKey: userDefaultsKey.userName) UserDefaults.standard.set(user.iconPath, forKey: userDefaultsKey.myIconPath) + UserDefaults.standard.set(user.iconData, forKey: userDefaultsKey.myIconData) + UserDefaults.standard.set(user.shareNumber, forKey: userDefaultsKey.shareNumber) + UserDefaults.standard.set(user.createdAt, forKey: userDefaultsKey.createdAt) + } + + func setUser(user: User) { + UserDefaults.standard.set(user.id, forKey: userDefaultsKey.userId) + UserDefaults.standard.set(user.name, forKey: userDefaultsKey.userName) + UserDefaults.standard.set(user.iconPath, forKey: userDefaultsKey.myIconPath) + UserDefaults.standard.set(user.iconData, forKey: userDefaultsKey.myIconData) UserDefaults.standard.set(user.shareNumber, forKey: userDefaultsKey.shareNumber) UserDefaults.standard.set(user.createdAt, forKey: userDefaultsKey.createdAt) } diff --git a/CommonWallet/Sceans/Launch/View/LaunchScreen.swift b/CommonWallet/Sceans/Launch/View/LaunchScreen.swift index bc2a8be..3bcf21f 100644 --- a/CommonWallet/Sceans/Launch/View/LaunchScreen.swift +++ b/CommonWallet/Sceans/Launch/View/LaunchScreen.swift @@ -35,12 +35,7 @@ struct LaunchScreen: View { Image("SampleLogo") } .onAppear { - Task { - await viewModel.fetchPartnerInfo() - await viewModel.fetchUserInfo() - print("アカウント作成済んでました!") - - } + print("アカウント作成済み") DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { withAnimation { isMainTabViewLoading = false @@ -81,7 +76,6 @@ struct LaunchScreen: View { } } } else { - //SignInView() MainTabView() } } diff --git a/CommonWallet/Sceans/Launch/ViewModels/LaunchViewModel.swift b/CommonWallet/Sceans/Launch/ViewModels/LaunchViewModel.swift index 68c3fd1..9d7ba14 100644 --- a/CommonWallet/Sceans/Launch/ViewModels/LaunchViewModel.swift +++ b/CommonWallet/Sceans/Launch/ViewModels/LaunchViewModel.swift @@ -9,60 +9,10 @@ import FirebaseAuth class LaunchViewModel: ObservableObject { private var authManager = AuthManager() - private var shareNumberManager = ShareNumberManager() - private var fireStoreTransactionManager = FireStoreTransactionManager() - private var fireStoreUserManager = FireStoreUserManager() - private var fireStorePartnerManager = FireStorePartnerManager() private var storageManager = StorageManager() + private var shareNumberManager = ShareNumberManager() private var userDefaultsManager = UserDefaultsManager() - - // ここでUserInfoをfetchする - // addSnapListernerだから、更新されるたびに自動でUserDefaultsが更新される - func fetchUserInfo() async { - guard let userId = Auth.auth().currentUser?.uid else { - print("haven't Auth.auth().currentUser?.uid") - return - } - self.fireStoreUserManager.realtimeFetchInfo(userId: userId, completion: { user, error in - if error != nil { - print("error") - return - } - guard let user = user else { - print("haven't user") - return - } - self.userDefaultsManager.createUser(user: user) - }) - } - - func fetchPartnerInfo() async { - - guard let myUserId = userDefaultsManager.getUser()?.id else { - return - } - - fireStorePartnerManager.realtimeFetchInfo(myUserId: myUserId, completion: { partner, error in - if let error = error { - return - } - - guard let partner = partner else { - print("haven't partner") - return - } - -// let partnerUserDefaultsName = self.userDefaultsManager.getPartnerName() ?? partner.userName -// self.userDefaultsManager.setPartner( -// userId: partner.userId, -// name: partner.userName, -// modifiedName: partnerUserDefaultsName, -// iconPath: partner.iconPath, -// iconData: partner.iconData, -// shareNumber: partner.shareNumber -// ) - }) - } + private var fireStoreUserManager = FireStoreUserManager() func createUser(myUserName: String, partnerUserName: String) async throws { // アカウント作成 diff --git a/CommonWallet/Sceans/MainTab/MainTabView.swift b/CommonWallet/Sceans/MainTab/MainTabView.swift index 651e18e..f50149b 100644 --- a/CommonWallet/Sceans/MainTab/MainTabView.swift +++ b/CommonWallet/Sceans/MainTab/MainTabView.swift @@ -7,6 +7,8 @@ import SwiftUI struct MainTabView: View { + @ObservedObject var viewModel = MainTabViewModel() + var body: some View { TabView { CommonWalletView(viewModel: CommonWalletViewModel(fireStoreTransactionManager: FireStoreTransactionManager(), fireStoreUserManager: FireStoreUserManager())) @@ -23,6 +25,11 @@ struct MainTabView: View { Text("履歴") } }.tag(2) + }.onAppear { + Task { + await viewModel.realtimeFetchPartnerInfo() + await viewModel.realtimeFetchUserInfo() + } } } diff --git a/CommonWallet/Sceans/MainTab/MainTabViewModel.swift b/CommonWallet/Sceans/MainTab/MainTabViewModel.swift new file mode 100644 index 0000000..7f6f95a --- /dev/null +++ b/CommonWallet/Sceans/MainTab/MainTabViewModel.swift @@ -0,0 +1,72 @@ +// +// MainTabViewModel.swift +// CommonWallet +// + +import Foundation + +class MainTabViewModel: ObservableObject { + private var authManager = AuthManager() + private var shareNumberManager = ShareNumberManager() + private var fireStoreTransactionManager = FireStoreTransactionManager() + private var fireStoreUserManager = FireStoreUserManager() + private var fireStorePartnerManager = FireStorePartnerManager() + private var storageManager = StorageManager() + private var userDefaultsManager = UserDefaultsManager() + + // ここでUserInfoをfetchする + // addSnapListernerだから、更新されるたびに自動でUserDefaultsが更新される + func realtimeFetchUserInfo() async { + + guard let myUserId = userDefaultsManager.getUser()?.id else { return } + self.fireStoreUserManager.realtimeFetchInfo(userId: myUserId, completion: { [weak self] user, error in + + if let error = error { + print(error) + return + } + + guard let user = user else { return } + self?.userDefaultsManager.setUser(user: user) + }) + } + + func realtimeFetchPartnerInfo() async { + + guard let myUserId = userDefaultsManager.getUser()?.id else { return } + + fireStorePartnerManager.realtimeFetchInfo(myUserId: myUserId, completion: { [weak self] partner, error in + + if let error = error { + print(error) + return + } + + guard let partner = partner else { return } + self?.userDefaultsManager.setPartner(partner: partner) + }) + } + + func createUser(myUserName: String, partnerUserName: String) async throws { + // アカウント作成 + let authResult = try await authManager.signInAnonymously() + + // 自分の情報定義 + let myUserId = authResult.user.uid + let sampleMyIconPath = "icon-sample-images/sample\(Int.random(in: 1...20)).jpeg" + let samplePartnerIconPath = "icon-sample-images/initial-partner-icon.jpeg" + let sampleMyIconData = try await storageManager.download(path: sampleMyIconPath) + let samplePartnerIconData = try await storageManager.download(path: samplePartnerIconPath) + let shareNumber = try await shareNumberManager.createShareNumber() + + // トランザクションにアカウント登録 + try await fireStoreUserManager.createUser(userId: myUserId, userName: myUserName, iconPath: sampleMyIconPath, shareNumber: shareNumber) + + // Userdefaultsに保存 + let user = User(id: myUserId, name: myUserName, shareNumber: shareNumber, iconPath: sampleMyIconPath, iconData: sampleMyIconData, createdAt: Date()) + let partner = Partner(userName: partnerUserName, iconPath: samplePartnerIconPath, iconData: samplePartnerIconData) + userDefaultsManager.createUser(user: user) + userDefaultsManager.createPartner(partner: partner) + } + +} From 9ce6a81bc27c687735f2966bf23c8b3c335edd3f Mon Sep 17 00:00:00 2001 From: Kota Date: Sat, 8 Jul 2023 15:48:58 +0900 Subject: [PATCH 4/5] =?UTF-8?q?fix:=20userDefaults=E3=81=AB=E3=82=AA?= =?UTF-8?q?=E3=83=97=E3=82=B7=E3=83=A7=E3=83=8A=E3=83=AB=E3=83=90=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E3=83=87=E3=82=A3=E3=83=B3=E3=82=B0=E6=9F=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UserDefaults/UserDefaultsManager.swift | 36 +++++++++++++++---- .../Launch/ViewModels/LaunchViewModel.swift | 6 ++-- .../Sceans/MainTab/MainTabViewModel.swift | 22 ------------ 3 files changed, 33 insertions(+), 31 deletions(-) diff --git a/CommonWallet/Models/UserDefaults/UserDefaultsManager.swift b/CommonWallet/Models/UserDefaults/UserDefaultsManager.swift index fd5324a..3142757 100644 --- a/CommonWallet/Models/UserDefaults/UserDefaultsManager.swift +++ b/CommonWallet/Models/UserDefaults/UserDefaultsManager.swift @@ -24,9 +24,17 @@ struct UserDefaultsManager: UserDefaultsManaging { UserDefaults.standard.set(user.id, forKey: userDefaultsKey.userId) UserDefaults.standard.set(user.name, forKey: userDefaultsKey.userName) UserDefaults.standard.set(user.iconPath, forKey: userDefaultsKey.myIconPath) - UserDefaults.standard.set(user.iconData, forKey: userDefaultsKey.myIconData) + UserDefaults.standard.set(user.shareNumber, forKey: userDefaultsKey.shareNumber) - UserDefaults.standard.set(user.createdAt, forKey: userDefaultsKey.createdAt) + + if let iconData = user.iconData { + UserDefaults.standard.set(iconData, forKey: userDefaultsKey.myIconData) + } + + if let createdAt = user.createdAt { + UserDefaults.standard.set(createdAt, forKey: userDefaultsKey.createdAt) + } + } func createPartner(partner: Partner) { @@ -42,12 +50,26 @@ struct UserDefaultsManager: UserDefaultsManaging { } func setPartner(partner: Partner) { - UserDefaults.standard.set(partner.userId, forKey: userDefaultsKey.partnerUserId) + if let userId = partner.userId { + UserDefaults.standard.set(userId, forKey: userDefaultsKey.partnerUserId) + } UserDefaults.standard.set(partner.userName, forKey: userDefaultsKey.partnerName) - UserDefaults.standard.set(partner.userName, forKey: userDefaultsKey.partnerModifiedName) - UserDefaults.standard.set(partner.iconPath, forKey: userDefaultsKey.partnerIconPath) - UserDefaults.standard.set(partner.iconData, forKey: userDefaultsKey.partnerIconData) - UserDefaults.standard.set(partner.shareNumber, forKey: userDefaultsKey.partnerShareNumber) + + if let modifiedName = partner.modifiedName { + UserDefaults.standard.set(modifiedName, forKey: userDefaultsKey.partnerModifiedName) + } + if let shareNumber = partner.shareNumber { + UserDefaults.standard.set(shareNumber, forKey: userDefaultsKey.partnerShareNumber) + + } + if let iconPath = partner.iconPath { + UserDefaults.standard.set(iconPath, forKey: userDefaultsKey.partnerIconPath) + + } + if let iconData = partner.iconData { + UserDefaults.standard.set(partner.iconData, forKey: userDefaultsKey.partnerIconData) + + } } func setPartner(userId: String, name: String, modifiedName: String, iconPath: String, iconData: Data, shareNumber: String) { diff --git a/CommonWallet/Sceans/Launch/ViewModels/LaunchViewModel.swift b/CommonWallet/Sceans/Launch/ViewModels/LaunchViewModel.swift index 9d7ba14..eb7c17d 100644 --- a/CommonWallet/Sceans/Launch/ViewModels/LaunchViewModel.swift +++ b/CommonWallet/Sceans/Launch/ViewModels/LaunchViewModel.swift @@ -9,10 +9,12 @@ import FirebaseAuth class LaunchViewModel: ObservableObject { private var authManager = AuthManager() - private var storageManager = StorageManager() private var shareNumberManager = ShareNumberManager() - private var userDefaultsManager = UserDefaultsManager() + private var fireStoreTransactionManager = FireStoreTransactionManager() private var fireStoreUserManager = FireStoreUserManager() + private var fireStorePartnerManager = FireStorePartnerManager() + private var storageManager = StorageManager() + private var userDefaultsManager = UserDefaultsManager() func createUser(myUserName: String, partnerUserName: String) async throws { // アカウント作成 diff --git a/CommonWallet/Sceans/MainTab/MainTabViewModel.swift b/CommonWallet/Sceans/MainTab/MainTabViewModel.swift index 7f6f95a..6b0568c 100644 --- a/CommonWallet/Sceans/MainTab/MainTabViewModel.swift +++ b/CommonWallet/Sceans/MainTab/MainTabViewModel.swift @@ -47,26 +47,4 @@ class MainTabViewModel: ObservableObject { }) } - func createUser(myUserName: String, partnerUserName: String) async throws { - // アカウント作成 - let authResult = try await authManager.signInAnonymously() - - // 自分の情報定義 - let myUserId = authResult.user.uid - let sampleMyIconPath = "icon-sample-images/sample\(Int.random(in: 1...20)).jpeg" - let samplePartnerIconPath = "icon-sample-images/initial-partner-icon.jpeg" - let sampleMyIconData = try await storageManager.download(path: sampleMyIconPath) - let samplePartnerIconData = try await storageManager.download(path: samplePartnerIconPath) - let shareNumber = try await shareNumberManager.createShareNumber() - - // トランザクションにアカウント登録 - try await fireStoreUserManager.createUser(userId: myUserId, userName: myUserName, iconPath: sampleMyIconPath, shareNumber: shareNumber) - - // Userdefaultsに保存 - let user = User(id: myUserId, name: myUserName, shareNumber: shareNumber, iconPath: sampleMyIconPath, iconData: sampleMyIconData, createdAt: Date()) - let partner = Partner(userName: partnerUserName, iconPath: samplePartnerIconPath, iconData: samplePartnerIconData) - userDefaultsManager.createUser(user: user) - userDefaultsManager.createPartner(partner: partner) - } - } From 41a7c33d507d71b28fa34d5eec5fc33adda4e37c Mon Sep 17 00:00:00 2001 From: Kota Date: Sat, 8 Jul 2023 16:21:11 +0900 Subject: [PATCH 5/5] =?UTF-8?q?fix:=20=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF?= =?UTF-8?q?=E3=82=BF=E3=83=AA=E3=83=B3=E3=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FireStoreTransactionManager.swift | 128 +++--------------- .../FireStoreTransactionManaging.swift | 3 - .../Setting/ViewModels/AccountViewModel.swift | 8 +- 3 files changed, 22 insertions(+), 117 deletions(-) diff --git a/CommonWallet/Models/Firebase/Firebase/FireStoreTransactionManager.swift b/CommonWallet/Models/Firebase/Firebase/FireStoreTransactionManager.swift index 19509d5..b2f45e8 100644 --- a/CommonWallet/Models/Firebase/Firebase/FireStoreTransactionManager.swift +++ b/CommonWallet/Models/Firebase/Firebase/FireStoreTransactionManager.swift @@ -26,8 +26,8 @@ struct FireStoreTransactionManager: FireStoreTransactionManaging { // Firestoreに書き込むデータの作成 let transaction: Dictionary = ["id": transactionId, - "creditorId": creditorId ?? NSNull(), - "debtorId": debtorId ?? NSNull(), + "creditorId": creditorId ?? "", + "debtorId": debtorId ?? "", "title": title, "description": description, "amount": amount, @@ -85,8 +85,8 @@ struct FireStoreTransactionManager: FireStoreTransactionManaging { */ func updateTransaction(transaction: Transaction) async throws { let data: Dictionary = ["id": transaction.id, - "creditorId": transaction.creditorId ?? NSNull(), - "debtorId": transaction.debtorId ?? NSNull(), + "creditorId": transaction.creditorId ?? "", + "debtorId": transaction.debtorId ?? "", "title": transaction.title, "description": transaction.description, "amount": transaction.amount, @@ -110,8 +110,8 @@ struct FireStoreTransactionManager: FireStoreTransactionManaging { for transaction in transactions { let document = db.collection("Transactions").document(transaction.id) let data: Dictionary = ["id": transaction.id, - "creditorId": transaction.creditorId ?? NSNull(), - "debtorId": transaction.debtorId ?? NSNull(), + "creditorId": transaction.creditorId ?? "", + "debtorId": transaction.debtorId ?? "", "title": transaction.title, "description": transaction.description, "amount": transaction.amount, @@ -128,7 +128,7 @@ struct FireStoreTransactionManager: FireStoreTransactionManaging { - parameter transaction: Nullにするtransactionデータの配列 */ func updateCreditorNullOnTransactionIds(transactionIds: [String]) async throws { - let creditorNullOnTransaction: Dictionary = ["creditorId": NSNull()] + let creditorNullOnTransaction: Dictionary = ["creditorId": ""] let splitTransactionIds = transactionIds.splitIntoChunks(ofSize: 300) for transactionIds in splitTransactionIds { @@ -146,7 +146,7 @@ struct FireStoreTransactionManager: FireStoreTransactionManaging { - parameter transaction: Nullにするtransactionデータの配列 */ func updateDebtorNullOnTransactionIds(transactionIds: [String]) async throws { - let creditorNullOnTransaction: Dictionary = ["debtorId": NSNull()] + let creditorNullOnTransaction: Dictionary = ["debtorId": ""] let splitTransactionIds = transactionIds.splitIntoChunks(ofSize: 300) for transactionIds in splitTransactionIds { @@ -201,9 +201,18 @@ struct FireStoreTransactionManager: FireStoreTransactionManaging { */ func fetchTransactions(myUserId: String, partnerUserId: String?, completion: @escaping([Transaction]?, Error?) -> Void) { + // パートナーが""で渡ってくるので、ほぼ全検索みたいな状態になってしまう。 + // 空文字列で来た際は、"xxx"をFireStoreで調べるようにして、全検索にならないようにする + var searchPartnerUserId = partnerUserId + if let partnerUserId = partnerUserId { + if partnerUserId.isEmpty { + searchPartnerUserId = "xxx" + } + } + // inを含むwhereFieldとorderByは同時に使えない db.collection("Transactions") - .whereField("creditorId", in: [partnerUserId, myUserId]) + .whereField("creditorId", in: [searchPartnerUserId, myUserId]) .addSnapshotListener { snapShots, error in if let error = error { @@ -232,107 +241,6 @@ struct FireStoreTransactionManager: FireStoreTransactionManaging { } } - func fetchUnResolvedTransactions(myUserId: String, partnerUserId: String, completion: @escaping([Transaction]?, Error?) -> Void) { - - // Transactionsコレクションから未精算の取引を取得する - // inを含むwhereFieldとorderByは同時に使えない - db.collection("Transactions") - .whereField("creditorId", in: [partnerUserId, myUserId]) - .whereField("resolvedAt", isEqualTo: NSNull()) - .addSnapshotListener { snapShots, error in - - if let error = error { - print("FireStore UnResolvedTransactions Fetch Error") - completion(nil, error) - } - - var transactions = [Transaction]() - snapShots?.documents.forEach({ snapShot in - let data = snapShot.data() - guard let id = data["id"] as? String, - let title = data["title"] as? String, - let description = data["description"] as? String, - let amount = data["amount"] as? Int, - let createdAt = data["createdAt"] as? Timestamp else { return } - - // creditorIdもdebtorIdもパートナー連携していない場合のため空でも許される - let debtorId = data["creditorId"] as? String - let creditorId = data["creditorId"] as? String - - let transaction = Transaction(id: id, creditorId: creditorId, debtorId: debtorId, title: title, description: description, amount: amount, createdAt: createdAt.dateValue()) - transactions.append(transaction) - }) - completion(transactions, nil) - } - } - - /** - 精算済のトランザクションを取得する - - parameter myUserId: 自分のUserId - - parameter partnerUserId: パートナーのUserId - */ - func fetchResolvedTransactions(myUserId: String, partnerUserId: String, completion: @escaping([Transaction]?, Error?) -> Void) { - - // inを含むwhereFieldとorderByは同時に使えない - db.collection("Transactions") - .whereField("creditorId", in: [partnerUserId, myUserId]) - .whereField("resolvedAt", isNotEqualTo: NSNull()) - .addSnapshotListener { snapShots, error in - - if let error = error { - print("FireStore ResolvedTransactions Fetch Error") - completion(nil, error) - } - - var transactions = [Transaction]() - snapShots?.documents.forEach({ snapShot in - let data = snapShot.data() - guard let id = data["id"] as? String, - let title = data["title"] as? String, - let description = data["description"] as? String, - let amount = data["amount"] as? Int, - let createdAt = data["createdAt"] as? Timestamp, - let resolvedAt = data["resolvedAt"] as? Timestamp else { return } - - // creditorIdもdebtorIdもパートナー連携していない場合のため空でも許される - let creditorId = data["creditorId"] as? String - let debtorId = data["debtorId"] as? String - - let transaction = Transaction(id: id, creditorId: creditorId, debtorId: debtorId, title: title, description: description, amount: amount, createdAt: createdAt.dateValue(), resolvedAt: resolvedAt.dateValue()) - transactions.append(transaction) - }) - completion(transactions, nil) - } - } - - // TODO: FireStoreのアクセス数がこれでバク上がる気がして、この関数嫌だ - /** - 最も古い精算済のトランザクションの日付を取得する - - Note: FireStoreのアクセス数がこれでバク上がる気がして、ちょっとこれ嫌だ - - parameter myUserId: 自分のUserId - - parameter partnerUserId: パートナーのUserId - - returns: 最も古い日付 - */ - func fetchOldestDate(myUserId: String, partnerUserId: String) async throws -> Date? { - let currentTimestamp = Timestamp(date: Date()) - let currentDate = Date() - // Transactionsコレクションから未精算の取引を取得する - let querySnapshot = try await db.collection("Transactions") - .whereField("resolvedAt", isNotEqualTo: NSNull()) - .whereField("creditorId", in: [partnerUserId, myUserId]) - .getDocuments() - - // トランザクションを時系列ごとに並べ替える - let sortedDocuments = querySnapshot.documents.sorted(by: { (a, b) -> Bool in - return (a.get("createdAt") as? Timestamp)?.dateValue() ?? currentDate < (b.get("createdAt") as? Timestamp)?.dateValue() ?? currentDate - }) - - guard let doc = sortedDocuments.first, - let oldestTimestamp = doc.get("createdAt") as? Timestamp else - { return nil } - return oldestTimestamp.dateValue() - } - } diff --git a/CommonWallet/Models/Firebase/Protocol/FireStoreTransactionManaging.swift b/CommonWallet/Models/Firebase/Protocol/FireStoreTransactionManaging.swift index abfed35..d226816 100644 --- a/CommonWallet/Models/Firebase/Protocol/FireStoreTransactionManaging.swift +++ b/CommonWallet/Models/Firebase/Protocol/FireStoreTransactionManaging.swift @@ -25,8 +25,5 @@ protocol FireStoreTransactionManaging { // GET func fetchTransactions(myUserId: String, partnerUserId: String?, completion: @escaping([Transaction]?, Error?) -> Void) - func fetchUnResolvedTransactions(myUserId: String, partnerUserId: String, completion: @escaping([Transaction]?, Error?) -> Void) - func fetchResolvedTransactions(myUserId: String, partnerUserId: String, completion: @escaping([Transaction]?, Error?) -> Void) - func fetchOldestDate(myUserId: String, partnerUserId: String) async throws -> Date? } diff --git a/CommonWallet/Sceans/Setting/ViewModels/AccountViewModel.swift b/CommonWallet/Sceans/Setting/ViewModels/AccountViewModel.swift index df1d316..f04e67a 100644 --- a/CommonWallet/Sceans/Setting/ViewModels/AccountViewModel.swift +++ b/CommonWallet/Sceans/Setting/ViewModels/AccountViewModel.swift @@ -79,17 +79,17 @@ class AccountViewModel: ObservableObject { // パートナーが空の場合、そのトランザションは削除 let userNullTransactionIds = transactions .filter{ - ($0.debtorId == myUserId && $0.creditorId == nil) || - ($0.debtorId == nil && $0.creditorId == myUserId) + ($0.debtorId == myUserId && $0.creditorId == "") || + ($0.debtorId == "" && $0.creditorId == myUserId) } .map { $0.id } // creditorIdに自分のIdが含まれていて、パートナーが存在する場合は、そこをnullにしてアップデート let myCreditorTransactionIds = transactions - .filter{ ($0.creditorId == myUserId && $0.debtorId != nil) } + .filter{ ($0.creditorId == myUserId && $0.debtorId != "") } .map { $0.id } // debtorIdに自分のIdが含まれていて、パートナーが存在する場合は、そこをnullにしてアップデート let myDebtorTransactionIds = transactions - .filter{ ($0.debtorId == myUserId && $0.creditorId != nil) } + .filter{ ($0.debtorId == myUserId && $0.creditorId != "") } .map { $0.id } // ここは非同期で並列処理。関数を抜けるまでには必ず処理される。