use ocre::{Ctx, Result, params};
use serde::{Deserialize, Serialize};
use crate::models::user::User;
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Identity {
pub id: i64,
pub user_id: i64,
pub provider: String,
pub uid: String,
pub created_at: String,
}
pub async fn find_user(ctx: &Ctx, provider: &str, uid: &str) -> Result<Option<User>> {
ctx.db()?
.first(
"SELECT users.* FROM identities JOIN users ON users.id = identities.user_id \
WHERE identities.provider = ?1 AND identities.uid = ?2",
params![provider, uid],
)
.await
}
pub async fn link(ctx: &Ctx, user_id: i64, provider: &str, uid: &str) -> Result<()> {
ctx.db()?
.execute(
"INSERT INTO identities (user_id, provider, uid) VALUES (?1, ?2, ?3) ON CONFLICT (provider, uid) DO NOTHING",
params![user_id, provider, uid],
)
.await?;
Ok(())
}
pub async fn for_user(ctx: &Ctx, user_id: i64) -> Result<Vec<Identity>> {
ctx.db()?.all("SELECT * FROM identities WHERE user_id = ?1 ORDER BY provider", params![user_id]).await
}