Skip to content

Commit

Permalink
Name refactor to align with the Repository pattern (35)
Browse files Browse the repository at this point in the history
  • Loading branch information
billp committed Mar 20, 2023

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
1 parent eb8c1d1 commit 44fe7d8
Showing 33 changed files with 430 additions and 506 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// CityRoute.swift
// CitiesRepository.swift
//
// Copyright © 2018-2022 Vassilis Panagiotopoulos. All rights reserved.
//
@@ -20,40 +20,35 @@
import Foundation
import TermiNetwork

enum CityRoute: RouteProtocol {
enum CitiesRepository: EndpointProtocol {
case cities
case city(id: Int)
case thumb(city: City)
case image(city: City)
case pinning(configuration: Configuration)

func configure() -> RouteConfiguration {
func configure() -> EndpointConfiguration {
switch self {
case .cities:
return RouteConfiguration(method: .get,
path: .path(["cities"]),
mockFilePath:
.path(["Cities", "cities.json"]))
return .init(method: .get,
path: .path(["cities"]),
mockFilePath: .path(["Cities", "cities.json"]))
case .city(let id):
return RouteConfiguration(method: .get,
path: .path(["city", String(id)]),
mockFilePath:
.path(["Cities", "Details", String(format: "%i.json", id)]))
return .init(method: .get,
path: .path(["city", String(id)]),
mockFilePath: .path(["Cities", "Details", String(format: "%i.json", id)]))
case .thumb(let city):
return RouteConfiguration(method: .get,
path: .path([city.thumb ?? ""]),
mockFilePath:
.path(["Cities", "Thumbs", String(format: "%i.jpg", city.cityID)]))
return .init(method: .get,
path: .path([city.thumb ?? ""]),
mockFilePath: .path(["Cities", "Thumbs", String(format: "%i.jpg", city.cityID)]))
case .image(let city):
return RouteConfiguration(method: .get,
path: .path([city.image ?? ""]),
mockFilePath:
.path(["Cities", "Images", String(format: "%i.jpg", city.cityID)]))
return .init(method: .get,
path: .path([city.image ?? ""]),
mockFilePath: .path(["Cities", "Images", String(format: "%i.jpg", city.cityID)]))
case .pinning(let configuration):
return RouteConfiguration(
method: .get,
path: .path(["cities"]),
configuration: configuration
return .init(method: .get,
path: .path(["cities"]),
configuration: configuration
)
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// MiscRoute.swift
// MiscRepository.swift
//
// Copyright © 2018-2022 Vassilis Panagiotopoulos. All rights reserved.
//
@@ -20,20 +20,20 @@
import Foundation
import TermiNetwork

enum MiscRoute: RouteProtocol {
enum MiscRepository: EndpointProtocol {
case testEncryptParams(param: String)
case upload(fileUrl: URL)

func configure() -> RouteConfiguration {
func configure() -> EndpointConfiguration {
switch self {
case .testEncryptParams(let value):
return RouteConfiguration(
return EndpointConfiguration(
method: .post,
path: .path(["test_encrypt_params"]),
params: ["value": value]
)
case .upload(fileUrl: let fileUrl):
return RouteConfiguration(
return EndpointConfiguration(
method: .post,
path: .path(["file_upload"]),
params: ["file": MultipartFormDataPartType.url(fileUrl)]
24 changes: 5 additions & 19 deletions Examples/Screens/City Explorer/CityExplorerDetails.swift
Original file line number Diff line number Diff line change
@@ -46,13 +46,12 @@ struct CityExplorerDetails: View {
}
}
.navigationTitle(viewModel.city.name)
.onAppear(perform: viewModel.onAppear)
.onDisappear(perform: viewModel.onDisappear)
.task(viewModel.loadCity)
}
}

extension CityExplorerDetails {
class ViewModel: ObservableObject {
@MainActor class ViewModel: ObservableObject {
var fetchCityDetailsTask: Task<(), Never>?
@Published var city: City
var cityFetched: Bool = false
@@ -64,21 +63,8 @@ extension CityExplorerDetails {
self.usesMockData = usesMockData
}

func onAppear() {
guard fetchCityDetailsTask == nil else {
return
}
fetchCityDetailsTask = Task {
await loadCity()
}
}

func onDisappear() {
fetchCityDetailsTask?.cancel()
}

@MainActor func loadCity() async {
let request = Router<CityRoute>().request(for: .city(id: city.cityID))
@Sendable func loadCity() async {
let request = Client<CitiesRepository>().request(for: .city(id: city.cityID))

do {
city = try await request.asyncUpload(using: CityTransformer.self)
@@ -114,7 +100,7 @@ struct CityDetailsEntry: View {
}

var thumbView: some View {
TermiNetwork.Image(request: Router<CityRoute>().request(for: .image(city: city)))
TermiNetwork.Image(request: Client<CitiesRepository>().request(for: .image(city: city)))
.aspectRatio(contentMode: .fill)
}
}
28 changes: 7 additions & 21 deletions Examples/Screens/City Explorer/CityExplorerView.swift
Original file line number Diff line number Diff line change
@@ -45,12 +45,7 @@ struct CityExplorerView: View {
}
}
.navigationTitle("City Explorer")
.onAppear { [unowned viewModel] in
viewModel.onAppear()
}
.onDisappear { [unowned viewModel] in
viewModel.onDissapear()
}
.task(viewModel.loadCities)
}
}

@@ -74,7 +69,7 @@ struct CityRow: View {

@ViewBuilder
var thumbView: some View {
let request = Router<CityRoute>().request(for: .thumb(city: city))
let request = Client<CitiesRepository>().request(for: .thumb(city: city))

ZStack {
if !imageLoaded {
@@ -94,7 +89,7 @@ struct CityRow: View {

extension CityExplorerView {
@MainActor class ViewModel: ObservableObject {
private var fetchCitiesTask: Task<(), Never>?
private var initialRequestCompleted: Bool = false

@Published var cities: [City] = []
@Published var errorMessage: String?
@@ -106,24 +101,15 @@ extension CityExplorerView {
Environment.current.configuration?.mockDataEnabled = usesMockData
}

func onAppear() {
guard fetchCitiesTask == nil else {
@Sendable func loadCities() async {
guard !initialRequestCompleted else {
return
}
self.fetchCitiesTask = Task {
await loadCities()
}
}

func onDissapear() {
fetchCitiesTask?.cancel()
}

func loadCities() async {
do {
cities = try await Router<CityRoute>()
cities = try await Client<CitiesRepository>()
.request(for: .cities)
.async(using: CitiesTransformer.self)
initialRequestCompleted = true
} catch let error {
if let error = error as? TNError {
self.errorMessage = error.localizedDescription
4 changes: 2 additions & 2 deletions Examples/Screens/DemoApp.swift
Original file line number Diff line number Diff line change
@@ -31,12 +31,12 @@ struct DemoApp: Identifiable {
[
DemoApp(
name: "City Explorer",
description: "Router, Transformers, Codables",
description: "Repository, Transformers, Codables",
destination: AnyView(CityExplorerView(viewModel: .init(usesMockData: false)))
),
DemoApp(
name: "City Explorer - Offline Mode",
description: "Router, Transformers, Codables, Mock Data",
description: "Repository, Transformers, Codables, Mock Data",
destination: AnyView(CityExplorerView(viewModel: .init(usesMockData: true)))
),
DemoApp(
Original file line number Diff line number Diff line change
@@ -67,7 +67,7 @@ struct EncryptedCommunicationView: View {
func startRequest() {
responseString = "fetching..."

Router<MiscRoute>(configuration: configuration)
Client<MiscRepository>(configuration: configuration)
.request(for: .testEncryptParams(param: text))
.success(transformer: EncryptedModelTransformer.self) { model in
responseString = model.text
2 changes: 1 addition & 1 deletion Examples/Screens/File Uploader/FileUploader.swift
Original file line number Diff line number Diff line change
@@ -172,7 +172,7 @@ extension FileUploader {
uploadStarted = true
uploadFinished = false

let response = try await Router<MiscRoute>()
let response = try await Client<MiscRepository>()
.request(for: .upload(fileUrl: imageUrl))
.asyncUpload(
using: FileUploadTransformer.self,
2 changes: 1 addition & 1 deletion Examples/Screens/Pinning/CertificatePinningView.swift
Original file line number Diff line number Diff line change
@@ -61,7 +61,7 @@ struct CertificatePinningView: View {

responseString = "fetching..."

Router<CityRoute>()
Client<CitiesRepository>()
.request(for: .pinning(configuration: configuration))
.success(responseType: Data.self) { response in
responseString = response.toJSONString() ?? ""
Loading

0 comments on commit 44fe7d8

Please sign in to comment.