-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathCDMessageDAO+MessageProvider.swift
89 lines (79 loc) · 2.79 KB
/
CDMessageDAO+MessageProvider.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import Combine
import CoreData
import Domain
extension CDMessageDAO: MessageProvider {
func getAll() -> AnyPublisher<[Message], Error> {
fetchController(context: readContext)
.tryMap {
try $0.map {
try $0.toDomain()
}}
.eraseToAnyPublisher()
}
func getAllFor(did: DID) -> AnyPublisher<[Message], Error> {
fetchController(
predicate: NSPredicate(format: "(pair.did == %@) OR (pair.holderDID.did == %@)", did.string, did.string),
context: readContext
)
.tryMap { try $0.map { try $0.toDomain() } }
.eraseToAnyPublisher()
}
func getAllSent() -> AnyPublisher<[Message], Error> {
fetchController(
predicate: NSPredicate(format: "(direction == %d)", 0),
context: readContext
)
.tryMap { try $0.map { try $0.toDomain() } }
.eraseToAnyPublisher()
}
func getAllReceived() -> AnyPublisher<[Message], Error> {
fetchController(
predicate: NSPredicate(format: "(direction == %d)", 1),
context: readContext
)
.tryMap { try $0.map { try $0.toDomain() } }
.eraseToAnyPublisher()
}
func getAllSentTo(did: DID) -> AnyPublisher<[Message], Error> {
fetchController(
predicate: NSPredicate(format: "to == %@", did.string),
context: readContext
)
.tryMap { try $0.map { try $0.toDomain() } }
.eraseToAnyPublisher()
}
func getAllReceivedFrom(did: DID) -> AnyPublisher<[Message], Error> {
fetchController(
predicate: NSPredicate(format: "from == %@", did.string),
context: readContext
)
.tryMap { try $0.map { try $0.toDomain() } }
.eraseToAnyPublisher()
}
func getAllOfType(type: String, relatedWithDID: DID?) -> AnyPublisher<[Message], Error> {
fetchController(
predicate: NSPredicate(format: "type == %@", type),
context: readContext
)
.tryMap { try $0.map { try $0.toDomain() } }
.eraseToAnyPublisher()
}
func getAll(from: DID, to: DID) -> AnyPublisher<[Message], Error> {
fetchController(
predicate: NSPredicate(format: "(from == %@) OR (to == %@)", from.string, to.string),
context: readContext
)
.tryMap { try $0.map { try $0.toDomain() } }
.eraseToAnyPublisher()
}
func getMessage(id: String) -> AnyPublisher<Message?, Error> {
fetchByIDsPublisher(id, context: readContext)
.tryMap { try $0?.toDomain() }
.eraseToAnyPublisher()
}
}
private extension CDMessage {
func toDomain() throws -> Message {
try JSONDecoder().decode(CodableMessage.self, from: dataJson).message
}
}