traq_bot_http/payloads/
user_group.rs

1//! ユーザーグループ関連のイベントペイロード
2//! ## types
3//! - [`UserGroupCreatedPayload`](UserGroupCreatedPayload)
4//! - [`UserGroupUpdatedPayload`](UserGroupUpdatedPayload)
5//! - [`UserGroupDeletedPayload`](UserGroupDeletedPayload)
6//! - [`UserGroupMemberAddedPayload`](UserGroupMemberAddedPayload)
7//! - [`UserGroupMemberUpdatedPayload`](UserGroupMemberUpdatedPayload)
8//! - [`UserGroupMemberRemovedPayload`](UserGroupMemberRemovedPayload)
9//! - [`UserGroupAdminAddedPayload`](UserGroupAdminAddedPayload)
10//! - [`UserGroupAdminRemovedPayload`](UserGroupAdminRemovedPayload)
11
12use serde::{Deserialize, Serialize};
13
14use super::types::{GroupMember, TimeStamp, UserGroup, Uuid};
15
16/// `USER_GROUP_CREATED`ペイロード
17/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/a1aaf12d089a9033461d0f1fcabb69a92873a3b1/service/bot/event/payload/ev_user_group_created.go#L9-L13)
18/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/user-group.md#user_group_created)
19///
20/// ## Example
21/// ```
22/// # fn main() -> Result<(), serde_json::Error> {
23/// use traq_bot_http::payloads::UserGroupCreatedPayload;
24/// let payload = r#"{
25///     "eventTime": "2023-08-25T04:04:32.912312Z",
26///     "group": {
27///         "id": "f265bde2-04cc-4856-9008-3db1d953a539",
28///         "name": "fugafuga",
29///         "description": "FUGA_FUGA",
30///         "type": "ふがふが",
31///         "icon": "81f6da0d-eaab-4c42-84ac-74f5111e1eaa",
32///         "admins": [
33///             {
34///                 "groupId": "f265bde2-04cc-4856-9008-3db1d953a539",
35///                 "userId": "8e6a088f-9274-42c0-bb20-cee7913d144b"
36///             }
37///         ],
38///         "members": [
39///             {
40///                 "groupId": "f265bde2-04cc-4856-9008-3db1d953a539",
41///                 "userId": "8e6a088f-9274-42c0-bb20-cee7913d144b",
42///                 "role": ""
43///             }
44///         ],
45///         "createdAt": "2023-08-25T04:04:32.912312Z",
46///         "updatedAt": "2023-08-25T04:04:32.912312Z"
47///     }
48/// }"#;
49/// let payload: UserGroupCreatedPayload = payload.parse()?;
50/// println!("{payload}");
51/// # Ok(())
52/// # }
53/// ```
54#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
55#[serde(rename_all = "camelCase")]
56pub struct UserGroupCreatedPayload {
57    #[serde(with = "crate::payloads::serde::timestamp")]
58    pub event_time: TimeStamp,
59    pub group: UserGroup,
60}
61
62/// `USER_GROUP_UPDATED`ペイロード
63/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/a1aaf12d089a9033461d0f1fcabb69a92873a3b1/service/bot/event/payload/ev_user_group_updated.go#L10-L13)
64/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/user-group.md#user_group_updated)
65///
66/// ## Example
67/// ```
68/// # fn main() -> Result<(), serde_json::Error> {
69/// use traq_bot_http::payloads::UserGroupUpdatedPayload;
70/// let payload = r#"{
71///     "eventTime": "2023-08-25T04:04:32.962264Z",
72///     "groupId": "f265bde2-04cc-4856-9008-3db1d953a539"
73/// }"#;
74/// let payload: UserGroupUpdatedPayload = payload.parse()?;
75/// println!("{payload}");
76/// # Ok(())
77/// # }
78/// ```
79#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
80#[serde(rename_all = "camelCase")]
81pub struct UserGroupUpdatedPayload {
82    #[serde(with = "crate::payloads::serde::timestamp")]
83    pub event_time: TimeStamp,
84    pub group_id: Uuid,
85}
86
87impl From<UserGroupDeletedPayload> for UserGroupUpdatedPayload {
88    fn from(payload: UserGroupDeletedPayload) -> Self {
89        Self {
90            event_time: payload.event_time,
91            group_id: payload.group_id,
92        }
93    }
94}
95
96/// `USER_GROUP_DELETED`ペイロード
97/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/a1aaf12d089a9033461d0f1fcabb69a92873a3b1/service/bot/event/payload/ev_user_group_deleted.go#L11-L14)
98/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/user-group.md#user_group_deleted)
99///
100/// ## Example
101/// ```
102/// # fn main() -> Result<(), serde_json::Error> {
103/// use traq_bot_http::payloads::UserGroupDeletedPayload;
104/// let payload = r#"{
105///     "eventTime": "2023-08-25T06:40:35.971142Z",
106///     "groupId": "f265bde2-04cc-4856-9008-3db1d953a539"
107/// }"#;
108/// let payload: UserGroupDeletedPayload = payload.parse()?;
109/// println!("{payload}");
110/// # Ok(())
111/// # }
112/// ```
113#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
114#[serde(rename_all = "camelCase")]
115pub struct UserGroupDeletedPayload {
116    #[serde(with = "crate::payloads::serde::timestamp")]
117    pub event_time: TimeStamp,
118    pub group_id: Uuid,
119}
120
121impl From<UserGroupUpdatedPayload> for UserGroupDeletedPayload {
122    fn from(payload: UserGroupUpdatedPayload) -> Self {
123        Self {
124            event_time: payload.event_time,
125            group_id: payload.group_id,
126        }
127    }
128}
129
130/// `USER_GROUP_MEMBER_ADDED`ペイロード
131/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/a1aaf12d089a9033461d0f1fcabb69a92873a3b1/service/bot/event/payload/ev_user_group_member_added.go#L9-L12)
132/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/user-group.md#user_group_member_added)
133///
134/// ## Example
135/// ```
136/// # fn main() -> Result<(), serde_json::Error> {
137/// use traq_bot_http::payloads::UserGroupMemberAddedPayload;
138/// let payload = r#"{
139///     "eventTime": "2023-08-25T04:04:32.962264Z",
140///     "groupMember": {
141///         "groupId": "f265bde2-04cc-4856-9008-3db1d953a539",
142///         "userId": "8e6a088f-9274-42c0-bb20-cee7913d144b"
143///     }
144/// }"#;
145/// let payload: UserGroupMemberAddedPayload = payload.parse()?;
146/// println!("{payload}");
147/// # Ok(())
148/// # }
149/// ```
150#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
151#[serde(rename_all = "camelCase")]
152pub struct UserGroupMemberAddedPayload {
153    #[serde(with = "crate::payloads::serde::timestamp")]
154    pub event_time: TimeStamp,
155    pub group_member: GroupMember,
156}
157
158impl From<UserGroupMemberUpdatedPayload> for UserGroupMemberAddedPayload {
159    fn from(payload: UserGroupMemberUpdatedPayload) -> Self {
160        Self {
161            event_time: payload.event_time,
162            group_member: payload.group_member,
163        }
164    }
165}
166
167impl From<UserGroupMemberRemovedPayload> for UserGroupMemberAddedPayload {
168    fn from(payload: UserGroupMemberRemovedPayload) -> Self {
169        Self {
170            event_time: payload.event_time,
171            group_member: payload.group_member,
172        }
173    }
174}
175
176impl From<UserGroupAdminAddedPayload> for UserGroupMemberAddedPayload {
177    fn from(payload: UserGroupAdminAddedPayload) -> Self {
178        Self {
179            event_time: payload.event_time,
180            group_member: payload.group_member,
181        }
182    }
183}
184
185/// `USER_GROUP_MEMBER_UPDATED`ペイロード
186/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/a1aaf12d089a9033461d0f1fcabb69a92873a3b1/service/bot/event/payload/ev_user_group_member_updated.go#L9-L12)
187/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/user-group.md#user_group_member_updated)
188///
189/// ## Example
190/// ```
191/// # fn main() -> Result<(), serde_json::Error> {
192/// use traq_bot_http::payloads::UserGroupMemberUpdatedPayload;
193/// let payload = r#"{
194///     "eventTime": "2023-08-25T04:04:32.962264Z",
195///     "groupMember": {
196///         "groupId": "f265bde2-04cc-4856-9008-3db1d953a539",
197///         "userId": "8e6a088f-9274-42c0-bb20-cee7913d144b"
198///     }
199/// }"#;
200/// let payload: UserGroupMemberUpdatedPayload = payload.parse()?;
201/// println!("{payload}");
202/// # Ok(())
203/// # }
204/// ```
205#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
206#[serde(rename_all = "camelCase")]
207pub struct UserGroupMemberUpdatedPayload {
208    #[serde(with = "crate::payloads::serde::timestamp")]
209    pub event_time: TimeStamp,
210    pub group_member: GroupMember,
211}
212
213impl From<UserGroupMemberAddedPayload> for UserGroupMemberUpdatedPayload {
214    fn from(payload: UserGroupMemberAddedPayload) -> Self {
215        Self {
216            event_time: payload.event_time,
217            group_member: payload.group_member,
218        }
219    }
220}
221
222impl From<UserGroupMemberRemovedPayload> for UserGroupMemberUpdatedPayload {
223    fn from(payload: UserGroupMemberRemovedPayload) -> Self {
224        Self {
225            event_time: payload.event_time,
226            group_member: payload.group_member,
227        }
228    }
229}
230
231/// `USER_GROUP_MEMBER_REMOVED`ペイロード
232/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/a1aaf12d089a9033461d0f1fcabb69a92873a3b1/service/bot/event/payload/ev_user_group_member_removed.go#L9-L12)
233/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/user-group.md#user_group_member_removed)
234///
235/// ## Example
236/// ```
237/// # fn main() -> Result<(), serde_json::Error> {
238/// use traq_bot_http::payloads::UserGroupMemberRemovedPayload;
239/// let payload = r#"{
240///     "eventTime": "2023-08-25T04:04:32.962264Z",
241///     "groupMember": {
242///         "groupId": "f265bde2-04cc-4856-9008-3db1d953a539",
243///         "userId": "8e6a088f-9274-42c0-bb20-cee7913d144b"
244///     }
245/// }"#;
246/// let payload: UserGroupMemberRemovedPayload = payload.parse()?;
247/// println!("{payload}");
248/// # Ok(())
249/// # }
250/// ```
251#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
252#[serde(rename_all = "camelCase")]
253pub struct UserGroupMemberRemovedPayload {
254    #[serde(with = "crate::payloads::serde::timestamp")]
255    pub event_time: TimeStamp,
256    pub group_member: GroupMember,
257}
258
259impl From<UserGroupMemberAddedPayload> for UserGroupMemberRemovedPayload {
260    fn from(payload: UserGroupMemberAddedPayload) -> Self {
261        Self {
262            event_time: payload.event_time,
263            group_member: payload.group_member,
264        }
265    }
266}
267
268impl From<UserGroupMemberUpdatedPayload> for UserGroupMemberRemovedPayload {
269    fn from(payload: UserGroupMemberUpdatedPayload) -> Self {
270        Self {
271            event_time: payload.event_time,
272            group_member: payload.group_member,
273        }
274    }
275}
276
277impl From<UserGroupAdminRemovedPayload> for UserGroupMemberRemovedPayload {
278    fn from(payload: UserGroupAdminRemovedPayload) -> Self {
279        Self {
280            event_time: payload.event_time,
281            group_member: payload.group_member,
282        }
283    }
284}
285
286/// `USER_GROUP_ADMIN_ADDED`ペイロード
287/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/a1aaf12d089a9033461d0f1fcabb69a92873a3b1/service/bot/event/payload/ev_user_group_admin_added.go#L9-L12)
288/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/user-group.md#user_group_admin_added)
289///
290/// ## Example
291/// ```
292/// # fn main() -> Result<(), serde_json::Error> {
293/// use traq_bot_http::payloads::UserGroupAdminAddedPayload;
294/// let payload = r#"{
295///     "eventTime": "2023-08-25T04:04:32.962264Z",
296///     "groupMember": {
297///         "groupId": "f265bde2-04cc-4856-9008-3db1d953a539",
298///         "userId": "8e6a088f-9274-42c0-bb20-cee7913d144b"
299///     }
300/// }"#;
301/// let payload: UserGroupAdminAddedPayload = payload.parse()?;
302/// println!("{payload}");
303/// # Ok(())
304/// # }
305/// ```
306#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
307#[serde(rename_all = "camelCase")]
308pub struct UserGroupAdminAddedPayload {
309    #[serde(with = "crate::payloads::serde::timestamp")]
310    pub event_time: TimeStamp,
311    pub group_member: GroupMember,
312}
313
314impl From<UserGroupAdminRemovedPayload> for UserGroupAdminAddedPayload {
315    fn from(payload: UserGroupAdminRemovedPayload) -> Self {
316        Self {
317            event_time: payload.event_time,
318            group_member: payload.group_member,
319        }
320    }
321}
322
323impl From<UserGroupMemberAddedPayload> for UserGroupAdminAddedPayload {
324    fn from(payload: UserGroupMemberAddedPayload) -> Self {
325        Self {
326            event_time: payload.event_time,
327            group_member: payload.group_member,
328        }
329    }
330}
331
332/// `USER_GROUP_ADMIN_REMOVED`ペイロード
333/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/a1aaf12d089a9033461d0f1fcabb69a92873a3b1/service/bot/event/payload/ev_user_group_admin_removed.go#L9-L12)
334/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/user-group.md#user_group_admin_removed)
335///
336/// ## Example
337/// ```
338/// # fn main() -> Result<(), serde_json::Error> {
339/// use traq_bot_http::payloads::UserGroupAdminRemovedPayload;
340/// let payload = r#"{
341///     "eventTime": "2023-08-25T04:04:32.962264Z",
342///     "groupMember": {
343///         "groupId": "f265bde2-04cc-4856-9008-3db1d953a539",
344///         "userId": "8e6a088f-9274-42c0-bb20-cee7913d144b"
345///     }
346/// }"#;
347/// let payload: UserGroupAdminRemovedPayload = payload.parse()?;
348/// println!("{payload}");
349/// # Ok(())
350/// # }
351/// ```
352#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
353#[serde(rename_all = "camelCase")]
354pub struct UserGroupAdminRemovedPayload {
355    #[serde(with = "crate::payloads::serde::timestamp")]
356    pub event_time: TimeStamp,
357    pub group_member: GroupMember,
358}
359
360impl From<UserGroupAdminAddedPayload> for UserGroupAdminRemovedPayload {
361    fn from(payload: UserGroupAdminAddedPayload) -> Self {
362        Self {
363            event_time: payload.event_time,
364            group_member: payload.group_member,
365        }
366    }
367}
368
369impl From<UserGroupMemberRemovedPayload> for UserGroupAdminRemovedPayload {
370    fn from(payload: UserGroupMemberRemovedPayload) -> Self {
371        Self {
372            event_time: payload.event_time,
373            group_member: payload.group_member,
374        }
375    }
376}
377
378#[cfg(test)]
379mod tests {
380    use super::*;
381    use crate::payloads::types::{UserGroupAdmin, UserGroupMember};
382    use crate::test_utils::{timestamp, uuid};
383
384    use std::{fs::read_to_string, vec};
385
386    #[test]
387    fn user_group_created_test() {
388        let data = read_to_string("testdata/user-group/user_group_created.json").unwrap();
389        let payload: UserGroupCreatedPayload = data.parse().unwrap();
390        assert_eq!(
391            payload,
392            UserGroupCreatedPayload {
393                event_time: timestamp("2023-08-25T04:04:32.912312Z"),
394                group: UserGroup {
395                    id: uuid("f265bde2-04cc-4856-9008-3db1d953a539"),
396                    name: "fugafuga".to_string(),
397                    description: "FUGA_FUGA".to_string(),
398                    r#type: "ふがふが".to_string(),
399                    icon: uuid("81f6da0d-eaab-4c42-84ac-74f5111e1eaa"),
400                    admins: vec![UserGroupAdmin {
401                        group_id: uuid("f265bde2-04cc-4856-9008-3db1d953a539"),
402                        user_id: uuid("8e6a088f-9274-42c0-bb20-cee7913d144b"),
403                    }],
404                    members: vec![UserGroupMember {
405                        group_id: uuid("f265bde2-04cc-4856-9008-3db1d953a539"),
406                        user_id: uuid("8e6a088f-9274-42c0-bb20-cee7913d144b"),
407                        role: String::new(),
408                    }],
409                    created_at: timestamp("2023-08-25T04:04:32.912312Z"),
410                    updated_at: timestamp("2023-08-25T04:04:32.912312Z")
411                }
412            }
413        );
414    }
415
416    #[test]
417    fn user_group_updated_test() {
418        let data = read_to_string("testdata/user-group/user_group_updated.json").unwrap();
419        let payload: UserGroupUpdatedPayload = data.parse().unwrap();
420        assert_eq!(
421            payload,
422            UserGroupUpdatedPayload {
423                event_time: timestamp("2023-08-25T04:04:32.962264Z"),
424                group_id: uuid("f265bde2-04cc-4856-9008-3db1d953a539"),
425            }
426        );
427    }
428
429    #[test]
430    fn user_group_deleted_test() {
431        let data = read_to_string("testdata/user-group/user_group_deleted.json").unwrap();
432        let payload: UserGroupDeletedPayload = data.parse().unwrap();
433        assert_eq!(
434            payload,
435            UserGroupDeletedPayload {
436                event_time: timestamp("2023-08-25T06:40:35.971142Z"),
437                group_id: uuid("f265bde2-04cc-4856-9008-3db1d953a539"),
438            }
439        );
440    }
441
442    #[test]
443    fn user_group_member_added_test() {
444        let data = read_to_string("testdata/user-group/user_group_member_added.json").unwrap();
445        let payload: UserGroupMemberAddedPayload = data.parse().unwrap();
446        assert_eq!(
447            payload,
448            UserGroupMemberAddedPayload {
449                event_time: timestamp("2023-08-25T04:04:32.962264Z"),
450                group_member: GroupMember {
451                    group_id: uuid("f265bde2-04cc-4856-9008-3db1d953a539"),
452                    user_id: uuid("8e6a088f-9274-42c0-bb20-cee7913d144b"),
453                },
454            }
455        );
456    }
457
458    #[test]
459    fn user_group_member_updated_test() {
460        let data = read_to_string("testdata/user-group/user_group_member_updated.json").unwrap();
461        let payload: UserGroupMemberUpdatedPayload = data.parse().unwrap();
462        assert_eq!(
463            payload,
464            UserGroupMemberUpdatedPayload {
465                event_time: timestamp("2023-08-25T04:04:32.962264Z"),
466                group_member: GroupMember {
467                    group_id: uuid("f265bde2-04cc-4856-9008-3db1d953a539"),
468                    user_id: uuid("8e6a088f-9274-42c0-bb20-cee7913d144b"),
469                },
470            }
471        );
472    }
473
474    #[test]
475    fn user_group_member_removed_test() {
476        let data = read_to_string("testdata/user-group/user_group_member_removed.json").unwrap();
477        let payload: UserGroupMemberRemovedPayload = data.parse().unwrap();
478        assert_eq!(
479            payload,
480            UserGroupMemberRemovedPayload {
481                event_time: timestamp("2023-08-25T04:04:32.962264Z"),
482                group_member: GroupMember {
483                    group_id: uuid("f265bde2-04cc-4856-9008-3db1d953a539"),
484                    user_id: uuid("8e6a088f-9274-42c0-bb20-cee7913d144b"),
485                },
486            }
487        );
488    }
489
490    #[test]
491    fn user_group_admin_added_test() {
492        let data = read_to_string("testdata/user-group/user_group_admin_added.json").unwrap();
493        let payload: UserGroupAdminAddedPayload = data.parse().unwrap();
494        assert_eq!(
495            payload,
496            UserGroupAdminAddedPayload {
497                event_time: timestamp("2023-08-25T04:04:32.962264Z"),
498                group_member: GroupMember {
499                    group_id: uuid("f265bde2-04cc-4856-9008-3db1d953a539"),
500                    user_id: uuid("8e6a088f-9274-42c0-bb20-cee7913d144b"),
501                },
502            }
503        );
504    }
505
506    #[test]
507    fn user_group_admin_removed_test() {
508        let data = read_to_string("testdata/user-group/user_group_admin_removed.json").unwrap();
509        let payload: UserGroupAdminRemovedPayload = data.parse().unwrap();
510        assert_eq!(
511            payload,
512            UserGroupAdminRemovedPayload {
513                event_time: timestamp("2023-08-25T04:04:32.962264Z"),
514                group_member: GroupMember {
515                    group_id: uuid("f265bde2-04cc-4856-9008-3db1d953a539"),
516                    user_id: uuid("8e6a088f-9274-42c0-bb20-cee7913d144b"),
517                },
518            }
519        );
520    }
521}