spark / cbh /api /events /db_requests.py
brestok's picture
fix
de68a47
from datetime import datetime
from cbh.api.account.models import AccountModel, AccountShorten
from cbh.api.common.db_requests import get_all_objs
from cbh.api.common.schemas import FilterRequest
from cbh.api.events.dto import EventType
from cbh.api.events.models import EventModel
from cbh.api.events.schemas import CreateEventRequest, EventFilter
from cbh.core.config import settings
async def create_event_obj(
event: CreateEventRequest, account: AccountModel
) -> EventModel:
"""
Create a new event.
"""
event = EventModel(
reason=event.reason,
type=EventType.CUSTOM,
startDate=event.startDate,
endDate=event.endDate,
coach=AccountShorten(**account.model_dump()),
)
await settings.DB_CLIENT.events.insert_one(event.to_mongo())
return event
async def filter_events_objs(
request: FilterRequest[EventFilter],
account: AccountModel,
) -> tuple[list[EventModel], int]:
filters = {"isActive": True, "coach.id": account.id, "type": EventType.CUSTOM.value}
if request.filter.startDate:
start_dt = datetime.combine(
request.filter.startDate, datetime.min.time()
).isoformat()
filters["startDate"] = {"$gte": start_dt}
if request.filter.endDate:
end_dt = datetime.combine(
request.filter.endDate, datetime.max.time()
).isoformat()
filters["endDate"] = {"$lte": end_dt}
if request.filter.searchTerm:
filters["$or"] = [
{"reason": {"$regex": request.filter.searchTerm, "$options": "i"}},
]
sorting = ("_id", -1)
if request.sortBy:
sorting = (request.sortBy.name, request.sortBy.order.value)
events, total_count = await get_all_objs(
EventModel,
request.pageSize,
request.pageIndex,
additional_filter=filters,
sort=sorting,
)
return events, total_count