From cd8bdeebf3296939e0713cb92d8d16945198175e Mon Sep 17 00:00:00 2001 From: Choi YoungLyn Date: Sun, 17 Jul 2022 02:28:14 +0900 Subject: [PATCH 1/3] =?UTF-8?q?[Fix]=20provisioning=20profile=20=EC=9E=AC?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HealthFoodMe/HealthFoodMe.xcodeproj/project.pbxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HealthFoodMe/HealthFoodMe.xcodeproj/project.pbxproj b/HealthFoodMe/HealthFoodMe.xcodeproj/project.pbxproj index 9fdc9945..2252e787 100644 --- a/HealthFoodMe/HealthFoodMe.xcodeproj/project.pbxproj +++ b/HealthFoodMe/HealthFoodMe.xcodeproj/project.pbxproj @@ -2019,7 +2019,7 @@ MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = com.healthFoodMe.release; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = healthFood_dev; + PROVISIONING_PROFILE_SPECIFIER = HealthFoodMe_Dev; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; From 3ce0a81fad1ff43a8834cd61e6af8001892136ea Mon Sep 17 00:00:00 2001 From: Choi YoungLyn Date: Wed, 20 Jul 2022 01:49:38 +0900 Subject: [PATCH 2/3] =?UTF-8?q?[Feat]=20#120=20-=20=EB=A6=AC=EB=B7=B0=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=20API=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HealthFoodMe.xcodeproj/project.pbxproj | 20 +++++++++ .../ReviewWriteScene/ReviewWriteEntity.swift | 40 ++++++++++++++++++ .../Data/Network/Foundation/HeaderType.swift | 2 +- .../Data/Network/Routers/ReviewRouter.swift | 39 ++++++++++++++---- .../Data/Network/Services/ReviewService.swift | 25 +++++++++++ .../HealthFoodMe/GoogleService-Info.plist | 36 ++++++++++++++++ .../ReviewWriteScene/VC/ReviewWriteVC.swift | 41 +++++++++++++++++-- 7 files changed, 192 insertions(+), 11 deletions(-) create mode 100644 HealthFoodMe/HealthFoodMe/Data/Entity/Review/ReviewWriteScene/ReviewWriteEntity.swift create mode 100644 HealthFoodMe/HealthFoodMe/GoogleService-Info.plist diff --git a/HealthFoodMe/HealthFoodMe.xcodeproj/project.pbxproj b/HealthFoodMe/HealthFoodMe.xcodeproj/project.pbxproj index 466537de..f318a091 100644 --- a/HealthFoodMe/HealthFoodMe.xcodeproj/project.pbxproj +++ b/HealthFoodMe/HealthFoodMe.xcodeproj/project.pbxproj @@ -54,6 +54,7 @@ 695758EC28830E3000E36789 /* SplashVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 695758EB28830E3000E36789 /* SplashVC.swift */; }; 695758EE28830E3F00E36789 /* Splash.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 695758ED28830E3F00E36789 /* Splash.storyboard */; }; 695758F4288545CC00E36789 /* CopingTabEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 695758F3288545CC00E36789 /* CopingTabEntity.swift */; }; + 695758F928857FDC00E36789 /* ReviewWriteEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 695758F828857FDC00E36789 /* ReviewWriteEntity.swift */; }; A9325274287D3065001EDF50 /* SearchResultTVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9325273287D3065001EDF50 /* SearchResultTVC.swift */; }; A9325277287D4F10001EDF50 /* SearchResultModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9325276287D4F10001EDF50 /* SearchResultModel.swift */; }; A932527E287DD261001EDF50 /* SearchResultVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A932527D287DD261001EDF50 /* SearchResultVC.swift */; }; @@ -253,6 +254,7 @@ 695758EB28830E3000E36789 /* SplashVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashVC.swift; sourceTree = ""; }; 695758ED28830E3F00E36789 /* Splash.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Splash.storyboard; sourceTree = ""; }; 695758F3288545CC00E36789 /* CopingTabEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CopingTabEntity.swift; sourceTree = ""; }; + 695758F828857FDC00E36789 /* ReviewWriteEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReviewWriteEntity.swift; sourceTree = ""; }; A9325273287D3065001EDF50 /* SearchResultTVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultTVC.swift; sourceTree = ""; }; A9325276287D4F10001EDF50 /* SearchResultModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultModel.swift; sourceTree = ""; }; A932527D287DD261001EDF50 /* SearchResultVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultVC.swift; sourceTree = ""; }; @@ -657,6 +659,22 @@ path = CopingTabScene; sourceTree = ""; }; + 695758F528857F8400E36789 /* Review */ = { + isa = PBXGroup; + children = ( + 695758F628857F9500E36789 /* ReviewWriteScene */, + ); + path = Review; + sourceTree = ""; + }; + 695758F628857F9500E36789 /* ReviewWriteScene */ = { + isa = PBXGroup; + children = ( + 695758F828857FDC00E36789 /* ReviewWriteEntity.swift */, + ); + path = ReviewWriteScene; + sourceTree = ""; + }; 697074FB28737D78001A607F /* MenuTabScene */ = { isa = PBXGroup; children = ( @@ -1525,6 +1543,7 @@ EBF66B062872AE4200DE0ED1 /* Entity */ = { isa = PBXGroup; children = ( + 695758F528857F8400E36789 /* Review */, FDF2E21A287F5D7F0007D4F9 /* Author */, EB6A44F82873BF4000749582 /* Map */, EB6A44DC28737DFA00749582 /* Detail */, @@ -1920,6 +1939,7 @@ A93252B5287F2CA6001EDF50 /* ScrapCVC.swift in Sources */, EBF66ABE287227F500DE0ED1 /* UITextView+.swift in Sources */, EBF66AD5287227F500DE0ED1 /* ViewModelType.swift in Sources */, + 695758F928857FDC00E36789 /* ReviewWriteEntity.swift in Sources */, 69028BB02874A60E00373984 /* HeaderView.swift in Sources */, 695758D52881121900E36789 /* CopingTabVC.swift in Sources */, EBF66ADA287227F500DE0ED1 /* controllerFromStoryBoard.swift in Sources */, diff --git a/HealthFoodMe/HealthFoodMe/Data/Entity/Review/ReviewWriteScene/ReviewWriteEntity.swift b/HealthFoodMe/HealthFoodMe/Data/Entity/Review/ReviewWriteScene/ReviewWriteEntity.swift new file mode 100644 index 00000000..067c4d40 --- /dev/null +++ b/HealthFoodMe/HealthFoodMe/Data/Entity/Review/ReviewWriteScene/ReviewWriteEntity.swift @@ -0,0 +1,40 @@ +// +// ReviewWriteEntity.swift +// HealthFoodMe +// +// Created by 최영린 on 2022/07/18. +// + +import Foundation + +// MARK: - ReviewWriteEntity + +struct ReviewWriteEntity: Codable { + let restaurant, writer: String + let score: Int + let content: String + let image: [Image] + let taste: String + let good: [String] + let id: String + let v: Int + + enum CodingKeys: String, CodingKey { + case restaurant, writer, score, content, image, taste, good + case id = "_id" + case v = "__v" + } +} + +// MARK: - Image +struct Image: Codable { + let name: String + let url: String + let id: String + + enum CodingKeys: String, CodingKey { + case name, url + case id = "_id" + } +} + diff --git a/HealthFoodMe/HealthFoodMe/Data/Network/Foundation/HeaderType.swift b/HealthFoodMe/HealthFoodMe/Data/Network/Foundation/HeaderType.swift index e0ea634e..10995a43 100644 --- a/HealthFoodMe/HealthFoodMe/Data/Network/Foundation/HeaderType.swift +++ b/HealthFoodMe/HealthFoodMe/Data/Network/Foundation/HeaderType.swift @@ -22,5 +22,5 @@ enum HTTPHeaderField: String { enum HeaderContent: String { case json = "application/json" case multiPart = "multipart/form-data" - case tokenSerial = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjYyZDRlODRmMGZmMmY5MDBlYTg4YmVjMyIsImlhdCI6MTY1ODEzNDc3OCwiZXhwIjoxNjU4MTM4Mzc4fQ.mngTawFjSZ37wwv6EqeZE1Y5qU2maE1_2ECgW2yTPYs" + case tokenSerial = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjYyZDRlODRmMGZmMmY5MDBlYTg4YmVjMyIsImlhdCI6MTY1ODI0NzMwMCwiZXhwIjoxNjU4MjUwOTAwfQ.amovJp_3LDOBBcPrlO6ZQJT0QTW-17VX5otwrbEuYxk" } diff --git a/HealthFoodMe/HealthFoodMe/Data/Network/Routers/ReviewRouter.swift b/HealthFoodMe/HealthFoodMe/Data/Network/Routers/ReviewRouter.swift index 8caef17a..9634da64 100644 --- a/HealthFoodMe/HealthFoodMe/Data/Network/Routers/ReviewRouter.swift +++ b/HealthFoodMe/HealthFoodMe/Data/Network/Routers/ReviewRouter.swift @@ -6,30 +6,55 @@ // import Alamofire +import UIKit enum ReviewRouter { - + case requestReviewWrite(userId: String, restaurantId: String, score: Double, taste: String, good: [String], content: String, image: [UIImage]) } extension ReviewRouter: BaseRouter { var method: HTTPMethod { switch self { - default : - return .get + case .requestReviewWrite: + return .post } } + var header: HeaderType { + return .multiPartWithToken + } + var path: String { switch self { - default: - return "" + case .requestReviewWrite(let userId, let restaurantId,_,_,_,_,_): + return "/review/user/\(userId)/restaurant/\(restaurantId)" } } var parameters: RequestParams { + return .requestPlain + } + + var multipart: MultipartFormData { switch self { - default: - return .requestPlain + case .requestReviewWrite(_,_,let score, let taste, let good, let content, let image): + let multiPart = MultipartFormData() + + multiPart.append(Data(String(score).utf8), withName: "score") + multiPart.append(Data(taste.utf8), withName: "taste") + good.forEach { + let data = Data(String($0).utf8) + multiPart.append(data, withName: "good") + } + multiPart.append(Data(content.utf8), withName: "content") + for (index, item) in image.enumerated() { + print(index, item) + if let imageData = item.pngData() { + multiPart.append(imageData, withName: "image", fileName: "image\(index).png", mimeType: "image/png") + } + } + + return multiPart } } } diff --git a/HealthFoodMe/HealthFoodMe/Data/Network/Services/ReviewService.swift b/HealthFoodMe/HealthFoodMe/Data/Network/Services/ReviewService.swift index 90e83f4e..84ed06e8 100644 --- a/HealthFoodMe/HealthFoodMe/Data/Network/Services/ReviewService.swift +++ b/HealthFoodMe/HealthFoodMe/Data/Network/Services/ReviewService.swift @@ -15,4 +15,29 @@ class ReviewService: BaseService { extension ReviewService { + func requestReviewWrite(userId: String, restaurantId: String, score: Double, taste: String, good: [String], content: String, image: [UIImage], completion: @escaping (NetworkResult) -> Void) { + + AFManager.upload(multipartFormData: ReviewRouter.requestReviewWrite(userId: userId, + restaurantId: restaurantId, + score: score, + taste: taste, + good: good, + content: content, + image: image).multipart, + with: ReviewRouter.requestReviewWrite(userId: userId, + restaurantId: restaurantId, score: score, taste: taste, good: good, content: content, image: image)).responseData { response in + switch(response.result) { + case .success(let data): + guard let statusCode = response.response?.statusCode else { return } + guard let reviewRequestData = response.data else { return } + + let networkResult = self.judgeStatus(by: statusCode, reviewRequestData, type: ReviewWriteEntity.self, decodingMode: .model) + completion(networkResult) + + + case .failure(let err) : + print("ERR") + } + } + } } diff --git a/HealthFoodMe/HealthFoodMe/GoogleService-Info.plist b/HealthFoodMe/HealthFoodMe/GoogleService-Info.plist new file mode 100644 index 00000000..517fdbf7 --- /dev/null +++ b/HealthFoodMe/HealthFoodMe/GoogleService-Info.plist @@ -0,0 +1,36 @@ + + + + + CLIENT_ID + 978280628900-i578u456pougpdhlh0mmf6hdf1d6dspa.apps.googleusercontent.com + REVERSED_CLIENT_ID + com.googleusercontent.apps.978280628900-i578u456pougpdhlh0mmf6hdf1d6dspa + ANDROID_CLIENT_ID + 978280628900-qhf2c4ltcl71e4reod89n3mlan5p1q58.apps.googleusercontent.com + API_KEY + AIzaSyAVRFfLu-g1b8g-SQyWlgSQkGwAy9ThdYM + GCM_SENDER_ID + 978280628900 + PLIST_VERSION + 1 + BUNDLE_ID + com.healthFoodMe.release + PROJECT_ID + health-food-me + STORAGE_BUCKET + health-food-me.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:978280628900:ios:ec2ddfc73e29e2ed6bdc31 + + \ No newline at end of file diff --git a/HealthFoodMe/HealthFoodMe/Presentation/Detail/ReviewWriteScene/VC/ReviewWriteVC.swift b/HealthFoodMe/HealthFoodMe/Presentation/Detail/ReviewWriteScene/VC/ReviewWriteVC.swift index d0188a8e..4f2c0e37 100644 --- a/HealthFoodMe/HealthFoodMe/Presentation/Detail/ReviewWriteScene/VC/ReviewWriteVC.swift +++ b/HealthFoodMe/HealthFoodMe/Presentation/Detail/ReviewWriteScene/VC/ReviewWriteVC.swift @@ -26,6 +26,8 @@ final class ReviewWriteVC: UIViewController, UIScrollViewDelegate { var userSelectedImages: [UIImage] = [UIImage]() var tasteSet = "" var feelingArray: [Bool] = [false, false, false] + var userId = "62d4e84f0ff2f900ea88bec3" //임시로 넣어준 userID + var restaurantID = "62d26c9bd11146a81ef18ea6" //임시로 넣어준 식당ID private var currentRate: Double = 0 // MARK: - UI Components @@ -46,7 +48,7 @@ final class ReviewWriteVC: UIViewController, UIScrollViewDelegate { private lazy var restaurantTitleLabel: UILabel = { let lb = UILabel() - lb.text = "샐러디 태릉입구점" + lb.text = "샐러디 태릉입구점(임시)" lb.textColor = .helfmeBlack lb.font = .NotoBold(size: 16) return lb @@ -675,7 +677,7 @@ extension ReviewWriteVC { if !checkReview() { showReviewToast() } else { - makeAlert(title: "알림", message: "작성완료!") + requestReviewWrite() } } @@ -769,7 +771,40 @@ extension ReviewWriteVC { // MARK: - Network extension ReviewWriteVC { - + func requestReviewWrite() { + let starScore = self.currentRate + let taste = tasteSet + var good : [String] = [] + for i in 0...2 { + if feelingArray[i] == true{ + switch i{ + case 0: + good.append("# 약속 시 부담없는") + case 1: + good.append("# 양 조절 쉬운") + case 2: + good.append("# 든든한") + default: + print("음") + } + } + } + + guard let content = reviewTextView.text else { return } + let image = photoModel.userSelectedImages + print("12\(image)") + ReviewService.shared.requestReviewWrite(userId: userId, restaurantId: restaurantID, score: starScore, taste: taste, good: good, content: content, image: image) { networkResult in + dump(networkResult) + switch networkResult { + case .success(let data): + if let data = data as? ReviewWriteEntity { + print(data, "성공") + } + default: + break; + } + } + } } extension ReviewWriteVC: UICollectionViewDelegate, UICollectionViewDataSource { From dc235df3702bd85d7ea94e3a834c74c0338910bb Mon Sep 17 00:00:00 2001 From: Choi YoungLyn Date: Wed, 20 Jul 2022 02:46:34 +0900 Subject: [PATCH 3/3] =?UTF-8?q?[Feat]=20#120-=EB=A6=AC=EB=B7=B0=EC=9E=91?= =?UTF-8?q?=EC=84=B1=EB=B2=84=ED=8A=BC=20=ED=9B=84=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Data/Network/Routers/ReviewRouter.swift | 1 - .../Detail/ReviewWriteScene/VC/ReviewWriteVC.swift | 10 ++++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/HealthFoodMe/HealthFoodMe/Data/Network/Routers/ReviewRouter.swift b/HealthFoodMe/HealthFoodMe/Data/Network/Routers/ReviewRouter.swift index b0bbcbd8..bab922f6 100644 --- a/HealthFoodMe/HealthFoodMe/Data/Network/Routers/ReviewRouter.swift +++ b/HealthFoodMe/HealthFoodMe/Data/Network/Routers/ReviewRouter.swift @@ -82,7 +82,6 @@ extension ReviewRouter: BaseRouter { default: return MultipartFormData() } - var header: HeaderType { switch self { default: diff --git a/HealthFoodMe/HealthFoodMe/Presentation/Detail/ReviewWriteScene/VC/ReviewWriteVC.swift b/HealthFoodMe/HealthFoodMe/Presentation/Detail/ReviewWriteScene/VC/ReviewWriteVC.swift index 4f2c0e37..44f255d4 100644 --- a/HealthFoodMe/HealthFoodMe/Presentation/Detail/ReviewWriteScene/VC/ReviewWriteVC.swift +++ b/HealthFoodMe/HealthFoodMe/Presentation/Detail/ReviewWriteScene/VC/ReviewWriteVC.swift @@ -385,13 +385,11 @@ extension ReviewWriteVC { backButton.setImage(ImageLiterals.MainDetail.beforeIcon, for: .normal) backButton.tintColor = .helfmeBlack backButton.addAction(UIAction(handler: { _ in - self.makeAlert(alertType: .logoutAlert, title: "리뷰작성을 취소하시겠습니까?", subtitle: "작성취소 시,\n 작성된 글은 저장되지 않습니다.") { self.navigationController?.dismiss(animated: true) - - } + } }), for: .touchUpInside) self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: backButton) } @@ -790,15 +788,19 @@ extension ReviewWriteVC { } } + if reviewTextView.text == I18N.Detail.Review.reviewPlaceholder{ + reviewTextView.text = " " + } guard let content = reviewTextView.text else { return } + let image = photoModel.userSelectedImages - print("12\(image)") ReviewService.shared.requestReviewWrite(userId: userId, restaurantId: restaurantID, score: starScore, taste: taste, good: good, content: content, image: image) { networkResult in dump(networkResult) switch networkResult { case .success(let data): if let data = data as? ReviewWriteEntity { print(data, "성공") + self.navigationController?.dismiss(animated: true) } default: break;