m20260516_000002_remote_resource_shares.rs
184 lignes · 6522 octets
//! Migration `m20260516_000002_remote_resource_shares` (RFC 0029). //! //! Creates the `fediverse_resource_shares` table that records permission //! grants of a generic application resource (identified by the //! `(resource_type, resource_id)` pair in the core `resources` registry) //! to a remote ActivityPub identity (`remote_identities.id`). //! //! Schema (one share = one `(resource_id, remote_identity_id)` pair) : //! //! | column | type | notes | //! |-----------------------|-------------|-------| //! | `id` | uuid PK | stable identifier | //! | `resource_id` | uuid NOT NULL FK `resources(id)` ON DELETE CASCADE | core registry entry | //! | `remote_identity_id` | uuid NOT NULL FK `remote_identities(id)` ON DELETE CASCADE | grantee | //! | `permission_level` | varchar(32) NOT NULL | `"read" \| "write" \| "admin"` | //! | `shared_by_user_id` | uuid NOT NULL FK `users(id)` ON DELETE CASCADE | grantor (local user) | //! | `created_at` | timestamptz NOT NULL DEFAULT NOW() | bookkeeping | //! //! Unique index on `(resource_id, remote_identity_id)` guarantees upsert //! semantics in `RemoteResourceShareService::share`. Secondary index on //! `remote_identity_id` accelerates the "list resources shared with this //! remote identity" lookup. 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> { manager .create_table( Table::create() .table(FediverseResourceShares::Table) .col( ColumnDef::new(FediverseResourceShares::Id) .uuid() .not_null() .primary_key(), ) .col( ColumnDef::new(FediverseResourceShares::ResourceId) .uuid() .not_null(), ) .col( ColumnDef::new(FediverseResourceShares::RemoteIdentityId) .uuid() .not_null(), ) .col( ColumnDef::new(FediverseResourceShares::PermissionLevel) .string_len(32) .not_null(), ) .col( ColumnDef::new(FediverseResourceShares::SharedByUserId) .uuid() .not_null(), ) .col( ColumnDef::new(FediverseResourceShares::CreatedAt) .timestamp_with_time_zone() .not_null(), ) .foreign_key( ForeignKey::create() .name("fk_fediverse_resource_shares_resource") .from( FediverseResourceShares::Table, FediverseResourceShares::ResourceId, ) .to(Resources::Table, Resources::Id) .on_delete(ForeignKeyAction::Cascade), ) .foreign_key( ForeignKey::create() .name("fk_fediverse_resource_shares_remote_identity") .from( FediverseResourceShares::Table, FediverseResourceShares::RemoteIdentityId, ) .to(RemoteIdentities::Table, RemoteIdentities::Id) .on_delete(ForeignKeyAction::Cascade), ) .foreign_key( ForeignKey::create() .name("fk_fediverse_resource_shares_shared_by") .from( FediverseResourceShares::Table, FediverseResourceShares::SharedByUserId, ) .to(Users::Table, Users::Id) .on_delete(ForeignKeyAction::Cascade), ) .to_owned(), ) .await?; manager .create_index( Index::create() .name("fediverse_resource_shares_unique_idx") .table(FediverseResourceShares::Table) .col(FediverseResourceShares::ResourceId) .col(FediverseResourceShares::RemoteIdentityId) .unique() .to_owned(), ) .await?; manager .create_index( Index::create() .name("fediverse_resource_shares_remote_idx") .table(FediverseResourceShares::Table) .col(FediverseResourceShares::RemoteIdentityId) .to_owned(), ) .await?; Ok(()) } async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { manager .drop_index( Index::drop() .name("fediverse_resource_shares_remote_idx") .table(FediverseResourceShares::Table) .to_owned(), ) .await?; manager .drop_index( Index::drop() .name("fediverse_resource_shares_unique_idx") .table(FediverseResourceShares::Table) .to_owned(), ) .await?; manager .drop_table( Table::drop() .table(FediverseResourceShares::Table) .to_owned(), ) .await?; Ok(()) } } #[derive(Iden)] enum FediverseResourceShares { Table, Id, ResourceId, RemoteIdentityId, PermissionLevel, SharedByUserId, CreatedAt, } #[derive(Iden)] enum Resources { Table, Id, } #[derive(Iden)] enum RemoteIdentities { Table, Id, } #[derive(Iden)] enum Users { Table, Id, }
GitRust