Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions today-s-sound/Core/Network/Service/APIService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ protocol APIServiceType {
userId: String, deviceSecret: String, page: Int, size: Int
) -> AnyPublisher<AlarmListResponse, NetworkError>
func getKeywords() -> AnyPublisher<KeywordsResponse, NetworkError>
func getURLs() -> AnyPublisher<URLsResponse, NetworkError>
func getHomeFeed(
userId: String, deviceSecret: String
) -> AnyPublisher<HomeFeedResponse, NetworkError>
Expand All @@ -39,6 +40,7 @@ class APIService: APIServiceType {
private let subscriptionProvider: MoyaProvider<SubscriptionAPI>
private let alarmProvider: MoyaProvider<AlarmAPI>
private let keywordProvider: MoyaProvider<KeywordAPI>
private let urlProvider: MoyaProvider<URLAPI>
private let feedProvider: MoyaProvider<FeedAPI>

init(userSession: UserSession = UserSession()) {
Expand All @@ -52,13 +54,15 @@ class APIService: APIServiceType {
subscriptionProvider = NetworkKit.provider(userSession: userSession, plugins: [logger])
alarmProvider = NetworkKit.provider(userSession: userSession, plugins: [logger])
keywordProvider = NetworkKit.provider(userSession: userSession, plugins: [logger])
urlProvider = NetworkKit.provider(userSession: userSession, plugins: [logger])
feedProvider = NetworkKit.provider(userSession: userSession, plugins: [logger])
#else
userProvider = NetworkKit.provider(userSession: userSession)
authProvider = NetworkKit.provider(userSession: userSession)
subscriptionProvider = NetworkKit.provider(userSession: userSession)
alarmProvider = NetworkKit.provider(userSession: userSession)
keywordProvider = NetworkKit.provider(userSession: userSession)
urlProvider = NetworkKit.provider(userSession: userSession)
feedProvider = NetworkKit.provider(userSession: userSession)
#endif
}
Expand Down Expand Up @@ -331,6 +335,23 @@ class APIService: APIServiceType {
.eraseToAnyPublisher()
}

// MARK: - URL API

func getURLs() -> AnyPublisher<URLsResponse, NetworkError> {
urlProvider.requestPublisher(.getURLs)
.mapError { moyaError -> NetworkError in
.requestFailed(moyaError)
}
.flatMap { [weak self] response -> AnyPublisher<URLsResponse, NetworkError> in
guard let self else {
return Fail(error: NetworkError.unknown)
.eraseToAnyPublisher()
}
return handleResponse(response, decodeTo: URLsResponse.self, debugLabel: "URL 목록 응답")
}
.eraseToAnyPublisher()
}

// MARK: - Feed API

func getHomeFeed(
Expand Down
43 changes: 43 additions & 0 deletions today-s-sound/Core/Network/Targets/URLAPI.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
//
// URLAPI.swift
// today-s-sound
//
// Created by Assistant
//

import Foundation
import Moya

enum URLAPI {
case getURLs
}

extension URLAPI: APITargetType {
var path: String {
switch self {
case .getURLs:
"/api/urls"
}
}

var method: Moya.Method {
switch self {
case .getURLs:
.get
}
}

var task: Task {
switch self {
case .getURLs:
.requestPlain
}
}

var headers: [String: String]? {
[
"Content-Type": "application/json",
"Accept": "application/json"
]
}
}
4 changes: 2 additions & 2 deletions today-s-sound/Data/Models/Subscription.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import Foundation

/// 구독 생성 요청
struct CreateSubscriptionRequest: Codable {
let url: String
let keywords: [String]
let urlId: Int64
let keywordIds: [Int64]
let alias: String?
let isUrgent: Bool
}
Expand Down
21 changes: 21 additions & 0 deletions today-s-sound/Data/Models/URL.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import Foundation

// MARK: - URL Response Models

/// URL 목록 응답 (배열 직접 반환 또는 APIResponse 형태)
/// Swagger 문서에 따르면 배열을 직접 반환하지만, 프로젝트 일관성을 위해 APIResponse로 처리
typealias URLsResponse = APIResponse<[URLItem]>

extension URLsResponse {
// 편의 속성: result를 urls로 접근
var urls: [URLItem] {
result
}
}

/// 개별 URL 아이템
struct URLItem: Codable, Identifiable {
let id: Int64
let link: String
let title: String
}
Loading
Loading