Search in sources :

Example 6 with AuditRecord

use of io.lumeer.api.model.AuditRecord in project engine by Lumeer.

the class AuditFacade method decodeWithTitle.

private List<AuditRecord> decodeWithTitle(final Collection collection, final List<AuditRecord> auditRecords) {
    var documentsIds = auditRecords.stream().map(AuditRecord::getResourceId).collect(toSet());
    var defaultAttribute = CollectionUtil.getDefaultAttribute(collection);
    var defaultAttributeId = defaultAttribute != null ? defaultAttribute.getId() : "";
    var defaultConstraint = Utils.computeIfNotNull(defaultAttribute, Attribute::getConstraint);
    Map<String, Object> documentValues = new HashMap<>();
    Map<String, Object> defaultValues = Collections.emptyMap();
    if (!defaultAttributeId.isEmpty()) {
        defaultValues = dataDao.getData(collection.getId(), documentsIds, defaultAttributeId).stream().collect(toMap(DataDocument::getId, d -> d.get(defaultAttributeId)));
    }
    for (AuditRecord auditRecord : auditRecords) {
        decode(collection, auditRecord);
        decodeTitle(auditRecord, defaultAttributeId, defaultConstraint, defaultValues, documentValues);
    }
    return auditRecords;
}
Also used : DataDocument(io.lumeer.engine.api.data.DataDocument) Attribute(io.lumeer.api.model.Attribute) HashMap(java.util.HashMap) AuditRecord(io.lumeer.api.model.AuditRecord)

Example 7 with AuditRecord

use of io.lumeer.api.model.AuditRecord in project engine by Lumeer.

the class DailyTaskProcessor method process.

// every day at 4:03 am
@Schedule(hour = "4", minute = "3")
public void process() {
    final List<Organization> organizations = organizationDao.getAllOrganizations();
    final LumeerS3Client lumeerS3Client = new LumeerS3Client(configurationProducer);
    final FileAttachmentAdapter fileAttachmentAdapter = new FileAttachmentAdapter(lumeerS3Client, fileAttachmentDao, configurationProducer.getEnvironment().name());
    final List<FileAttachment> attachmentsToDelete = new ArrayList<>();
    log.info(String.format("Running for %d organizations.", organizations.size()));
    organizations.forEach(organization -> {
        final DataStorage userDataStorage = getDataStorage(organization.getId());
        var limits = paymentFacade.getCurrentServiceLimits(organization);
        var cleanOlderThan = ZonedDateTime.now().minusDays(limits.getAuditDays());
        final DaoContextSnapshot orgDao = getDaoContextSnapshot(userDataStorage, new Workspace(organization, null));
        final List<Project> projects = orgDao.getProjectDao().getAllProjects();
        projects.forEach(project -> {
            final DaoContextSnapshot projDao = getDaoContextSnapshot(userDataStorage, new Workspace(organization, project));
            List<AuditRecord> deletedAuditRecords = projDao.getAuditDao().findAuditRecords(cleanOlderThan, AuditType.Deleted);
            final List<FileAttachment> projectAttachmentsToDelete = new ArrayList<>();
            Set<String> documentIds = deletedAuditRecords.stream().filter(record -> ResourceType.DOCUMENT.equals(record.getResourceType())).map(AuditRecord::getResourceId).collect(Collectors.toSet());
            projectAttachmentsToDelete.addAll(fileAttachmentAdapter.getAllFileAttachments(organization, project, documentIds, FileAttachment.AttachmentType.DOCUMENT));
            Set<String> linkIds = deletedAuditRecords.stream().filter(record -> ResourceType.LINK.equals(record.getResourceType())).map(AuditRecord::getResourceId).collect(Collectors.toSet());
            projectAttachmentsToDelete.addAll(fileAttachmentAdapter.getAllFileAttachments(organization, project, linkIds, FileAttachment.AttachmentType.LINK));
            if (projectAttachmentsToDelete.size() > 0) {
                log.info(String.format("Will remove %d attachments on %s/%s.", projectAttachmentsToDelete.size(), organization.getCode(), organization.getCode()));
            }
            attachmentsToDelete.addAll(projectAttachmentsToDelete);
            projDao.getAuditDao().cleanAuditRecords(cleanOlderThan);
        });
    });
    if (attachmentsToDelete.size() > 0) {
        log.info(String.format("Removing %d attachments.", attachmentsToDelete.size()));
        fileAttachmentAdapter.removeFileAttachments(attachmentsToDelete);
    }
}
Also used : DataStorage(io.lumeer.engine.api.data.DataStorage) Organization(io.lumeer.api.model.Organization) FileAttachment(io.lumeer.api.model.FileAttachment) FileAttachmentAdapter(io.lumeer.core.adapter.FileAttachmentAdapter) ArrayList(java.util.ArrayList) Project(io.lumeer.api.model.Project) LumeerS3Client(io.lumeer.core.util.LumeerS3Client) AuditRecord(io.lumeer.api.model.AuditRecord) DaoContextSnapshot(io.lumeer.storage.api.dao.context.DaoContextSnapshot) Schedule(javax.ejb.Schedule)

Example 8 with AuditRecord

use of io.lumeer.api.model.AuditRecord in project engine by Lumeer.

the class AuditFacade method revertAudit.

public void revertAudit(final String auditRecordId) {
    final Payment.ServiceLevel level = getServiceLevel();
    if (level.equals(Payment.ServiceLevel.FREE)) {
        throw new UnsupportedOperationException("Reverting audit log entries is not available on the free plan.");
    }
    final AuditRecord record = auditDao.getAuditRecord(auditRecordId);
    switch(record.getResourceType()) {
        case DOCUMENT:
            checkRevertDocumentAudit(record);
            return;
        case LINK:
            checkRevertLinkAudit(record);
            return;
        default:
            throw new UnsupportedOperationException("Could not revert selected record");
    }
}
Also used : Payment(io.lumeer.api.model.Payment) AuditRecord(io.lumeer.api.model.AuditRecord) UnsupportedOperationException(io.lumeer.core.exception.UnsupportedOperationException)

Example 9 with AuditRecord

use of io.lumeer.api.model.AuditRecord in project engine by Lumeer.

the class AuditFacade method revertDocumentDelete.

private void revertDocumentDelete(final AuditRecord requestedRecord) {
    final AuditRecord auditRecord = auditDao.findLatestAuditRecord(requestedRecord.getParentId(), ResourceType.DOCUMENT, requestedRecord.getResourceId(), AuditType.Deleted);
    if (auditRecord == null || !auditRecord.getId().equals(requestedRecord.getId())) {
        throw new UnsupportedOperationException("Cannot revert audit record that is not the last.");
    }
    final Collection collection = collectionDao.getCollectionById(auditRecord.getParentId());
    permissionsChecker.checkCreateDocuments(collection);
    final Document document = new Document(collection.getId(), ZonedDateTime.now(), getCurrentUserId());
    document.setId(auditRecord.getResourceId());
    document.setData(auditRecord.getOldState());
    permissionsChecker.checkDocumentLimits(document);
    final Document storedDocument = documentDao.createDocument(document);
    DataDocument storedData = dataDao.createData(collection.getId(), storedDocument.getId(), document.getData());
    storedDocument.setData(storedData);
    collectionAdapter.updateCollectionMetadata(collection, document.getData().keySet(), Collections.emptySet());
    sendDocumentPushNotifications(collection, storedDocument, PusherFacade.CREATE_EVENT_SUFFIX);
    checkAuditOnObjectRevert(auditRecord);
}
Also used : DataDocument(io.lumeer.engine.api.data.DataDocument) Collection(io.lumeer.api.model.Collection) AuditRecord(io.lumeer.api.model.AuditRecord) DataDocument(io.lumeer.engine.api.data.DataDocument) Document(io.lumeer.api.model.Document) RemoveDocument(io.lumeer.engine.api.event.RemoveDocument) CreateDocument(io.lumeer.engine.api.event.CreateDocument) UpdateDocument(io.lumeer.engine.api.event.UpdateDocument) UnsupportedOperationException(io.lumeer.core.exception.UnsupportedOperationException)

Example 10 with AuditRecord

use of io.lumeer.api.model.AuditRecord in project engine by Lumeer.

the class AuditFacade method getAuditRecordsForLink.

public List<AuditRecord> getAuditRecordsForLink(final String linkTypeId, final String linkInstanceId) {
    final LinkType linkType = linkTypeDao.getLinkType(linkTypeId);
    final LinkInstance linkInstance = LinkInstanceUtils.loadLinkInstanceWithData(linkInstanceDao, linkDataDao, linkInstanceId);
    permissionsChecker.checkEditLinkInstance(linkType, linkInstance);
    return auditAdapter.getAuditRecords(linkTypeId, ResourceType.LINK, linkInstanceId, getServiceLevel()).stream().peek(link -> decode(linkType, link)).collect(toList());
}
Also used : CollectionUtil(io.lumeer.api.util.CollectionUtil) ZonedDateTime(java.time.ZonedDateTime) User(io.lumeer.api.model.User) LinkTypeDao(io.lumeer.storage.api.dao.LinkTypeDao) UpdateDefaultWorkspace(io.lumeer.engine.api.event.UpdateDefaultWorkspace) UnsupportedOperationException(io.lumeer.core.exception.UnsupportedOperationException) CreateLinkInstance(io.lumeer.engine.api.event.CreateLinkInstance) CollectionDao(io.lumeer.storage.api.dao.CollectionDao) ResourceType(io.lumeer.api.model.ResourceType) Resource(io.lumeer.api.model.common.Resource) Map(java.util.Map) Observes(javax.enterprise.event.Observes) ResourceCommentDao(io.lumeer.storage.api.dao.ResourceCommentDao) RequestDataKeeper(io.lumeer.core.auth.RequestDataKeeper) CollectionAdapter(io.lumeer.core.adapter.CollectionAdapter) ServiceLimits(io.lumeer.api.model.ServiceLimits) ConstraintManager(io.lumeer.core.constraint.ConstraintManager) RoleType(io.lumeer.api.model.RoleType) DataDocument(io.lumeer.engine.api.data.DataDocument) Document(io.lumeer.api.model.Document) RemoveDocument(io.lumeer.engine.api.event.RemoveDocument) CreateDocument(io.lumeer.engine.api.event.CreateDocument) Set(java.util.Set) Collectors(java.util.stream.Collectors) Constraint(io.lumeer.api.model.Constraint) LinkInstance(io.lumeer.api.model.LinkInstance) LinkType(io.lumeer.api.model.LinkType) DefaultConfigurationProducer(io.lumeer.core.facade.configuration.DefaultConfigurationProducer) List(java.util.List) AuditRecord(io.lumeer.api.model.AuditRecord) PusherClient(io.lumeer.core.util.PusherClient) PostConstruct(javax.annotation.PostConstruct) FavoriteItemDao(io.lumeer.storage.api.dao.FavoriteItemDao) Attribute(io.lumeer.api.model.Attribute) Utils(io.lumeer.core.util.Utils) LinkInstanceAdapter(io.lumeer.core.adapter.LinkInstanceAdapter) UserDao(io.lumeer.storage.api.dao.UserDao) AuditType(io.lumeer.api.model.AuditType) HashMap(java.util.HashMap) DocumentAdapter(io.lumeer.core.adapter.DocumentAdapter) Event(org.marvec.pusher.data.Event) LinkInstanceUtils(io.lumeer.core.util.LinkInstanceUtils) GroupDao(io.lumeer.storage.api.dao.GroupDao) HashSet(java.util.HashSet) Inject(javax.inject.Inject) DataDao(io.lumeer.storage.api.dao.DataDao) ViewDao(io.lumeer.storage.api.dao.ViewDao) Organization(io.lumeer.api.model.Organization) DocumentDao(io.lumeer.storage.api.dao.DocumentDao) ResourceAdapter(io.lumeer.core.adapter.ResourceAdapter) AuditAdapter(io.lumeer.core.adapter.AuditAdapter) LinkTypeAdapter(io.lumeer.core.adapter.LinkTypeAdapter) Payment(io.lumeer.api.model.Payment) DocumentUtils(io.lumeer.core.util.DocumentUtils) RemoveLinkInstance(io.lumeer.engine.api.event.RemoveLinkInstance) Project(io.lumeer.api.model.Project) UpdateLinkInstance(io.lumeer.engine.api.event.UpdateLinkInstance) LinkInstanceDao(io.lumeer.storage.api.dao.LinkInstanceDao) AuditDao(io.lumeer.storage.api.dao.AuditDao) PermissionAdapter(io.lumeer.core.adapter.PermissionAdapter) PusherAdapter(io.lumeer.core.adapter.PusherAdapter) RequestScoped(javax.enterprise.context.RequestScoped) LinkDataDao(io.lumeer.storage.api.dao.LinkDataDao) UpdateDocument(io.lumeer.engine.api.event.UpdateDocument) Collections(java.util.Collections) Collection(io.lumeer.api.model.Collection) CreateLinkInstance(io.lumeer.engine.api.event.CreateLinkInstance) LinkInstance(io.lumeer.api.model.LinkInstance) RemoveLinkInstance(io.lumeer.engine.api.event.RemoveLinkInstance) UpdateLinkInstance(io.lumeer.engine.api.event.UpdateLinkInstance) LinkType(io.lumeer.api.model.LinkType)

Aggregations

AuditRecord (io.lumeer.api.model.AuditRecord)13 DataDocument (io.lumeer.engine.api.data.DataDocument)9 UnsupportedOperationException (io.lumeer.core.exception.UnsupportedOperationException)8 HashSet (java.util.HashSet)6 Collection (io.lumeer.api.model.Collection)5 Document (io.lumeer.api.model.Document)5 Attribute (io.lumeer.api.model.Attribute)4 LinkInstance (io.lumeer.api.model.LinkInstance)4 LinkType (io.lumeer.api.model.LinkType)4 ServiceLimits (io.lumeer.api.model.ServiceLimits)4 RemoveDocument (io.lumeer.engine.api.event.RemoveDocument)4 UpdateDocument (io.lumeer.engine.api.event.UpdateDocument)4 AuditType (io.lumeer.api.model.AuditType)3 Organization (io.lumeer.api.model.Organization)3 Payment (io.lumeer.api.model.Payment)3 Project (io.lumeer.api.model.Project)3 CreateDocument (io.lumeer.engine.api.event.CreateDocument)3 RemoveLinkInstance (io.lumeer.engine.api.event.RemoveLinkInstance)3 UpdateLinkInstance (io.lumeer.engine.api.event.UpdateLinkInstance)3 HashMap (java.util.HashMap)3