"""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")