| from pydantic import BaseModel, EmailStr, Field |
| from typing import Optional |
| from motor.motor_asyncio import AsyncIOMotorDatabase |
| from utils.email_utils import send_preorder_notification_to_owner |
|
|
| class PreOrderRequest(BaseModel): |
| name: str = Field(..., max_length=100) |
| phone: str = Field(..., max_length=20) |
| gmail: EmailStr = Field(..., description="Gmail address") |
| message: str | None = None |
|
|
| import datetime |
|
|
| async def create_preorder(db: AsyncIOMotorDatabase, data: PreOrderRequest): |
| preorder = data.dict() |
| preorder["created_at"] = datetime.datetime.utcnow().isoformat() |
| result = await db["preorders"].insert_one(preorder) |
| |
| await send_preorder_notification_to_owner( |
| name=preorder["name"], |
| phone=preorder["phone"], |
| gmail=preorder["gmail"], |
| message=preorder.get("message", "") |
| ) |
| return str(result.inserted_id) |
|
|
| async def get_all_preorders(db: AsyncIOMotorDatabase): |
| preorders = [] |
| cursor = db["preorders"].find({}) |
| async for doc in cursor: |
| doc["_id"] = str(doc["_id"]) |
| if "created_at" not in doc: |
| doc["created_at"] = "" |
| preorders.append(doc) |
| return preorders |
|
|
| async def get_preorder_count(db: AsyncIOMotorDatabase): |
| return await db["preorders"].count_documents({}) |
|
|
| async def delete_preorder(db: AsyncIOMotorDatabase, preorder_id: str): |
| from bson import ObjectId |
| result = await db["preorders"].delete_one({"_id": ObjectId(preorder_id)}) |
| return result.deleted_count |
|
|
| async def update_preorder_status(db: AsyncIOMotorDatabase, preorder_id: str, status: str): |
| from bson import ObjectId |
| |
| if status not in ["pending", "contacted", "completed"]: |
| raise ValueError("Invalid status") |
| result = await db["preorders"].update_one( |
| {"_id": ObjectId(preorder_id)}, |
| {"$set": {"status": status}} |
| ) |
| return result.modified_count |
|
|