package com.dji.sample.media.service.impl; import com.dji.sample.common.model.ResponseResult; import com.dji.sample.component.mqtt.model.*; import com.dji.sample.component.mqtt.service.IMessageSenderService; import com.dji.sample.manage.model.dto.DeviceDTO; import com.dji.sample.manage.service.IDeviceService; import com.dji.sample.media.model.FileUploadCallback; import com.dji.sample.media.model.FileUploadDTO; import com.dji.sample.media.model.MediaFileDTO; import com.dji.sample.media.service.IFileService; import com.dji.sample.media.service.IMediaService; import com.dji.sample.wayline.model.dto.WaylineJobDTO; import com.dji.sample.wayline.service.IWaylineJobService; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.integration.annotation.ServiceActivator; import org.springframework.stereotype.Service; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; /** * @author sean * @version 0.2 * @date 2021/12/9 */ @Service public class MediaServiceImpl implements IMediaService { @Autowired private IFileService fileService; @Autowired private IWaylineJobService waylineJobService; @Autowired private ObjectMapper objectMapper; @Autowired private IMessageSenderService messageSenderService; @Autowired private IDeviceService deviceService; @Override public Boolean fastUpload(String workspaceId, String fingerprint) { return fileService.checkExist(workspaceId, fingerprint); } @Override public Integer saveMediaFile(String workspaceId, FileUploadDTO file) { return fileService.saveFile(workspaceId, file); } @Override public List getAllTinyFingerprintsByWorkspaceId(String workspaceId) { return fileService.getAllFilesByWorkspaceId(workspaceId) .stream() .map(MediaFileDTO::getTinnyFingerprint) .collect(Collectors.toList()); } @Override public List getExistTinyFingerprints(String workspaceId, List tinyFingerprints) { List tinyFingerprintList = this.getAllTinyFingerprintsByWorkspaceId(workspaceId); return tinyFingerprints .stream() .filter(tinyFingerprintList::contains) .collect(Collectors.toList()); } @Override @ServiceActivator(inputChannel = ChannelName.INBOUND_EVENTS_FILE_UPLOAD_CALLBACK, outputChannel = ChannelName.OUTBOUND) public void handleFileUploadCallBack(CommonTopicReceiver receiver) { FileUploadCallback callback = objectMapper.convertValue(receiver.getData(), FileUploadCallback.class); String topic = TopicConst.THING_MODEL_PRE + TopicConst.PRODUCT + receiver.getGateway() + TopicConst.EVENTS_SUF + TopicConst._REPLY_SUF; CommonTopicResponse data = CommonTopicResponse.builder() .timestamp(System.currentTimeMillis()) .method(EventsMethodEnum.FILE_UPLOAD_CALLBACK.getMethod()) .data(RequestsReply.success()) .tid(receiver.getTid()) .bid(receiver.getBid()) .build(); if (callback.getResult() == ResponseResult.CODE_SUCCESS) { String jobId = callback.getFile().getExt().getFlightId(); Optional jobOpt = waylineJobService.getJobByJobId(jobId); if (jobOpt.isPresent()) { // Set the drone sn that shoots the media Optional dockDTO = deviceService.getDeviceBySn(jobOpt.get().getDockSn()); dockDTO.ifPresent(dock -> callback.getFile().getExt().setSn(dock.getChildDeviceSn())); // set path String objectKey = callback.getFile().getObjectKey(); callback.getFile().setPath(objectKey.substring(objectKey.indexOf("/") + 1, objectKey.lastIndexOf("/"))); int id = fileService.saveFile(jobOpt.get().getWorkspaceId(), callback.getFile()); if (id <= 0) { data.setData(ResponseResult.error()); } } } messageSenderService.publish(topic, data); } }