From 9b7acc905a1a5fa53801f62fe9f8461945c0811c Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Thu, 8 Oct 2026 12:32:44 +0900 Subject: [PATCH] =?UTF-8?q?feat(gift):=20=EC=84=A0=EB=AC=BC=20API=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=EC=86=8C=EB=A5=BC=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/V2/Gift/Repository/GiftApi.swift | 71 +++++++++++++++++++ .../V2/Gift/Repository/GiftRepository.swift | 43 +++++++++++ 2 files changed, 114 insertions(+) create mode 100644 SodaLive/Sources/V2/Gift/Repository/GiftApi.swift create mode 100644 SodaLive/Sources/V2/Gift/Repository/GiftRepository.swift diff --git a/SodaLive/Sources/V2/Gift/Repository/GiftApi.swift b/SodaLive/Sources/V2/Gift/Repository/GiftApi.swift new file mode 100644 index 00000000..f43fc0a5 --- /dev/null +++ b/SodaLive/Sources/V2/Gift/Repository/GiftApi.swift @@ -0,0 +1,71 @@ +import Foundation + +import Moya + +enum GiftApi { + case getFormOptions + case create(request: CreateGiftRequest) + case getGifts(page: Int, size: Int) + case getGift(applicationNo: String) + case cancel(applicationNo: String) + case registerTracking(applicationNo: String, request: RegisterGiftTrackingRequest) + case submitRecipientAddress(applicationNo: String, request: SubmitGiftRecipientAddressRequest) +} + +extension GiftApi: TargetType { + var baseURL: URL { + return URL(string: BASE_URL)! + } + + var path: String { + switch self { + case .getFormOptions: + return "/api/v2/gifts/form-options" + case .create, .getGifts: + return "/api/v2/gifts" + case .getGift(let applicationNo): + return "/api/v2/gifts/\(applicationNo)" + case .cancel(let applicationNo): + return "/api/v2/gifts/\(applicationNo)/cancel" + case .registerTracking(let applicationNo, _): + return "/api/v2/gifts/\(applicationNo)/tracking" + case .submitRecipientAddress(let applicationNo, _): + return "/api/v2/gifts/\(applicationNo)/recipient-address" + } + } + + var method: Moya.Method { + switch self { + case .getFormOptions, .getGifts, .getGift: + return .get + case .create, .cancel, .registerTracking, .submitRecipientAddress: + return .post + } + } + + var task: Moya.Task { + switch self { + case .getFormOptions, .getGift, .cancel: + return .requestPlain + case .create(let request): + return .requestJSONEncodable(request) + case .getGifts(let page, let size): + return .requestParameters( + parameters: [ + "type": "ALL", + "page": page, + "size": size + ], + encoding: URLEncoding.queryString + ) + case .registerTracking(_, let request): + return .requestJSONEncodable(request) + case .submitRecipientAddress(_, let request): + return .requestJSONEncodable(request) + } + } + + var headers: [String: String]? { + return ["Authorization": "Bearer \(UserDefaults.string(forKey: UserDefaultsKey.token))"] + } +} diff --git a/SodaLive/Sources/V2/Gift/Repository/GiftRepository.swift b/SodaLive/Sources/V2/Gift/Repository/GiftRepository.swift new file mode 100644 index 00000000..b9097ec1 --- /dev/null +++ b/SodaLive/Sources/V2/Gift/Repository/GiftRepository.swift @@ -0,0 +1,43 @@ +import Foundation +import Combine + +import CombineMoya +import Moya + +final class GiftRepository { + private let api = MoyaProvider() + + func getFormOptions() -> AnyPublisher { + return api.requestPublisher(.getFormOptions) + } + + func createGift(request: CreateGiftRequest) -> AnyPublisher { + return api.requestPublisher(.create(request: request)) + } + + func getGifts(page: Int, size: Int) -> AnyPublisher { + return api.requestPublisher(.getGifts(page: page, size: size)) + } + + func getGift(applicationNo: String) -> AnyPublisher { + return api.requestPublisher(.getGift(applicationNo: applicationNo)) + } + + func cancelGift(applicationNo: String) -> AnyPublisher { + return api.requestPublisher(.cancel(applicationNo: applicationNo)) + } + + func registerTracking( + applicationNo: String, + request: RegisterGiftTrackingRequest + ) -> AnyPublisher { + return api.requestPublisher(.registerTracking(applicationNo: applicationNo, request: request)) + } + + func submitRecipientAddress( + applicationNo: String, + request: SubmitGiftRecipientAddressRequest + ) -> AnyPublisher { + return api.requestPublisher(.submitRecipientAddress(applicationNo: applicationNo, request: request)) + } +}