Some work on interfaces
I'm not happy. It kinda sucks right now. I hope I can fix it~~~~~ But for now I must move to my laptop
This commit is contained in:
parent
62f32da927
commit
9d8fb730ba
8 changed files with 218 additions and 60 deletions
2
Cargo.lock
generated
2
Cargo.lock
generated
|
|
@ -564,7 +564,9 @@ name = "db"
|
|||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"atproto",
|
||||
"sqlx",
|
||||
"thiserror 2.0.12",
|
||||
"tokio",
|
||||
]
|
||||
|
||||
|
|
|
|||
|
|
@ -1,17 +1,37 @@
|
|||
use lazy_regex::regex_captures;
|
||||
use core::str::FromStr;
|
||||
use std::fmt::{
|
||||
Display, Formatter, Result as FmtResult
|
||||
};
|
||||
|
||||
pub use atrium_api::types::{
|
||||
Collection,
|
||||
string::{
|
||||
AtIdentifier as Authority,
|
||||
Datetime,
|
||||
Did,
|
||||
Nsid,
|
||||
RecordKey,
|
||||
AtIdentifier as Authority,
|
||||
Tid,
|
||||
Handle,
|
||||
}
|
||||
};
|
||||
|
||||
pub mod lexicons;
|
||||
|
||||
pub struct Cid(String);
|
||||
|
||||
impl Display for Cid {
|
||||
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
|
||||
write!(f, "{}", self.0)
|
||||
}
|
||||
}
|
||||
|
||||
pub struct StrongRef<T> {
|
||||
pub content: T,
|
||||
pub cid: Cid,
|
||||
}
|
||||
|
||||
pub struct Uri {
|
||||
whole: String,
|
||||
// These fields could be useful in the future,
|
||||
|
|
|
|||
|
|
@ -4,6 +4,8 @@ version = "0.1.0"
|
|||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
thiserror = "2.0.12"
|
||||
atproto.workspace = true
|
||||
async-trait.workspace = true
|
||||
sqlx = { version = "0.8.6", features = ["postgres", "runtime-tokio"] }
|
||||
tokio.workspace = true
|
||||
|
|
|
|||
|
|
@ -12,8 +12,8 @@ use sqlx::{
|
|||
};
|
||||
use std::string::ToString;
|
||||
|
||||
pub struct Db<Dbimp: Database> {
|
||||
pool: Pool<Dbimp>
|
||||
pub struct Db<Db: Database> {
|
||||
pool: Pool<Db>
|
||||
}
|
||||
|
||||
#[non_exhaustive]
|
||||
|
|
@ -55,45 +55,4 @@ impl Db<Postgres> {
|
|||
Ok(Db { pool })
|
||||
}
|
||||
//
|
||||
// pub async fn add_user(&self, user: &User) -> Result<()> {
|
||||
// query!(r#"
|
||||
// INSERT INTO users(userdid, handle) VALUES ($1, $2)
|
||||
// "#,
|
||||
// user.userdid, user.handle
|
||||
// ).execute(self.pool).await?;
|
||||
// Ok(())
|
||||
// }
|
||||
//
|
||||
// pub async fn add_session(&self, session: &Session) -> Result<()> {
|
||||
// let mut transaction = self.pool.begin().await?;
|
||||
//
|
||||
// query!(r#"
|
||||
// INSERT INTO sessions(sessionuri, label) VALUES ($1, $2)
|
||||
// "#,
|
||||
// session.sessionuri, session.label
|
||||
// ).execute(&mut *transaction).await?;
|
||||
//
|
||||
// for participant in session.participants {
|
||||
// query!(r#"
|
||||
// INSERT INTO participants(sessionuri, userdid, role) VALUES ($1, $2, $3)
|
||||
// "#,
|
||||
// session.sessionuri, participant.userdid, participant.role.to_string()
|
||||
// ).execute(&mut *transaction).await?;
|
||||
// }
|
||||
//
|
||||
// transaction.commit().await
|
||||
// }
|
||||
//
|
||||
// pub async fn add_participant(&self, session: Session,
|
||||
// participant: Participant) -> Result<Session> {
|
||||
// query!(r#"
|
||||
// INSERT INTO participants(sessionuri, userdid, role) VALUES ($1, $2, $3)
|
||||
// "#,
|
||||
// session.sessionuri, participant.userdid, participant.role.to_string()
|
||||
// ).execute(self.pool).await?;
|
||||
//
|
||||
// session.participants.push(participant);
|
||||
//
|
||||
// Ok(session)
|
||||
// }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,15 +0,0 @@
|
|||
use atproto::{
|
||||
Did,
|
||||
Uri,
|
||||
};
|
||||
|
||||
pub struct User {
|
||||
userdid: Did,
|
||||
handle: Handle,
|
||||
}
|
||||
|
||||
struct Participant {
|
||||
participantdid: Did,
|
||||
role: Role,
|
||||
}
|
||||
|
||||
1
db/src/interfaces/mod.rs
Normal file
1
db/src/interfaces/mod.rs
Normal file
|
|
@ -0,0 +1 @@
|
|||
pub mod spoor;
|
||||
178
db/src/interfaces/spoor.rs
Normal file
178
db/src/interfaces/spoor.rs
Normal file
|
|
@ -0,0 +1,178 @@
|
|||
use crate::DbError;
|
||||
use atproto::{
|
||||
Cid,
|
||||
Uri,
|
||||
Datetime,
|
||||
Did,
|
||||
StrongRef,
|
||||
Handle,
|
||||
};
|
||||
use sqlx::{
|
||||
PgTransaction,
|
||||
PgPool,
|
||||
query,
|
||||
};
|
||||
|
||||
pub struct Activity {
|
||||
pub authority: Uri,
|
||||
|
||||
pub cid: Option<Cid>,
|
||||
pub session: Option<StrongRef<Session>>,
|
||||
pub progress: Option<Progress>,
|
||||
pub performed_at: Option<Datetime>,
|
||||
pub created_at: Option<Datetime>,
|
||||
}
|
||||
|
||||
pub struct Session {
|
||||
pub uri: Uri,
|
||||
|
||||
pub cid: Option<Cid>,
|
||||
pub content: Option<StrongRef<Content>>,
|
||||
pub label: Option<String>,
|
||||
pub created_at: Option<Datetime>,
|
||||
pub other_participants: Option<Vec<Participant>>,
|
||||
}
|
||||
|
||||
pub struct User {
|
||||
pub did: Did,
|
||||
pub handle: Option<Handle>,
|
||||
}
|
||||
|
||||
#[non_exhaustive]
|
||||
pub enum Participant {
|
||||
Owner(User),
|
||||
Added(User),
|
||||
}
|
||||
|
||||
#[non_exhaustive]
|
||||
pub enum Content {
|
||||
UnknownContent
|
||||
}
|
||||
|
||||
#[non_exhaustive]
|
||||
pub enum Progress {
|
||||
UnknownProgress
|
||||
}
|
||||
|
||||
pub async fn ingest_session(
|
||||
db: PgPool, session: Session
|
||||
) -> Result<(), DbError> {
|
||||
let mut transaction = db.begin().await?;
|
||||
write_session(&mut transaction, session).await?;
|
||||
transaction.commit().await.map_err(DbError::Backend)
|
||||
}
|
||||
|
||||
async fn write_session(
|
||||
tr: &mut PgTransaction<'_>, session: Session
|
||||
) -> Result<(), DbError> {
|
||||
|
||||
let (contenturi, contentcid): (Option<Content>, String) =
|
||||
match session.content {
|
||||
Some(sr) => (Some(sr.content), sr.cid.to_string()),
|
||||
None => (None, "".to_string()),
|
||||
};
|
||||
|
||||
query!(r#"
|
||||
INSERT INTO sessions(
|
||||
sessionuri, sessioncid, label, created_at, contenturi, contentcid
|
||||
) VALUES ($1, $2, $3, $4, $5, $6)
|
||||
"#,
|
||||
session.uri,
|
||||
session.cid.map_or("", |cid| cid.to_string()),
|
||||
session.label.unwrap_or(""),
|
||||
session.created_at.map_or("", |dt| (*dt.as_str()).to_string()),
|
||||
contenturi,
|
||||
contentcid,
|
||||
).execute(&mut tr).await?;
|
||||
|
||||
session.other_participants.and_then(|participants| {
|
||||
for participant in participants {
|
||||
write_participant(tr, participant, session.uri).await?
|
||||
}
|
||||
}).unwrap_or(Ok(()))
|
||||
}
|
||||
|
||||
async fn write_participant(
|
||||
tr: &mut PgTransaction<'_>, participant: Participant, sessionuri: Uri
|
||||
) -> Result<(), DbError> {
|
||||
let (participantType, user): (String, User) = match participant {
|
||||
Participant::Owner(user) => ("Owner".to_string(), user),
|
||||
Participant::Added(user) => ("Participant".to_string(), user),
|
||||
};
|
||||
|
||||
query!(r#"
|
||||
INSERT INTO participants(
|
||||
sessionuri, userdid, role
|
||||
) VALUES ($1, $2, $3)
|
||||
"#, sessionuri.to_string(), user.did.to_string, participantType
|
||||
).execute(&mut tr).await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
// pub fn injest_activity(db: PgPool, activity: Activity) -> Result<(), Error> {
|
||||
// todo!();
|
||||
// }
|
||||
//
|
||||
// let mut transaction = db.begin().await?;
|
||||
//
|
||||
// query!(r#"
|
||||
// INSERT INTO sessions(sessionuri, label) VALUES ($1, $2)
|
||||
// "#,
|
||||
// session.sessionuri, session.label
|
||||
// ).execute(&mut *transaction).await?;
|
||||
//
|
||||
// for participant in session.participants {
|
||||
// query!(r#"
|
||||
// INSERT INTO participants(sessionuri, userdid, role) VALUES ($1, $2, $3)
|
||||
// "#,
|
||||
// session.sessionuri, participant.userdid, participant.role.to_string()
|
||||
// ).execute(&mut *transaction).await?;
|
||||
// }
|
||||
//
|
||||
// transaction.commit().await
|
||||
// }
|
||||
//
|
||||
// pub async fn ingest_participant(db: PgPool, participant: Participant) -> Result<(), Error> {
|
||||
// query!(r#"
|
||||
// INSERT INTO sessions(sessionuri, label) VALUES ($1, $2)
|
||||
// "#,
|
||||
// session.sessionuri, session.label
|
||||
// ).execute(&mut *transaction).await?;
|
||||
//
|
||||
// for participant in session.participants {
|
||||
// query!(r#"
|
||||
// INSERT INTO participants(sessionuri, userdid, role) VALUES ($1, $2, $3)
|
||||
// "#,
|
||||
// session.sessionuri, participant.userdid, participant.role.to_string()
|
||||
// ).execute(&mut *transaction).await?;
|
||||
// }
|
||||
//
|
||||
// transaction.commit().await
|
||||
// }
|
||||
//
|
||||
|
||||
// pub async fn add_user(&self, user: &User) -> Result<()> {
|
||||
// query!(r#"
|
||||
// INSERT INTO users(userdid, handle) VALUES ($1, $2)
|
||||
// "#,
|
||||
// user.userdid, user.handle
|
||||
// ).execute(self.pool).await?;
|
||||
// Ok(())
|
||||
// }
|
||||
//
|
||||
// pub async fn add_session(&self, session: &Session) -> Result<()> {
|
||||
// }
|
||||
//
|
||||
// pub async fn add_participant(&self, session: Session,
|
||||
// participant: Participant) -> Result<Session> {
|
||||
// query!(r#"
|
||||
// INSERT INTO participants(sessionuri, userdid, role) VALUES ($1, $2, $3)
|
||||
// "#,
|
||||
// session.sessionuri, participant.userdid, participant.role.to_string()
|
||||
// ).execute(self.pool).await?;
|
||||
//
|
||||
// session.participants.push(participant);
|
||||
//
|
||||
// Ok(session)
|
||||
// }
|
||||
|
|
@ -1 +1,12 @@
|
|||
pub struct db;
|
||||
use thiserror::Error;
|
||||
|
||||
pub mod interfaces;
|
||||
|
||||
#[non_exhaustive]
|
||||
#[derive(Debug, Error)]
|
||||
pub enum DbError {
|
||||
#[error("Database Implementation Error: {0}")]
|
||||
Backend(#[from] sqlx::Error),
|
||||
}
|
||||
|
||||
// pub struct db;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue