from dataclasses import dataclass from anydi import singleton from fansifter_common.auth.requests import AuthRequest from fansifter_common.auth.services import AuthService from fansifter_common.auth.types import Permission from dmp.ad_reporting.models import AdReportingReport from dmp.ad_reporting.services import AdReportingReportService from dmp.ad_reporting.validators import AdReportingReportValidator from dmp.adapters.db import ReportingDB, transactional @dataclass(kw_only=True) class EditAdReportingReportRequest(AuthRequest): report_id: str name: str @singleton class EditAdReportingReportHandler: permission = Permission("ad_report", "edit") def __init__( self, db: ReportingDB, auth_service: AuthService, report_validator: AdReportingReportValidator, report_service: AdReportingReportService, ) -> None: self.db = db self.auth_service = auth_service self.report_validator = report_validator self.report_service = report_service @transactional def handle(self, request: EditAdReportingReportRequest) -> AdReportingReport: report = self.report_service.get_report( report_id=request.report_id, identity_id=request.identity_id, ) self.auth_service.check_owned_resource( report.identity_id, permission=self.permission, resource_id=report.id, ) # Validate report name if report.name != request.name: self.report_validator.validate_name( name=request.name, identity_id=request.identity_id, exclude_id=request.report_id, ) report.name = request.name self.report_service.save_report(report) return report