from sqlalchemy import Select, Delete from .model import Scope from .schema import ScopeCreate, ScopeUpdate from typing import Optional from src.database.core import DbSession from src.auth.service import CurrentUser async def get(*, db_session: DbSession, scope_id: str) -> Optional[Scope]: """Returns a document based on the given document id.""" query = Select(Scope).filter(Scope.id == scope_id) result = await db_session.execute(query) return result.scalars().one_or_none() async def get_all(*, db_session: DbSession): """Returns all documents.""" query = Select(Scope) result = await db_session.execute(query) return result.scalars().all() async def create(*, db_session: DbSession, scope_in: ScopeCreate): """Creates a new document.""" scope = Scope(**scope_in.model_dump()) db_session.add(scope) await db_session.commit() return scope async def update(*, db_session: DbSession, scope: Scope, scope_in: ScopeUpdate): """Updates a document.""" data = scope_in.model_dump() update_data = scope_in.model_dump(exclude_defaults=True) for field in data: if field in update_data: setattr(scope, field, update_data[field]) await db_session.commit() return scope async def delete(*, db_session: DbSession, scope_id: str): """Deletes a document.""" query = Delete(Scope).where(Scope.id == scope_id) await db_session.execute(query) await db_session.commit() async def get_by_scope_name(*, db_session: DbSession, scope_name: str) -> Optional[Scope]: """Returns a document based on the given document id.""" query = Select(Scope).filter(Scope.scope_name == scope_name) result = await db_session.execute(query) return result.scalars().one_or_none()