package com.rongyichuang.activity.resolver; import com.rongyichuang.activity.dto.ActivityInput; import com.rongyichuang.activity.dto.ActivityResponse; import com.rongyichuang.activity.service.ActivityService; import com.rongyichuang.common.dto.PageRequest; import com.rongyichuang.common.dto.PageResponse; import com.rongyichuang.common.dto.response.MediaResponse; import com.rongyichuang.common.enums.MediaTargetType; import com.rongyichuang.common.repository.MediaRepository; import com.rongyichuang.common.entity.Media; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.graphql.data.method.annotation.Argument; import org.springframework.graphql.data.method.annotation.MutationMapping; import org.springframework.graphql.data.method.annotation.QueryMapping; import org.springframework.graphql.data.method.annotation.SchemaMapping; import org.springframework.stereotype.Controller; import org.springframework.util.StringUtils; import java.util.List; import java.util.stream.Collectors; @Controller public class ActivityResolver { @Autowired private ActivityService activityService; @Autowired private MediaRepository mediaRepository; @Value("${app.media-url}") private String mediaBaseUrl; /** * 分页查询比赛列表 */ @QueryMapping public PageResponse activities(@Argument int page, @Argument int size, @Argument String name) { PageRequest pageRequest = new PageRequest(page, size); return activityService.findActivities(pageRequest, name); } /** * 获取比赛详情 */ @QueryMapping public ActivityResponse activity(@Argument Long id) { return activityService.findById(id); } /** * 获取所有比赛和阶段(用于下拉选择) */ @QueryMapping public List allActivities() { return activityService.findAllActivitiesForSelection(); } /** * 获取比赛的所有阶段 */ @QueryMapping public List activityStages(@Argument Long activityId) { return activityService.findStagesByActivityId(activityId); } /** * 获取进行中的比赛 */ @QueryMapping public List ongoingActivities() { return activityService.findOngoingActivities(); } /** * 保存比赛 */ @MutationMapping public ActivityResponse saveActivity(@Argument ActivityInput input) { return activityService.saveActivity(input); } /** * 删除比赛 */ @MutationMapping public Boolean deleteActivity(@Argument Long id) { return activityService.deleteActivity(id); } /** * 解析Activity的coverImage字段 */ @SchemaMapping(typeName = "Activity", field = "coverImage") public MediaResponse coverImage(ActivityResponse activity) { List mediaList = mediaRepository.findByTargetTypeAndTargetIdAndState( MediaTargetType.ACTIVITY.getValue(), activity.getId(), 1); // 查找第一个图片类型的媒体作为封面图 return mediaList.stream() .filter(media -> media.getMediaType() != null && media.getMediaType() == 1) // 1表示图片 .findFirst() .map(this::convertToMediaResponse) .orElse(null); } /** * 解析Activity的images字段 */ @SchemaMapping(typeName = "Activity", field = "images") public List images(ActivityResponse activity) { List mediaList = mediaRepository.findByTargetTypeAndTargetIdAndState( MediaTargetType.ACTIVITY.getValue(), activity.getId(), 1); // 返回所有图片类型的媒体 return mediaList.stream() .filter(media -> media.getMediaType() != null && media.getMediaType() == 1) // 1表示图片 .map(this::convertToMediaResponse) .collect(Collectors.toList()); } /** * 解析Activity的videos字段 */ @SchemaMapping(typeName = "Activity", field = "videos") public List videos(ActivityResponse activity) { List mediaList = mediaRepository.findByTargetTypeAndTargetIdAndState( MediaTargetType.ACTIVITY.getValue(), activity.getId(), 1); // 返回所有视频类型的媒体 return mediaList.stream() .filter(media -> media.getMediaType() != null && media.getMediaType() == 2) // 2表示视频 .map(this::convertToMediaResponse) .collect(Collectors.toList()); } /** * 将Media实体转换为MediaResponse */ private MediaResponse convertToMediaResponse(Media media) { MediaResponse response = new MediaResponse(); response.setId(media.getId()); response.setName(media.getName()); response.setPath(media.getPath()); response.setFileSize(media.getFileSize()); response.setFileExt(media.getFileExt()); response.setMediaType(media.getMediaType()); response.setTargetType(media.getTargetType()); response.setTargetId(media.getTargetId()); response.setThumbPath(media.getThumbPath()); response.setDuration(media.getDuration()); response.setDescription(media.getDescription()); // 设置完整URL if (mediaBaseUrl != null && !mediaBaseUrl.isEmpty() && media.getPath() != null) { String base = mediaBaseUrl.endsWith("/") ? mediaBaseUrl.substring(0, mediaBaseUrl.length() - 1) : mediaBaseUrl; String path = media.getPath().startsWith("/") ? media.getPath() : ("/" + media.getPath()); response.setFullUrl(base + path); } // 设置缩略图完整URL if (mediaBaseUrl != null && !mediaBaseUrl.isEmpty() && media.getThumbPath() != null) { String base = mediaBaseUrl.endsWith("/") ? mediaBaseUrl.substring(0, mediaBaseUrl.length() - 1) : mediaBaseUrl; String thumbPath = media.getThumbPath().startsWith("/") ? media.getThumbPath() : ("/" + media.getThumbPath()); response.setFullThumbUrl(base + thumbPath); } return response; } }