Skip to content

Commit

Permalink
[FEAT] TeamNADA#53 - 명함 생성, 명함 세부 조회 서버통신
Browse files Browse the repository at this point in the history
### Descriptions
- CardAPI, CardService 작성
- Card 네트워크 데이터 모델 생성
- 명함생성 moya task 코드 리펙토링 필요(Card 데이터모델 공유를 위해서 우선 커밋)
  • Loading branch information
hyun99999 committed Nov 4, 2021
1 parent 5478131 commit 05c6ff4
Show file tree
Hide file tree
Showing 6 changed files with 268 additions and 0 deletions.
16 changes: 16 additions & 0 deletions NADA-iOS-forRelease.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@
F84BAFB226FDB552004CA335 /* BackCardCreationCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F84BAFB026FDB552004CA335 /* BackCardCreationCollectionViewCell.xib */; };
F858079E2700354E00872484 /* BackgroundCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F858079C2700354E00872484 /* BackgroundCollectionViewCell.swift */; };
F858079F2700354E00872484 /* BackgroundCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F858079D2700354E00872484 /* BackgroundCollectionViewCell.xib */; };
F87122762733046300A24E74 /* Card.swift in Sources */ = {isa = PBXBuildFile; fileRef = F87122752733046300A24E74 /* Card.swift */; };
F871227827330A3800A24E74 /* CardCreationRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = F871227727330A3800A24E74 /* CardCreationRequest.swift */; };
F8C83FAE272F99940009DF0D /* MoyaLoggerPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8C83FAD272F99940009DF0D /* MoyaLoggerPlugin.swift */; };
F8C83FB6272F9E380009DF0D /* UtilService.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8C83FB5272F9E380009DF0D /* UtilService.swift */; };
F8C83FB8272F9E3F0009DF0D /* UtilAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8C83FB7272F9E3F0009DF0D /* UtilAPI.swift */; };
Expand Down Expand Up @@ -114,6 +116,8 @@
F84BAFB026FDB552004CA335 /* BackCardCreationCollectionViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BackCardCreationCollectionViewCell.xib; sourceTree = "<group>"; };
F858079C2700354E00872484 /* BackgroundCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackgroundCollectionViewCell.swift; sourceTree = "<group>"; };
F858079D2700354E00872484 /* BackgroundCollectionViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BackgroundCollectionViewCell.xib; sourceTree = "<group>"; };
F87122752733046300A24E74 /* Card.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Card.swift; sourceTree = "<group>"; };
F871227727330A3800A24E74 /* CardCreationRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardCreationRequest.swift; sourceTree = "<group>"; };
F8C83FAD272F99940009DF0D /* MoyaLoggerPlugin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoyaLoggerPlugin.swift; sourceTree = "<group>"; };
F8C83FB5272F9E380009DF0D /* UtilService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtilService.swift; sourceTree = "<group>"; };
F8C83FB7272F9E3F0009DF0D /* UtilAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtilAPI.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -321,6 +325,15 @@
path = Background;
sourceTree = "<group>";
};
F87122722733032300A24E74 /* Card */ = {
isa = PBXGroup;
children = (
F87122752733046300A24E74 /* Card.swift */,
F871227727330A3800A24E74 /* CardCreationRequest.swift */,
);
path = Card;
sourceTree = "<group>";
};
F8C83FAC272F998A0009DF0D /* Plugin */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -370,6 +383,7 @@
children = (
F8C83FBA272F9F370009DF0D /* NetworkResult.swift */,
F8C83FBC272F9F430009DF0D /* GenericResponse.swift */,
F87122722733032300A24E74 /* Card */,
);
path = NetworkModel;
sourceTree = "<group>";
Expand Down Expand Up @@ -685,6 +699,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
F87122762733046300A24E74 /* Card.swift in Sources */,
F84BAF9D26FDB417004CA335 /* CardCreationViewController.swift in Sources */,
F8C83FCB272FA32C0009DF0D /* GroupService.swift in Sources */,
F858079E2700354E00872484 /* BackgroundCollectionViewCell.swift in Sources */,
Expand All @@ -708,6 +723,7 @@
F8F5D0AA270800FD00D99D2E /* Xib.swift in Sources */,
F82FF8252702000000E57F8B /* RequiredFlavorCollectionViewCell.swift in Sources */,
F8C83FC7272FA2A20009DF0D /* CardService.swift in Sources */,
F871227827330A3800A24E74 /* CardCreationRequest.swift in Sources */,
F8FC43B326C020B90033E151 /* TempProtocols.swift in Sources */,
F8FC43B526C020C10033E151 /* TempViews.swift in Sources */,
F8C83FBB272F9F370009DF0D /* NetworkResult.swift in Sources */,
Expand Down
23 changes: 23 additions & 0 deletions NADA-iOS-forRelease/Sources/NetworkModel/Card/Card.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
//
// Card.swift
// NADA-iOS-forRelease
//
// Created by kimhyungyu on 2021/11/04.
//

import Foundation

// MARK: - Card
struct Card: Codable {
let cardID, background, title, name: String
let birthDate, age, mbti, instagram: String
let linkName, link, description: String
let isMincho, isSoju, isBoomuk, isSauced: Bool
let oneQuestion, oneAnswer, twoQuestion, twoAnswer: String

enum CodingKeys: String, CodingKey {
case cardID = "cardId"
case background, title, name, birthDate, age, mbti, instagram, linkName, link, description
case isMincho, isSoju, isBoomuk, isSauced, oneQuestion, oneAnswer, twoQuestion, twoAnswer
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
//
// CardCreation.swift
// NADA-iOS-forRelease
//
// Created by kimhyungyu on 2021/11/04.
//

import Foundation

// MARK: - CardCreation
struct CardCreationRequest: Codable {
let userID: String
let defaultImage: Int
let title, name, birthDate, mbti: String
let instagram, linkName, link, description: String
let isMincho, isSoju, isBoomuk, isSauced: Bool
let oneQuestion, oneAnswer, twoQuestion, twoAnswer: String

enum CodingKeys: String, CodingKey {
case userID = "userId"
case defaultImage, title, name, birthDate, mbti, instagram, linkName, link, description
case isMincho, isSoju, isBoomuk, isSauced, oneQuestion, oneAnswer, twoQuestion, twoAnswer
}
}
61 changes: 61 additions & 0 deletions NADA-iOS-forRelease/Sources/NetworkService/Card/CardAPI.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,64 @@
//

import Foundation
import Moya

public class CardAPI {

static let shared = CardAPI()
var cardProvider = MoyaProvider<CardService>(plugins: [MoyaLoggerPlugin()])

public init() { }

func getCardDetailFetch(cardID: String, completion: @escaping (NetworkResult<Any>) -> Void) {
cardProvider.request(.cardDetailFetch(cardID: cardID)) { (result) in
switch result {
case .success(let response):
let statusCode = response.statusCode
let data = response.data

let networkResult = self.judgeStatus(by: statusCode, data)
completion(networkResult)

case .failure(let err):
print(err)
}
}
}

func postCardCreation(request: CardCreationRequest, image: UIImage, completion: @escaping (NetworkResult<Any>) -> Void) {
cardProvider.request(.cardCreation(request: request, image: image)) { (result) in
switch result {
case .success(let response):
let statusCode = response.statusCode
let data = response.data

let networkResult = self.judgeStatus(by: statusCode, data)
completion(networkResult)

case .failure(let err):
print(err)
}
}
}

private func judgeStatus(by statusCode: Int, _ data: Data) -> NetworkResult<Any> {

let decoder = JSONDecoder()
guard let decodedData = try? decoder.decode(GenericResponse<Card>.self, from: data)
else {
return .pathErr
}

switch statusCode {
case 200:
return .success(decodedData.data)
case 400..<500:
return .requestErr(decodedData.msg)
case 500:
return .serverErr
default:
return .networkFail
}
}
}
99 changes: 99 additions & 0 deletions NADA-iOS-forRelease/Sources/NetworkService/Card/CardService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,102 @@
//

import Foundation
import Moya

enum CardService {
case cardDetailFetch(cardID: String)
case cardCreation(request: CardCreationRequest, image: UIImage)
}

extension CardService: TargetType {

var baseURL: URL {
return URL(string: Const.URL.baseURL)!
}

var path: String {
switch self {
case .cardDetailFetch(let cardID):
return "/card/\(cardID)"
case .cardCreation:
return "/card"
}
}

var method: Moya.Method {
switch self {
case .cardDetailFetch:
return .get
case .cardCreation:
return .post
}
}

var sampleData: Data {
return Data()
}

var task: Task {
switch self {
case .cardDetailFetch:
return .requestPlain
case .cardCreation(let request, let image):

// var multiPartData: [Moya.MultipartFormData] = []
//
// let userIDData = request.userID.data(using: .utf8) ?? Data()
// multiPartData.append(MultipartFormData(provider: .data(userIDData), name: "userId"))
// let defaultImageData = "\(request.defaultImage)".data(using: .utf8) ?? Data()
// multiPartData.append(MultipartFormData(provider: .data(defaultImageData), name: "defaultImage"))
// let titleData = request.title.data(using: .utf8) ?? Data()
// multiPartData.append(MultipartFormData(provider: .data(titleData), name: "title"))
// let nameData = request.name.data(using: .utf8) ?? Data()
// multiPartData.append(MultipartFormData(provider: .data(nameData), name: "name"))
// let birthDateData = request.birthDate.data(using: .utf8) ?? Data()
// multiPartData.append(MultipartFormData(provider: .data(birthDateData), name: "birthDate"))
// let mbtiData = request.mbti.data(using: .utf8) ?? Data()
// multiPartData.append(MultipartFormData(provider: .data(mbtiData), name: "mbti"))
// let instagramData = request.instagram.data(using: .utf8) ?? Data()
// multiPartData.append(MultipartFormData(provider: .data(instagramData), name: "instagram"))
// let linkNameData = request.linkName.data(using: .utf8) ?? Data()
// multiPartData.append(MultipartFormData(provider: .data(linkNameData), name: "linkName"))
// let linkData = request.link.data(using: .utf8) ?? Data()
// multiPartData.append(MultipartFormData(provider: .data(linkData), name: "link"))
// let descriptionData = request.description.data(using: .utf8) ?? Data()
// multiPartData.append(MultipartFormData(provider: .data(descriptionData), name: "description"))
// let isMinchoData = request.isMincho.data(using: .utf8) ?? Data()
// multiPartData.append(MultipartFormData(provider: .data(isMinchoData), name: "isMincho"))
// let isSojuData = request.isSoju.data(using: .utf8) ?? Data()
// multiPartData.append(MultipartFormData(provider: .data(isSojuData), name: "isSoju"))
// let isBoomukData = request.isBoomuk.data(using: .utf8) ?? Data()
// multiPartData.append(MultipartFormData(provider: .data(isBoomukData), name: "isBoomuk"))
// let isSaucedData = request.isSauced.data(using: .utf8) ?? Data()
// multiPartData.append(MultipartFormData(provider: .data(isSaucedData), name: "isSauced"))
// let oneQuestionData = request.oneQuestion.data(using: .utf8) ?? Data()
// multiPartData.append(MultipartFormData(provider: .data(oneQuestionData), name: "oneQuestion"))
// let oneAnswerData = request.oneAnswer.data(using: .utf8) ?? Data()
// multiPartData.append(MultipartFormData(provider: .data(oneAnswerData), name: "oneAnswer"))
// let twoQuestionData = request.twoQuestion.data(using: .utf8) ?? Data()
// multiPartData.append(MultipartFormData(provider: .data(twoQuestionData), name: "twoQuestion"))
// let twoAnswerData = request.twoAnswer.data(using: .utf8) ?? Data()
// multiPartData.append(MultipartFormData(provider: .data(twoAnswerData), name: "twoAnswer"))
//
// let imageData = MultipartFormData(provider: .data(image.pngData() ?? Data()), name: "image", fileName: "image", mimeType: "image/png")
// multiPartData.append(imageData)
//
// return .uploadMultipart(multiPartData)
return .requestPlain
}
}

var headers: [String : String]? {
switch self {
case .cardDetailFetch:
return .none
case .cardCreation:
return ["Content-Type": "multipart/form-data"]
}
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ class CardCreationViewController: UIViewController {
private var backCardIsEmpty = true
private var restoreFrameYValue = 0.0
private var currentIndex = 0
private var cardData: Card?

// MARK: - @IBOutlet Properties
@IBOutlet weak var creationTextLabel: UILabel!
Expand All @@ -37,6 +38,11 @@ class CardCreationViewController: UIViewController {
touchViewToDownKeyboard()
initRestoreFrameYValue()
setTextLabelGesture()

// TODO: 서버통신 테스트 중. 추후 호출 위치 변경.
// getCardDetailFetchWithAPI(cardID: "cardA")
let cardCreationRequest = CardCreationRequest(userID: "hyungyu", defaultImage: 0, title: "명함 이름", name: "개빡쳐하는 오야옹~", birthDate: "1999/05/12", mbti: "ENFP", instagram: "yaeoni", linkName: "예원깃헓", link: "github.com/yaeoni", description: "NADA의 짱귀염둥이 ㅎ 막이래~", isMincho: false, isSoju: true, isBoomuk: false, isSauced: true, oneQuestion: "테스트용이라", oneAnswer: "모든 정보 다 넣음", twoQuestion: "홀리몰리", twoAnswer: "루삥뽕")
postCardCreationWithAPI(request: cardCreationRequest, image: UIImage(systemName: "circle")!)
}

// MARK: - @IBAction Properties
Expand Down Expand Up @@ -183,6 +189,45 @@ extension CardCreationViewController {
}
}

// MARK: - Network

extension CardCreationViewController {
func getCardDetailFetchWithAPI(cardID: String) {
CardAPI.shared.getCardDetailFetch(cardID: cardID) { response in
switch response {
case .success(let data):
if let card = data as? Card {
self.cardData = card
}
case .requestErr(let message):
print("getCardDetailFetchWithAPI - requestErr", message)
case .pathErr:
print("getCardDetailFetchWithAPI - pathErr")
case .serverErr:
print("getCardDetailFetchWithAPI - serverErr")
case .networkFail:
print("getCardDetailFetchWithAPI - networkFail")
}
}
}
func postCardCreationWithAPI(request: CardCreationRequest, image: UIImage) {
CardAPI.shared.postCardCreation(request: request, image: image) { response in
switch response {
case .success(_):
print("postCardCreationWithAPI - success")
case .requestErr(let message):
print("postCardCreationWithAPI - requestErr", message)
case .pathErr:
print("postCardCreationWithAPI - pathErr")
case .serverErr:
print("postCardCreationWithAPI - serverErr")
case .networkFail:
print("postCardCreationWithAPI - networkFail")
}
}
}
}

// MARK: - UICollectionViewDelegate

extension CardCreationViewController: UICollectionViewDelegate {
Expand Down

0 comments on commit 05c6ff4

Please sign in to comment.