Skip to content

Commit

Permalink
✨ feature/discover api mocking (#20)
Browse files Browse the repository at this point in the history
* ✨ Messages API & Model 상상코딩

* ✨ 누락된 부분 추가구현
  • Loading branch information
O-O-wl authored Jan 1, 2021
1 parent fd38679 commit 8d25fa7
Show file tree
Hide file tree
Showing 7 changed files with 373 additions and 305 deletions.
18 changes: 12 additions & 6 deletions Dear-World/Dear-World.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,13 @@
121BDB712597A5D60062B15A /* APIMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 121BDB702597A5D60062B15A /* APIMock.swift */; };
121BDB8E259829840062B15A /* CountrySelectController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 121BDB8D259829840062B15A /* CountrySelectController.swift */; };
128313E32598A08700BDF8A3 /* Message.swift in Sources */ = {isa = PBXBuildFile; fileRef = 128313E22598A08700BDF8A3 /* Message.swift */; };
128313EE2598A14E00BDF8A3 /* List.swift in Sources */ = {isa = PBXBuildFile; fileRef = 128313ED2598A14E00BDF8A3 /* List.swift */; };
128313EE2598A14E00BDF8A3 /* Message.API.Messages.swift in Sources */ = {isa = PBXBuildFile; fileRef = 128313ED2598A14E00BDF8A3 /* Message.API.Messages.swift */; };
3902F1052596F26D00A3DF8C /* CheeringMapViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3902F1042596F26D00A3DF8C /* CheeringMapViewController.swift */; };
3902F1132597049D00A3DF8C /* SendMessageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3902F1122597049D00A3DF8C /* SendMessageViewController.swift */; };
3902F118259704AF00A3DF8C /* AboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3902F117259704AF00A3DF8C /* AboutViewController.swift */; };
3902F12425970E5600A3DF8C /* Number+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3902F12325970E5600A3DF8C /* Number+.swift */; };
3902F12A259714D800A3DF8C /* RankerTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3902F129259714D800A3DF8C /* RankerTableViewCell.swift */; };
3914D9E6259F3FA1009765B0 /* Message.Model.Messages.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3914D9E5259F3FA1009765B0 /* Message.Model.Messages.swift */; };
3958257B25948E41007325AB /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3958257A25948E41007325AB /* AppDelegate.swift */; };
3958258425948E43007325AB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3958258325948E43007325AB /* Assets.xcassets */; };
3958258725948E43007325AB /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3958258525948E43007325AB /* LaunchScreen.storyboard */; };
Expand Down Expand Up @@ -92,17 +93,18 @@
121BDB292597259E0062B15A /* MessageCountBadgeView.swift */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.swift; name = MessageCountBadgeView.swift; path = "Dear-World.xcodeproj/MessageCountBadgeView.swift"; sourceTree = SOURCE_ROOT; tabWidth = 2; };
121BDB43259735200062B15A /* UIColor+.swift */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.swift; path = "UIColor+.swift"; sourceTree = "<group>"; tabWidth = 2; };
121BDB582597652A0062B15A /* MessageTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageTableViewCell.swift; sourceTree = "<group>"; };
121BDB662597982F0062B15A /* DiscoverReactor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscoverReactor.swift; sourceTree = "<group>"; };
121BDB662597982F0062B15A /* DiscoverReactor.swift */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.swift; path = DiscoverReactor.swift; sourceTree = "<group>"; tabWidth = 2; };
121BDB6B2597A49B0062B15A /* MessageMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageMock.swift; sourceTree = "<group>"; };
121BDB702597A5D60062B15A /* APIMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIMock.swift; sourceTree = "<group>"; };
121BDB8D259829840062B15A /* CountrySelectController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountrySelectController.swift; sourceTree = "<group>"; };
128313E22598A08700BDF8A3 /* Message.swift */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.swift; name = Message.swift; path = "Dear-World/Source/Domain/Message/Message.swift"; sourceTree = SOURCE_ROOT; tabWidth = 2; };
128313ED2598A14E00BDF8A3 /* List.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = List.swift; sourceTree = "<group>"; };
128313ED2598A14E00BDF8A3 /* Message.API.Messages.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Message.API.Messages.swift; sourceTree = "<group>"; };
3902F1042596F26D00A3DF8C /* CheeringMapViewController.swift */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.swift; path = CheeringMapViewController.swift; sourceTree = "<group>"; tabWidth = 2; };
3902F1122597049D00A3DF8C /* SendMessageViewController.swift */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.swift; path = SendMessageViewController.swift; sourceTree = "<group>"; tabWidth = 2; };
3902F117259704AF00A3DF8C /* AboutViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutViewController.swift; sourceTree = "<group>"; };
3902F12325970E5600A3DF8C /* Number+.swift */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.swift; path = "Number+.swift"; sourceTree = "<group>"; tabWidth = 2; };
3902F129259714D800A3DF8C /* RankerTableViewCell.swift */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.swift; path = RankerTableViewCell.swift; sourceTree = "<group>"; tabWidth = 2; };
3914D9E5259F3FA1009765B0 /* Message.Model.Messages.swift */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.swift; name = Message.Model.Messages.swift; path = "Dear-World/Source/Presentation/Scene/Main/Message.Model.Messages.swift"; sourceTree = SOURCE_ROOT; tabWidth = 2; };
3958257725948E41007325AB /* Dear-World.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Dear-World.app"; sourceTree = BUILT_PRODUCTS_DIR; };
3958257A25948E41007325AB /* AppDelegate.swift */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; tabWidth = 2; };
3958258325948E43007325AB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
Expand All @@ -115,7 +117,7 @@
3958259C25948E43007325AB /* Dear_WorldUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Dear_WorldUITests.swift; sourceTree = "<group>"; };
3958259E25948E43007325AB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
395825B625948EE4007325AB /* Colors.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Colors.xcassets; sourceTree = "<group>"; };
395826112596322B007325AB /* DiscoverViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscoverViewController.swift; sourceTree = "<group>"; };
395826112596322B007325AB /* DiscoverViewController.swift */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.swift; path = DiscoverViewController.swift; sourceTree = "<group>"; tabWidth = 2; };
395826322596E693007325AB /* Logger.swift */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.swift; path = Logger.swift; sourceTree = "<group>"; tabWidth = 2; };
395A4176259DF9F900F10531 /* MainTabBarController.swift */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.swift; path = MainTabBarController.swift; sourceTree = "<group>"; tabWidth = 2; };
39658F8C259AD9900050D180 /* SplashViewController.swift */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.swift; path = SplashViewController.swift; sourceTree = "<group>"; tabWidth = 2; };
Expand Down Expand Up @@ -214,7 +216,7 @@
128313EB2598A12300BDF8A3 /* API */ = {
isa = PBXGroup;
children = (
128313ED2598A14E00BDF8A3 /* List.swift */,
128313ED2598A14E00BDF8A3 /* Message.API.Messages.swift */,
3971EB36259A9C550084E6DC /* Message.API.SendMessage.swift */,
);
path = API;
Expand All @@ -224,6 +226,7 @@
isa = PBXGroup;
children = (
3971EB3B259A9C860084E6DC /* Message.Model.SendMessage.swift */,
3914D9E5259F3FA1009765B0 /* Message.Model.Messages.swift */,
);
path = Model;
sourceTree = "<group>";
Expand Down Expand Up @@ -256,7 +259,9 @@
3958259B25948E43007325AB /* Dear-WorldUITests */,
3958257825948E41007325AB /* Products */,
);
indentWidth = 2;
sourceTree = "<group>";
tabWidth = 2;
};
3958257825948E41007325AB /* Products */ = {
isa = PBXGroup;
Expand Down Expand Up @@ -695,14 +700,15 @@
3971EB18259A7BC10084E6DC /* Emoji.swift in Sources */,
39EED22E259CFEB8007452E1 /* World.Model.Ranker.swift in Sources */,
3902F1132597049D00A3DF8C /* SendMessageViewController.swift in Sources */,
3914D9E6259F3FA1009765B0 /* Message.Model.Messages.swift in Sources */,
39F0C1A02598877600A7001F /* NetworkError.swift in Sources */,
121BDB592597652A0062B15A /* MessageTableViewCell.swift in Sources */,
3902F12A259714D800A3DF8C /* RankerTableViewCell.swift in Sources */,
395826332596E693007325AB /* Logger.swift in Sources */,
39F0C19025987A2B00A7001F /* ServiceAPI.swift in Sources */,
3958257B25948E41007325AB /* AppDelegate.swift in Sources */,
39F465822597811900621327 /* CheerButton.swift in Sources */,
128313EE2598A14E00BDF8A3 /* List.swift in Sources */,
128313EE2598A14E00BDF8A3 /* Message.API.Messages.swift in Sources */,
128313E32598A08700BDF8A3 /* Message.swift in Sources */,
121BDB44259735200062B15A /* UIColor+.swift in Sources */,
39658FBB259AE55C0050D180 /* World.Model.Rank.swift in Sources */,
Expand Down
19 changes: 0 additions & 19 deletions Dear-World/Dear-World/Source/Domain/Message/API/List.swift

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
//
// List.swift
// Dear-World
//
// Created by rookie.w on 2020/12/27.
//

import Alamofire
import Foundation

extension Message.API {
struct Messages: ServiceAPI {
typealias Response = Message.Model.Messages

// MARK: Parameters
private let countryId: Int
private let lastMsgId: Int

var method: HTTPMethod { .get }
var path: String { "/api/v1/messages" }
var parameters: [String : Any]? {
["countryId": countryId,
"lastId": lastMsgId]
}

init(countryId: Int, lastMsgId: Int) {
self.countryId = countryId
self.lastMsgId = lastMsgId
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ extension Message.API {
struct SendMessage: ServiceAPI {
typealias Response = Message.Model.SendMessage

// MARK: Parameters
private let countryCode: String
private let emojiId: Int
private let name: String
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,76 +8,83 @@
import Foundation
import ReactorKit

class DiscoverReactor: Reactor {
enum Action {
case countryDidChanged(country: String)
case refresh
case loadMore

}
enum Mutation {
case setMessages(result: [MessageMock])
case setRefreshing(Bool)
case addMessages(result: [MessageMock], page: Int)
case setCountry(country: String)
case setLoading(Bool)
}
struct State {
var messageCount: Int = 0
var country: String = "Whole World"
var messages: [MessageMock] = []
var isRefreshing: Bool = false
var isLoading: Bool = false
var isAnimating: Bool = false
var currentPage: Int = 1
}
var initialState: State

init() {
self.initialState = State()
final class DiscoverReactor: Reactor {

enum Action {
case countryDidChanged(country: String)
case refresh
case loadMore
}

enum Mutation {
case setMessages(result: [MessageMock])
case setRefreshing(Bool)
case addMessages(result: [MessageMock], page: Int)
case setCountry(country: String)
case setLoading(Bool)
}

struct State {
var messageCount: Int = 0
var country: String = "Whole World"
var messages: [MessageMock] = []
var isRefreshing: Bool = false
var isLoading: Bool = false
var isAnimating: Bool = false
var currentPage: Int = 1
}

var initialState: State

init() {
self.initialState = State()
}

func mutate(action: Action) -> Observable<Mutation> {
switch action {
case let .countryDidChanged(country):
return .concat(
.just(Mutation.setCountry(country: country)),
.just(.setLoading(true)),
APIMock().getMessages(page: 1, country: country)
.map { .setMessages(result: $0) },
.just(.setLoading(false))
)
case .refresh:
return .concat([
.just(Mutation.setRefreshing(true)),
APIMock().getMessages(page: 1, country: currentState.country)
.map { .setMessages(result: $0) },
.just(Mutation.setRefreshing(false))
])
case .loadMore:
return Observable<Mutation>.concat([
APIMock().getMessages(page: 2, country: currentState.country)
.map { Mutation.addMessages(result: $0, page: 2) }
])
}
}

func reduce(state: State, mutation: Mutation) -> State {
var newState: State = state
switch mutation {
case let .setMessages(results):
newState.messages = results
newState.currentPage = 1

case let .setRefreshing(flag):
newState.isRefreshing = flag

func mutate(action: Action) -> Observable<Mutation> {
switch action {
case let .countryDidChanged(country):
return .concat(
.just(Mutation.setCountry(country: country)),
.just(.setLoading(true)),
APIMock().getMessages(page: 1, country: country)
.map { .setMessages(result: $0) },
.just(.setLoading(false))
)
case .refresh:
return .concat([
.just(Mutation.setRefreshing(true)),
APIMock().getMessages(page: 1, country: currentState.country)
.map { .setMessages(result: $0) },
.just(Mutation.setRefreshing(false))
])
case .loadMore:
return Observable<Mutation>.concat([
APIMock().getMessages(page: 2, country: currentState.country)
.map { Mutation.addMessages(result: $0, page: 2) }
])
}
}
case let .addMessages(result: results, page: page):
newState.messages = state.messages + results
newState.currentPage = page

case let .setCountry(country: country):
newState.country = country

func reduce(state: State, mutation: Mutation) -> State {
var newState: State = state
switch mutation {
case let .setMessages(results):
newState.messages = results
newState.currentPage = 1
case let .setRefreshing(flag):
newState.isRefreshing = flag
case let .addMessages(result: results, page: page):
newState.messages = state.messages + results
newState.currentPage = page
case let .setCountry(country: country):
newState.country = country
case let .setLoading(flag):
newState.isLoading = flag
}
return newState
case let .setLoading(flag):
newState.isLoading = flag
}
return newState
}
}
Loading

0 comments on commit 8d25fa7

Please sign in to comment.