from loguru import logger from typing import Type, TypeVar from asyncpg.connection import Connection class BaseRepo: def __init__(self, conn: Connection): self.conn = conn T = TypeVar('T', bound=BaseRepo) class Repos(BaseRepo): def get_repo(self, Repo: Type[T]) -> T: return Repo(self.conn) class UserRepo(BaseRepo): async def add(self, user_id: int, chat_id: int): await self.conn.execute( "INSERT INTO users (user_id, chat_id) " "VALUES ($1, $2) ON CONFLICT (user_id) DO NOTHING", user_id, chat_id ) async def get(self, user_id: int): return await self.conn.fetchval( "SELECT user_id FROM users WHERE user_id = $1", user_id ) class ProjectRepo(BaseRepo): async def add(self, name: str, description: str, *args): await self.conn.execute( "INSERT INTO projects " "(name, description, contributors, status) " "VALUES ($1, $2, $3, $4)", name, description, *args ) async def get(self, user_id: int): return await self.conn.fetchval( "SELECT name, description FROM projects WHERE creator = $1", user_id )