MukeshKapoor25's picture
feat: Implement Trade Returns Database Schema and E2E Testing
c0b58c9
"""
Database initialization utilities.
Creates indexes and sets up collections for the SCM microservice.
"""
from app.core.logging import get_logger
from app.nosql import get_database
from app.merchants.constants import SCM_MERCHANTS_COLLECTION
from app.employees.constants import SCM_EMPLOYEES_COLLECTION
from app.access_roles.constants import SCM_ROLES_COLLECTION
from app.core.constants import SCM_AUTH_LOGS_COLLECTION
from app.sales.constants import SCM_SALES_ORDERS_COLLECTION, SCM_RMA_COLLECTION, SCM_CREDIT_NOTES_COLLECTION
logger = get_logger(__name__)
async def create_indexes():
"""
Create all required database indexes.
Should be called during application startup.
"""
try:
logger.info("Creating database indexes")
# Merchants collection indexes
await get_database()[SCM_MERCHANTS_COLLECTION].create_index("merchant_id", unique=True)
await get_database()[SCM_MERCHANTS_COLLECTION].create_index("merchant_name", unique=True)
await get_database()[SCM_MERCHANTS_COLLECTION].create_index("merchant_type")
await get_database()[SCM_MERCHANTS_COLLECTION].create_index("contact_email")
logger.info(f"Created indexes for {SCM_MERCHANTS_COLLECTION}")
# Employees collection indexes
await get_database()[SCM_EMPLOYEES_COLLECTION].create_index("associate_id", unique=True)
await get_database()[SCM_EMPLOYEES_COLLECTION].create_index("email", unique=True)
await get_database()[SCM_EMPLOYEES_COLLECTION].create_index("mobile", unique=True)
await get_database()[SCM_EMPLOYEES_COLLECTION].create_index("merchant_id")
await get_database()[SCM_EMPLOYEES_COLLECTION].create_index([
("merchant_id", 1),
("role_id", 1)
])
logger.info(f"Created indexes for {SCM_EMPLOYEES_COLLECTION}")
# Roles collection indexes
await get_database()[SCM_ROLES_COLLECTION].create_index([
("merchant_id", 1),
("role_id", 1)
], unique=True)
await get_database()[SCM_ROLES_COLLECTION].create_index("merchant_id")
logger.info(f"Created indexes for {SCM_ROLES_COLLECTION}")
# Auth logs collection indexes
await get_database()[SCM_AUTH_LOGS_COLLECTION].create_index([
("merchant_id", 1),
("timestamp", -1)
])
await get_database()[SCM_AUTH_LOGS_COLLECTION].create_index([
("associate_id", 1),
("timestamp", -1)
])
await get_database()[SCM_AUTH_LOGS_COLLECTION].create_index("event_type")
# TTL index for 90-day retention (7776000 seconds)
await get_database()[SCM_AUTH_LOGS_COLLECTION].create_index(
"timestamp",
expireAfterSeconds=7776000
)
logger.info(f"Created indexes for {SCM_AUTH_LOGS_COLLECTION}")
# Sales orders collection indexes
await get_database()[SCM_SALES_ORDERS_COLLECTION].create_index("sales_order_id", unique=True)
await get_database()[SCM_SALES_ORDERS_COLLECTION].create_index("order_number", unique=True)
await get_database()[SCM_SALES_ORDERS_COLLECTION].create_index("merchant_id")
await get_database()[SCM_SALES_ORDERS_COLLECTION].create_index("branch_id")
await get_database()[SCM_SALES_ORDERS_COLLECTION].create_index("status")
await get_database()[SCM_SALES_ORDERS_COLLECTION].create_index("order_date")
await get_database()[SCM_SALES_ORDERS_COLLECTION].create_index("customer.customer_id")
await get_database()[SCM_SALES_ORDERS_COLLECTION].create_index([
("merchant_id", 1),
("order_date", -1)
])
logger.info(f"Created indexes for {SCM_SALES_ORDERS_COLLECTION}")
logger.info("All database indexes created successfully")
except Exception as e:
logger.error("Failed to create database indexes", exc_info=e)
raise
async def drop_indexes():
"""
Drop all indexes (useful for testing).
"""
try:
logger.warning("Dropping all database indexes")
await get_database()[SCM_MERCHANTS_COLLECTION].drop_indexes()
await get_database()[SCM_EMPLOYEES_COLLECTION].drop_indexes()
await get_database()[SCM_ROLES_COLLECTION].drop_indexes()
await get_database()[SCM_AUTH_LOGS_COLLECTION].drop_indexes()
await get_database()[SCM_SALES_ORDERS_COLLECTION].drop_indexes()
logger.info("All database indexes dropped")
except Exception as e:
logger.error("Failed to drop database indexes", exc_info=e)
raise