use futures_util::stream::BoxStream;
use sqlx::{FromRow, SqliteExecutor};
use crate::{DbUuid, TrackId, UnixTimestamp};
crate::db_id!(HistorylistId);
#[derive(Debug, Clone, FromRow)]
#[sqlx(rename_all = "camelCase")]
pub struct Historylist {
pub id: HistorylistId,
pub session_id: i64,
pub title: Option<String>,
pub start_time: UnixTimestamp,
pub timezone: Option<String>,
pub origin_drive_name: Option<String>,
pub origin_database_id: Option<DbUuid>,
pub origin_list_id: Option<i64>,
pub is_deleted: bool,
pub edit_time: Option<UnixTimestamp>,
}
impl Historylist {
pub async fn is_available<'a>(executor: impl SqliteExecutor<'a> + 'a) -> sqlx::Result<bool> {
let (exists,) = sqlx::query_as(
r#"SELECT EXISTS(SELECT 1 FROM "sqlite_master" WHERE "type"='table' AND "name"='Historylist')"#,
)
.fetch_one(executor)
.await?;
Ok(exists)
}
#[must_use]
pub fn fetch_all<'a>(
executor: impl SqliteExecutor<'a> + 'a,
) -> BoxStream<'a, sqlx::Result<Self>> {
sqlx::query_as(r#"SELECT * FROM "Historylist""#).fetch(executor)
}
pub async fn try_load(
executor: impl SqliteExecutor<'_>,
id: HistorylistId,
) -> sqlx::Result<Option<Self>> {
sqlx::query_as(r#"SELECT * FROM "Historylist" WHERE "id"=?1"#)
.bind(id)
.fetch_optional(executor)
.await
}
}
crate::db_id!(HistorylistEntityId);
#[derive(Debug, Clone, FromRow)]
#[sqlx(rename_all = "camelCase")]
pub struct HistorylistEntity {
pub id: HistorylistEntityId,
pub list_id: HistorylistId,
pub track_id: TrackId,
pub start_time: UnixTimestamp,
}
impl HistorylistEntity {
#[must_use]
pub fn fetch_all<'a>(
executor: impl SqliteExecutor<'a> + 'a,
) -> BoxStream<'a, sqlx::Result<Self>> {
sqlx::query_as(r#"SELECT * FROM "HistorylistEntity""#).fetch(executor)
}
#[must_use]
pub fn fetch_list<'a>(
executor: impl SqliteExecutor<'a> + 'a,
list_id: HistorylistId,
) -> BoxStream<'a, sqlx::Result<Self>> {
sqlx::query_as(r#"SELECT * FROM "HistorylistEntity" where "listId"=?1"#)
.bind(list_id)
.fetch(executor)
}
pub async fn try_load(
executor: impl SqliteExecutor<'_>,
id: HistorylistEntityId,
) -> sqlx::Result<Option<Self>> {
sqlx::query_as(r#"SELECT * FROM "HistorylistEntity" WHERE "id"=?1"#)
.bind(id)
.fetch_optional(executor)
.await
}
}