From d8eb65aff283009fafd6739532027b1ca7ccfc55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rene=CC=82=20X?= Date: Thu, 28 Jan 2021 11:49:23 -0300 Subject: [PATCH] =?UTF-8?q?Conex=C3=A3o=20com=20o=20server=20de=20forma=20?= =?UTF-8?q?gen=C3=A9rica?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../News Detail/NewsDetailViewModel.swift | 8 +------ .../NewsList/NewsListViewModel.swift | 7 +------ NewsApp/Scenes/Login/LoginViewModel.swift | 5 ++--- NewsApp/Service/NewsService.swift | 21 +++++++++++++------ NewsApp/Service/ServiceError+Extension.swift | 12 ++++++++--- NewsApp/Utils/Constants.swift | 1 + .../Utils/Extensions/Codable+Extension.swift | 2 +- 7 files changed, 30 insertions(+), 26 deletions(-) diff --git a/NewsApp/Scenes/Logged Area/News Detail/NewsDetailViewModel.swift b/NewsApp/Scenes/Logged Area/News Detail/NewsDetailViewModel.swift index 6faa186..afe6e18 100644 --- a/NewsApp/Scenes/Logged Area/News Detail/NewsDetailViewModel.swift +++ b/NewsApp/Scenes/Logged Area/News Detail/NewsDetailViewModel.swift @@ -66,14 +66,8 @@ class NewsDetailViewModel: ViewModel { self.isLoading.onNext(true) self.service.fetchNewsDetail(newsId: self.idNews) .subscribe(onSuccess: { [weak self] (response) in - print("aliiii") self?.isLoading.onNext(false) - do { - let object = try JSONDecoder.decode(data: response.data, to: [NewsDetailWrapperElement].self) - self?.apiCallResult.onNext(object.first?.documento) - } catch (let erro) { - self?.apiCallResult.onError(erro) - } + self?.apiCallResult.onNext(response) }, onError: { [weak self] (erro) in self?.isLoading.onNext(false) self?.apiCallResult.onError(erro) diff --git a/NewsApp/Scenes/Logged Area/NewsList/NewsListViewModel.swift b/NewsApp/Scenes/Logged Area/NewsList/NewsListViewModel.swift index bb38ff6..a5afccb 100644 --- a/NewsApp/Scenes/Logged Area/NewsList/NewsListViewModel.swift +++ b/NewsApp/Scenes/Logged Area/NewsList/NewsListViewModel.swift @@ -84,12 +84,7 @@ class NewsListViewModel: ViewModel { self.isLoading.onNext(true) self.service.fetchNews().subscribe { [weak self] (response) in self?.isLoading.onNext(false) - do { - let object = try JSONDecoder.decode(data: response.data, to: [NewsListElement].self) - self?.apiCallResult.onNext(object) - } catch (let erro) { - self?.apiCallResult.onError(erro) - } + self?.apiCallResult.onNext(response) } onError: { [weak self] (erro) in self?.isLoading.onNext(false) self?.apiCallResult.onError(erro) diff --git a/NewsApp/Scenes/Login/LoginViewModel.swift b/NewsApp/Scenes/Login/LoginViewModel.swift index 4dee4a0..3fb2440 100644 --- a/NewsApp/Scenes/Login/LoginViewModel.swift +++ b/NewsApp/Scenes/Login/LoginViewModel.swift @@ -94,10 +94,9 @@ class LoginViewModel: ViewModel { }) .subscribe(onNext: { (user) in self.isLoading.onNext(true) - self.service.postNewsLogin(user: user).filterSuccess().subscribe { [weak self] (response) in + self.service.postNewsLogin(user: user).subscribe { [weak self] (response) in self?.isLoading.onNext(false) - let object = try? JSONDecoder.decode(data: response.data, to: TokenJwt.self) - self?.apiCallResult.onNext(object) + self?.apiCallResult.onNext(response) } onError: { [weak self] (erro) in self?.isLoading.onNext(false) self?.apiCallResult.onNext(erro) diff --git a/NewsApp/Service/NewsService.swift b/NewsApp/Service/NewsService.swift index 0baac93..4c7ff14 100644 --- a/NewsApp/Service/NewsService.swift +++ b/NewsApp/Service/NewsService.swift @@ -17,16 +17,25 @@ class NewsService { newsProvider = stub ? MoyaProvider(stubClosure: MoyaProvider.immediatelyStub) : MoyaProvider() } - func postNewsLogin(user: UserLogin) -> Single { - return newsProvider.rx.request(.getNewsToken(user: user)).filterSuccess() + func postNewsLogin(user: UserLogin) -> Single { + return newsProvider.rx + .request(.getNewsToken(user: user)) + .filterSuccess(returnType: TokenJwt.self) } - func fetchNews() -> Single { - return newsProvider.rx.request(.getNews).filterSuccess() + func fetchNews() -> Single<[NewsListElement]> { + return newsProvider.rx + .request(.getNews) + .filterSuccess(returnType: [NewsListElement].self) } - func fetchNewsDetail(newsId: String) -> Single { - return newsProvider.rx.request(.getNewsDetail(newsId: newsId)).filterSuccess() + func fetchNewsDetail(newsId: String) -> Single { + return newsProvider.rx + .request(.getNewsDetail(newsId: newsId)) + .filterSuccess(returnType: [NewsDetailWrapperElement].self) + .map { (arrayWrapper) -> Documento? in + arrayWrapper.first?.documento + } } } diff --git a/NewsApp/Service/ServiceError+Extension.swift b/NewsApp/Service/ServiceError+Extension.swift index 576d13e..682f3a0 100644 --- a/NewsApp/Service/ServiceError+Extension.swift +++ b/NewsApp/Service/ServiceError+Extension.swift @@ -10,10 +10,16 @@ import RxSwift import Moya extension PrimitiveSequence where Trait == SingleTrait, Element == Response { - func filterSuccess() -> Single { - return flatMap { (response) -> Single in + func filterSuccess(returnType: T.Type) -> Single { + return flatMap { (response) -> Single in if 200 ... 299 ~= response.statusCode { - return .just(response) + let decoder = JSONDecoder() + do { + let objectParsed = try decoder.decode(returnType, from: response.data) + return .just(objectParsed) + } catch let e { + return .error(e) + } } switch response.statusCode { diff --git a/NewsApp/Utils/Constants.swift b/NewsApp/Utils/Constants.swift index ab71007..b73bc22 100644 --- a/NewsApp/Utils/Constants.swift +++ b/NewsApp/Utils/Constants.swift @@ -16,6 +16,7 @@ struct Constants { static let serviceUnavailableError = "Serviço não disponível. 😅 Tente novamente mais tarde." static let notConnectedToInternet = "Você não está conectado a internet. Conecte-se e tente novamente." static let notFound = "Essa notícia não foi encontrada 🧐" + static let parsingError = -88888 static let loadingColor = UIColor(named: "Primary") ?? .black static let loadingBackgroundColor = UIColor(named: "Accent")?.withAlphaComponent(0.5) ?? .white diff --git a/NewsApp/Utils/Extensions/Codable+Extension.swift b/NewsApp/Utils/Extensions/Codable+Extension.swift index 6468bd5..cc1ed72 100644 --- a/NewsApp/Utils/Extensions/Codable+Extension.swift +++ b/NewsApp/Utils/Extensions/Codable+Extension.swift @@ -13,7 +13,7 @@ extension JSONDecoder { do { return try decoder.decode(type, from: data) } catch { - throw DefaultServerError(message: Constants.unknownError, statusCode: -9999) + throw DefaultServerError(message: Constants.unknownError, statusCode: Constants.parsingError) } } }