Skip to content

Commit e1c88d9

Browse files
feat(agent): implement send messages
Fixes ATL-2708
1 parent c62bb2a commit e1c88d9

30 files changed

+477
-54
lines changed

Castor/Tests/PeerDIDCreationTests.swift

+1-2
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,11 @@ final class PeerDIDCreationTests: XCTestCase {
6262
let mypeerDID = DID(
6363
schema: "did",
6464
method: "peer",
65-
methodId: "2.Ez6LScuRnbZAJaVthcL5RELq75EBK2sBmBxsSs98LKNeriHQJ.Vz6MkpeaW7DeptJW7pi2qNXTdCXeQV4EYpZnAouH1LrfHj6uf.SeyJ0IjoiZG0iLCJzIjoiaHR0cHM6Ly9rOHMtZGV2LmF0YWxhcHJpc20uaW8vcHJpc20tYWdlbnQvZGlkY29tbSIsInIiOltdLCJhIjpbImRpZGNvbW0vdjIiXX0"
65+
methodId: "2.Ez6LSfuJvTtcmcFrjNYYSAuD32tMZWQUD2HYDfXrJqy3ui6MQ.Vz6MkoPyvuxAecSezqmL4ERE7eW2XPbiUEHRH9aqay6LA8Eqr.SeyJ0IjoiZG0iLCJzIjoiaHR0cDovL2hvc3QuZG9ja2VyLmludGVybmFsOjgwL2RpZGNvbW0vIiwiciI6W10sImEiOlsiZGlkY29tbS92MiJdfQ"
6666
)
6767

6868
let apollo = ApolloImpl()
6969
let castor = CastorImpl(apollo: apollo)
7070
let document = try await castor.resolveDID(did: mypeerDID)
71-
print()
7271
}
7372
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import Combine
2+
3+
extension Publishers {
4+
struct MissingOutputError: Error {}
5+
}
6+
7+
public extension Publishers.First where Failure == Error {
8+
func await() async throws -> Output {
9+
for try await output in values {
10+
return output
11+
}
12+
throw Publishers.MissingOutputError()
13+
}
14+
}

Domain/Sources/BBs/Pluto.swift

+4-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ public protocol Pluto {
99
) -> AnyPublisher<Void, Error>
1010
func storePeerDID(did: DID, privateKeys: [PrivateKey]) -> AnyPublisher<Void, Error>
1111
func storeDIDPair(holder: DID, other: DID, name: String) -> AnyPublisher<Void, Error>
12-
func storeMessage(message: Message) -> AnyPublisher<Void, Error>
13-
func storeMessages(messages: [Message]) -> AnyPublisher<Void, Error>
12+
func storeMessage(message: Message, direction: Message.Direction) -> AnyPublisher<Void, Error>
13+
func storeMessages(messages: [(Message, Message.Direction)]) -> AnyPublisher<Void, Error>
1414
func storeMediator(peer: DID, routingDID: DID, mediatorDID: DID) -> AnyPublisher<Void, Error>
1515
func storeCredential(credential: VerifiableCredential) -> AnyPublisher<Void, Error>
1616

@@ -31,6 +31,8 @@ public protocol Pluto {
3131

3232
func getAllMessages() -> AnyPublisher<[Message], Error>
3333
func getAllMessages(did: DID) -> AnyPublisher<[Message], Error>
34+
func getAllMessagesSent() -> AnyPublisher<[Message], Error>
35+
func getAllMessagesReceived() -> AnyPublisher<[Message], Error>
3436
func getAllMessagesSentTo(did: DID) -> AnyPublisher<[Message], Error>
3537
func getAllMessagesReceivedFrom(did: DID) -> AnyPublisher<[Message], Error>
3638
func getAllMessagesOfType(type: String, relatedWithDID: DID?) -> AnyPublisher<[Message], Error>

Domain/Sources/Models/Message.swift

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import Foundation
22

33
public struct Message {
4+
public enum Direction: String {
5+
case sent
6+
case received
7+
}
8+
49
public let id: String
510
public let piuri: String
611
public let from: DID?
@@ -14,6 +19,7 @@ public struct Message {
1419
public let thid: String?
1520
public let pthid: String?
1621
public let ack: [String]
22+
public let direction: Direction
1723

1824
public init(
1925
id: String = UUID().uuidString,
@@ -28,7 +34,8 @@ public struct Message {
2834
attachments: [AttachmentDescriptor] = [],
2935
thid: String? = nil,
3036
pthid: String? = nil,
31-
ack: [String] = []
37+
ack: [String] = [],
38+
direction: Direction = .received
3239
) {
3340
self.id = id
3441
self.piuri = piuri
@@ -43,5 +50,6 @@ public struct Message {
4350
self.thid = thid
4451
self.pthid = pthid
4552
self.ack = ack
53+
self.direction = direction
4654
}
4755
}

Mercury/Sources/Helpers/DIDCommMessage+DomainParse.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ extension DIDCommxSwift.AttachmentData {
101101
case let .links(value):
102102
return AttachmentLinkData(links: value.links, hash: value.hash)
103103
case let .json(value):
104-
guard let jsonData = Data(fromBase64URL: value.json) else {
104+
guard let jsonData = value.json.data(using: .utf8) else {
105105
throw MercuryError.unknownAttachmentDataError
106106
}
107107
return AttachmentJsonData(data: jsonData)

Mercury/Sources/Helpers/Session.swift

+15-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,13 @@ struct SessionManager {
2121
headers: [String: String] = [:],
2222
parameters: [String: String] = [:]
2323
) async throws -> Data? {
24-
try await call(request: try makeRequest(url: url, method: .post, body: body, parameters: parameters))
24+
try await call(request: try makeRequest(
25+
url: url,
26+
method: .post,
27+
body: body,
28+
headers: headers,
29+
parameters: parameters
30+
))
2531
}
2632

2733
private func call(request: URLRequest) async throws -> Data? {
@@ -45,7 +51,14 @@ struct SessionManager {
4551
headers: [String: String] = [:],
4652
parameters: [String: String]
4753
) throws -> URLRequest {
48-
var composition = URLComponents(url: url, resolvingAgainstBaseURL: true)
54+
let urlParsed = URL(
55+
string: url
56+
.absoluteString
57+
.replacingOccurrences(
58+
of: "http://host.docker.internal:8080",
59+
with: "http://localhost:8080"
60+
)) ?? url
61+
var composition = URLComponents(url: urlParsed, resolvingAgainstBaseURL: true)
4962
if !parameters.isEmpty {
5063
composition?.queryItems = parameters.map { URLQueryItem(name: $0, value: $1) }
5164
}

Pluto/Sources/Domain/Providers/MessageProvider.swift

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import Foundation
55
protocol MessageProvider {
66
func getAll() -> AnyPublisher<[Message], Error>
77
func getAllFor(did: DID) -> AnyPublisher<[Message], Error>
8+
func getAllSent() -> AnyPublisher<[Message], Error>
9+
func getAllReceived() -> AnyPublisher<[Message], Error>
810
func getAllSentTo(did: DID) -> AnyPublisher<[Message], Error>
911
func getAllReceivedFrom(did: DID) -> AnyPublisher<[Message], Error>
1012
func getAllOfType(type: String, relatedWithDID: DID?) -> AnyPublisher<[Message], Error>

Pluto/Sources/Domain/Stores/MessageStore.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ import Domain
33
import Foundation
44

55
protocol MessageStore {
6-
func addMessages(messages: [Message]) -> AnyPublisher<Void, Error>
7-
func addMessage(msg: Message) -> AnyPublisher<Void, Error>
6+
func addMessages(messages: [(Message, Message.Direction)]) -> AnyPublisher<Void, Error>
7+
func addMessage(msg: Message, direction: Message.Direction) -> AnyPublisher<Void, Error>
88
func removeMessage(id: String) -> AnyPublisher<Void, Error>
99
func removeAll() -> AnyPublisher<Void, Error>
1010
}

Pluto/Sources/Helpers/Message+Codable.swift

+6-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ struct CodableMessage: Codable {
1616
case pthid
1717
case ack
1818
case body
19+
case direction
1920
}
2021

2122
let message: Message
@@ -30,6 +31,7 @@ struct CodableMessage: Codable {
3031
try container.encode(message.expiresTimePlus, forKey: .expiresTimePlus)
3132
try container.encode(message.attachments, forKey: .attachments)
3233
try container.encode(message.ack, forKey: .ack)
34+
try container.encode(message.direction.rawValue, forKey: .direction)
3335
try message.from.map { try container.encode(CodableDID(did: $0), forKey: .from) }
3436
try message.to.map { try container.encode(CodableDID(did: $0), forKey: .to) }
3537
try message.fromPrior.map { try container.encode($0, forKey: .fromPrior) }
@@ -56,6 +58,8 @@ struct CodableMessage: Codable {
5658
let fromPrior = try? container.decode(String.self, forKey: .fromPrior)
5759
let thid = try? container.decode(String.self, forKey: .thid)
5860
let pthid = try? container.decode(String.self, forKey: .pthid)
61+
let directionRaw = try? container.decode(String.self, forKey: .direction)
62+
let direction = directionRaw.flatMap { Message.Direction(rawValue: $0) }
5963

6064
self.init(message: .init(
6165
id: id,
@@ -70,7 +74,8 @@ struct CodableMessage: Codable {
7074
attachments: attachments,
7175
thid: thid,
7276
pthid: pthid,
73-
ack: ack
77+
ack: ack,
78+
direction: direction ?? .sent
7479
))
7580
}
7681
}

Pluto/Sources/PersistentStorage/DAO/CDMessageDAO+MessageProvider.swift

+18
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,24 @@ extension CDMessageDAO: MessageProvider {
1818
.eraseToAnyPublisher()
1919
}
2020

21+
func getAllSent() -> AnyPublisher<[Message], Error> {
22+
fetchController(
23+
predicate: NSPredicate(format: "(direction == %@)", "sent"),
24+
context: readContext
25+
)
26+
.tryMap { try $0.map { try $0.toDomain() } }
27+
.eraseToAnyPublisher()
28+
}
29+
30+
func getAllReceived() -> AnyPublisher<[Message], Error> {
31+
fetchController(
32+
predicate: NSPredicate(format: "(direction == %@)", "received"),
33+
context: readContext
34+
)
35+
.tryMap { try $0.map { try $0.toDomain() } }
36+
.eraseToAnyPublisher()
37+
}
38+
2139
func getAllSentTo(did: DID) -> AnyPublisher<[Message], Error> {
2240
fetchController(
2341
predicate: NSPredicate(format: "to == %@", did.string),

Pluto/Sources/PersistentStorage/DAO/CDMessageDAO+MessageStore.swift

+10-15
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,22 @@ import CoreData
33
import Domain
44

55
extension CDMessageDAO: MessageStore {
6-
func addMessages(messages: [Message]) -> AnyPublisher<Void, Error> {
6+
func addMessages(messages: [(Message, Message.Direction)]) -> AnyPublisher<Void, Error> {
77
messages
88
.publisher
9-
.flatMap { self.addMessage(msg: $0) }
9+
.flatMap { self.addMessage(msg: $0.0, direction: $0.1) }
1010
.eraseToAnyPublisher()
1111
}
1212

13-
func addMessage(msg: Message) -> AnyPublisher<Void, Error> {
14-
guard
15-
let fromDID = msg.from,
16-
let toDID = msg.to
17-
else {
18-
return Fail(error: PlutoError.messageMissingFromOrToDIDError).eraseToAnyPublisher()
19-
}
13+
func addMessage(msg: Message, direction: Message.Direction) -> AnyPublisher<Void, Error> {
2014
return pairDAO
2115
.fetchController(
2216
predicate: NSPredicate(
2317
format: "(holderDID.did == %@) OR (holderDID.did == %@) OR (did == %@) OR (did == %@)",
24-
fromDID.string,
25-
toDID.string,
26-
fromDID.string,
27-
toDID.string
18+
msg.from?.string ?? "",
19+
msg.to?.string ?? "",
20+
msg.from?.string ?? "",
21+
msg.to?.string ?? ""
2822
),
2923
context: writeContext
3024
)
@@ -35,7 +29,7 @@ extension CDMessageDAO: MessageStore {
3529
msg.id,
3630
context: writeContext
3731
) { cdobj, _ in
38-
try cdobj.fromDomain(msg: msg, pair: pair)
32+
try cdobj.fromDomain(msg: msg, direction: direction, pair: pair)
3933
}
4034
}
4135
.map { _ in }
@@ -52,13 +46,14 @@ extension CDMessageDAO: MessageStore {
5246
}
5347

5448
private extension CDMessage {
55-
func fromDomain(msg: Message, pair: CDDIDPair?) throws {
49+
func fromDomain(msg: Message, direction: Message.Direction, pair: CDDIDPair?) throws {
5650
self.messageId = msg.id
5751
self.from = msg.from?.string
5852
self.to = msg.to?.string
5953
self.type = msg.piuri
6054
self.dataJson = try JSONEncoder().encode(CodableMessage(message: msg))
6155
self.createdTime = msg.createdTime
6256
self.pair = pair
57+
self.direction = direction.rawValue
6358
}
6459
}

Pluto/Sources/PersistentStorage/Models/CDMessage+CoreDataProperties.swift

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ extension CDMessage {
1313
@NSManaged var from: String?
1414
@NSManaged var to: String?
1515
@NSManaged var thid: String?
16+
@NSManaged var direction: String?
1617
@NSManaged var pair: CDDIDPair?
1718
}
1819

Pluto/Sources/PlutoImpl+Public.swift

+11-3
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ extension PlutoImpl: Pluto {
1414
pairDIDDao.addDIDPair(holder: holder, other: other, name: name)
1515
}
1616

17-
public func storeMessage(message: Message) -> AnyPublisher<Void, Error> {
18-
messageDao.addMessage(msg: message)
17+
public func storeMessage(message: Message, direction: Message.Direction) -> AnyPublisher<Void, Error> {
18+
messageDao.addMessage(msg: message, direction: direction)
1919
}
2020

21-
public func storeMessages(messages: [Message]) -> AnyPublisher<Void, Error> {
21+
public func storeMessages(messages: [(Message, Message.Direction)]) -> AnyPublisher<Void, Error> {
2222
messageDao.addMessages(messages: messages)
2323
}
2424

@@ -90,6 +90,14 @@ extension PlutoImpl: Pluto {
9090
messageDao.getAllFor(did: did)
9191
}
9292

93+
public func getAllMessagesSent() -> AnyPublisher<[Message], Error> {
94+
messageDao.getAllSent()
95+
}
96+
97+
public func getAllMessagesReceived() -> AnyPublisher<[Message], Error> {
98+
messageDao.getAllReceived()
99+
}
100+
93101
public func getAllMessagesSentTo(did: DID) -> AnyPublisher<[Message], Error> {
94102
messageDao.getAllSentTo(did: did)
95103
}

Pluto/Sources/Resources/PrismPluto.xcdatamodeld/PrismPluto.xcdatamodel/contents

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
<entity name="CDMessage" representedClassName="CDMessage" syncable="YES">
2828
<attribute name="createdTime" attributeType="Date" usesScalarValueType="NO"/>
2929
<attribute name="dataJson" attributeType="Binary"/>
30+
<attribute name="direction" optional="YES" attributeType="String"/>
3031
<attribute name="from" optional="YES" attributeType="String"/>
3132
<attribute name="messageId" attributeType="String"/>
3233
<attribute name="thid" optional="YES" attributeType="String"/>

Pluto/Tests/CDMessagesDAOTests.swift

+5-5
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ final class CDMessagesDAOTests: XCTestCase {
5151
)
5252
}
5353
.flatMap {
54-
dao.addMessage(msg: testMessage)
54+
dao.addMessage(msg: testMessage, direction: .received)
5555
}
5656
.flatMap {
5757
dao.getMessage(id: testMessage.id).first()
@@ -98,10 +98,10 @@ final class CDMessagesDAOTests: XCTestCase {
9898
)
9999
}
100100
.flatMap {
101-
dao.addMessage(msg: testMessage)
101+
dao.addMessage(msg: testMessage, direction: .received)
102102
}
103103
.flatMap {
104-
dao.addMessage(msg: testMessage)
104+
dao.addMessage(msg: testMessage, direction: .received)
105105
}
106106
.flatMap {
107107
dao.getAll().first()
@@ -167,10 +167,10 @@ final class CDMessagesDAOTests: XCTestCase {
167167
)
168168
}
169169
.flatMap {
170-
dao.addMessage(msg: testMessage1)
170+
dao.addMessage(msg: testMessage1, direction: .received)
171171
}
172172
.flatMap {
173-
dao.addMessage(msg: testMessage2)
173+
dao.addMessage(msg: testMessage2, direction: .received)
174174
}
175175
.flatMap {
176176
dao.getAllFor(did: testHolderDID2).first()

0 commit comments

Comments
 (0)