Spaces:
Sleeping
Sleeping
Add user registration endpoint and role support
Browse filesIntroduced 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.
|
|
|
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)
|