from uuid import uuid4, UUID, uuid7 from sqlmodel import SQLModel, Field from authlib.integrations.sqla_oauth2 import OAuth2ClientMixin, OAuth2AuthorizationCodeMixin, OAuth2TokenMixin from authentication.utils import bcrypt_sha256_hash class BaseModel(SQLModel): id: UUID | None = Field(primary_key=True, default_factory=uuid7) class User(BaseModel, table=True): username: str = Field(unique=True, index=True) password: str = Field(nullable=False) email: str def set_password(self, value): self.password = bcrypt_sha256_hash(value) class ClientApplication(BaseModel, OAuth2ClientMixin, table=True): name: str class AuthCode(BaseModel, OAuth2AuthorizationCodeMixin, table=True): user_id: UUID = Field(foreign_key="user.id", ondelete="CASCADE") class AuthToken(BaseModel, OAuth2TokenMixin, table=True): user_id: UUID = Field(foreign_key="user.id", ondelete="CASCADE")