package com.thinkbiganalytics.feedmgr.rest.controller; /*- * #%L * thinkbig-feed-manager-controller * %% * Copyright (C) 2017 ThinkBig Analytics * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ import com.fasterxml.jackson.core.type.TypeReference; import com.thinkbiganalytics.feedmgr.rest.model.ImportComponentOption; import com.thinkbiganalytics.feedmgr.rest.model.ImportFeedOptions; import com.thinkbiganalytics.feedmgr.rest.model.ImportTemplateOptions; import com.thinkbiganalytics.feedmgr.rest.model.UploadProgress; import com.thinkbiganalytics.feedmgr.service.MetadataService; import com.thinkbiganalytics.feedmgr.service.UploadProgressService; import com.thinkbiganalytics.feedmgr.service.feed.ExportImportFeedService; import com.thinkbiganalytics.feedmgr.service.template.ExportImportTemplateService; import com.thinkbiganalytics.feedmgr.util.ImportUtil; import com.thinkbiganalytics.json.ObjectMapperSerializer; import com.thinkbiganalytics.rest.model.RestResponseStatus; import org.glassfish.jersey.media.multipart.FormDataContentDisposition; import org.glassfish.jersey.media.multipart.FormDataParam; import java.io.InputStream; import java.util.Set; import javax.inject.Inject; import javax.validation.constraints.NotNull; import javax.ws.rs.Consumes; import javax.ws.rs.DefaultValue; 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; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; import io.swagger.annotations.SwaggerDefinition; import io.swagger.annotations.Tag; /** * REST API for administrative functions. */ @Api(tags = "Feed Manager - Administration", produces = "application/json") @Path(AdminControllerV2.BASE) @SwaggerDefinition(tags = @Tag(name = "Feed Manager - Administration", description = "administrator operations")) public class AdminControllerV2 { public static final String BASE = "/v2/feedmgr/admin"; public static final String IMPORT_TEMPLATE = "/import-template"; public static final String IMPORT_FEED = "/import-feed"; @Inject ExportImportTemplateService exportImportTemplateService; @Inject ExportImportFeedService exportImportFeedService; @Inject UploadProgressService uploadProgressService; /** * Feed manager metadata service */ @Inject MetadataService metadataService; @GET @Path("/upload-status/{key}") @Produces(MediaType.APPLICATION_JSON) @ApiOperation("Gets thet status of a given upload/import.") @ApiResponses({ @ApiResponse(code = 200, message = "Returns the upload status") }) public Response uploadStatus(@NotNull @PathParam("key") String key) { UploadProgress uploadProgress = uploadProgressService.getUploadStatus(key); if (uploadProgress != null) { uploadProgress.checkAndIncrementPercentage(); return Response.ok(uploadProgress).build(); } else { return Response.ok(uploadProgress).build(); } } @POST @Path(IMPORT_FEED) @Consumes(MediaType.MULTIPART_FORM_DATA) @Produces(MediaType.APPLICATION_JSON) @ApiOperation("Imports a feed zip file.") @ApiResponses({ @ApiResponse(code = 200, message = "Returns the feed metadata.", response = ExportImportFeedService.ImportFeed.class), @ApiResponse(code = 500, message = "There was a problem importing the feed.", response = RestResponseStatus.class) }) public Response uploadFeed(@NotNull @FormDataParam("file") InputStream fileInputStream, @NotNull @FormDataParam("file") FormDataContentDisposition fileMetaData, @NotNull @FormDataParam("uploadKey") String uploadKey, @FormDataParam("categorySystemName") String categorySystemName, @FormDataParam("disableFeedUponImport") @DefaultValue("false") boolean disableFeedUponImport, @FormDataParam("importComponents") String importComponents) throws Exception { ImportFeedOptions options = new ImportFeedOptions(); options.setUploadKey(uploadKey); options.setDisableUponImport(disableFeedUponImport); ExportImportFeedService.ImportFeed importFeed = null; options.setCategorySystemName(categorySystemName); boolean overwriteFeed = true; boolean overwriteTemplate = true; uploadProgressService.newUpload(uploadKey); if (importComponents == null) { byte[] content = ImportUtil.streamToByteArray(fileInputStream); importFeed = exportImportFeedService.validateFeedForImport(fileMetaData.getFileName(), content, options); importFeed.setSuccess(false); } else { options.setImportComponentOptions(ObjectMapperSerializer.deserialize(importComponents, new TypeReference<Set<ImportComponentOption>>() { })); byte[] content = ImportUtil.streamToByteArray(fileInputStream); importFeed = exportImportFeedService.importFeed(fileMetaData.getFileName(), content, options); } uploadProgressService.removeUpload(uploadKey); return Response.ok(importFeed).build(); } @POST @Path(IMPORT_TEMPLATE) @Consumes(MediaType.MULTIPART_FORM_DATA) @Produces(MediaType.APPLICATION_JSON) @ApiOperation("Imports a template xml or zip file.") @ApiResponses({ @ApiResponse(code = 200, message = "Returns the template metadata.", response = ExportImportTemplateService.ImportTemplate.class), @ApiResponse(code = 500, message = "There was a problem importing the template.", response = RestResponseStatus.class) }) public Response uploadTemplate(@NotNull @FormDataParam("file") InputStream fileInputStream, @NotNull @FormDataParam("file") FormDataContentDisposition fileMetaData, @NotNull @FormDataParam("uploadKey") String uploadKey, @FormDataParam("importComponents") String importComponents) throws Exception { ImportTemplateOptions options = new ImportTemplateOptions(); options.setUploadKey(uploadKey); ExportImportTemplateService.ImportTemplate importTemplate = null; byte[] content = ImportUtil.streamToByteArray(fileInputStream); uploadProgressService.newUpload(uploadKey); if (importComponents == null) { importTemplate = exportImportTemplateService.validateTemplateForImport(fileMetaData.getFileName(), content, options); importTemplate.setSuccess(false); } else { options.setImportComponentOptions(ObjectMapperSerializer.deserialize(importComponents, new TypeReference<Set<ImportComponentOption>>() { })); importTemplate = exportImportTemplateService.importTemplate(fileMetaData.getFileName(), content, options); } return Response.ok(importTemplate).build(); } }