diff --git a/alembic/versions/0054_plugin_owner_id.py b/alembic/versions/0054_plugin_owner_id.py new file mode 100644 index 0000000..4274dba --- /dev/null +++ b/alembic/versions/0054_plugin_owner_id.py @@ -0,0 +1,49 @@ +"""Add owner_id to plugin entity tables for row-level ownership. + +Revision ID: 0054 +Revises: 0053 +Create Date: 2026-07-29 + +This migration adds owner_id to plugin entity tables (files, folders, +calendar_entries, calendars, tasks, subtasks) so that the universal +visibility/permission system can be used for plugin entities. +""" + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects.postgresql import UUID as PGUUID + +revision = "0054" +down_revision = "0053" +branch_labels = None +depends_on = None + +# Plugin entity tables that need owner_id +TABLES = [ + "files", + "folders", + "calendar_entries", + "calendars", + "tasks", + "subtasks", +] + + +def upgrade() -> None: + for table in TABLES: + op.add_column( + table, + sa.Column( + "owner_id", + PGUUID(as_uuid=True), + sa.ForeignKey("users.id", ondelete="SET NULL"), + nullable=True, + ), + ) + op.create_index(f"ix_{table}_owner", table, ["owner_id"]) + + +def downgrade() -> None: + for table in TABLES: + op.drop_index(f"ix_{table}_owner", table_name=table) + op.drop_column(table, "owner_id") diff --git a/app/plugins/builtins/calendar/models.py b/app/plugins/builtins/calendar/models.py index cec29ff..caca564 100644 --- a/app/plugins/builtins/calendar/models.py +++ b/app/plugins/builtins/calendar/models.py @@ -21,7 +21,7 @@ from app.core.db import Base, TenantMixin from app.models.owned_mixin import OwnedMixin -class Calendar(Base, TenantMixin): +class Calendar(Base, TenantMixin, OwnedMixin): """Calendar entity — tenant-scoped, soft-deletable, owned by a user.""" __tablename__ = "calendars"