diff --git a/29th-iOS-Assignment/29th-iOS-Assignment.xcodeproj/project.pbxproj b/29th-iOS-Assignment/29th-iOS-Assignment.xcodeproj/project.pbxproj index a4e3e55..2785a18 100644 --- a/29th-iOS-Assignment/29th-iOS-Assignment.xcodeproj/project.pbxproj +++ b/29th-iOS-Assignment/29th-iOS-Assignment.xcodeproj/project.pbxproj @@ -7,6 +7,13 @@ objects = { /* Begin PBXBuildFile section */ + 2B0F6A93273E439E00F1B3DE /* UserDefaults+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B0F6A92273E439E00F1B3DE /* UserDefaults+Extension.swift */; }; + 2B4816BD2732E6AA003CCE3B /* APIConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B4816BC2732E6AA003CCE3B /* APIConstants.swift */; }; + 2B4816C02732E83E003CCE3B /* NetworkResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B4816BF2732E83E003CCE3B /* NetworkResult.swift */; }; + 2B4816C22732E8CD003CCE3B /* LoginDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B4816C12732E8CD003CCE3B /* LoginDataModel.swift */; }; + 2B4816C42732E97C003CCE3B /* LoginService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B4816C32732E97C003CCE3B /* LoginService.swift */; }; + 2B6D2520273AE3820079B36D /* SignupService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B6D251F273AE3820079B36D /* SignupService.swift */; }; + 2B6D2522273AE4580079B36D /* SignupDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B6D2521273AE4580079B36D /* SignupDataModel.swift */; }; 2BBF45B9271688AD00686134 /* YoutubeMain.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2BBF45B8271688AD00686134 /* YoutubeMain.storyboard */; }; 2BBF45BB2716890300686134 /* CustomTBC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BBF45BA2716890300686134 /* CustomTBC.swift */; }; 2BBF45BD2716891E00686134 /* HomeVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BBF45BC2716891E00686134 /* HomeVC.swift */; }; @@ -25,14 +32,21 @@ 2BF508D2270B0A50004EF83D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2BF508D0270B0A50004EF83D /* Main.storyboard */; }; 2BF508D4270B0A51004EF83D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2BF508D3270B0A51004EF83D /* Assets.xcassets */; }; 2BF508D7270B0A51004EF83D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2BF508D5270B0A51004EF83D /* LaunchScreen.storyboard */; }; - 2BF508E4270B0BCB004EF83D /* LoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BF508E3270B0BCB004EF83D /* LoginViewController.swift */; }; - 2BF508E6270B0EE6004EF83D /* SignupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BF508E5270B0EE6004EF83D /* SignupViewController.swift */; }; - 2BF508E8270B0F18004EF83D /* SuccessViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BF508E7270B0F18004EF83D /* SuccessViewController.swift */; }; + 2BF508E4270B0BCB004EF83D /* LoginVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BF508E3270B0BCB004EF83D /* LoginVC.swift */; }; + 2BF508E6270B0EE6004EF83D /* SignupVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BF508E5270B0EE6004EF83D /* SignupVC.swift */; }; + 2BF508E8270B0F18004EF83D /* SuccessVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BF508E7270B0F18004EF83D /* SuccessVC.swift */; }; AD636A2841FC32900DCE8B24 /* Pods_29th_iOS_Assignment.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2B76D5275535EEC539B4BEEF /* Pods_29th_iOS_Assignment.framework */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 1E0BF1C4A0D185311E8AC6CE /* Pods-29th-iOS-Assignment.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-29th-iOS-Assignment.release.xcconfig"; path = "Target Support Files/Pods-29th-iOS-Assignment/Pods-29th-iOS-Assignment.release.xcconfig"; sourceTree = ""; }; + 2B0F6A92273E439E00F1B3DE /* UserDefaults+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserDefaults+Extension.swift"; sourceTree = ""; }; + 2B4816BC2732E6AA003CCE3B /* APIConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIConstants.swift; sourceTree = ""; }; + 2B4816BF2732E83E003CCE3B /* NetworkResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkResult.swift; sourceTree = ""; }; + 2B4816C12732E8CD003CCE3B /* LoginDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginDataModel.swift; sourceTree = ""; }; + 2B4816C32732E97C003CCE3B /* LoginService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginService.swift; sourceTree = ""; }; + 2B6D251F273AE3820079B36D /* SignupService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignupService.swift; sourceTree = ""; }; + 2B6D2521273AE4580079B36D /* SignupDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignupDataModel.swift; sourceTree = ""; }; 2B76D5275535EEC539B4BEEF /* Pods_29th_iOS_Assignment.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_29th_iOS_Assignment.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 2BBF45B8271688AD00686134 /* YoutubeMain.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = YoutubeMain.storyboard; sourceTree = ""; }; 2BBF45BA2716890300686134 /* CustomTBC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomTBC.swift; sourceTree = ""; }; @@ -54,9 +68,9 @@ 2BF508D3270B0A51004EF83D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 2BF508D6270B0A51004EF83D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 2BF508D8270B0A51004EF83D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 2BF508E3270B0BCB004EF83D /* LoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginViewController.swift; sourceTree = ""; }; - 2BF508E5270B0EE6004EF83D /* SignupViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignupViewController.swift; sourceTree = ""; }; - 2BF508E7270B0F18004EF83D /* SuccessViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SuccessViewController.swift; sourceTree = ""; }; + 2BF508E3270B0BCB004EF83D /* LoginVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginVC.swift; sourceTree = ""; }; + 2BF508E5270B0EE6004EF83D /* SignupVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignupVC.swift; sourceTree = ""; }; + 2BF508E7270B0F18004EF83D /* SuccessVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SuccessVC.swift; sourceTree = ""; }; 4D0A1778A9851177E1AC83B6 /* Pods-29th-iOS-Assignment.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-29th-iOS-Assignment.debug.xcconfig"; path = "Target Support Files/Pods-29th-iOS-Assignment/Pods-29th-iOS-Assignment.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -107,6 +121,8 @@ 2B4816BA2732E258003CCE3B /* Models */ = { isa = PBXGroup; children = ( + 2B4816C12732E8CD003CCE3B /* LoginDataModel.swift */, + 2B6D2521273AE4580079B36D /* SignupDataModel.swift */, ); path = Models; sourceTree = ""; @@ -114,10 +130,22 @@ 2B4816BB2732E271003CCE3B /* APIServices */ = { isa = PBXGroup; children = ( + 2B4816BE2732E6C5003CCE3B /* Services */, + 2B4816BC2732E6AA003CCE3B /* APIConstants.swift */, + 2B4816BF2732E83E003CCE3B /* NetworkResult.swift */, ); path = APIServices; sourceTree = ""; }; + 2B4816BE2732E6C5003CCE3B /* Services */ = { + isa = PBXGroup; + children = ( + 2B4816C32732E97C003CCE3B /* LoginService.swift */, + 2B6D251F273AE3820079B36D /* SignupService.swift */, + ); + path = Services; + sourceTree = ""; + }; 2BC3B1AF2729C97500240249 /* Cells */ = { isa = PBXGroup; children = ( @@ -141,6 +169,7 @@ children = ( 2BE4D6E52715F0DD00436945 /* UIVIewController+Extension.swift */, 2BC3B1AD2729C24300240249 /* UIView+Extension.swift */, + 2B0F6A92273E439E00F1B3DE /* UserDefaults+Extension.swift */, ); path = Extensions; sourceTree = ""; @@ -185,9 +214,9 @@ 2BF508E1270B0AE4004EF83D /* ViewControllers */ = { isa = PBXGroup; children = ( - 2BF508E3270B0BCB004EF83D /* LoginViewController.swift */, - 2BF508E5270B0EE6004EF83D /* SignupViewController.swift */, - 2BF508E7270B0F18004EF83D /* SuccessViewController.swift */, + 2BF508E3270B0BCB004EF83D /* LoginVC.swift */, + 2BF508E5270B0EE6004EF83D /* SignupVC.swift */, + 2BF508E7270B0F18004EF83D /* SuccessVC.swift */, 2BBF45BA2716890300686134 /* CustomTBC.swift */, 2BBF45BC2716891E00686134 /* HomeVC.swift */, 2BBF45BE2716892B00686134 /* ShortsVC.swift */, @@ -341,17 +370,24 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2BF508E4270B0BCB004EF83D /* LoginViewController.swift in Sources */, + 2BF508E4270B0BCB004EF83D /* LoginVC.swift in Sources */, 2BC3B1AE2729C24300240249 /* UIView+Extension.swift in Sources */, + 2B6D2520273AE3820079B36D /* SignupService.swift in Sources */, + 2B4816BD2732E6AA003CCE3B /* APIConstants.swift in Sources */, + 2B4816C02732E83E003CCE3B /* NetworkResult.swift in Sources */, 2BBF45BD2716891E00686134 /* HomeVC.swift in Sources */, 2BBF45C5271689B100686134 /* LockerVC.swift in Sources */, 2BBF45BB2716890300686134 /* CustomTBC.swift in Sources */, + 2B4816C42732E97C003CCE3B /* LoginService.swift in Sources */, 2BF508CB270B0A50004EF83D /* AppDelegate.swift in Sources */, 2BBF45C12716893B00686134 /* AddVC.swift in Sources */, 2BE4D6E62715F0DD00436945 /* UIVIewController+Extension.swift in Sources */, + 2B4816C22732E8CD003CCE3B /* LoginDataModel.swift in Sources */, 2BC3B1B52729D0C700240249 /* HomeContentTVC.swift in Sources */, - 2BF508E6270B0EE6004EF83D /* SignupViewController.swift in Sources */, - 2BF508E8270B0F18004EF83D /* SuccessViewController.swift in Sources */, + 2BF508E6270B0EE6004EF83D /* SignupVC.swift in Sources */, + 2B0F6A93273E439E00F1B3DE /* UserDefaults+Extension.swift in Sources */, + 2B6D2522273AE4580079B36D /* SignupDataModel.swift in Sources */, + 2BF508E8270B0F18004EF83D /* SuccessVC.swift in Sources */, 2BBF45BF2716892B00686134 /* ShortsVC.swift in Sources */, 2BDB1136272AE48900C61B62 /* HomeCategoryCVC.swift in Sources */, 2BF508CD270B0A50004EF83D /* SceneDelegate.swift in Sources */, diff --git a/29th-iOS-Assignment/29th-iOS-Assignment/Resource/APIServices/APIConstants.swift b/29th-iOS-Assignment/29th-iOS-Assignment/Resource/APIServices/APIConstants.swift new file mode 100644 index 0000000..e93300b --- /dev/null +++ b/29th-iOS-Assignment/29th-iOS-Assignment/Resource/APIServices/APIConstants.swift @@ -0,0 +1,17 @@ +// +// APIConstants.swift +// 29th-iOS-Assignment +// +// Created by 양수빈 on 2021/11/04. +// + +import Foundation + +struct APIConstants { + // MARK: - Base URL + static let baseURL = "https://asia-northeast3-we-sopt-29.cloudfunctions.net/api" + + // MARK: - Feature URL + static let loginURL = baseURL + "/user/login" + static let signUpURL = baseURL + "/user/signup" +} diff --git a/29th-iOS-Assignment/29th-iOS-Assignment/Resource/APIServices/NetworkResult.swift b/29th-iOS-Assignment/29th-iOS-Assignment/Resource/APIServices/NetworkResult.swift new file mode 100644 index 0000000..a9e5c89 --- /dev/null +++ b/29th-iOS-Assignment/29th-iOS-Assignment/Resource/APIServices/NetworkResult.swift @@ -0,0 +1,16 @@ +// +// NetworkResult.swift +// 29th-iOS-Assignment +// +// Created by 양수빈 on 2021/11/04. +// + +import Foundation + +enum NetworkResult { + case success(T) + case requestErr(T) + case pathErr + case serverErr + case networkFail +} diff --git a/29th-iOS-Assignment/29th-iOS-Assignment/Resource/APIServices/Services/LoginService.swift b/29th-iOS-Assignment/29th-iOS-Assignment/Resource/APIServices/Services/LoginService.swift new file mode 100644 index 0000000..92701f9 --- /dev/null +++ b/29th-iOS-Assignment/29th-iOS-Assignment/Resource/APIServices/Services/LoginService.swift @@ -0,0 +1,72 @@ +// +// LoginService.swift +// 29th-iOS-Assignment +// +// Created by 양수빈 on 2021/11/04. +// + +import Foundation + +import Alamofire + +struct LoginService { + static let shared = LoginService() + + func login(email: String, + password: String, + completion: @escaping (NetworkResult) -> (Void)) { + + let url = APIConstants.loginURL + + let header : HTTPHeaders = [ + "Content-Type" : "application/json" + ] + + let body : Parameters = [ + "email" : email, + "password" : password + ] + + let dataRequest = AF.request(url, + method: .post, + parameters: body, + encoding: JSONEncoding.default, + headers: header) + + dataRequest.responseData { dataResponse in + switch dataResponse.result { + case .success: + guard let statusCode = dataResponse.response?.statusCode else {return} + guard let value = dataResponse.value else {return} + + let networkResult = self.judgeLoginStatus(by: statusCode, value) + completion(networkResult) + case .failure(let err): + print(err) + completion(.networkFail) + } + } + } + + private func judgeLoginStatus (by statuscode: Int, _ data: Data) -> NetworkResult { + switch statuscode { + case 200: return isValidLoginData(data: data) + case 400: + return isInvalidLoginData(data: data) + case 500: return .serverErr + default: return .networkFail + } + } + + private func isValidLoginData(data: Data) -> NetworkResult { + let decoder = JSONDecoder() + guard let decodedData = try? decoder.decode(LoginDataModel.self, from: data) else {return .networkFail} + return .success(decodedData) + } + + private func isInvalidLoginData(data: Data) -> NetworkResult { + let decoder = JSONDecoder() + guard let decodedData = try? decoder.decode(LoginDataModel.self, from: data) else {return .pathErr} + return .requestErr(decodedData) + } +} diff --git a/29th-iOS-Assignment/29th-iOS-Assignment/Resource/APIServices/Services/SignupService.swift b/29th-iOS-Assignment/29th-iOS-Assignment/Resource/APIServices/Services/SignupService.swift new file mode 100644 index 0000000..35ead04 --- /dev/null +++ b/29th-iOS-Assignment/29th-iOS-Assignment/Resource/APIServices/Services/SignupService.swift @@ -0,0 +1,74 @@ +// +// SignupService.swift +// 29th-iOS-Assignment +// +// Created by 양수빈 on 2021/11/10. +// + +import Foundation + +import Alamofire + +struct SignupService { + static let shared = SignupService() + + func signup(email: String, + name: String, + password: String, + completion: @escaping (NetworkResult) -> (Void)) { + + let url = APIConstants.signUpURL + + let header : HTTPHeaders = [ + "Content-Type" : "application/json" + ] + + let body : Parameters = [ + "email" : email, + "name" : name, + "password" : password + ] + + let dataRequest = AF.request(url, + method: .post, + parameters: body, + encoding: JSONEncoding.default, + headers: header) + + dataRequest.responseData { dataResponse in + switch dataResponse.result { + case .success: + guard let statusCode = dataResponse.response?.statusCode else {return} + guard let value = dataResponse.value else {return} + + let networkResult = self.judgeSignupStatus(by: statusCode, value) + completion(networkResult) + case .failure(let err): + print(err) + completion(.networkFail) + } + } + } + + private func judgeSignupStatus (by statuscode: Int, _ data: Data) -> NetworkResult { + switch statuscode { + case 200: return isValidSignupData(data: data) + case 400: + return isInvalidSignupData(data: data) + case 500: return .serverErr + default: return .networkFail + } + } + + private func isValidSignupData(data: Data) -> NetworkResult { + let decoder = JSONDecoder() + guard let decodedData = try? decoder.decode(SignupDataModel.self, from: data) else {return .networkFail} + return .success(decodedData) + } + + private func isInvalidSignupData(data: Data) -> NetworkResult { + let decoder = JSONDecoder() + guard let decodedData = try? decoder.decode(SignupDataModel.self, from: data) else {return .pathErr} + return .requestErr(decodedData) + } +} diff --git a/29th-iOS-Assignment/29th-iOS-Assignment/Resource/Info.plist b/29th-iOS-Assignment/29th-iOS-Assignment/Resource/Info.plist index dd3c9af..9dbe14a 100644 --- a/29th-iOS-Assignment/29th-iOS-Assignment/Resource/Info.plist +++ b/29th-iOS-Assignment/29th-iOS-Assignment/Resource/Info.plist @@ -16,7 +16,7 @@ UISceneDelegateClassName $(PRODUCT_MODULE_NAME).SceneDelegate UISceneStoryboardFile - Main + YoutubeMain diff --git a/29th-iOS-Assignment/29th-iOS-Assignment/Resource/Storyboards/Base.lproj/Main.storyboard b/29th-iOS-Assignment/29th-iOS-Assignment/Resource/Storyboards/Base.lproj/Main.storyboard index 5364add..de77d55 100644 --- a/29th-iOS-Assignment/29th-iOS-Assignment/Resource/Storyboards/Base.lproj/Main.storyboard +++ b/29th-iOS-Assignment/29th-iOS-Assignment/Resource/Storyboards/Base.lproj/Main.storyboard @@ -11,7 +11,7 @@ - + @@ -99,7 +99,7 @@ - + @@ -178,10 +178,10 @@ - + - + @@ -238,7 +238,7 @@ - + diff --git a/29th-iOS-Assignment/29th-iOS-Assignment/Resource/Storyboards/YoutubeMain.storyboard b/29th-iOS-Assignment/29th-iOS-Assignment/Resource/Storyboards/YoutubeMain.storyboard index af8f31d..2ac5815 100644 --- a/29th-iOS-Assignment/29th-iOS-Assignment/Resource/Storyboards/YoutubeMain.storyboard +++ b/29th-iOS-Assignment/29th-iOS-Assignment/Resource/Storyboards/YoutubeMain.storyboard @@ -79,6 +79,9 @@ + + + diff --git a/29th-iOS-Assignment/29th-iOS-Assignment/Source/Extensions/UIVIewController+Extension.swift b/29th-iOS-Assignment/29th-iOS-Assignment/Source/Extensions/UIVIewController+Extension.swift index 5597bf3..fe5c83b 100644 --- a/29th-iOS-Assignment/29th-iOS-Assignment/Source/Extensions/UIVIewController+Extension.swift +++ b/29th-iOS-Assignment/29th-iOS-Assignment/Source/Extensions/UIVIewController+Extension.swift @@ -18,4 +18,31 @@ extension UIViewController { func dismissKeyboard() { view.endEditing(true) } + + func showAlert(title: String, message: String, okAction: ((UIAlertAction) -> Void)? = nil) { + let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) + let okAction = UIAlertAction(title: "확인", style: .default, handler: { action in + /// 서버에서 받은 message가 "로그인 성공"일 때만 화면 전환 + if message == "로그인 성공" { + /// present 화면 전환 + /// Main 스토리보드의 LoginVC -> Main 스토리보드의 SuccessVC + guard let nextVC = self.storyboard?.instantiateViewController(withIdentifier: "SuccessVC") as? SuccessVC else {return} + + nextVC.modalPresentationStyle = .fullScreen + self.present(nextVC, animated: true, completion: nil) + } + + /// 서버에서 받은 message가 "회원 가입 성공"일 때만 화면 전환 + if message == "회원 가입 성공" { + /// present 화면 전환 + /// Main 스토리보드의 SignupVC -> Main 스토리보드의 SuccessVC + guard let nextVC = self.storyboard?.instantiateViewController(withIdentifier: "SuccessVC") as? SuccessVC else {return} + + nextVC.modalPresentationStyle = .fullScreen + self.present(nextVC, animated: true, completion: nil) + } + }) + alert.addAction(okAction) + present(alert, animated: true) + } } diff --git a/29th-iOS-Assignment/29th-iOS-Assignment/Source/Extensions/UserDefaults+Extension.swift b/29th-iOS-Assignment/29th-iOS-Assignment/Source/Extensions/UserDefaults+Extension.swift new file mode 100644 index 0000000..cbcd6ae --- /dev/null +++ b/29th-iOS-Assignment/29th-iOS-Assignment/Source/Extensions/UserDefaults+Extension.swift @@ -0,0 +1,15 @@ +// +// UserDefaults+Extension.swift +// 29th-iOS-Assignment +// +// Created by 양수빈 on 2021/11/12. +// + +import Foundation + +extension UserDefaults { + /// UserDefaults 값이 많아지는 경우를 관리하기 어렵기 때문에 Keys로 묶어서 관리 + enum Keys { + static var userName = "userName" + } +} diff --git a/29th-iOS-Assignment/29th-iOS-Assignment/Source/Models/LoginDataModel.swift b/29th-iOS-Assignment/29th-iOS-Assignment/Source/Models/LoginDataModel.swift new file mode 100644 index 0000000..1286f4b --- /dev/null +++ b/29th-iOS-Assignment/29th-iOS-Assignment/Source/Models/LoginDataModel.swift @@ -0,0 +1,22 @@ +// +// LoginDataModel.swift +// 29th-iOS-Assignment +// +// Created by 양수빈 on 2021/11/04. +// + +import Foundation + +// MARK: - LoginDataModel +struct LoginDataModel: Codable { + let status: Int + let success: Bool + let message: String + let data: LoginData? +} + +// MARK: - LoginData +struct LoginData: Codable { + let id: Int + let name, email: String +} diff --git a/29th-iOS-Assignment/29th-iOS-Assignment/Source/Models/SignupDataModel.swift b/29th-iOS-Assignment/29th-iOS-Assignment/Source/Models/SignupDataModel.swift new file mode 100644 index 0000000..cbf3f50 --- /dev/null +++ b/29th-iOS-Assignment/29th-iOS-Assignment/Source/Models/SignupDataModel.swift @@ -0,0 +1,23 @@ +// +// SignupDataModel.swift +// 29th-iOS-Assignment +// +// Created by 양수빈 on 2021/11/10. +// + +import Foundation + +// MARK: - SignupDataModel +struct SignupDataModel: Codable { + let status: Int + let success: Bool + let message: String + let data: SignupData? +} + +// MARK: - SignupData +struct SignupData: Codable { + let id: Int + let name, email: String +} + diff --git a/29th-iOS-Assignment/29th-iOS-Assignment/Source/ViewControllers/HomeVC.swift b/29th-iOS-Assignment/29th-iOS-Assignment/Source/ViewControllers/HomeVC.swift index 07d1cdd..8a14d79 100644 --- a/29th-iOS-Assignment/29th-iOS-Assignment/Source/ViewControllers/HomeVC.swift +++ b/29th-iOS-Assignment/29th-iOS-Assignment/Source/ViewControllers/HomeVC.swift @@ -80,6 +80,16 @@ class HomeVC: UIViewController { contentTableView.delegate = self contentTableView.dataSource = self } + + @IBAction func touchUpProfileButton(_ sender: Any) { + /// present 화면 전환 + /// YoutubeMain 스토리보드의 HomeVC -> Main 스토리보드의 navigationController + let storyboard = UIStoryboard.init(name: "Main", bundle: nil) + guard let navi = storyboard.instantiateViewController(withIdentifier: "MainNavi") as? UINavigationController else {return} + + navi.modalPresentationStyle = .fullScreen + present(navi, animated: true, completion: nil) + } } // MARK: - Layout diff --git a/29th-iOS-Assignment/29th-iOS-Assignment/Source/ViewControllers/LoginViewController.swift b/29th-iOS-Assignment/29th-iOS-Assignment/Source/ViewControllers/LoginVC.swift similarity index 72% rename from 29th-iOS-Assignment/29th-iOS-Assignment/Source/ViewControllers/LoginViewController.swift rename to 29th-iOS-Assignment/29th-iOS-Assignment/Source/ViewControllers/LoginVC.swift index ca2b15f..85035ec 100644 --- a/29th-iOS-Assignment/29th-iOS-Assignment/Source/ViewControllers/LoginViewController.swift +++ b/29th-iOS-Assignment/29th-iOS-Assignment/Source/ViewControllers/LoginVC.swift @@ -1,5 +1,5 @@ // -// LoginViewController.swift +// LoginVC.swift // 29th-iOS-Assignment // // Created by 양수빈 on 2021/10/04. @@ -9,7 +9,7 @@ import UIKit import SnapKit -class LoginViewController: UIViewController { +class LoginVC: UIViewController { // MARK: - Properties @IBOutlet weak var logoImageView: UIImageView! @@ -50,17 +50,14 @@ class LoginViewController: UIViewController { // MARK: - @IBAction @IBAction func touchUpToSuccess(_ sender: Any) { - guard let nextVC = self.storyboard?.instantiateViewController(withIdentifier: "SuccessViewController") as? SuccessViewController else {return} - - nextVC.message = nameTextField.text - nextVC.modalPresentationStyle = .fullScreen - self.present(nextVC, animated: true, completion: nil) + requestLogin() } @IBAction func touchUpToSignup(_ sender: Any) { - guard let nextVC = self.storyboard?.instantiateViewController(withIdentifier: "SignupViewController") else {return} - - self.navigationController?.pushViewController(nextVC, animated: true) + /// push 화면 전환 + /// Main 스토리보드의 LoginVC -> Main 스토리보드의 SignupVC + guard let nextVC = self.storyboard?.instantiateViewController(withIdentifier: "SignupVC") else {return} + navigationController?.pushViewController(nextVC, animated: true) } // MARK: - @objc @@ -72,7 +69,7 @@ class LoginViewController: UIViewController { } // MARK: - Layout -extension LoginViewController { +extension LoginVC { func setupLayout() { logoImageView.snp.makeConstraints { make in make.top.equalToSuperview().offset(100) @@ -122,3 +119,32 @@ extension LoginViewController { } } } + +// MARK: - Network +extension LoginVC { + func requestLogin() { + LoginService.shared.login(email: emailTextField.text ?? "", password: pwTextField.text ?? "") { [self] responseData in + switch responseData { + case .success(let loginResponse): + guard let response = loginResponse as? LoginDataModel else {return} + if response.data != nil { + self.showAlert(title: "로그인", message: response.message) + } + UserDefaults.standard.set(nameTextField.text, forKey: UserDefaults.Keys.userName) + case .requestErr(let loginResponse): + guard let response = loginResponse as? LoginDataModel else {return} + self.showAlert(title: "로그인", message: response.message, okAction: nil) + print("requestErr") + + case .pathErr: + print("pathErr") + + case .serverErr: + print("serverErr") + + case .networkFail: + print("networkFail") + } + } + } +} diff --git a/29th-iOS-Assignment/29th-iOS-Assignment/Source/ViewControllers/SignupViewController.swift b/29th-iOS-Assignment/29th-iOS-Assignment/Source/ViewControllers/SignupVC.swift similarity index 75% rename from 29th-iOS-Assignment/29th-iOS-Assignment/Source/ViewControllers/SignupViewController.swift rename to 29th-iOS-Assignment/29th-iOS-Assignment/Source/ViewControllers/SignupVC.swift index a99949a..3be7246 100644 --- a/29th-iOS-Assignment/29th-iOS-Assignment/Source/ViewControllers/SignupViewController.swift +++ b/29th-iOS-Assignment/29th-iOS-Assignment/Source/ViewControllers/SignupVC.swift @@ -1,5 +1,5 @@ // -// SignupViewController.swift +// SignupVC.swift // 29th-iOS-Assignment // // Created by 양수빈 on 2021/10/04. @@ -9,7 +9,7 @@ import UIKit import SnapKit -class SignupViewController: UIViewController { +class SignupVC: UIViewController { // MARK: - Properties @IBOutlet weak var logoImageView: UIImageView! @@ -48,11 +48,7 @@ class SignupViewController: UIViewController { // MARK: - @IBAction @IBAction func touchUpToSuccess(_ sender: Any) { - guard let nextVC = self.storyboard?.instantiateViewController(withIdentifier: "SuccessViewController") as? SuccessViewController else {return} - - nextVC.message = nameTextField.text - nextVC.modalPresentationStyle = .fullScreen - self.present(nextVC, animated: true, completion: nil) + requestSignup() } // MARK: - @objc @@ -71,7 +67,7 @@ class SignupViewController: UIViewController { } // MARK: - Layout -extension SignupViewController { +extension SignupVC { func setupLayout() { logoImageView.snp.makeConstraints { make in make.top.equalToSuperview().offset(100) @@ -121,3 +117,32 @@ extension SignupViewController { } } } + +// MARK: - Network +extension SignupVC { + func requestSignup() { + SignupService.shared.signup(email: emailTextField.text ?? "", name: nameTextField.text ?? "", password: pwTextField.text ?? "") { [self] responseData in + switch responseData { + case .success(let signupResponse): + guard let response = signupResponse as? SignupDataModel else {return} + if response.data != nil { + self.showAlert(title: "회원가입", message: response.message) + } + UserDefaults.standard.set(nameTextField.text, forKey: UserDefaults.Keys.userName) + case .requestErr(let loginResponse): + guard let response = loginResponse as? SignupDataModel else {return} + self.showAlert(title: "회원가입", message: response.message, okAction: nil) + print("requestErr") + + case .pathErr: + print("pathErr") + + case .serverErr: + print("serverErr") + + case .networkFail: + print("networkFail") + } + } + } +} diff --git a/29th-iOS-Assignment/29th-iOS-Assignment/Source/ViewControllers/SuccessViewController.swift b/29th-iOS-Assignment/29th-iOS-Assignment/Source/ViewControllers/SuccessVC.swift similarity index 94% rename from 29th-iOS-Assignment/29th-iOS-Assignment/Source/ViewControllers/SuccessViewController.swift rename to 29th-iOS-Assignment/29th-iOS-Assignment/Source/ViewControllers/SuccessVC.swift index 97e1507..38ead71 100644 --- a/29th-iOS-Assignment/29th-iOS-Assignment/Source/ViewControllers/SuccessViewController.swift +++ b/29th-iOS-Assignment/29th-iOS-Assignment/Source/ViewControllers/SuccessVC.swift @@ -1,5 +1,5 @@ // -// SuccessViewController.swift +// SuccessVC.swift // 29th-iOS-Assignment // // Created by 양수빈 on 2021/10/04. @@ -7,7 +7,7 @@ import UIKit -class SuccessViewController: UIViewController { +class SuccessVC: UIViewController { // MARK: - Properties @IBOutlet weak var logoImageView: UIImageView! @@ -33,7 +33,7 @@ class SuccessViewController: UIViewController { /// 받아온 이름 넣는 함수 func setNameLabel() { - if let name = message { + if let name = UserDefaults.standard.string(forKey: UserDefaults.Keys.userName) { nameLabel.text = "\(name)님\n환영합니다!" nameLabel.sizeToFit() } @@ -60,7 +60,7 @@ class SuccessViewController: UIViewController { } // MARK: - Layout -extension SuccessViewController { +extension SuccessVC { func setupLayout() { logoImageView.snp.makeConstraints { make in make.top.equalToSuperview().offset(207) diff --git a/29th-iOS-Assignment/Podfile b/29th-iOS-Assignment/Podfile index 4ea6d93..ef68abc 100644 --- a/29th-iOS-Assignment/Podfile +++ b/29th-iOS-Assignment/Podfile @@ -8,5 +8,6 @@ target '29th-iOS-Assignment' do # Pods for 29th-iOS-Assignment pod 'SnapKit', '~> 5.0.0' pod 'Then' + pod 'Alamofire', '~> 5.4' end diff --git a/29th-iOS-Assignment/Podfile.lock b/29th-iOS-Assignment/Podfile.lock index 0450bbf..8592163 100644 --- a/29th-iOS-Assignment/Podfile.lock +++ b/29th-iOS-Assignment/Podfile.lock @@ -1,20 +1,24 @@ PODS: + - Alamofire (5.4.4) - SnapKit (5.0.1) - Then (2.7.0) DEPENDENCIES: + - Alamofire (~> 5.4) - SnapKit (~> 5.0.0) - Then SPEC REPOS: trunk: + - Alamofire - SnapKit - Then SPEC CHECKSUMS: + Alamofire: f3b09a368f1582ab751b3fff5460276e0d2cf5c9 SnapKit: 97b92857e3df3a0c71833cce143274bf6ef8e5eb Then: acfe0be7e98221c6204e12f8161459606d5d822d -PODFILE CHECKSUM: e1c39ea5384bbe810ac0163594d909cb76de0097 +PODFILE CHECKSUM: 3710bc95a311c7e5a9946e9a89916837fcad19c8 COCOAPODS: 1.11.2