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 }; } }