-
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 (
-