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