edtech / apps /api /src /services /track-service.ts
CognxSafeTrack
feat: backlog P0→P3 — toast system, payments, tenant isolation, feedback handler, i18n parity
6dd9bad
import { prisma } from './prisma';
export class TrackService {
static async listTracks(organizationId: string) {
return prisma.track.findMany({
where: { organizationId },
include: { _count: { select: { days: true, enrollments: true } } },
orderBy: { createdAt: 'desc' }
});
}
static async getTrack(organizationId: string, trackId: string) {
return prisma.track.findFirst({
where: { id: trackId, organizationId },
include: { days: { orderBy: { dayNumber: 'asc' } } }
});
}
static async createTrack(organizationId: string, data: any) {
return prisma.track.create({
data: { ...data, organizationId }
});
}
static async updateTrack(organizationId: string, trackId: string, data: any) {
return prisma.track.update({
where: { id: trackId, organizationId },
data
});
}
static async deleteTrack(organizationId: string, trackId: string) {
const track = await prisma.track.findFirst({ where: { id: trackId, organizationId } });
if (!track) return false;
await prisma.trackDay.deleteMany({ where: { trackId, organizationId } });
await prisma.track.delete({ where: { id: trackId, organizationId } });
return true;
}
// Days management
static async listDays(organizationId: string, trackId: string) {
return prisma.trackDay.findMany({
where: { trackId, organizationId },
orderBy: { dayNumber: 'asc' }
});
}
static async createDay(organizationId: string, trackId: string, data: any) {
return prisma.trackDay.create({
data: {
...data,
trackId,
organizationId,
audioUrl: data.audioUrl || null,
buttonsJson: data.buttonsJson ? data.buttonsJson : undefined
}
});
}
static async updateDay(organizationId: string, dayId: string, data: any) {
return prisma.trackDay.update({
where: { id: dayId, organizationId },
data: { ...data, audioUrl: data.audioUrl === '' ? null : data.audioUrl }
});
}
static async deleteDay(organizationId: string, dayId: string) {
await prisma.trackDay.delete({ where: { id: dayId, organizationId } });
}
}