diff --git a/slopserver/alembic/versions/12eca4bad288_user_table.py b/slopserver/alembic/versions/12eca4bad288_user_table.py new file mode 100644 index 0000000..81467bc --- /dev/null +++ b/slopserver/alembic/versions/12eca4bad288_user_table.py @@ -0,0 +1,42 @@ +"""user table + +Revision ID: 12eca4bad288 +Revises: 72dcd047d7bf +Create Date: 2025-10-17 20:26:00.002707 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +import sqlmodel.sql.sqltypes + + +# revision identifiers, used by Alembic. +revision: str = '12eca4bad288' +down_revision: Union[str, Sequence[str], None] = '72dcd047d7bf' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('user', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('email', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('password_hash', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('salt', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('email_verified', sa.Boolean(), nullable=False), + sa.PrimaryKeyConstraint('id', name=op.f('pk_user')) + ) + op.create_index(op.f('ix_user_email'), 'user', ['email'], unique=True) + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_index(op.f('ix_user_email'), table_name='user') + op.drop_table('user') + # ### end Alembic commands ### diff --git a/slopserver/models.py b/slopserver/models.py index 126ae7c..89403aa 100644 --- a/slopserver/models.py +++ b/slopserver/models.py @@ -22,4 +22,12 @@ class Path(SQLModel, table=True): path: str domain_id: int = Field(foreign_key="domain.id") - domain: Domain = Relationship(back_populates="paths") \ No newline at end of file + domain: Domain = Relationship(back_populates="paths") + +class User(SQLModel, table=True): + id: int | None = Field(default=None, primary_key=True) + email: str = Field(index=True, unique=True) + password_hash: str + salt: str + + email_verified: bool = Field(default=False)