Skip to content

Commit 3346e56

Browse files
authored
Merge pull request #9 from pntech-dev/hotfix/department-deletion
fix(api): resolve critical bugs affecting API functionality
2 parents f64a697 + 55f6850 commit 3346e56

8 files changed

Lines changed: 303 additions & 163 deletions
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
"""Add cascade delete to document_files
2+
3+
Revision ID: ae2f6293ca2d
4+
Revises: d94fac64bccf
5+
Create Date: 2026-02-26 15:55:23.114743
6+
7+
"""
8+
from typing import Sequence, Union
9+
10+
from alembic import op
11+
import sqlalchemy as sa
12+
13+
14+
# revision identifiers, used by Alembic.
15+
revision: str = 'ae2f6293ca2d'
16+
down_revision: Union[str, Sequence[str], None] = 'd94fac64bccf'
17+
branch_labels: Union[str, Sequence[str], None] = None
18+
depends_on: Union[str, Sequence[str], None] = None
19+
20+
21+
def upgrade() -> None:
22+
"""Upgrade schema."""
23+
# ### commands auto generated by Alembic - please adjust! ###
24+
op.drop_constraint(op.f('document_files_document_id_fkey'), 'document_files', type_='foreignkey')
25+
op.create_foreign_key(None, 'document_files', 'documents', ['document_id'], ['id'], ondelete='CASCADE')
26+
# ### end Alembic commands ###
27+
28+
29+
def downgrade() -> None:
30+
"""Downgrade schema."""
31+
# ### commands auto generated by Alembic - please adjust! ###
32+
op.drop_constraint(None, 'document_files', type_='foreignkey')
33+
op.create_foreign_key(op.f('document_files_document_id_fkey'), 'document_files', 'documents', ['document_id'], ['id'])
34+
# ### end Alembic commands ###
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
"""Add pg_trgm search indexes for fast ILIKE search
2+
3+
Revision ID: b3c1d8e9f012
4+
Revises: ae2f6293ca2d
5+
Create Date: 2026-02-26 17:00:00.000000
6+
7+
"""
8+
from typing import Sequence, Union
9+
10+
from alembic import op
11+
import sqlalchemy as sa
12+
13+
14+
# revision identifiers, used by Alembic.
15+
revision: str = 'b3c1d8e9f012'
16+
down_revision: Union[str, Sequence[str], None] = 'ae2f6293ca2d'
17+
branch_labels: Union[str, Sequence[str], None] = None
18+
depends_on: Union[str, Sequence[str], None] = None
19+
20+
21+
def upgrade() -> None:
22+
# Enable pg_trgm extension (required for GIN trigram indexes)
23+
op.execute("CREATE EXTENSION IF NOT EXISTS pg_trgm")
24+
25+
# GIN trigram indexes — make ILIKE '%query%' use index instead of full scan
26+
op.execute("CREATE INDEX IF NOT EXISTS idx_documents_code_trgm ON documents USING GIN (code gin_trgm_ops)")
27+
op.execute("CREATE INDEX IF NOT EXISTS idx_documents_name_trgm ON documents USING GIN (name gin_trgm_ops)")
28+
op.execute("CREATE INDEX IF NOT EXISTS idx_pages_designation_trgm ON pages USING GIN (designation gin_trgm_ops)")
29+
op.execute("CREATE INDEX IF NOT EXISTS idx_pages_name_trgm ON pages USING GIN (name gin_trgm_ops)")
30+
31+
# Standard B-tree indexes for joins and filtering
32+
op.execute("CREATE INDEX IF NOT EXISTS idx_documents_category_id ON documents (category_id)")
33+
op.execute("CREATE INDEX IF NOT EXISTS idx_pages_document_id ON pages (document_id)")
34+
op.execute("CREATE INDEX IF NOT EXISTS idx_categories_group_id ON categories (group_id)")
35+
36+
37+
def downgrade() -> None:
38+
op.execute("DROP INDEX IF EXISTS idx_documents_code_trgm")
39+
op.execute("DROP INDEX IF EXISTS idx_documents_name_trgm")
40+
op.execute("DROP INDEX IF EXISTS idx_pages_designation_trgm")
41+
op.execute("DROP INDEX IF EXISTS idx_pages_name_trgm")
42+
op.execute("DROP INDEX IF EXISTS idx_documents_category_id")
43+
op.execute("DROP INDEX IF EXISTS idx_pages_document_id")
44+
op.execute("DROP INDEX IF EXISTS idx_categories_group_id")
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
"""Add cascade delete to document_tags
2+
3+
Revision ID: d94fac64bccf
4+
Revises: 1f43c69cbade
5+
Create Date: 2026-02-26 15:52:44.282113
6+
7+
"""
8+
from typing import Sequence, Union
9+
10+
from alembic import op
11+
import sqlalchemy as sa
12+
13+
14+
# revision identifiers, used by Alembic.
15+
revision: str = 'd94fac64bccf'
16+
down_revision: Union[str, Sequence[str], None] = '1f43c69cbade'
17+
branch_labels: Union[str, Sequence[str], None] = None
18+
depends_on: Union[str, Sequence[str], None] = None
19+
20+
21+
def upgrade() -> None:
22+
"""Upgrade schema."""
23+
# ### commands auto generated by Alembic - please adjust! ###
24+
op.drop_constraint(op.f('document_tags_tag_id_fkey'), 'document_tags', type_='foreignkey')
25+
op.drop_constraint(op.f('document_tags_document_id_fkey'), 'document_tags', type_='foreignkey')
26+
op.create_foreign_key(None, 'document_tags', 'documents', ['document_id'], ['id'], ondelete='CASCADE')
27+
op.create_foreign_key(None, 'document_tags', 'tags', ['tag_id'], ['id'], ondelete='CASCADE')
28+
# ### end Alembic commands ###
29+
30+
31+
def downgrade() -> None:
32+
"""Downgrade schema."""
33+
# ### commands auto generated by Alembic - please adjust! ###
34+
op.drop_constraint(None, 'document_tags', type_='foreignkey')
35+
op.drop_constraint(None, 'document_tags', type_='foreignkey')
36+
op.create_foreign_key(op.f('document_tags_document_id_fkey'), 'document_tags', 'documents', ['document_id'], ['id'])
37+
op.create_foreign_key(op.f('document_tags_tag_id_fkey'), 'document_tags', 'tags', ['tag_id'], ['id'])
38+
# ### end Alembic commands ###

models/document_file_model.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class DocumentFile(Base):
88
__tablename__ = 'document_files'
99

1010
id = Column(Integer, primary_key=True)
11-
document_id = Column(Integer, ForeignKey('documents.id'), nullable=False)
11+
document_id = Column(Integer, ForeignKey('documents.id', ondelete="CASCADE"), nullable=False)
1212

1313
file_path = Column(String, nullable=False) # Path (Key) in MinIO
1414
filename = Column(String, nullable=False) # Original filename

models/document_model.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
document_tags = Table(
77
'document_tags',
88
Base.metadata,
9-
Column('document_id', Integer, ForeignKey('documents.id'), primary_key=True),
10-
Column('tag_id', Integer, ForeignKey('tags.id'), primary_key=True)
9+
Column('document_id', Integer, ForeignKey('documents.id', ondelete="CASCADE"), primary_key=True),
10+
Column('tag_id', Integer, ForeignKey('tags.id', ondelete="CASCADE"), primary_key=True)
1111
)
1212

1313

0 commit comments

Comments
 (0)