from typing import List from fastapi import HTTPException, status from sqlalchemy.ext.asyncio import AsyncSession from app.application.company_profile_socials_repository import CompanyProfileSocialsRepository from app.application.company_profiles_repository import CompanyProfilesRepository from app.core.constants import UserRoles from app.domain.entities.company_profile_socials import CompanyProfileSocialRead, CompanyProfileSocialCreate from app.domain.models import User, CompanyProfileSocial class CompanyProfileSocialsService: def __init__(self, db: AsyncSession): self.company_profile_socials_repository = CompanyProfileSocialsRepository(db) self.company_profiles_repository = CompanyProfilesRepository(db) async def get_by_company_profile_id( self, company_profile_id: int, ) -> List[CompanyProfileSocialRead]: company_profile = await self.company_profiles_repository.get_by_id(company_profile_id) if not company_profile: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail='Компания с таким ID не найдена' ) company_profile_socials = await self.company_profile_socials_repository.get_by_company_profile_id( company_profile_id ) response = [] for company_profile_social in company_profile_socials: response.append(CompanyProfileSocialRead.model_validate(company_profile_social)) return response async def replace_company_profile_socials( self, company_profile_socials: List[CompanyProfileSocialCreate], company_profile_id: int, current_user: User, ) -> List[CompanyProfileSocialRead]: company_profile = await self.company_profiles_repository.get_by_id(company_profile_id) if not company_profile: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail='Соискатель с таким ID не найден') if company_profile.creator_user_id != current_user.id and not ( current_user.role.title == UserRoles.MODERATOR and current_user.is_admin ): raise HTTPException( status_code=status.HTTP_403_FORBIDDEN, detail='Доступ запрещен', ) old_company_profile_socials = await self.company_profile_socials_repository.get_by_company_profile_id( company_profile_id ) await self.company_profile_socials_repository.delete_list(old_company_profile_socials) company_profile_social_models = [] for company_profile_social in company_profile_socials: company_profile_social_models.append(CompanyProfileSocial( title=company_profile_social.title, link=company_profile_social.link, company_id=company_profile_id, )) company_profile_social_models = await self.company_profile_socials_repository.create_list( company_profile_social_models ) response = [] for company_profile_social_model in company_profile_social_models: response.append(CompanyProfileSocialRead.model_validate(company_profile_social_model)) return response