summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.sqlx/query-14ca0364c6f0ab084b22af0061d4bf5755cda35dba473eae37f467cfabb0102e.json56
-rw-r--r--.sqlx/query-315a4a16ebc0a99ab745a40bd021892002b7ba7d9f4cac5deea298b6223918aa.json56
-rw-r--r--.sqlx/query-5c53579fa431b6e184faf94eedb8229360ba78f2607d25e7e2ee5db5c759a5a3.json62
-rw-r--r--.sqlx/query-6fc4be85527af518da17c49cedc6bee1750d28a6176980ed7040b8a3301fc7e5.json62
-rw-r--r--.sqlx/query-9606853f2ea9f776f7e4384a2137be57b3a45fe38a675262ceaaebb3d346a9ca.json62
-rw-r--r--.sqlx/query-eb9d7146e615044568f9bb47a7317dda3e429faac15e02c900f62f83c25070a7.json56
-rw-r--r--docs/api.md9
-rw-r--r--hi-ui/src/apiServer.js4
-rw-r--r--hi-ui/src/store/messages.js15
-rw-r--r--src/message/event.rs6
-rw-r--r--src/message/history.rs1
-rw-r--r--src/message/repo.rs36
-rw-r--r--src/message/snapshot.rs4
13 files changed, 189 insertions, 240 deletions
diff --git a/.sqlx/query-14ca0364c6f0ab084b22af0061d4bf5755cda35dba473eae37f467cfabb0102e.json b/.sqlx/query-14ca0364c6f0ab084b22af0061d4bf5755cda35dba473eae37f467cfabb0102e.json
new file mode 100644
index 0000000..15ceb24
--- /dev/null
+++ b/.sqlx/query-14ca0364c6f0ab084b22af0061d4bf5755cda35dba473eae37f467cfabb0102e.json
@@ -0,0 +1,56 @@
+{
+ "db_name": "SQLite",
+ "query": "\n select\n message.channel as \"channel: channel::Id\",\n sender.id as \"sender_id: login::Id\",\n sender.name as \"sender_name\",\n message.id as \"id: Id\",\n message.body,\n sent_at as \"sent_at: DateTime\",\n sent_sequence as \"sent_sequence: Sequence\"\n from message\n join login as sender on message.sender = sender.id\n where coalesce(message.sent_sequence > $1, true)\n ",
+ "describe": {
+ "columns": [
+ {
+ "name": "channel: channel::Id",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "sender_id: login::Id",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "sender_name",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "id: Id",
+ "ordinal": 3,
+ "type_info": "Text"
+ },
+ {
+ "name": "body",
+ "ordinal": 4,
+ "type_info": "Text"
+ },
+ {
+ "name": "sent_at: DateTime",
+ "ordinal": 5,
+ "type_info": "Text"
+ },
+ {
+ "name": "sent_sequence: Sequence",
+ "ordinal": 6,
+ "type_info": "Integer"
+ }
+ ],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": [
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false
+ ]
+ },
+ "hash": "14ca0364c6f0ab084b22af0061d4bf5755cda35dba473eae37f467cfabb0102e"
+}
diff --git a/.sqlx/query-315a4a16ebc0a99ab745a40bd021892002b7ba7d9f4cac5deea298b6223918aa.json b/.sqlx/query-315a4a16ebc0a99ab745a40bd021892002b7ba7d9f4cac5deea298b6223918aa.json
new file mode 100644
index 0000000..7aeac69
--- /dev/null
+++ b/.sqlx/query-315a4a16ebc0a99ab745a40bd021892002b7ba7d9f4cac5deea298b6223918aa.json
@@ -0,0 +1,56 @@
+{
+ "db_name": "SQLite",
+ "query": "\n select\n message.channel as \"channel: channel::Id\",\n sender.id as \"sender_id: login::Id\",\n sender.name as \"sender_name\",\n message.id as \"id: Id\",\n message.body,\n sent_at as \"sent_at: DateTime\",\n sent_sequence as \"sent_sequence: Sequence\"\n from message\n join login as sender on message.sender = sender.id\n where message.id = $1\n ",
+ "describe": {
+ "columns": [
+ {
+ "name": "channel: channel::Id",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "sender_id: login::Id",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "sender_name",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "id: Id",
+ "ordinal": 3,
+ "type_info": "Text"
+ },
+ {
+ "name": "body",
+ "ordinal": 4,
+ "type_info": "Text"
+ },
+ {
+ "name": "sent_at: DateTime",
+ "ordinal": 5,
+ "type_info": "Text"
+ },
+ {
+ "name": "sent_sequence: Sequence",
+ "ordinal": 6,
+ "type_info": "Integer"
+ }
+ ],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": [
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false
+ ]
+ },
+ "hash": "315a4a16ebc0a99ab745a40bd021892002b7ba7d9f4cac5deea298b6223918aa"
+}
diff --git a/.sqlx/query-5c53579fa431b6e184faf94eedb8229360ba78f2607d25e7e2ee5db5c759a5a3.json b/.sqlx/query-5c53579fa431b6e184faf94eedb8229360ba78f2607d25e7e2ee5db5c759a5a3.json
deleted file mode 100644
index 4ca6786..0000000
--- a/.sqlx/query-5c53579fa431b6e184faf94eedb8229360ba78f2607d25e7e2ee5db5c759a5a3.json
+++ /dev/null
@@ -1,62 +0,0 @@
-{
- "db_name": "SQLite",
- "query": "\n select\n channel.id as \"channel_id: channel::Id\",\n channel.name as \"channel_name\",\n sender.id as \"sender_id: login::Id\",\n sender.name as \"sender_name\",\n message.id as \"id: Id\",\n message.body,\n sent_at as \"sent_at: DateTime\",\n sent_sequence as \"sent_sequence: Sequence\"\n from message\n join channel on message.channel = channel.id\n join login as sender on message.sender = sender.id\n where coalesce(message.sent_sequence > $1, true)\n ",
- "describe": {
- "columns": [
- {
- "name": "channel_id: channel::Id",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "channel_name",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "sender_id: login::Id",
- "ordinal": 2,
- "type_info": "Text"
- },
- {
- "name": "sender_name",
- "ordinal": 3,
- "type_info": "Text"
- },
- {
- "name": "id: Id",
- "ordinal": 4,
- "type_info": "Text"
- },
- {
- "name": "body",
- "ordinal": 5,
- "type_info": "Text"
- },
- {
- "name": "sent_at: DateTime",
- "ordinal": 6,
- "type_info": "Text"
- },
- {
- "name": "sent_sequence: Sequence",
- "ordinal": 7,
- "type_info": "Integer"
- }
- ],
- "parameters": {
- "Right": 1
- },
- "nullable": [
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false
- ]
- },
- "hash": "5c53579fa431b6e184faf94eedb8229360ba78f2607d25e7e2ee5db5c759a5a3"
-}
diff --git a/.sqlx/query-6fc4be85527af518da17c49cedc6bee1750d28a6176980ed7040b8a3301fc7e5.json b/.sqlx/query-6fc4be85527af518da17c49cedc6bee1750d28a6176980ed7040b8a3301fc7e5.json
deleted file mode 100644
index 257e1f6..0000000
--- a/.sqlx/query-6fc4be85527af518da17c49cedc6bee1750d28a6176980ed7040b8a3301fc7e5.json
+++ /dev/null
@@ -1,62 +0,0 @@
-{
- "db_name": "SQLite",
- "query": "\n select\n channel.id as \"channel_id: channel::Id\",\n channel.name as \"channel_name\",\n sender.id as \"sender_id: login::Id\",\n sender.name as \"sender_name\",\n message.id as \"id: Id\",\n message.body,\n sent_at as \"sent_at: DateTime\",\n sent_sequence as \"sent_sequence: Sequence\"\n from message\n join channel on message.channel = channel.id\n join login as sender on message.sender = sender.id\n where message.id = $1\n ",
- "describe": {
- "columns": [
- {
- "name": "channel_id: channel::Id",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "channel_name",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "sender_id: login::Id",
- "ordinal": 2,
- "type_info": "Text"
- },
- {
- "name": "sender_name",
- "ordinal": 3,
- "type_info": "Text"
- },
- {
- "name": "id: Id",
- "ordinal": 4,
- "type_info": "Text"
- },
- {
- "name": "body",
- "ordinal": 5,
- "type_info": "Text"
- },
- {
- "name": "sent_at: DateTime",
- "ordinal": 6,
- "type_info": "Text"
- },
- {
- "name": "sent_sequence: Sequence",
- "ordinal": 7,
- "type_info": "Integer"
- }
- ],
- "parameters": {
- "Right": 1
- },
- "nullable": [
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false
- ]
- },
- "hash": "6fc4be85527af518da17c49cedc6bee1750d28a6176980ed7040b8a3301fc7e5"
-}
diff --git a/.sqlx/query-9606853f2ea9f776f7e4384a2137be57b3a45fe38a675262ceaaebb3d346a9ca.json b/.sqlx/query-9606853f2ea9f776f7e4384a2137be57b3a45fe38a675262ceaaebb3d346a9ca.json
deleted file mode 100644
index 82246ac..0000000
--- a/.sqlx/query-9606853f2ea9f776f7e4384a2137be57b3a45fe38a675262ceaaebb3d346a9ca.json
+++ /dev/null
@@ -1,62 +0,0 @@
-{
- "db_name": "SQLite",
- "query": "\n select\n channel.id as \"channel_id: channel::Id\",\n channel.name as \"channel_name\",\n sender.id as \"sender_id: login::Id\",\n sender.name as \"sender_name\",\n message.id as \"id: Id\",\n message.body,\n sent_at as \"sent_at: DateTime\",\n sent_sequence as \"sent_sequence: Sequence\"\n from message\n join channel on message.channel = channel.id\n join login as sender on message.sender = sender.id\n where channel.id = $1\n and coalesce(message.sent_sequence <= $2, true)\n order by message.sent_sequence\n ",
- "describe": {
- "columns": [
- {
- "name": "channel_id: channel::Id",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "channel_name",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "sender_id: login::Id",
- "ordinal": 2,
- "type_info": "Text"
- },
- {
- "name": "sender_name",
- "ordinal": 3,
- "type_info": "Text"
- },
- {
- "name": "id: Id",
- "ordinal": 4,
- "type_info": "Text"
- },
- {
- "name": "body",
- "ordinal": 5,
- "type_info": "Text"
- },
- {
- "name": "sent_at: DateTime",
- "ordinal": 6,
- "type_info": "Text"
- },
- {
- "name": "sent_sequence: Sequence",
- "ordinal": 7,
- "type_info": "Integer"
- }
- ],
- "parameters": {
- "Right": 2
- },
- "nullable": [
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false
- ]
- },
- "hash": "9606853f2ea9f776f7e4384a2137be57b3a45fe38a675262ceaaebb3d346a9ca"
-}
diff --git a/.sqlx/query-eb9d7146e615044568f9bb47a7317dda3e429faac15e02c900f62f83c25070a7.json b/.sqlx/query-eb9d7146e615044568f9bb47a7317dda3e429faac15e02c900f62f83c25070a7.json
new file mode 100644
index 0000000..1fe8a3e
--- /dev/null
+++ b/.sqlx/query-eb9d7146e615044568f9bb47a7317dda3e429faac15e02c900f62f83c25070a7.json
@@ -0,0 +1,56 @@
+{
+ "db_name": "SQLite",
+ "query": "\n select\n message.channel as \"channel: channel::Id\",\n sender.id as \"sender_id: login::Id\",\n sender.name as \"sender_name\",\n message.id as \"id: Id\",\n message.body,\n sent_at as \"sent_at: DateTime\",\n sent_sequence as \"sent_sequence: Sequence\"\n from message\n join login as sender on message.sender = sender.id\n where message.channel = $1\n and coalesce(message.sent_sequence <= $2, true)\n order by message.sent_sequence\n ",
+ "describe": {
+ "columns": [
+ {
+ "name": "channel: channel::Id",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "sender_id: login::Id",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "sender_name",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "id: Id",
+ "ordinal": 3,
+ "type_info": "Text"
+ },
+ {
+ "name": "body",
+ "ordinal": 4,
+ "type_info": "Text"
+ },
+ {
+ "name": "sent_at: DateTime",
+ "ordinal": 5,
+ "type_info": "Text"
+ },
+ {
+ "name": "sent_sequence: Sequence",
+ "ordinal": 6,
+ "type_info": "Integer"
+ }
+ ],
+ "parameters": {
+ "Right": 2
+ },
+ "nullable": [
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false
+ ]
+ },
+ "hash": "eb9d7146e615044568f9bb47a7317dda3e429faac15e02c900f62f83c25070a7"
+}
diff --git a/docs/api.md b/docs/api.md
index 73bfb38..56d361d 100644
--- a/docs/api.md
+++ b/docs/api.md
@@ -212,10 +212,7 @@ data: {
data: "type": "message",
data: "event": "sent",
data: "at": "2024-09-27T23:19:10.208147Z",
-data: "channel": {
-data: "id": "C9876cyyz",
-data: "name": "example channel 2"
-data: },
+data: "channel": "C9876cyyz",
data: "sender": {
data: "id": "L1234abcd",
data: "name": "example username"
@@ -229,10 +226,6 @@ data: {
data: "type": "message",
data: "event": "deleted",
data: "at": "2024-09-28T02:44:27.077355Z",
-data: "channel": {
-data: "id": "C9876cyyz",
-data: "name": "example channel 2"
-data: },
data: "id": "M1312acab"
data: }
diff --git a/hi-ui/src/apiServer.js b/hi-ui/src/apiServer.js
index 648edf5..e87e2d6 100644
--- a/hi-ui/src/apiServer.js
+++ b/hi-ui/src/apiServer.js
@@ -81,10 +81,10 @@ function onChannelEvent(data) {
function onMessageEvent(data) {
switch (data.event) {
case 'sent':
- messages.update((value) => value.addMessage(data));
+ messages.update((value) => value.addMessage(data.channel, data.at, data.sender, data.body));
break;
case 'deleted':
- messages.update((value) => value.deleteMessage(data.channel.id, data.id));
+ messages.update((value) => value.deleteMessage(data.id));
break;
}
}
diff --git a/hi-ui/src/store/messages.js b/hi-ui/src/store/messages.js
index cefd725..f9e0856 100644
--- a/hi-ui/src/store/messages.js
+++ b/hi-ui/src/store/messages.js
@@ -7,13 +7,8 @@ export class Messages {
return this.channels[channel] || [];
}
- addMessage(message) {
- let {
- channel,
- ...payload
- } = message;
- let channel_id = channel.id;
- this.updateChannel(channel_id, (messages) => [...messages, payload]);
+ addMessage(channel, at, sender, body) {
+ this.updateChannel(channel, (messages) => [...messages, { at, sender, body }]);
return this;
}
@@ -23,8 +18,10 @@ export class Messages {
}
- deleteMessage(channel, message) {
- this.updateChannel(channel, (messages) => messages.filter((msg) => msg.id != message));
+ deleteMessage(message) {
+ for (let channel in this.channels) {
+ this.updateChannel(channel, (messages) => messages.filter((msg) => msg.id != message));
+ }
return this;
}
diff --git a/src/message/event.rs b/src/message/event.rs
index 9f49a32..1cd5847 100644
--- a/src/message/event.rs
+++ b/src/message/event.rs
@@ -1,8 +1,5 @@
use super::{snapshot::Message, Id};
-use crate::{
- channel::Channel,
- event::{Instant, Sequenced},
-};
+use crate::event::{Instant, Sequenced};
#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize)]
#[serde(tag = "event", rename_all = "snake_case")]
@@ -42,7 +39,6 @@ impl From<Sent> for Event {
pub struct Deleted {
#[serde(flatten)]
pub instant: Instant,
- pub channel: Channel,
pub id: Id,
}
diff --git a/src/message/history.rs b/src/message/history.rs
index b5886af..09e69b7 100644
--- a/src/message/history.rs
+++ b/src/message/history.rs
@@ -45,7 +45,6 @@ impl History {
self.deleted.map(|instant| {
Deleted {
instant,
- channel: self.message.channel.clone(),
id: self.message.id.clone(),
}
.into()
diff --git a/src/message/repo.rs b/src/message/repo.rs
index 5b199a7..e098fb2 100644
--- a/src/message/repo.rs
+++ b/src/message/repo.rs
@@ -2,7 +2,7 @@ use sqlx::{sqlite::Sqlite, SqliteConnection, Transaction};
use super::{snapshot::Message, History, Id};
use crate::{
- channel::{self, Channel},
+ channel,
clock::DateTime,
event::{Instant, ResumePoint, Sequence},
login::{self, Login},
@@ -50,10 +50,7 @@ impl<'c> Messages<'c> {
.map(|row| History {
message: Message {
sent: *sent,
- // Use "as created" here as we don't care about providing a perfectly up-to-date
- // representation of the channel. The `name` is informational (and the ID, which is
- // normative, is fixed over time).
- channel: channel.as_created(),
+ channel: channel.id().clone(),
sender: sender.clone(),
id: row.id,
body: row.body,
@@ -75,8 +72,7 @@ impl<'c> Messages<'c> {
let messages = sqlx::query!(
r#"
select
- channel.id as "channel_id: channel::Id",
- channel.name as "channel_name",
+ message.channel as "channel: channel::Id",
sender.id as "sender_id: login::Id",
sender.name as "sender_name",
message.id as "id: Id",
@@ -84,9 +80,8 @@ impl<'c> Messages<'c> {
sent_at as "sent_at: DateTime",
sent_sequence as "sent_sequence: Sequence"
from message
- join channel on message.channel = channel.id
join login as sender on message.sender = sender.id
- where channel.id = $1
+ where message.channel = $1
and coalesce(message.sent_sequence <= $2, true)
order by message.sent_sequence
"#,
@@ -99,10 +94,7 @@ impl<'c> Messages<'c> {
at: row.sent_at,
sequence: row.sent_sequence,
},
- channel: Channel {
- id: row.channel_id,
- name: row.channel_name,
- },
+ channel: row.channel,
sender: Login {
id: row.sender_id,
name: row.sender_name,
@@ -122,8 +114,7 @@ impl<'c> Messages<'c> {
let message = sqlx::query!(
r#"
select
- channel.id as "channel_id: channel::Id",
- channel.name as "channel_name",
+ message.channel as "channel: channel::Id",
sender.id as "sender_id: login::Id",
sender.name as "sender_name",
message.id as "id: Id",
@@ -131,7 +122,6 @@ impl<'c> Messages<'c> {
sent_at as "sent_at: DateTime",
sent_sequence as "sent_sequence: Sequence"
from message
- join channel on message.channel = channel.id
join login as sender on message.sender = sender.id
where message.id = $1
"#,
@@ -143,10 +133,7 @@ impl<'c> Messages<'c> {
at: row.sent_at,
sequence: row.sent_sequence,
},
- channel: Channel {
- id: row.channel_id,
- name: row.channel_name,
- },
+ channel: row.channel,
sender: Login {
id: row.sender_id,
name: row.sender_name,
@@ -207,8 +194,7 @@ impl<'c> Messages<'c> {
let messages = sqlx::query!(
r#"
select
- channel.id as "channel_id: channel::Id",
- channel.name as "channel_name",
+ message.channel as "channel: channel::Id",
sender.id as "sender_id: login::Id",
sender.name as "sender_name",
message.id as "id: Id",
@@ -216,7 +202,6 @@ impl<'c> Messages<'c> {
sent_at as "sent_at: DateTime",
sent_sequence as "sent_sequence: Sequence"
from message
- join channel on message.channel = channel.id
join login as sender on message.sender = sender.id
where coalesce(message.sent_sequence > $1, true)
"#,
@@ -228,10 +213,7 @@ impl<'c> Messages<'c> {
at: row.sent_at,
sequence: row.sent_sequence,
},
- channel: Channel {
- id: row.channel_id,
- name: row.channel_name,
- },
+ channel: row.channel,
sender: Login {
id: row.sender_id,
name: row.sender_name,
diff --git a/src/message/snapshot.rs b/src/message/snapshot.rs
index a8cf734..8c1e62a 100644
--- a/src/message/snapshot.rs
+++ b/src/message/snapshot.rs
@@ -2,13 +2,13 @@ use super::{
event::{Event, Sent},
Id,
};
-use crate::{channel::Channel, event::Instant, login::Login};
+use crate::{channel, event::Instant, login::Login};
#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize)]
pub struct Message {
#[serde(flatten)]
pub sent: Instant,
- pub channel: Channel,
+ pub channel: channel::Id,
pub sender: Login,
pub id: Id,
pub body: String,