# PDPA Consent Logging Template Template สำหรับเพิ่ม PDPA consent logging ใน Astro + Tina (Astro DB) ## Files ``` consent/ ├── ConsentBanner.astro # Consent banner component ├── api/ │ └── consent.ts # API endpoints (GET, POST, DELETE) ├── db/ │ └── config.ts # Astro DB schema (defineTable) ├── stores/ │ └── consent.ts # Nano Stores for client state └── README.md # This file ``` ## วิธีใช้ (Astro) ### 1. เพิ่ม Astro DB Schema Copy `db/config.ts` ไปที่ `src/db/config.ts`: ```ts // src/db/config.ts import { defineTable, column } from 'astro:db'; export const ConsentLog = defineTable({ columns: { id: column.number({ primaryKey: true }), action: column.text(), purpose: column.text(), analytics: column.boolean({ default: false }), marketing: column.boolean({ default: false }), functional: column.boolean({ default: false }), userAgent: column.text({ optional: true }), ip: column.text({ optional: true }), timestamp: column.date(), sessionId: column.text({ optional: true }), }, }); ``` ### 2. สร้าง API Endpoint Copy `api/consent.ts` ไปที่ `src/pages/api/consent.ts` ### 3. เพิ่ม ConsentBanner Component Copy `ConsentBanner.astro` ไปที่ `src/components/consent/ConsentBanner.astro` ### 4. เพิ่มใน Layout เพิ่ม `` ใน `src/layouts/Layout.astro`: ```astro --- import ConsentBanner from '../components/consent/ConsentBanner.astro'; --- ``` ## API ### POST /api/consent บันทึก consent action **Request:** ```json { "action": "accept", "purpose": "all", "analytics": true, "marketing": false, "functional": true } ``` **Response:** ```json { "success": true, "doc": { "id": 1, "action": "accept", "purpose": "all", "analytics": true, "marketing": false, "functional": true, "userAgent": "Mozilla/5.0...", "ip": "127.0.0.1", "timestamp": "2026-04-10T00:00:00.000Z" } } ``` ### GET /api/consent ดึง consent logs ```bash curl "http://localhost:4321/api/consent" ``` ### DELETE /api/consent Right to be forgotten (ลบข้อมูลตาม พ.ร.บ.) ```bash curl -X DELETE "http://localhost:4321/api/consent?sessionId=xxx" ``` ## Nano Stores Usage ```ts import { consentStore, hasAnalyticsConsent, hasMarketingConsent } from './stores/consent'; // Subscribe to changes consentStore.subscribe((state) => { console.log('Consent changed:', state); }); // Check consent if (hasAnalyticsConsent()) { // Load analytics } ``` ## UX - **ยอมรับทั้งหมด** - เปิดทุกคุกกี้ - **ปฏิเสธทั้งหมด** - ปิดทุกคุกกี้ (ยกเว้น functional) - **ตั้งค่าคุกกี้** - แผงปรับแต่งเอง ## ⚠️ Pitfalls สำคัญ 1. **Astro DB ต้องรันบน server-side** - ใช้ `APIRoute` import 2. **Nano Stores รันบน client-side** - ใช้ `