Jelajahi Sumber

添加 VideoEditController 接口和实现

reghao 7 bulan lalu
induk
melakukan
bc7b7f1bb6

+ 0 - 14
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/VideoController.java

@@ -51,18 +51,4 @@ public class VideoController {
             return WebResult.failWithMsg("视频文件不存在");
         }
     }
-
-    @Operation(summary = "视频报错", description = "N")
-    @PostMapping("/report")
-    public String errorReport(@RequestBody @Validated VideoErrorReport videoErrorReport) {
-        Result result = videoService.errorReport(videoErrorReport);
-        return WebResult.result(result);
-    }
-
-    @Operation(summary = "视频编辑", description = "N")
-    @PostMapping("/edit")
-    public String editVideo(@RequestBody @Validated VideoEdit videoEdit) {
-        videoService.editVideo(videoEdit);
-        return WebResult.success();
-    }
 }

+ 59 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/VideoEditController.java

@@ -0,0 +1,59 @@
+package cn.reghao.tnb.content.app.vod.controller;
+
+import cn.reghao.jutil.jdk.result.Result;
+import cn.reghao.jutil.web.WebResult;
+import cn.reghao.tnb.content.app.vod.model.dto.VideoEdit;
+import cn.reghao.tnb.content.app.vod.model.dto.VideoErrorReport;
+import cn.reghao.tnb.content.app.vod.model.dto.VideoVipTags;
+import cn.reghao.tnb.content.app.vod.model.po.VipTag;
+import cn.reghao.tnb.content.app.vod.service.VideoEditService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2025-08-02 20:12:33
+ */
+@Tag(name = "视频稿件编辑接口")
+@RestController
+@RequestMapping("/api/content/video/edit")
+public class VideoEditController {
+    private final VideoEditService videoEditService;
+
+    public VideoEditController(VideoEditService videoEditService) {
+        this.videoEditService = videoEditService;
+    }
+
+    @Operation(summary = "视频报错", description = "N")
+    @PostMapping("/report")
+    public String errorReport(@RequestBody @Validated VideoErrorReport videoErrorReport) {
+        Result result = videoEditService.errorReport(videoErrorReport);
+        return WebResult.result(result);
+    }
+
+    @Operation(summary = "更新视频稿件所有者", description = "N")
+    @PostMapping("/update_owner")
+    public String editVideo(@RequestBody @Validated VideoEdit videoEdit) {
+        videoEditService.updateVideoOwner(videoEdit);
+        return WebResult.success();
+    }
+
+    @Operation(summary = "获取视频稿件 VIP 标签", description = "N")
+    @GetMapping(value = "/vip_tags", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String getVipTags() {
+        List<VipTag> list = videoEditService.getVipTags();
+        return WebResult.success(list);
+    }
+
+    @Operation(summary = "设置视频稿件 VIP 标签", description = "N")
+    @PostMapping(value = "/vip_tags", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String addVipTags(@RequestBody @Validated VideoVipTags videoVipTags) {
+        videoEditService.addVipTags(videoVipTags);
+        return WebResult.success();
+    }
+}

+ 16 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/db/mapper/VipTagMapper.java

@@ -0,0 +1,16 @@
+package cn.reghao.tnb.content.app.vod.db.mapper;
+
+import cn.reghao.jutil.jdk.db.BaseMapper;
+import cn.reghao.tnb.content.app.vod.model.po.VipTag;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2025-08-02 19:49:37
+ */
+@Mapper
+public interface VipTagMapper extends BaseMapper<VipTag> {
+    List<VipTag> findByPid(int pid);
+}

+ 19 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/model/dto/VideoVipTags.java

@@ -0,0 +1,19 @@
+package cn.reghao.tnb.content.app.vod.model.dto;
+
+import lombok.Getter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2025-08-02 21:20:20
+ */
+@Getter
+public class VideoVipTags {
+    @NotBlank
+    private String videoId;
+    @Size(min = 1, max = 100, message = "视频标签")
+    private List<String> tags;
+}

+ 24 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/model/po/VipTag.java

@@ -0,0 +1,24 @@
+package cn.reghao.tnb.content.app.vod.model.po;
+
+import cn.reghao.jutil.jdk.db.BaseObject;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2025-08-02 19:47:51
+ */
+@AllArgsConstructor
+@NoArgsConstructor
+@Setter
+@Getter
+public class VipTag extends BaseObject<Integer> {
+    private Integer pid;
+    private String name;
+    private String tagId;
+    private List<VipTag> children;
+}

+ 101 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/VideoEditService.java

@@ -0,0 +1,101 @@
+package cn.reghao.tnb.content.app.vod.service;
+
+import cn.reghao.jutil.jdk.result.Result;
+import cn.reghao.tnb.common.auth.UserContext;
+import cn.reghao.tnb.content.api.constant.VideoErrorType;
+import cn.reghao.tnb.content.api.constant.VideoStatus;
+import cn.reghao.tnb.content.app.vod.db.mapper.VideoErrorMapper;
+import cn.reghao.tnb.content.app.vod.db.mapper.VideoPostMapper;
+import cn.reghao.tnb.content.app.vod.db.mapper.VipTagMapper;
+import cn.reghao.tnb.content.app.vod.model.dto.VideoEdit;
+import cn.reghao.tnb.content.app.vod.model.dto.VideoErrorReport;
+import cn.reghao.tnb.content.app.vod.model.dto.VideoVipTags;
+import cn.reghao.tnb.content.app.vod.model.po.VideoError;
+import cn.reghao.tnb.content.app.vod.model.po.VipTag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2025-08-02 20:12:44
+ */
+@Slf4j
+@Service
+public class VideoEditService {
+    private final VideoPostMapper videoPostMapper;
+    private final VipTagMapper vipTagMapper;
+    private final VideoErrorMapper videoErrorMapper;
+    private final Set<Long> adminUsers = Set.of(10001L, 10002L);
+
+    public VideoEditService(VideoPostMapper videoPostMapper, VipTagMapper vipTagMapper,
+                            VideoErrorMapper videoErrorMapper) {
+        this.videoPostMapper = videoPostMapper;
+        this.vipTagMapper = vipTagMapper;
+        this.videoErrorMapper = videoErrorMapper;
+    }
+
+    public Result errorReport(VideoErrorReport videoErrorReport) {
+        long loginUser = UserContext.getUser();
+        if (!adminUsers.contains(loginUser)) {
+            return Result.fail("no permission");
+        }
+
+        String videoId = videoErrorReport.getVideoId();
+        int errCode = videoErrorReport.getErrorCode();
+        VideoErrorType errorType = VideoErrorType.getDescByCode(errCode);
+        int videoStatus;
+        switch (errorType) {
+            case noCover:
+            case noAudio:
+            case noVideo:
+                videoStatus = VideoStatus.needRepair.getCode();
+                break;
+            case noResource:
+                videoStatus = VideoStatus.revoke.getCode();
+                break;
+            case hasAd:
+                videoStatus = VideoStatus.hasAd.getCode();
+                break;
+            case needRestore:
+                videoStatus = VideoStatus.needRestore.getCode();
+                break;
+            default:
+                return Result.fail("unknown errorType");
+        }
+
+        videoPostMapper.updateVideoStatus(videoId, videoStatus);
+        if (videoStatus != VideoStatus.revoke.getCode() || videoStatus != VideoStatus.needRestore.getCode()) {
+            VideoError videoError = new VideoError(videoErrorReport);
+            videoErrorMapper.save(videoError);
+        }
+
+        return Result.success();
+    }
+
+    public void updateVideoOwner(VideoEdit videoEdit) {
+        long newUserId = videoEdit.getNewUserId();
+        videoPostMapper.updateVideoUser(newUserId, videoEdit.getVideoIds());
+    }
+
+    public List<VipTag> getVipTags() {
+        List<VipTag> list = vipTagMapper.findAll();
+        Map<Integer, List<VipTag>> groupMap = list.stream().collect(Collectors.groupingBy(VipTag::getPid));
+        List<VipTag> parents = groupMap.get(0);
+        for (VipTag parent : parents) {
+            int id = parent.getId();
+            parent.setChildren(groupMap.get(id));
+        }
+        return parents;
+    }
+
+    public void addVipTags(VideoVipTags videoVipTags) {
+        String videoId = videoVipTags.getVideoId();
+        List<String> tags = videoVipTags.getTags();
+        log.info("{} -> {}", videoId, tags);
+    }
+}

+ 3 - 57
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/VideoService.java

@@ -1,23 +1,16 @@
 package cn.reghao.tnb.content.app.vod.service;
 
 import cn.reghao.file.api.iface.OssService;
-import cn.reghao.jutil.jdk.result.Result;
-import cn.reghao.oss.sdk.model.dto.media.VideoInfo;
 import cn.reghao.oss.sdk.model.dto.media.VideoUrlDto;
 import cn.reghao.tnb.common.auth.UserContext;
-import cn.reghao.tnb.content.api.constant.VideoErrorType;
-import cn.reghao.tnb.content.api.constant.VideoStatus;
 import cn.reghao.tnb.content.app.vod.db.mapper.*;
-import cn.reghao.tnb.content.app.vod.model.dto.*;
 import cn.reghao.tnb.content.app.vod.model.po.*;
 import cn.reghao.tnb.content.app.vod.model.vo.DownloadUrl;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.stereotype.Service;
 
-import java.util.Collections;
 import java.util.List;
-import java.util.Set;
 
 /**
  * @author reghao
@@ -31,59 +24,17 @@ public class VideoService {
 
     private final VideoPostMapper videoPostMapper;
     private final VideoFileMapper videoFileMapper;
-    private final VideoErrorMapper videoErrorMapper;
-    private final Set<Long> adminUsers;
-    private VideoStatisticMapper videoStatisticMapper;
+    private final VideoStatisticMapper videoStatisticMapper;
 
     public VideoService(VideoPostMapper videoPostMapper, VideoFileMapper videoFileMapper,
-                        VideoErrorMapper videoErrorMapper, VideoStatisticMapper videoStatisticMapper) {
+                        VideoStatisticMapper videoStatisticMapper) {
         this.videoPostMapper = videoPostMapper;
         this.videoFileMapper = videoFileMapper;
-        this.videoErrorMapper = videoErrorMapper;
         this.videoStatisticMapper = videoStatisticMapper;
-        this.adminUsers = Set.of(10001L, 10002L);
     }
 
     public void thumbVideo(String videoId) {
-        //videoStatisticMapper.updateIncrView(videoId);
-    }
-
-    public Result errorReport(VideoErrorReport videoErrorReport) {
-        long loginUser = UserContext.getUser();
-        if (!adminUsers.contains(loginUser)) {
-            return Result.fail("no permission");
-        }
-
-        String videoId = videoErrorReport.getVideoId();
-        int errCode = videoErrorReport.getErrorCode();
-        VideoErrorType errorType = VideoErrorType.getDescByCode(errCode);
-        int videoStatus;
-        switch (errorType) {
-            case noCover:
-            case noAudio:
-            case noVideo:
-                videoStatus = VideoStatus.needRepair.getCode();
-                break;
-            case noResource:
-                videoStatus = VideoStatus.revoke.getCode();
-                break;
-            case hasAd:
-                videoStatus = VideoStatus.hasAd.getCode();
-                break;
-            case needRestore:
-                videoStatus = VideoStatus.needRestore.getCode();
-                break;
-            default:
-                return Result.fail("unknown errorType");
-        }
-
-        videoPostMapper.updateVideoStatus(videoId, videoStatus);
-        if (videoStatus != VideoStatus.revoke.getCode() || videoStatus != VideoStatus.needRestore.getCode()) {
-            VideoError videoError = new VideoError(videoErrorReport);
-            videoErrorMapper.save(videoError);
-        }
-
-        return Result.success();
+        videoStatisticMapper.updateIncrView(videoId);
     }
 
     public String getShareLink(String videoId) {
@@ -112,9 +63,4 @@ public class VideoService {
 
         return null;
     }
-
-    public void editVideo(VideoEdit videoEdit) {
-        long newUserId = videoEdit.getNewUserId();
-        videoPostMapper.updateVideoUser(newUserId, videoEdit.getVideoIds());
-    }
 }

+ 30 - 0
content/content-service/src/main/resources/mapper/vod/VipTagMapper.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="cn.reghao.tnb.content.app.vod.db.mapper.VipTagMapper">
+    <insert id="save" useGeneratedKeys="true" keyProperty="id">
+        insert into vod_vip_tag
+        (`pid`,`name`,`tag_id`)
+        values
+        (#{pid},#{name},#{tagId})
+    </insert>
+    <insert id="saveAll" useGeneratedKeys="true" keyProperty="id">
+        insert ignore into vod_vip_tag
+        (`pid`,`name`,`tag_id`)
+        values
+        <foreach collection="list" item="item" index="index" separator=",">
+            (#{item.pid},#{item.name},#{item.tagId})
+        </foreach>
+    </insert>
+
+    <select id="findAll" resultType="cn.reghao.tnb.content.app.vod.model.po.VipTag">
+        select *
+        from vod_vip_tag
+        limit 1000
+    </select>
+    <select id="findByPid" resultType="cn.reghao.tnb.content.app.vod.model.po.VipTag">
+        select * 
+        from vod_vip_tag 
+        where pid=#{pid}
+    </select>
+</mapper>