2025-07-01 12:54:48 +00:00

452 lines
16 KiB
Python

"""Enhanced features migration
Revision ID: 002
Revises: 001
Create Date: 2025-07-01 14:00:00.000000
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = "002"
down_revision: Union[str, None] = "001"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
# Create notifications table
op.create_table(
"notifications",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("recipient_id", sa.Integer(), nullable=False),
sa.Column("sender_id", sa.Integer(), nullable=True),
sa.Column(
"type",
sa.Enum(
"CONNECTION_REQUEST",
"CONNECTION_ACCEPTED",
"POST_LIKE",
"POST_COMMENT",
"EVENT_INVITATION",
"EVENT_REMINDER",
"PRAYER_REQUEST",
"MINISTRY_ASSIGNMENT",
"DONATION_REMINDER",
"BIRTHDAY_REMINDER",
"ANNOUNCEMENT",
name="notificationtype",
),
nullable=False,
),
sa.Column("title", sa.String(), nullable=False),
sa.Column("message", sa.Text(), nullable=False),
sa.Column("data", sa.Text(), nullable=True),
sa.Column("is_read", sa.Boolean(), nullable=True),
sa.Column("created_at", sa.DateTime(), nullable=False),
sa.Column("read_at", sa.DateTime(), nullable=True),
sa.ForeignKeyConstraint(
["recipient_id"],
["users.id"],
),
sa.ForeignKeyConstraint(
["sender_id"],
["users.id"],
),
sa.PrimaryKeyConstraint("id"),
)
op.create_index(op.f("ix_notifications_id"), "notifications", ["id"], unique=False)
# Create notification_settings table
op.create_table(
"notification_settings",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("user_id", sa.Integer(), nullable=False),
sa.Column("email_notifications", sa.Boolean(), nullable=True),
sa.Column("push_notifications", sa.Boolean(), nullable=True),
sa.Column("connection_requests", sa.Boolean(), nullable=True),
sa.Column("post_interactions", sa.Boolean(), nullable=True),
sa.Column("event_reminders", sa.Boolean(), nullable=True),
sa.Column("prayer_requests", sa.Boolean(), nullable=True),
sa.Column("ministry_updates", sa.Boolean(), nullable=True),
sa.Column("donation_reminders", sa.Boolean(), nullable=True),
sa.Column("birthday_reminders", sa.Boolean(), nullable=True),
sa.Column("announcements", sa.Boolean(), nullable=True),
sa.ForeignKeyConstraint(
["user_id"],
["users.id"],
),
sa.PrimaryKeyConstraint("id"),
)
op.create_index(
op.f("ix_notification_settings_id"),
"notification_settings",
["id"],
unique=False,
)
# Create ministries table
op.create_table(
"ministries",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("name", sa.String(), nullable=False),
sa.Column("description", sa.Text(), nullable=True),
sa.Column("vision", sa.Text(), nullable=True),
sa.Column("mission", sa.Text(), nullable=True),
sa.Column("meeting_day", sa.String(), nullable=True),
sa.Column("meeting_time", sa.String(), nullable=True),
sa.Column("meeting_location", sa.String(), nullable=True),
sa.Column("leader_id", sa.Integer(), nullable=False),
sa.Column("is_active", sa.Boolean(), nullable=True),
sa.Column("created_at", sa.DateTime(), nullable=False),
sa.Column("updated_at", sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(
["leader_id"],
["users.id"],
),
sa.PrimaryKeyConstraint("id"),
)
op.create_index(op.f("ix_ministries_id"), "ministries", ["id"], unique=False)
# Create ministry_members table
op.create_table(
"ministry_members",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("ministry_id", sa.Integer(), nullable=False),
sa.Column("user_id", sa.Integer(), nullable=False),
sa.Column(
"role",
sa.Enum("LEADER", "CO_LEADER", "MEMBER", "VOLUNTEER", name="ministryrole"),
nullable=True,
),
sa.Column("joined_at", sa.DateTime(), nullable=False),
sa.Column("is_active", sa.Boolean(), nullable=True),
sa.ForeignKeyConstraint(
["ministry_id"],
["ministries.id"],
),
sa.ForeignKeyConstraint(
["user_id"],
["users.id"],
),
sa.PrimaryKeyConstraint("id"),
)
op.create_index(
op.f("ix_ministry_members_id"), "ministry_members", ["id"], unique=False
)
# Create ministry_activities table
op.create_table(
"ministry_activities",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("ministry_id", sa.Integer(), nullable=False),
sa.Column("title", sa.String(), nullable=False),
sa.Column("description", sa.Text(), nullable=True),
sa.Column("activity_date", sa.DateTime(), nullable=False),
sa.Column("location", sa.String(), nullable=True),
sa.Column("created_by", sa.Integer(), nullable=False),
sa.Column("created_at", sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(
["created_by"],
["users.id"],
),
sa.ForeignKeyConstraint(
["ministry_id"],
["ministries.id"],
),
sa.PrimaryKeyConstraint("id"),
)
op.create_index(
op.f("ix_ministry_activities_id"), "ministry_activities", ["id"], unique=False
)
# Create donations table
op.create_table(
"donations",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("donor_id", sa.Integer(), nullable=False),
sa.Column("amount", sa.Numeric(precision=10, scale=2), nullable=False),
sa.Column("currency", sa.String(), nullable=True),
sa.Column(
"donation_type",
sa.Enum(
"TITHE",
"OFFERING",
"SPECIAL_OFFERING",
"BUILDING_FUND",
"MISSIONS",
"CHARITY",
"OTHER",
name="donationtype",
),
nullable=False,
),
sa.Column(
"payment_method",
sa.Enum(
"CASH",
"CHECK",
"CARD",
"BANK_TRANSFER",
"MOBILE_MONEY",
"ONLINE",
name="paymentmethod",
),
nullable=False,
),
sa.Column("reference_number", sa.String(), nullable=True),
sa.Column("notes", sa.Text(), nullable=True),
sa.Column("is_anonymous", sa.Boolean(), nullable=True),
sa.Column("is_recurring", sa.Boolean(), nullable=True),
sa.Column("recurring_frequency", sa.String(), nullable=True),
sa.Column("next_due_date", sa.DateTime(), nullable=True),
sa.Column("donation_date", sa.DateTime(), nullable=False),
sa.Column("created_at", sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(
["donor_id"],
["users.id"],
),
sa.PrimaryKeyConstraint("id"),
)
op.create_index(op.f("ix_donations_id"), "donations", ["id"], unique=False)
# Create conversations table
op.create_table(
"conversations",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("participant_1_id", sa.Integer(), nullable=False),
sa.Column("participant_2_id", sa.Integer(), nullable=False),
sa.Column("created_at", sa.DateTime(), nullable=False),
sa.Column("updated_at", sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(
["participant_1_id"],
["users.id"],
),
sa.ForeignKeyConstraint(
["participant_2_id"],
["users.id"],
),
sa.PrimaryKeyConstraint("id"),
)
op.create_index(op.f("ix_conversations_id"), "conversations", ["id"], unique=False)
# Create messages table
op.create_table(
"messages",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("conversation_id", sa.Integer(), nullable=False),
sa.Column("sender_id", sa.Integer(), nullable=False),
sa.Column("receiver_id", sa.Integer(), nullable=False),
sa.Column(
"message_type",
sa.Enum("TEXT", "IMAGE", "FILE", name="messagetype"),
nullable=True,
),
sa.Column("content", sa.Text(), nullable=False),
sa.Column("file_url", sa.String(), nullable=True),
sa.Column("is_read", sa.Boolean(), nullable=True),
sa.Column("read_at", sa.DateTime(), nullable=True),
sa.Column("created_at", sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(
["conversation_id"],
["conversations.id"],
),
sa.ForeignKeyConstraint(
["receiver_id"],
["users.id"],
),
sa.ForeignKeyConstraint(
["sender_id"],
["users.id"],
),
sa.PrimaryKeyConstraint("id"),
)
op.create_index(op.f("ix_messages_id"), "messages", ["id"], unique=False)
# Create prayer_requests table
op.create_table(
"prayer_requests",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("requester_id", sa.Integer(), nullable=False),
sa.Column("title", sa.String(), nullable=False),
sa.Column("description", sa.Text(), nullable=False),
sa.Column(
"category",
sa.Enum(
"HEALTH",
"FAMILY",
"FINANCES",
"RELATIONSHIPS",
"WORK",
"SPIRITUAL",
"CHURCH",
"WORLD",
"OTHER",
name="prayercategory",
),
nullable=True,
),
sa.Column(
"privacy_level",
sa.Enum(
"PUBLIC",
"CONNECTIONS_ONLY",
"MINISTRY_ONLY",
"PRIVATE",
name="prayerprivacylevel",
),
nullable=True,
),
sa.Column(
"status",
sa.Enum("ACTIVE", "ANSWERED", "CLOSED", name="prayerstatus"),
nullable=True,
),
sa.Column("ministry_id", sa.Integer(), nullable=True),
sa.Column("is_anonymous", sa.Boolean(), nullable=True),
sa.Column("answer_description", sa.Text(), nullable=True),
sa.Column("answered_at", sa.DateTime(), nullable=True),
sa.Column("created_at", sa.DateTime(), nullable=False),
sa.Column("updated_at", sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(
["ministry_id"],
["ministries.id"],
),
sa.ForeignKeyConstraint(
["requester_id"],
["users.id"],
),
sa.PrimaryKeyConstraint("id"),
)
op.create_index(
op.f("ix_prayer_requests_id"), "prayer_requests", ["id"], unique=False
)
# Create prayers table
op.create_table(
"prayers",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("prayer_request_id", sa.Integer(), nullable=False),
sa.Column("prayer_warrior_id", sa.Integer(), nullable=False),
sa.Column("message", sa.Text(), nullable=True),
sa.Column("prayed_at", sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(
["prayer_request_id"],
["prayer_requests.id"],
),
sa.ForeignKeyConstraint(
["prayer_warrior_id"],
["users.id"],
),
sa.PrimaryKeyConstraint("id"),
)
op.create_index(op.f("ix_prayers_id"), "prayers", ["id"], unique=False)
# Create services table
op.create_table(
"services",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("title", sa.String(), nullable=False),
sa.Column("description", sa.Text(), nullable=True),
sa.Column(
"service_type",
sa.Enum(
"SUNDAY_SERVICE",
"BIBLE_STUDY",
"PRAYER_MEETING",
"YOUTH_SERVICE",
"WOMEN_MEETING",
"MEN_MEETING",
"SPECIAL_SERVICE",
"OTHER",
name="servicetype",
),
nullable=False,
),
sa.Column("service_date", sa.Date(), nullable=False),
sa.Column("start_time", sa.DateTime(), nullable=False),
sa.Column("end_time", sa.DateTime(), nullable=True),
sa.Column("location", sa.String(), nullable=True),
sa.Column("minister_id", sa.Integer(), nullable=True),
sa.Column("is_active", sa.Boolean(), nullable=True),
sa.Column("created_by", sa.Integer(), nullable=False),
sa.Column("created_at", sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(
["created_by"],
["users.id"],
),
sa.ForeignKeyConstraint(
["minister_id"],
["users.id"],
),
sa.PrimaryKeyConstraint("id"),
)
op.create_index(op.f("ix_services_id"), "services", ["id"], unique=False)
# Create attendance_records table
op.create_table(
"attendance_records",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("service_id", sa.Integer(), nullable=False),
sa.Column("user_id", sa.Integer(), nullable=False),
sa.Column(
"status",
sa.Enum("PRESENT", "ABSENT", "LATE", "EXCUSED", name="attendancestatus"),
nullable=True,
),
sa.Column("check_in_time", sa.DateTime(), nullable=True),
sa.Column("check_out_time", sa.DateTime(), nullable=True),
sa.Column("notes", sa.Text(), nullable=True),
sa.Column("recorded_by", sa.Integer(), nullable=False),
sa.Column("recorded_at", sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(
["recorded_by"],
["users.id"],
),
sa.ForeignKeyConstraint(
["service_id"],
["services.id"],
),
sa.ForeignKeyConstraint(
["user_id"],
["users.id"],
),
sa.PrimaryKeyConstraint("id"),
)
op.create_index(
op.f("ix_attendance_records_id"), "attendance_records", ["id"], unique=False
)
def downgrade() -> None:
op.drop_index(op.f("ix_attendance_records_id"), table_name="attendance_records")
op.drop_table("attendance_records")
op.drop_index(op.f("ix_services_id"), table_name="services")
op.drop_table("services")
op.drop_index(op.f("ix_prayers_id"), table_name="prayers")
op.drop_table("prayers")
op.drop_index(op.f("ix_prayer_requests_id"), table_name="prayer_requests")
op.drop_table("prayer_requests")
op.drop_index(op.f("ix_messages_id"), table_name="messages")
op.drop_table("messages")
op.drop_index(op.f("ix_conversations_id"), table_name="conversations")
op.drop_table("conversations")
op.drop_index(op.f("ix_donations_id"), table_name="donations")
op.drop_table("donations")
op.drop_index(op.f("ix_ministry_activities_id"), table_name="ministry_activities")
op.drop_table("ministry_activities")
op.drop_index(op.f("ix_ministry_members_id"), table_name="ministry_members")
op.drop_table("ministry_members")
op.drop_index(op.f("ix_ministries_id"), table_name="ministries")
op.drop_table("ministries")
op.drop_index(
op.f("ix_notification_settings_id"), table_name="notification_settings"
)
op.drop_table("notification_settings")
op.drop_index(op.f("ix_notifications_id"), table_name="notifications")
op.drop_table("notifications")