src/app/api/mobile/session/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
3 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
3 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
JWT / Auth backend
1 occurrenceCe fichier touche au système d'authentification (JWT, session, getSessionFromRequest). Voir le contrat API pour la logique complète.
Voir l'article général
1 export
GET
Code source· typescript
import { NextRequest, NextResponse } from "next/server";
import { getSessionFromRequest } from "@/lib/auth/session";
import { prisma } from "@/lib/prisma/client";
export async function GET(req: NextRequest) {
try {
const session = await getSessionFromRequest(req);
if (!session || session.role !== "CLIENT") {
return NextResponse.json({ connected: false }, { status: 401 });
}
const client = await prisma.clientAccount.findUnique({
where: { id: session.userId },
select: {
id: true,
email: true,
phone: true,
nom: true,
prenom: true,
photoUrl: true,
motDePasseHash: true,
lastSeenAt: true,
},
});
if (!client) return NextResponse.json({ connected: false }, { status: 401 });
let tenant = null;
if (session.tenantId) {
tenant = await prisma.tenant.findUnique({
where: { subdomain: session.tenantId },
select: {
id: true,
subdomain: true,
nom: true,
logoUrl: true,
whatsapp: true,
actif: true,
},
});
}
return NextResponse.json({
connected: true,
user: {
id: client.id,
email: client.email ?? null,
phone: client.phone ?? null,
nom: client.nom ?? null,
prenom: client.prenom ?? null,
photoUrl: client.photoUrl ?? null,
hasPassword: !!client.motDePasseHash,
role: "CLIENT",
tenantId: session.tenantId ?? null,
},
tenant,
});
} catch (e) {
console.error("mobile/session error:", e);
return NextResponse.json({ connected: false }, { status: 500 });
}
}
import { NextRequest, NextResponse } from "next/server";
import { getSessionFromRequest } from "@/lib/auth/session";
import { prisma } from "@/lib/prisma/client";
export async function GET(req: NextRequest) {
try {
const session = await getSessionFromRequest(req);
if (!session || session.role !== "CLIENT") {
return NextResponse.json({ connected: false }, { status: 401 });
}
const client = await prisma.clientAccount.findUnique({
where: { id: session.userId },
select: {
id: true,
email: true,
phone: true,
nom: true,
prenom: true,
photoUrl: true,
motDePasseHash: true,
lastSeenAt: true,
},
});
if (!client) return NextResponse.json({ connected: false }, { status: 401 });
let tenant = null;
if (session.tenantId) {
tenant = await prisma.tenant.findUnique({
where: { subdomain: session.tenantId },
select: {
id: true,
subdomain: true,
nom: true,
logoUrl: true,
whatsapp: true,
actif: true,
},
});
}
return NextResponse.json({
connected: true,
user: {
id: client.id,
email: client.email ?? null,
phone: client.phone ?? null,
nom: client.nom ?? null,
prenom: client.prenom ?? null,
photoUrl: client.photoUrl ?? null,
hasPassword: !!client.motDePasseHash,
role: "CLIENT",
tenantId: session.tenantId ?? null,
},
tenant,
});
} catch (e) {
console.error("mobile/session error:", e);
return NextResponse.json({ connected: false }, { status: 500 });
}
}