
- User authentication with JWT tokens - Trip management with itineraries - Destination database with search functionality - Booking management for flights, hotels, car rentals, activities - SQLite database with Alembic migrations - Health monitoring endpoint - CORS enabled for all origins - Complete API documentation at /docs and /redoc - Environment variable support for SECRET_KEY Requirements for production: - Set SECRET_KEY environment variable
181 lines
6.8 KiB
Python
181 lines
6.8 KiB
Python
"""Initial migration
|
|
|
|
Revision ID: 001
|
|
Revises:
|
|
Create Date: 2024-01-01 00:00:00.000000
|
|
|
|
"""
|
|
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
|
|
# revision identifiers, used by Alembic.
|
|
revision = "001"
|
|
down_revision = None
|
|
branch_labels = None
|
|
depends_on = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
# Create users table
|
|
op.create_table(
|
|
"users",
|
|
sa.Column("id", sa.Integer(), nullable=False),
|
|
sa.Column("email", sa.String(), nullable=False),
|
|
sa.Column("username", sa.String(), nullable=False),
|
|
sa.Column("full_name", sa.String(), nullable=False),
|
|
sa.Column("hashed_password", sa.String(), nullable=False),
|
|
sa.Column("is_active", sa.Boolean(), nullable=True),
|
|
sa.Column(
|
|
"created_at",
|
|
sa.DateTime(timezone=True),
|
|
server_default=sa.text("(CURRENT_TIMESTAMP)"),
|
|
nullable=True,
|
|
),
|
|
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=True),
|
|
sa.PrimaryKeyConstraint("id"),
|
|
)
|
|
op.create_index(op.f("ix_users_email"), "users", ["email"], unique=True)
|
|
op.create_index(op.f("ix_users_id"), "users", ["id"], unique=False)
|
|
op.create_index(op.f("ix_users_username"), "users", ["username"], unique=True)
|
|
|
|
# Create destinations table
|
|
op.create_table(
|
|
"destinations",
|
|
sa.Column("id", sa.Integer(), nullable=False),
|
|
sa.Column("name", sa.String(), nullable=False),
|
|
sa.Column("country", sa.String(), nullable=False),
|
|
sa.Column("city", sa.String(), nullable=False),
|
|
sa.Column("description", sa.Text(), nullable=True),
|
|
sa.Column("latitude", sa.Numeric(precision=10, scale=8), nullable=True),
|
|
sa.Column("longitude", sa.Numeric(precision=11, scale=8), nullable=True),
|
|
sa.Column("category", sa.String(), nullable=True),
|
|
sa.Column("rating", sa.Numeric(precision=3, scale=2), nullable=True),
|
|
sa.Column("image_url", sa.String(), nullable=True),
|
|
sa.Column(
|
|
"created_at",
|
|
sa.DateTime(timezone=True),
|
|
server_default=sa.text("(CURRENT_TIMESTAMP)"),
|
|
nullable=True,
|
|
),
|
|
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=True),
|
|
sa.PrimaryKeyConstraint("id"),
|
|
)
|
|
op.create_index(op.f("ix_destinations_id"), "destinations", ["id"], unique=False)
|
|
op.create_index(
|
|
op.f("ix_destinations_name"), "destinations", ["name"], unique=False
|
|
)
|
|
|
|
# Create trips table
|
|
op.create_table(
|
|
"trips",
|
|
sa.Column("id", sa.Integer(), nullable=False),
|
|
sa.Column("title", sa.String(), nullable=False),
|
|
sa.Column("description", sa.Text(), nullable=True),
|
|
sa.Column("start_date", sa.DateTime(), nullable=False),
|
|
sa.Column("end_date", sa.DateTime(), nullable=False),
|
|
sa.Column("budget", sa.Numeric(precision=10, scale=2), nullable=True),
|
|
sa.Column("status", sa.String(), nullable=True),
|
|
sa.Column("user_id", sa.Integer(), nullable=False),
|
|
sa.Column(
|
|
"created_at",
|
|
sa.DateTime(timezone=True),
|
|
server_default=sa.text("(CURRENT_TIMESTAMP)"),
|
|
nullable=True,
|
|
),
|
|
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=True),
|
|
sa.ForeignKeyConstraint(
|
|
["user_id"],
|
|
["users.id"],
|
|
),
|
|
sa.PrimaryKeyConstraint("id"),
|
|
)
|
|
op.create_index(op.f("ix_trips_id"), "trips", ["id"], unique=False)
|
|
|
|
# Create bookings table
|
|
op.create_table(
|
|
"bookings",
|
|
sa.Column("id", sa.Integer(), nullable=False),
|
|
sa.Column("booking_type", sa.String(), nullable=False),
|
|
sa.Column("reference_number", sa.String(), nullable=False),
|
|
sa.Column("provider", sa.String(), nullable=False),
|
|
sa.Column("description", sa.Text(), nullable=True),
|
|
sa.Column("start_date", sa.DateTime(), nullable=False),
|
|
sa.Column("end_date", sa.DateTime(), nullable=True),
|
|
sa.Column("total_amount", sa.Numeric(precision=10, scale=2), nullable=False),
|
|
sa.Column("currency", sa.String(), nullable=True),
|
|
sa.Column("status", sa.String(), nullable=True),
|
|
sa.Column("booking_details", sa.Text(), nullable=True),
|
|
sa.Column("user_id", sa.Integer(), nullable=False),
|
|
sa.Column("trip_id", sa.Integer(), nullable=True),
|
|
sa.Column(
|
|
"created_at",
|
|
sa.DateTime(timezone=True),
|
|
server_default=sa.text("(CURRENT_TIMESTAMP)"),
|
|
nullable=True,
|
|
),
|
|
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=True),
|
|
sa.ForeignKeyConstraint(
|
|
["trip_id"],
|
|
["trips.id"],
|
|
),
|
|
sa.ForeignKeyConstraint(
|
|
["user_id"],
|
|
["users.id"],
|
|
),
|
|
sa.PrimaryKeyConstraint("id"),
|
|
)
|
|
op.create_index(op.f("ix_bookings_id"), "bookings", ["id"], unique=False)
|
|
op.create_index(
|
|
op.f("ix_bookings_reference_number"),
|
|
"bookings",
|
|
["reference_number"],
|
|
unique=True,
|
|
)
|
|
|
|
# Create itineraries table
|
|
op.create_table(
|
|
"itineraries",
|
|
sa.Column("id", sa.Integer(), nullable=False),
|
|
sa.Column("trip_id", sa.Integer(), nullable=False),
|
|
sa.Column("destination_id", sa.Integer(), nullable=False),
|
|
sa.Column("day_number", sa.Integer(), nullable=False),
|
|
sa.Column("activity", sa.String(), nullable=False),
|
|
sa.Column("description", sa.Text(), nullable=True),
|
|
sa.Column("start_time", sa.DateTime(), nullable=True),
|
|
sa.Column("end_time", sa.DateTime(), nullable=True),
|
|
sa.Column(
|
|
"created_at",
|
|
sa.DateTime(timezone=True),
|
|
server_default=sa.text("(CURRENT_TIMESTAMP)"),
|
|
nullable=True,
|
|
),
|
|
sa.ForeignKeyConstraint(
|
|
["destination_id"],
|
|
["destinations.id"],
|
|
),
|
|
sa.ForeignKeyConstraint(
|
|
["trip_id"],
|
|
["trips.id"],
|
|
),
|
|
sa.PrimaryKeyConstraint("id"),
|
|
)
|
|
op.create_index(op.f("ix_itineraries_id"), "itineraries", ["id"], unique=False)
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.drop_index(op.f("ix_itineraries_id"), table_name="itineraries")
|
|
op.drop_table("itineraries")
|
|
op.drop_index(op.f("ix_bookings_reference_number"), table_name="bookings")
|
|
op.drop_index(op.f("ix_bookings_id"), table_name="bookings")
|
|
op.drop_table("bookings")
|
|
op.drop_index(op.f("ix_trips_id"), table_name="trips")
|
|
op.drop_table("trips")
|
|
op.drop_index(op.f("ix_destinations_name"), table_name="destinations")
|
|
op.drop_index(op.f("ix_destinations_id"), table_name="destinations")
|
|
op.drop_table("destinations")
|
|
op.drop_index(op.f("ix_users_username"), table_name="users")
|
|
op.drop_index(op.f("ix_users_id"), table_name="users")
|
|
op.drop_index(op.f("ix_users_email"), table_name="users")
|
|
op.drop_table("users")
|