diff --git a/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/BulkCommandDto.java b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/BulkCommandDto.java new file mode 100644 index 00000000000..aa66a04e9e6 --- /dev/null +++ b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/BulkCommandDto.java @@ -0,0 +1,51 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archives.search.common.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import lombok.Data; +import lombok.NonNull; + +import javax.validation.constraints.Size; +import java.util.Collection; + +import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL; + +@Data +@JsonInclude(NON_NULL) +public class BulkCommandDto { + @NonNull + @Size(min = 1, message = "Requires at least one command to play a bulk operation") + @JsonProperty("queries") + private Collection commands; + + private Integer threshold; +} diff --git a/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/JsonPatchDto.java b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/JsonPatchDto.java new file mode 100644 index 00000000000..e7b2b722c5d --- /dev/null +++ b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/JsonPatchDto.java @@ -0,0 +1,45 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archives.search.common.dto; + +import fr.gouv.vitamui.archives.search.common.model.JsonPatch; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.NonNull; +import lombok.experimental.Accessors; + +import javax.validation.constraints.Size; + +@Data +@NoArgsConstructor +@Accessors(chain = true) +public class JsonPatchDto { + @NonNull private String id; + @NonNull private JsonPatch jsonPatch; +} diff --git a/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/MultiJsonPatchDto.java b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/MultiJsonPatchDto.java new file mode 100644 index 00000000000..63df4137a5b --- /dev/null +++ b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/MultiJsonPatchDto.java @@ -0,0 +1,38 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archives.search.common.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.ArrayList; + +@Data +@EqualsAndHashCode(callSuper = true) +public class MultiJsonPatchDto extends ArrayList { +} diff --git a/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/OperationIdDto.java b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/OperationIdDto.java new file mode 100644 index 00000000000..8ce2a9c8419 --- /dev/null +++ b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/OperationIdDto.java @@ -0,0 +1,39 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archives.search.common.dto; + +import com.fasterxml.jackson.annotation.JsonValue; +import fr.gouv.vitamui.archives.search.common.model.OperationId; +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +public class OperationIdDto { + private OperationId operationId; +} diff --git a/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/UpdateArchiveUnitDto.java b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/UpdateArchiveUnitDto.java new file mode 100644 index 00000000000..d7272d10b1a --- /dev/null +++ b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/UpdateArchiveUnitDto.java @@ -0,0 +1,59 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archives.search.common.dto; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.NonNull; + +import java.util.HashMap; +import java.util.Map; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UpdateArchiveUnitDto { + @NonNull + @JsonProperty("#id") + private String id; + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperties(String key, Object value) { + additionalProperties.put(key, value); + } +} diff --git a/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/converter/JsonPatchDtoToUpdateMultiQueryConverter.java b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/converter/JsonPatchDtoToUpdateMultiQueryConverter.java new file mode 100644 index 00000000000..796e9981c71 --- /dev/null +++ b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/converter/JsonPatchDtoToUpdateMultiQueryConverter.java @@ -0,0 +1,82 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archives.search.common.dto.converter; + +import fr.gouv.vitam.common.database.builder.query.Query; +import fr.gouv.vitam.common.database.builder.query.QueryHelper; +import fr.gouv.vitam.common.database.builder.query.action.Action; +import fr.gouv.vitam.common.database.builder.request.exception.InvalidCreateOperationException; +import fr.gouv.vitam.common.database.builder.request.multiple.UpdateMultiQuery; +import fr.gouv.vitamui.archives.search.common.dto.JsonPatchDto; +import fr.gouv.vitamui.archives.search.common.exception.DslQueryCreateException; +import fr.gouv.vitamui.commons.api.logger.VitamUILogger; +import fr.gouv.vitamui.commons.api.logger.VitamUILoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Service; + +import static fr.gouv.vitamui.commons.api.utils.ArchiveSearchConsts.GUID; +import static java.util.Objects.nonNull; + +@Service +public class JsonPatchDtoToUpdateMultiQueryConverter implements Converter { + private static final VitamUILogger log = + VitamUILoggerFactory.getInstance(JsonPatchDtoToUpdateMultiQueryConverter.class); + private final JsonPatchToSetActionConverter jsonPatchToSetActionConverter; + private final JsonPatchToUnsetActionConverter jsonPatchToUnsetActionConverter; + + @Autowired + public JsonPatchDtoToUpdateMultiQueryConverter(final JsonPatchToSetActionConverter jsonPatchToSetActionConverter, + JsonPatchToUnsetActionConverter jsonPatchToUnsetActionConverter) { + this.jsonPatchToSetActionConverter = jsonPatchToSetActionConverter; + this.jsonPatchToUnsetActionConverter = jsonPatchToUnsetActionConverter; + } + + @Override + public UpdateMultiQuery convert(JsonPatchDto source) { + try { + final UpdateMultiQuery updateMultiQuery = new UpdateMultiQuery(); + final Query query = QueryHelper.eq(GUID, source.getId()); + updateMultiQuery.addQueries(query); + + final Action unset = jsonPatchToUnsetActionConverter.convert(source.getJsonPatch()); + if (nonNull(unset)) { + updateMultiQuery.addActions(unset); + } + + final Action set = jsonPatchToSetActionConverter.convert(source.getJsonPatch()); + if (nonNull(set)) { + updateMultiQuery.addActions(set); + } + return updateMultiQuery; + } catch (InvalidCreateOperationException e) { + log.error("{}", e); + throw new DslQueryCreateException(e); + } + } +} diff --git a/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/converter/JsonPatchToSetActionConverter.java b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/converter/JsonPatchToSetActionConverter.java new file mode 100644 index 00000000000..00ff6875618 --- /dev/null +++ b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/converter/JsonPatchToSetActionConverter.java @@ -0,0 +1,70 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archives.search.common.dto.converter; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.gouv.vitam.common.database.builder.query.action.SetAction; +import fr.gouv.vitam.common.database.builder.query.action.UpdateActionHelper; +import fr.gouv.vitam.common.database.builder.request.exception.InvalidCreateOperationException; +import fr.gouv.vitamui.archives.search.common.exception.DslQueryCreateException; +import fr.gouv.vitamui.archives.search.common.model.JsonPatch; +import fr.gouv.vitamui.archives.search.common.model.PatchCommand; +import fr.gouv.vitamui.commons.api.logger.VitamUILogger; +import fr.gouv.vitamui.commons.api.logger.VitamUILoggerFactory; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static fr.gouv.vitamui.archives.search.common.model.PatchOperation.ADD; +import static fr.gouv.vitamui.archives.search.common.model.PatchOperation.REPLACE; + +@Service +public class JsonPatchToSetActionConverter implements Converter { + + private static final VitamUILogger log = + VitamUILoggerFactory.getInstance(JsonPatchToSetActionConverter.class); + + @Override + public SetAction convert(JsonPatch source) { + final Map map = source.stream() + .filter(patchCommand -> List.of(ADD, REPLACE).contains(patchCommand.getOp())) + .collect(Collectors.toMap(PatchCommand::getPath, PatchCommand::getValue)); + if (!map.isEmpty()) { + try { + return UpdateActionHelper.set(map); + } catch (InvalidCreateOperationException e) { + log.error("{}", e); + throw new DslQueryCreateException(e); + } + } + throw new DslQueryCreateException("Cannot create a query without commands"); + } +} diff --git a/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/converter/JsonPatchToUnsetActionConverter.java b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/converter/JsonPatchToUnsetActionConverter.java new file mode 100644 index 00000000000..0fc5322a700 --- /dev/null +++ b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/converter/JsonPatchToUnsetActionConverter.java @@ -0,0 +1,63 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archives.search.common.dto.converter; + +import fr.gouv.vitam.common.database.builder.query.action.UnsetAction; +import fr.gouv.vitam.common.database.builder.query.action.UpdateActionHelper; +import fr.gouv.vitam.common.database.builder.request.exception.InvalidCreateOperationException; +import fr.gouv.vitamui.archives.search.common.exception.DslQueryCreateException; +import fr.gouv.vitamui.archives.search.common.model.JsonPatch; +import fr.gouv.vitamui.archives.search.common.model.PatchCommand; +import fr.gouv.vitamui.archives.search.common.model.PatchOperation; +import fr.gouv.vitamui.commons.api.logger.VitamUILogger; +import fr.gouv.vitamui.commons.api.logger.VitamUILoggerFactory; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Service; + +@Service +public class JsonPatchToUnsetActionConverter implements Converter { + private static final VitamUILogger log = + VitamUILoggerFactory.getInstance(JsonPatchToUnsetActionConverter.class); + + @Override + public UnsetAction convert(JsonPatch source) { + try { + final String[] paths = source.stream() + .filter(patchCommand -> patchCommand.getOp() == PatchOperation.REMOVE) + .map(PatchCommand::getPath) + .toArray(String[]::new); + if (paths.length > 0) { + return UpdateActionHelper.unset(paths); + } + } catch (InvalidCreateOperationException e) { + log.error("{}", e); + throw new DslQueryCreateException(e); + } + throw new DslQueryCreateException("Cannot create a query without commands"); + } +} diff --git a/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/converter/UpdateArchiveUnitDtoToUpdateMultiQueryConverter.java b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/converter/UpdateArchiveUnitDtoToUpdateMultiQueryConverter.java new file mode 100644 index 00000000000..a45de2a8cd2 --- /dev/null +++ b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/converter/UpdateArchiveUnitDtoToUpdateMultiQueryConverter.java @@ -0,0 +1,67 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archives.search.common.dto.converter; + +import fr.gouv.vitam.common.database.builder.query.Query; +import fr.gouv.vitam.common.database.builder.query.QueryHelper; +import fr.gouv.vitam.common.database.builder.query.action.Action; +import fr.gouv.vitam.common.database.builder.query.action.UpdateActionHelper; +import fr.gouv.vitam.common.database.builder.request.exception.InvalidCreateOperationException; +import fr.gouv.vitam.common.database.builder.request.multiple.UpdateMultiQuery; +import fr.gouv.vitamui.archives.search.common.dto.UpdateArchiveUnitDto; +import fr.gouv.vitamui.archives.search.common.exception.DslQueryCreateException; +import fr.gouv.vitamui.commons.api.logger.VitamUILogger; +import fr.gouv.vitamui.commons.api.logger.VitamUILoggerFactory; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Service; + +import static fr.gouv.vitamui.commons.api.utils.ArchiveSearchConsts.GUID; + +@Service +public class UpdateArchiveUnitDtoToUpdateMultiQueryConverter + implements Converter { + private static final VitamUILogger log = + VitamUILoggerFactory.getInstance(UpdateArchiveUnitDtoToUpdateMultiQueryConverter.class); + + @Override + public UpdateMultiQuery convert(UpdateArchiveUnitDto source) { + try { + final UpdateMultiQuery updateMultiQuery = new UpdateMultiQuery(); + final Query query = QueryHelper.eq(GUID, source.getId()); + final Action action = UpdateActionHelper.set(source.getAdditionalProperties()); + + updateMultiQuery.addQueries(query); + updateMultiQuery.addActions(action); + + return updateMultiQuery; + } catch (InvalidCreateOperationException e) { + log.error("{}", e); + throw new DslQueryCreateException(e); + } + } +} diff --git a/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/converter/UpdateMultiQueriesToBulkCommandDto.java b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/converter/UpdateMultiQueriesToBulkCommandDto.java new file mode 100644 index 00000000000..7fda63096b3 --- /dev/null +++ b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/dto/converter/UpdateMultiQueriesToBulkCommandDto.java @@ -0,0 +1,52 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archives.search.common.dto.converter; + +import com.fasterxml.jackson.databind.node.ObjectNode; +import fr.gouv.vitam.common.database.builder.request.multiple.UpdateMultiQuery; +import fr.gouv.vitamui.archives.search.common.dto.BulkCommandDto; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +@Service +public class UpdateMultiQueriesToBulkCommandDto implements Converter, BulkCommandDto> { + @Override + public BulkCommandDto convert(Set source) { + final List finalUpdateMultiQueries = + source.stream() + .map(UpdateMultiQuery::getFinalUpdate) + .peek(objectNode -> objectNode.remove("$roots")) + .peek(objectNode -> objectNode.remove("$filter")) + .collect(Collectors.toList()); + return new BulkCommandDto(finalUpdateMultiQueries); + } +} diff --git a/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/exception/ArchiveUnitUpdateException.java b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/exception/ArchiveUnitUpdateException.java new file mode 100644 index 00000000000..8328ab97905 --- /dev/null +++ b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/exception/ArchiveUnitUpdateException.java @@ -0,0 +1,43 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archives.search.common.exception; + +import org.springframework.web.bind.annotation.ResponseStatus; + +import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; + +@ResponseStatus(code = INTERNAL_SERVER_ERROR, reason = "Fail to update archive unit") +public class ArchiveUnitUpdateException extends RuntimeException { + public ArchiveUnitUpdateException(Throwable e) { + super(e); + } + + public ArchiveUnitUpdateException(String message) { + super(message); + } +} diff --git a/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/exception/DslQueryCreateException.java b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/exception/DslQueryCreateException.java new file mode 100644 index 00000000000..36661b21da2 --- /dev/null +++ b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/exception/DslQueryCreateException.java @@ -0,0 +1,44 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archives.search.common.exception; + + +import org.springframework.web.bind.annotation.ResponseStatus; + +import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; + +@ResponseStatus(code = INTERNAL_SERVER_ERROR, reason = "Fail to create dsl query") +public class DslQueryCreateException extends RuntimeException { + public DslQueryCreateException(Throwable e) { + super(e); + } + + public DslQueryCreateException(String e) { + super(e); + } +} diff --git a/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/model/JsonPatch.java b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/model/JsonPatch.java new file mode 100644 index 00000000000..0f2d3da4548 --- /dev/null +++ b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/model/JsonPatch.java @@ -0,0 +1,39 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archives.search.common.model; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.ArrayList; + + +@Data +@EqualsAndHashCode(callSuper = true) +public class JsonPatch extends ArrayList { +} diff --git a/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/model/OperationId.java b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/model/OperationId.java new file mode 100644 index 00000000000..3e353e94f91 --- /dev/null +++ b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/model/OperationId.java @@ -0,0 +1,45 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archives.search.common.model; + +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@EqualsAndHashCode +public class OperationId { + @NonNull private String value; + + @JsonValue + public String getValue() { + return value; + } +} diff --git a/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/model/PatchCommand.java b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/model/PatchCommand.java new file mode 100644 index 00000000000..47353caf26a --- /dev/null +++ b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/model/PatchCommand.java @@ -0,0 +1,45 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archives.search.common.model; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import fr.gouv.vitamui.archives.search.common.model.PatchOperation; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Data +@Accessors(chain = true) +public class PatchCommand { + @NotNull private PatchOperation op; + @NotBlank private String path; + @NotNull private JsonNode value; +} diff --git a/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/model/PatchOperation.java b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/model/PatchOperation.java new file mode 100644 index 00000000000..c34b79a7f41 --- /dev/null +++ b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/model/PatchOperation.java @@ -0,0 +1,47 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archives.search.common.model; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum PatchOperation { + ADD("add"), + REMOVE("remove"), + REPLACE("replace"); + + final private String value; + + PatchOperation(final String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } +} diff --git a/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/rest/ArchiveUnitClient.java b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/rest/ArchiveUnitClient.java new file mode 100644 index 00000000000..2c79f65fe2c --- /dev/null +++ b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/rest/ArchiveUnitClient.java @@ -0,0 +1,50 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archives.search.common.rest; + +import fr.gouv.vitamui.archives.search.common.dto.JsonPatchDto; +import fr.gouv.vitamui.archives.search.common.dto.MultiJsonPatchDto; +import fr.gouv.vitamui.archives.search.common.dto.OperationIdDto; +import fr.gouv.vitamui.archives.search.common.dto.UpdateArchiveUnitDto; +import fr.gouv.vitamui.archives.search.common.model.JsonPatch; +import fr.gouv.vitamui.commons.rest.client.AbstractHttpContext; + +import java.util.Set; + +public interface ArchiveUnitClient { + OperationIdDto update(final AbstractHttpContext abstractHttpContext, + final Set updateOperationDtoSet); + + OperationIdDto update(final AbstractHttpContext abstractHttpContext, final String id, + final JsonPatch jsonPatch); + + OperationIdDto update(final AbstractHttpContext abstractHttpContext, final JsonPatchDto jsonPatchDto); + + OperationIdDto update(final AbstractHttpContext abstractHttpContext, + final MultiJsonPatchDto multiJsonPatchDto); +} diff --git a/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/service/ArchiveUnitService.java b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/service/ArchiveUnitService.java new file mode 100644 index 00000000000..8511d0b79cf --- /dev/null +++ b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/service/ArchiveUnitService.java @@ -0,0 +1,42 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archives.search.common.service; + +import fr.gouv.vitamui.archives.search.common.dto.JsonPatchDto; +import fr.gouv.vitamui.archives.search.common.dto.MultiJsonPatchDto; +import fr.gouv.vitamui.archives.search.common.model.JsonPatch; +import fr.gouv.vitamui.archives.search.common.dto.OperationIdDto; +import fr.gouv.vitamui.archives.search.common.dto.UpdateArchiveUnitDto; + +import java.util.Set; + +public interface ArchiveUnitService { + OperationIdDto update(Set updateArchiveUnitDtoSet); + OperationIdDto update(JsonPatchDto jsonPatchDto); + OperationIdDto update(MultiJsonPatchDto multiJsonPatchDto); +} diff --git a/api/api-archive-search/archive-search-commons/src/test/java/fr/gouv/vitamui/archives/search/common/dto/MultiJsonPatchDtoTest.java b/api/api-archive-search/archive-search-commons/src/test/java/fr/gouv/vitamui/archives/search/common/dto/MultiJsonPatchDtoTest.java new file mode 100644 index 00000000000..90b3bcdb5e7 --- /dev/null +++ b/api/api-archive-search/archive-search-commons/src/test/java/fr/gouv/vitamui/archives/search/common/dto/MultiJsonPatchDtoTest.java @@ -0,0 +1,103 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archives.search.common.dto; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.node.ObjectNode; +import fr.gouv.vitamui.archives.search.common.model.JsonPatch; +import fr.gouv.vitamui.archives.search.common.model.PatchCommand; +import fr.gouv.vitamui.archives.search.common.model.PatchOperation; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class MultiJsonPatchDtoTest { + @Test + public void testJsonPatchSerializationDeserialization() throws JsonProcessingException { + // Création d'un exemple de MultiJsonPatchDto + ObjectMapper objectMapper = new ObjectMapper(); + JsonPatch jsonPatch = new JsonPatch(); + jsonPatch.add(new PatchCommand().setOp(PatchOperation.ADD).setPath("/name") + .setValue(objectMapper.readValue("{\"field\":\"John\"}", ObjectNode.class))); + MultiJsonPatchDto multiJsonPatchDto = new MultiJsonPatchDto(); + multiJsonPatchDto.add(new JsonPatchDto().setId("1").setJsonPatch(new JsonPatch())); + multiJsonPatchDto.add(new JsonPatchDto().setId("2").setJsonPatch(jsonPatch)); + + // Conversion de l'objet en JSON + String jsonString = objectMapper.writeValueAsString(multiJsonPatchDto); + + // Vérification de la sérialisation + assertEquals( + "[{\"id\":\"1\",\"jsonPatch\":[]},{\"id\":\"2\",\"jsonPatch\":[{\"op\":\"add\",\"path\":\"/name\",\"value\":{\"field\":\"John\"}}]}]", + jsonString); + + // Conversion du JSON en objet MultiJsonPatchDto + MultiJsonPatchDto deserializedDto = objectMapper.readValue(jsonString, MultiJsonPatchDto.class); + + // Vérification de la désérialisation + assertEquals(2, deserializedDto.size()); + assertEquals("1", deserializedDto.get(0).getId()); + assertEquals(0, deserializedDto.get(0).getJsonPatch().size()); + assertEquals("2", deserializedDto.get(1).getId()); + assertEquals(1, deserializedDto.get(1).getJsonPatch().size()); + } + + @Test + public void testMultiJsonPatchWithAddInstruction() throws JsonProcessingException { + // Création d'un exemple de MultiJsonPatchDto avec une instruction ADD + MultiJsonPatchDto multiJsonPatchDto = new MultiJsonPatchDto(); + JsonPatch jsonPatch = new JsonPatch(); + jsonPatch.add(new PatchCommand().setOp(PatchOperation.ADD).setPath("/name") + .setValue(JsonNodeFactory.instance.textNode("bonjour"))); + multiJsonPatchDto.add(new JsonPatchDto().setId("1").setJsonPatch(jsonPatch)); + + // Conversion de l'objet en JSON + ObjectMapper objectMapper = new ObjectMapper(); + String jsonString = objectMapper.writeValueAsString(multiJsonPatchDto); + + // Vérification de la sérialisation + String expectedJson = + "[{\"id\":\"1\",\"jsonPatch\":[{\"op\":\"add\",\"path\":\"/name\",\"value\":\"bonjour\"}]}]"; + assertEquals(expectedJson, jsonString); + + // Conversion du JSON en objet MultiJsonPatchDto + MultiJsonPatchDto deserializedDto = objectMapper.readValue(jsonString, MultiJsonPatchDto.class); + + // Vérification de la désérialisation + assertEquals(1, deserializedDto.size()); + JsonPatch deserializedJsonPatch = deserializedDto.get(0).getJsonPatch(); + assertEquals(1, deserializedJsonPatch.size()); + PatchCommand deserializedPatchCommand = deserializedJsonPatch.get(0); + assertEquals(PatchOperation.ADD, deserializedPatchCommand.getOp()); + assertEquals("/name", deserializedPatchCommand.getPath()); + assertEquals(JsonNodeFactory.instance.textNode("bonjour"), deserializedPatchCommand.getValue()); + } + +} diff --git a/api/api-archive-search/archive-search-commons/src/test/java/fr/gouv/vitamui/archives/search/common/dto/OperationIdDtoTest.java b/api/api-archive-search/archive-search-commons/src/test/java/fr/gouv/vitamui/archives/search/common/dto/OperationIdDtoTest.java new file mode 100644 index 00000000000..39e21ed8cdc --- /dev/null +++ b/api/api-archive-search/archive-search-commons/src/test/java/fr/gouv/vitamui/archives/search/common/dto/OperationIdDtoTest.java @@ -0,0 +1,56 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archives.search.common.dto; + +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.gouv.vitamui.archives.search.common.model.OperationId; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class OperationIdDtoTest { + @Test + public void testSerializationDeserialization() throws Exception { + // Création d'un objet OperationIdDto + OperationIdDto originalDto = new OperationIdDto(); + originalDto.setOperationId(new OperationId("1")); + + // Conversion de l'objet en JSON + ObjectMapper objectMapper = new ObjectMapper(); + String jsonString = objectMapper.writeValueAsString(originalDto); + + // Vérification de la sérialisation + assertEquals("{\"operationId\":\"1\"}", jsonString); + + // Conversion du JSON en objet OperationIdDto + OperationIdDto deserializedDto = objectMapper.readValue(jsonString, OperationIdDto.class); + + // Vérification de la désérialisation + assertEquals("1", deserializedDto.getOperationId().getValue()); + } +} diff --git a/api/api-archive-search/archive-search-external-client/src/main/java/fr/gouv/vitamui/archives/search/external/client/ArchiveSearchExternalRestClientFactory.java b/api/api-archive-search/archive-search-external-client/src/main/java/fr/gouv/vitamui/archives/search/external/client/ArchiveSearchExternalRestClientFactory.java index 63e38411bd6..6b28047b701 100644 --- a/api/api-archive-search/archive-search-external-client/src/main/java/fr/gouv/vitamui/archives/search/external/client/ArchiveSearchExternalRestClientFactory.java +++ b/api/api-archive-search/archive-search-external-client/src/main/java/fr/gouv/vitamui/archives/search/external/client/ArchiveSearchExternalRestClientFactory.java @@ -26,6 +26,7 @@ package fr.gouv.vitamui.archives.search.external.client; +import fr.gouv.vitamui.archives.search.common.rest.ArchiveUnitClient; import fr.gouv.vitamui.commons.rest.client.BaseRestClientFactory; import fr.gouv.vitamui.commons.rest.client.configuration.HttpPoolConfiguration; import fr.gouv.vitamui.commons.rest.client.configuration.RestClientConfiguration; @@ -53,4 +54,8 @@ public ArchiveSearchExternalRestClient getArchiveSearchExternalRestClient() { public SearchCriteriaHistoryExternalRestClient getSearchCriteriaHistoryExternalRestClient() { return new SearchCriteriaHistoryExternalRestClient(getRestTemplate(), getBaseUrl()); } + + public ArchiveUnitClient getArchiveUnitClient() { + return new ArchiveUnitClientImpl(getRestTemplate(), getBaseUrl()); + } } diff --git a/api/api-archive-search/archive-search-external-client/src/main/java/fr/gouv/vitamui/archives/search/external/client/ArchiveUnitClientImpl.java b/api/api-archive-search/archive-search-external-client/src/main/java/fr/gouv/vitamui/archives/search/external/client/ArchiveUnitClientImpl.java new file mode 100644 index 00000000000..32a10a6c539 --- /dev/null +++ b/api/api-archive-search/archive-search-external-client/src/main/java/fr/gouv/vitamui/archives/search/external/client/ArchiveUnitClientImpl.java @@ -0,0 +1,121 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archives.search.external.client; + +import fr.gouv.vitamui.archives.search.common.dto.JsonPatchDto; +import fr.gouv.vitamui.archives.search.common.dto.MultiJsonPatchDto; +import fr.gouv.vitamui.archives.search.common.dto.OperationIdDto; +import fr.gouv.vitamui.archives.search.common.dto.UpdateArchiveUnitDto; +import fr.gouv.vitamui.archives.search.common.model.JsonPatch; +import fr.gouv.vitamui.archives.search.common.rest.ArchiveUnitClient; +import fr.gouv.vitamui.commons.api.logger.VitamUILogger; +import fr.gouv.vitamui.commons.api.logger.VitamUILoggerFactory; +import fr.gouv.vitamui.commons.rest.client.AbstractHttpContext; +import fr.gouv.vitamui.commons.rest.client.BaseRestClient; +import fr.gouv.vitamui.commons.rest.client.ExternalHttpContext; +import org.apache.http.client.utils.URIBuilder; +import org.springframework.http.HttpEntity; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Objects; +import java.util.Set; + +import static org.springframework.http.HttpMethod.PATCH; + +public class ArchiveUnitClientImpl extends BaseRestClient implements ArchiveUnitClient { + private final static String ARCHIVE_UNITS = "archive-units"; + private static final VitamUILogger log = VitamUILoggerFactory.getInstance(ArchiveUnitClientImpl.class); + + public ArchiveUnitClientImpl(RestTemplate restTemplate, String baseUrl) { + super(restTemplate, baseUrl); + } + + @Override + public String getPathUrl() { + return String.format("/%s", ARCHIVE_UNITS); + } + + public OperationIdDto update(final AbstractHttpContext abstractHttpContext, + final Set updateOperationDtoSet) { + final URI uri; + try { + uri = new URIBuilder(getBaseUrl()).setPathSegments(ARCHIVE_UNITS).build(); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + final HttpEntity httpEntity = new HttpEntity<>(updateOperationDtoSet, buildHeaders(abstractHttpContext)); + final ResponseEntity responseEntity = + restTemplate.exchange(uri, PATCH, httpEntity, OperationIdDto.class); + return Objects.requireNonNull(responseEntity.getBody()); + } + + public OperationIdDto update(final AbstractHttpContext abstractHttpContext, final String id, + final JsonPatch jsonPatch) { + final URI uri; + try { + uri = new URIBuilder(getBaseUrl()).setPathSegments(ARCHIVE_UNITS, id).build(); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + final HttpEntity httpEntity = new HttpEntity<>(jsonPatch, buildHeaders(abstractHttpContext)); + final ResponseEntity responseEntity = + restTemplate.exchange(uri, PATCH, httpEntity, OperationIdDto.class); + return Objects.requireNonNull(responseEntity.getBody()); + } + + public OperationIdDto update(final AbstractHttpContext abstractHttpContext, final JsonPatchDto jsonPatchDto) { + final URI uri; + try { + uri = new URIBuilder(getBaseUrl()).setPathSegments(ARCHIVE_UNITS, "update", "single").build(); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + final HttpEntity httpEntity = new HttpEntity<>(jsonPatchDto, buildHeaders(abstractHttpContext)); + final ResponseEntity responseEntity = + restTemplate.exchange(uri, PATCH, httpEntity, OperationIdDto.class); + return Objects.requireNonNull(responseEntity.getBody()); + } + + public OperationIdDto update(final AbstractHttpContext abstractHttpContext, + final MultiJsonPatchDto multiJsonPatchDto) { + final URI uri; + try { + uri = new URIBuilder(getBaseUrl()).setPathSegments(ARCHIVE_UNITS, "update", "multiple").build(); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + final HttpEntity httpEntity = new HttpEntity<>(multiJsonPatchDto, buildHeaders(abstractHttpContext)); + final ResponseEntity responseEntity = + restTemplate.exchange(uri, PATCH, httpEntity, OperationIdDto.class); + return Objects.requireNonNull(responseEntity.getBody()); + } + +} diff --git a/api/api-archive-search/archive-search-external/src/main/java/fr/gouv/vitamui/archives/search/external/server/config/ApiArchiveServerConfig.java b/api/api-archive-search/archive-search-external/src/main/java/fr/gouv/vitamui/archives/search/external/server/config/ApiArchiveServerConfig.java index 0973d0f3a55..b504993f104 100644 --- a/api/api-archive-search/archive-search-external/src/main/java/fr/gouv/vitamui/archives/search/external/server/config/ApiArchiveServerConfig.java +++ b/api/api-archive-search/archive-search-external/src/main/java/fr/gouv/vitamui/archives/search/external/server/config/ApiArchiveServerConfig.java @@ -33,6 +33,7 @@ import fr.gouv.archive.internal.client.ArchiveSearchStreamingInternalRestClient; import fr.gouv.archive.internal.client.ArchiveSearchStreamingInternalRestClientFactory; import fr.gouv.archive.internal.client.SearchCriteriaHistoryInternalRestClient; +import fr.gouv.vitamui.archives.search.common.rest.ArchiveUnitClient; import fr.gouv.vitamui.commons.api.application.AbstractContextConfiguration; import fr.gouv.vitamui.commons.rest.RestExceptionHandler; import fr.gouv.vitamui.commons.rest.configuration.SwaggerConfiguration; @@ -42,6 +43,7 @@ import fr.gouv.vitamui.iam.security.provider.ExternalApiAuthenticationProvider; import fr.gouv.vitamui.iam.security.service.ExternalAuthentificationService; import fr.gouv.vitamui.iam.security.service.ExternalSecurityService; +import fr.gouv.vitamui.iam.security.service.InternalSecurityService; import fr.gouv.vitamui.security.client.ContextRestClient; import fr.gouv.vitamui.security.client.SecurityRestClientFactory; import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration; @@ -156,4 +158,9 @@ public ExternalParametersInternalRestClient externalParametersInternalRestClient return iamInternalRestClientFactory.getExternalParametersInternalRestClient(); } + @Bean + public ArchiveUnitClient getArchiveUnitClient( + final ArchiveInternalRestClientFactory archiveInternalRestClientFactory) { + return archiveInternalRestClientFactory.getArchiveUnitClient(); + } } diff --git a/api/api-archive-search/archive-search-external/src/main/java/fr/gouv/vitamui/archives/search/external/server/rest/ArchiveUnitController.java b/api/api-archive-search/archive-search-external/src/main/java/fr/gouv/vitamui/archives/search/external/server/rest/ArchiveUnitController.java new file mode 100644 index 00000000000..f1d54c6c741 --- /dev/null +++ b/api/api-archive-search/archive-search-external/src/main/java/fr/gouv/vitamui/archives/search/external/server/rest/ArchiveUnitController.java @@ -0,0 +1,99 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archives.search.external.server.rest; + +import fr.gouv.vitamui.archives.search.common.dto.JsonPatchDto; +import fr.gouv.vitamui.archives.search.common.dto.MultiJsonPatchDto; +import fr.gouv.vitamui.archives.search.common.dto.OperationIdDto; +import fr.gouv.vitamui.archives.search.common.dto.UpdateArchiveUnitDto; +import fr.gouv.vitamui.archives.search.common.model.JsonPatch; +import fr.gouv.vitamui.archives.search.common.service.ArchiveUnitService; +import fr.gouv.vitamui.commons.api.domain.ServicesData; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.annotation.Secured; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.ws.rs.Consumes; +import javax.ws.rs.Produces; +import java.util.Set; + +import static javax.ws.rs.core.MediaType.APPLICATION_JSON; +import static javax.ws.rs.core.MediaType.APPLICATION_JSON_PATCH_JSON; + +@RestController +@RequestMapping("/archive-units") +public class ArchiveUnitController { + @Autowired ArchiveUnitService archiveUnitService; + + @PatchMapping + @Consumes(APPLICATION_JSON) + @Produces(APPLICATION_JSON) + @Secured(ServicesData.ROLE_UPDATE_UNIT_DESC_METADATA) + @ApiOperation("Updates several archive units asynchronously by passing partial changes to apply to an archive unit") + public ResponseEntity update( + @RequestBody @Validated final Set updateArchiveUnitDtoSet) { + return ResponseEntity.ok(archiveUnitService.update(updateArchiveUnitDtoSet)); + } + + @PatchMapping("/{archiveUnitId}") + @Consumes(APPLICATION_JSON_PATCH_JSON) + @Produces(APPLICATION_JSON) + @Secured(ServicesData.ROLE_UPDATE_UNIT_DESC_METADATA) + @ApiOperation("Updates one archive unit asynchronously by passing a list of operation to do on an archive unit") + public ResponseEntity update(@RequestBody @Validated final JsonPatch jsonPatch, + @RequestParam String archiveUnitId) { + final JsonPatchDto jsonPatchDto = new JsonPatchDto().setId(archiveUnitId).setJsonPatch(jsonPatch); + return update(jsonPatchDto); + } + + @PatchMapping("/update/single") + @Consumes(APPLICATION_JSON) + @Produces(APPLICATION_JSON) + @Secured(ServicesData.ROLE_UPDATE_UNIT_DESC_METADATA) + @ApiOperation("Updates one archive unit asynchronously by passing a list of operation to do on this one") + public ResponseEntity update(@RequestBody @Validated final JsonPatchDto jsonPatchDto) { + return ResponseEntity.ok(archiveUnitService.update(jsonPatchDto)); + } + + @PatchMapping("/update/multiple") + @Consumes(APPLICATION_JSON) + @Produces(APPLICATION_JSON) + @Secured(ServicesData.ROLE_UPDATE_UNIT_DESC_METADATA) + @ApiOperation("Updates several archive units asynchronously by passing a list of operation to do on these ones") + public ResponseEntity update(@RequestBody @Validated final MultiJsonPatchDto multiJsonPatchDto) { + return ResponseEntity.ok(archiveUnitService.update(multiJsonPatchDto)); + } +} + diff --git a/api/api-archive-search/archive-search-external/src/main/java/fr/gouv/vitamui/archives/search/external/server/service/ArchiveUnitServiceImpl.java b/api/api-archive-search/archive-search-external/src/main/java/fr/gouv/vitamui/archives/search/external/server/service/ArchiveUnitServiceImpl.java new file mode 100644 index 00000000000..a49f02ab7ab --- /dev/null +++ b/api/api-archive-search/archive-search-external/src/main/java/fr/gouv/vitamui/archives/search/external/server/service/ArchiveUnitServiceImpl.java @@ -0,0 +1,88 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archives.search.external.server.service; + +import fr.gouv.vitamui.archives.search.common.dto.JsonPatchDto; +import fr.gouv.vitamui.archives.search.common.dto.MultiJsonPatchDto; +import fr.gouv.vitamui.archives.search.common.dto.OperationIdDto; +import fr.gouv.vitamui.archives.search.common.dto.UpdateArchiveUnitDto; +import fr.gouv.vitamui.archives.search.common.rest.ArchiveUnitClient; +import fr.gouv.vitamui.archives.search.common.service.ArchiveUnitService; +import fr.gouv.vitamui.commons.api.exception.ApplicationServerException; +import fr.gouv.vitamui.commons.rest.client.AbstractHttpContext; +import fr.gouv.vitamui.commons.rest.client.ExternalHttpContext; +import fr.gouv.vitamui.commons.rest.client.InternalHttpContext; +import fr.gouv.vitamui.commons.security.client.dto.AuthUserDto; +import fr.gouv.vitamui.iam.security.service.ExternalSecurityService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Set; + +@Service +public class ArchiveUnitServiceImpl implements ArchiveUnitService { + private final ExternalSecurityService externalSecurityService; + private final ArchiveUnitClient client; + + @Autowired + public ArchiveUnitServiceImpl(final ExternalSecurityService externalSecurityService, + final ArchiveUnitClient client) { + this.externalSecurityService = externalSecurityService; + this.client = client; + } + + @Override + public OperationIdDto update(Set updateArchiveUnitDtoSet) { + return client.update(getContext(), updateArchiveUnitDtoSet); + } + + @Override + public OperationIdDto update(JsonPatchDto jsonPatchDto) { + return client.update(getContext(), jsonPatchDto); + } + + @Override + public OperationIdDto update(MultiJsonPatchDto multiJsonPatchDto) { + return client.update(getContext(), multiJsonPatchDto); + } + + private InternalHttpContext toInternalHttpContext(final ExternalHttpContext externalHttpContext) { + final AuthUserDto user = externalSecurityService.getUser(); + final String userLevel = user.getLevel(); + if (userLevel == null) { + throw new ApplicationServerException("Level is null for user " + user.getEmail()); + } + + final String customerId = user.getCustomerId(); + return InternalHttpContext.buildFromExternalHttpContext(externalHttpContext, customerId, userLevel); + } + + private AbstractHttpContext getContext() { + return toInternalHttpContext(externalSecurityService.getHttpContext()); + } +} diff --git a/api/api-archive-search/archive-search-internal-client/src/main/java/fr/gouv/archive/internal/client/ArchiveInternalRestClientFactory.java b/api/api-archive-search/archive-search-internal-client/src/main/java/fr/gouv/archive/internal/client/ArchiveInternalRestClientFactory.java index 5457bb9cc38..46f118a539e 100644 --- a/api/api-archive-search/archive-search-internal-client/src/main/java/fr/gouv/archive/internal/client/ArchiveInternalRestClientFactory.java +++ b/api/api-archive-search/archive-search-internal-client/src/main/java/fr/gouv/archive/internal/client/ArchiveInternalRestClientFactory.java @@ -26,6 +26,7 @@ package fr.gouv.archive.internal.client; +import fr.gouv.vitamui.archives.search.common.rest.ArchiveUnitClient; import fr.gouv.vitamui.commons.rest.client.BaseRestClientFactory; import fr.gouv.vitamui.commons.rest.client.configuration.HttpPoolConfiguration; import fr.gouv.vitamui.commons.rest.client.configuration.RestClientConfiguration; @@ -52,4 +53,8 @@ public SearchCriteriaHistoryInternalRestClient getSearchCriteriaHistoryInternalR return new SearchCriteriaHistoryInternalRestClient(getRestTemplate(), getBaseUrl()); } + public ArchiveUnitClient getArchiveUnitClient() { + return new ArchiveUnitClientImpl(getRestTemplate(), getBaseUrl()); + } + } diff --git a/api/api-archive-search/archive-search-internal-client/src/main/java/fr/gouv/archive/internal/client/ArchiveUnitClientImpl.java b/api/api-archive-search/archive-search-internal-client/src/main/java/fr/gouv/archive/internal/client/ArchiveUnitClientImpl.java new file mode 100644 index 00000000000..6a4fed95343 --- /dev/null +++ b/api/api-archive-search/archive-search-internal-client/src/main/java/fr/gouv/archive/internal/client/ArchiveUnitClientImpl.java @@ -0,0 +1,121 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.archive.internal.client; + +import fr.gouv.vitamui.archives.search.common.dto.JsonPatchDto; +import fr.gouv.vitamui.archives.search.common.dto.MultiJsonPatchDto; +import fr.gouv.vitamui.archives.search.common.dto.OperationIdDto; +import fr.gouv.vitamui.archives.search.common.dto.UpdateArchiveUnitDto; +import fr.gouv.vitamui.archives.search.common.model.JsonPatch; +import fr.gouv.vitamui.archives.search.common.rest.ArchiveUnitClient; +import fr.gouv.vitamui.commons.api.logger.VitamUILogger; +import fr.gouv.vitamui.commons.api.logger.VitamUILoggerFactory; +import fr.gouv.vitamui.commons.rest.client.AbstractHttpContext; +import fr.gouv.vitamui.commons.rest.client.BaseRestClient; +import fr.gouv.vitamui.commons.rest.client.InternalHttpContext; +import org.apache.http.client.utils.URIBuilder; +import org.springframework.http.HttpEntity; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Objects; +import java.util.Set; + +import static org.springframework.http.HttpMethod.PATCH; + +public class ArchiveUnitClientImpl extends BaseRestClient implements ArchiveUnitClient { + private final static String ARCHIVE_UNITS = "archive-units"; + private static final VitamUILogger log = VitamUILoggerFactory.getInstance(ArchiveUnitClientImpl.class); + + public ArchiveUnitClientImpl(RestTemplate restTemplate, String baseUrl) { + super(restTemplate, baseUrl); + } + + @Override + public String getPathUrl() { + return String.format("/%s", ARCHIVE_UNITS); + } + + public OperationIdDto update(final AbstractHttpContext abstractHttpContext, + final Set updateOperationDtoSet) { + final URI uri; + try { + uri = new URIBuilder(getBaseUrl()).setPathSegments(ARCHIVE_UNITS).build(); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + final HttpEntity httpEntity = new HttpEntity<>(updateOperationDtoSet, buildHeaders(abstractHttpContext)); + final ResponseEntity responseEntity = + restTemplate.exchange(uri, PATCH, httpEntity, OperationIdDto.class); + return Objects.requireNonNull(responseEntity.getBody()); + } + + public OperationIdDto update(final AbstractHttpContext abstractHttpContext, final String id, + final JsonPatch jsonPatch) { + final URI uri; + try { + uri = new URIBuilder(getBaseUrl()).setPathSegments(ARCHIVE_UNITS, id).build(); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + final HttpEntity httpEntity = new HttpEntity<>(jsonPatch, buildHeaders(abstractHttpContext)); + final ResponseEntity responseEntity = + restTemplate.exchange(uri, PATCH, httpEntity, OperationIdDto.class); + return Objects.requireNonNull(responseEntity.getBody()); + } + + public OperationIdDto update(final AbstractHttpContext abstractHttpContext, final JsonPatchDto jsonPatchDto) { + final URI uri; + try { + uri = new URIBuilder(getBaseUrl()).setPathSegments(ARCHIVE_UNITS, "update", "single").build(); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + final HttpEntity httpEntity = new HttpEntity<>(jsonPatchDto, buildHeaders(abstractHttpContext)); + final ResponseEntity responseEntity = + restTemplate.exchange(uri, PATCH, httpEntity, OperationIdDto.class); + return Objects.requireNonNull(responseEntity.getBody()); + } + + public OperationIdDto update(final AbstractHttpContext abstractHttpContext, + final MultiJsonPatchDto multiJsonPatchDto) { + final URI uri; + try { + uri = new URIBuilder(getBaseUrl()).setPathSegments(ARCHIVE_UNITS, "update", "multiple").build(); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + final HttpEntity httpEntity = new HttpEntity<>(multiJsonPatchDto, buildHeaders(abstractHttpContext)); + final ResponseEntity responseEntity = + restTemplate.exchange(uri, PATCH, httpEntity, OperationIdDto.class); + return Objects.requireNonNull(responseEntity.getBody()); + } + +} diff --git a/api/api-archive-search/archive-search-internal/src/main/java/fr/gouv/vitamui/archive/internal/server/config/ConverterConfig.java b/api/api-archive-search/archive-search-internal/src/main/java/fr/gouv/vitamui/archive/internal/server/config/ConverterConfig.java index 86551e8a79c..d9c8943d7f6 100644 --- a/api/api-archive-search/archive-search-internal/src/main/java/fr/gouv/vitamui/archive/internal/server/config/ConverterConfig.java +++ b/api/api-archive-search/archive-search-internal/src/main/java/fr/gouv/vitamui/archive/internal/server/config/ConverterConfig.java @@ -39,9 +39,11 @@ import fr.gouv.vitamui.archive.internal.server.searchcriteria.converter.SearchCriteriaHistoryConverter; import fr.gouv.vitamui.archive.internal.server.service.AccessContractConverter; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration +@ComponentScan("fr.gouv.vitamui.archives.search.common.dto.converter") public class ConverterConfig { @Bean @@ -60,4 +62,5 @@ public Converters converters(final AccessContractConverter accessContractConvert final SearchCriteriaHistoryConverter searchCriteriaHistoryConverter) { return new Converters(accessContractConverter, searchCriteriaHistoryConverter); } + } diff --git a/api/api-archive-search/archive-search-internal/src/main/java/fr/gouv/vitamui/archive/internal/server/rest/ArchiveUnitController.java b/api/api-archive-search/archive-search-internal/src/main/java/fr/gouv/vitamui/archive/internal/server/rest/ArchiveUnitController.java new file mode 100644 index 00000000000..aaa07074c7b --- /dev/null +++ b/api/api-archive-search/archive-search-internal/src/main/java/fr/gouv/vitamui/archive/internal/server/rest/ArchiveUnitController.java @@ -0,0 +1,92 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archive.internal.server.rest; + +import fr.gouv.vitamui.archives.search.common.dto.JsonPatchDto; +import fr.gouv.vitamui.archives.search.common.dto.MultiJsonPatchDto; +import fr.gouv.vitamui.archives.search.common.dto.OperationIdDto; +import fr.gouv.vitamui.archives.search.common.dto.UpdateArchiveUnitDto; +import fr.gouv.vitamui.archives.search.common.model.JsonPatch; +import fr.gouv.vitamui.archives.search.common.service.ArchiveUnitService; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.ws.rs.Consumes; +import javax.ws.rs.Produces; +import java.util.Set; + +import static javax.ws.rs.core.MediaType.APPLICATION_JSON; +import static javax.ws.rs.core.MediaType.APPLICATION_JSON_PATCH_JSON; + +@RestController +@RequestMapping("/archive-units") +public class ArchiveUnitController { + @Autowired ArchiveUnitService archiveUnitService; + + @PatchMapping + @Consumes(APPLICATION_JSON) + @Produces(APPLICATION_JSON) + @ApiOperation("Updates several archive units asynchronously by passing partial changes to apply to an archive unit") + public ResponseEntity update( + @RequestBody @Validated final Set updateArchiveUnitDtoSet) { + return ResponseEntity.ok(archiveUnitService.update(updateArchiveUnitDtoSet)); + } + + @PatchMapping("/{archiveUnitId}") + @Consumes(APPLICATION_JSON_PATCH_JSON) + @Produces(APPLICATION_JSON) + @ApiOperation("Updates one archive unit asynchronously by passing a list of operation to do on an archive unit") + public ResponseEntity update(@RequestBody @Validated final JsonPatch jsonPatch, + @RequestParam String archiveUnitId) { + final JsonPatchDto jsonPatchDto = new JsonPatchDto().setId(archiveUnitId).setJsonPatch(jsonPatch); + return update(jsonPatchDto); + } + + @PatchMapping("/update/single") + @Consumes(APPLICATION_JSON) + @Produces(APPLICATION_JSON) + @ApiOperation("Updates one archive unit asynchronously by passing a list of operation to do on this one") + public ResponseEntity update(@RequestBody @Validated final JsonPatchDto jsonPatchDto) { + return ResponseEntity.ok(archiveUnitService.update(jsonPatchDto)); + } + + @PatchMapping("/update/multiple") + @Consumes(APPLICATION_JSON) + @Produces(APPLICATION_JSON) + @ApiOperation("Updates several archive units asynchronously by passing a list of operation to do on these ones") + public ResponseEntity update(@RequestBody @Validated final MultiJsonPatchDto multiJsonPatchDto) { + return ResponseEntity.ok(archiveUnitService.update(multiJsonPatchDto)); + } +} diff --git a/api/api-archive-search/archive-search-internal/src/main/java/fr/gouv/vitamui/archive/internal/server/service/ArchiveUnitServiceImpl.java b/api/api-archive-search/archive-search-internal/src/main/java/fr/gouv/vitamui/archive/internal/server/service/ArchiveUnitServiceImpl.java new file mode 100644 index 00000000000..2173cf56e98 --- /dev/null +++ b/api/api-archive-search/archive-search-internal/src/main/java/fr/gouv/vitamui/archive/internal/server/service/ArchiveUnitServiceImpl.java @@ -0,0 +1,133 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archive.internal.server.service; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.gouv.vitam.access.external.client.AccessExternalClient; +import fr.gouv.vitam.common.client.VitamContext; +import fr.gouv.vitam.common.database.builder.request.multiple.UpdateMultiQuery; +import fr.gouv.vitam.common.exception.InvalidParseOperationException; +import fr.gouv.vitam.common.exception.VitamClientException; +import fr.gouv.vitam.common.json.JsonHandler; +import fr.gouv.vitam.common.model.RequestResponse; +import fr.gouv.vitamui.archives.search.common.dto.BulkCommandDto; +import fr.gouv.vitamui.archives.search.common.dto.JsonPatchDto; +import fr.gouv.vitamui.archives.search.common.dto.MultiJsonPatchDto; +import fr.gouv.vitamui.archives.search.common.dto.OperationIdDto; +import fr.gouv.vitamui.archives.search.common.dto.UpdateArchiveUnitDto; +import fr.gouv.vitamui.archives.search.common.dto.converter.JsonPatchDtoToUpdateMultiQueryConverter; +import fr.gouv.vitamui.archives.search.common.dto.converter.UpdateArchiveUnitDtoToUpdateMultiQueryConverter; +import fr.gouv.vitamui.archives.search.common.dto.converter.UpdateMultiQueriesToBulkCommandDto; +import fr.gouv.vitamui.archives.search.common.exception.ArchiveUnitUpdateException; +import fr.gouv.vitamui.archives.search.common.model.OperationId; +import fr.gouv.vitamui.archives.search.common.service.ArchiveUnitService; +import fr.gouv.vitamui.commons.api.logger.VitamUILogger; +import fr.gouv.vitamui.commons.api.logger.VitamUILoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +import static fr.gouv.vitamui.commons.api.CommonConstants.X_REQUEST_ID_HEADER; + +@Service +public class ArchiveUnitServiceImpl implements ArchiveUnitService { + private static final VitamUILogger log = VitamUILoggerFactory.getInstance(ArchiveUnitServiceImpl.class); + private final AccessExternalClient accessExternalClient; + private final UpdateArchiveUnitDtoToUpdateMultiQueryConverter updateArchiveUnitDtoToUpdateMultiQueryConverter; + private final ExternalParametersService externalParametersService; + private final JsonPatchDtoToUpdateMultiQueryConverter jsonPatchDtoToUpdateMultiQueryConverter; + private final UpdateMultiQueriesToBulkCommandDto updateMultiQueriesToBulkCommandDto; + + @Autowired + public ArchiveUnitServiceImpl(final AccessExternalClient accessExternalClient, + final UpdateArchiveUnitDtoToUpdateMultiQueryConverter updateArchiveUnitDtoToUpdateMultiQueryConverter, + final ExternalParametersService externalParametersService, + final JsonPatchDtoToUpdateMultiQueryConverter jsonPatchDtoToUpdateMultiQueryConverter, + final UpdateMultiQueriesToBulkCommandDto updateMultiQueriesToBulkCommandDto) { + this.accessExternalClient = accessExternalClient; + this.updateArchiveUnitDtoToUpdateMultiQueryConverter = updateArchiveUnitDtoToUpdateMultiQueryConverter; + this.externalParametersService = externalParametersService; + this.jsonPatchDtoToUpdateMultiQueryConverter = jsonPatchDtoToUpdateMultiQueryConverter; + this.updateMultiQueriesToBulkCommandDto = updateMultiQueriesToBulkCommandDto; + } + + @Override + public OperationIdDto update(Set updateArchiveUnitDtoSet) { + final Set updateMultiQueries = updateArchiveUnitDtoSet.stream() + .map(updateArchiveUnitDtoToUpdateMultiQueryConverter::convert) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + if (updateArchiveUnitDtoSet.size() != updateMultiQueries.size()) { + throw new ArchiveUnitUpdateException("Fail to convert some archive unit updates payload to dsl queries"); + } + return send(updateMultiQueries); + } + + @Override + public OperationIdDto update(JsonPatchDto jsonPatchDto) { + final UpdateMultiQuery updateMultiQuery = jsonPatchDtoToUpdateMultiQueryConverter.convert(jsonPatchDto); + if (updateMultiQuery == null) { + throw new ArchiveUnitUpdateException("Fail to convert json patch payload to dsl query"); + } + + final Set updateMultiQueries = Set.of(updateMultiQuery); + return send(updateMultiQueries); + } + + @Override + public OperationIdDto update(MultiJsonPatchDto multiJsonPatchDto) { + final Set updateMultiQueries = multiJsonPatchDto.stream() + .map(jsonPatchDtoToUpdateMultiQueryConverter::convert) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + if (multiJsonPatchDto.size() != updateMultiQueries.size()) { + throw new ArchiveUnitUpdateException("Fail to convert some json patch payloads to dsl queries"); + } + return send(updateMultiQueries); + } + + private OperationIdDto send(Set updateMultiQueries) { + final VitamContext context = externalParametersService.buildVitamContextFromExternalParam(); + final BulkCommandDto bulkCommandDto = updateMultiQueriesToBulkCommandDto.convert(updateMultiQueries); + try { + final RequestResponse payload = + accessExternalClient.bulkAtomicUpdateUnits(context, + JsonHandler.toJsonNode(bulkCommandDto)); + final OperationId operationId = new OperationId(payload.getHeaderString(X_REQUEST_ID_HEADER)); + final OperationIdDto operationIdDto = new OperationIdDto().setOperationId(operationId); + log.info("Operation started: {}", operationIdDto); + return operationIdDto; + } catch (VitamClientException | InvalidParseOperationException e) { + log.error("{}", e); + throw new ArchiveUnitUpdateException(e); + } + } +} diff --git a/ui/ui-archive-search/src/main/java/fr/gouv/vitamui/archives/search/config/ArchiveSearchContextConfiguration.java b/ui/ui-archive-search/src/main/java/fr/gouv/vitamui/archives/search/config/ArchiveSearchContextConfiguration.java index f4f0b632b3b..68adb724403 100644 --- a/ui/ui-archive-search/src/main/java/fr/gouv/vitamui/archives/search/config/ArchiveSearchContextConfiguration.java +++ b/ui/ui-archive-search/src/main/java/fr/gouv/vitamui/archives/search/config/ArchiveSearchContextConfiguration.java @@ -25,6 +25,7 @@ */ package fr.gouv.vitamui.archives.search.config; +import fr.gouv.vitamui.archives.search.common.rest.ArchiveUnitClient; import fr.gouv.vitamui.archives.search.external.client.ArchiveSearchExternalRestClient; import fr.gouv.vitamui.archives.search.external.client.ArchiveSearchExternalRestClientFactory; import fr.gouv.vitamui.archives.search.external.client.ArchiveSearchExternalWebClient; @@ -113,5 +114,9 @@ public SearchCriteriaHistoryExternalRestClient searchCriteriaHistoryExternalRest return factory.getSearchCriteriaHistoryExternalRestClient(); } - + @Bean + public ArchiveUnitClient getArchiveUnitClient( + final ArchiveSearchExternalRestClientFactory archiveSearchExternalRestClientFactory) { + return archiveSearchExternalRestClientFactory.getArchiveUnitClient(); + } } diff --git a/ui/ui-archive-search/src/main/java/fr/gouv/vitamui/archives/search/rest/ArchiveUnitController.java b/ui/ui-archive-search/src/main/java/fr/gouv/vitamui/archives/search/rest/ArchiveUnitController.java new file mode 100644 index 00000000000..2df1f89bc29 --- /dev/null +++ b/ui/ui-archive-search/src/main/java/fr/gouv/vitamui/archives/search/rest/ArchiveUnitController.java @@ -0,0 +1,92 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archives.search.rest; + +import fr.gouv.vitamui.archives.search.common.dto.JsonPatchDto; +import fr.gouv.vitamui.archives.search.common.dto.MultiJsonPatchDto; +import fr.gouv.vitamui.archives.search.common.dto.OperationIdDto; +import fr.gouv.vitamui.archives.search.common.dto.UpdateArchiveUnitDto; +import fr.gouv.vitamui.archives.search.common.model.JsonPatch; +import fr.gouv.vitamui.archives.search.common.service.ArchiveUnitService; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.ws.rs.Consumes; +import javax.ws.rs.Produces; +import java.util.Set; + +import static javax.ws.rs.core.MediaType.APPLICATION_JSON; +import static javax.ws.rs.core.MediaType.APPLICATION_JSON_PATCH_JSON; + +@RestController +@RequestMapping("${ui-archive-search.prefix}/archive-units") +public class ArchiveUnitController { + @Autowired ArchiveUnitService archiveUnitService; + + @PatchMapping + @Consumes(APPLICATION_JSON) + @Produces(APPLICATION_JSON) + @ApiOperation("Updates several archive units asynchronously by passing partial changes to apply to an archive unit") + public ResponseEntity update( + @RequestBody @Validated final Set updateArchiveUnitDtoSet) { + return ResponseEntity.ok(archiveUnitService.update(updateArchiveUnitDtoSet)); + } + + @PatchMapping("/{archiveUnitId}") + @Consumes(APPLICATION_JSON_PATCH_JSON) + @Produces(APPLICATION_JSON) + @ApiOperation("Updates one archive unit asynchronously by passing a list of operation to do on an archive unit") + public ResponseEntity update(@RequestBody @Validated final JsonPatch jsonPatch, + @RequestParam String archiveUnitId) { + final JsonPatchDto jsonPatchDto = new JsonPatchDto().setId(archiveUnitId).setJsonPatch(jsonPatch); + return update(jsonPatchDto); + } + + @PatchMapping("/update/single") + @Consumes(APPLICATION_JSON) + @Produces(APPLICATION_JSON) + @ApiOperation("Updates one archive unit asynchronously by passing a list of operation to do on this one") + public ResponseEntity update(@RequestBody @Validated final JsonPatchDto jsonPatchDto) { + return ResponseEntity.ok(archiveUnitService.update(jsonPatchDto)); + } + + @PatchMapping("/update/multiple") + @Consumes(APPLICATION_JSON) + @Produces(APPLICATION_JSON) + @ApiOperation("Updates several archive units asynchronously by passing a list of operation to do on these ones") + public ResponseEntity update(@RequestBody @Validated final MultiJsonPatchDto multiJsonPatchDto) { + return ResponseEntity.ok(archiveUnitService.update(multiJsonPatchDto)); + } +} diff --git a/ui/ui-archive-search/src/main/java/fr/gouv/vitamui/archives/search/service/ArchiveUnitServiceImpl.java b/ui/ui-archive-search/src/main/java/fr/gouv/vitamui/archives/search/service/ArchiveUnitServiceImpl.java new file mode 100644 index 00000000000..4b23cc0bf65 --- /dev/null +++ b/ui/ui-archive-search/src/main/java/fr/gouv/vitamui/archives/search/service/ArchiveUnitServiceImpl.java @@ -0,0 +1,72 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archives.search.service; + +import fr.gouv.vitamui.archives.search.common.dto.JsonPatchDto; +import fr.gouv.vitamui.archives.search.common.dto.MultiJsonPatchDto; +import fr.gouv.vitamui.archives.search.common.dto.OperationIdDto; +import fr.gouv.vitamui.archives.search.common.dto.UpdateArchiveUnitDto; +import fr.gouv.vitamui.archives.search.common.rest.ArchiveUnitClient; +import fr.gouv.vitamui.archives.search.common.service.ArchiveUnitService; +import fr.gouv.vitamui.archives.search.external.client.ArchiveSearchExternalRestClient; +import fr.gouv.vitamui.commons.rest.client.ExternalHttpContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.net.URISyntaxException; +import java.util.Set; + +@Service +public class ArchiveUnitServiceImpl implements ArchiveUnitService { + private final SecurityContextService securityContextService; + private final ArchiveUnitClient client; + + @Autowired + public ArchiveUnitServiceImpl( + final SecurityContextService securityContextService, + final ArchiveUnitClient client + ) { + this.securityContextService = securityContextService; + this.client = client; + } + + @Override + public OperationIdDto update(Set updateArchiveUnitDtoSet) { + return client.update(securityContextService.getContext(), updateArchiveUnitDtoSet); + } + + @Override + public OperationIdDto update(JsonPatchDto jsonPatchDto) { + return client.update(securityContextService.getContext(), jsonPatchDto); + } + + @Override + public OperationIdDto update(MultiJsonPatchDto multiJsonPatchDto) { + return client.update(securityContextService.getContext(), multiJsonPatchDto); + } +} diff --git a/ui/ui-archive-search/src/main/java/fr/gouv/vitamui/archives/search/service/SecurityContextService.java b/ui/ui-archive-search/src/main/java/fr/gouv/vitamui/archives/search/service/SecurityContextService.java new file mode 100644 index 00000000000..3c733b0012a --- /dev/null +++ b/ui/ui-archive-search/src/main/java/fr/gouv/vitamui/archives/search/service/SecurityContextService.java @@ -0,0 +1,80 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +package fr.gouv.vitamui.archives.search.service; + +import fr.gouv.vitamui.commons.api.exception.ApplicationServerException; +import fr.gouv.vitamui.commons.api.exception.PreconditionFailedException; +import fr.gouv.vitamui.commons.api.exception.UnAuthorizedException; +import fr.gouv.vitamui.commons.rest.client.AbstractHttpContext; +import fr.gouv.vitamui.commons.rest.client.ExternalHttpContext; +import fr.gouv.vitamui.commons.security.client.dto.AuthUserDto; +import org.springframework.security.authentication.AnonymousAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Service; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.util.Objects; + +@Service +public class SecurityContextService { + protected HttpServletRequest getCurrentHttpRequest() { + final RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + if (requestAttributes instanceof ServletRequestAttributes) { + return ((ServletRequestAttributes) requestAttributes).getRequest(); + } + throw new ApplicationServerException("Not called in the context of an HTTP request"); + } + + protected AuthUserDto getAuthenticatedUser() { + final Authentication auth = SecurityContextHolder.getContext().getAuthentication(); + if (!(auth instanceof AnonymousAuthenticationToken)) { + return (AuthUserDto) auth.getPrincipal(); + } + throw new UnAuthorizedException("User is not connected"); + } + + protected T getContext() throws + PreconditionFailedException { + final AuthUserDto principal = getAuthenticatedUser(); + final HttpServletRequest request = getCurrentHttpRequest(); + final String tenantId = request.getHeader("X-Tenant-Id"); + final String accessContractId = request.getHeader("X-Access-Contract-Id"); + if (Objects.nonNull(tenantId)) { + return (T) ExternalHttpContext.buildFromUiRequest( + request, + principal, + Integer.parseInt(tenantId), + accessContractId); + } + return (T) ExternalHttpContext.buildFromUiRequest(request, principal); + } +} diff --git a/ui/ui-frontend/package-lock.json b/ui/ui-frontend/package-lock.json index 5fea5d286e5..ca8b6133f62 100644 --- a/ui/ui-frontend/package-lock.json +++ b/ui/ui-frontend/package-lock.json @@ -125,9 +125,6 @@ }, "engines": { "node": ">=10.0.0" - }, - "peerDependencies": { - "@angular-devkit/build-angular": ">=0.801.0" } }, "node_modules/@angular-builders/custom-webpack/node_modules/diff": { @@ -159,9 +156,6 @@ }, "engines": { "node": ">=6.0.0" - }, - "peerDependencies": { - "typescript": ">=2.7" } }, "node_modules/@angular-builders/custom-webpack/node_modules/yn": { @@ -300,20 +294,6 @@ "node": ">= 10.13.0", "npm": ">= 6.11.0", "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "@angular/compiler-cli": "^10.0.0", - "@angular/localize": "^10.0.0", - "ng-packagr": "^10.0.0", - "typescript": ">=3.9 < 4.1" - }, - "peerDependenciesMeta": { - "@angular/localize": { - "optional": true - }, - "ng-packagr": { - "optional": true - } } }, "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { @@ -350,23 +330,13 @@ }, "bin": { "autoprefixer": "bin/autoprefixer" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" } }, "node_modules/@angular-devkit/build-angular/node_modules/core-js": { "version": "3.6.4", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } + "dev": true }, "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { "version": "6.6.2", @@ -399,15 +369,6 @@ "node": ">= 10.13.0", "npm": ">= 6.11.0", "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "ng-packagr": "^10.0.0", - "tsickle": "~0.39.0" - }, - "peerDependenciesMeta": { - "tsickle": { - "optional": true - } } }, "node_modules/@angular-devkit/build-ng-packagr/node_modules/rxjs": { @@ -482,10 +443,6 @@ "node": ">= 10.13.0", "npm": ">= 6.11.0", "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "webpack": "^4.6.0", - "webpack-dev-server": "^3.1.4" } }, "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": { @@ -600,9 +557,6 @@ "integrity": "sha512-qIdxP28iF6qaoGBB3C6VvHt22nR3FMK5kh+no+jYmmy6z5cBVhwS/Vb6nkx+XRqivKBVHxWNZQ4ae6xmTg/k7A==", "dependencies": { "tslib": "^2.0.0" - }, - "peerDependencies": { - "@angular/core": "10.1.3" } }, "node_modules/@angular/cdk": { @@ -614,10 +568,6 @@ }, "optionalDependencies": { "parse5": "^5.0.0" - }, - "peerDependencies": { - "@angular/common": "^10.0.0 || ^11.0.0-0", - "@angular/core": "^10.0.0 || ^11.0.0-0" } }, "node_modules/@angular/cdk/node_modules/parse5": { @@ -631,7 +581,6 @@ "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-10.2.4.tgz", "integrity": "sha512-S8xAJemX3zE/I/xi81DT6NuzfDwEAEtEeITHxrAH0AHE4kaUBy2O9bAopvYqMNzxs/XGqyxMv8vwYYpGax7EEQ==", "dev": true, - "hasInstallScript": true, "dependencies": { "@angular-devkit/architect": "0.1002.4", "@angular-devkit/core": "10.2.4", @@ -711,10 +660,6 @@ "integrity": "sha512-+9UsK+ZTCLO3MvTYlDTbjJGAZxtK9WftHWxbT3NTAJ8tisDfb+MwXB0xNw7qLOysMe3u04zShT0YXYZo5aJBrw==", "dependencies": { "tslib": "^2.0.0" - }, - "peerDependencies": { - "@angular/core": "10.1.3", - "rxjs": "^6.5.3" } }, "node_modules/@angular/compiler": { @@ -753,10 +698,6 @@ }, "engines": { "node": ">=10.0" - }, - "peerDependencies": { - "@angular/compiler": "10.1.3", - "typescript": ">=3.9 <4.1" } }, "node_modules/@angular/compiler-cli/node_modules/semver": { @@ -783,10 +724,6 @@ "integrity": "sha512-2rnNa8bSH1JoQRzUWXXvPGgxtNA6mSiIqDZs1tHdQZxJI15NbyAJhw6lglgBFahE/nOcUx+11ZhxaPJWSsbEOg==", "dependencies": { "tslib": "^2.0.0" - }, - "peerDependencies": { - "rxjs": "^6.5.3", - "zone.js": "~0.10.3" } }, "node_modules/@angular/forms": { @@ -795,12 +732,6 @@ "integrity": "sha512-ntLnIZnEo+9ziajnjQPYvVR5m0gRfQBbXx5dug4EuUI5SzE2WzcTEZTnltgw4cLqOy/fOt8cXMiW0YeRBHsjKA==", "dependencies": { "tslib": "^2.0.0" - }, - "peerDependencies": { - "@angular/common": "10.1.3", - "@angular/core": "10.1.3", - "@angular/platform-browser": "10.1.3", - "rxjs": "^6.5.3" } }, "node_modules/@angular/language-service": { @@ -825,10 +756,6 @@ }, "engines": { "node": ">=8.0" - }, - "peerDependencies": { - "@angular/compiler": "10.2.5", - "@angular/compiler-cli": "10.2.5" } }, "node_modules/@angular/localize/node_modules/@babel/core": { @@ -855,10 +782,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" } }, "node_modules/@angular/localize/node_modules/cliui": { @@ -949,13 +872,6 @@ "integrity": "sha512-uk6JkRrKHaM9VFMzX7pWC83YNLVgXPB3D8U1yjSOafCdWwrRZgUHGr8MPlSILCr3o2nxgg5SsKdWcWwHuXXUZA==", "dependencies": { "tslib": "^2.0.0" - }, - "peerDependencies": { - "@angular/animations": "^10.0.0 || ^11.0.0-0", - "@angular/cdk": "10.2.7", - "@angular/common": "^10.0.0 || ^11.0.0-0", - "@angular/core": "^10.0.0 || ^11.0.0-0", - "@angular/forms": "^10.0.0 || ^11.0.0-0" } }, "node_modules/@angular/material-moment-adapter": { @@ -964,11 +880,6 @@ "integrity": "sha512-VaigAiBCz10AvpzgZvdR4SCGnMRxXKx8ukUdeowuoqAFONEPpRdCJmwZ+8bpi9Q/jXlrZJicCMhklj4bBQw6tg==", "dependencies": { "tslib": "^2.0.0" - }, - "peerDependencies": { - "@angular/core": "^10.0.0 || ^11.0.0-0", - "@angular/material": "10.2.7", - "moment": "^2.18.1" } }, "node_modules/@angular/platform-browser": { @@ -977,16 +888,6 @@ "integrity": "sha512-Y5/M9NEmQceda96a9ntmxidfgJTf23DmEvGw0SJ1TAn2X9EjlM4s7H8KNH9R/tDPK9QcuvzX9FTZsxQ9b6kCFQ==", "dependencies": { "tslib": "^2.0.0" - }, - "peerDependencies": { - "@angular/animations": "10.1.3", - "@angular/common": "10.1.3", - "@angular/core": "10.1.3" - }, - "peerDependenciesMeta": { - "@angular/animations": { - "optional": true - } } }, "node_modules/@angular/platform-browser-dynamic": { @@ -995,12 +896,6 @@ "integrity": "sha512-JGVz0XxiZuF1FGJ2zUk1/TogIlBFgFCUgNbSyULIfE/UXcuuvvLlzF+ls26tHK06lFHRAVHFjjDpyA270UzRTQ==", "dependencies": { "tslib": "^2.0.0" - }, - "peerDependencies": { - "@angular/common": "10.1.3", - "@angular/compiler": "10.1.3", - "@angular/core": "10.1.3", - "@angular/platform-browser": "10.1.3" } }, "node_modules/@angular/pwa": { @@ -1069,10 +964,6 @@ "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/@angular/pwa/node_modules/fast-json-stable-stringify": { @@ -1110,12 +1001,6 @@ "integrity": "sha512-CAd6u1y+NjB8edtuC2j2OpS6xFO+s90bg4kyu7zr9i0wIQX8xI+neFzkTeoYWJ0PNfi05cCGelyQnLZPZFsyvw==", "dependencies": { "tslib": "^2.0.0" - }, - "peerDependencies": { - "@angular/common": "10.1.3", - "@angular/core": "10.1.3", - "@angular/platform-browser": "10.1.3", - "rxjs": "^6.5.3" } }, "node_modules/@angular/service-worker": { @@ -1127,10 +1012,6 @@ }, "bin": { "ngsw-config": "ngsw-config.js" - }, - "peerDependencies": { - "@angular/common": "10.1.3", - "@angular/core": "10.1.3" } }, "node_modules/@babel/code-frame": { @@ -1179,10 +1060,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" } }, "node_modules/@babel/core/node_modules/semver": { @@ -1290,9 +1167,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { @@ -1316,9 +1190,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { @@ -1416,9 +1287,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { @@ -1454,9 +1322,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-replace-supers": { @@ -1471,9 +1336,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { @@ -1625,7 +1487,6 @@ "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", @@ -1635,16 +1496,12 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-class-properties": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", @@ -1652,16 +1509,12 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-dynamic-import": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-dynamic-import instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -1669,16 +1522,12 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-export-namespace-from": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-export-namespace-from instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9", @@ -1686,16 +1535,12 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-json-strings": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-json-strings instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -1703,16 +1548,12 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-logical-assignment-operators instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", @@ -1720,16 +1561,12 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -1737,16 +1574,12 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-numeric-separator": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -1754,16 +1587,12 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-object-rest-spread": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", "dev": true, "dependencies": { "@babel/compat-data": "^7.20.5", @@ -1774,16 +1603,12 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-optional-catch-binding": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -1791,16 +1616,12 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-optional-chaining": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", @@ -1809,16 +1630,12 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-private-methods": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", @@ -1826,16 +1643,12 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead.", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", @@ -1843,9 +1656,6 @@ }, "engines": { "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-async-generators": { @@ -1855,9 +1665,6 @@ "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-class-properties": { @@ -1867,9 +1674,6 @@ "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-dynamic-import": { @@ -1879,9 +1683,6 @@ "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-export-namespace-from": { @@ -1891,9 +1692,6 @@ "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-json-strings": { @@ -1903,9 +1701,6 @@ "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { @@ -1915,9 +1710,6 @@ "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { @@ -1927,9 +1719,6 @@ "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-numeric-separator": { @@ -1939,9 +1728,6 @@ "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-object-rest-spread": { @@ -1951,9 +1737,6 @@ "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { @@ -1963,9 +1746,6 @@ "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-optional-chaining": { @@ -1975,9 +1755,6 @@ "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-top-level-await": { @@ -1990,9 +1767,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-arrow-functions": { @@ -2005,9 +1779,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-async-to-generator": { @@ -2022,9 +1793,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { @@ -2037,9 +1805,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-block-scoping": { @@ -2052,9 +1817,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-classes": { @@ -2074,9 +1836,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-computed-properties": { @@ -2090,9 +1849,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/template": { @@ -2119,9 +1875,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-dotall-regex": { @@ -2135,9 +1888,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-duplicate-keys": { @@ -2150,9 +1900,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { @@ -2166,9 +1913,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-for-of": { @@ -2182,9 +1926,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-function-name": { @@ -2199,9 +1940,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-literals": { @@ -2214,9 +1952,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-member-expression-literals": { @@ -2229,9 +1964,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-amd": { @@ -2245,9 +1977,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-commonjs": { @@ -2262,9 +1991,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-systemjs": { @@ -2280,9 +2006,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-umd": { @@ -2296,9 +2019,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { @@ -2312,9 +2032,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-transform-new-target": { @@ -2327,9 +2044,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-object-super": { @@ -2343,9 +2057,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-parameters": { @@ -2358,9 +2069,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-property-literals": { @@ -2373,9 +2081,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-regenerator": { @@ -2389,9 +2094,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-reserved-words": { @@ -2404,9 +2106,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-runtime": { @@ -2419,9 +2118,6 @@ "@babel/helper-plugin-utils": "^7.10.4", "resolve": "^1.8.1", "semver": "^5.5.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { @@ -2443,9 +2139,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-spread": { @@ -2459,9 +2152,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-sticky-regex": { @@ -2474,9 +2164,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-template-literals": { @@ -2489,9 +2176,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-typeof-symbol": { @@ -2504,9 +2188,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-unicode-escapes": { @@ -2519,9 +2200,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-unicode-regex": { @@ -2535,9 +2213,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/preset-env": { @@ -2614,9 +2289,6 @@ "invariant": "^2.2.2", "levenary": "^1.1.1", "semver": "^5.5.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/preset-env/node_modules/semver": { @@ -2639,9 +2311,6 @@ "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/regjsgen": { @@ -2716,11 +2385,6 @@ }, "engines": { "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } } }, "node_modules/@babel/traverse/node_modules/ms": { @@ -2765,10 +2429,6 @@ }, "engines": { "node": ">=11.15.0" - }, - "peerDependencies": { - "@angular/compiler": ">=8.0.0", - "typescript": ">=3.0.0" } }, "node_modules/@biesbjerg/ngx-translate-extract/node_modules/cliui": { @@ -2911,11 +2571,6 @@ "node": ">= 10.13.0", "npm": ">= 6.11.0", "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "@angular/compiler-cli": "^10.0.0", - "typescript": ">=3.9 < 4.1", - "webpack": "^4.0.0" } }, "node_modules/@ngtools/webpack/node_modules/@angular-devkit/core": { @@ -2960,10 +2615,6 @@ "integrity": "sha512-+tzEp8wlqEnw0Gc7jtVRAJ6RteUjXw6JJR4O65KlnxOmJrCGPI0xjV/lKRnQeU0w4i96PQs/jtpL921Wrb7PWg==", "dependencies": { "tslib": "^2.0.0" - }, - "peerDependencies": { - "@angular/core": ">=10.0.0", - "rxjs": ">=6.5.3" } }, "node_modules/@ngx-translate/http-loader": { @@ -2972,11 +2623,6 @@ "integrity": "sha512-LCekn6qCbeXWlhESCxU1rAbZz33WzDG0lI7Ig0pYC1o5YxJWrkU9y3Y4tNi+jakQ7R6YhTR2D3ox6APxDtA0wA==", "dependencies": { "tslib": "^2.0.0" - }, - "peerDependencies": { - "@angular/common": ">=10.0.0", - "@ngx-translate/core": ">=13.0.0", - "rxjs": ">=6.5.3" } }, "node_modules/@nodelib/fs.scandir": { @@ -3018,7 +2664,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "deprecated": "This functionality has been moved to @npmcli/fs", "dev": true, "dependencies": { "mkdirp": "^1.0.4", @@ -3035,9 +2680,6 @@ "dev": true, "dependencies": { "esquery": "^1.0.1" - }, - "peerDependencies": { - "typescript": "^3 || ^4" } }, "node_modules/@rollup/plugin-commonjs": { @@ -3056,9 +2698,6 @@ }, "engines": { "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^2.22.0" } }, "node_modules/@rollup/plugin-json": { @@ -3068,9 +2707,6 @@ "dev": true, "dependencies": { "@rollup/pluginutils": "^3.0.8" - }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" } }, "node_modules/@rollup/plugin-node-resolve": { @@ -3088,9 +2724,6 @@ }, "engines": { "node": ">= 10.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" } }, "node_modules/@rollup/pluginutils": { @@ -3105,9 +2738,6 @@ }, "engines": { "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" } }, "node_modules/@rollup/pluginutils/node_modules/estree-walker": { @@ -3136,7 +2766,6 @@ "version": "0.1002.4", "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1002.4.tgz", "integrity": "sha512-qnDn3SSMmolfzWpj8CTAoC/TSPe43azKPYLR5r76GkRvuUbwr/dQEj92wu59twjGcsmjF54qcG4fGaxMndUn3Q==", - "deprecated": "This was an internal-only Angular package up through Angular v11 which is no longer used or maintained. Upgrade Angular to v12+ to remove this dependency.", "dev": true, "dependencies": { "@angular-devkit/core": "10.2.4", @@ -3242,7 +2871,6 @@ "version": "3.4.1", "resolved": "https://registry.npmjs.org/@types/jszip/-/jszip-3.4.1.tgz", "integrity": "sha512-TezXjmf3lj+zQ651r6hPqvSScqBLvyPI9FxdXBqpEwBijNGQ2NXpaFW/7joGzveYkKQUil7iiDHLo6LV71Pc0A==", - "deprecated": "This is a stub types definition. jszip provides its own type definitions, so you do not need this installed.", "dev": true, "dependencies": { "jszip": "*" @@ -3556,7 +3184,6 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead", "dev": true }, "node_modules/abbrev": { @@ -3712,29 +3339,19 @@ "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/ajv-errors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true, - "peerDependencies": { - "ajv": ">=5.0.0" - } + "dev": true }, "node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } + "dev": true }, "node_modules/alphanum-sort": { "version": "1.0.2", @@ -3757,10 +3374,6 @@ "integrity": "sha512-9wC8I3e3cN6rMBOlo5JB2y3Fd2erp8pJ67t4vEVzyPbnRG6BJ4rreSOznSL9zw/2SjhC9kRV2OfFie29CUCzEg==", "dependencies": { "tslib": "^2.0.0" - }, - "peerDependencies": { - "@angular/common": ">=8.0.0", - "@angular/core": ">=8.0.0" } }, "node_modules/angular-svg-icon": { @@ -3769,11 +3382,6 @@ "integrity": "sha512-5SWvZyRPRV88n6/b+5AqI580Aq3xmQ1dd1ucYCMDrj4afQzQwJv2V7pBFcF3qNYzVZyF5TLDF006tGxMHYAb2g==", "dependencies": { "tslib": "^2.0.0" - }, - "peerDependencies": { - "@angular/common": ">=11.0.0", - "@angular/core": ">=11.0.0", - "rxjs": ">=6.6.0" } }, "node_modules/ansi-align": { @@ -3804,9 +3412,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ansi-escapes/node_modules/type-fest": { @@ -3816,9 +3421,6 @@ "dev": true, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ansi-html": { @@ -3999,9 +3601,6 @@ "dependencies": { "call-bind": "^1.0.2", "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array-find-index": { @@ -4060,9 +3659,6 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/arraybuffer.prototype.slice": { @@ -4081,9 +3677,6 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/arrify": { @@ -4198,13 +3791,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] + "dev": true }, "node_modules/async-foreach": { "version": "0.1.3", @@ -4263,10 +3850,6 @@ }, "bin": { "autoprefixer": "bin/autoprefixer" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" } }, "node_modules/available-typed-arrays": { @@ -4276,9 +3859,6 @@ "dev": true, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/aws-sign2": { @@ -4319,10 +3899,6 @@ }, "engines": { "node": ">= 6.9" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" } }, "node_modules/babel-loader/node_modules/find-cache-dir": { @@ -4425,9 +4001,6 @@ }, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/babel-loader/node_modules/p-locate": { @@ -4512,21 +4085,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "dev": true }, "node_modules/base64id": { "version": "2.0.0", @@ -4743,21 +4302,7 @@ "node_modules/bootstrap": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz", - "integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/twbs" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - } - ], - "peerDependencies": { - "jquery": "1.9.1 - 3", - "popper.js": "^1.16.1" - } + "integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==" }, "node_modules/boxen": { "version": "5.1.2", @@ -4776,9 +4321,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/boxen/node_modules/ansi-styles": { @@ -4791,9 +4333,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/boxen/node_modules/chalk": { @@ -4807,9 +4346,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/boxen/node_modules/color-convert": { @@ -4959,20 +4495,6 @@ "version": "4.22.2", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "dependencies": { "caniuse-lite": "^1.0.30001565", "electron-to-chromium": "^1.4.601", @@ -5000,20 +4522,6 @@ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -5050,7 +4558,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", - "hasInstallScript": true, "dependencies": { "node-gyp-build": "^4.3.0" }, @@ -5065,9 +4572,6 @@ "dev": true, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/builtin-status-codes": { @@ -5185,9 +4689,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cacheable-request/node_modules/http-cache-semantics": { @@ -5223,9 +4724,6 @@ "function-bind": "^1.1.2", "get-intrinsic": "^1.2.1", "set-function-length": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/caller-callsite": { @@ -5268,9 +4766,6 @@ "dev": true, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/camelcase-keys": { @@ -5310,21 +4805,7 @@ "node_modules/caniuse-lite": { "version": "1.0.30001576", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001576.tgz", - "integrity": "sha512-ff5BdakGe2P3SQsMsiqmt1Lc8221NR1VzHj5jXN5vBny9A6fpze94HiVV/n7XRosOlsShJcvMv5mdnpjOGCEgg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] + "integrity": "sha512-ff5BdakGe2P3SQsMsiqmt1Lc8221NR1VzHj5jXN5vBny9A6fpze94HiVV/n7XRosOlsShJcvMv5mdnpjOGCEgg==" }, "node_modules/canonical-path": { "version": "1.0.0", @@ -5344,9 +4825,6 @@ "integrity": "sha512-nG8PYH+/4xB+8zkV4G844EtfvZ5tTiLFoX3dZ4nhF4t3OCKIb9UvaFyNmeZO2zOSmRWzBoTD+napN6hiL+EgcA==", "dependencies": { "traverse": ">=0.3.0 <0.4" - }, - "engines": { - "node": "*" } }, "node_modules/chalk": { @@ -5379,12 +4857,6 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -5442,9 +4914,6 @@ "dev": true, "engines": { "node": ">=6.0.0" - }, - "peerDependencies": { - "webpack": ">=4.0.1" } }, "node_modules/class-utils": { @@ -5508,9 +4977,6 @@ "dev": true, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-cursor": { @@ -5532,9 +4998,6 @@ "dev": true, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-truncate": { @@ -5633,9 +5096,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/cliui/node_modules/color-convert": { @@ -5686,9 +5146,6 @@ "dev": true, "dependencies": { "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/coa": { @@ -5740,32 +5197,19 @@ "sprintf-js": "^1.1.2", "tslib": "^1.10.0", "zone.js": "~0.10.3" - }, - "peerDependencies": { - "@angular/compiler": ">=2.3.1 <12.0.0 || ^11.0.0-next || ^11.1.0-next || ^11.2.0-next", - "@angular/core": ">=2.3.1 <12.0.0 || ^11.0.0-next || ^11.1.0-next || ^11.2.0-next", - "tslint": "^5.0.0 || ^6.0.0" } }, "node_modules/codelyzer/node_modules/@angular/compiler": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.0.0.tgz", "integrity": "sha512-ctjwuntPfZZT2mNj2NDIVu51t9cvbhl/16epc5xEwyzyDt76pX9UgwvY+MbXrf/C/FWwdtmNtfP698BKI+9leQ==", - "dev": true, - "peerDependencies": { - "tslib": "^1.10.0" - } + "dev": true }, "node_modules/codelyzer/node_modules/@angular/core": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.0.0.tgz", "integrity": "sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w==", - "dev": true, - "peerDependencies": { - "rxjs": "^6.5.3", - "tslib": "^1.10.0", - "zone.js": "~0.10.2" - } + "dev": true }, "node_modules/codelyzer/node_modules/source-map": { "version": "0.5.7", @@ -5869,10 +5313,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "dev": true }, "node_modules/compose-function": { "version": "3.0.3", @@ -6102,9 +5543,6 @@ }, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/concurrently/node_modules/p-locate": { @@ -6379,9 +5817,6 @@ "dev": true, "dependencies": { "is-what": "^3.14.1" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" } }, "node_modules/copy-concurrently": { @@ -6451,13 +5886,6 @@ }, "engines": { "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" } }, "node_modules/copy-webpack-plugin/node_modules/serialize-javascript": { @@ -6472,13 +5900,7 @@ "node_modules/core-js": { "version": "3.6.5", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" }, "node_modules/core-js-compat": { "version": "3.35.0", @@ -6487,10 +5909,6 @@ "dev": true, "dependencies": { "browserslist": "^4.22.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" } }, "node_modules/core-util-is": { @@ -6632,9 +6050,6 @@ }, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cp-cli/node_modules/p-locate": { @@ -6943,13 +6358,6 @@ }, "engines": { "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.27.0 || ^5.0.0" } }, "node_modules/css-parse": { @@ -7018,9 +6426,6 @@ "dev": true, "engines": { "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" } }, "node_modules/css/node_modules/source-map": { @@ -7236,10 +6641,7 @@ "node_modules/d3-svg-legend": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/d3-svg-legend/-/d3-svg-legend-1.13.0.tgz", - "integrity": "sha512-0tMqbamHBfps/GwUO8v1ZXlPKneu0vJLj9R94I1h5/uhDKaYXfbEcqV/1c8NxVHgHEp/UoRLvrGBl9j0s7Hk9Q==", - "peerDependencies": { - "d3": "^3.0.0" - } + "integrity": "sha512-0tMqbamHBfps/GwUO8v1ZXlPKneu0vJLj9R94I1h5/uhDKaYXfbEcqV/1c8NxVHgHEp/UoRLvrGBl9j0s7Hk9Q==" }, "node_modules/damerau-levenshtein": { "version": "1.0.8", @@ -7318,10 +6720,6 @@ }, "engines": { "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" } }, "node_modules/date-fns/node_modules/@babel/runtime": { @@ -7355,7 +6753,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", "dev": true, "dependencies": { "ms": "^2.1.1" @@ -7365,7 +6762,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", "integrity": "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dev": true, "engines": { "node": "*" @@ -7416,9 +6812,6 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/deep-extend": { @@ -7459,9 +6852,6 @@ "dev": true, "dependencies": { "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/defaults/node_modules/clone": { @@ -7505,9 +6895,6 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-property": { @@ -7761,13 +7148,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] + "dev": true }, "node_modules/domain-browser": { "version": "1.2.0", @@ -7894,7 +7275,6 @@ "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", "dev": true, - "hasInstallScript": true, "engines": { "node": ">=0.10.0" } @@ -8031,11 +7411,6 @@ }, "engines": { "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } } }, "node_modules/engine.io/node_modules/ms": { @@ -8068,10 +7443,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } + "dev": true }, "node_modules/err-code": { "version": "1.1.2", @@ -8161,9 +7533,6 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/es-array-method-boxes-properly": { @@ -8198,9 +7567,6 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/es5-ext": { @@ -8208,7 +7574,6 @@ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", "dev": true, - "hasInstallScript": true, "dependencies": { "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.3", @@ -8817,9 +8182,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/extsprintf": { @@ -8898,7 +8260,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "deprecated": "This module is no longer supported.", "dev": true }, "node_modules/figures": { @@ -8911,9 +8272,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/file-loader": { @@ -8927,13 +8285,6 @@ }, "engines": { "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" } }, "node_modules/file-uri-to-path": { @@ -9008,9 +8359,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, "node_modules/find-parent-dir": { @@ -9035,8 +8383,7 @@ "node_modules/flag-icon-css": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/flag-icon-css/-/flag-icon-css-3.5.0.tgz", - "integrity": "sha512-pgJnJLrtb0tcDgU1fzGaQXmR8h++nXvILJ+r5SmOXaaL/2pocunQo2a8TAXhjQnBpRLPtZ1KCz/TYpqeNuE2ew==", - "deprecated": "The project has been renamed to flag-icons" + "integrity": "sha512-pgJnJLrtb0tcDgU1fzGaQXmR8h++nXvILJ+r5SmOXaaL/2pocunQo2a8TAXhjQnBpRLPtZ1KCz/TYpqeNuE2ew==" }, "node_modules/flat": { "version": "5.0.2", @@ -9104,19 +8451,8 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], "engines": { "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } } }, "node_modules/for-each": { @@ -9324,7 +8660,6 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "hasInstallScript": true, "optional": true, "os": [ "darwin" @@ -9376,10 +8711,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "dev": true }, "node_modules/function.prototype.name": { "version": "1.1.6", @@ -9394,19 +8726,13 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "dev": true }, "node_modules/gauge": { "version": "2.7.4", @@ -9529,9 +8855,6 @@ "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-stdin": { @@ -9566,9 +8889,6 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-value": { @@ -9616,9 +8936,6 @@ }, "engines": { "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { @@ -9643,9 +8960,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/global-dirs/node_modules/ini": { @@ -9676,9 +8990,6 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/globby": { @@ -9696,9 +9007,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globule": { @@ -9722,9 +9030,6 @@ "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/got": { @@ -9795,7 +9100,6 @@ "version": "5.1.5", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", "dev": true, "dependencies": { "ajv": "^6.12.3", @@ -9839,10 +9143,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "dev": true }, "node_modules/has-flag": { "version": "3.0.0", @@ -9859,9 +9160,6 @@ "dev": true, "dependencies": { "get-intrinsic": "^1.2.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { @@ -9871,9 +9169,6 @@ "dev": true, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-symbols": { @@ -9883,9 +9178,6 @@ "dev": true, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-tostringtag": { @@ -9898,9 +9190,6 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-unicode": { @@ -10011,9 +9300,6 @@ "integrity": "sha512-xyD4XgslstNAs72ENaoFvgMwtv8xhiDtC2AtzCG+8yF7W/Knxxm9BX+e2s25mm+HxMKh0rBmXVOEGF3zNImXvA==", "dependencies": { "traverse": ">=0.2.4" - }, - "engines": { - "node": "*" } }, "node_modules/hasown": { @@ -10460,21 +9746,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "dev": true }, "node_modules/iferr": { "version": "0.1.5", @@ -10615,9 +9887,6 @@ }, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/import-local/node_modules/p-locate": { @@ -10762,9 +10031,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/inquirer/node_modules/chalk": { @@ -10778,9 +10044,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/inquirer/node_modules/color-convert": { @@ -10923,9 +10186,6 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-array-buffer": { @@ -10937,9 +10197,6 @@ "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-arrayish": { @@ -10955,9 +10212,6 @@ "dev": true, "dependencies": { "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-binary-path": { @@ -10983,9 +10237,6 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-buffer": { @@ -11001,9 +10252,6 @@ "dev": true, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-ci": { @@ -11039,9 +10287,6 @@ "dev": true, "dependencies": { "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-data-descriptor": { @@ -11066,9 +10311,6 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-descriptor": { @@ -11103,9 +10345,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-extendable": { @@ -11136,9 +10375,6 @@ "dev": true, "engines": { "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-fullwidth-code-point": { @@ -11173,9 +10409,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-interactive": { @@ -11200,9 +10433,6 @@ "dev": true, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-npm": { @@ -11212,9 +10442,6 @@ "dev": true, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-number": { @@ -11236,9 +10463,6 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-obj": { @@ -11339,9 +10563,6 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-resolvable": { @@ -11357,9 +10578,6 @@ "dev": true, "dependencies": { "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-stream": { @@ -11381,9 +10599,6 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-symbol": { @@ -11396,9 +10611,6 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-typed-array": { @@ -11411,9 +10623,6 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-typedarray": { @@ -11429,9 +10638,6 @@ "dev": true, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-utf8": { @@ -11447,9 +10653,6 @@ "dev": true, "dependencies": { "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-what": { @@ -11498,9 +10701,6 @@ "dev": true, "engines": { "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" } }, "node_modules/isexe": { @@ -11602,9 +10802,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/istanbul-lib-report/node_modules/semver": { @@ -11748,9 +10945,6 @@ "dev": true, "dependencies": { "lodash": "^4.5.0" - }, - "peerDependencies": { - "rxjs": "^6.1.0" } }, "node_modules/jasmine-spec-reporter": { @@ -11957,9 +11151,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/json-server/node_modules/chalk": { @@ -11973,9 +11164,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/json-server/node_modules/cliui": { @@ -12099,7 +11287,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, - "optionalDependencies": { + "dependencies": { "graceful-fs": "^4.1.6" } }, @@ -12244,9 +11432,6 @@ "istanbul-lib-source-maps": "^3.0.6", "istanbul-reports": "^3.0.2", "minimatch": "^3.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/mattlewis92" } }, "node_modules/karma-jasmine": { @@ -12259,9 +11444,6 @@ }, "engines": { "node": ">= 10" - }, - "peerDependencies": { - "karma": "*" } }, "node_modules/karma-source-map-support": { @@ -12280,9 +11462,6 @@ "dev": true, "dependencies": { "colors": "1.4.0" - }, - "peerDependencies": { - "karma": ">=0.9" } }, "node_modules/karma/node_modules/cliui": { @@ -12311,9 +11490,6 @@ }, "engines": { "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, "node_modules/karma/node_modules/minimatch": { @@ -12473,6 +11649,8 @@ "dev": true, "dependencies": { "copy-anything": "^2.0.1", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", "tslib": "^1.10.0" }, "bin": { @@ -12482,8 +11660,6 @@ "node": ">=6" }, "optionalDependencies": { - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", "image-size": "~0.5.0", "make-dir": "^2.1.0", "mime": "^1.4.1", @@ -12504,13 +11680,6 @@ }, "engines": { "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" } }, "node_modules/less/node_modules/make-dir": { @@ -13085,9 +12254,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/log-symbols/node_modules/ansi-styles": { @@ -13100,9 +12266,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/log-symbols/node_modules/chalk": { @@ -13116,9 +12279,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/log-symbols/node_modules/color-convert": { @@ -13268,11 +12428,6 @@ }, "engines": { "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } } }, "node_modules/log4js/node_modules/ms": { @@ -13288,10 +12443,6 @@ "dev": true, "engines": { "node": ">= 0.6.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" } }, "node_modules/loose-envify": { @@ -13381,9 +12532,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/make-dir/node_modules/semver": { @@ -13900,13 +13048,6 @@ }, "engines": { "node": ">= 6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.4.0 || ^5.0.0" } }, "node_modules/mini-css-extract-plugin/node_modules/json5": { @@ -13977,10 +13118,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "dev": true }, "node_modules/minipass": { "version": "3.3.6", @@ -14122,10 +13260,6 @@ "dev": true, "dependencies": { "lodash.difference": "^4.5.0" - }, - "peerDependencies": { - "moment": "^2.8.0", - "webpack": "^1 || ^2 || ^3 || ^4 || ^5" } }, "node_modules/morgan": { @@ -14251,12 +13385,6 @@ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -14348,12 +13476,6 @@ }, "bin": { "ng-packagr": "cli/main.js" - }, - "peerDependencies": { - "@angular/compiler": "^10.0.0", - "@angular/compiler-cli": "^10.0.0", - "tslib": "^2.0.0", - "typescript": ">=3.9 < 4.1" } }, "node_modules/ng-packagr/node_modules/commander": { @@ -14386,10 +13508,8 @@ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "dependencies": { + "graceful-fs": "^4.1.6", "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" } }, "node_modules/ng-packagr/node_modules/universalify": { @@ -14421,10 +13541,6 @@ "integrity": "sha512-3J/KPU/tyh/ad6TFeUbrxX+SihUj0iOEt2Zsg4EX7mB3GFiQscXOfcUOxCkBtPWWWaqt3azrYbVGzsYa3/7NzQ==", "dependencies": { "tslib": "^1.9.0" - }, - "peerDependencies": { - "@angular/common": "*", - "@angular/core": "*" } }, "node_modules/ng2-file-upload/node_modules/tslib": { @@ -14460,11 +13576,6 @@ "integrity": "sha512-Q3BILkQP+l+dcX0joe7+xuHDKydhGnG09sUG1FmlLZFYIEX4+AQqHULh+hUAci8kZlLZuOG+mB2Uq54QYadItw==", "dependencies": { "tslib": "^2.0.0" - }, - "peerDependencies": { - "@angular/common": ">=9.0.0", - "@angular/core": ">=9.0.0", - "@angular/forms": ">=9.0.0" } }, "node_modules/ngx-filesize": { @@ -14474,10 +13585,6 @@ "dependencies": { "filesize": ">= 4.0.0", "tslib": "^2.0.0" - }, - "peerDependencies": { - "@angular/common": ">= 8.0.0", - "@angular/core": ">= 8.0.0" } }, "node_modules/ngx-i18nsupport": { @@ -14526,13 +13633,6 @@ "marked": "^1.1.0", "prismjs": "^1.20.0", "tslib": "^2.0.0" - }, - "peerDependencies": { - "@angular/common": "^10.0.0", - "@angular/core": "^10.0.0", - "@angular/platform-browser": "^10.0.0", - "rxjs": "^6.5.5", - "zone.js": "^0.10.3" } }, "node_modules/ngx-quicklink": { @@ -14541,10 +13641,6 @@ "integrity": "sha512-5ZSUCu79dTqLNqDTsXDzofaSjB1ddOxfSMUVR4gmg0mDI2M/6G/ASgs9tVM2LoR8on3wp2ExLGHOHvzg7qWkRA==", "dependencies": { "tslib": "^2.0.0" - }, - "peerDependencies": { - "@angular/common": ">=6.0.0", - "@angular/router": ">=6.0.0" } }, "node_modules/ngx-toastr": { @@ -14553,11 +13649,6 @@ "integrity": "sha512-DbLFkSZHsVPuuIIrsY1ziEhdkFUQ0V1yG1N0+1nKXGI5QBVesEDxLUVtntjzxJcWw/uUV+bKApo//tGHHORabQ==", "dependencies": { "tslib": "^1.9.0" - }, - "peerDependencies": { - "@angular/common": ">=8.0.0-0", - "@angular/core": ">=8.0.0-0", - "@angular/platform-browser": ">=8.0.0-0" } }, "node_modules/ngx-toastr/node_modules/tslib": { @@ -14572,11 +13663,6 @@ "dependencies": { "deepmerge": "2.1.1", "tslib": "^1.9.0" - }, - "peerDependencies": { - "@angular/common": ">=6.0.0", - "@ngx-translate/core": ">=10.0.0", - "rxjs": ">=6.0.0" } }, "node_modules/ngx-translate-multi-http-loader/node_modules/deepmerge": { @@ -14598,13 +13684,6 @@ "integrity": "sha512-RdSAuqsBQq54nIQG/E7wfrQhipkBtyN/i6qzT+WhCAB9iFmEqSyFZBgwzNZO+wJ7MPSPjHGpWzEJBGNdXYCWSg==", "dependencies": { "tslib": "^2.0.0" - }, - "peerDependencies": { - "@angular/common": ">=10.0.0", - "@angular/core": ">=10.0.0", - "@angular/platform-browser": ">=10.0.0", - "@angular/router": ">=10.0.0", - "rxjs": ">=6.6.0" } }, "node_modules/nice-try": { @@ -14623,21 +13702,12 @@ }, "engines": { "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } } }, "node_modules/node-fetch-npm": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", - "deprecated": "This module is not used anymore, npm uses minipass-fetch for its fetch implementation now", "dev": true, "dependencies": { "encoding": "^0.1.11", @@ -14730,7 +13800,6 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "deprecated": "This version of tar is no longer supported, and will not receive security updates. Please upgrade asap.", "dev": true, "dependencies": { "block-stream": "*", @@ -14847,7 +13916,6 @@ "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz", "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==", "dev": true, - "hasInstallScript": true, "dependencies": { "async-foreach": "^0.1.3", "chalk": "^1.1.1", @@ -15194,10 +14262,7 @@ "node_modules/nvd3": { "version": "1.8.6", "resolved": "https://registry.npmjs.org/nvd3/-/nvd3-1.8.6.tgz", - "integrity": "sha512-YGQ9hAQHuQCF0JmYkT2GhNMHb5pA+vDfQj6C2GdpQPzdRPj/srPG3mh/3fZzUFt+at1NusLk/RqICUWkxm4viQ==", - "peerDependencies": { - "d3": "^3.4.4" - } + "integrity": "sha512-YGQ9hAQHuQCF0JmYkT2GhNMHb5pA+vDfQj6C2GdpQPzdRPj/srPG3mh/3fZzUFt+at1NusLk/RqICUWkxm4viQ==" }, "node_modules/oauth-sign": { "version": "0.9.0", @@ -15272,10 +14337,7 @@ "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "dev": true }, "node_modules/object-is": { "version": "1.1.5", @@ -15288,9 +14350,6 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-keys": { @@ -15336,9 +14395,6 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.getownpropertydescriptors": { @@ -15355,9 +14411,6 @@ }, "engines": { "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.pick": { @@ -15384,9 +14437,6 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/obuf": { @@ -15435,9 +14485,6 @@ }, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/open": { @@ -15451,9 +14498,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/opener": { @@ -15503,9 +14547,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ora/node_modules/ansi-styles": { @@ -15518,9 +14559,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/ora/node_modules/chalk": { @@ -15534,9 +14572,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/ora/node_modules/color-convert": { @@ -15672,9 +14707,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { @@ -15699,9 +14731,6 @@ }, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-map": { @@ -15714,9 +14743,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-retry": { @@ -16226,9 +15252,6 @@ "dev": true, "engines": { "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/pidtree": { @@ -16318,12 +15341,7 @@ "node_modules/popper.js": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", - "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" }, "node_modules/portfinder": { "version": "1.0.32", @@ -16380,10 +15398,6 @@ }, "engines": { "node": ">=6.0.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" } }, "node_modules/postcss-calc": { @@ -16518,10 +15532,6 @@ }, "engines": { "node": ">= 4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" } }, "node_modules/postcss-loader": { @@ -17199,7 +16209,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", "integrity": "sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw==", - "deprecated": "We have news to share - Protractor is deprecated and will reach end-of-life by Summer 2023. To learn more and find out about other options please refer to this post on the Angular blog. Thank you for using and contributing to Protractor. https://goo.gle/state-of-e2e-in-angular", "dev": true, "dependencies": { "@types/q": "^0.0.32", @@ -17433,9 +16442,7 @@ "version": "19.6.3", "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.6.3.tgz", "integrity": "sha512-K03xTtGDwS6cBXX/EoqoZxglCUKcX2SLIl92fMnGMRjYpPGXoAV2yKEh3QXmXzKqfZXd8TxjjFww+tEttWv8kw==", - "deprecated": "< 21.3.7 is no longer supported", "dev": true, - "hasInstallScript": true, "dependencies": { "cosmiconfig": "8.0.0", "https-proxy-agent": "5.0.1", @@ -17490,11 +16497,6 @@ }, "engines": { "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } } }, "node_modules/puppeteer-core/node_modules/https-proxy-agent": { @@ -17573,9 +16575,6 @@ }, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/puppeteer/node_modules/js-yaml": { @@ -17603,9 +16602,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/puppeteer/node_modules/resolve-from": { @@ -17646,9 +16642,6 @@ }, "engines": { "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/query-string": { @@ -17683,21 +16676,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "dev": true }, "node_modules/randombytes": { "version": "2.1.0", @@ -17764,13 +16743,6 @@ }, "engines": { "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" } }, "node_modules/rc": { @@ -17822,7 +16794,6 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", - "deprecated": "The functionality that this package provided is now in @npmcli/arborist", "dev": true, "dependencies": { "read-package-json": "^2.0.0", @@ -17892,9 +16863,6 @@ }, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up/node_modules/p-locate": { @@ -17922,9 +16890,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up/node_modules/path-exists": { @@ -17987,7 +16952,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", - "deprecated": "This functionality has been moved to @npmcli/fs", "dev": true, "dependencies": { "debuglog": "^1.0.1", @@ -18102,9 +17066,6 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/regexpu-core": { @@ -18217,7 +17178,6 @@ "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dev": true, "dependencies": { "aws-sign2": "~0.7.0", @@ -18258,7 +17218,6 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "dev": true, "bin": { "uuid": "bin/uuid" @@ -18297,9 +17256,6 @@ }, "bin": { "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/resolve-cwd": { @@ -18327,7 +17283,6 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", "dev": true }, "node_modules/resolve-url-loader": { @@ -18545,9 +17500,6 @@ }, "bin": { "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, "node_modules/ripemd160": { @@ -18586,22 +17538,12 @@ }, "engines": { "node": ">=10.0.0" - }, - "peerDependencies": { - "@types/node": ">=10.0.0", - "rollup": ">=0.31.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } } }, "node_modules/rollup-plugin-sourcemaps/node_modules/source-map-resolve": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", "dev": true, "dependencies": { "atob": "^2.1.2", @@ -18612,9 +17554,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", "dev": true, - "hasInstallScript": true, "optional": true, "os": [ "darwin" @@ -18637,20 +17577,6 @@ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "dependencies": { "queue-microtask": "^1.2.2" } @@ -18693,29 +17619,12 @@ }, "engines": { "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "node_modules/safe-regex": { "version": "1.1.0", @@ -18735,9 +17644,6 @@ "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/safer-buffer": { @@ -18855,9 +17761,6 @@ }, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/sass-graph/node_modules/p-locate": { @@ -18963,27 +17866,6 @@ }, "engines": { "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0", - "sass": "^1.3.0", - "webpack": "^4.36.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - } } }, "node_modules/saucelabs": { @@ -19015,10 +17897,6 @@ }, "engines": { "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" } }, "node_modules/scss-tokenizer": { @@ -19230,9 +18108,6 @@ "dependencies": { "chainsaw": ">=0.0.7 <0.1", "hashish": ">=0.0.2 <0.1" - }, - "engines": { - "node": "*" } }, "node_modules/serialize-javascript": { @@ -19467,9 +18342,6 @@ "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/signal-exit": { @@ -19741,11 +18613,6 @@ }, "engines": { "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } } }, "node_modules/socket.io-parser/node_modules/ms": { @@ -19764,11 +18631,6 @@ }, "engines": { "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } } }, "node_modules/socket.io/node_modules/ms": { @@ -19827,7 +18689,6 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "dev": true, "bin": { "uuid": "bin/uuid" @@ -19912,13 +18773,6 @@ }, "engines": { "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" } }, "node_modules/source-map-loader/node_modules/source-map": { @@ -19934,7 +18788,6 @@ "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", "dev": true, "dependencies": { "atob": "^2.1.2", @@ -19967,14 +18820,12 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", "dev": true }, "node_modules/sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead" + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, "node_modules/spawn-command": { "version": "0.0.2-1", @@ -20054,9 +18905,6 @@ }, "engines": { "node": ">=6.0.0" - }, - "peerDependencies": { - "webpack": "^1 || ^2 || ^3 || ^4" } }, "node_modules/split-string": { @@ -20118,7 +18966,6 @@ "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", "dev": true }, "node_modules/static-extend": { @@ -20357,11 +19204,6 @@ }, "engines": { "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } } }, "node_modules/streamroller/node_modules/fs-extra": { @@ -20437,9 +19279,6 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimend": { @@ -20451,9 +19290,6 @@ "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { @@ -20465,9 +19301,6 @@ "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/strip-ansi": { @@ -20550,13 +19383,6 @@ }, "engines": { "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" } }, "node_modules/stylehacks": { @@ -20618,9 +19444,6 @@ "loader-utils": "^1.0.2", "lodash.clonedeep": "^4.5.0", "when": "~3.6.x" - }, - "peerDependencies": { - "stylus": ">=0.52.4" } }, "node_modules/stylus-loader/node_modules/json5": { @@ -20725,16 +19548,12 @@ "dev": true, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/svgo": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", "dev": true, "dependencies": { "chalk": "^2.4.1", @@ -20864,9 +19683,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/terser": { @@ -20904,13 +19720,6 @@ }, "engines": { "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" } }, "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { @@ -21145,10 +19954,7 @@ "node_modules/traverse": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", - "engines": { - "node": "*" - } + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==" }, "node_modules/tree-kill": { "version": "1.2.2", @@ -21224,21 +20030,13 @@ "dev": true, "engines": { "node": ">=6" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } } }, "node_modules/tsickle": { "version": "0.39.1", "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.39.1.tgz", "integrity": "sha512-CCc9cZhZbKoNizVM+K3Uqgit/go8GacjpqTv1cpwG/n2P0gB9GMoWZbxrUULDE9Wz26Lh86CGf6QyIPUVV1lnQ==", - "dev": true, - "peerDependencies": { - "typescript": "~3.9.5" - } + "dev": true }, "node_modules/tslib": { "version": "2.6.2", @@ -21249,7 +20047,6 @@ "version": "6.1.3", "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", @@ -21271,9 +20068,6 @@ }, "engines": { "node": ">=4.8.0" - }, - "peerDependencies": { - "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" } }, "node_modules/tslint/node_modules/builtin-modules": { @@ -21328,9 +20122,6 @@ "dev": true, "dependencies": { "tslib": "^1.8.1" - }, - "peerDependencies": { - "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" } }, "node_modules/tsutils/node_modules/tslib": { @@ -21376,9 +20167,6 @@ "dev": true, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/type-is": { @@ -21429,9 +20217,6 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typed-array-byte-offset": { @@ -21448,9 +20233,6 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typed-array-length": { @@ -21462,9 +20244,6 @@ "call-bind": "^1.0.2", "for-each": "^0.3.3", "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typedarray": { @@ -21500,20 +20279,6 @@ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz", "integrity": "sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } - ], "engines": { "node": "*" } @@ -21521,7 +20286,7 @@ "node_modules/ui-frontend-common": { "version": "2.1.58", "resolved": "file:../ui-frontend-common/ui-frontend-common-2.1.58.tgz", - "integrity": "sha512-IY8PVnEdblXneb4vKe9zVHpPsnlpj/6616ZCEfQHrDwpbRV01kUM9F2cmhgBbQ6ocG7llv4sUAMmg78wOjQk3g==", + "integrity": "sha512-LrBC2k06H7wy9sFb719K0ZwuyQh5ObutE54Xth1aDxn76L3X5cIuKtivKNFbDR12MjqYp8ovE7sgHG3O1txhzg==", "dependencies": { "@angular/material-moment-adapter": "^10.2.3", "@ngx-translate/core": "13.0.0", @@ -21564,11 +20329,6 @@ "integrity": "sha512-x8LumqydWD7eX9yQTAVeoCM9gFUIGVTUjZqbxdAUavAA3qVnk9wCQux7iHLPXpydl8vyQmLoPQR+fFU+DUDOMA==", "dependencies": { "tslib": "^1.9.0" - }, - "peerDependencies": { - "@angular/common": ">=7.0.0", - "@ngx-translate/core": ">=11.0.0", - "rxjs": ">=6.3.0" } }, "node_modules/ui-frontend-common/node_modules/@ngx-translate/http-loader/node_modules/tslib": { @@ -21591,9 +20351,6 @@ "has-bigints": "^1.0.2", "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/unbzip2-stream": { @@ -21738,7 +20495,6 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "dev": true, "bin": { "uuid": "bin/uuid" @@ -21836,29 +20592,12 @@ "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" }, "bin": { "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" } }, "node_modules/update-browserslist-db/node_modules/picocolors": { @@ -21889,9 +20628,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" } }, "node_modules/update-notifier/node_modules/ansi-styles": { @@ -21904,9 +20640,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/update-notifier/node_modules/chalk": { @@ -21920,9 +20653,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/update-notifier/node_modules/color-convert": { @@ -22009,7 +20739,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", "dev": true }, "node_modules/url": { @@ -22069,9 +20798,6 @@ }, "engines": { "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/use": { @@ -22087,7 +20813,6 @@ "version": "5.0.10", "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "hasInstallScript": true, "dependencies": { "node-gyp-build": "^4.3.0" }, @@ -22128,9 +20853,6 @@ "es-abstract": "^1.17.2", "has-symbols": "^1.0.1", "object.getownpropertydescriptors": "^2.1.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/util/node_modules/inherits": { @@ -22188,11 +20910,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "dev": true }, "node_modules/verror": { "version": "1.10.0", @@ -22229,11 +20947,11 @@ "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", "dev": true, "dependencies": { + "chokidar": "^3.4.1", "graceful-fs": "^4.1.2", "neo-async": "^2.5.0" }, "optionalDependencies": { - "chokidar": "^3.4.1", "watchpack-chokidar2": "^2.0.1" } }, @@ -22320,13 +21038,13 @@ "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", "dev": true, "optional": true, "dependencies": { "anymatch": "^2.0.0", "async-each": "^1.0.1", "braces": "^2.3.2", + "fsevents": "^1.2.7", "glob-parent": "^3.1.0", "inherits": "^2.0.3", "is-binary-path": "^1.0.0", @@ -22335,9 +21053,6 @@ "path-is-absolute": "^1.0.0", "readdirp": "^2.2.1", "upath": "^1.1.1" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" } }, "node_modules/watchpack-chokidar2/node_modules/fill-range": { @@ -22373,9 +21088,7 @@ "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", "dev": true, - "hasInstallScript": true, "optional": true, "os": [ "darwin" @@ -22733,18 +21446,6 @@ }, "engines": { "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - }, - "webpack-command": { - "optional": true - } } }, "node_modules/webpack-bundle-analyzer": { @@ -22830,9 +21531,6 @@ }, "engines": { "node": ">= 6" - }, - "peerDependencies": { - "webpack": "^4.0.0" } }, "node_modules/webpack-dev-middleware/node_modules/isarray": { @@ -22938,14 +21636,6 @@ }, "engines": { "node": ">= 6.11.5" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } } }, "node_modules/webpack-dev-server/node_modules/ansi-regex": { @@ -23046,7 +21736,6 @@ "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", "dev": true, "dependencies": { "anymatch": "^2.0.0", @@ -23164,9 +21853,7 @@ "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", "dev": true, - "hasInstallScript": true, "optional": true, "os": [ "darwin" @@ -23375,9 +22062,6 @@ }, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/webpack-dev-server/node_modules/p-locate": { @@ -23659,7 +22343,6 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "dev": true, "bin": { "uuid": "bin/uuid" @@ -23703,15 +22386,6 @@ }, "engines": { "node": ">=4" - }, - "peerDependencies": { - "html-webpack-plugin": "^2.21.0 || ~3 || >=4.0.0-alpha.2 <5", - "webpack": "^1.12.11 || ~2 || ~3 || ~4" - }, - "peerDependenciesMeta": { - "html-webpack-plugin": { - "optional": true - } } }, "node_modules/webpack/node_modules/braces": { @@ -23985,9 +22659,6 @@ }, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/webpack/node_modules/p-locate": { @@ -24150,9 +22821,6 @@ }, "engines": { "node": ">= 6.9.0" - }, - "peerDependencies": { - "webpack": "^4.0.0" } }, "node_modules/webpack/node_modules/to-regex-range": { @@ -24234,9 +22902,6 @@ "is-number-object": "^1.0.4", "is-string": "^1.0.5", "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-module": { @@ -24259,9 +22924,6 @@ }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/wide-align": { @@ -24301,9 +22963,6 @@ "dev": true, "dependencies": { "loader-utils": "^1.1.0" - }, - "peerDependencies": { - "webpack": ">= 4" } }, "node_modules/worker-plugin/node_modules/json5": { @@ -24344,9 +23003,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { @@ -24359,9 +23015,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/wrap-ansi/node_modules/color-convert": { @@ -24407,18 +23060,6 @@ "dev": true, "engines": { "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } } }, "node_modules/xdg-basedir": { @@ -24454,7 +23095,6 @@ "version": "0.1.31", "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==", - "deprecated": "Deprecated due to CVE-2021-21366 resolved in 0.5.0", "dev": true, "engines": { "node": ">=0.1" @@ -24569,9 +23209,6 @@ "dev": true, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/zone.js": { @@ -27296,15 +25933,13 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true, - "requires": {} + "dev": true }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} + "dev": true }, "alphanum-sort": { "version": "1.0.2", @@ -28109,8 +26744,7 @@ "bootstrap": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz", - "integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==", - "requires": {} + "integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==" }, "boxen": { "version": "5.1.2", @@ -28632,8 +27266,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz", "integrity": "sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw==", - "dev": true, - "requires": {} + "dev": true }, "class-utils": { "version": "0.3.6", @@ -28864,15 +27497,13 @@ "version": "9.0.0", "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.0.0.tgz", "integrity": "sha512-ctjwuntPfZZT2mNj2NDIVu51t9cvbhl/16epc5xEwyzyDt76pX9UgwvY+MbXrf/C/FWwdtmNtfP698BKI+9leQ==", - "dev": true, - "requires": {} + "dev": true }, "@angular/core": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.0.0.tgz", "integrity": "sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w==", - "dev": true, - "requires": {} + "dev": true }, "source-map": { "version": "0.5.7", @@ -30104,8 +28735,7 @@ "d3-svg-legend": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/d3-svg-legend/-/d3-svg-legend-1.13.0.tgz", - "integrity": "sha512-0tMqbamHBfps/GwUO8v1ZXlPKneu0vJLj9R94I1h5/uhDKaYXfbEcqV/1c8NxVHgHEp/UoRLvrGBl9j0s7Hk9Q==", - "requires": {} + "integrity": "sha512-0tMqbamHBfps/GwUO8v1ZXlPKneu0vJLj9R94I1h5/uhDKaYXfbEcqV/1c8NxVHgHEp/UoRLvrGBl9j0s7Hk9Q==" }, "damerau-levenshtein": { "version": "1.0.8", @@ -36452,8 +35082,7 @@ "nvd3": { "version": "1.8.6", "resolved": "https://registry.npmjs.org/nvd3/-/nvd3-1.8.6.tgz", - "integrity": "sha512-YGQ9hAQHuQCF0JmYkT2GhNMHb5pA+vDfQj6C2GdpQPzdRPj/srPG3mh/3fZzUFt+at1NusLk/RqICUWkxm4viQ==", - "requires": {} + "integrity": "sha512-YGQ9hAQHuQCF0JmYkT2GhNMHb5pA+vDfQj6C2GdpQPzdRPj/srPG3mh/3fZzUFt+at1NusLk/RqICUWkxm4viQ==" }, "oauth-sign": { "version": "0.9.0", @@ -41343,8 +39972,7 @@ "version": "0.39.1", "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.39.1.tgz", "integrity": "sha512-CCc9cZhZbKoNizVM+K3Uqgit/go8GacjpqTv1cpwG/n2P0gB9GMoWZbxrUULDE9Wz26Lh86CGf6QyIPUVV1lnQ==", - "dev": true, - "requires": {} + "dev": true }, "tslib": { "version": "2.6.2", @@ -41548,7 +40176,7 @@ }, "ui-frontend-common": { "version": "file:../ui-frontend-common/ui-frontend-common-2.1.58.tgz", - "integrity": "sha512-IY8PVnEdblXneb4vKe9zVHpPsnlpj/6616ZCEfQHrDwpbRV01kUM9F2cmhgBbQ6ocG7llv4sUAMmg78wOjQk3g==", + "integrity": "sha512-LrBC2k06H7wy9sFb719K0ZwuyQh5ObutE54Xth1aDxn76L3X5cIuKtivKNFbDR12MjqYp8ovE7sgHG3O1txhzg==", "requires": { "@angular/material-moment-adapter": "^10.2.3", "@ngx-translate/core": "13.0.0", @@ -43880,8 +42508,7 @@ "version": "8.11.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "dev": true, - "requires": {} + "dev": true }, "xdg-basedir": { "version": "4.0.0", diff --git a/ui/ui-frontend/projects/archive-search/src/app/archive/archive.service.ts b/ui/ui-frontend/projects/archive-search/src/app/archive/archive.service.ts index c1d3142a7b2..1aade2e9a55 100644 --- a/ui/ui-frontend/projects/archive-search/src/app/archive/archive.service.ts +++ b/ui/ui-frontend/projects/archive-search/src/app/archive/archive.service.ts @@ -37,7 +37,7 @@ import { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http'; import { Inject, Injectable, LOCALE_ID } from '@angular/core'; import { MatSnackBar } from '@angular/material/snack-bar'; -import { Observable, of, throwError, TimeoutError } from 'rxjs'; +import { Observable, TimeoutError, of, throwError } from 'rxjs'; import { catchError, map } from 'rxjs/operators'; import { AccessContract, @@ -60,7 +60,9 @@ import { Unit, } from 'ui-frontend-common'; import { ArchiveApiService } from '../core/api/archive-api.service'; +import { ArchiveUnit } from './models/archive-unit'; import { ExportDIPRequestDto, TransferRequestDto } from './models/dip.interface'; +import { JsonPatchDto, MultiJsonPatchDto } from './models/json-patch'; import { ReclassificationCriteriaDto } from './models/reclassification-request.interface'; import { RuleSearchCriteriaDto } from './models/ruleAction.interface'; import { UnitDescriptiveMetadataDto } from './models/unitDescriptiveMetadata.interface'; @@ -405,6 +407,18 @@ export class ArchiveService extends SearchService implements SearchArchiveU getInternalOntologiesList(): Observable { return this.archiveApiService.getInternalOntologiesList(); } + + asyncPartialUpdateArchiveUnits(archiveUnits: ArchiveUnit[]): Observable<{ operationId: String }> { + return this.archiveApiService.asyncPartialUpdateArchiveUnits(archiveUnits); + } + + asyncPartialUpdateArchiveUnitByCommands(jsonPatchDto: JsonPatchDto): Observable<{ operationId: String }> { + return this.archiveApiService.asyncPartialUpdateArchiveUnitByCommands(jsonPatchDto); + } + + asyncPartialUpdateArchiveUnitsByCommands(multiJsonPatchDto: MultiJsonPatchDto): Observable<{ operationId: String }> { + return this.archiveApiService.asyncPartialUpdateArchiveUnitsByCommands(multiJsonPatchDto); + } } function idExists(units: Unit[], id: string): boolean { diff --git a/ui/ui-frontend/projects/archive-search/src/app/archive/models/archive-unit.ts b/ui/ui-frontend/projects/archive-search/src/app/archive/models/archive-unit.ts new file mode 100644 index 00000000000..224da5ea956 --- /dev/null +++ b/ui/ui-frontend/projects/archive-search/src/app/archive/models/archive-unit.ts @@ -0,0 +1,43 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +export interface ArchiveUnit extends ManagementMetadata, SystemMetadata, DescriptiveMetadata { + [key: string]: any; +} + +export interface ManagementMetadata { + '#management'?: any; +} + +export interface SystemMetadata { + '#id': String; +} + +export interface DescriptiveMetadata { + Title?: string; + Description?: string; +} diff --git a/ui/ui-frontend/projects/archive-search/src/app/archive/models/json-patch.ts b/ui/ui-frontend/projects/archive-search/src/app/archive/models/json-patch.ts new file mode 100644 index 00000000000..ec43e9149b0 --- /dev/null +++ b/ui/ui-frontend/projects/archive-search/src/app/archive/models/json-patch.ts @@ -0,0 +1,43 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + */ + +export type PatchOperation = 'add' | 'replace' | 'remove'; + +export interface PatchCommand { + op: PatchOperation; + path: string; + value: any; +} + +export interface JsonPatch extends Array {} + +export interface JsonPatchDto { + id: String; + jsonPatch: JsonPatch; +} + +export interface MultiJsonPatchDto extends Array {} diff --git a/ui/ui-frontend/projects/archive-search/src/app/core/api/archive-api.service.ts b/ui/ui-frontend/projects/archive-search/src/app/core/api/archive-api.service.ts index af3e510b4d6..b488c6b0ce8 100644 --- a/ui/ui-frontend/projects/archive-search/src/app/core/api/archive-api.service.ts +++ b/ui/ui-frontend/projects/archive-search/src/app/core/api/archive-api.service.ts @@ -40,8 +40,8 @@ import { Observable } from 'rxjs'; import { tap } from 'rxjs/operators'; import { ApiUnitObject, - BaseHttpClient, BASE_URL, + BaseHttpClient, Ontology, PageRequest, PaginatedResponse, @@ -50,7 +50,9 @@ import { SearchResponse, Unit, } from 'ui-frontend-common'; +import { ArchiveUnit } from '../../archive/models/archive-unit'; import { ExportDIPRequestDto, TransferRequestDto } from '../../archive/models/dip.interface'; +import { JsonPatchDto, MultiJsonPatchDto } from '../../archive/models/json-patch'; import { ReclassificationCriteriaDto } from '../../archive/models/reclassification-request.interface'; import { RuleSearchCriteriaDto } from '../../archive/models/ruleAction.interface'; import { UnitDescriptiveMetadataDto } from '../../archive/models/unitDescriptiveMetadata.interface'; @@ -199,4 +201,38 @@ export class ArchiveApiService extends BaseHttpClient { getInternalOntologiesList(): Observable { return this.http.get(`${this.apiUrl}/internal-ontologies`); } + + /** + * Updates many archive units asynchronously in one Vitam operation. + * Can perform only add or replace operations on current archive units. + * + * @param archiveUnits archive units to update. + * @param headers optionnal headers. + * @returns a wrapped operation id. + */ + asyncPartialUpdateArchiveUnits(archiveUnits: ArchiveUnit[], headers?: HttpHeaders): Observable<{ operationId: String }> { + return this.http.patch<{ operationId: String }>(`${this.baseUrl}/archive-units`, archiveUnits, { headers }); + } + + /** + * Updates one archive unit asynchronously by using a jsonPatch in one Vitam operation. + * + * @param jsonPatchDto a jsonPatchDto. + * @param headers optionnal headers. + * @returns a wrapped operation id. + */ + asyncPartialUpdateArchiveUnitByCommands(jsonPatchDto: JsonPatchDto, headers?: HttpHeaders): Observable<{ operationId: String }> { + return this.http.patch<{ operationId: String }>(`${this.baseUrl}/archive-units/update/single`, jsonPatchDto, { headers }); + } + + /** + * Updates many archive unit asynchronously by using jsonPatches in one Vitam operation. + * + * @param multiJsonPatchDto a list of jsonPatchDto. + * @param headers optionnal headers. + * @returns a wrapped operation id. + */ + asyncPartialUpdateArchiveUnitsByCommands(multiJsonPatchDto: MultiJsonPatchDto, headers?: HttpHeaders) { + return this.http.patch<{ operationId: String }>(`${this.baseUrl}/archive-units/update/multiple`, multiJsonPatchDto, { headers }); + } }