use of io.lumeer.engine.api.event.CreateDocumentsAndLinks in project engine by Lumeer.
the class DocumentFacade method createDocumentsChain.
public DocumentsChain createDocumentsChain(List<Document> documents, List<LinkInstance> linkInstances) {
var collectionsMap = documents.stream().filter(document -> document.getId() == null).map(document -> checkCreateDocuments(document.getCollectionId())).collect(Collectors.toMap(Resource::getId, Function.identity()));
var linkTypesMap = linkInstances.stream().filter(linkInstance -> linkInstance.getId() == null).map(linkInstanceId -> checkCreateLinks(linkInstanceId.getLinkTypeId())).collect(Collectors.toMap(LinkType::getId, Function.identity()));
permissionsChecker.checkDocumentLimits(documents);
if (documents.isEmpty()) {
return new DocumentsChain(Collections.emptyList(), Collections.emptyList());
}
List<Document> createdDocuments = new ArrayList<>();
List<LinkInstance> createdLinks = new ArrayList<>();
String previousDocumentId = linkInstances.size() == documents.size() ? Utils.firstNotNullElement(linkInstances.get(0).getDocumentIds()) : null;
var linkInstanceIndex = 0;
for (Document document : documents) {
String currentDocumentId;
if (document.getId() != null) {
currentDocumentId = document.getId();
} else {
var collection = collectionsMap.get(document.getCollectionId());
var tuple = createDocument(collection, document);
createdDocuments.add(tuple.getSecond());
currentDocumentId = tuple.getFirst().getId();
collectionAdapter.updateCollectionMetadata(collection, tuple.getSecond().getData().keySet(), Collections.emptySet());
}
var linkInstance = linkInstances.size() > linkInstanceIndex ? linkInstances.get(linkInstanceIndex) : null;
if (previousDocumentId != null && linkInstance != null) {
linkInstance.setDocumentIds(Arrays.asList(previousDocumentId, currentDocumentId));
if (linkInstance.getId() != null) {
var updatedLinkInstance = linkInstanceDao.updateLinkInstance(linkInstance.getId(), linkInstance);
updatedLinkInstance.setData(linkInstance.getData());
createdLinks.add(updatedLinkInstance);
} else {
var linkType = linkTypesMap.get(linkInstance.getLinkTypeId());
var linkData = linkInstanceFacade.createLinkInstance(linkType, linkInstance);
createdLinks.add(linkData.getSecond());
}
linkInstanceIndex++;
}
previousDocumentId = currentDocumentId;
}
if (this.createChainEvent != null) {
this.createChainEvent.fire(new CreateDocumentsAndLinks(createdDocuments, createdLinks));
}
return new DocumentsChain(createdDocuments, createdLinks);
}
use of io.lumeer.engine.api.event.CreateDocumentsAndLinks in project engine by Lumeer.
the class DocumentFacade method duplicateDocuments.
public List<Document> duplicateDocuments(final String collectionId, final List<String> documentIds) {
final Collection collection = checkCreateDocuments(collectionId);
permissionsChecker.checkDocumentLimits(documentIds.size());
var dataMap = dataDao.getData(collectionId, new HashSet<>(documentIds)).stream().collect(Collectors.toMap(DataDocument::getId, d -> d));
final List<Document> originalDocuments = documentDao.getDocumentsByIds(new HashSet<>(documentIds)).stream().peek(document -> document.setData(dataMap.getOrDefault(document.getId(), new DataDocument()))).filter(document -> permissionsChecker.canEditDocument(collection, document)).collect(Collectors.toList());
if (originalDocuments.isEmpty()) {
return originalDocuments;
}
final List<Document> documents = documentDao.duplicateDocuments(originalDocuments);
final Map<String, Document> documentsDirectory = new HashMap<>();
final Map<String, String> keyMap = new HashMap<>();
documents.forEach(d -> {
documentsDirectory.put(d.getId(), d);
keyMap.put(d.getMetaData().getString(Document.META_ORIGINAL_DOCUMENT_ID), d.getId());
});
final Map<String, Integer> usages = new HashMap<>();
final List<DataDocument> dataList = dataDao.duplicateData(collectionId, dataMap.values(), keyMap);
dataList.forEach(encodedData -> {
final DataDocument data = constraintManager.decodeDataTypes(collection, encodedData);
if (documentsDirectory.containsKey(data.getId())) {
documentsDirectory.get(data.getId()).setData(data);
}
data.keySet().forEach(key -> usages.put(key, usages.computeIfAbsent(key, k -> 0) + 1));
});
fileAttachmentFacade.duplicateFileAttachments(collection.getId(), keyMap, FileAttachment.AttachmentType.DOCUMENT);
if (this.createChainEvent != null) {
this.createChainEvent.fire(new CreateDocumentsAndLinks(documents, Collections.emptyList()));
}
collectionAdapter.updateCollectionMetadata(collection, usages);
return documents;
}
Aggregations