From ea0a5a3ee25a59ab0a10f21e7ebb45a964ddeb97 Mon Sep 17 00:00:00 2001 From: xeovalyte Date: Mon, 24 Feb 2025 16:19:35 +0100 Subject: [PATCH] Added groups and roles field to messages --- server/migrations/006_alter_messages.sql | 3 ++ server/src/database/model/message.rs | 13 ++++++-- server/src/model/member.rs | 38 ++++++++++++++++++++++++ server/src/model/message.rs | 12 ++++++++ server/src/routes/message.rs | 24 ++++++++++++++- 5 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 server/migrations/006_alter_messages.sql diff --git a/server/migrations/006_alter_messages.sql b/server/migrations/006_alter_messages.sql new file mode 100644 index 0000000..b431b49 --- /dev/null +++ b/server/migrations/006_alter_messages.sql @@ -0,0 +1,3 @@ +ALTER TABLE messages + ADD COLUMN member_groups bigint, + ADD COLUMN member_roles bigint; diff --git a/server/src/database/model/message.rs b/server/src/database/model/message.rs index 5bc6f76..52bb2bd 100644 --- a/server/src/database/model/message.rs +++ b/server/src/database/model/message.rs @@ -1,7 +1,10 @@ use chrono::{DateTime, Utc}; use sqlx::{PgPool, Postgres, QueryBuilder}; -use crate::model::message::{Channel, MessageStatus}; +use crate::model::{ + member::{Groups, Roles}, + message::{Channel, MessageStatus}, +}; #[derive(Debug)] pub struct Message { @@ -12,6 +15,8 @@ pub struct Message { pub title: String, pub content: String, pub channel: Channel, + pub member_groups: Groups, + pub member_roles: Roles, pub thumbnail_url: Option, } @@ -28,6 +33,7 @@ impl Message { status, title, content, channel, + member_groups, member_roles, thumbnail_url ) VALUES ( $1, @@ -35,7 +41,8 @@ impl Message { $4, $5, $6, $7, - $8 + $8, $9, + $10 ) ", self.message_id, @@ -45,6 +52,8 @@ impl Message { self.title, self.content, self.channel.bits() as i64, + self.member_groups.bits() as i64, + self.member_roles.bits() as i64, self.thumbnail_url, ) .execute(&mut **transaction) diff --git a/server/src/model/member.rs b/server/src/model/member.rs index a2a5460..a97ed1f 100644 --- a/server/src/model/member.rs +++ b/server/src/model/member.rs @@ -84,12 +84,50 @@ impl From for Groups { } } +impl From> for Groups { + fn from(value: Option) -> Self { + match value { + Some(groups) => groups, + None => Self::empty(), + } + } +} + +impl Groups { + pub fn to_option(self) -> Option { + if self.is_empty() { + None + } else { + Some(self) + } + } +} + impl From for Roles { fn from(value: i64) -> Self { Self::from_bits(value as u64).unwrap_or(Roles::empty()) } } +impl From> for Roles { + fn from(value: Option) -> Self { + match value { + Some(roles) => roles, + None => Self::empty(), + } + } +} + +impl Roles { + pub fn to_option(self) -> Option { + if self.is_empty() { + None + } else { + Some(self) + } + } +} + use crate::database::model::Member as DbMember; impl From for Member { fn from(value: DbMember) -> Self { diff --git a/server/src/model/message.rs b/server/src/model/message.rs index 67839a8..3e503f9 100644 --- a/server/src/model/message.rs +++ b/server/src/model/message.rs @@ -10,6 +10,8 @@ pub struct Message { pub title: String, pub content: String, pub channel: Channel, + pub member_groups: Option, + pub member_roles: Option, pub thumbnail_url: Option, } @@ -41,6 +43,8 @@ pub struct MessageCreate { pub title: String, pub content: String, pub channel: Channel, + pub member_groups: Option, + pub member_roles: Option, pub thumbnail_url: Option, } @@ -58,12 +62,16 @@ impl Message { 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 { @@ -74,6 +82,8 @@ impl From for Message { 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, } } @@ -89,6 +99,8 @@ impl From for DbMessage { 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, } } diff --git a/server/src/routes/message.rs b/server/src/routes/message.rs index 3a412b3..4141b5c 100644 --- a/server/src/routes/message.rs +++ b/server/src/routes/message.rs @@ -10,7 +10,7 @@ use crate::{ auth::get_user_from_header, database::model::Message as DbMessage, model::{ - member::Roles, + member::{Groups, Roles}, message::{Channel, MessageCreate}, Message, }, @@ -26,6 +26,8 @@ pub struct MessageCreateRequest { title: String, content: String, channel: String, + member_groups: Option, + member_roles: Option, } pub async fn message_create( @@ -44,10 +46,30 @@ pub async fn message_create( } })?; + let member_groups: Option = request + .member_groups + .map(|groups| { + bitflags::parser::from_str_strict(&groups).map_err(|_| crate::Error::BadRequest { + expected: String::from("Error while parsing member groups"), + }) + }) + .transpose()?; + + let member_roles: Option = request + .member_roles + .map(|roles| { + bitflags::parser::from_str_strict(&roles).map_err(|_| crate::Error::BadRequest { + expected: String::from("Error while parsing member roles"), + }) + }) + .transpose()?; + let db_message: DbMessage = Message::new(MessageCreate { title: request.title, content: request.content, channel, + member_groups, + member_roles, scheduled_at: None, thumbnail_url: None, })