+
Politique de Confidentialité
+
+
+ 1. Collecte des données
+ Nous collectons les données suivantes :
+
+ - Données d'authentification (via Keycloak)
+ - Emails et calendriers (via Microsoft Graph)
+ - Messages (via RocketChat)
+ - Tâches (via Leantime)
+
+
+
+
+ 2. Base légale
+ Le traitement est basé sur :
+
+ - Votre consentement
+ - L'exécution d'un contrat
+ - L'intérêt légitime
+
+
+
+
+ 3. Vos droits
+ Conformément au RGPD, vous disposez des droits suivants :
+
+ - Droit d'accès (Article 15)
+ - Droit de rectification (Article 16)
+ - Droit à l'effacement (Article 17)
+ - Droit à la portabilité (Article 20)
+ - Droit d'opposition (Article 21)
+
+
+
+
+ 4. Contact
+ Pour exercer vos droits, contactez : privacy@example.com
+
+
+ );
+}
+```
+
+#### 🔴 CRITIQUE - Implémenter les droits utilisateurs
+
+```typescript
+// app/api/gdpr/access/route.ts
+import { NextResponse } from 'next/server';
+import { getServerSession } from 'next-auth';
+import { authOptions } from '@/app/api/auth/options';
+import { prisma } from '@/lib/prisma';
+
+export async function GET() {
+ const session = await getServerSession(authOptions);
+ if (!session?.user?.id) {
+ return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
+ }
+
+ // Collecter toutes les données de l'utilisateur
+ const userData = {
+ profile: await prisma.user.findUnique({
+ where: { id: session.user.id },
+ }),
+ emails: await prisma.email.findMany({
+ where: { userId: session.user.id },
+ }),
+ calendars: await prisma.calendar.findMany({
+ where: { userId: session.user.id },
+ }),
+ // ... autres données
+ };
+
+ return NextResponse.json(userData);
+}
+```
+
+```typescript
+// app/api/gdpr/delete/route.ts
+export async function DELETE() {
+ const session = await getServerSession(authOptions);
+ if (!session?.user?.id) {
+ return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
+ }
+
+ // Supprimer toutes les données de l'utilisateur
+ await prisma.user.delete({
+ where: { id: session.user.id },
+ });
+
+ // Nettoyer localStorage côté client
+ // (nécessite une action côté client)
+
+ return NextResponse.json({ success: true });
+}
+```
+
+#### 🔴 CRITIQUE - Ajouter un banner de consentement cookies
+
+```typescript
+// components/cookie-consent.tsx
+'use client';
+
+import { useState, useEffect } from 'react';
+import { Button } from '@/components/ui/button';
+
+export function CookieConsent() {
+ const [showBanner, setShowBanner] = useState(false);
+
+ useEffect(() => {
+ const consent = localStorage.getItem('cookie-consent');
+ if (!consent) {
+ setShowBanner(true);
+ }
+ }, []);
+
+ const acceptCookies = () => {
+ localStorage.setItem('cookie-consent', 'accepted');
+ localStorage.setItem('cookie-consent-date', new Date().toISOString());
+ setShowBanner(false);
+ };
+
+ const rejectCookies = () => {
+ localStorage.setItem('cookie-consent', 'rejected');
+ // Supprimer les cookies non essentiels
+ // ...
+ setShowBanner(false);
+ };
+
+ if (!showBanner) return null;
+
+ return (
+