@@ -2,10 +2,61 @@ import Foundation
22@_exported import CoreModel
33@_exported import MongoSwift
44
5- extension MongoDatabase {
5+ public actor MongoModelStorage : ModelStorage {
6+
7+ public let database : MongoDatabase
8+
9+ public let model : Model
10+
11+ public init ( database: MongoDatabase , model: Model ) {
12+ self . database = database
13+ self . model = model
14+ }
15+
16+ /// Fetch managed object.
17+ public func fetch( _ entityName: EntityName , for id: ObjectID ) async throws -> ModelData ? {
18+ let entity = try model ( for: entityName)
19+ return try await database. fetch ( entity, for: id)
20+ }
21+
22+ /// Fetch managed objects.
23+ public func fetch( _ fetchRequest: FetchRequest ) async throws -> [ ModelData ] {
24+ let entity = try model ( for: fetchRequest. entity)
25+ return try await database. fetch ( fetchRequest, entity: entity)
26+ }
27+
28+ /// Fetch and return result count.
29+ public func count( _ fetchRequest: FetchRequest ) async throws -> UInt {
30+ try await database. count ( fetchRequest)
31+ }
32+
33+ /// Create or edit a managed object.
34+ public func insert( _ value: ModelData ) async throws {
35+ try await database. insert ( value)
36+ }
37+
38+ /// Create or edit multiple managed objects.
39+ public func insert( _ values: [ ModelData ] ) async throws {
40+ try await database. insert ( values)
41+ }
42+
43+ /// Delete the specified managed object.
44+ public func delete( _ entity: EntityName , for id: ObjectID ) async throws {
45+ try await database. delete ( entity, for: id)
46+ }
47+
48+ private func model( for entityName: EntityName ) throws -> EntityDescription {
49+ guard let entity = self . model. entities. first ( where: { $0. id == entityName } ) else {
50+ throw CoreModelError . invalidEntity ( entityName)
51+ }
52+ return entity
53+ }
54+ }
55+
56+ public extension MongoDatabase {
657
758 /// Fetch managed object.
8- public func fetch(
59+ func fetch(
960 _ entity: EntityDescription ,
1061 for id: ObjectID
1162 ) async throws -> ModelData ? {
@@ -16,7 +67,7 @@ extension MongoDatabase {
1667 }
1768
1869 /// Fetch managed objects.
19- public func fetch(
70+ func fetch(
2071 _ fetchRequest: FetchRequest ,
2172 entity: EntityDescription
2273 ) async throws -> [ ModelData ] {
@@ -25,7 +76,7 @@ extension MongoDatabase {
2576 }
2677
2778 /// Fetch and return result count.
28- public func count( _ fetchRequest: FetchRequest ) async throws -> UInt {
79+ func count( _ fetchRequest: FetchRequest ) async throws -> UInt {
2980 let entityName = fetchRequest. entity
3081 let collection = self . collection ( entityName)
3182 let filter = fetchRequest. predicate. map { BSONDocument ( filter: $0) } ?? [ : ]
@@ -35,14 +86,14 @@ extension MongoDatabase {
3586 }
3687
3788 /// Create or edit a managed object.
38- public func insert( _ value: ModelData ) async throws {
89+ func insert( _ value: ModelData ) async throws {
3990 let entityName = value. entity
4091 let collection = self . collection ( entityName)
4192 let document = BSONDocument ( model: value)
4293 try await collection. insertOne ( document)
4394 }
4495
45- public func insert( _ values: [ ModelData ] ) async throws {
96+ func insert( _ values: [ ModelData ] ) async throws {
4697 var collections = [ EntityName: [ ModelData] ] ( )
4798 for value in values {
4899 collections [ value. entity, default: [ ] ] . append ( value)
@@ -55,7 +106,7 @@ extension MongoDatabase {
55106 }
56107
57108 /// Delete the specified managed object.
58- public func delete(
109+ func delete(
59110 _ entity: EntityName ,
60111 for id: ObjectID
61112 ) async throws {
@@ -68,11 +119,6 @@ extension MongoDatabase {
68119 }
69120}
70121
71- public extension MongoDatabase {
72-
73-
74- }
75-
76122internal extension MongoDatabase {
77123
78124 func find(
0 commit comments