diff --git a/src/db/tables/assignables/awards.rs b/src/db/tables/assignables/awards.rs index 6e27cbf..e2100cd 100644 --- a/src/db/tables/assignables/awards.rs +++ b/src/db/tables/assignables/awards.rs @@ -12,7 +12,7 @@ pub struct Award { pub modified_at: i64, } -impl TableMeta<'_> for Award { +impl TableMeta for Award { type PrimaryKey = i64; const TABLE: &'static str = "awards"; } diff --git a/src/db/tables/assignables/missions.rs b/src/db/tables/assignables/missions.rs index 3201262..55e5602 100644 --- a/src/db/tables/assignables/missions.rs +++ b/src/db/tables/assignables/missions.rs @@ -14,7 +14,7 @@ pub struct Mission { pub modified_at: i64, } -impl TableMeta<'_> for Mission { +impl TableMeta for Mission { type PrimaryKey = i64; const TABLE: &'static str = "missions"; } diff --git a/src/db/tables/assignables/qualifications.rs b/src/db/tables/assignables/qualifications.rs index 47cb92a..3bfe265 100644 --- a/src/db/tables/assignables/qualifications.rs +++ b/src/db/tables/assignables/qualifications.rs @@ -12,7 +12,7 @@ pub struct Qualification { pub modified_at: i64, } -impl TableMeta<'_> for Qualification { +impl TableMeta for Qualification { type PrimaryKey = i64; const TABLE: &'static str = "qualifications"; } diff --git a/src/db/tables/assignables/ranks.rs b/src/db/tables/assignables/ranks.rs index e6553a6..a76c0dd 100644 --- a/src/db/tables/assignables/ranks.rs +++ b/src/db/tables/assignables/ranks.rs @@ -12,7 +12,7 @@ pub struct Rank { pub modified_at: i64, } -impl TableMeta<'_> for Rank { +impl TableMeta for Rank { type PrimaryKey = i64; const TABLE: &'static str = "ranks"; } diff --git a/src/db/tables/assignables/trainings.rs b/src/db/tables/assignables/trainings.rs index ccccca6..821c0ef 100644 --- a/src/db/tables/assignables/trainings.rs +++ b/src/db/tables/assignables/trainings.rs @@ -12,7 +12,7 @@ pub struct Training { pub modified_at: i64, } -impl TableMeta<'_> for Training { +impl TableMeta for Training { type PrimaryKey = i64; const TABLE: &'static str = "trainings"; } diff --git a/src/db/tables/mod.rs b/src/db/tables/mod.rs index 103c804..0124726 100644 --- a/src/db/tables/mod.rs +++ b/src/db/tables/mod.rs @@ -12,21 +12,22 @@ pub mod records; pub mod sessions; pub mod user; -pub trait TableMeta<'a>: for<'r> sqlx::FromRow<'r, PgRow> { - type PrimaryKey: Encode<'a, super::CurrDb> + Type + Clone; +pub trait TableMeta: for<'r> sqlx::FromRow<'r, PgRow> { + type PrimaryKey: Type + Clone; const TABLE: &'static str; } #[derive(Debug, Clone, Default)] -pub struct ForeignKey<'a, FK: TableMeta<'a>> { +pub struct ForeignKey { id: FK::PrimaryKey, _ft: PhantomData, } -impl<'a, FK: TableMeta<'a> + Send + for<'r> sqlx::FromRow<'r, PgRow> + Unpin + 'a> - ForeignKey<'a, FK> -{ - pub async fn extract(&self, db: &super::CurrPool) -> anyhow::Result { +impl<'a, FK: TableMeta + Send + for<'r> sqlx::FromRow<'r, PgRow> + Unpin + 'a> ForeignKey { + pub async fn extract(&self, db: &super::CurrPool) -> anyhow::Result + where + ::PrimaryKey: for<'b> sqlx::Encode<'b, super::CurrDb>, + { let id = self.id.clone(); let res = QueryBuilder::new("") @@ -40,39 +41,44 @@ impl<'a, FK: TableMeta<'a> + Send + for<'r> sqlx::FromRow<'r, PgRow> + Unpin + ' } } -impl<'a, TM: TableMeta<'a>> Type for ForeignKey<'a, TM> { +impl<'a, TM: TableMeta> Type for ForeignKey { fn type_info() -> ::TypeInfo { TM::PrimaryKey::type_info() } } -impl<'a, TM: TableMeta<'a>> Decode<'a, super::CurrDb> for ForeignKey<'a, TM> +impl<'a, TM: TableMeta> Decode<'a, super::CurrDb> for ForeignKey where &'a str: Decode<'a, super::CurrDb>, - >::PrimaryKey: sqlx::Decode<'a, super::CurrDb>, + ::PrimaryKey: sqlx::Decode<'a, super::CurrDb>, { fn decode( value: ::ValueRef<'a>, ) -> Result> { - >::decode(value); - todo!() + match >::decode(value) { + Ok(v) => Ok(Self { + id: v, + _ft: PhantomData, + }), + Err(e) => Err(e), + } } } -impl<'a, TM: TableMeta<'a>> Deref for ForeignKey<'a, TM> { +impl Deref for ForeignKey { type Target = TM::PrimaryKey; fn deref(&self) -> &Self::Target { &self.id } } -impl<'a, TM: TableMeta<'a>> DerefMut for ForeignKey<'a, TM> { +impl DerefMut for ForeignKey { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.id } } -impl<'a, FK: TableMeta<'a, PrimaryKey = i64>> From for ForeignKey<'a, FK> { +impl> From for ForeignKey { fn from(value: FK::PrimaryKey) -> Self { Self { id: value, diff --git a/src/db/tables/records/awards.rs b/src/db/tables/records/awards.rs index f53f7a9..106a075 100644 --- a/src/db/tables/records/awards.rs +++ b/src/db/tables/records/awards.rs @@ -7,20 +7,20 @@ use crate::db::{ }; #[derive(Debug, Default, Clone, FromRow)] -pub struct AwardRecord<'a> { +pub struct AwardRecord { pub id: i64, - pub user_id: ForeignKey<'a, User>, - pub award_id: ForeignKey<'a, Award>, - pub author_id: ForeignKey<'a, User>, + pub user_id: ForeignKey, + pub award_id: ForeignKey, + pub author_id: ForeignKey, pub created_at: i64, } -impl<'a> TableMeta<'a> for AwardRecord<'a> { +impl TableMeta for AwardRecord { type PrimaryKey = i64; const TABLE: &'static str = "records_awards"; } -impl AwardRecord<'_> { +impl AwardRecord { pub async fn insert_new(&self, pool: &CurrPool) -> Result { let session = sqlx::query_as!( AwardRecord, @@ -37,7 +37,7 @@ impl AwardRecord<'_> { .fetch_one(pool) .await?; - self.author_id.extract(pool); + let user = self.author_id.extract(pool).await?; Ok(session) } diff --git a/src/db/tables/records/missions.rs b/src/db/tables/records/missions.rs index e30c562..cb92643 100644 --- a/src/db/tables/records/missions.rs +++ b/src/db/tables/records/missions.rs @@ -7,20 +7,20 @@ use crate::db::{ }; #[derive(Debug, Default, Clone, FromRow)] -pub struct MissionRecord<'a> { +pub struct MissionRecord { pub id: i64, - pub user_id: ForeignKey<'a, User>, - pub mission_id: ForeignKey<'a, Mission>, - pub author_id: ForeignKey<'a, User>, + pub user_id: ForeignKey, + pub mission_id: ForeignKey, + pub author_id: ForeignKey, pub created_at: i64, } -impl TableMeta<'_> for MissionRecord<'_> { +impl TableMeta for MissionRecord { type PrimaryKey = i64; const TABLE: &'static str = "records_missions"; } -impl MissionRecord<'_> { +impl MissionRecord { pub async fn insert_new(&self, pool: &CurrPool) -> Result { let session = sqlx::query_as!( MissionRecord, diff --git a/src/db/tables/records/qualifications.rs b/src/db/tables/records/qualifications.rs index 4d09f2e..574bc2f 100644 --- a/src/db/tables/records/qualifications.rs +++ b/src/db/tables/records/qualifications.rs @@ -7,20 +7,20 @@ use crate::db::{ }; #[derive(Debug, Default, Clone, FromRow)] -pub struct QualificationRecord<'a> { +pub struct QualificationRecord { pub id: i64, - pub user_id: ForeignKey<'a, User>, - pub author_id: ForeignKey<'a, User>, - pub qualification_id: ForeignKey<'a, Qualification>, + pub user_id: ForeignKey, + pub author_id: ForeignKey, + pub qualification_id: ForeignKey, pub created_at: i64, } -impl<'a> TableMeta<'a> for QualificationRecord<'a> { +impl TableMeta for QualificationRecord { type PrimaryKey = i64; const TABLE: &'static str = "records_qualifications"; } -impl<'a> QualificationRecord<'a> { +impl QualificationRecord { pub async fn insert_new(&self, pool: &CurrPool) -> Result { let session = sqlx::query_as!( QualificationRecord, diff --git a/src/db/tables/records/ranks.rs b/src/db/tables/records/ranks.rs index 8222643..d449078 100644 --- a/src/db/tables/records/ranks.rs +++ b/src/db/tables/records/ranks.rs @@ -7,20 +7,20 @@ use crate::db::{ }; #[derive(Debug, Default, Clone, FromRow)] -pub struct RankRecord<'a> { +pub struct RankRecord { pub id: i64, - pub user_id: ForeignKey<'a, User>, - pub rank_id: ForeignKey<'a, Rank>, - pub author_id: ForeignKey<'a, User>, + pub user_id: ForeignKey, + pub rank_id: ForeignKey, + pub author_id: ForeignKey, pub created_at: i64, } -impl<'a> TableMeta<'a> for RankRecord<'a> { +impl TableMeta for RankRecord { type PrimaryKey = i64; const TABLE: &'static str = "records_ranks"; } -impl<'a> RankRecord<'a> { +impl RankRecord { pub async fn insert_new(&self, pool: &CurrPool) -> Result { let session = sqlx::query_as!( RankRecord, diff --git a/src/db/tables/records/trainings.rs b/src/db/tables/records/trainings.rs index efb5462..9f6973b 100644 --- a/src/db/tables/records/trainings.rs +++ b/src/db/tables/records/trainings.rs @@ -7,20 +7,20 @@ use crate::db::{ }; #[derive(Debug, Default, Clone, FromRow)] -pub struct TrainingRecord<'a> { +pub struct TrainingRecord { pub id: i64, - pub user_id: ForeignKey<'a, User>, - pub training_id: ForeignKey<'a, Training>, - pub author_id: ForeignKey<'a, User>, + pub user_id: ForeignKey, + pub training_id: ForeignKey, + pub author_id: ForeignKey, pub created_at: i64, } -impl<'a> TableMeta<'a> for TrainingRecord<'a> { +impl TableMeta for TrainingRecord { type PrimaryKey = i64; const TABLE: &'static str = "records_trainings"; } -impl<'a> TrainingRecord<'a> { +impl TrainingRecord { pub async fn insert_new(&self, pool: &CurrPool) -> Result { let session = sqlx::query_as!( TrainingRecord, diff --git a/src/db/tables/sessions.rs b/src/db/tables/sessions.rs index a3f2a55..5be6fbd 100644 --- a/src/db/tables/sessions.rs +++ b/src/db/tables/sessions.rs @@ -10,7 +10,7 @@ pub struct Session { pub expires: i64, } -impl TableMeta<'_> for Session { +impl TableMeta for Session { type PrimaryKey = i64; const TABLE: &'static str = "sessions"; } diff --git a/src/db/tables/user.rs b/src/db/tables/user.rs index b6a76bf..d80e416 100644 --- a/src/db/tables/user.rs +++ b/src/db/tables/user.rs @@ -14,7 +14,7 @@ pub struct User { pub rank_id: i64, } -impl TableMeta<'_> for User { +impl TableMeta for User { type PrimaryKey = i64; const TABLE: &'static str = "users"; }