package eu.dnetlib.openaire.community.db; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Function; import java.util.stream.Collectors; import javax.transaction.Transactional; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Service; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import eu.dnetlib.openaire.community.db.model.DbCommunity; import eu.dnetlib.openaire.community.db.model.DbDatasource; import eu.dnetlib.openaire.community.db.model.DbDatasourcePK; import eu.dnetlib.openaire.community.db.model.DbProject; import eu.dnetlib.openaire.community.db.model.DbProjectPK; import eu.dnetlib.openaire.community.db.repository.DbCommunityRepository; import eu.dnetlib.openaire.community.db.repository.DbDatasourceRepository; import eu.dnetlib.openaire.community.db.repository.DbOrganizationRepository; import eu.dnetlib.openaire.community.db.repository.DbProjectRepository; import eu.dnetlib.openaire.community.db.repository.DbSupportOrgRepository; import eu.dnetlib.openaire.exporter.exceptions.CommunityException; import eu.dnetlib.openaire.exporter.exceptions.ResourceNotFoundException; import eu.dnetlib.openaire.exporter.model.community.CommunityContentprovider; import eu.dnetlib.openaire.exporter.model.community.CommunityDetails; import eu.dnetlib.openaire.exporter.model.community.CommunityOpenAIRECommunities; import eu.dnetlib.openaire.exporter.model.community.CommunityOrganization; import eu.dnetlib.openaire.exporter.model.community.CommunityProject; import eu.dnetlib.openaire.exporter.model.community.CommunitySummary; import eu.dnetlib.openaire.exporter.model.community.CommunityWritableProperties; import eu.dnetlib.openaire.exporter.model.community.CommunityZenodoCommunity; import eu.dnetlib.openaire.exporter.model.community.selectioncriteria.SelectionCriteria; @Service @ConditionalOnProperty(value = "openaire.exporter.enable.community", havingValue = "true") public class CommunityService { // TODO // 1) Aggiungere i campi membership e claim al modello delle api // 2) Capire come gestire il campo Id (Integer) di CommunityProject // 3) Gestire paginazione dei progetti // 4) CommunityContentprovider sono le datasources? // 5) Capire come gestire il campo Id (Integer) di CommunityContentprovider // 5) Capire come gestire il campo Id (Integer) di CommunityOrganization @Autowired private DbCommunityRepository dbCommunityRepository; @Autowired private DbProjectRepository dbProjectRepository; @Autowired private DbDatasourceRepository dbDatasourceRepository; @Autowired private DbOrganizationRepository dbOrganizationRepository; @Autowired private DbSupportOrgRepository dbSupportOrgRepository; public List listCommunities() throws CommunityException { return dbCommunityRepository.findAll() .stream() .map(ConvertionUtils::toSummary) .collect(Collectors.toList()); } public CommunityDetails getCommunity(final String id) throws CommunityException, ResourceNotFoundException { // TODO Auto-generated method stub return null; } public void setCommunity(final String id, final CommunityWritableProperties details) throws CommunityException, ResourceNotFoundException { // TODO Auto-generated method stub } public List getCommunityProjects(final String id) throws CommunityException, ResourceNotFoundException { return dbProjectRepository.findByCommunity(id) .stream() .map(ConvertionUtils::toCommunityProject) .collect(Collectors.toList()); } public CommunityProject addCommunityProject(final String id, final CommunityProject project) throws CommunityException, ResourceNotFoundException { final DbProject p = ConvertionUtils.toDbProject(id, project); dbProjectRepository.save(p); return project; } public List addCommunityProjectList(final String id, final List projectList) throws CommunityException, ResourceNotFoundException { final List list = projectList.stream() .map(p -> ConvertionUtils.toDbProject(id, p)) .collect(Collectors.toList()); dbProjectRepository.saveAll(list); return projectList; } public void removeCommunityProject(final String id, final String projectId) throws CommunityException, ResourceNotFoundException { dbProjectRepository.deleteById(new DbProjectPK(id, projectId)); } public void removeCommunityProjectList(final String id, final List projectIdList) throws CommunityException, ResourceNotFoundException { final List list = projectIdList.stream() .map(projectId -> new DbProjectPK(id, projectId)) .collect(Collectors.toList()); dbProjectRepository.deleteAllById(list); } public List getCommunityContentproviders(final String id) throws CommunityException, ResourceNotFoundException { return dbDatasourceRepository.findByCommunity(id) .stream() .map(ConvertionUtils::toCommunityContentprovider) .collect(Collectors.toList()); } public CommunityContentprovider addCommunityContentprovider(final String id, final CommunityContentprovider cp) throws CommunityException, ResourceNotFoundException { final DbDatasource ds = ConvertionUtils.toDbDatasource(id, cp); dbDatasourceRepository.save(ds); return cp; } public List addCommunityContentProvidersList(final String id, final List contentprovidersList) throws CommunityException, ResourceNotFoundException { final List list = contentprovidersList.stream() .map(cp -> ConvertionUtils.toDbDatasource(id, cp)) .collect(Collectors.toList()); dbDatasourceRepository.saveAll(list); return contentprovidersList; } public void removeCommunityContentProvider(final String id, final String contentproviderId) throws CommunityException, ResourceNotFoundException { dbDatasourceRepository.deleteById(new DbDatasourcePK(id, contentproviderId)); } public void removeCommunityContentProviderList(final String id, final List contentProviderIdList) throws CommunityException, ResourceNotFoundException { final List list = contentProviderIdList.stream() .map(dsId -> new DbDatasourcePK(id, dsId)) .collect(Collectors.toList()); dbDatasourceRepository.deleteAllById(list); } public void removeCommunityOrganization(final String id, final String organizationId) throws CommunityException, ResourceNotFoundException { dbDatasourceRepository.deleteById(new DbDatasourcePK(id, organizationId)); } public List getCommunityOrganizations(final String id) throws CommunityException, ResourceNotFoundException { return dbOrganizationRepository.findByCommunity(id) .stream() .map(ConvertionUtils::toCommunityOrganiztion) .collect(Collectors.toList()); } @Transactional public CommunityDetails addCommunitySubjects(final String id, final List subjects) throws CommunityException, ResourceNotFoundException { return modifyElementToArrayField(id, subjects, c -> c.getSubjects(), (c, subs) -> c.setSubjects(subs), false); } @Transactional public CommunityDetails removeCommunitySubjects(final String id, final List subjects) throws CommunityException, ResourceNotFoundException { return modifyElementToArrayField(id, subjects, c -> c.getSubjects(), (c, subs) -> c.setSubjects(subs), true); } @Transactional public CommunityDetails addCommunityFOS(final String id, final List foss) throws CommunityException, ResourceNotFoundException { return modifyElementToArrayField(id, foss, c -> c.getFos(), (c, fos) -> c.setFos(fos), false); } @Transactional public CommunityDetails removeCommunityFOS(final String id, final List foss) throws CommunityException, ResourceNotFoundException { return modifyElementToArrayField(id, foss, c -> c.getFos(), (c, fos) -> c.setFos(fos), true); } @Transactional public CommunityDetails addCommunitySDG(final String id, final List sdgs) throws CommunityException, ResourceNotFoundException { return modifyElementToArrayField(id, sdgs, c -> c.getSdg(), (c, sdg) -> c.setSdg(sdg), false); } @Transactional public CommunityDetails removeCommunitySDG(final String id, final List sdgs) throws CommunityException, ResourceNotFoundException { return modifyElementToArrayField(id, sdgs, c -> c.getSdg(), (c, sdg) -> c.setSdg(sdg), true); } public CommunityDetails addCommunityAdvancedConstraint(final String id, final SelectionCriteria advancedCosntraint) throws CommunityException, ResourceNotFoundException { try { final DbCommunity dbEntry = dbCommunityRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("Community not found: " + id)); dbEntry.setAdvancedConstraints(new ObjectMapper().writeValueAsString(advancedCosntraint)); dbCommunityRepository.save(dbEntry); return getCommunity(id); } catch (final JsonProcessingException e) { throw new CommunityException("Error converting json"); } } public CommunityDetails removeCommunityAdvancedConstraint(final String id) throws ResourceNotFoundException, CommunityException { final DbCommunity dbEntry = dbCommunityRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("Community not found: " + id)); dbEntry.setAdvancedConstraints(null); dbCommunityRepository.save(dbEntry); return getCommunity(id); } public List getCommunityZenodoCommunities(final String id) throws CommunityException, ResourceNotFoundException { // TODO Auto-generated method stub return null; } public void removeCommunityZenodoCommunity(final String id, final Integer zenodoCommId) throws CommunityException, ResourceNotFoundException { // TODO Auto-generated method stub } public CommunityZenodoCommunity addCommunityZenodoCommunity(final String id, final CommunityZenodoCommunity zc) throws CommunityException, ResourceNotFoundException { // TODO Auto-generated method stub return null; } public CommunityOpenAIRECommunities getOpenAIRECommunities(final String zenodoId) throws CommunityException, ResourceNotFoundException { // TODO Auto-generated method stub return null; } public CommunityOrganization addCommunityOrganization(final String id, final CommunityOrganization organization) throws CommunityException, ResourceNotFoundException { // TODO Auto-generated method stub return null; } private CommunityDetails modifyElementToArrayField(final String id, final List values, final Function getter, final BiConsumer setter, final boolean remove) throws ResourceNotFoundException, CommunityException { final DbCommunity dbEntry = dbCommunityRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("Community not found: " + id)); final Set tmpList = new LinkedHashSet<>(); final String[] oldValues = getter.apply(dbEntry); if (oldValues != null) { for (final String s : oldValues) { tmpList.add(s); } } if (remove) { tmpList.removeAll(values); } else { tmpList.addAll(values); } setter.accept(dbEntry, tmpList.toArray(new String[tmpList.size()])); dbCommunityRepository.save(dbEntry); return getCommunity(id); } }