package com.constellio.app.modules.rm.migrations;
import static com.constellio.data.utils.LangUtils.withoutDuplicates;
import static java.util.Arrays.asList;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.IOUtils;
import com.constellio.app.entities.modules.MetadataSchemasAlterationHelper;
import com.constellio.app.entities.modules.MigrationResourcesProvider;
import com.constellio.app.entities.modules.MigrationScript;
import com.constellio.app.modules.rm.RMEmailTemplateConstants;
import com.constellio.app.modules.rm.constants.RMPermissionsTo;
import com.constellio.app.modules.rm.constants.RMRoles;
import com.constellio.app.modules.rm.wrappers.Document;
import com.constellio.app.modules.rm.wrappers.Email;
import com.constellio.app.modules.rm.wrappers.RetentionRule;
import com.constellio.app.services.factories.AppLayerFactory;
import com.constellio.app.services.migrations.CoreRoles;
import com.constellio.data.dao.managers.config.ConfigManagerException.OptimisticLockingConfiguration;
import com.constellio.model.entities.records.wrappers.UserDocument;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.entities.security.Role;
import com.constellio.model.services.emails.EmailTemplatesManager;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.schemas.MetadataSchemaTypesAlteration;
import com.constellio.model.services.schemas.MetadataSchemasManager;
import com.constellio.model.services.schemas.builders.MetadataSchemaBuilder;
import com.constellio.model.services.schemas.builders.MetadataSchemaTypeBuilder;
import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder;
import com.constellio.model.services.security.roles.RolesManager;
public class RMMigrationTo5_1_2 implements MigrationScript {
@Override
public String getVersion() {
return "5.1.2";
}
@Override
public void migrate(String collection, MigrationResourcesProvider migrationResourcesProvider,
AppLayerFactory appLayerFactory)
throws Exception {
new SchemaAlterationFor5_1_2(collection, migrationResourcesProvider, appLayerFactory).migrate();
setupRoles(collection, appLayerFactory.getModelLayerFactory());
addExtractors(collection, appLayerFactory);
reloadEmailTemplates(appLayerFactory, migrationResourcesProvider, collection);
}
private void setupRoles(String collection, ModelLayerFactory modelLayerFactory) {
RolesManager rolesManager = modelLayerFactory.getRolesManager();
Role manager = rolesManager.getRole(collection, RMRoles.MANAGER);
Role rgd = rolesManager.getRole(collection, RMRoles.RGD);
Role administrator = rolesManager.getRole(collection, CoreRoles.ADMINISTRATOR);
List<String> managerPermissions = new ArrayList<>(manager.getOperationPermissions());
managerPermissions.add(RMPermissionsTo.MODIFY_OPENING_DATE_FOLDER);
List<String> newRgdPermissions = new ArrayList<>(rgd.getOperationPermissions());
newRgdPermissions.add(RMPermissionsTo.MODIFY_OPENING_DATE_FOLDER);
List<String> newAdministratorPermissions = new ArrayList<>(administrator.getOperationPermissions());
newAdministratorPermissions.addAll(RMPermissionsTo.PERMISSIONS.getAll());
rolesManager.updateRole(manager.withPermissions(withoutDuplicates(managerPermissions)));
rolesManager.updateRole(rgd.withPermissions(withoutDuplicates(newRgdPermissions)));
rolesManager.updateRole(administrator.withPermissions(withoutDuplicates(newAdministratorPermissions)));
}
private void addExtractors(String collection, AppLayerFactory appLayerFactory) {
MetadataSchemasManager schemasManager = appLayerFactory.getModelLayerFactory().getMetadataSchemasManager();
schemasManager.modify(collection, new MetadataSchemaTypesAlteration() {
@Override
public void alter(MetadataSchemaTypesBuilder types) {
MetadataSchemaBuilder documentSchema = types.getSchema(Document.DEFAULT_SCHEMA);
documentSchema.get(Document.KEYWORDS).getPopulateConfigsBuilder().setProperties(asList(Document.KEYWORDS));
documentSchema.get(Document.AUTHOR).getPopulateConfigsBuilder().setProperties(asList(Document.AUTHOR));
documentSchema.get(Document.COMPANY).getPopulateConfigsBuilder().setProperties(asList(Document.COMPANY));
documentSchema.get(Document.SUBJECT).getPopulateConfigsBuilder().setProperties(asList(Document.SUBJECT));
documentSchema.get(Document.TITLE).getPopulateConfigsBuilder().setProperties(asList(Document.TITLE));
MetadataSchemaBuilder emailSchema = types.getSchema(Email.SCHEMA);
emailSchema.get(Email.TITLE).getPopulateConfigsBuilder().setProperties(asList("subject"));
emailSchema.get(Email.EMAIL_OBJECT).getPopulateConfigsBuilder().setProperties(asList("subject"));
emailSchema.get(Email.EMAIL_FROM).getPopulateConfigsBuilder().setProperties(asList("from"));
emailSchema.get(Email.EMAIL_BCC_TO).getPopulateConfigsBuilder().setProperties(asList("bcc"));
emailSchema.get(Email.EMAIL_CC_TO).getPopulateConfigsBuilder().setProperties(asList("cc"));
emailSchema.get(Email.EMAIL_TO).getPopulateConfigsBuilder().setProperties(asList("to"));
MetadataSchemaBuilder userDocument = types.getSchema(UserDocument.DEFAULT_SCHEMA);
userDocument.get(UserDocument.TITLE).getPopulateConfigsBuilder().setProperties(asList("subject", "title"));
}
});
}
class SchemaAlterationFor5_1_2 extends MetadataSchemasAlterationHelper {
MetadataSchemaTypes types;
protected SchemaAlterationFor5_1_2(String collection, MigrationResourcesProvider migrationResourcesProvider,
AppLayerFactory appLayerFactory) {
super(collection, migrationResourcesProvider, appLayerFactory);
types = appLayerFactory.getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes(collection);
}
@Override
protected void migrate(MetadataSchemaTypesBuilder typesBuilder) {
MetadataSchemaTypeBuilder retentionSchemaType = typesBuilder.getSchemaType(RetentionRule.SCHEMA_TYPE);
retentionSchemaType.getDefaultSchema().getMetadata(RetentionRule.KEYWORDS).setSearchable(true);
}
}
private void reloadEmailTemplates(AppLayerFactory appLayerFactory, MigrationResourcesProvider migrationResourcesProvider,
String collection) {
reloadEmailTemplate(appLayerFactory, migrationResourcesProvider, collection, "remindReturnBorrowedFolderTemplate.html",
RMEmailTemplateConstants.REMIND_BORROW_TEMPLATE_ID);
reloadEmailTemplate(appLayerFactory, migrationResourcesProvider, collection, "approvalRequestForDecomListTemplate.html",
RMEmailTemplateConstants.APPROVAL_REQUEST_TEMPLATE_ID);
reloadEmailTemplate(appLayerFactory, migrationResourcesProvider, collection, "validationRequestForDecomListTemplate.html",
RMEmailTemplateConstants.VALIDATION_REQUEST_TEMPLATE_ID);
reloadEmailTemplate(appLayerFactory, migrationResourcesProvider, collection, "alertAvailableTemplate.html",
RMEmailTemplateConstants.ALERT_AVAILABLE_ID);
}
private void reloadEmailTemplate(AppLayerFactory appLayerFactory, MigrationResourcesProvider migrationResourcesProvider,
String collection,
String templateFileName, String templateId) {
InputStream templateInputStream = migrationResourcesProvider.getStream(templateFileName);
EmailTemplatesManager emailTemplateManager = appLayerFactory.getModelLayerFactory()
.getEmailTemplatesManager();
try {
emailTemplateManager.replaceCollectionTemplate(templateId, collection, templateInputStream);
} catch (IOException | OptimisticLockingConfiguration e) {
throw new RuntimeException(e);
} finally {
IOUtils.closeQuietly(templateInputStream);
}
}
}