| """ |
| Account database requests. |
| """ |
|
|
| import re |
| from datetime import datetime |
|
|
| from cbh.api.account.dto import AccountStatus |
| from cbh.api.account.models import AccountModel |
| from cbh.api.account.schemas import AccountFilter, UpdateAccountRequest |
| from cbh.api.common.db_requests import get_all_objs, get_obj_by_id |
| from cbh.api.common.schemas import FilterRequest |
| from cbh.core.config import settings |
|
|
|
|
| async def update_own_account_obj( |
| request: UpdateAccountRequest, account: AccountModel |
| ) -> AccountModel: |
| """ |
| Update own account. |
| """ |
| account.name = request.name |
| account.bio = request.bio |
| account.datetimeUpdated = datetime.now() |
| await settings.DB_CLIENT.accounts.update_one( |
| {"id": account.id}, |
| {"$set": account.to_mongo()}, |
| ) |
| return account |
|
|
|
|
| async def update_account_picture_obj( |
| account: AccountModel, picture_s3: str |
| ) -> AccountModel: |
| """ |
| Update account picture. |
| """ |
| account.pictureUrl = picture_s3 |
| account.datetimeUpdated = datetime.now() |
| await settings.DB_CLIENT.accounts.update_one( |
| {"id": account.id}, {"$set": account.to_mongo()} |
| ) |
| return AccountModel(**account.to_mongo()) |
|
|
|
|
| async def filter_accounts_objs( |
| request: FilterRequest[AccountFilter], |
| ) -> tuple[list[AccountModel], int]: |
| """ |
| Filter accounts. |
| """ |
| filters = {} |
| if request.filter.accountTypes: |
| filters["accountType"] = {"$in": request.filter.accountTypes} |
| if request.filter.searchTerm: |
| content = f"^{re.escape(request.filter.searchTerm)}" |
| filters["$or"] = [ |
| {"name": {"$regex": content, "$options": "i"}}, |
| {"email": {"$regex": content, "$options": "i"}}, |
| ] |
| if request.filter.statuses: |
| filters["status"] = {"$in": request.filter.statuses} |
| if request.filter.opportunities: |
| filters["opportunity"] = {"$in": request.filter.opportunities} |
| if request.sortBy: |
| sort = (request.sortBy.name, request.sortBy.order.value) |
| else: |
| sort = ("id", -1) |
| accounts, total_count = await get_all_objs( |
| AccountModel, |
| request.pageSize, |
| request.pageIndex, |
| additional_filter=filters, |
| sort=sort, |
| ) |
| return accounts, total_count |
|
|
|
|
| async def update_account_status_obj( |
| accountId: str, status: AccountStatus |
| ) -> AccountModel: |
| """ |
| Update account status. |
| """ |
| account = await get_obj_by_id(AccountModel, accountId) |
| account.status = status |
| account.datetimeUpdated = datetime.now() |
| await settings.DB_CLIENT.accounts.update_one( |
| {"id": accountId}, {"$set": account.to_mongo()} |
| ) |
| return account |
|
|