diff options
| -rw-r--r-- | docs/api.md | 22 | ||||
| -rw-r--r-- | hi-ui/src/apiServer.js | 10 | ||||
| -rw-r--r-- | hi-ui/src/lib/Message.svelte | 4 | ||||
| -rw-r--r-- | hi-ui/src/store/channels.js | 4 | ||||
| -rw-r--r-- | src/boot/mod.rs | 8 | ||||
| -rw-r--r-- | src/channel/event.rs | 3 | ||||
| -rw-r--r-- | src/channel/history.rs | 2 | ||||
| -rw-r--r-- | src/channel/snapshot.rs | 2 | ||||
| -rw-r--r-- | src/message/event.rs | 2 | ||||
| -rw-r--r-- | src/message/history.rs | 2 | ||||
| -rw-r--r-- | src/message/snapshot.rs | 35 |
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:#?}"), } } |
