from typing import Optional
from datetime import datetime
from uuid import UUID, uuid4
from beanie import Document, Indexed, Link, before_event, Replace, Insert
from pydantic import Field
from .user_model import User
class Task(Document):
task_id: UUID = Field(default_factory=uuid4, unique=True)
status: bool = False
title: Indexed(str)
description: Indexed(str)
created_at: datetime = Field(default_factory=datetime.utcnow)
updadet_at: datetime = Field(default_factory=datetime.utcnow)
owner: Link[User]
def __repr__(self) -> str:
return f'Task {self.title}'
def __str__(self) -> str:
return self.title
def __hash__(self) -> int:
return hash(self.title)
def __eq__(self, other: object) -> bool:
if isinstance(other, Task):
return self.task_id == other.task_id
return False
@before_event([Replace, Insert])
def sync_update_at(self):
self.updadet_at = datetime.utcnow()
from fastapi import FastAPI
from core.config import settings
from beanie import init_beanie
from motor.motor_asyncio import AsyncIOMotorClient
from api.api_v1.router import router
from models.user_model import User
from models.task_model import Task
app = FastAPI(
title=settings.PROJECT_NAME,
openapi_url=f'{settings.API_V1_STR}/openapi.json'
)
@app.on_event('startup')
async def app_init():
client_db = AsyncIOMotorClient(
settings.MONGO_CONNECTION_STRING).todoapp
await init_beanie(
database=client_db,
document_models=[
User,
Task
]
)
app.include_router(
router,
prefix=settings.API_V1_STR
)