use bitflags::bitflags; use chrono::{DateTime, Utc}; use serde::Serialize; #[derive(Debug, Serialize)] pub struct Message { pub message_id: uuid::Uuid, pub created_at: DateTime, pub scheduled_at: Option>, pub status: MessageStatus, pub title: String, pub content: String, pub channel: Channel, pub member_groups: Option, pub member_roles: Option, pub thumbnail_url: Option, } #[derive(Debug, Clone, Copy, sqlx::Type, Serialize)] #[sqlx(type_name = "message_status", rename_all = "lowercase")] pub enum MessageStatus { Pending, Sent, Canceled, } bitflags! { #[derive(Clone, Copy, Debug, Serialize)] pub struct Channel: u16 { const ALGEMEEN = 1 << 0; const BELANGRIJK = 1 << 1; const WEDSTRIJDEN = 1 << 2; } } impl From for Channel { fn from(value: i64) -> Self { Self::from_bits(value as u16).unwrap_or(Channel::empty()) } } pub struct MessageCreate { pub scheduled_at: Option>, pub title: String, pub content: String, pub channel: Channel, pub member_groups: Option, pub member_roles: Option, pub thumbnail_url: Option, } impl Message { pub fn new(message_create: MessageCreate) -> Self { let message_id = uuid::Uuid::new_v4(); let created_at = Utc::now(); Self { message_id, created_at, scheduled_at: message_create.scheduled_at, title: message_create.title, content: message_create.content, channel: message_create.channel, thumbnail_url: message_create.thumbnail_url, member_groups: message_create.member_groups, member_roles: message_create.member_roles, status: MessageStatus::Pending, } } } use crate::database::model::Message as DbMessage; use super::member::{Groups, Roles}; impl From for Message { fn from(value: DbMessage) -> Self { Self { message_id: value.message_id, created_at: value.created_at, scheduled_at: value.scheduled_at, status: value.status, title: value.title, content: value.content, channel: value.channel, member_groups: value.member_groups.into(), member_roles: value.member_roles.into(), thumbnail_url: value.thumbnail_url, } } } impl From for DbMessage { fn from(value: Message) -> Self { Self { message_id: value.message_id, created_at: value.created_at, scheduled_at: value.scheduled_at, status: value.status, title: value.title, content: value.content, channel: value.channel, member_groups: value.member_groups.into(), member_roles: value.member_roles.into(), thumbnail_url: value.thumbnail_url, } } }