From b7725c455bb76262db3f51e607a3ee7b1f504933 Mon Sep 17 00:00:00 2001 From: ronaldheft Date: Sat, 16 Jul 2022 20:25:04 -0400 Subject: [PATCH] Prototype response to app --- ios/App/App/plugins/AbsDatabase.swift | 8 +++++++- ios/App/Shared/models/LocalLibrary.swift | 21 ++++++++++++++------ ios/App/Shared/util/Extensions.swift | 25 ++++++++++++++++++------ 3 files changed, 41 insertions(+), 13 deletions(-) diff --git a/ios/App/App/plugins/AbsDatabase.swift b/ios/App/App/plugins/AbsDatabase.swift index 673f002e..9d17805c 100644 --- a/ios/App/App/plugins/AbsDatabase.swift +++ b/ios/App/App/plugins/AbsDatabase.swift @@ -75,7 +75,13 @@ public class AbsDatabase: CAPPlugin { } @objc func getLocalLibraryItems(_ call: CAPPluginCall) { - call.resolve([ "value": [] ]) + do { + let items = Database.shared.getLocalLibraryItems() + call.resolve([ "value": try items.asDictionaryArray() ]) + } catch(let exception) { + NSLog("error while readling local library items") + debugPrint(exception) + } } @objc func getLocalLibraryItem(_ call: CAPPluginCall) { call.resolve() diff --git a/ios/App/Shared/models/LocalLibrary.swift b/ios/App/Shared/models/LocalLibrary.swift index 39f7da35..7a66e093 100644 --- a/ios/App/Shared/models/LocalLibrary.swift +++ b/ios/App/Shared/models/LocalLibrary.swift @@ -9,7 +9,7 @@ import Foundation import RealmSwift -class LocalLibraryItem: Object { +class LocalLibraryItem: Object, Encodable { @Persisted(primaryKey: true) var id: String @Persisted var basePath: String = "" @Persisted var absolutePath: String = "" @@ -44,6 +44,15 @@ class LocalLibraryItem: Object { self.serverAddress = server.address self.serverUserId = server.userId } + + enum CodingKeys: CodingKey { + case id + } + + func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(id, forKey: .id) + } } class LocalMediaType: Object { @@ -146,7 +155,7 @@ class LocalPodcastEpisode: Object { // @Persisted var serverEpisodeId: String? } -class LocalAudioFile: Object, Codable { +class LocalAudioFile: Object { @Persisted var index: Int @Persisted var ino: String @Persisted var metadata: LocalFileMetadata? @@ -162,13 +171,13 @@ class LocalAudioFile: Object, Codable { } } -class LocalAuthor: Object, Codable { +class LocalAuthor: Object { @Persisted var id: String @Persisted var name: String @Persisted var coverPath: String? = "" } -class LocalChapter: Object, Codable { +class LocalChapter: Object { @Persisted var id: Int @Persisted var start: Double @Persisted var end: Double @@ -216,7 +225,7 @@ class LocalAudioTrack: Object { } } -class LocalFileMetadata: Object, Codable { +class LocalFileMetadata: Object { @Persisted var filename: String @Persisted var ext: String @Persisted var path: String @@ -248,7 +257,7 @@ class LocalFile: Object { } } -class LocalMediaProgress: Object, Codable { +class LocalMediaProgress: Object { @Persisted var id: String @Persisted var localLibraryItemId: String @Persisted var localEpisodeId: String? = "" diff --git a/ios/App/Shared/util/Extensions.swift b/ios/App/Shared/util/Extensions.swift index e4badb99..72088b9a 100644 --- a/ios/App/Shared/util/Extensions.swift +++ b/ios/App/Shared/util/Extensions.swift @@ -6,18 +6,31 @@ // import Foundation +import SwiftUI +import RealmSwift extension String: Error {} +typealias Dictionaryable = Encodable + extension Encodable { - func asDictionary() throws -> [String: Any] { - let data = try JSONEncoder().encode(self) - guard let dictionary = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any] else { - throw NSError() + func asDictionary() throws -> [String: Any] { + let data = try JSONEncoder().encode(self) + guard let dictionary = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any] else { + throw NSError() + } + return dictionary } - return dictionary - } } + +extension Collection where Iterator.Element: Encodable { + func asDictionaryArray() throws -> [[String: Any]] { + return try self.enumerated().map() { + i, element -> [String: Any] in try element.asDictionary() + } + } +} + extension DispatchQueue { static func runOnMainQueue(callback: @escaping (() -> Void)) { if Thread.isMainThread {