use sea_orm_migration::prelude::*;
#[derive(DeriveMigrationName)]
pub struct Migration;
#[async_trait::async_trait]
impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
// ActivityPub actors: one row per AP identity, generic over user vs
// repository. The CHECK constraint ensures each row has exactly one of
// user_id or repo_id set
manager
.get_connection()
.execute_unprepared(
"CREATE TABLE IF NOT EXISTS ap_actors (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER UNIQUE,
repo_id INTEGER UNIQUE,
private_key_pem TEXT NOT NULL,
public_key_pem TEXT NOT NULL,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (repo_id) REFERENCES repositories(id) ON DELETE CASCADE,
CHECK ((user_id IS NOT NULL) != (repo_id IS NOT NULL))
)",
)
.await?;
Ok(())
}
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager
.get_connection()
.execute_unprepared("DROP TABLE IF EXISTS ap_actors")
.await?;
Ok(())
}
}