brestok commited on
Commit
faa9d54
·
1 Parent(s): 40749a1

Add user registration endpoint and role support

Browse files

Introduced a new `/register` endpoint to handle user registration, allowing email, password, and role input. Added a `role` field to `AccountModel` and implemented database logic to ensure unique email constraints during registration.

trauma/api/account/model.py CHANGED
@@ -10,6 +10,7 @@ from trauma.core.database import MongoBaseModel
10
  class AccountModel(MongoBaseModel):
11
  email: EmailStr
12
  password: str | None = Field(exclude=True, default=None)
 
13
  accountType: AccountType = AccountType.User
14
 
15
  datetimeInserted: datetime = Field(default_factory=datetime.now)
 
10
  class AccountModel(MongoBaseModel):
11
  email: EmailStr
12
  password: str | None = Field(exclude=True, default=None)
13
+ role: str | None = None
14
  accountType: AccountType = AccountType.User
15
 
16
  datetimeInserted: datetime = Field(default_factory=datetime.now)
trauma/api/account/views.py CHANGED
@@ -41,6 +41,7 @@ async def create_account(
41
  account = await create_account_obj(account_data)
42
  return AccountWrapper(data=account)
43
 
 
44
  @account_router.delete('/{accountId}')
45
  async def update_account(
46
  accountId: str,
 
41
  account = await create_account_obj(account_data)
42
  return AccountWrapper(data=account)
43
 
44
+
45
  @account_router.delete('/{accountId}')
46
  async def update_account(
47
  accountId: str,
trauma/api/security/db_requests.py CHANGED
@@ -1,7 +1,8 @@
1
  from fastapi import HTTPException
2
 
3
  from trauma.api.account.model import AccountModel
4
- from trauma.api.security.schemas import LoginAccountRequest
 
5
  from trauma.core.config import settings
6
  from trauma.core.security import verify_password
7
 
@@ -18,3 +19,14 @@ async def authenticate_account(data: LoginAccountRequest) -> AccountModel:
18
  if not verify_password(data.password, account.password):
19
  raise HTTPException(status_code=401, detail="Invalid email or password.")
20
  return account
 
 
 
 
 
 
 
 
 
 
 
 
1
  from fastapi import HTTPException
2
 
3
  from trauma.api.account.model import AccountModel
4
+ from trauma.api.common.db_requests import check_unique_fields_existence
5
+ from trauma.api.security.schemas import LoginAccountRequest, RegisterAccountRequest
6
  from trauma.core.config import settings
7
  from trauma.core.security import verify_password
8
 
 
19
  if not verify_password(data.password, account.password):
20
  raise HTTPException(status_code=401, detail="Invalid email or password.")
21
  return account
22
+
23
+
24
+ async def register_account(data: RegisterAccountRequest) -> AccountModel:
25
+ await check_unique_fields_existence("email", data.email)
26
+ account = AccountModel(
27
+ email=data.email,
28
+ password=data.password,
29
+ role=data.role,
30
+ )
31
+ await settings.DB_CLIENT.accounts.insert_one(account.to_mongo())
32
+ return account
trauma/api/security/schemas.py CHANGED
@@ -17,3 +17,8 @@ class LoginAccountResponse(BaseModel):
17
 
18
  class LoginAccountWrapper(TraumaResponseWrapper[LoginAccountResponse]):
19
  pass
 
 
 
 
 
 
17
 
18
  class LoginAccountWrapper(TraumaResponseWrapper[LoginAccountResponse]):
19
  pass
20
+
21
+ class RegisterAccountRequest(BaseModel):
22
+ email: EmailStr
23
+ password: str
24
+ role: str
trauma/api/security/views.py CHANGED
@@ -1,10 +1,12 @@
1
  from trauma.api.account.dto import AccessToken
 
2
  from trauma.api.security import security_router
3
- from trauma.api.security.db_requests import authenticate_account
4
  from trauma.api.security.schemas import (LoginAccountResponse,
5
  LoginAccountWrapper,
6
- LoginAccountRequest)
7
  from trauma.core.security import create_access_token
 
8
 
9
 
10
  @security_router.post('/login')
@@ -16,3 +18,9 @@ async def login(data: LoginAccountRequest) -> LoginAccountWrapper:
16
  account=account,
17
  )
18
  return LoginAccountWrapper(data=response)
 
 
 
 
 
 
 
1
  from trauma.api.account.dto import AccessToken
2
+ from trauma.api.account.model import AccountModel
3
  from trauma.api.security import security_router
4
+ from trauma.api.security.db_requests import authenticate_account, register_account
5
  from trauma.api.security.schemas import (LoginAccountResponse,
6
  LoginAccountWrapper,
7
+ LoginAccountRequest, RegisterAccountRequest)
8
  from trauma.core.security import create_access_token
9
+ from trauma.core.wrappers import TraumaResponseWrapper
10
 
11
 
12
  @security_router.post('/login')
 
18
  account=account,
19
  )
20
  return LoginAccountWrapper(data=response)
21
+
22
+
23
+ @security_router.post('/register')
24
+ async def register(data: RegisterAccountRequest) -> TraumaResponseWrapper[AccountModel]:
25
+ account = await register_account(data)
26
+ return TraumaResponseWrapper(data=account)