import os import asyncio import logging from aiogram import Bot, Dispatcher from aiogram.client.default import DefaultBotProperties from redis.asyncio import Redis from aiogram.client.session.aiohttp import AiohttpSession from config import BOT_TOKEN, REDIS_URL from handlers import admins_routers, client_routers from middlewares.di import DIMiddleware from middlewares.repository import RepositoryMiddleware from middlewares.session import DBSessionMiddleware from misc.redis import RedisClient from repositories.categories import CategoriesRepository from repositories.invoices import InvoiceRepository from repositories.order_items import OrderItemRepository from repositories.orders import OrderRepository from repositories.products import ProductRepository from services import OrderService from db.base import async_session from services.catalogue import CatalogueService logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger(__name__) os.makedirs("static/img", exist_ok=True) async def main(): dp = Dispatcher() aiohttp_session = AiohttpSession(proxy="http://127.0.0.1:2080") bot = Bot( token=BOT_TOKEN, default=DefaultBotProperties(parse_mode="HTML"), session=aiohttp_session, ) # DB services creation order_repository = OrderRepository() order_items_repository = OrderItemRepository() order_service = OrderService(order_repository, order_items_repository) category_repository = CategoriesRepository() product_repository = ProductRepository() catalogue_service = CatalogueService(product_repository, category_repository) invoice_repository = InvoiceRepository() # Additional Initiations r = Redis.from_url(REDIS_URL) redis_client = RedisClient(r) # DI Middleware Init dp.update.middleware(DIMiddleware(order_service, catalogue_service, redis_client)) dp.update.middleware(DBSessionMiddleware(async_session)) dp.update.middleware( RepositoryMiddleware( order_repository, category_repository, product_repository, order_items_repository, invoice_repository, ) ) for ar in admins_routers: dp.include_router(ar) for cr in client_routers: dp.include_router(cr) await dp.start_polling(bot) if __name__ == "__main__": asyncio.run(main())