traq_bot_http/payloads/
channel.rs

1//! チャンネル関連のイベントペイロード
2//! ## types
3//! - [`ChannelCreatedPayload`](ChannelCreatedPayload)
4//! - [`ChannelTopicChangedPayload`](ChannelTopicChangedPayload)
5
6use serde::{Deserialize, Serialize};
7
8use super::types::{Channel, TimeStamp, User};
9
10/// `CHANNEL_CREATED`ペイロード
11/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/d2bc98f1e0e68f4acc371eb78e6a49a167446761/service/bot/event/payload/ev_channel_created.go#L9-L13)
12/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/channel.md#channel_created)
13///
14/// ## Example
15/// ```
16/// # fn main() -> Result<(), serde_json::Error> {
17/// use traq_bot_http::payloads::ChannelCreatedPayload;
18/// let payload = r##"{
19///     "eventTime": "2019-05-08T13:45:51.506206852Z",
20///     "channel": {
21///         "id": "711afb4c-23e7-46dc-b845-5160f7088ce9",
22///         "name": "yamada",
23///         "path": "#gps/yamada",
24///         "parentId": "ea452867-553b-4808-a14f-a47ee0009ee6",
25///         "creator": {
26///             "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45",
27///             "name": "takashi_trap",
28///             "displayName": "寺田 健二",
29///             "iconId": "2bc06cda-bdb9-4a68-8000-62f907f36a92",
30///             "bot": false
31///         },
32///         "createdAt": "2019-05-08T13:45:51.487718Z",
33///         "updatedAt": "2019-05-08T13:45:51.487718Z"
34///     }
35/// }"##;
36/// let payload: ChannelCreatedPayload = payload.parse()?;
37/// println!("{payload}");
38/// # Ok(())
39/// # }
40/// ```
41#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
42#[serde(rename_all = "camelCase")]
43pub struct ChannelCreatedPayload {
44    #[serde(with = "crate::payloads::serde::timestamp")]
45    pub event_time: TimeStamp,
46    pub channel: Channel,
47}
48
49/// `CHANNEL_TOPIC_CHANGED`ペイロード
50/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/d2bc98f1e0e68f4acc371eb78e6a49a167446761/service/bot/event/payload/ev_channel_topic_changed.go#L9-L15)
51/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/channel.md#channel_topic_changed)
52///
53/// ## Example
54/// ```
55/// # fn main() -> Result<(), serde_json::Error> {
56/// use traq_bot_http::payloads::ChannelTopicChangedPayload;
57/// let payload = r##"{
58///     "eventTime": "2019-05-09T11:32:49.505357701Z",
59///     "channel": {
60///         "id": "9aba50da-f605-4cd0-a428-5e4558cb911e",
61///         "name": "bot",
62///         "path": "#a/bot",
63///         "parentId": "ea452867-553b-4808-a14f-a47ee0009ee6",
64///         "creator": {
65///             "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45",
66///             "name": "takashi_trap",
67///             "displayName": "寺田 健二",
68///             "iconId": "2bc06cda-bdb9-4a68-8000-62f907f36a92",
69///             "bot": false
70///         },
71///         "createdAt": "2019-05-08T13:45:51.487718Z",
72///         "updatedAt": "2019-05-08T13:45:51.487718Z"
73///     },
74///     "topic": "トピック",
75///     "updater": {
76///         "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45",
77///         "name": "takashi_trap",
78///         "displayName": "寺田 健二",
79///         "iconId": "2bc06cda-bdb9-4a68-8000-62f907f36a92",
80///         "bot": false
81///     }
82/// }"##;
83/// let payload: ChannelTopicChangedPayload = payload.parse()?;
84/// println!("{payload}");
85/// # Ok(())
86/// # }
87/// ```
88#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
89#[serde(rename_all = "camelCase")]
90pub struct ChannelTopicChangedPayload {
91    #[serde(with = "crate::payloads::serde::timestamp")]
92    pub event_time: TimeStamp,
93    pub channel: Channel,
94    pub topic: String,
95    pub updater: User,
96}
97
98#[cfg(test)]
99mod tests {
100    use super::*;
101    use crate::test_utils::{takashi_trap, timestamp, uuid};
102
103    use std::fs::read_to_string;
104
105    #[test]
106    fn channel_created_test() {
107        let data = read_to_string("testdata/channel/channel_created.json").unwrap();
108        let payload: ChannelCreatedPayload = data.parse().unwrap();
109        let pretty_payload = serde_json::to_string_pretty(&payload).unwrap();
110        println!("{pretty_payload}");
111        println!("{payload}");
112        assert_eq!(
113            payload,
114            ChannelCreatedPayload {
115                event_time: timestamp("2019-05-08T13:45:51.506206852Z"),
116                channel: Channel {
117                    id: uuid("711afb4c-23e7-46dc-b845-5160f7088ce9"),
118                    name: "yamada".to_string(),
119                    path: "#gps/yamada".to_string(),
120                    parent_id: uuid("ea452867-553b-4808-a14f-a47ee0009ee6"),
121                    creator: takashi_trap(),
122                    created_at: timestamp("2019-05-08T13:45:51.487718Z"),
123                    updated_at: timestamp("2019-05-08T13:45:51.487718Z"),
124                },
125            }
126        );
127    }
128
129    #[test]
130    fn channel_topic_changed_test() {
131        let data = read_to_string("testdata/channel/channel_topic_changed.json").unwrap();
132        let payload: ChannelTopicChangedPayload = data.parse().unwrap();
133        let pretty_payload = serde_json::to_string_pretty(&payload).unwrap();
134        println!("{pretty_payload}");
135        println!("{payload}");
136        assert_eq!(
137            payload,
138            ChannelTopicChangedPayload {
139                event_time: timestamp("2019-05-09T11:32:49.505357701Z"),
140                channel: Channel {
141                    id: uuid("9aba50da-f605-4cd0-a428-5e4558cb911e"),
142                    name: "bot".to_string(),
143                    path: "#a/bot".to_string(),
144                    parent_id: uuid("ea452867-553b-4808-a14f-a47ee0009ee6"),
145                    creator: takashi_trap(),
146                    created_at: timestamp("2019-04-02T06:31:16.229419Z"),
147                    updated_at: timestamp("2019-05-09T11:32:49.475127Z"),
148                },
149                topic: "トピック".to_string(),
150                updater: takashi_trap(),
151            }
152        );
153    }
154}