Files
wr.do/lib/dto/scrape.ts
2025-05-04 21:00:30 +08:00

202 lines
3.7 KiB
TypeScript

import { ScrapeMeta } from "@prisma/client";
import { prisma } from "@/lib/db";
import { getStartDate } from "../utils";
export async function createScrapeMeta(
data: Omit<ScrapeMeta, "id" | "createdAt" | "updatedAt">,
) {
try {
const meta = await findOrCreateScrapeMeta(data);
return { status: "success", data: meta };
} catch (error) {
console.error("create meta error", error);
return { status: "error", message: error.message };
}
}
async function findOrCreateScrapeMeta(data) {
const meta = await prisma.scrapeMeta.findFirst({
where: {
ip: data.ip,
type: data.type,
link: data.link,
},
});
if (meta) {
return await incrementClick(meta.id);
} else {
return await prisma.scrapeMeta.create({ data });
}
}
async function incrementClick(id: string) {
return await prisma.scrapeMeta.update({
where: { id },
data: {
click: { increment: 1 },
updatedAt: new Date(), // Prisma will handle the ISO string conversion
},
});
}
export async function getApiKeyCallCount() {
try {
return await prisma.scrapeMeta
.aggregate({ _sum: { click: true } })
.then((result) => result._sum.click || 0);
} catch (error) {
return -1;
}
}
export async function getScrapeStatsByType(
type: string,
dateRange: string = "",
) {
const startDate = getStartDate(dateRange);
return await prisma.scrapeMeta.findMany({
where: {
type,
...(startDate && {
createdAt: { gte: startDate },
}),
},
});
}
export async function getScrapeStatsByTypeAndUserId(type: string, id: string) {
return await prisma.scrapeMeta.findMany({
where: {
type,
userId: id,
},
});
}
export async function getScrapeStatsByUserId({
userId,
page = 1,
limit = 20,
type,
ip,
}: {
userId: string;
page?: number;
limit?: number;
type?: string;
ip?: string;
}) {
const skip = (page - 1) * limit;
const where = {
userId,
...(type && { type }),
...(ip && { ip }),
};
const [total, logs] = await Promise.all([
prisma.scrapeMeta.count({ where }),
prisma.scrapeMeta.findMany({
where,
orderBy: {
createdAt: "desc",
},
skip,
take: limit,
select: {
id: true,
type: true,
ip: true,
link: true,
createdAt: true,
user: {
select: {
name: true,
email: true,
},
},
},
}),
]);
return {
logs,
total,
hasMore: total > skip + logs.length,
};
}
export async function getScrapeStatsByUserId1(userId: string) {
return await prisma.scrapeMeta.findMany({
where: {
userId,
},
orderBy: {
updatedAt: "asc",
},
});
}
export async function getScrapeStats({
page = 1,
limit = 20,
type,
ip,
name,
email,
}: {
page?: number;
limit?: number;
type?: string;
ip?: string;
name?: string;
email?: string;
}) {
const skip = (page - 1) * limit;
const where = {
...(type && { type }),
...(ip && { ip }),
// ...(name && { name }),
// ...(email && { email }),
user: {
...(name && { name }),
...(email && { email }),
},
};
const [total, logs] = await Promise.all([
prisma.scrapeMeta.count({ where }),
prisma.scrapeMeta.findMany({
where,
orderBy: {
createdAt: "desc",
},
skip,
take: limit,
select: {
id: true,
type: true,
ip: true,
link: true,
createdAt: true,
user: {
select: {
name: true,
email: true,
},
},
},
}),
]);
return {
logs,
total,
hasMore: total > skip + logs.length,
};
}