from mongoengine import ( Document, StringField, ReferenceField, DateTimeField, BooleanField, ObjectIdField,EmbeddedDocumentField ) from datetime import datetime import pytz from mongoengine import connect import os from dotenv import load_dotenv load_dotenv() MONGO_URI = os.getenv("MONGO_URI", "mongodb+srv://kltn20133118:XEYSVzYvEwsp5Cvo@cluster0.nnsw9.mongodb.net/?retryWrites=true&w=majority&appName=Cluster0") def init_db(db_name="chatbot_hmdrinks"): connect(db_name, host=MONGO_URI) from mongoengine import Document, StringField, IntField,ListField class User(Document): _id = ObjectIdField(required=True, primary_key=True) user_name = StringField(required=True, max_length=255) user_id = IntField(unique=True, required=True) is_deleted = BooleanField(default=False) date_deleted = DateTimeField(default=None) meta = {'collection': 'users'} class ChatHistory(Document): _id = ObjectIdField(required=True, primary_key=True) user = ReferenceField(User, required=True, reverse_delete_rule=2) name_chat = StringField(required=True, unique=True, max_length=255) is_deleted = BooleanField(default=False) date_deleted = DateTimeField(default=None) meta = {'collection': 'chat_history'} from bson import ObjectId from mongoengine import EmbeddedDocument, StringField, IntField, FloatField class CartProduct(EmbeddedDocument): name = StringField() quantity = IntField(min_value=1, default=1) size = StringField() class DetailChat(Document): _id = ObjectIdField(required=True, primary_key=True,default=ObjectId) chat_history = ReferenceField(ChatHistory, required=True, reverse_delete_rule=2) you_message = StringField() ai_message = StringField() data_relevant = StringField() full_input = StringField() source_file = StringField() cart_id = IntField() confirmed_order = BooleanField(default=False) timestamp = DateTimeField(default=lambda: datetime.now(pytz.UTC)) is_deleted = BooleanField(default=False) date_deleted = DateTimeField(default=lambda: datetime.now(pytz.UTC)) meta = {'collection': 'detail_chat', 'strict': False } class ChatCart(Document): _id = ObjectIdField(primary_key=True, default=ObjectId) chat_history = ReferenceField(ChatHistory, required=True, reverse_delete_rule=2) created_from_detail_chat = ReferenceField(DetailChat) # Để biết cart được tạo từ đoạn chat nào cart_products = ListField(EmbeddedDocumentField(CartProduct), default=list) status = StringField(choices=["pending", "confirmed", "failed"], default="pending") confirmed_order = BooleanField(default=False) created_at = DateTimeField(default=lambda: datetime.now(pytz.UTC)) confirmed_at = DateTimeField() note = StringField() cart_id = IntField() meta = { 'collection': 'chat_cart', 'strict': False }