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", "") 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() order_id = IntField() #Backup backup_cart_products = ListField(EmbeddedDocumentField(CartProduct), default=list) backup_status = StringField(choices=["pending", "confirmed", "failed"], default="pending") backup_confirmed_order = BooleanField() meta = { 'collection': 'chat_cart', 'strict': False } class StopSignal(Document): _id = ObjectIdField(primary_key=True, default=ObjectId) chat_history = ReferenceField(ChatHistory, required=True, reverse_delete_rule=2) is_stopped = BooleanField(default=False) created_at = DateTimeField(default=lambda: datetime.now(pytz.UTC)) stopped_at = DateTimeField() meta = { 'collection': 'stop_signal', 'strict': False, 'indexes': ['chat_history'] } from mongoengine import Document, StringField, DateTimeField, DictField class PaymentCallbackLog(Document): _id = ObjectIdField(primary_key=True, default=ObjectId) # Loại cổng thanh toán: momo, zalopay, vnpay,... type = StringField(required=True, choices=["momo", "zalopay", "vnpay"]) app_trans_id = StringField() # ZaloPay order_id = StringField() # MoMo txn_ref = StringField() # VNPAY raw_data = DictField() status = StringField(choices=["success", "fail", "error", "unknown"], default="unknown") created_at = DateTimeField(default=lambda: datetime.now(pytz.UTC)) is_refund = BooleanField() meta = { 'collection': 'payment_callback_logs', 'strict': False }