From 61362d9448377de0f1c0564c54d7b08402c46da4 Mon Sep 17 00:00:00 2001 From: Jens Pelzetter Date: Tue, 7 Jul 2020 16:49:38 +0200 Subject: [PATCH] RESTful API for Import and Export Former-commit-id: 9aea37c68b77767a71426d968b798a5357c9ea47 --- .../java/org/libreccm/api/admin/AdminApi.java | 4 + .../api/admin/imexport/ImExportApi.java | 131 ++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 ccm-core/src/main/java/org/libreccm/api/admin/imexport/ImExportApi.java diff --git a/ccm-core/src/main/java/org/libreccm/api/admin/AdminApi.java b/ccm-core/src/main/java/org/libreccm/api/admin/AdminApi.java index 4c9b752eb..e363fe4b5 100644 --- a/ccm-core/src/main/java/org/libreccm/api/admin/AdminApi.java +++ b/ccm-core/src/main/java/org/libreccm/api/admin/AdminApi.java @@ -20,6 +20,7 @@ import org.libreccm.api.DefaultResponseHeaders; import org.libreccm.api.PreflightRequestFilter; import org.libreccm.api.admin.categorization.CategoriesApi; import org.libreccm.api.admin.categorization.DomainsApi; +import org.libreccm.api.admin.imexport.ImExportApi; import org.libreccm.api.admin.sites.SitesApi; import org.libreccm.api.admin.web.CcmApplicationsApi; import org.libreccm.configuration.Configuration; @@ -46,6 +47,9 @@ public class AdminApi extends Application { // Configuration API classes.add(Configuration.class); + // Import and Export of entities + classes.add(ImExportApi.class); + // Security API classes.add(GroupsApi.class); classes.add(RolesApi.class); diff --git a/ccm-core/src/main/java/org/libreccm/api/admin/imexport/ImExportApi.java b/ccm-core/src/main/java/org/libreccm/api/admin/imexport/ImExportApi.java new file mode 100644 index 000000000..a9a206eb5 --- /dev/null +++ b/ccm-core/src/main/java/org/libreccm/api/admin/imexport/ImExportApi.java @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2020 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.libreccm.api.admin.imexport; + +import org.libreccm.api.Identifier; +import org.libreccm.api.IdentifierParser; +import org.libreccm.core.CcmObject; +import org.libreccm.core.CcmObjectRepository; +import org.libreccm.core.CoreConstants; +import org.libreccm.imexport.Exportable; +import org.libreccm.imexport.ImportExport; +import org.libreccm.imexport.ImportManifest; +import org.libreccm.security.AuthorizationRequired; +import org.libreccm.security.RequiresPrivilege; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.transaction.Transactional; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Path("imexport") +public class ImExportApi { + + @Inject + private CcmObjectRepository ccmObjectRepository; + + @Inject + private IdentifierParser identifierParser; + + @Inject + private ImportExport importExport; + + + @GET + @Path("/imports/") + @Produces(MediaType.APPLICATION_JSON) + @AuthorizationRequired + @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) + @Transactional(Transactional.TxType.REQUIRED) + public List listImports() { + return importExport.listAvailableImportArchivies(); + } + + @POST + @Path("/imports/{importName}") + @AuthorizationRequired + @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) + @Transactional(Transactional.TxType.REQUIRED) + public Response importArchive( + @PathParam("importName") final String importName + ) { + importExport.importEntities(importName); + + return Response.ok(String.format( + "Archive %s successfully imported.", importName) + ).build(); + } + + @POST + @Path("/imports/{exportName}") + @Consumes(MediaType.APPLICATION_JSON) + @AuthorizationRequired + @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) + @Transactional(Transactional.TxType.REQUIRED) + public Response exportEntities( + final String exportName, final List entityIds + ) { + final List entities = entityIds + .stream() + .map(this::findEntity) + .filter(Optional::isPresent) + .map(Optional::get) + .filter(obj -> obj instanceof Exportable) + .map(obj -> (Exportable) obj) + .collect(Collectors.toList()); + + importExport.exportEntities(entities, exportName); + + return Response.ok( + String.format("Export %s successfully created.", exportName) + ).build(); + } + + private Optional findEntity(final String entityId) { + final Identifier identifier = identifierParser.parseIdentifier(entityId); + switch(identifier.getType()) { + case ID: + return ccmObjectRepository.findObjectById( + Long.parseLong(identifier.getIdentifier()) + ); + case UUID: + return ccmObjectRepository.findObjectByUuid( + identifier.getIdentifier() + ); + default: + return Optional.empty(); + } + } +}