in server/src/main/java/com/epam/aidial/core/server/service/PublicationService.java [221:268]
public Publication approvePublication(ResourceDescriptor resource) {
Publication publication = getPublication(resource);
if (publication.getStatus() != Publication.Status.PENDING) {
throw new ResourceNotFoundException("Publication is already finalized: " + resource.getUrl());
}
List<Publication.Resource> resourcesToAdd = publication.getResources().stream()
.filter(i -> i.getAction() == Publication.ResourceAction.ADD || i.getAction() == Publication.ResourceAction.ADD_IF_ABSENT)
.toList();
List<Publication.Resource> resourcesToDelete = publication.getResources().stream()
.filter(i -> i.getAction() == Publication.ResourceAction.DELETE)
.toList();
checkReviewResources(resourcesToAdd);
checkTargetResources(resourcesToAdd, false);
checkTargetResources(resourcesToDelete, true);
resourceService.computeResource(publications(resource), body -> {
Map<String, Publication> publications = decodePublications(body);
Publication previous = publications.put(resource.getUrl(), publication);
if (!publication.equals(previous)) {
throw new ResourceNotFoundException("Publication changed during approving: " + resource.getUrl());
}
publication.setStatus(Publication.Status.APPROVED);
return encodePublications(publications);
});
resourceService.computeResource(PUBLIC_PUBLICATIONS, body -> {
Map<String, Publication> publications = decodePublications(body);
Publication removed = publications.remove(resource.getUrl());
return (removed == null) ? body : encodePublications(publications);
});
ruleService.storeRules(publication);
copyReviewToTargetResources(resourcesToAdd);
deleteReviewResources(resourcesToAdd);
deletePublicResources(resourcesToDelete);
String notificationMessage = "Your request has been approved by admin";
Notification notification = Notification.getPublicationNotification(resource.getUrl(), notificationMessage);
notificationService.createNotification(resource.getBucketName(), resource.getBucketLocation(), notification);
return publication;
}