Initial commit: YouTube Studio Flow (backend, frontend, infrastructure, docs)
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { PrismaService } from '../../shared/prisma/prisma.service';
|
||||
|
||||
@Injectable()
|
||||
export class CalendarService {
|
||||
constructor(private readonly prisma: PrismaService) {}
|
||||
|
||||
async getEntries(view: string, date: string) {
|
||||
const { start, end } = this.parseRange(view, date);
|
||||
|
||||
const videos = await this.prisma.video.findMany({
|
||||
where: {
|
||||
OR: [
|
||||
{ scheduledAt: { gte: start, lte: end } },
|
||||
{ publishedAt: { gte: start, lte: end } },
|
||||
],
|
||||
},
|
||||
include: {
|
||||
template: { select: { id: true, name: true } },
|
||||
},
|
||||
orderBy: { scheduledAt: 'asc' },
|
||||
});
|
||||
|
||||
const allCollabIds = [...new Set(videos.flatMap((v) => (v.collaboratorIds as string[]) ?? []))];
|
||||
const collabs = allCollabIds.length > 0
|
||||
? await this.prisma.collaborator.findMany({
|
||||
where: { id: { in: allCollabIds } },
|
||||
select: { id: true, name: true, youtubeLink: true },
|
||||
})
|
||||
: [];
|
||||
const collabMap = new Map(collabs.map((c) => [c.id, c]));
|
||||
|
||||
return videos.map((v) => ({
|
||||
videoId: v.id,
|
||||
title: v.title,
|
||||
date: v.scheduledAt ?? v.publishedAt,
|
||||
templateName: v.template?.name,
|
||||
collaborators: ((v.collaboratorIds as string[]) ?? []).map((id) => collabMap.get(id)).filter(Boolean),
|
||||
lintStatus: v.lintStatus,
|
||||
channelId: v.channelId,
|
||||
privacyStatus: v.privacyStatus,
|
||||
}));
|
||||
}
|
||||
|
||||
private parseRange(view: string, date: string): { start: Date; end: Date } {
|
||||
const [year, month] = date.split('-').map(Number);
|
||||
|
||||
if (view === 'month') {
|
||||
const start = new Date(year, month - 1, 1);
|
||||
const end = new Date(year, month, 0, 23, 59, 59);
|
||||
return { start, end };
|
||||
}
|
||||
|
||||
if (view === 'week') {
|
||||
const base = new Date(year, month - 1, 1);
|
||||
const start = new Date(base);
|
||||
start.setDate(base.getDate() - base.getDay());
|
||||
const end = new Date(start);
|
||||
end.setDate(start.getDate() + 6);
|
||||
end.setHours(23, 59, 59);
|
||||
return { start, end };
|
||||
}
|
||||
|
||||
// agenda: next 30 days from date
|
||||
const start = new Date(date);
|
||||
const end = new Date(start);
|
||||
end.setDate(start.getDate() + 30);
|
||||
return { start, end };
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user