109 lines
3.0 KiB
Rust

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<Utc>,
pub scheduled_at: Option<DateTime<Utc>>,
pub status: MessageStatus,
pub title: String,
pub content: String,
pub channel: Channel,
pub member_groups: Option<Groups>,
pub member_roles: Option<Roles>,
pub thumbnail_url: Option<String>,
}
#[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<i64> for Channel {
fn from(value: i64) -> Self {
Self::from_bits(value as u16).unwrap_or(Channel::empty())
}
}
pub struct MessageCreate {
pub scheduled_at: Option<DateTime<Utc>>,
pub title: String,
pub content: String,
pub channel: Channel,
pub member_groups: Option<Groups>,
pub member_roles: Option<Roles>,
pub thumbnail_url: Option<String>,
}
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<DbMessage> 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<Message> 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,
}
}
}