package com.dji.sample.wayline.controller; import com.dji.sample.common.model.CustomClaim; import com.dji.sample.component.oss.model.OssConfiguration; import com.dji.sample.wayline.model.dto.WaylineFileDTO; import com.dji.sample.wayline.service.IWaylineFileService; import com.dji.sdk.cloudapi.device.DeviceEnum; import com.dji.sdk.cloudapi.wayline.*; import com.dji.sdk.cloudapi.wayline.api.IHttpWaylineService; import com.dji.sdk.common.HttpResultResponse; import com.dji.sdk.common.PaginationData; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import java.io.IOException; import java.net.URL; import java.sql.SQLException; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; import static com.dji.sample.component.AuthInterceptor.TOKEN_CLAIM; /** * @author sean * @version 0.3 * @date 2021/12/22 */ @RestController public class WaylineFileController implements IHttpWaylineService { @Autowired private IWaylineFileService waylineFileService; /** * Delete the wayline file in the workspace according to the wayline id. * @param workspaceId * @param waylineId * @return */ @DeleteMapping("${url.wayline.prefix}${url.wayline.version}/workspaces/{workspace_id}/waylines/{wayline_id}") public HttpResultResponse deleteWayline(@PathVariable(name = "workspace_id") String workspaceId, @PathVariable(name = "wayline_id") String waylineId) { boolean isDel = waylineFileService.deleteByWaylineId(workspaceId, waylineId); return isDel ? HttpResultResponse.success() : HttpResultResponse.error("Failed to delete wayline."); } /** * Import kmz wayline files. * @param file * @return */ @PostMapping("${url.wayline.prefix}${url.wayline.version}/waylines/file/upload") public HttpResultResponse importKmzFile(HttpServletRequest request, MultipartFile file) { if (Objects.isNull(file)) { return HttpResultResponse.error("No file received."); } CustomClaim customClaim = (CustomClaim)request.getAttribute(TOKEN_CLAIM); String workspaceId = customClaim.getWorkspaceId(); String creator = customClaim.getUsername(); waylineFileService.importKmzFile(file, workspaceId, creator); return HttpResultResponse.success(); } /** * Query the basic data of the wayline file according to the query conditions. * The query condition field in pilot is fixed. * @param request * @param workspaceId * @return */ @Override public HttpResultResponse> getWaylineListW(@Valid GetWaylineListRequest request, String workspaceId, HttpServletRequest req, HttpServletResponse rsp) { PaginationData data = waylineFileService.getWaylinesByParam(workspaceId, request); return HttpResultResponse.success(data); } /** * Query the basic data of the wayline file according to the query conditions. * The query condition field in pilot is fixed. * @return */ @Override public HttpResultResponse> getWaylineList(@RequestParam(defaultValue = "1") Long page, @RequestParam(name = "page_size", defaultValue = "10") Long pageSize, HttpServletRequest req, HttpServletResponse rsp) { PaginationData data = waylineFileService.getWaylines(page, pageSize); return HttpResultResponse.success(data); } /** * Query the download address of the file according to the wayline file id, * and redirect to this address directly for download. * @param workspaceId * @param waylineId * @param req * @param rsp */ @Override public void getWaylineFileDownloadAddress(String workspaceId, String waylineId, HttpServletRequest req, HttpServletResponse rsp) { try { URL url = waylineFileService.getObjectUrl(workspaceId, waylineId); rsp.sendRedirect(url.toString()); } catch (IOException | SQLException e) { e.printStackTrace(); } } /** * Query the download address of the file according to the wayline file id, * and redirect to this address directly for download. * @param objectKey */ @PostMapping("/object-url/get") public String getWaylineFileDownloadAddress(@RequestParam(value = "object_key") String objectKey) { // try { URL url = waylineFileService.getObjectUrl(objectKey); return url.toString().replace(OssConfiguration.endpoint,OssConfiguration.endpointSpare); // return url.toString(); // } catch ( SQLException e) { // e.printStackTrace(); // return e.toString(); // } } /** * Checking whether the name already exists according to the wayline name must ensure the uniqueness of the wayline name. * This interface will be called when uploading waylines and must be available. * @param workspaceId * @param names * @return */ @Override public HttpResultResponse> getDuplicatedWaylineName(String workspaceId, @NotNull @Size(min = 1) List names, HttpServletRequest req, HttpServletResponse rsp) { List existNamesList = waylineFileService.getDuplicateNames(workspaceId, names); return HttpResultResponse.success(existNamesList); } /** * When the wayline file is uploaded to the storage server by pilot, * the basic information of the file is reported through this interface. * @param request * @param workspaceId * @return */ @Override public HttpResultResponse fileUploadResultReport(String workspaceId, @Valid WaylineUploadCallbackRequest request, HttpServletRequest req, HttpServletResponse rsp) { CustomClaim customClaim = (CustomClaim)req.getAttribute(TOKEN_CLAIM); WaylineUploadCallbackMetadata metadata = request.getMetadata(); WaylineFileDTO file = WaylineFileDTO.builder() .username(customClaim.getUsername()) .objectKey(request.getObjectKey()) .name(request.getName()) .templateTypes(metadata.getTemplateTypes().stream().map(WaylineTypeEnum::getValue).collect(Collectors.toList())) .payloadModelKeys(metadata.getPayloadModelKeys().stream().map(DeviceEnum::getDevice).collect(Collectors.toList())) .droneModelKey(metadata.getDroneModelKey().getDevice()) .build(); int id = waylineFileService.saveWaylineFile(workspaceId, file); return id <= 0 ? HttpResultResponse.error() : HttpResultResponse.success(); } /** * Favorite the wayline file according to the wayline file id. * @param workspaceId * @param ids wayline file id * @return */ @Override public HttpResultResponse batchFavoritesWayline(String workspaceId, @NotNull @Size(min = 1) List ids, HttpServletRequest req, HttpServletResponse rsp) { boolean isMark = waylineFileService.markFavorite(workspaceId, ids, true); return isMark ? HttpResultResponse.success() : HttpResultResponse.error(); } /** * Delete the favorites of this wayline file based on the wayline file id. * @param workspaceId * @param ids wayline file id * @return */ @Override public HttpResultResponse batchUnfavoritesWayline(String workspaceId, @NotNull @Size(min = 1) List ids, HttpServletRequest req, HttpServletResponse rsp) { boolean isMark = waylineFileService.markFavorite(workspaceId, ids, false); return isMark ? HttpResultResponse.success() : HttpResultResponse.error(); } }