package com.constellio.app.modules.rm.migrations;
import static com.constellio.data.utils.LangUtils.withoutDuplicates;
import java.util.ArrayList;
import java.util.List;
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.entities.schemasDisplay.SchemaDisplayConfig;
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.RetentionRule;
import com.constellio.app.services.factories.AppLayerFactory;
import com.constellio.app.services.schemasDisplay.SchemaDisplayManagerTransaction;
import com.constellio.app.services.schemasDisplay.SchemasDisplayManager;
import com.constellio.model.entities.CorePermissions;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.entities.schemas.MetadataValueType;
import com.constellio.model.entities.schemas.Schemas;
import com.constellio.model.entities.security.Role;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.schemas.builders.MetadataSchemaBuilder;
import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder;
public class RMMigrationTo5_0_3 implements MigrationScript {
@Override
public String getVersion() {
return "5.0.3";
}
@Override
public void migrate(String collection, MigrationResourcesProvider migrationResourcesProvider,
AppLayerFactory appLayerFactory) {
new SchemaAlterationFor5_0_3(collection, migrationResourcesProvider, appLayerFactory).migrate();
givenNewPermissionsToExistingRMRoles(collection, appLayerFactory.getModelLayerFactory());
configureNewDocumentMetadatasDisplay(collection, migrationResourcesProvider, appLayerFactory);
}
class SchemaAlterationFor5_0_3 extends MetadataSchemasAlterationHelper {
protected SchemaAlterationFor5_0_3(String collection, MigrationResourcesProvider migrationResourcesProvider,
AppLayerFactory appLayerFactory) {
super(collection, migrationResourcesProvider, appLayerFactory);
}
public String getVersion() {
return "5.0.3";
}
@Override
protected void migrate(MetadataSchemaTypesBuilder typesBuilder) {
MetadataSchemaBuilder documentSchema = typesBuilder.getDefaultSchema(Document.SCHEMA_TYPE);
documentSchema.create(Document.AUTHOR).setType(MetadataValueType.STRING);
documentSchema.create(Document.COMPANY).setType(MetadataValueType.STRING);
documentSchema.create(Document.SUBJECT).setType(MetadataValueType.STRING);
typesBuilder.getSchema(RetentionRule.DEFAULT_SCHEMA).get(Schemas.TITLE_CODE).setDefaultRequirement(true);
}
}
private void givenNewPermissionsToExistingRMRoles(String collection, ModelLayerFactory modelLayerFactory) {
Role rgdRole = modelLayerFactory.getRolesManager().getRole(collection, RMRoles.RGD);
Role userRole = modelLayerFactory.getRolesManager().getRole(collection, RMRoles.USER);
Role managerRole = modelLayerFactory.getRolesManager().getRole(collection, RMRoles.MANAGER);
List<String> userPermissions = new ArrayList<>(userRole.getOperationPermissions());
userPermissions.add(RMPermissionsTo.SHARE_DOCUMENT);
userPermissions.add(RMPermissionsTo.SHARE_FOLDER);
List<String> managerPermissions = new ArrayList<>(managerRole.getOperationPermissions());
managerPermissions.add(RMPermissionsTo.SHARE_DOCUMENT);
managerPermissions.add(RMPermissionsTo.SHARE_FOLDER);
managerPermissions.add(RMPermissionsTo.MANAGE_FOLDER_AUTHORIZATIONS);
managerPermissions.add(RMPermissionsTo.MANAGE_DOCUMENT_AUTHORIZATIONS);
List<String> newRgdPermissions = new ArrayList<>();
newRgdPermissions.addAll(RMPermissionsTo.PERMISSIONS.getAll());
newRgdPermissions.addAll(CorePermissions.PERMISSIONS.getAll());
modelLayerFactory.getRolesManager().updateRole(userRole.withPermissions(withoutDuplicates(userPermissions)));
modelLayerFactory.getRolesManager().updateRole(managerRole.withPermissions(withoutDuplicates(managerPermissions)));
modelLayerFactory.getRolesManager().updateRole(rgdRole.withPermissions(withoutDuplicates(newRgdPermissions)));
}
private void configureNewDocumentMetadatasDisplay(String collection, MigrationResourcesProvider migrationResourcesProvider,
AppLayerFactory appLayerFactory) {
MetadataSchemaTypes types = appLayerFactory.getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes(collection);
SchemasDisplayManager schemasDisplayManager = appLayerFactory.getMetadataSchemasDisplayManager();
SchemaDisplayManagerTransaction transaction = new SchemaDisplayManagerTransaction();
SchemaDisplayConfig schemaDisplayConfig = schemasDisplayManager.getSchema(types.getCollection(), Document.DEFAULT_SCHEMA);
List<String> formMetadatas = new ArrayList<>(schemaDisplayConfig.getFormMetadataCodes());
List<String> displayMetadatas = new ArrayList<>(schemaDisplayConfig.getDisplayMetadataCodes());
formMetadatas.add(Document.DEFAULT_SCHEMA + "_" + Document.AUTHOR);
formMetadatas.add(Document.DEFAULT_SCHEMA + "_" + Document.COMPANY);
formMetadatas.add(Document.DEFAULT_SCHEMA + "_" + Document.SUBJECT);
displayMetadatas.add(displayMetadatas.size() - 1, Document.DEFAULT_SCHEMA + "_" + Document.AUTHOR);
displayMetadatas.add(displayMetadatas.size() - 1, Document.DEFAULT_SCHEMA + "_" + Document.COMPANY);
displayMetadatas.add(displayMetadatas.size() - 1, Document.DEFAULT_SCHEMA + "_" + Document.SUBJECT);
transaction.add(schemaDisplayConfig.withDisplayMetadataCodes(displayMetadatas).withFormMetadataCodes(formMetadatas));
schemasDisplayManager.execute(transaction);
}
}