package com.constellio.app.modules.rm.extensions; import static com.constellio.app.ui.i18n.i18n.$; import java.util.ArrayList; import java.util.List; import com.constellio.app.modules.rm.navigation.RMNavigationConfiguration; import com.constellio.model.services.migrations.ConstellioEIMConfigs; import org.joda.time.LocalDateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.constellio.app.modules.rm.RMEmailTemplateConstants; import com.constellio.app.modules.rm.services.RMSchemasRecordsServices; import com.constellio.app.modules.rm.wrappers.Document; import com.constellio.app.modules.rm.wrappers.Folder; import com.constellio.app.modules.rm.wrappers.RMObject; import com.constellio.data.utils.TimeProvider; import com.constellio.model.entities.records.Content; import com.constellio.model.entities.records.Record; import com.constellio.model.entities.records.Transaction; import com.constellio.model.entities.records.wrappers.EmailToSend; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.entities.schemas.MetadataSchema; import com.constellio.model.entities.schemas.MetadataSchemaTypes; import com.constellio.model.entities.structures.EmailAddress; import com.constellio.model.extensions.behaviors.RecordExtension; import com.constellio.model.extensions.events.records.RecordModificationEvent; import com.constellio.model.services.factories.ModelLayerFactory; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.records.RecordServicesException; import com.constellio.model.services.schemas.MetadataSchemasManager; public class RMCheckInAlertsRecordExtension extends RecordExtension { private static Logger LOGGER = LoggerFactory.getLogger(RMCheckInAlertsRecordExtension.class); String collection; ModelLayerFactory modelLayerFactory; RMSchemasRecordsServices rmSchemasRecordsServices; MetadataSchemasManager metadataSchemasManager; RecordServices recordServices; ConstellioEIMConfigs eimConfigs; public RMCheckInAlertsRecordExtension(String collection, ModelLayerFactory modelLayerFactory) { this.modelLayerFactory = modelLayerFactory; this.collection = collection; this.rmSchemasRecordsServices = new RMSchemasRecordsServices(collection, modelLayerFactory); this.metadataSchemasManager = modelLayerFactory.getMetadataSchemasManager(); this.recordServices = modelLayerFactory.newRecordServices(); this.eimConfigs = new ConstellioEIMConfigs(modelLayerFactory.getSystemConfigurationsManager()); } @Override public void recordModified(RecordModificationEvent event) { if (event.isSchemaType(Folder.SCHEMA_TYPE) && event.hasModifiedMetadata(Folder.BORROWED)) { alertUsers(Folder.SCHEMA_TYPE, event.getRecord()); } else if (event.isSchemaType(Document.SCHEMA_TYPE) && event.hasModifiedMetadata(Document.CONTENT)) { Content content = event.getRecord().get(rmSchemasRecordsServices.documentContent()); if (content != null && content.getCheckoutUserId() == null) { alertUsers(Document.SCHEMA_TYPE, event.getRecord()); } } super.recordModified(event); } private void alertUsers(String schemaType, Record record) { try { RMObject rmObject; String displayURL; if (schemaType.equals(Folder.SCHEMA_TYPE)) { rmObject = rmSchemasRecordsServices.wrapFolder(record); displayURL = RMNavigationConfiguration.DISPLAY_FOLDER; } else if (schemaType.equals(Document.SCHEMA_TYPE)) { rmObject = rmSchemasRecordsServices.wrapDocument(record); displayURL = RMNavigationConfiguration.DISPLAY_DOCUMENT; } else { throw new UnsupportedOperationException("Invalid schemaType"); } if (rmObject.getAlertUsersWhenAvailable().isEmpty()) { return; } else { Transaction transaction = new Transaction(); for (String userId : rmObject.getAlertUsersWhenAvailable()) { EmailToSend emailToSend = newEmailToSend(); User user = rmSchemasRecordsServices.getUser(userId); EmailAddress toAddress = new EmailAddress(user.getTitle(), user.getEmail()); LocalDateTime returnDate = TimeProvider.getLocalDateTime(); emailToSend.setTo(toAddress); emailToSend.setSendOn(returnDate); final String subject = $("RMObject.alertWhenAvailableSubject", $("AddEditTaxonomyView.classifiedObject." + schemaType).toLowerCase()) + ": " + record.getTitle(); emailToSend.setSubject(subject); emailToSend.setTemplate(RMEmailTemplateConstants.ALERT_AVAILABLE_ID); List<String> parameters = new ArrayList<>(); parameters.add("subject" + EmailToSend.PARAMETER_SEPARATOR + subject); parameters.add("returnDate" + EmailToSend.PARAMETER_SEPARATOR + formatDateToParameter(returnDate)); String rmObjectTitle = rmObject.getTitle(); parameters.add("title" + EmailToSend.PARAMETER_SEPARATOR + rmObjectTitle); String constellioUrl = eimConfigs.getConstellioUrl(); parameters.add("constellioURL" + EmailToSend.PARAMETER_SEPARATOR + constellioUrl); parameters.add("recordURL" + EmailToSend.PARAMETER_SEPARATOR + constellioUrl + "#!" + displayURL + "/" + record.getId()); parameters.add("recordType" + EmailToSend.PARAMETER_SEPARATOR + $("AddEditTaxonomyView.classifiedObject." + schemaType).toLowerCase()); emailToSend.setParameters(parameters); transaction.add(emailToSend); } transaction.add(rmObject.setAlertUsersWhenAvailable(new ArrayList<String>())); recordServices.execute(transaction); } } catch (RecordServicesException e) { LOGGER.error("Cannot alert users", e); } } private String formatDateToParameter(LocalDateTime datetime) { if(datetime == null) { return ""; } return datetime.toString("yyyy-MM-dd HH:mm:ss"); } private EmailToSend newEmailToSend() { MetadataSchemaTypes types = metadataSchemasManager.getSchemaTypes(collection); MetadataSchema schema = types.getSchemaType(EmailToSend.SCHEMA_TYPE).getDefaultSchema(); Record emailToSendRecord = recordServices.newRecordWithSchema(schema); return new EmailToSend(emailToSendRecord, types); } }