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}