spark / cbh /api /account /db_requests.py
brestok's picture
Refactor account and call management features
6e16863
"""
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