1+ from beanie import init_beanie , PydanticObjectId
2+ from motor .motor_asyncio import AsyncIOMotorClient
3+ from typing import Optional
4+ from pydantic import BaseSettings , BaseModel
5+
6+ from models .users import User
7+ from models .events import Event
8+
9+ class Settings (BaseSettings ):
10+ DATABASE_URL : Optional [str ] = None
11+
12+ async def initialize_database (self ):
13+ client = AsyncIOMotorClient (self .DATABASE_URL )
14+ await init_beanie (database = client .get_default_database (),
15+ document_models = [Event , User ])
16+
17+ class Config :
18+ env_file = ".env"
19+
20+
21+ class Database :
22+ def __init__ (self , model ):
23+ self .model = model
24+
25+ async def save (self , document ):
26+ await document .create ()
27+ return
28+
29+ async def get (self , id : PydanticObjectId ):
30+ doc = await self .model .get (id )
31+ if doc :
32+ return doc
33+ return False
34+
35+ async def get_all (self ):
36+ docs = await self .model .find_all ().to_list ()
37+ return docs
38+
39+ async def update (self , id : PydanticObjectId , body : BaseModel ):
40+ doc_id = id
41+ des_body = body .dict ()
42+
43+ des_body = {k :v for k ,v in des_body .items () if v is not None }
44+ update_query = {"$set" : {
45+ field : value for field , value in des_body .items ()
46+ }}
47+
48+ doc = await self .get (doc_id )
49+ if not doc :
50+ return False
51+ await doc .update (update_query )
52+ return doc
53+
54+ async def delete (self , id : PydanticObjectId ):
55+ doc = await self .get (id )
56+ if not doc :
57+ return False
58+ await doc .delete ()
59+ return True
0 commit comments