Skip to content

Commit 53aacc2

Browse files
committed
chats: ignore invalid messages
1 parent 2120db0 commit 53aacc2

4 files changed

Lines changed: 194 additions & 26 deletions

File tree

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
import { MessageQuery } from "./MessageQuery";
2+
import { graph, parse, sym } from "rdflib";
3+
4+
describe(MessageQuery.name, () => {
5+
describe("queryMessage", () => {
6+
it("returns null if store is empty", () => {
7+
const store = graph();
8+
const result = new MessageQuery(
9+
sym("https://pod.test/message#1"),
10+
store,
11+
).queryMessage();
12+
expect(result).toEqual(null);
13+
});
14+
15+
it("returns a complete message", () => {
16+
const store = graph();
17+
parse(
18+
`
19+
@prefix : <#>.
20+
@prefix sioc: <http://rdfs.org/sioc/ns#>.
21+
@prefix dct: <http://purl.org/dc/terms/>.
22+
@prefix foaf: <http://xmlns.com/foaf/0.1/>.
23+
@prefix xsd: <http://www.w3.org/2001/XMLSchema#>.
24+
25+
:1 sioc:content "A message" ;
26+
dct:created "2024-07-01T17:47:14Z"^^xsd:dateTime ;
27+
foaf:maker <https://pod.test/alice/profile/card#me> ;
28+
.
29+
30+
`,
31+
store,
32+
"https://pod.test/message",
33+
);
34+
const result = new MessageQuery(
35+
sym("https://pod.test/message#1"),
36+
store,
37+
).queryMessage();
38+
expect(result).toEqual({
39+
uri: "https://pod.test/message#1",
40+
authorWebId: "https://pod.test/alice/profile/card#me",
41+
date: new Date("2024-07-01T17:47:14Z"),
42+
text: "A message",
43+
});
44+
});
45+
46+
describe("returns null for invalid messages", () => {
47+
it("that have no content", () => {
48+
const store = graph();
49+
parse(
50+
`
51+
@prefix : <#>.
52+
@prefix sioc: <http://rdfs.org/sioc/ns#>.
53+
@prefix dct: <http://purl.org/dc/terms/>.
54+
@prefix foaf: <http://xmlns.com/foaf/0.1/>.
55+
@prefix xsd: <http://www.w3.org/2001/XMLSchema#>.
56+
57+
:1
58+
dct:created "2024-07-01T17:47:14Z"^^xsd:dateTime ;
59+
foaf:maker <https://pod.test/alice/profile/card#me> ;
60+
.
61+
62+
`,
63+
store,
64+
"https://pod.test/message",
65+
);
66+
const result = new MessageQuery(
67+
sym("https://pod.test/message#1"),
68+
store,
69+
).queryMessage();
70+
expect(result).toEqual(null);
71+
});
72+
73+
it("that have no date", () => {
74+
const store = graph();
75+
parse(
76+
`
77+
@prefix : <#>.
78+
@prefix sioc: <http://rdfs.org/sioc/ns#>.
79+
@prefix dct: <http://purl.org/dc/terms/>.
80+
@prefix foaf: <http://xmlns.com/foaf/0.1/>.
81+
@prefix xsd: <http://www.w3.org/2001/XMLSchema#>.
82+
83+
:1 sioc:content "A message" ;
84+
foaf:maker <https://pod.test/alice/profile/card#me> ;
85+
.
86+
87+
`,
88+
store,
89+
"https://pod.test/message",
90+
);
91+
const result = new MessageQuery(
92+
sym("https://pod.test/message#1"),
93+
store,
94+
).queryMessage();
95+
expect(result).toEqual(null);
96+
});
97+
98+
it("that have no author", () => {
99+
const store = graph();
100+
parse(
101+
`
102+
@prefix : <#>.
103+
@prefix sioc: <http://rdfs.org/sioc/ns#>.
104+
@prefix dct: <http://purl.org/dc/terms/>.
105+
@prefix foaf: <http://xmlns.com/foaf/0.1/>.
106+
@prefix xsd: <http://www.w3.org/2001/XMLSchema#>.
107+
108+
:1 sioc:content "A message" ;
109+
dct:created "2024-07-01T17:47:14Z"^^xsd:dateTime ;
110+
.
111+
112+
`,
113+
store,
114+
"https://pod.test/message",
115+
);
116+
const result = new MessageQuery(
117+
sym("https://pod.test/message#1"),
118+
store,
119+
).queryMessage();
120+
expect(result).toEqual(null);
121+
});
122+
});
123+
});
124+
});
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { IndexedFormula, NamedNode, sym } from "rdflib";
2+
import { Message } from "../../index.js";
3+
4+
export class MessageQuery {
5+
constructor(
6+
private messageNode: NamedNode,
7+
private store: IndexedFormula,
8+
) {}
9+
10+
queryMessage(): Message | null {
11+
const text = this.store.anyValue(
12+
this.messageNode,
13+
sym("http://rdfs.org/sioc/ns#content"),
14+
);
15+
16+
if (!text) {
17+
return null;
18+
}
19+
20+
const date = this.store.anyJS(
21+
this.messageNode,
22+
sym("http://purl.org/dc/terms/created"),
23+
);
24+
if (!date) return null;
25+
const authorWebId = this.store.anyValue(
26+
this.messageNode,
27+
sym("http://xmlns.com/foaf/0.1/maker"),
28+
);
29+
if (!authorWebId) {
30+
return null;
31+
}
32+
return {
33+
uri: this.messageNode.uri,
34+
text,
35+
date,
36+
authorWebId,
37+
};
38+
}
39+
}

chats/rdflib/src/module/queries/MessagesDocumentQuery.spec.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,30 @@ describe(MessagesDocumentQuery.name, () => {
9090
});
9191

9292
describe("ignores messages", () => {
93+
it("that are invalid", () => {
94+
const store = graph();
95+
parse(
96+
`@prefix wf: <http://www.w3.org/2005/01/wf/flow#> .
97+
98+
<https://pod.example/chat/1/index.ttl#this>
99+
wf:message <#message-1> .
100+
101+
<#message-1>
102+
<http://xmlns.com/foaf/0.1/maker> <http://localhost:3000/alice/profile/card#me> ;
103+
.
104+
`,
105+
store,
106+
"https://pod.example/chat/1/2024/07/30/chat.ttl",
107+
);
108+
109+
const result = new MessagesDocumentQuery(
110+
sym("https://pod.example/chat/1/index.ttl#this"),
111+
sym("https://pod.example/chat/1/2024/07/30/chat.ttl"),
112+
store,
113+
).queryMessages();
114+
expect(result).toEqual([]);
115+
});
116+
93117
it("that are not linked to the chat", () => {
94118
const store = graph();
95119
parse(
Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import { IndexedFormula, NamedNode, sym } from "rdflib";
1+
import { IndexedFormula, NamedNode } from "rdflib";
22
import { Message } from "../../index.js";
33
import { wf } from "../namespaces.js";
4+
import { MessageQuery } from "./MessageQuery.js";
45

56
export class MessagesDocumentQuery {
67
constructor(
@@ -14,30 +15,10 @@ export class MessagesDocumentQuery {
1415
.each(this.chatNode, wf("message"), undefined, this.messagesDocument)
1516
.map((it) => it as NamedNode);
1617

17-
return messages.map((messageNode) => this.queryMessage(messageNode));
18-
}
19-
20-
private queryMessage(messageNode: NamedNode) {
21-
const text =
22-
this.store.anyValue(
23-
messageNode,
24-
sym("http://rdfs.org/sioc/ns#content"),
25-
) ?? "";
26-
27-
const date = this.store.anyJS(
28-
messageNode,
29-
sym("http://purl.org/dc/terms/created"),
30-
);
31-
const authorWebId =
32-
this.store.anyValue(
33-
messageNode,
34-
sym("http://xmlns.com/foaf/0.1/maker"),
35-
) ?? "";
36-
return {
37-
uri: messageNode.uri,
38-
text,
39-
date,
40-
authorWebId,
41-
};
18+
return messages
19+
.map((messageNode) =>
20+
new MessageQuery(messageNode, this.store).queryMessage(),
21+
)
22+
.filter((it) => it !== null);
4223
}
4324
}

0 commit comments

Comments
 (0)