Paul-API-Next/src/server/api/acgm/add.ts

116 lines
2.2 KiB
TypeScript

import { Api, Post, Query, useContext, useInject } from "@midwayjs/hooks";
import { RedisService } from "@midwayjs/redis";
import { prisma } from "../../utils/prisma";
import { getSong } from "../../utils/netease";
export default Api(
Post(),
Query<{ id: string, bangumi: string }>(),
async () => {
const ctx = useContext();
const client = await useInject(RedisService);
const { id, bangumi } = ctx.query;
if (!id || !bangumi) {
return {
code: 0,
msg: "Required id or bangumi"
}
}
// 查重
const isExist = await prisma.aCGM.findUnique({
where: {
music_id: Number(id)
}
});
if (isExist) {
return {
code: 0,
msg: "this song are existed"
}
}
let result;
// 尝试使用缓存
const cached = await client.lrange(`api-next:163:${id}`, 0, 7);
if (cached.length) {
result = {
id: Number(id),
title: cached[0],
artist: cached[1],
album: cached[2],
alias: cached[3],
cover: cached[4],
lyric: cached[5],
sub_lyric: cached[6],
link: cached[7],
served: Boolean(cached[8]),
cached: true
};
}
// 全新获取
const song = await getSong(id);
if (song) {
await client.rpush(`api-next:163:${id}`,
song.title,
song.artist,
song.album,
song.alias,
song.cover,
song.lyric,
song.sub_lyric,
song.link,
song.served,
err => {
err && console.log(err);
}
);
await client.expire(`api-next:163:${id}`, 21600);
console.log(song);
result = {
...song,
cached: false
}
}
console.log(result);
// 有数据支撑
if (result) {
// 创建数据
await prisma.aCGM.create({
data: {
title: result.title,
artist: result.artist,
album: result.album,
alias: result.alias,
bangumi,
music_id: Number(id),
}
});
return {
code: 1,
msg: "Success",
data: result
};
}
return {
code: 0,
msg: "Failed",
data: undefined
};
}
);