use of io.lumeer.api.model.AuditRecord in project engine by Lumeer.
the class AuditFacade method revertLastLinkAuditOperation.
public LinkInstance revertLastLinkAuditOperation(final String linkTypeId, final String linkInstanceId, final String auditRecordId) {
final LinkType linkType = linkTypeDao.getLinkType(linkTypeId);
final LinkInstance linkInstance = LinkInstanceUtils.loadLinkInstanceWithData(linkInstanceDao, linkDataDao, linkInstanceId);
permissionsChecker.checkEditLinkInstance(linkType, linkInstance);
if (workspaceKeeper.getOrganization().isPresent()) {
final ServiceLimits limits = paymentFacade.getCurrentServiceLimits(workspaceKeeper.getOrganization().get());
if (limits.getServiceLevel().equals(Payment.ServiceLevel.FREE)) {
throw new UnsupportedOperationException("Reverting audit log entries is not available on the free plan.");
}
final AuditRecord auditRecord = auditDao.findLatestAuditRecord(linkTypeId, ResourceType.LINK, linkInstanceId);
if (auditRecord != null && auditRecord.getId().equals(auditRecordId) && auditRecord.getOldState() != null) {
var keysToBeRemoved = new HashSet<>(auditRecord.getNewState().keySet());
keysToBeRemoved.removeAll(auditRecord.getOldState().keySet());
linkInstance.getData().putAll(auditRecord.getOldState());
keysToBeRemoved.forEach(key -> linkInstance.getData().remove(key));
dataDao.patchData(linkTypeId, linkInstanceId, auditRecord.getOldState());
auditDao.deleteAuditRecord(auditRecordId);
}
linkInstance.setData(constraintManager.decodeDataTypes(linkType, linkInstance.getData()));
return linkInstanceAdapter.mapLinkInstanceData(linkInstance);
}
throw new UnsupportedOperationException("No organization specified.");
}
use of io.lumeer.api.model.AuditRecord in project engine by Lumeer.
the class AuditRecordCodec method decode.
@Override
public AuditRecord decode(final BsonReader bsonReader, final DecoderContext decoderContext) {
final Document bson = codec.decode(bsonReader, decoderContext);
final AuditRecord record = new AuditRecord();
record.setId(bson.getObjectId(ID).toHexString());
record.setParentId(bson.getString(AuditRecord.PARENT_ID));
record.setResourceType(ResourceType.fromString(bson.getString(AuditRecord.RESOURCE_TYPE)));
record.setResourceId(bson.getString(AuditRecord.RESOURCE_ID));
record.setUser(bson.getString(AuditRecord.USER));
record.setAutomation(bson.getString(AuditRecord.AUTOMATION));
record.setUserName(bson.getString(AuditRecord.USER_NAME));
record.setUserEmail(bson.getString(AuditRecord.USER_EMAIL));
record.setViewId(bson.getString(AuditRecord.VIEW));
final Date changeDate = bson.getDate(AuditRecord.CHANGE_DATE);
record.setChangeDate(changeDate != null ? ZonedDateTime.ofInstant(changeDate.toInstant(), ZoneOffset.UTC) : null);
final Document oldState = bson.get(AuditRecord.OLD_STATE, Document.class);
record.setOldState(oldState != null ? MongoUtils.convertDocument(oldState) : new DataDocument());
final Document newState = bson.get(AuditRecord.NEW_STATE, Document.class);
record.setNewState(newState != null ? MongoUtils.convertDocument(newState) : new DataDocument());
final AuditType type = Objects.requireNonNullElse(AuditType.fromString(bson.getString(AuditRecord.TYPE)), AuditType.Updated);
record.setType(type);
return record;
}
use of io.lumeer.api.model.AuditRecord in project engine by Lumeer.
the class AuditFacade method decodeWithTitle.
private List<AuditRecord> decodeWithTitle(final LinkType linkType, final List<AuditRecord> auditRecords) {
var linkIds = auditRecords.stream().map(AuditRecord::getResourceId).collect(toSet());
var defaultAttribute = linkType.getAttributes().stream().findFirst().orElse(null);
var defaultAttributeId = defaultAttribute != null ? defaultAttribute.getId() : "";
var defaultConstraint = Utils.computeIfNotNull(defaultAttribute, Attribute::getConstraint);
Map<String, Object> linkValues = new HashMap<>();
Map<String, Object> defaultValues = Collections.emptyMap();
if (!defaultAttributeId.isEmpty()) {
defaultValues = linkDataDao.getData(linkType.getId(), linkIds, defaultAttributeId).stream().collect(toMap(DataDocument::getId, d -> d.get(defaultAttributeId)));
}
for (AuditRecord auditRecord : auditRecords) {
decode(linkType, auditRecord);
decodeTitle(auditRecord, defaultAttributeId, defaultConstraint, defaultValues, linkValues);
}
return auditRecords;
}
use of io.lumeer.api.model.AuditRecord in project engine by Lumeer.
the class AuditFacade method getAuditRecordsForDocument.
public List<AuditRecord> getAuditRecordsForDocument(final String collectionId, final String documentId) {
final Collection collection = collectionDao.getCollectionById(collectionId);
final Document document = DocumentUtils.loadDocumentWithData(documentDao, dataDao, collection, documentId);
permissionsChecker.checkEditDocument(collection, document);
return auditAdapter.getAuditRecords(collectionId, ResourceType.DOCUMENT, documentId, getServiceLevel()).stream().peek(log -> decode(collection, log)).collect(toList());
}
use of io.lumeer.api.model.AuditRecord in project engine by Lumeer.
the class AuditFacade method revertLinkChange.
public void revertLinkChange(final AuditRecord requestedRecord) {
final AuditRecord auditRecord = auditDao.findLatestAuditRecord(requestedRecord.getParentId(), ResourceType.LINK, requestedRecord.getResourceId(), AuditType.Updated);
if (auditRecord == null || !auditRecord.getId().equals(requestedRecord.getId())) {
throw new UnsupportedOperationException("Cannot revert audit record that is not the last.");
}
final LinkType linkType = linkTypeDao.getLinkType(auditRecord.getParentId());
final LinkInstance linkInstance = LinkInstanceUtils.loadLinkInstanceWithData(linkInstanceDao, linkDataDao, auditRecord.getResourceId());
permissionsChecker.checkEditLinkInstance(linkType, linkInstance);
if (auditRecord.getOldState() != null) {
var keysToAdd = new HashSet<>(auditRecord.getOldState().keySet());
keysToAdd.removeAll(auditRecord.getNewState().keySet());
var keysToRemove = new HashSet<>(auditRecord.getNewState().keySet());
keysToRemove.removeAll(auditRecord.getOldState().keySet());
linkInstance.getData().putAll(auditRecord.getOldState());
keysToRemove.forEach(key -> linkInstance.getData().remove(key));
DataDocument storedData = linkDataDao.updateData(auditRecord.getParentId(), auditRecord.getResourceId(), linkInstance.getData());
checkAuditOnObjectRevert(auditRecord);
linkInstance.setUpdateDate(ZonedDateTime.now());
linkInstance.setUpdatedBy(getCurrentUserId());
LinkInstance storedLinkInstance = linkInstanceDao.updateLinkInstance(linkInstance.getId(), linkInstance);
storedLinkInstance.setData(storedData);
linkTypeAdapter.updateLinkTypeMetadata(linkType, keysToAdd, keysToRemove);
sendLinkNotification(linkType, storedLinkInstance, PusherFacade.UPDATE_EVENT_SUFFIX);
}
}
Aggregations