internal.auth.creation

Creates seller and consumer entities.

  1"""Creates seller and consumer entities."""
  2
  3from pydantic import BaseModel, EmailStr, SecretStr
  4from sqlalchemy.ext.asyncio import AsyncConnection
  5
  6from internal.queries.admin import AsyncQuerier as AdminQuerier
  7from internal.queries.admin import CreateAdminParams
  8from internal.queries.consumer import AsyncQuerier as ConsumerQuerier
  9from internal.queries.consumer import CreateConsumerParams
 10from internal.queries.models import Admin, Consumer, Seller, UserRole
 11from internal.queries.seller import AsyncQuerier as SellerQuerier
 12from internal.queries.seller import CreateSellerParams
 13from internal.queries.user import AsyncQuerier as UserQuerier
 14from internal.queries.user import CreateUserParams, CreateUserRow
 15
 16from .security import hash_password
 17
 18
 19async def create_user(
 20    username: str,
 21    email: EmailStr,
 22    password: SecretStr,
 23    role: UserRole,
 24    conn: AsyncConnection,
 25) -> CreateUserRow:
 26    """Create and insert base user entry.
 27
 28    Args:
 29      username: username for user
 30      email: users email
 31      password: users plain text password
 32      role: users role, seller or consumer
 33      conn: database connection
 34
 35    Returns:
 36      row from database with created users information
 37
 38    Raises:
 39      ValueError: if database failed to create user
 40    """
 41    pw_hash = hash_password(password.get_secret_value())
 42    user = await UserQuerier(conn).create_user(
 43        CreateUserParams(username=username, email=email, pw_hash=pw_hash, role=role)
 44    )
 45    if not user:
 46        raise ValueError("Failed to create user")
 47    return user
 48
 49
 50class CreateConsumerForm(BaseModel):
 51    """Form with information to create consumer."""
 52
 53    username: str
 54    email: EmailStr
 55    password: SecretStr
 56    first_name: str
 57    last_name: str
 58
 59
 60async def create_consumer(form: CreateConsumerForm, conn: AsyncConnection) -> Consumer:
 61    """Create and insert consumer and user entry.
 62
 63    Args:
 64      form: form with consumers information
 65      conn: database connection
 66
 67    Returns:
 68      row with created consumers information from the database
 69
 70    Raises:
 71      ValueError: if database failed to create consumer
 72    """
 73    user = await create_user(
 74        form.username, form.email, form.password, UserRole.CONSUMER, conn
 75    )
 76    consumer = await ConsumerQuerier(conn).create_consumer(
 77        CreateConsumerParams(
 78            user_id=user.user_id, fname=form.first_name, lname=form.last_name
 79        )
 80    )
 81    if not consumer:
 82        raise ValueError("Failed to create consumer")
 83    return consumer
 84
 85
 86class CreateSellerForm(BaseModel):
 87    """Form with information to create seller."""
 88
 89    username: str
 90    email: EmailStr
 91    password: SecretStr
 92    seller_name: str
 93    address_line1: str
 94    address_line2: str | None = None
 95    city: str
 96    post_code: str
 97    region: str | None = None
 98    country: str
 99    latitude: float
100    longitude: float
101
102
103async def create_seller(form: CreateSellerForm, conn: AsyncConnection) -> Seller:
104    """Creates and inserts seller and user entry.
105
106    Args:
107      form: form with information for seller creation
108      conn: database connection
109
110    Returns:
111     row with created sellers information from the database
112
113    Raises:
114      ValueError: database failed to create a seller
115    """
116    user = await create_user(
117        form.username, form.email, form.password, UserRole.SELLER, conn
118    )
119    seller = await SellerQuerier(conn).create_seller(
120        CreateSellerParams(
121            user_id=user.user_id,
122            seller_name=form.seller_name,
123            address_line1=form.address_line1,
124            address_line2=form.address_line2,
125            city=form.city,
126            post_code=form.post_code,
127            region=form.region,
128            country=form.country,
129            latitude=form.latitude,
130            longitude=form.longitude,
131        )
132    )
133    if not seller:
134        raise ValueError("Failed to create seller")
135    return seller
136
137
138class CreateAdminForm(BaseModel):
139    """Form with information to create admin."""
140
141    username: str
142    email: EmailStr
143    password: SecretStr
144    first_name: str
145    last_name: str
146
147
148async def create_admin(form: CreateAdminForm, conn: AsyncConnection) -> Admin:
149    """Create and insert admin and user entry.
150
151    Args:
152      form: form with admin information
153      conn: database connection
154
155    Returns:
156      row with created admin information from the database
157
158    Raises:
159      ValueError: if database failed to create admin
160    """
161    user = await create_user(
162        form.username, form.email, form.password, UserRole.ADMIN, conn
163    )
164    admin = await AdminQuerier(conn).create_admin(
165        CreateAdminParams(
166            user_id=user.user_id, fname=form.first_name, lname=form.last_name
167        )
168    )
169    if not admin:
170        raise ValueError("Failed to create admin")
171    return admin
async def create_user( username: str, email: pydantic.networks.EmailStr, password: pydantic.types.SecretStr, role: internal.queries.models.UserRole, conn: sqlalchemy.ext.asyncio.engine.AsyncConnection) -> internal.queries.user.CreateUserRow:
20async def create_user(
21    username: str,
22    email: EmailStr,
23    password: SecretStr,
24    role: UserRole,
25    conn: AsyncConnection,
26) -> CreateUserRow:
27    """Create and insert base user entry.
28
29    Args:
30      username: username for user
31      email: users email
32      password: users plain text password
33      role: users role, seller or consumer
34      conn: database connection
35
36    Returns:
37      row from database with created users information
38
39    Raises:
40      ValueError: if database failed to create user
41    """
42    pw_hash = hash_password(password.get_secret_value())
43    user = await UserQuerier(conn).create_user(
44        CreateUserParams(username=username, email=email, pw_hash=pw_hash, role=role)
45    )
46    if not user:
47        raise ValueError("Failed to create user")
48    return user

Create and insert base user entry.

Arguments:
  • username: username for user
  • email: users email
  • password: users plain text password
  • role: users role, seller or consumer
  • conn: database connection
Returns:

row from database with created users information

Raises:
  • ValueError: if database failed to create user
class CreateConsumerForm(pydantic.main.BaseModel):
51class CreateConsumerForm(BaseModel):
52    """Form with information to create consumer."""
53
54    username: str
55    email: EmailStr
56    password: SecretStr
57    first_name: str
58    last_name: str

Form with information to create consumer.

username: str = PydanticUndefined
email: pydantic.networks.EmailStr = PydanticUndefined
password: pydantic.types.SecretStr = PydanticUndefined
first_name: str = PydanticUndefined
last_name: str = PydanticUndefined
async def create_consumer( form: CreateConsumerForm, conn: sqlalchemy.ext.asyncio.engine.AsyncConnection) -> internal.queries.models.Consumer:
61async def create_consumer(form: CreateConsumerForm, conn: AsyncConnection) -> Consumer:
62    """Create and insert consumer and user entry.
63
64    Args:
65      form: form with consumers information
66      conn: database connection
67
68    Returns:
69      row with created consumers information from the database
70
71    Raises:
72      ValueError: if database failed to create consumer
73    """
74    user = await create_user(
75        form.username, form.email, form.password, UserRole.CONSUMER, conn
76    )
77    consumer = await ConsumerQuerier(conn).create_consumer(
78        CreateConsumerParams(
79            user_id=user.user_id, fname=form.first_name, lname=form.last_name
80        )
81    )
82    if not consumer:
83        raise ValueError("Failed to create consumer")
84    return consumer

Create and insert consumer and user entry.

Arguments:
  • form: form with consumers information
  • conn: database connection
Returns:

row with created consumers information from the database

Raises:
  • ValueError: if database failed to create consumer
class CreateSellerForm(pydantic.main.BaseModel):
 87class CreateSellerForm(BaseModel):
 88    """Form with information to create seller."""
 89
 90    username: str
 91    email: EmailStr
 92    password: SecretStr
 93    seller_name: str
 94    address_line1: str
 95    address_line2: str | None = None
 96    city: str
 97    post_code: str
 98    region: str | None = None
 99    country: str
100    latitude: float
101    longitude: float

Form with information to create seller.

username: str = PydanticUndefined
email: pydantic.networks.EmailStr = PydanticUndefined
password: pydantic.types.SecretStr = PydanticUndefined
seller_name: str = PydanticUndefined
address_line1: str = PydanticUndefined
address_line2: str | None = None
city: str = PydanticUndefined
post_code: str = PydanticUndefined
region: str | None = None
country: str = PydanticUndefined
latitude: float = PydanticUndefined
longitude: float = PydanticUndefined
async def create_seller( form: CreateSellerForm, conn: sqlalchemy.ext.asyncio.engine.AsyncConnection) -> internal.queries.models.Seller:
104async def create_seller(form: CreateSellerForm, conn: AsyncConnection) -> Seller:
105    """Creates and inserts seller and user entry.
106
107    Args:
108      form: form with information for seller creation
109      conn: database connection
110
111    Returns:
112     row with created sellers information from the database
113
114    Raises:
115      ValueError: database failed to create a seller
116    """
117    user = await create_user(
118        form.username, form.email, form.password, UserRole.SELLER, conn
119    )
120    seller = await SellerQuerier(conn).create_seller(
121        CreateSellerParams(
122            user_id=user.user_id,
123            seller_name=form.seller_name,
124            address_line1=form.address_line1,
125            address_line2=form.address_line2,
126            city=form.city,
127            post_code=form.post_code,
128            region=form.region,
129            country=form.country,
130            latitude=form.latitude,
131            longitude=form.longitude,
132        )
133    )
134    if not seller:
135        raise ValueError("Failed to create seller")
136    return seller

Creates and inserts seller and user entry.

Arguments:
  • form: form with information for seller creation
  • conn: database connection
Returns:

row with created sellers information from the database

Raises:
  • ValueError: database failed to create a seller
class CreateAdminForm(pydantic.main.BaseModel):
139class CreateAdminForm(BaseModel):
140    """Form with information to create admin."""
141
142    username: str
143    email: EmailStr
144    password: SecretStr
145    first_name: str
146    last_name: str

Form with information to create admin.

username: str = PydanticUndefined
email: pydantic.networks.EmailStr = PydanticUndefined
password: pydantic.types.SecretStr = PydanticUndefined
first_name: str = PydanticUndefined
last_name: str = PydanticUndefined
async def create_admin( form: CreateAdminForm, conn: sqlalchemy.ext.asyncio.engine.AsyncConnection) -> internal.queries.models.Admin:
149async def create_admin(form: CreateAdminForm, conn: AsyncConnection) -> Admin:
150    """Create and insert admin and user entry.
151
152    Args:
153      form: form with admin information
154      conn: database connection
155
156    Returns:
157      row with created admin information from the database
158
159    Raises:
160      ValueError: if database failed to create admin
161    """
162    user = await create_user(
163        form.username, form.email, form.password, UserRole.ADMIN, conn
164    )
165    admin = await AdminQuerier(conn).create_admin(
166        CreateAdminParams(
167            user_id=user.user_id, fname=form.first_name, lname=form.last_name
168        )
169    )
170    if not admin:
171        raise ValueError("Failed to create admin")
172    return admin

Create and insert admin and user entry.

Arguments:
  • form: form with admin information
  • conn: database connection
Returns:

row with created admin information from the database

Raises:
  • ValueError: if database failed to create admin