Skip to content

Commit d3ee009

Browse files
committed
Add MongoModelStorage
1 parent 185b183 commit d3ee009

1 file changed

Lines changed: 58 additions & 12 deletions

File tree

Sources/MongoDBModel/MongoDatabase.swift

Lines changed: 58 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
76122
internal extension MongoDatabase {
77123

78124
func find(

0 commit comments

Comments
 (0)