use crate::db::UserId; use sea_orm::entity::prelude::*; use serde::Serialize; /// A user model. #[derive(Clone, Debug, Default, PartialEq, Eq, DeriveEntityModel, Serialize)] #[sea_orm(table_name = "users")] pub struct Model { #[sea_orm(primary_key)] pub id: UserId, pub github_login: String, pub github_user_id: Option, pub email_address: Option, pub admin: bool, pub invite_code: Option, pub invite_count: i32, pub inviter_id: Option, pub connected_once: bool, pub metrics_id: Uuid, pub created_at: DateTime, } #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] pub enum Relation { #[sea_orm(has_many = "super::access_token::Entity")] AccessToken, #[sea_orm(has_many = "super::billing_subscription::Entity")] BillingSubscription, #[sea_orm(has_one = "super::room_participant::Entity")] RoomParticipant, #[sea_orm(has_many = "super::project::Entity")] HostedProjects, #[sea_orm(has_many = "super::channel_member::Entity")] ChannelMemberships, #[sea_orm(has_many = "super::user_feature::Entity")] UserFeatures, #[sea_orm(has_one = "super::contributor::Entity")] Contributor, } impl Related for Entity { fn to() -> RelationDef { Relation::AccessToken.def() } } impl Related for Entity { fn to() -> RelationDef { Relation::RoomParticipant.def() } } impl Related for Entity { fn to() -> RelationDef { Relation::HostedProjects.def() } } impl Related for Entity { fn to() -> RelationDef { Relation::ChannelMemberships.def() } } impl Related for Entity { fn to() -> RelationDef { Relation::UserFeatures.def() } } impl ActiveModelBehavior for ActiveModel {} pub struct UserFlags; impl Linked for UserFlags { type FromEntity = Entity; type ToEntity = super::feature_flag::Entity; fn link(&self) -> Vec { vec![ super::user_feature::Relation::User.def().rev(), super::user_feature::Relation::Flag.def(), ] } }