src/app/api/admin/medias/route.ts
Annotation non disponible
Lance npm run annotate (nécessite ANTHROPIC_API_KEY dans .env.local) pour générer une annotation française par Claude Haiku 4.5.
Concepts détectés — comprends la théorie
ORM Prisma
4 occurrencesCe fichier accède à la base de données via Prisma. Prisma est l'ORM utilisé côté backend pour les requêtes typées sur PostgreSQL.
Voir l'article général
Route API Next.js
4 occurrencesCe fichier est une route API Next.js (App Router). Voir le contrat API complet pour les conventions de réponse et d'auth.
Voir l'article général
2 exports
GETDELETE
Code source· typescript
import { NextRequest, NextResponse } from "next/server";
import { prisma } from "@/lib/prisma/client";
import { getSession } from "@/lib/auth/session";
import { deleteVideo } from "@/lib/cloudflare-stream";
export async function GET(req: NextRequest) {
const session = await getSession();
if (!session || session.role !== "TENANT_ADMIN" || !session.tenantId) {
return NextResponse.json({ error: "Non autorisé" }, { status: 401 });
}
const { searchParams } = new URL(req.url);
const albumId = searchParams.get("albumId");
const type = searchParams.get("type");
const medias = await prisma.media.findMany({
where: {
tenantId: session.tenantId,
...(albumId === "sans" ? { albumId: null } : albumId ? { albumId } : {}),
...(type ? { type: type as "IMAGE" | "VIDEO" } : {}),
},
orderBy: { createdAt: "desc" },
take: 100,
});
return NextResponse.json({ medias });
}
export async function DELETE(req: NextRequest) {
const session = await getSession();
if (!session || session.role !== "TENANT_ADMIN" || !session.tenantId) {
return NextResponse.json({ error: "Non autorisé" }, { status: 401 });
}
const { id } = await req.json();
const media = await prisma.media.findFirst({
where: { id, tenantId: session.tenantId },
select: { id: true, cloudflareStreamId: true },
});
if (!media) {
return NextResponse.json({ success: true });
}
await prisma.media.delete({ where: { id: media.id } });
if (media.cloudflareStreamId) {
void deleteVideo(media.cloudflareStreamId);
}
return NextResponse.json({ success: true });
}
import { NextRequest, NextResponse } from "next/server";
import { prisma } from "@/lib/prisma/client";
import { getSession } from "@/lib/auth/session";
import { deleteVideo } from "@/lib/cloudflare-stream";
export async function GET(req: NextRequest) {
const session = await getSession();
if (!session || session.role !== "TENANT_ADMIN" || !session.tenantId) {
return NextResponse.json({ error: "Non autorisé" }, { status: 401 });
}
const { searchParams } = new URL(req.url);
const albumId = searchParams.get("albumId");
const type = searchParams.get("type");
const medias = await prisma.media.findMany({
where: {
tenantId: session.tenantId,
...(albumId === "sans" ? { albumId: null } : albumId ? { albumId } : {}),
...(type ? { type: type as "IMAGE" | "VIDEO" } : {}),
},
orderBy: { createdAt: "desc" },
take: 100,
});
return NextResponse.json({ medias });
}
export async function DELETE(req: NextRequest) {
const session = await getSession();
if (!session || session.role !== "TENANT_ADMIN" || !session.tenantId) {
return NextResponse.json({ error: "Non autorisé" }, { status: 401 });
}
const { id } = await req.json();
const media = await prisma.media.findFirst({
where: { id, tenantId: session.tenantId },
select: { id: true, cloudflareStreamId: true },
});
if (!media) {
return NextResponse.json({ success: true });
}
await prisma.media.delete({ where: { id: media.id } });
if (media.cloudflareStreamId) {
void deleteVideo(media.cloudflareStreamId);
}
return NextResponse.json({ success: true });
}