Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Backend #1

Merged
merged 40 commits into from
Jun 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
f876f25
Update poem dependency
Quat3rnion Jun 2, 2024
d1b3a9a
Convert timestamp fields to DateTime's
Quat3rnion Jun 2, 2024
c445213
Feature lock different types for UserSettings::status
Quat3rnion Jun 2, 2024
7b72944
Make config register_configuration use Rights bitflag object
Quat3rnion Jun 2, 2024
ab4435a
Update tests to use DateTime's for timestamps
Quat3rnion Jun 2, 2024
08952db
Fix tests
Quat3rnion Jun 2, 2024
8c5d80d
Allow joined_at to default if field is not in responses.
Quat3rnion Jun 2, 2024
a75701d
Allow last_pin_timestamp to default if field is not in responses.
Quat3rnion Jun 3, 2024
eefdd4a
Remove serde(with) for message timestamps
Quat3rnion Jun 3, 2024
0bc54ce
Add sqlx::FromRow derive to GuildMember
Quat3rnion Jun 3, 2024
d6ad68c
remove dep: prefix in backend feature list
Quat3rnion Jun 3, 2024
7548f0e
merge latest dev
Quat3rnion Jun 3, 2024
85aa854
Implement sqlx Encode, Decode, Type for Rights bitflag object.
Quat3rnion Jun 4, 2024
7d55bbe
Use Snowflake in Claims
Quat3rnion Jun 4, 2024
179b8d2
Use ChannelType enum on ChannelModifySchema
Quat3rnion Jun 4, 2024
40bdafd
Feature lock Shared, so backend feature gets a facade type
Quat3rnion Jun 4, 2024
4d75aa8
Remove erroneous serde with attributes
Quat3rnion Jun 4, 2024
97f10aa
Add From<Vec<GuildFeatures>> impl for GuildFeaturesList
Quat3rnion Jun 4, 2024
2b06742
Add feature sqlx locks for user, roles on GuildMember
Quat3rnion Jun 4, 2024
f178e51
Use distinct type for explicit_content_filter
Quat3rnion Jun 4, 2024
2b4e9fa
Remove unused imports
Quat3rnion Jun 4, 2024
119a09a
Revert c4452132
Quat3rnion Jun 4, 2024
fcda4cc
Remove final usages of erroneous serde impl
Quat3rnion Jun 4, 2024
2db91e8
Fix errors in documentation tests
Quat3rnion Jun 4, 2024
50c5c29
update dev-dependencies
Quat3rnion Jun 4, 2024
32677b8
actually fix linux tests
Quat3rnion Jun 4, 2024
0c9e9cf
clear warnings
Quat3rnion Jun 4, 2024
82c8f57
Update Cargo.lock
Quat3rnion Jun 4, 2024
cb905d0
Expand documentation to explain facade type
Quat3rnion Jun 4, 2024
0bf5091
Fix oversight for premium_since
Quat3rnion Jun 4, 2024
c96dcd5
Distinguish InviteType and InviteTargetType
Quat3rnion Jun 5, 2024
6c1493f
Add sqlx Type, Encode, Decode impl for InviteFlags bitflag object.
Quat3rnion Jun 5, 2024
133b03f
Use distinct type `DefaultReaction`
Quat3rnion Jun 5, 2024
450aa9f
Update fields for backend/sqlx compatibility.
Quat3rnion Jun 5, 2024
9f28187
Update derive for backend/sqlx compatibility.
Quat3rnion Jun 5, 2024
cab4cb1
Write custom serialize/deserialize impl's for InviteFlags
Quat3rnion Jun 5, 2024
0f1e693
Clear warnings
Quat3rnion Jun 5, 2024
c34b1da
Add InviteFlags::VIEWED
Quat3rnion Jun 5, 2024
0d01536
Remove double bound for E
Quat3rnion Jun 5, 2024
dfd6b37
Merge branch 'dev' into backend
Quat3rnion Jun 5, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/types/entities/channel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ pub struct ThreadMember {
pub member: Option<Shared<GuildMember>>,
}

#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq, PartialOrd)]
/// Specifies the emoji to use as the default way to react to a [ChannelType::GuildForum] or [ChannelType::GuildMedia] channel post.
///
/// # Reference
Expand Down
22 changes: 16 additions & 6 deletions src/types/entities/invite.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,33 +5,43 @@
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};

use crate::types::{Snowflake, WelcomeScreenObject, Shared};
use crate::types::{Snowflake, WelcomeScreenObject, Shared, InviteFlags, InviteType, InviteTargetType};

use super::guild::GuildScheduledEvent;
use super::{Application, Channel, GuildMember, NSFWLevel, User};

/// Represents a code that when used, adds a user to a guild or group DM channel, or creates a relationship between two users.
/// See <https://discord-userdoccers.vercel.app/resources/invite#invite-object>
#[derive(Debug, Serialize, Deserialize)]
#[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))]
pub struct Invite {
pub approximate_member_count: Option<i32>,
pub approximate_presence_count: Option<i32>,
#[cfg_attr(feature = "sqlx", sqlx(skip))]
pub channel: Option<Channel>,
pub code: String,
pub created_at: Option<DateTime<Utc>>,
pub expires_at: Option<DateTime<Utc>>,
pub flags: Option<i32>,
pub flags: Option<InviteFlags>,
#[cfg_attr(feature = "sqlx", sqlx(skip))]
pub guild: Option<InviteGuild>,
pub guild_id: Option<Snowflake>,
#[cfg_attr(feature = "sqlx", sqlx(skip))]
pub guild_scheduled_event: Option<Shared<GuildScheduledEvent>>,
#[serde(rename = "type")]
pub invite_type: Option<i32>,
#[cfg_attr(feature = "sqlx", sqlx(rename = "type"))]
pub invite_type: Option<InviteType>,
#[cfg_attr(feature = "sqlx", sqlx(skip))]
pub inviter: Option<User>,
pub max_age: Option<i32>,
pub max_uses: Option<i32>,
pub max_age: Option<u32>,
pub max_uses: Option<u8>,
#[cfg_attr(feature = "sqlx", sqlx(skip))]
pub stage_instance: Option<InviteStageInstance>,
#[cfg_attr(feature = "sqlx", sqlx(skip))]
pub target_application: Option<Application>,
pub target_type: Option<i32>,
#[cfg_attr(feature = "sqlx", sqlx(rename = "target_user_type"))]
pub target_type: Option<InviteTargetType>,
#[cfg_attr(feature = "sqlx", sqlx(skip))]
pub target_user: Option<User>,
pub temporary: Option<bool>,
pub uses: Option<i32>,
Expand Down
3 changes: 3 additions & 0 deletions src/types/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ pub enum Error {

#[error(transparent)]
Guild(#[from] GuildError),

#[error("Invalid flags value: {0}")]
InvalidFlags(u64)
}

#[derive(Debug, PartialEq, Eq, thiserror::Error)]
Expand Down
76 changes: 70 additions & 6 deletions src/types/schema/channel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
// file, You can obtain one at http://mozilla.org/MPL/2.0/.

use bitflags::bitflags;
use serde::{Deserialize, Serialize};
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use serde::de::Visitor;

use crate::types::ChannelType;
use crate::types::{entities::PermissionOverwrite, Snowflake};
use crate::types::{ChannelType, DefaultReaction, Error, entities::PermissionOverwrite, Snowflake};

#[derive(Debug, Deserialize, Serialize, Default, PartialEq, PartialOrd)]
#[serde(rename_all = "snake_case")]
Expand Down Expand Up @@ -48,7 +48,7 @@ pub struct ChannelModifySchema {
pub nsfw: Option<bool>,
pub rtc_region: Option<String>,
pub default_auto_archive_duration: Option<i32>,
pub default_reaction_emoji: Option<String>,
pub default_reaction_emoji: Option<DefaultReaction>,
pub flags: Option<i32>,
pub default_thread_rate_limit_per_user: Option<i32>,
pub video_quality_mode: Option<i32>,
Expand Down Expand Up @@ -109,7 +109,7 @@ pub struct CreateChannelInviteSchema {
pub temporary: Option<bool>,
pub unique: Option<bool>,
pub validate: Option<String>,
pub target_type: Option<InviteType>,
pub target_type: Option<InviteTargetType>,
pub target_user_id: Option<Snowflake>,
pub target_application_id: Option<Snowflake>,
}
Expand All @@ -131,15 +131,79 @@ impl Default for CreateChannelInviteSchema {
}

bitflags! {
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, PartialOrd, Ord)]
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub struct InviteFlags: u64 {
const GUEST = 1 << 0;
const VIEWED = 1 << 1;
}
}

impl Serialize for InviteFlags {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
self.bits().to_string().serialize(serializer)
}
}

impl<'de> Deserialize<'de> for InviteFlags {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de> {
struct FlagsVisitor;

impl<'de> Visitor<'de> for FlagsVisitor
{
type Value = InviteFlags;

fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
formatter.write_str("a raw u64 value of flags")
}

fn visit_u64<E: serde::de::Error>(self, v: u64) -> Result<Self::Value, E> {
InviteFlags::from_bits(v).ok_or(serde::de::Error::custom(Error::InvalidFlags(v)))
}
}

deserializer.deserialize_u64(FlagsVisitor)
}
}

#[cfg(feature = "sqlx")]
impl sqlx::Type<sqlx::MySql> for InviteFlags {
fn type_info() -> sqlx::mysql::MySqlTypeInfo {
u64::type_info()
}
}

#[cfg(feature = "sqlx")]
impl<'q> sqlx::Encode<'q, sqlx::MySql> for InviteFlags {
fn encode_by_ref(&self, buf: &mut <sqlx::MySql as sqlx::database::HasArguments<'q>>::ArgumentBuffer) -> sqlx::encode::IsNull {
u64::encode_by_ref(&self.0.0, buf)
}
}

#[cfg(feature = "sqlx")]
impl<'r> sqlx::Decode<'r, sqlx::MySql> for InviteFlags {
fn decode(value: <sqlx::MySql as sqlx::database::HasValueRef<'r>>::ValueRef) -> Result<Self, sqlx::error::BoxDynError> {
let raw = u64::decode(value)?;

Ok(Self::from_bits(raw).unwrap())
}
}

#[derive(Debug, Deserialize, Serialize, Clone, Copy, Default, PartialOrd, Ord, PartialEq, Eq)]
#[cfg_attr(feature = "sqlx", derive(sqlx::Type))]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
#[repr(u8)]
pub enum InviteType {
#[default]
Guild = 0,
GroupDm = 1,
Friend = 2,
}

#[derive(Debug, Deserialize, Serialize, Clone, Copy, Default, PartialOrd, Ord, PartialEq, Eq)]
#[cfg_attr(feature = "sqlx", derive(sqlx::Type))]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
#[repr(u8)]
pub enum InviteTargetType {
#[default]
Stream = 1,
EmbeddedApplication = 2,
Expand Down