use chrono::{DateTime, Utc};
use sqlx::{PgPool, Row};
use crate::sql::Auto;
#[derive(Debug, Clone)]
pub struct MediaTag {
pub id: Auto<i64>,
pub name: String,
pub slug: String,
pub created_at: DateTime<Utc>,
}
impl MediaTag {
pub async fn ensure_table(pool: &PgPool) -> Result<(), sqlx::Error> {
sqlx::query(
"CREATE TABLE IF NOT EXISTS rustango_media_tags (
id BIGSERIAL PRIMARY KEY,
name TEXT NOT NULL,
slug TEXT NOT NULL UNIQUE,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
)",
)
.execute(pool)
.await?;
sqlx::query(
"CREATE TABLE IF NOT EXISTS rustango_media_tag_links (
media_id BIGINT NOT NULL,
tag_id BIGINT NOT NULL,
PRIMARY KEY (media_id, tag_id),
FOREIGN KEY (tag_id)
REFERENCES rustango_media_tags (id)
ON DELETE CASCADE
)",
)
.execute(pool)
.await?;
sqlx::query(
"CREATE INDEX IF NOT EXISTS rustango_media_tag_links_tag_idx
ON rustango_media_tag_links (tag_id)",
)
.execute(pool)
.await?;
Ok(())
}
pub(super) fn from_row(row: &sqlx::postgres::PgRow) -> Result<Self, sqlx::Error> {
let id: i64 = row.try_get("id")?;
Ok(Self {
id: Auto::Set(id),
name: row.try_get("name")?,
slug: row.try_get("slug")?,
created_at: row.try_get("created_at")?,
})
}
}