Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feat/#68] 퀴즈 레벨 기능 추가 #71

Merged
merged 10 commits into from
Dec 3, 2023
6 changes: 3 additions & 3 deletions Targets/D3N/Sources/Domain/Auth/AuthClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ extension AuthClient: DependencyKey {
static let liveValue = AuthClient(
appleLogin: { code, idToken in
let target: TargetType = AuthService.appleLogin(code: code, idToken: idToken)
let response: Result<AppleLoginResponseDTO, D3NAPIError> = await D3NAPIkProvider.reqeust(target: target)
let response: Result<AppleLoginResponseDTO, D3NAPIError> = await D3NAPIProvider.reqeust(target: target)

return response.map { dto in
let entity = dto.toEntity()
Expand All @@ -55,7 +55,7 @@ extension AuthClient: DependencyKey {
},
appleUnlink: {
let target: TargetType = AuthService.appleUnlink
let response: Result<Bool, D3NAPIError> = await D3NAPIkProvider.justRequest(target: target)
let response: Result<Bool, D3NAPIError> = await D3NAPIProvider.justRequest(target: target)

return response.map { dto in
LocalStorageManager.deleteAll()
Expand All @@ -64,7 +64,7 @@ extension AuthClient: DependencyKey {
},
refresh: {
let target: TargetType = AuthService.refresh
let response: Result<AuthEntity, D3NAPIError> = await D3NAPIkProvider.reqeust(target: target)
let response: Result<AuthEntity, D3NAPIError> = await D3NAPIProvider.reqeust(target: target)

return response.map { dto in
LocalStorageManager.save(.accessToken, value: dto.accessToken)
Expand Down
2 changes: 1 addition & 1 deletion Targets/D3N/Sources/Domain/D3NAPIProvider.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public enum D3NAPIError: Error {
case none
}

final class D3NAPIkProvider {
final class D3NAPIProvider {
private static let provider = MoyaProvider<MultiTarget>(
session: Session(interceptor: AuthInterceptor()),
plugins: [D3NNetworkLoggerPlugin()]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ struct FetchNewsListResponseElement: Codable {
let mediaCompanyLogo: String
let mediaCompanyName: String
let secondTime: Int
let level: Int
}

extension FetchNewsListResponseElement {
Expand All @@ -35,7 +36,8 @@ extension FetchNewsListResponseElement {
mediaCompanyId: self.mediaCompanyId,
mediaCompanyLogo: self.mediaCompanyLogo,
mediaCompanyName: self.mediaCompanyName,
secondTime: self.secondTime
secondTime: self.secondTime,
level: self.level
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
//
// FetchTodayNewsListResponseDTO.swift
// D3N
//
// Created by 송영모 on 11/30/23.
// Copyright © 2023 sju. All rights reserved.
//

import Foundation

typealias FetchTodayNewsListResponseDTO = [FetchTodayNewsListResponseElement]

struct FetchTodayNewsListResponseElement: Codable {
let type, title, subtitle: String
let newsList: [FetchNewsListResponseElement]
}

extension FetchTodayNewsListResponseElement {
func toEntity() -> TodayNewsEntity {
return .init(
type: self.type,
title: self.title,
subtitle: self.subtitle,
newses: self.newsList.map { $0.toEntity() }
)
}
}
16 changes: 11 additions & 5 deletions Targets/D3N/Sources/Domain/News/Entity/NewsEntity.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

import Foundation

public struct NewsEntity: Equatable {
public struct NewsEntity: Equatable, Hashable {
let id: Int
let field: NewsField
let type: NewsType
Expand All @@ -19,6 +19,7 @@ public struct NewsEntity: Equatable {
let mediaCompanyLogo: String
let mediaCompanyName: String
var secondTime: Int
let level: Int

init(
id: Int,
Expand All @@ -30,7 +31,8 @@ public struct NewsEntity: Equatable {
mediaCompanyId: String,
mediaCompanyLogo: String,
mediaCompanyName: String,
secondTime: Int
secondTime: Int,
level: Int
) {
self.id = id
self.field = field
Expand All @@ -42,6 +44,7 @@ public struct NewsEntity: Equatable {
self.mediaCompanyLogo = mediaCompanyLogo
self.mediaCompanyName = mediaCompanyName
self.secondTime = secondTime
self.level = level
}

var timeString: String {
Expand All @@ -65,7 +68,8 @@ public extension NewsEntity {
mediaCompanyId: "056",
mediaCompanyLogo: "https://mimgnews.pstatic.net/image/upload/office_logo/056/2021/07/15/logo_056_57_20210715101841.png",
mediaCompanyName: "KBS",
secondTime: 0
secondTime: 0,
level: 0
)

static let mocks = [
Expand All @@ -79,7 +83,8 @@ public extension NewsEntity {
mediaCompanyId: "018",
mediaCompanyLogo: "https://mimgnews.pstatic.net/image/upload/office_logo/018/2018/08/08/logo_018_57_20180808174308.png",
mediaCompanyName: "이데일리",
secondTime: 0
secondTime: 0,
level: 0
),
NewsEntity(
id: 11605391,
Expand All @@ -91,7 +96,8 @@ public extension NewsEntity {
mediaCompanyId: "056",
mediaCompanyLogo: "https://mimgnews.pstatic.net/image/upload/office_logo/056/2021/07/15/logo_056_57_20210715101841.png",
mediaCompanyName: "KBS",
secondTime: 0
secondTime: 0,
level: 0
)
]
}
16 changes: 16 additions & 0 deletions Targets/D3N/Sources/Domain/News/Entity/TodayNewsEntity.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//
// TodayNewsEntity.swift
// D3N
//
// Created by 송영모 on 11/30/23.
// Copyright © 2023 sju. All rights reserved.
//

import Foundation

public struct TodayNewsEntity: Equatable {
public let type: String
public let title: String
public let subtitle: String
public let newses: [NewsEntity]
}
13 changes: 11 additions & 2 deletions Targets/D3N/Sources/Domain/News/NewsClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,20 @@ import Moya

struct NewsClient {
var fetch: (Int, Int) async -> Result<[NewsEntity], D3NAPIError>
var fetchToday: () async -> Result<[TodayNewsEntity], D3NAPIError>
var updateTime: (Int, Int) async -> Result<Bool, D3NAPIError>
}

extension NewsClient: TestDependencyKey {
static let previewValue = Self(
fetch: { _, _ in .failure(.none) },
fetchToday: { .failure(.none) },
updateTime: { _, _ in .failure(.none) }
)

static let testValue = Self(
fetch: unimplemented("\(Self.self).fetch"),
fetchToday: unimplemented("\(Self.self).fetchToday"),
updateTime: unimplemented("\(Self.self).updateTime")
)
}
Expand All @@ -40,13 +43,19 @@ extension NewsClient: DependencyKey {
static let liveValue = NewsClient(
fetch: { pageIndex, pageSize in
let target: TargetType = NewsService.fetchNewsList(pageIndex: pageIndex, pageSize: pageSize)
let response: Result<FetchNewsListResponseDTO, D3NAPIError> = await D3NAPIkProvider.reqeust(target: target)
let response: Result<FetchNewsListResponseDTO, D3NAPIError> = await D3NAPIProvider.reqeust(target: target)

return response.map(\.content).map { $0.map { $0.toEntity() } }
},
fetchToday: {
let target: TargetType = NewsService.fetchTodayNewsList
let response: Result<FetchTodayNewsListResponseDTO, D3NAPIError> = await D3NAPIProvider.reqeust(target: target)

return response.map { $0.map { $0.toEntity() } }
},
updateTime: { newsId, secondTime in
let target: TargetType = NewsService.updateNewsTime(newsId: newsId, secondTime: secondTime)
let response: Result<UpdateNewsTimeResponseDTO, D3NAPIError> = await D3NAPIkProvider.reqeust(target: target)
let response: Result<UpdateNewsTimeResponseDTO, D3NAPIError> = await D3NAPIProvider.reqeust(target: target)

return response.map { _ in
return true
Expand Down
11 changes: 7 additions & 4 deletions Targets/D3N/Sources/Domain/News/NewsService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import Moya

public enum NewsService {
case fetchNewsList(pageIndex: Int,pageSize: Int)
case fetchTodayNewsList
case updateNewsTime(newsId: Int, secondTime: Int)
}

Expand All @@ -19,16 +20,16 @@ extension NewsService: TargetType {

public var path: String {
switch self {
case .fetchNewsList:
return "news/list"
case .updateNewsTime:
return "news/time"
case .fetchNewsList: return "news/list"
case .fetchTodayNewsList: return "news/today/list"
case .updateNewsTime: return "news/time"
}
}

public var method: Moya.Method {
switch self {
case .fetchNewsList: return .get
case .fetchTodayNewsList: return .get
case .updateNewsTime: return .patch
}
}
Expand All @@ -37,6 +38,8 @@ extension NewsService: TargetType {
switch self {
case let .fetchNewsList(pageIndex: page, pageSize: size):
return .requestParameters(parameters: ["pageIndex": page, "pageSize": size], encoding: URLEncoding.queryString)
case .fetchTodayNewsList:
return .requestPlain
case let .updateNewsTime(newsId: id, secondTime: time):
let dto = UpdateNewsTimeRequestDTO(newsId: id, secondTime: time)
return .requestJSONEncodable(dto)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ struct FetchQuizListResponseElement: Codable {
let reason: String
let secondTime: Int
let selectedAnswer: Int?
let level: Int
}

extension FetchQuizListResponseElement {
Expand All @@ -29,7 +30,8 @@ extension FetchQuizListResponseElement {
answer: self.answer,
reason: self.reason,
secondTime: self.secondTime,
selectedAnswer: self.selectedAnswer
selectedAnswer: self.selectedAnswer,
level: self.level
)
}
}
5 changes: 4 additions & 1 deletion Targets/D3N/Sources/Domain/Quiz/Entity/QuizEntity.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ public struct QuizEntity: Equatable {
let reason: String
var secondTime: Int
var selectedAnswer: Int?
var level: Int

var isSolved: Bool

Expand All @@ -35,7 +36,8 @@ public struct QuizEntity: Equatable {
answer: Int,
reason: String,
secondTime: Int,
selectedAnswer: Int?
selectedAnswer: Int?,
level: Int
) {
self.id = id
self.question = question
Expand All @@ -44,6 +46,7 @@ public struct QuizEntity: Equatable {
self.reason = reason
self.secondTime = secondTime
self.selectedAnswer = selectedAnswer
self.level = level

self.isSolved = selectedAnswer != nil
}
Expand Down
6 changes: 3 additions & 3 deletions Targets/D3N/Sources/Domain/Quiz/QuizClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -42,21 +42,21 @@ extension QuizClient: DependencyKey {
static let liveValue = QuizClient(
fetch: { newsId in
let target: TargetType = QuizService.fetch(newsId: newsId)
let response: Result<FetchQuizListResponseDTO, D3NAPIError> = await D3NAPIkProvider.reqeust(target: target)
let response: Result<FetchQuizListResponseDTO, D3NAPIError> = await D3NAPIProvider.reqeust(target: target)

return response.map { $0.map { $0.toEntity() } }
},
submit: { quizs in
let target: TargetType = QuizService.submit(quizs: quizs)
let response: Result<SubmitQuizListResponseDTO, D3NAPIError> = await D3NAPIkProvider.reqeust(target: target)
let response: Result<SubmitQuizListResponseDTO, D3NAPIError> = await D3NAPIProvider.reqeust(target: target)

return response.map {
$0.map { $0.quizId }
}
},
updateTime: { quizId, secondTime in
let target: TargetType = QuizService.updateTime(quizId: quizId, secondTime: secondTime)
let response: Result<UpdateQuizTimeResponseDTO, D3NAPIError> = await D3NAPIkProvider.reqeust(target: target)
let response: Result<UpdateQuizTimeResponseDTO, D3NAPIError> = await D3NAPIProvider.reqeust(target: target)

return response.map { _ in
return true
Expand Down
4 changes: 2 additions & 2 deletions Targets/D3N/Sources/Domain/User/UserClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ extension UserClient: DependencyKey {
static let liveValue = UserClient(
onboardNeeded: {
let target: TargetType = UserService.onboardNeeded
let response: Result<UserOnboardNeededResponseDTO, D3NAPIError> = await D3NAPIkProvider.reqeust(target: target)
let response: Result<UserOnboardNeededResponseDTO, D3NAPIError> = await D3NAPIProvider.reqeust(target: target)
return response.map { dto in
let entity = dto.isOnBoardingNeeded
LocalStorageManager.save(.isOnBoardingNeeded, value: entity)
Expand All @@ -53,7 +53,7 @@ extension UserClient: DependencyKey {
},
onboard: { nickname, gender, birthDay, newsFields in
let target: TargetType = UserService.onboard(nickname: nickname, gender: gender, birthDay: birthDay, newsFields: newsFields)
let response: Result<UserOnboardResponseDTO, D3NAPIError> = await D3NAPIkProvider.reqeust(target: target)
let response: Result<UserOnboardResponseDTO, D3NAPIError> = await D3NAPIProvider.reqeust(target: target)

return response.map { dto in
let entity = dto.toEntity()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public struct AllNewsNavigationStackView: View {
case .allNews:
CaseLet(
/AllNewsNavigationStackStore.Path.State.allNews,
action: TodayNavigationStackStore.Path.Action.allNews,
action: TodayNewsNavigationStackStore.Path.Action.allNews,
then: AllNewsView.init(store:)
)
}
Expand Down
6 changes: 3 additions & 3 deletions Targets/D3N/Sources/Feature/MainTab/MainTabStore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ struct MainTabStore: Reducer {
struct State: Equatable {
var currentScene: MainScene = .question

var today: TodayNavigationStackStore.State? = .init()
var today: TodayNewsNavigationStackStore.State? = .init()
var allNews: AllNewsNavigationStackStore.State? = .init()
var myPage: MyPageNavigationStackStore.State? = .init()
}
Expand All @@ -31,7 +31,7 @@ struct MainTabStore: Reducer {
case authRefreshRequest
case authRefreshResponse(Result<AuthEntity, D3NAPIError>)

case today(TodayNavigationStackStore.Action)
case today(TodayNewsNavigationStackStore.Action)
case allNews(AllNewsNavigationStackStore.Action)
case myPage(MyPageNavigationStackStore.Action)
case delegate(Delegate)
Expand Down Expand Up @@ -69,7 +69,7 @@ struct MainTabStore: Reducer {
}
}
.ifLet(\.today, action: /Action.today) {
TodayNavigationStackStore()
TodayNewsNavigationStackStore()
}
.ifLet(\.allNews, action: /Action.allNews) {
AllNewsNavigationStackStore()
Expand Down
2 changes: 1 addition & 1 deletion Targets/D3N/Sources/Feature/MainTab/MainTabView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ struct MainTabView: View {
WithViewStore(self.store, observe: { $0 }) { viewStore in
TabView {
IfLetStore(self.store.scope(state: \.today, action: MainTabStore.Action.today)) {
TodayNavigationStackView(store: $0)
TodayNewsNavigationStackView(store: $0)
.tabItem {
Image(systemName: "doc.text.image")
Text("투데이")
Expand Down
Loading