summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOwen Jacobson <owen@grimoire.ca>2024-10-08 22:10:04 -0400
committerOwen Jacobson <owen@grimoire.ca>2024-10-09 11:45:31 -0400
commit653e2de752a97e377fc9963ba60d9408e7089528 (patch)
treea707919c0c0cb3c84ec3ea624ae8cd87059f28ac
parentdd62b823e01934a0f841256fdb17b551091896bf (diff)
Flatten nested `channel` and `message` structs in events and API responses.
This structure didn't accomplish anything and made certain refactorings harder.
-rw-r--r--docs/api.md22
-rw-r--r--hi-ui/src/apiServer.js10
-rw-r--r--hi-ui/src/lib/Message.svelte4
-rw-r--r--hi-ui/src/store/channels.js4
-rw-r--r--src/boot/mod.rs8
-rw-r--r--src/channel/event.rs3
-rw-r--r--src/channel/history.rs2
-rw-r--r--src/channel/snapshot.rs2
-rw-r--r--src/message/event.rs2
-rw-r--r--src/message/history.rs2
-rw-r--r--src/message/snapshot.rs35
11 files changed, 28 insertions, 66 deletions
diff --git a/docs/api.md b/docs/api.md
index 91485f3..13e71c7 100644
--- a/docs/api.md
+++ b/docs/api.md
@@ -36,10 +36,8 @@ Returns information needed to boot the client. Also the recommended way to check
"id": "L1234abcd",
"name": "example username"
},
- "message": {
- "id": "M1312acab",
- "body": "beep"
- }
+ "id": "M1312acab",
+ "body": "beep"
}
]
}
@@ -204,10 +202,8 @@ id: 1233
data: {
data: "type": "created",
data: "at": "2024-09-27T23:18:10.208147Z",
-data: "channel": {
-data: "id": "C9876cyyz",
-data: "name": "example channel 2"
-data: }
+data: "id": "C9876cyyz",
+data: "name": "example channel 2"
data: }
id: 1234
@@ -222,10 +218,8 @@ data: "sender": {
data: "id": "L1234abcd",
data: "name": "example username"
data: },
-data: "message": {
-data: "id": "M1312acab",
-data: "body": "beep"
-data: }
+data: "id": "M1312acab",
+data: "body": "beep"
data: }
id: 1235
@@ -236,14 +230,14 @@ data: "id": "C9876cyyz",
data: "name": "example channel 2"
data: },
data: "type": "message_deleted",
-data: "message": "M1312acab"
+data: "id": "M1312acab"
data: }
id: 1236
data: {
data: "at": "2024-09-28T03:40:25.384318Z",
data: "type": "deleted",
-data: "channel": "C9876cyyz"
+data: "id": "C9876cyyz"
data: }
```
diff --git a/hi-ui/src/apiServer.js b/hi-ui/src/apiServer.js
index f4a89a4..ec94e82 100644
--- a/hi-ui/src/apiServer.js
+++ b/hi-ui/src/apiServer.js
@@ -56,18 +56,18 @@ export function subscribeToEvents(resume_point) {
switch (data.type) {
case 'created':
- channelsList.update((value) => value.addChannel(data.channel))
+ channelsList.update((value) => value.addChannel(data.id, data.name))
break;
case 'message':
messages.update((value) => value.addMessage(data));
break;
case 'message_deleted':
- messages.update((value) => value.deleteMessage(data.channel.id, data.message));
+ messages.update((value) => value.deleteMessage(data.channel.id, data.id));
break;
case 'deleted':
- activeChannel.update((value) => value.deleteChannel(data.channel));
- channelsList.update((value) => value.deleteChannel(data.channel));
- messages.update((value) => value.deleteChannel(data.channel));
+ activeChannel.update((value) => value.deleteChannel(data.id));
+ channelsList.update((value) => value.deleteChannel(data.id));
+ messages.update((value) => value.deleteChannel(data.id));
break;
default:
break;
diff --git a/hi-ui/src/lib/Message.svelte b/hi-ui/src/lib/Message.svelte
index efc6641..7c60ac0 100644
--- a/hi-ui/src/lib/Message.svelte
+++ b/hi-ui/src/lib/Message.svelte
@@ -5,7 +5,7 @@
export let at; // XXX: Omitted for now.
export let sender;
- export let message;
+ export let body;
let timestamp = new Date(at).toTimeString();
</script>
@@ -17,7 +17,7 @@
</span>
<span class="timestamp chip variant-soft absolute top-0 right-0">{at}</span>
<section class="p-4">
- <SvelteMarkdown source={message.body} />
+ <SvelteMarkdown source={body} />
</section>
</div>
diff --git a/hi-ui/src/store/channels.js b/hi-ui/src/store/channels.js
index 20702cc..bb6c86c 100644
--- a/hi-ui/src/store/channels.js
+++ b/hi-ui/src/store/channels.js
@@ -9,8 +9,8 @@ export class Channels {
return this;
}
- addChannel(channel) {
- this.channels = [...this.channels, channel];
+ addChannel(id, name) {
+ this.channels = [...this.channels, { id, name }];
this.sort();
return this;
}
diff --git a/src/boot/mod.rs b/src/boot/mod.rs
index bd0da0a..a68acac 100644
--- a/src/boot/mod.rs
+++ b/src/boot/mod.rs
@@ -44,9 +44,8 @@ pub struct Message {
#[serde(flatten)]
pub sent: Instant,
pub sender: Login,
- // Named this way for serialization reasons
- #[allow(clippy::struct_field_names)]
- pub message: Body,
+ pub id: message::Id,
+ pub body: String,
}
impl From<message::Message> for Message {
@@ -62,7 +61,8 @@ impl From<message::Message> for Message {
Self {
sent,
sender,
- message: Body { id, body },
+ id,
+ body,
}
}
}
diff --git a/src/channel/event.rs b/src/channel/event.rs
index 9c54174..9f2e263 100644
--- a/src/channel/event.rs
+++ b/src/channel/event.rs
@@ -27,6 +27,7 @@ pub enum Kind {
#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize)]
pub struct Created {
+ #[serde(flatten)]
pub channel: Channel,
}
@@ -38,7 +39,7 @@ impl From<Created> for Kind {
#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize)]
pub struct Deleted {
- pub channel: channel::Id,
+ pub id: channel::Id,
}
impl From<Deleted> for Kind {
diff --git a/src/channel/history.rs b/src/channel/history.rs
index 383fb7b..0499927 100644
--- a/src/channel/history.rs
+++ b/src/channel/history.rs
@@ -53,7 +53,7 @@ impl History {
self.deleted.map(|instant| Event {
instant,
kind: Deleted {
- channel: self.channel.id.clone(),
+ id: self.channel.id.clone(),
}
.into(),
})
diff --git a/src/channel/snapshot.rs b/src/channel/snapshot.rs
index 6462f25..afef2fb 100644
--- a/src/channel/snapshot.rs
+++ b/src/channel/snapshot.rs
@@ -13,7 +13,7 @@ impl Channel {
fn apply(state: Option<Self>, event: Event) -> Option<Self> {
match (state, event.kind) {
(None, Kind::Created(event)) => Some(event.into()),
- (Some(channel), Kind::Deleted(event)) if channel.id == event.channel => None,
+ (Some(channel), Kind::Deleted(event)) if channel.id == event.id => None,
(state, event) => panic!("invalid channel event {event:#?} for state {state:#?}"),
}
}
diff --git a/src/message/event.rs b/src/message/event.rs
index 66db9b0..712ecc1 100644
--- a/src/message/event.rs
+++ b/src/message/event.rs
@@ -55,7 +55,7 @@ pub struct Deleted {
#[serde(flatten)]
pub instant: Instant,
pub channel: Channel,
- pub message: Id,
+ pub id: Id,
}
impl Sequenced for Deleted {
diff --git a/src/message/history.rs b/src/message/history.rs
index f267f4c..3c3f77a 100644
--- a/src/message/history.rs
+++ b/src/message/history.rs
@@ -48,7 +48,7 @@ impl History {
kind: Deleted {
instant,
channel: self.message.channel.clone(),
- message: self.message.id.clone(),
+ id: self.message.id.clone(),
}
.into(),
})
diff --git a/src/message/snapshot.rs b/src/message/snapshot.rs
index 522c1aa..a06fbc4 100644
--- a/src/message/snapshot.rs
+++ b/src/message/snapshot.rs
@@ -5,7 +5,6 @@ use super::{
use crate::{channel::Channel, event::Instant, login::Login};
#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize)]
-#[serde(into = "self::serialize::Message")]
pub struct Message {
#[serde(skip)]
pub sent: Instant,
@@ -15,43 +14,11 @@ pub struct Message {
pub body: String,
}
-mod serialize {
- use crate::{channel::Channel, login::Login, message::Id};
-
- #[derive(serde::Serialize)]
- pub struct Message {
- channel: Channel,
- sender: Login,
- #[allow(clippy::struct_field_names)]
- // Deliberately redundant with the module path; this produces a specific serialization.
- message: MessageData,
- }
-
- #[derive(serde::Serialize)]
- pub struct MessageData {
- id: Id,
- body: String,
- }
-
- impl From<super::Message> for Message {
- fn from(message: super::Message) -> Self {
- Self {
- channel: message.channel,
- sender: message.sender,
- message: MessageData {
- id: message.id,
- body: message.body,
- },
- }
- }
- }
-}
-
impl Message {
fn apply(state: Option<Self>, event: Event) -> Option<Self> {
match (state, event.kind) {
(None, Kind::Sent(event)) => Some(event.into()),
- (Some(message), Kind::Deleted(event)) if message.id == event.message => None,
+ (Some(message), Kind::Deleted(event)) if message.id == event.id => None,
(state, event) => panic!("invalid message event {event:#?} for state {state:#?}"),
}
}