Skip to content

Commit

Permalink
fetch pages of timesheets by PageRequestService
Browse files Browse the repository at this point in the history
  • Loading branch information
ManuelSelch committed Aug 17, 2024
1 parent f12de51 commit 8eb1bf1
Show file tree
Hide file tree
Showing 9 changed files with 141 additions and 52 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
<key>DebugApp.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>3</integer>
<integer>4</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
<key>IntegrationApp.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>2</integer>
<integer>1</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
Expand Down
2 changes: 1 addition & 1 deletion Modules/Kimai/Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ let package = Package(
.library(name: "KimaiApp", targets: ["KimaiApp"])
],
dependencies: [
.package(url: "https://github.com/manuelselch/OfflineSync", .upToNextMajor(from: "1.3.1")),
.package(url: "https://github.com/manuelselch/OfflineSync", .upToNextMajor(from: "1.3.2")),
.package(url: "https://github.com/manuelselch/Redux", .upToNextMajor(from: "1.2.13")),
.package(url: "https://github.com/manuelselch/Dependencies", .upToNextMajor(from: "1.0.0")),
.package(url: "https://github.com/ManuelSelch/Chart", .upToNextMajor(from: "1.0.4")),
Expand Down
6 changes: 0 additions & 6 deletions Modules/Kimai/Sources/Services/KimaiRecordService.swift

This file was deleted.

20 changes: 0 additions & 20 deletions Modules/Kimai/Sources/Services/KimaiRequestServices.swift

This file was deleted.

9 changes: 5 additions & 4 deletions Modules/Kimai/Sources/Services/KimaiTimesheetService.swift
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@
import Dependencies
import Moya
import OfflineSyncServices

import KimaiCore

struct TimesheetsKey: DependencyKey {
static var liveValue: RecordService<KimaiTimesheet> = .init(
repository: .init("kimai_timesheets"),
requestService: RequestService.live(
fetchMethod: {KimaiAPI.getTimesheets(0)},
requestService: PageRequestService.live(
fetchMethod: KimaiAPI.getTimesheets,
insertMethod: KimaiAPI.insertTimesheet,
updateMethod: KimaiAPI.updateTimesheet,
deleteMethod: KimaiAPI.deleteTimesheet
)
)
static var mockValue: RecordService<KimaiTimesheet> = .init(
repository: .init("kimai_timesheets"),
requestService: RequestService.live(
fetchMethod: {KimaiAPI.getTimesheets(0)},
requestService: PageRequestService.mock(
fetchMethod: KimaiAPI.getTimesheets,
insertMethod: KimaiAPI.insertTimesheet,
updateMethod: KimaiAPI.updateTimesheet,
deleteMethod: KimaiAPI.deleteTimesheet
Expand Down
114 changes: 114 additions & 0 deletions Modules/Kimai/Sources/Services/PageRequestService.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
import Foundation
import Dependencies
import OfflineSyncCore
import OfflineSyncServices
import Moya


public class PageRequestService<Model: TableProtocol, API: TargetType>: RequestService<Model, API> {
var fetchPageMethod: (Int) -> API

init(
fetchMethod: @escaping (Int) -> API,
insertMethod: ((Model) -> API)? = nil,
updateMethod: ((Model) -> API)? = nil,
deleteMethod: ((Int) -> API)? = nil,

provider: MoyaProvider<API>,
_setPlugins: @escaping ([PluginType]) -> MoyaProvider<API>
) {
self.fetchPageMethod = fetchMethod

super.init(
fetchMethod: nil,
insertMethod: insertMethod,
updateMethod: updateMethod,
deleteMethod: deleteMethod,

provider: provider,
_setPlugins: _setPlugins
)
}

override public func fetch() async throws -> [Model] {
var records: [Model] = []

let (response, headers): ([Model]?, [AnyHashable:Any]) = try await requestWithHeaders(provider, fetchPageMethod(1))
if let response = response {
records.append(contentsOf: response)
}

if let pages = headers["x-total-pages"] as? Int {
for i in 2...pages {
if let result: [Model] = try await request(provider, fetchPageMethod(i)) {
records.append(contentsOf: result)
}
}
}

return records
}

func requestWithHeaders<Response: Decodable, TargetType>(_ provider: MoyaProvider<TargetType>, _ method: TargetType) async throws -> (Response?, [AnyHashable:Any]) {
return try await withCheckedThrowingContinuation { continuation in
provider.request(method){ result in
switch result {
case .success(let response):
let headers = response.response?.allHeaderFields ?? [:]

if (response.statusCode == 204){ // no content
continuation.resume(returning: (nil, headers))
} else if let data = try? JSONDecoder().decode(Response.self, from: response.data) {
continuation.resume(returning: (data, headers))
}else {
if let string = String(data: response.data, encoding: .utf8) {
continuation.resume(throwing: ServiceError.unknown(method.path + " -> " + string))
}else{
continuation.resume(throwing: ServiceError.decodeFailed)
}
}
case .failure(let error):
continuation.resume(throwing: ServiceError.unknown(method.path + " -> " + error.localizedDescription))
}
}
}
}
}

public extension PageRequestService {
static func live(
fetchMethod: @escaping (Int) -> API,
insertMethod: ((Model) -> API)? = nil,
updateMethod: ((Model) -> API)? = nil,
deleteMethod: ((Int) -> API)? = nil
) -> PageRequestService {
return .init(
fetchMethod: fetchMethod,
insertMethod: insertMethod,
updateMethod: updateMethod,
deleteMethod: deleteMethod,
provider: MoyaProvider<API>(),
_setPlugins: { plugins in
return MoyaProvider<API>(plugins: plugins)
}
)
}

static func mock(
fetchMethod: @escaping (Int) -> API,
insertMethod: ((Model) -> API)? = nil,
updateMethod: ((Model) -> API)? = nil,
deleteMethod: ((Int) -> API)? = nil
) -> PageRequestService {
return .init(
fetchMethod: fetchMethod,
insertMethod: insertMethod,
updateMethod: updateMethod,
deleteMethod: deleteMethod,
provider: MoyaProvider<API>(stubClosure: MoyaProvider.immediatelyStub),
_setPlugins: { plugins in
return MoyaProvider<API>(stubClosure: MoyaProvider.immediatelyStub, plugins: plugins)
}
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,10 @@
{
"identity" : "offlinesync",
"kind" : "remoteSourceControl",
"location" : "https://github.com/ManuelSelch/OfflineSync",
"location" : "https://github.com/manuelselch/OfflineSync",
"state" : {
"revision" : "0b9c8767d0cce89779b1c08e7e78189c5615d198",
"version" : "1.3.1"
"revision" : "24eb8b511534f66451dad0923f2cbf2ac0558867",
"version" : "1.3.2"
}
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>9</integer>
<integer>17</integer>
</dict>
<key>AnyCodable (Playground) 2.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>10</integer>
<integer>18</integer>
</dict>
<key>AnyCodable (Playground) 3.xcscheme</key>
<dict>
Expand Down Expand Up @@ -65,14 +65,14 @@
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>8</integer>
<integer>16</integer>
</dict>
<key>ReactiveSwift (Playground) 1.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>18</integer>
<integer>14</integer>
</dict>
<key>ReactiveSwift (Playground) 10.xcscheme</key>
<dict>
Expand Down Expand Up @@ -114,7 +114,7 @@
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>19</integer>
<integer>15</integer>
</dict>
<key>ReactiveSwift (Playground) 3.xcscheme</key>
<dict>
Expand Down Expand Up @@ -170,14 +170,14 @@
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>17</integer>
<integer>13</integer>
</dict>
<key>ReactiveSwift-UIExamples (Playground) 1.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>21</integer>
<integer>11</integer>
</dict>
<key>ReactiveSwift-UIExamples (Playground) 10.xcscheme</key>
<dict>
Expand Down Expand Up @@ -219,7 +219,7 @@
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>22</integer>
<integer>12</integer>
</dict>
<key>ReactiveSwift-UIExamples (Playground) 3.xcscheme</key>
<dict>
Expand Down Expand Up @@ -275,14 +275,14 @@
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>20</integer>
<integer>10</integer>
</dict>
<key>Rx (Playground) 1.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>13</integer>
<integer>20</integer>
</dict>
<key>Rx (Playground) 10.xcscheme</key>
<dict>
Expand Down Expand Up @@ -324,7 +324,7 @@
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>14</integer>
<integer>21</integer>
</dict>
<key>Rx (Playground) 3.xcscheme</key>
<dict>
Expand Down Expand Up @@ -380,14 +380,14 @@
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>12</integer>
<integer>19</integer>
</dict>
<key>SQLite (Playground) 1.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>15</integer>
<integer>23</integer>
</dict>
<key>SQLite (Playground) 10.xcscheme</key>
<dict>
Expand All @@ -408,7 +408,7 @@
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>16</integer>
<integer>24</integer>
</dict>
<key>SQLite (Playground) 3.xcscheme</key>
<dict>
Expand Down Expand Up @@ -464,7 +464,7 @@
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>11</integer>
<integer>22</integer>
</dict>
<key>businessToGo.xcscheme_^#shared#^_</key>
<dict>
Expand All @@ -474,7 +474,7 @@
<key>widgetExtension.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>1</integer>
<integer>2</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
Expand Down

0 comments on commit 8eb1bf1

Please sign in to comment.