OtherController.java 6.38 KB
package cn.fw.freya.controller;

import cn.fw.freya.common.ResponseMessage;
import cn.fw.freya.model.data.Account;
import cn.fw.freya.model.data.pool.LivePool;
import cn.fw.freya.model.dto.other.ReportLiveDto;
import cn.fw.freya.model.dto.other.ReportVideoDto;
import cn.fw.freya.model.dto.rpc.ReportAccountDto;
import cn.fw.freya.service.CommonBizService;
import cn.fw.freya.service.crawl.impl.Common;
import cn.fw.freya.service.rpc.AccountRpcService;
import cn.fw.freya.service.rpc.ReportRpcService;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * @author kurisu
 */
@Slf4j
@Validated
@RestController
@RequestMapping("/other")
@RequiredArgsConstructor
public class OtherController {

    private final Common common;
    private final CommonBizService commonBizService;
    private final AccountRpcService accountRpcService;
    private final ReportRpcService reportRpcService;
    private final ApplicationEventPublisher publisher;

    /**
     * 清理 driverMap
     */
    @GetMapping("/clearMap")
    public ResponseMessage<Boolean> clearMap() {
        return ResponseMessage.success(commonBizService.clearMap());
    }

    /**
     * 初始化项目
     */
    @GetMapping("/init")
    public ResponseMessage<Boolean> init() {
        return ResponseMessage.success(commonBizService.init());
    }

    /**
     * 从服务器同步账号到H2数据库
     *
     * @return
     */
    @GetMapping("/asyncAccount")
    public ResponseMessage<Boolean> asyncAccount() {
        return ResponseMessage.success(commonBizService.doAsyncAccount());
    }

    /**
     * 上报失效账号
     *
     * @param account 账号
     * @param type    账号类型
     * @return
     */
    @PostMapping("/pushExpireAccount")
    public ResponseMessage<Boolean> pushExpireAccount(@NotBlank(message = "账号不能为空") String account, @NotNull(message = "粉丝数不能为空") @NotNull(message = "账户类型不能为空") Integer type) {
        return ResponseMessage.success(accountRpcService.pushExpireAccount(account, type));
    }

    /**
     * 上报账户信息
     *
     * @param account    账号
     * @param type       账号类型
     * @param accountMsg 账户信息
     * @return
     */
    @PostMapping("/reportAccountMsg")
    public ResponseMessage<Boolean> reportAccountMsg(@NotBlank(message = "账号不能为空") String account, @NotNull(message = "账户类型不能为空") Integer type, @NotNull(message = "账户信息不能为空") ReportAccountDto accountMsg) {
        return ResponseMessage.success(reportRpcService.reportAccountMsg(account, type, accountMsg));
    }

    /**
     * 上报账户所有视频数
     *
     * @param dto 所有视频
     * @return
     */
    @PostMapping("/reportVideo")
    public ResponseMessage<Boolean> reportVideo(@RequestBody @Valid ReportVideoDto dto) {
        return ResponseMessage.success(reportRpcService.reportVideo(dto.getAccount(), dto.getType(), dto.getVideoPoolList()));
    }

    /**
     * 上报账户所有直播数
     *
     * @param dto 所有直播
     * @return
     */
    @PostMapping("/reportLive")
    public ResponseMessage<Boolean> reportLive(@RequestBody @Validated ReportLiveDto dto) {
        return ResponseMessage.success(reportRpcService.reportLive(dto.getAccount(), dto.getType(), dto.getLivePoolList()));
    }

    /**
     * 测试spring事件发布
     */
    @GetMapping("/publishEvent")
    public void publishEvent() {
        for (int i = 0; i < 32; i++) {
            publisher.publishEvent(LocalDate.now() + " -> 发布事件 thread->" + i);// 事件发布成功后会等待监听程序执行完所有逻辑后
            System.out.println("事件发布成功");
        }
    }

    /**
     * 处理JSON数据中时间戳对象
     */
    @PostMapping("/formatTimestamp")
    public ResponseMessage<List<JSONObject>> formatJsonTimestamp(@RequestBody @Validated JsonFormatParam param) {
        final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return ResponseMessage.success(JSON.parseArray(param.getJsonString())
                .stream()
                .map(item -> {
                    JSONObject obj = (JSONObject) item;
                    obj.put("duration", BigDecimal.valueOf(obj.getLong("duration")).divide(BigDecimal.valueOf(60), 2, RoundingMode.HALF_UP));
                    param.getFields().forEach(item1 -> obj.put(item1, sdf.format(new Date(obj.getLong(item1)))));
                    return obj;
                }).collect(Collectors.toList())
        );
    }

    @Data
    static class JsonFormatParam {
        @NotBlank(message = "JSON字符串不能为空")
        String jsonString;
        @NotEmpty(message = "必须指定哪些字段需要被格式化")
        Set<String> fields;
    }

    /**
     * 获取随机账户
     *
     * @param type 账户类型
     * @return
     */
    @GetMapping("/getRandomUser")
    public Account getRandomUser(@NotNull(message = "账户类型不能为空") Integer type) {
        return common.getRandomUserByType(type);
    }

    /**
     * 获取直播无回放信息的直播
     *
     * @param type              账户类型
     * @param durationThreshold 时长阈值
     * @return
     */
    @GetMapping("/getWithoutPlaybackLive")
    public List<LivePool> getWithoutPlaybackLive(@NotNull(message = "账户类型不能为空") Integer type, @NotNull(message = "时长阈值不能为空") Double durationThreshold) {
        return common.getWithoutPlaybackLive(type, durationThreshold);
    }

    /**
     * 获取未完成抓取的账号分布
     *
     * @return 未完成抓取的账号分布
     */
    @GetMapping("/getUndoneAccount")
    public Map<String, List<String>> getUndoneAccount() {
        return common.getUndoneAccount();
    }

}