From a0ccb8ca641d9d6238b565b38e6ef893feacdb78 Mon Sep 17 00:00:00 2001 From: Kilian Date: Thu, 30 Apr 2026 10:09:44 +0100 Subject: [PATCH] Initial commit: monorepo Naturcalabacera reservas (apps/api + apps/web + packages/shared) --- .../supabase-postgres-best-practices/SKILL.md | 64 + .../references/_contributing.md | 170 + .../references/_sections.md | 39 + .../references/_template.md | 34 + .../references/advanced-full-text-search.md | 55 + .../references/advanced-jsonb-indexing.md | 49 + .../references/conn-idle-timeout.md | 46 + .../references/conn-limits.md | 44 + .../references/conn-pooling.md | 41 + .../references/conn-prepared-statements.md | 46 + .../references/data-batch-inserts.md | 54 + .../references/data-n-plus-one.md | 53 + .../references/data-pagination.md | 50 + .../references/data-upsert.md | 50 + .../references/lock-advisory.md | 56 + .../references/lock-deadlock-prevention.md | 68 + .../references/lock-short-transactions.md | 50 + .../references/lock-skip-locked.md | 54 + .../references/monitor-explain-analyze.md | 45 + .../references/monitor-pg-stat-statements.md | 55 + .../references/monitor-vacuum-analyze.md | 55 + .../references/query-composite-indexes.md | 44 + .../references/query-covering-indexes.md | 40 + .../references/query-index-types.md | 48 + .../references/query-missing-indexes.md | 43 + .../references/query-partial-indexes.md | 45 + .../references/schema-constraints.md | 80 + .../references/schema-data-types.md | 46 + .../references/schema-foreign-key-indexes.md | 59 + .../schema-lowercase-identifiers.md | 55 + .../references/schema-partitioning.md | 55 + .../references/schema-primary-keys.md | 61 + .../references/security-privileges.md | 54 + .../references/security-rls-basics.md | 50 + .../references/security-rls-performance.md | 57 + .../skills/supabase-postgres-best-practices | 1 + .../skills/supabase-postgres-best-practices | 1 + .../skills/supabase-postgres-best-practices | 1 + .../skills/supabase-postgres-best-practices | 1 + .../skills/supabase-postgres-best-practices | 1 + .env.example | 3 + .../skills/supabase-postgres-best-practices | 1 + .gitignore | 29 + .../skills/supabase-postgres-best-practices | 1 + .../skills/supabase-postgres-best-practices | 1 + .kiro/skills/supabase-postgres-best-practices | 1 + .../skills/supabase-postgres-best-practices | 1 + .mux/skills/supabase-postgres-best-practices | 1 + .../skills/supabase-postgres-best-practices | 1 + .../skills/supabase-postgres-best-practices | 1 + .pi/skills/supabase-postgres-best-practices | 1 + .../skills/supabase-postgres-best-practices | 1 + .qwen/skills/supabase-postgres-best-practices | 1 + .roo/skills/supabase-postgres-best-practices | 1 + .trae/skills/supabase-postgres-best-practices | 1 + .../skills/supabase-postgres-best-practices | 1 + .../skills/supabase-postgres-best-practices | 1 + Diseño de calendario.png | Bin 0 -> 431590 bytes Ejemplo calendario y vista.png | Bin 0 -> 39957 bytes README.md | 89 + apps/api/.env.example | 30 + apps/api/package.json | 25 + apps/api/src/config/env.ts | 40 + apps/api/src/events/handler.ts | 252 + apps/api/src/events/types.ts | 67 + apps/api/src/index.ts | 38 + apps/api/src/jobs/runner.ts | 168 + apps/api/src/lib/supabase.ts | 19 + apps/api/src/routes/health.ts | 9 + apps/api/src/routes/notifications.ts | 67 + apps/api/src/routes/users.ts | 154 + apps/api/src/services/email.ts | 50 + apps/api/src/templates/invoice-10d.html | 64 + apps/api/src/templates/natur-crud.html | 120 + apps/api/src/templates/pool-heating-48h.html | 61 + apps/api/src/templates/reminder-24h.html | 60 + apps/api/src/templates/teneriffa-crud.html | 112 + apps/api/tsconfig.json | 19 + apps/web/.env.example | 15 + apps/web/eslint.config.js | 23 + apps/web/index.html | 13 + apps/web/package.json | 42 + apps/web/postcss.config.js | 6 + apps/web/public/vite.svg | 1 + apps/web/src/App.css | 42 + apps/web/src/App.tsx | 275 ++ apps/web/src/assets/react.svg | 1 + apps/web/src/components/CalendarGrid.tsx | 508 +++ .../src/components/CalendarGrid.tsx.backup | 222 + apps/web/src/components/ChatbotContainer.tsx | 591 +++ apps/web/src/components/ContractUpload.tsx | 234 + .../src/components/CustomMobileCalendar.tsx | 155 + apps/web/src/components/DocumentUpload.tsx | 390 ++ apps/web/src/components/LoginPage.tsx | 108 + apps/web/src/components/MobileNavigation.tsx | 89 + apps/web/src/components/PricingSection.tsx | 87 + apps/web/src/components/PropertySelector.tsx | 43 + apps/web/src/components/ReservationModal.tsx | 628 +++ apps/web/src/components/SearchBar.tsx | 30 + apps/web/src/components/ServiceIcons.tsx | 46 + apps/web/src/components/SettingsPage.tsx | 156 + apps/web/src/components/Sidebar.tsx | 104 + apps/web/src/components/UserManagement.tsx | 337 ++ apps/web/src/components/YearlyCalendar.tsx | 283 ++ apps/web/src/contexts/PropertyContext.tsx | 47 + apps/web/src/contexts/UserRoleContext.tsx | 28 + apps/web/src/hooks/useAuth.ts | 38 + apps/web/src/hooks/useFileUpload.ts | 137 + apps/web/src/hooks/usePropertyTheme.ts | 119 + apps/web/src/hooks/useReservations.ts | 103 + apps/web/src/hooks/useUserRole.ts | 38 + apps/web/src/index.css | 39 + apps/web/src/lib/supabase.ts | 18 + apps/web/src/main.tsx | 14 + apps/web/src/types/index.ts | 13 + apps/web/tailwind.config.js | 29 + apps/web/tsconfig.app.json | 32 + apps/web/tsconfig.json | 7 + apps/web/tsconfig.node.json | 26 + apps/web/vite.config.ts | 17 + architecture/db_schema.sql | 50 + architecture/frontend_components.md | 48 + architecture/logic_hooks.md | 34 + .../migrations/001_add_observations.sql | 2 + .../migrations/002_add_contract_storage.sql | 62 + .../003_contracts_bucket_and_table.sql | 54 + directivas/directiva_ejemplo.md | 23 + directivas/start_dev_server.md | 23 + eslint.config.js | 23 + findings.md | 15 + gemini.md | 55 + index.html | 13 + package.json | 17 + packages/shared/package.json | 16 + packages/shared/src/constants/origins.ts | 44 + packages/shared/src/constants/properties.ts | 78 + packages/shared/src/index.ts | 12 + packages/shared/src/types/notification.ts | 23 + packages/shared/src/types/pricing.ts | 30 + packages/shared/src/types/reservation.ts | 64 + packages/shared/src/types/user.ts | 13 + packages/shared/src/utils/pricing.test.ts | 114 + packages/shared/src/utils/pricing.ts | 68 + packages/shared/tsconfig.json | 12 + packages/shared/vitest.config.ts | 9 + pnpm-lock.yaml | 4033 +++++++++++++++++ pnpm-workspace.yaml | 3 + progress.md | 4 + public/vite.svg | 1 + scripts/start_dev_server.py | 40 + skills-lock.json | 10 + skills/supabase-postgres-best-practices | 1 + src/App.css | 42 + src/App.tsx | 191 + src/assets/react.svg | 1 + src/components/CalendarGrid.tsx | 252 + src/components/CalendarGrid.tsx.backup | 222 + src/components/CustomMobileCalendar.tsx | 155 + src/components/LoginPage.tsx | 108 + src/components/MobileNavigation.tsx | 52 + src/components/ReservationModal.tsx | 743 +++ src/components/SearchBar.tsx | 30 + src/components/SettingsPage.tsx | 156 + src/components/Sidebar.tsx | 80 + src/components/YearlyCalendar.tsx | 114 + src/hooks/useAuth.ts | 38 + src/hooks/useReservations.ts | 88 + src/index.css | 39 + src/lib/supabase.ts | 20 + src/main.tsx | 14 + src/types/index.ts | 38 + supabase/migrations/001_add_observations.sql | 2 + supabase/migrations/002_add_property.sql | 15 + .../migrations/003_add_pricing_snapshot.sql | 23 + .../migrations/004_add_contracts_table.sql | 29 + supabase/migrations/005_add_user_roles.sql | 43 + supabase/migrations/006_add_audit_fields.sql | 24 + .../007_add_notification_events.sql | 49 + .../migrations/008_add_availability_view.sql | 25 + .../migrations/009_update_rls_policies.sql | 82 + supabase/migrations/010_add_document_type.sql | 13 + tailwind.config.js | 29 + task_plan.md | 42 + tools/test_supabase_connection.py | 52 + tsconfig.app.json | 28 + tsconfig.json | 7 + tsconfig.node.json | 26 + vite.config.ts | 7 + 188 files changed, 16418 insertions(+) create mode 100644 .agents/skills/supabase-postgres-best-practices/SKILL.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/_contributing.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/_sections.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/_template.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/advanced-full-text-search.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/conn-idle-timeout.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/conn-limits.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/conn-pooling.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/conn-prepared-statements.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/data-batch-inserts.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/data-n-plus-one.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/data-pagination.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/data-upsert.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/lock-advisory.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/lock-short-transactions.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/lock-skip-locked.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/query-composite-indexes.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/query-covering-indexes.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/query-index-types.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/query-missing-indexes.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/query-partial-indexes.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/schema-constraints.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/schema-data-types.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/schema-partitioning.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/schema-primary-keys.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/security-privileges.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/security-rls-basics.md create mode 100644 .agents/skills/supabase-postgres-best-practices/references/security-rls-performance.md create mode 120000 .claude/skills/supabase-postgres-best-practices create mode 120000 .codebuddy/skills/supabase-postgres-best-practices create mode 120000 .commandcode/skills/supabase-postgres-best-practices create mode 120000 .continue/skills/supabase-postgres-best-practices create mode 120000 .crush/skills/supabase-postgres-best-practices create mode 100644 .env.example create mode 120000 .factory/skills/supabase-postgres-best-practices create mode 100644 .gitignore create mode 120000 .goose/skills/supabase-postgres-best-practices create mode 120000 .kilocode/skills/supabase-postgres-best-practices create mode 120000 .kiro/skills/supabase-postgres-best-practices create mode 120000 .mcpjam/skills/supabase-postgres-best-practices create mode 120000 .mux/skills/supabase-postgres-best-practices create mode 120000 .neovate/skills/supabase-postgres-best-practices create mode 120000 .openhands/skills/supabase-postgres-best-practices create mode 120000 .pi/skills/supabase-postgres-best-practices create mode 120000 .qoder/skills/supabase-postgres-best-practices create mode 120000 .qwen/skills/supabase-postgres-best-practices create mode 120000 .roo/skills/supabase-postgres-best-practices create mode 120000 .trae/skills/supabase-postgres-best-practices create mode 120000 .windsurf/skills/supabase-postgres-best-practices create mode 120000 .zencoder/skills/supabase-postgres-best-practices create mode 100644 Diseño de calendario.png create mode 100644 Ejemplo calendario y vista.png create mode 100644 README.md create mode 100644 apps/api/.env.example create mode 100644 apps/api/package.json create mode 100644 apps/api/src/config/env.ts create mode 100644 apps/api/src/events/handler.ts create mode 100644 apps/api/src/events/types.ts create mode 100644 apps/api/src/index.ts create mode 100644 apps/api/src/jobs/runner.ts create mode 100644 apps/api/src/lib/supabase.ts create mode 100644 apps/api/src/routes/health.ts create mode 100644 apps/api/src/routes/notifications.ts create mode 100644 apps/api/src/routes/users.ts create mode 100644 apps/api/src/services/email.ts create mode 100644 apps/api/src/templates/invoice-10d.html create mode 100644 apps/api/src/templates/natur-crud.html create mode 100644 apps/api/src/templates/pool-heating-48h.html create mode 100644 apps/api/src/templates/reminder-24h.html create mode 100644 apps/api/src/templates/teneriffa-crud.html create mode 100644 apps/api/tsconfig.json create mode 100644 apps/web/.env.example create mode 100644 apps/web/eslint.config.js create mode 100644 apps/web/index.html create mode 100644 apps/web/package.json create mode 100644 apps/web/postcss.config.js create mode 100644 apps/web/public/vite.svg create mode 100644 apps/web/src/App.css create mode 100644 apps/web/src/App.tsx create mode 100644 apps/web/src/assets/react.svg create mode 100644 apps/web/src/components/CalendarGrid.tsx create mode 100644 apps/web/src/components/CalendarGrid.tsx.backup create mode 100644 apps/web/src/components/ChatbotContainer.tsx create mode 100644 apps/web/src/components/ContractUpload.tsx create mode 100644 apps/web/src/components/CustomMobileCalendar.tsx create mode 100644 apps/web/src/components/DocumentUpload.tsx create mode 100644 apps/web/src/components/LoginPage.tsx create mode 100644 apps/web/src/components/MobileNavigation.tsx create mode 100644 apps/web/src/components/PricingSection.tsx create mode 100644 apps/web/src/components/PropertySelector.tsx create mode 100644 apps/web/src/components/ReservationModal.tsx create mode 100644 apps/web/src/components/SearchBar.tsx create mode 100644 apps/web/src/components/ServiceIcons.tsx create mode 100644 apps/web/src/components/SettingsPage.tsx create mode 100644 apps/web/src/components/Sidebar.tsx create mode 100644 apps/web/src/components/UserManagement.tsx create mode 100644 apps/web/src/components/YearlyCalendar.tsx create mode 100644 apps/web/src/contexts/PropertyContext.tsx create mode 100644 apps/web/src/contexts/UserRoleContext.tsx create mode 100644 apps/web/src/hooks/useAuth.ts create mode 100644 apps/web/src/hooks/useFileUpload.ts create mode 100644 apps/web/src/hooks/usePropertyTheme.ts create mode 100644 apps/web/src/hooks/useReservations.ts create mode 100644 apps/web/src/hooks/useUserRole.ts create mode 100644 apps/web/src/index.css create mode 100644 apps/web/src/lib/supabase.ts create mode 100644 apps/web/src/main.tsx create mode 100644 apps/web/src/types/index.ts create mode 100644 apps/web/tailwind.config.js create mode 100644 apps/web/tsconfig.app.json create mode 100644 apps/web/tsconfig.json create mode 100644 apps/web/tsconfig.node.json create mode 100644 apps/web/vite.config.ts create mode 100644 architecture/db_schema.sql create mode 100644 architecture/frontend_components.md create mode 100644 architecture/logic_hooks.md create mode 100644 architecture/migrations/001_add_observations.sql create mode 100644 architecture/migrations/002_add_contract_storage.sql create mode 100644 architecture/migrations/003_contracts_bucket_and_table.sql create mode 100644 directivas/directiva_ejemplo.md create mode 100644 directivas/start_dev_server.md create mode 100644 eslint.config.js create mode 100644 findings.md create mode 100644 gemini.md create mode 100644 index.html create mode 100644 package.json create mode 100644 packages/shared/package.json create mode 100644 packages/shared/src/constants/origins.ts create mode 100644 packages/shared/src/constants/properties.ts create mode 100644 packages/shared/src/index.ts create mode 100644 packages/shared/src/types/notification.ts create mode 100644 packages/shared/src/types/pricing.ts create mode 100644 packages/shared/src/types/reservation.ts create mode 100644 packages/shared/src/types/user.ts create mode 100644 packages/shared/src/utils/pricing.test.ts create mode 100644 packages/shared/src/utils/pricing.ts create mode 100644 packages/shared/tsconfig.json create mode 100644 packages/shared/vitest.config.ts create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml create mode 100644 progress.md create mode 100644 public/vite.svg create mode 100644 scripts/start_dev_server.py create mode 100644 skills-lock.json create mode 120000 skills/supabase-postgres-best-practices create mode 100644 src/App.css create mode 100644 src/App.tsx create mode 100644 src/assets/react.svg create mode 100644 src/components/CalendarGrid.tsx create mode 100644 src/components/CalendarGrid.tsx.backup create mode 100644 src/components/CustomMobileCalendar.tsx create mode 100644 src/components/LoginPage.tsx create mode 100644 src/components/MobileNavigation.tsx create mode 100644 src/components/ReservationModal.tsx create mode 100644 src/components/SearchBar.tsx create mode 100644 src/components/SettingsPage.tsx create mode 100644 src/components/Sidebar.tsx create mode 100644 src/components/YearlyCalendar.tsx create mode 100644 src/hooks/useAuth.ts create mode 100644 src/hooks/useReservations.ts create mode 100644 src/index.css create mode 100644 src/lib/supabase.ts create mode 100644 src/main.tsx create mode 100644 src/types/index.ts create mode 100644 supabase/migrations/001_add_observations.sql create mode 100644 supabase/migrations/002_add_property.sql create mode 100644 supabase/migrations/003_add_pricing_snapshot.sql create mode 100644 supabase/migrations/004_add_contracts_table.sql create mode 100644 supabase/migrations/005_add_user_roles.sql create mode 100644 supabase/migrations/006_add_audit_fields.sql create mode 100644 supabase/migrations/007_add_notification_events.sql create mode 100644 supabase/migrations/008_add_availability_view.sql create mode 100644 supabase/migrations/009_update_rls_policies.sql create mode 100644 supabase/migrations/010_add_document_type.sql create mode 100644 tailwind.config.js create mode 100644 task_plan.md create mode 100644 tools/test_supabase_connection.py create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.agents/skills/supabase-postgres-best-practices/SKILL.md b/.agents/skills/supabase-postgres-best-practices/SKILL.md new file mode 100644 index 0000000..d9ef194 --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/SKILL.md @@ -0,0 +1,64 @@ +--- +name: supabase-postgres-best-practices +description: Postgres performance optimization and best practices from Supabase. Use this skill when writing, reviewing, or optimizing Postgres queries, schema designs, or database configurations. +license: MIT +metadata: + author: supabase + version: "1.1.1" + organization: Supabase + date: January 2026 + abstract: Comprehensive Postgres performance optimization guide for developers using Supabase and Postgres. Contains performance rules across 8 categories, prioritized by impact from critical (query performance, connection management) to incremental (advanced features). Each rule includes detailed explanations, incorrect vs. correct SQL examples, query plan analysis, and specific performance metrics to guide automated optimization and code generation. +--- + +# Supabase Postgres Best Practices + +Comprehensive performance optimization guide for Postgres, maintained by Supabase. Contains rules across 8 categories, prioritized by impact to guide automated query optimization and schema design. + +## When to Apply + +Reference these guidelines when: +- Writing SQL queries or designing schemas +- Implementing indexes or query optimization +- Reviewing database performance issues +- Configuring connection pooling or scaling +- Optimizing for Postgres-specific features +- Working with Row-Level Security (RLS) + +## Rule Categories by Priority + +| Priority | Category | Impact | Prefix | +|----------|----------|--------|--------| +| 1 | Query Performance | CRITICAL | `query-` | +| 2 | Connection Management | CRITICAL | `conn-` | +| 3 | Security & RLS | CRITICAL | `security-` | +| 4 | Schema Design | HIGH | `schema-` | +| 5 | Concurrency & Locking | MEDIUM-HIGH | `lock-` | +| 6 | Data Access Patterns | MEDIUM | `data-` | +| 7 | Monitoring & Diagnostics | LOW-MEDIUM | `monitor-` | +| 8 | Advanced Features | LOW | `advanced-` | + +## How to Use + +Read individual rule files for detailed explanations and SQL examples: + +``` +references/query-missing-indexes.md +references/query-partial-indexes.md +references/_sections.md +``` + +Each rule file contains: +- Brief explanation of why it matters +- Incorrect SQL example with explanation +- Correct SQL example with explanation +- Optional EXPLAIN output or metrics +- Additional context and references +- Supabase-specific notes (when applicable) + +## References + +- https://www.postgresql.org/docs/current/ +- https://supabase.com/docs +- https://wiki.postgresql.org/wiki/Performance_Optimization +- https://supabase.com/docs/guides/database/overview +- https://supabase.com/docs/guides/auth/row-level-security diff --git a/.agents/skills/supabase-postgres-best-practices/references/_contributing.md b/.agents/skills/supabase-postgres-best-practices/references/_contributing.md new file mode 100644 index 0000000..ac7da39 --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/_contributing.md @@ -0,0 +1,170 @@ +# Writing Guidelines for Postgres References + +This document provides guidelines for creating effective Postgres best +practice references that work well with AI agents and LLMs. + +## Key Principles + +### 1. Concrete Transformation Patterns + +Show exact SQL rewrites. Avoid philosophical advice. + +**Good:** "Use `WHERE id = ANY(ARRAY[...])` instead of +`WHERE id IN (SELECT ...)`" **Bad:** "Design good schemas" + +### 2. Error-First Structure + +Always show the problematic pattern first, then the solution. This trains agents +to recognize anti-patterns. + +```markdown +**Incorrect (sequential queries):** [bad example] + +**Correct (batched query):** [good example] +``` + +### 3. Quantified Impact + +Include specific metrics. Helps agents prioritize fixes. + +**Good:** "10x faster queries", "50% smaller index", "Eliminates N+1" +**Bad:** "Faster", "Better", "More efficient" + +### 4. Self-Contained Examples + +Examples should be complete and runnable (or close to it). Include `CREATE TABLE` +if context is needed. + +```sql +-- Include table definition when needed for clarity +CREATE TABLE users ( + id bigint PRIMARY KEY, + email text NOT NULL, + deleted_at timestamptz +); + +-- Now show the index +CREATE INDEX users_active_email_idx ON users(email) WHERE deleted_at IS NULL; +``` + +### 5. Semantic Naming + +Use meaningful table/column names. Names carry intent for LLMs. + +**Good:** `users`, `email`, `created_at`, `is_active` +**Bad:** `table1`, `col1`, `field`, `flag` + +--- + +## Code Example Standards + +### SQL Formatting + +```sql +-- Use lowercase keywords, clear formatting +CREATE INDEX CONCURRENTLY users_email_idx + ON users(email) + WHERE deleted_at IS NULL; + +-- Not cramped or ALL CAPS +CREATE INDEX CONCURRENTLY USERS_EMAIL_IDX ON USERS(EMAIL) WHERE DELETED_AT IS NULL; +``` + +### Comments + +- Explain _why_, not _what_ +- Highlight performance implications +- Point out common pitfalls + +### Language Tags + +- `sql` - Standard SQL queries +- `plpgsql` - Stored procedures/functions +- `typescript` - Application code (when needed) +- `python` - Application code (when needed) + +--- + +## When to Include Application Code + +**Default: SQL Only** + +Most references should focus on pure SQL patterns. This keeps examples portable. + +**Include Application Code When:** + +- Connection pooling configuration +- Transaction management in application context +- ORM anti-patterns (N+1 in Prisma/TypeORM) +- Prepared statement usage + +**Format for Mixed Examples:** + +````markdown +**Incorrect (N+1 in application):** + +```typescript +for (const user of users) { + const posts = await db.query("SELECT * FROM posts WHERE user_id = $1", [ + user.id, + ]); +} +``` +```` + +**Correct (batch query):** + +```typescript +const posts = await db.query("SELECT * FROM posts WHERE user_id = ANY($1)", [ + userIds, +]); +``` + +--- + +## Impact Level Guidelines + +| Level | Improvement | Use When | +|-------|-------------|----------| +| **CRITICAL** | 10-100x | Missing indexes, connection exhaustion, sequential scans on large tables | +| **HIGH** | 5-20x | Wrong index types, poor partitioning, missing covering indexes | +| **MEDIUM-HIGH** | 2-5x | N+1 queries, inefficient pagination, RLS optimization | +| **MEDIUM** | 1.5-3x | Redundant indexes, query plan instability | +| **LOW-MEDIUM** | 1.2-2x | VACUUM tuning, configuration tweaks | +| **LOW** | Incremental | Advanced patterns, edge cases | + +--- + +## Reference Standards + +**Primary Sources:** + +- Official Postgres documentation +- Supabase documentation +- Postgres wiki +- Established blogs (2ndQuadrant, Crunchy Data) + +**Format:** + +```markdown +Reference: +[Postgres Indexes](https://www.postgresql.org/docs/current/indexes.html) +``` + +--- + +## Review Checklist + +Before submitting a reference: + +- [ ] Title is clear and action-oriented +- [ ] Impact level matches the performance gain +- [ ] impactDescription includes quantification +- [ ] Explanation is concise (1-2 sentences) +- [ ] Has at least 1 **Incorrect** SQL example +- [ ] Has at least 1 **Correct** SQL example +- [ ] SQL uses semantic naming +- [ ] Comments explain _why_, not _what_ +- [ ] Trade-offs mentioned if applicable +- [ ] Reference links included +- [ ] `mise run test` passes diff --git a/.agents/skills/supabase-postgres-best-practices/references/_sections.md b/.agents/skills/supabase-postgres-best-practices/references/_sections.md new file mode 100644 index 0000000..8ba57c2 --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/_sections.md @@ -0,0 +1,39 @@ +# Section Definitions + +This file defines the rule categories for Postgres best practices. Rules are automatically assigned to sections based on their filename prefix. + +Take the examples below as pure demonstrative. Replace each section with the actual rule categories for Postgres best practices. + +--- + +## 1. Query Performance (query) +**Impact:** CRITICAL +**Description:** Slow queries, missing indexes, inefficient query plans. The most common source of Postgres performance issues. + +## 2. Connection Management (conn) +**Impact:** CRITICAL +**Description:** Connection pooling, limits, and serverless strategies. Critical for applications with high concurrency or serverless deployments. + +## 3. Security & RLS (security) +**Impact:** CRITICAL +**Description:** Row-Level Security policies, privilege management, and authentication patterns. + +## 4. Schema Design (schema) +**Impact:** HIGH +**Description:** Table design, index strategies, partitioning, and data type selection. Foundation for long-term performance. + +## 5. Concurrency & Locking (lock) +**Impact:** MEDIUM-HIGH +**Description:** Transaction management, isolation levels, deadlock prevention, and lock contention patterns. + +## 6. Data Access Patterns (data) +**Impact:** MEDIUM +**Description:** N+1 query elimination, batch operations, cursor-based pagination, and efficient data fetching. + +## 7. Monitoring & Diagnostics (monitor) +**Impact:** LOW-MEDIUM +**Description:** Using pg_stat_statements, EXPLAIN ANALYZE, metrics collection, and performance diagnostics. + +## 8. Advanced Features (advanced) +**Impact:** LOW +**Description:** Full-text search, JSONB optimization, PostGIS, extensions, and advanced Postgres features. diff --git a/.agents/skills/supabase-postgres-best-practices/references/_template.md b/.agents/skills/supabase-postgres-best-practices/references/_template.md new file mode 100644 index 0000000..91ace90 --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/_template.md @@ -0,0 +1,34 @@ +--- +title: Clear, Action-Oriented Title (e.g., "Use Partial Indexes for Filtered Queries") +impact: MEDIUM +impactDescription: 5-20x query speedup for filtered queries +tags: indexes, query-optimization, performance +--- + +## [Rule Title] + +[1-2 sentence explanation of the problem and why it matters. Focus on performance impact.] + +**Incorrect (describe the problem):** + +```sql +-- Comment explaining what makes this slow/problematic +CREATE INDEX users_email_idx ON users(email); + +SELECT * FROM users WHERE email = 'user@example.com' AND deleted_at IS NULL; +-- This scans deleted records unnecessarily +``` + +**Correct (describe the solution):** + +```sql +-- Comment explaining why this is better +CREATE INDEX users_active_email_idx ON users(email) WHERE deleted_at IS NULL; + +SELECT * FROM users WHERE email = 'user@example.com' AND deleted_at IS NULL; +-- Only indexes active users, 10x smaller index, faster queries +``` + +[Optional: Additional context, edge cases, or trade-offs] + +Reference: [Postgres Docs](https://www.postgresql.org/docs/current/) diff --git a/.agents/skills/supabase-postgres-best-practices/references/advanced-full-text-search.md b/.agents/skills/supabase-postgres-best-practices/references/advanced-full-text-search.md new file mode 100644 index 0000000..582cbea --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/advanced-full-text-search.md @@ -0,0 +1,55 @@ +--- +title: Use tsvector for Full-Text Search +impact: MEDIUM +impactDescription: 100x faster than LIKE, with ranking support +tags: full-text-search, tsvector, gin, search +--- + +## Use tsvector for Full-Text Search + +LIKE with wildcards can't use indexes. Full-text search with tsvector is orders of magnitude faster. + +**Incorrect (LIKE pattern matching):** + +```sql +-- Cannot use index, scans all rows +select * from articles where content like '%postgresql%'; + +-- Case-insensitive makes it worse +select * from articles where lower(content) like '%postgresql%'; +``` + +**Correct (full-text search with tsvector):** + +```sql +-- Add tsvector column and index +alter table articles add column search_vector tsvector + generated always as (to_tsvector('english', coalesce(title,'') || ' ' || coalesce(content,''))) stored; + +create index articles_search_idx on articles using gin (search_vector); + +-- Fast full-text search +select * from articles +where search_vector @@ to_tsquery('english', 'postgresql & performance'); + +-- With ranking +select *, ts_rank(search_vector, query) as rank +from articles, to_tsquery('english', 'postgresql') query +where search_vector @@ query +order by rank desc; +``` + +Search multiple terms: + +```sql +-- AND: both terms required +to_tsquery('postgresql & performance') + +-- OR: either term +to_tsquery('postgresql | mysql') + +-- Prefix matching +to_tsquery('post:*') +``` + +Reference: [Full Text Search](https://supabase.com/docs/guides/database/full-text-search) diff --git a/.agents/skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md b/.agents/skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md new file mode 100644 index 0000000..e3d261e --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md @@ -0,0 +1,49 @@ +--- +title: Index JSONB Columns for Efficient Querying +impact: MEDIUM +impactDescription: 10-100x faster JSONB queries with proper indexing +tags: jsonb, gin, indexes, json +--- + +## Index JSONB Columns for Efficient Querying + +JSONB queries without indexes scan the entire table. Use GIN indexes for containment queries. + +**Incorrect (no index on JSONB):** + +```sql +create table products ( + id bigint primary key, + attributes jsonb +); + +-- Full table scan for every query +select * from products where attributes @> '{"color": "red"}'; +select * from products where attributes->>'brand' = 'Nike'; +``` + +**Correct (GIN index for JSONB):** + +```sql +-- GIN index for containment operators (@>, ?, ?&, ?|) +create index products_attrs_gin on products using gin (attributes); + +-- Now containment queries use the index +select * from products where attributes @> '{"color": "red"}'; + +-- For specific key lookups, use expression index +create index products_brand_idx on products ((attributes->>'brand')); +select * from products where attributes->>'brand' = 'Nike'; +``` + +Choose the right operator class: + +```sql +-- jsonb_ops (default): supports all operators, larger index +create index idx1 on products using gin (attributes); + +-- jsonb_path_ops: only @> operator, but 2-3x smaller index +create index idx2 on products using gin (attributes jsonb_path_ops); +``` + +Reference: [JSONB Indexes](https://www.postgresql.org/docs/current/datatype-json.html#JSON-INDEXING) diff --git a/.agents/skills/supabase-postgres-best-practices/references/conn-idle-timeout.md b/.agents/skills/supabase-postgres-best-practices/references/conn-idle-timeout.md new file mode 100644 index 0000000..40b9cc5 --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/conn-idle-timeout.md @@ -0,0 +1,46 @@ +--- +title: Configure Idle Connection Timeouts +impact: HIGH +impactDescription: Reclaim 30-50% of connection slots from idle clients +tags: connections, timeout, idle, resource-management +--- + +## Configure Idle Connection Timeouts + +Idle connections waste resources. Configure timeouts to automatically reclaim them. + +**Incorrect (connections held indefinitely):** + +```sql +-- No timeout configured +show idle_in_transaction_session_timeout; -- 0 (disabled) + +-- Connections stay open forever, even when idle +select pid, state, state_change, query +from pg_stat_activity +where state = 'idle in transaction'; +-- Shows transactions idle for hours, holding locks +``` + +**Correct (automatic cleanup of idle connections):** + +```sql +-- Terminate connections idle in transaction after 30 seconds +alter system set idle_in_transaction_session_timeout = '30s'; + +-- Terminate completely idle connections after 10 minutes +alter system set idle_session_timeout = '10min'; + +-- Reload configuration +select pg_reload_conf(); +``` + +For pooled connections, configure at the pooler level: + +```ini +# pgbouncer.ini +server_idle_timeout = 60 +client_idle_timeout = 300 +``` + +Reference: [Connection Timeouts](https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-IDLE-IN-TRANSACTION-SESSION-TIMEOUT) diff --git a/.agents/skills/supabase-postgres-best-practices/references/conn-limits.md b/.agents/skills/supabase-postgres-best-practices/references/conn-limits.md new file mode 100644 index 0000000..cb3e400 --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/conn-limits.md @@ -0,0 +1,44 @@ +--- +title: Set Appropriate Connection Limits +impact: CRITICAL +impactDescription: Prevent database crashes and memory exhaustion +tags: connections, max-connections, limits, stability +--- + +## Set Appropriate Connection Limits + +Too many connections exhaust memory and degrade performance. Set limits based on available resources. + +**Incorrect (unlimited or excessive connections):** + +```sql +-- Default max_connections = 100, but often increased blindly +show max_connections; -- 500 (way too high for 4GB RAM) + +-- Each connection uses 1-3MB RAM +-- 500 connections * 2MB = 1GB just for connections! +-- Out of memory errors under load +``` + +**Correct (calculate based on resources):** + +```sql +-- Formula: max_connections = (RAM in MB / 5MB per connection) - reserved +-- For 4GB RAM: (4096 / 5) - 10 = ~800 theoretical max +-- But practically, 100-200 is better for query performance + +-- Recommended settings for 4GB RAM +alter system set max_connections = 100; + +-- Also set work_mem appropriately +-- work_mem * max_connections should not exceed 25% of RAM +alter system set work_mem = '8MB'; -- 8MB * 100 = 800MB max +``` + +Monitor connection usage: + +```sql +select count(*), state from pg_stat_activity group by state; +``` + +Reference: [Database Connections](https://supabase.com/docs/guides/platform/performance#connection-management) diff --git a/.agents/skills/supabase-postgres-best-practices/references/conn-pooling.md b/.agents/skills/supabase-postgres-best-practices/references/conn-pooling.md new file mode 100644 index 0000000..e2ebd58 --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/conn-pooling.md @@ -0,0 +1,41 @@ +--- +title: Use Connection Pooling for All Applications +impact: CRITICAL +impactDescription: Handle 10-100x more concurrent users +tags: connection-pooling, pgbouncer, performance, scalability +--- + +## Use Connection Pooling for All Applications + +Postgres connections are expensive (1-3MB RAM each). Without pooling, applications exhaust connections under load. + +**Incorrect (new connection per request):** + +```sql +-- Each request creates a new connection +-- Application code: db.connect() per request +-- Result: 500 concurrent users = 500 connections = crashed database + +-- Check current connections +select count(*) from pg_stat_activity; -- 487 connections! +``` + +**Correct (connection pooling):** + +```sql +-- Use a pooler like PgBouncer between app and database +-- Application connects to pooler, pooler reuses a small pool to Postgres + +-- Configure pool_size based on: (CPU cores * 2) + spindle_count +-- Example for 4 cores: pool_size = 10 + +-- Result: 500 concurrent users share 10 actual connections +select count(*) from pg_stat_activity; -- 10 connections +``` + +Pool modes: + +- **Transaction mode**: connection returned after each transaction (best for most apps) +- **Session mode**: connection held for entire session (needed for prepared statements, temp tables) + +Reference: [Connection Pooling](https://supabase.com/docs/guides/database/connecting-to-postgres#connection-pooler) diff --git a/.agents/skills/supabase-postgres-best-practices/references/conn-prepared-statements.md b/.agents/skills/supabase-postgres-best-practices/references/conn-prepared-statements.md new file mode 100644 index 0000000..555547d --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/conn-prepared-statements.md @@ -0,0 +1,46 @@ +--- +title: Use Prepared Statements Correctly with Pooling +impact: HIGH +impactDescription: Avoid prepared statement conflicts in pooled environments +tags: prepared-statements, connection-pooling, transaction-mode +--- + +## Use Prepared Statements Correctly with Pooling + +Prepared statements are tied to individual database connections. In transaction-mode pooling, connections are shared, causing conflicts. + +**Incorrect (named prepared statements with transaction pooling):** + +```sql +-- Named prepared statement +prepare get_user as select * from users where id = $1; + +-- In transaction mode pooling, next request may get different connection +execute get_user(123); +-- ERROR: prepared statement "get_user" does not exist +``` + +**Correct (use unnamed statements or session mode):** + +```sql +-- Option 1: Use unnamed prepared statements (most ORMs do this automatically) +-- The query is prepared and executed in a single protocol message + +-- Option 2: Deallocate after use in transaction mode +prepare get_user as select * from users where id = $1; +execute get_user(123); +deallocate get_user; + +-- Option 3: Use session mode pooling (port 5432 vs 6543) +-- Connection is held for entire session, prepared statements persist +``` + +Check your driver settings: + +```sql +-- Many drivers use prepared statements by default +-- Node.js pg: { prepare: false } to disable +-- JDBC: prepareThreshold=0 to disable +``` + +Reference: [Prepared Statements with Pooling](https://supabase.com/docs/guides/database/connecting-to-postgres#connection-pool-modes) diff --git a/.agents/skills/supabase-postgres-best-practices/references/data-batch-inserts.md b/.agents/skills/supabase-postgres-best-practices/references/data-batch-inserts.md new file mode 100644 index 0000000..997947c --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/data-batch-inserts.md @@ -0,0 +1,54 @@ +--- +title: Batch INSERT Statements for Bulk Data +impact: MEDIUM +impactDescription: 10-50x faster bulk inserts +tags: batch, insert, bulk, performance, copy +--- + +## Batch INSERT Statements for Bulk Data + +Individual INSERT statements have high overhead. Batch multiple rows in single statements or use COPY. + +**Incorrect (individual inserts):** + +```sql +-- Each insert is a separate transaction and round trip +insert into events (user_id, action) values (1, 'click'); +insert into events (user_id, action) values (1, 'view'); +insert into events (user_id, action) values (2, 'click'); +-- ... 1000 more individual inserts + +-- 1000 inserts = 1000 round trips = slow +``` + +**Correct (batch insert):** + +```sql +-- Multiple rows in single statement +insert into events (user_id, action) values + (1, 'click'), + (1, 'view'), + (2, 'click'), + -- ... up to ~1000 rows per batch + (999, 'view'); + +-- One round trip for 1000 rows +``` + +For large imports, use COPY: + +```sql +-- COPY is fastest for bulk loading +copy events (user_id, action, created_at) +from '/path/to/data.csv' +with (format csv, header true); + +-- Or from stdin in application +copy events (user_id, action) from stdin with (format csv); +1,click +1,view +2,click +\. +``` + +Reference: [COPY](https://www.postgresql.org/docs/current/sql-copy.html) diff --git a/.agents/skills/supabase-postgres-best-practices/references/data-n-plus-one.md b/.agents/skills/supabase-postgres-best-practices/references/data-n-plus-one.md new file mode 100644 index 0000000..2109186 --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/data-n-plus-one.md @@ -0,0 +1,53 @@ +--- +title: Eliminate N+1 Queries with Batch Loading +impact: MEDIUM-HIGH +impactDescription: 10-100x fewer database round trips +tags: n-plus-one, batch, performance, queries +--- + +## Eliminate N+1 Queries with Batch Loading + +N+1 queries execute one query per item in a loop. Batch them into a single query using arrays or JOINs. + +**Incorrect (N+1 queries):** + +```sql +-- First query: get all users +select id from users where active = true; -- Returns 100 IDs + +-- Then N queries, one per user +select * from orders where user_id = 1; +select * from orders where user_id = 2; +select * from orders where user_id = 3; +-- ... 97 more queries! + +-- Total: 101 round trips to database +``` + +**Correct (single batch query):** + +```sql +-- Collect IDs and query once with ANY +select * from orders where user_id = any(array[1, 2, 3, ...]); + +-- Or use JOIN instead of loop +select u.id, u.name, o.* +from users u +left join orders o on o.user_id = u.id +where u.active = true; + +-- Total: 1 round trip +``` + +Application pattern: + +```sql +-- Instead of looping in application code: +-- for user in users: db.query("SELECT * FROM orders WHERE user_id = $1", user.id) + +-- Pass array parameter: +select * from orders where user_id = any($1::bigint[]); +-- Application passes: [1, 2, 3, 4, 5, ...] +``` + +Reference: [N+1 Query Problem](https://supabase.com/docs/guides/database/query-optimization) diff --git a/.agents/skills/supabase-postgres-best-practices/references/data-pagination.md b/.agents/skills/supabase-postgres-best-practices/references/data-pagination.md new file mode 100644 index 0000000..633d839 --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/data-pagination.md @@ -0,0 +1,50 @@ +--- +title: Use Cursor-Based Pagination Instead of OFFSET +impact: MEDIUM-HIGH +impactDescription: Consistent O(1) performance regardless of page depth +tags: pagination, cursor, keyset, offset, performance +--- + +## Use Cursor-Based Pagination Instead of OFFSET + +OFFSET-based pagination scans all skipped rows, getting slower on deeper pages. Cursor pagination is O(1). + +**Incorrect (OFFSET pagination):** + +```sql +-- Page 1: scans 20 rows +select * from products order by id limit 20 offset 0; + +-- Page 100: scans 2000 rows to skip 1980 +select * from products order by id limit 20 offset 1980; + +-- Page 10000: scans 200,000 rows! +select * from products order by id limit 20 offset 199980; +``` + +**Correct (cursor/keyset pagination):** + +```sql +-- Page 1: get first 20 +select * from products order by id limit 20; +-- Application stores last_id = 20 + +-- Page 2: start after last ID +select * from products where id > 20 order by id limit 20; +-- Uses index, always fast regardless of page depth + +-- Page 10000: same speed as page 1 +select * from products where id > 199980 order by id limit 20; +``` + +For multi-column sorting: + +```sql +-- Cursor must include all sort columns +select * from products +where (created_at, id) > ('2024-01-15 10:00:00', 12345) +order by created_at, id +limit 20; +``` + +Reference: [Pagination](https://supabase.com/docs/guides/database/pagination) diff --git a/.agents/skills/supabase-postgres-best-practices/references/data-upsert.md b/.agents/skills/supabase-postgres-best-practices/references/data-upsert.md new file mode 100644 index 0000000..bc95e23 --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/data-upsert.md @@ -0,0 +1,50 @@ +--- +title: Use UPSERT for Insert-or-Update Operations +impact: MEDIUM +impactDescription: Atomic operation, eliminates race conditions +tags: upsert, on-conflict, insert, update +--- + +## Use UPSERT for Insert-or-Update Operations + +Using separate SELECT-then-INSERT/UPDATE creates race conditions. Use INSERT ... ON CONFLICT for atomic upserts. + +**Incorrect (check-then-insert race condition):** + +```sql +-- Race condition: two requests check simultaneously +select * from settings where user_id = 123 and key = 'theme'; +-- Both find nothing + +-- Both try to insert +insert into settings (user_id, key, value) values (123, 'theme', 'dark'); +-- One succeeds, one fails with duplicate key error! +``` + +**Correct (atomic UPSERT):** + +```sql +-- Single atomic operation +insert into settings (user_id, key, value) +values (123, 'theme', 'dark') +on conflict (user_id, key) +do update set value = excluded.value, updated_at = now(); + +-- Returns the inserted/updated row +insert into settings (user_id, key, value) +values (123, 'theme', 'dark') +on conflict (user_id, key) +do update set value = excluded.value +returning *; +``` + +Insert-or-ignore pattern: + +```sql +-- Insert only if not exists (no update) +insert into page_views (page_id, user_id) +values (1, 123) +on conflict (page_id, user_id) do nothing; +``` + +Reference: [INSERT ON CONFLICT](https://www.postgresql.org/docs/current/sql-insert.html#SQL-ON-CONFLICT) diff --git a/.agents/skills/supabase-postgres-best-practices/references/lock-advisory.md b/.agents/skills/supabase-postgres-best-practices/references/lock-advisory.md new file mode 100644 index 0000000..572eaf0 --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/lock-advisory.md @@ -0,0 +1,56 @@ +--- +title: Use Advisory Locks for Application-Level Locking +impact: MEDIUM +impactDescription: Efficient coordination without row-level lock overhead +tags: advisory-locks, coordination, application-locks +--- + +## Use Advisory Locks for Application-Level Locking + +Advisory locks provide application-level coordination without requiring database rows to lock. + +**Incorrect (creating rows just for locking):** + +```sql +-- Creating dummy rows to lock on +create table resource_locks ( + resource_name text primary key +); + +insert into resource_locks values ('report_generator'); + +-- Lock by selecting the row +select * from resource_locks where resource_name = 'report_generator' for update; +``` + +**Correct (advisory locks):** + +```sql +-- Session-level advisory lock (released on disconnect or unlock) +select pg_advisory_lock(hashtext('report_generator')); +-- ... do exclusive work ... +select pg_advisory_unlock(hashtext('report_generator')); + +-- Transaction-level lock (released on commit/rollback) +begin; +select pg_advisory_xact_lock(hashtext('daily_report')); +-- ... do work ... +commit; -- Lock automatically released +``` + +Try-lock for non-blocking operations: + +```sql +-- Returns immediately with true/false instead of waiting +select pg_try_advisory_lock(hashtext('resource_name')); + +-- Use in application +if (acquired) { + -- Do work + select pg_advisory_unlock(hashtext('resource_name')); +} else { + -- Skip or retry later +} +``` + +Reference: [Advisory Locks](https://www.postgresql.org/docs/current/explicit-locking.html#ADVISORY-LOCKS) diff --git a/.agents/skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md b/.agents/skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md new file mode 100644 index 0000000..974da5e --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md @@ -0,0 +1,68 @@ +--- +title: Prevent Deadlocks with Consistent Lock Ordering +impact: MEDIUM-HIGH +impactDescription: Eliminate deadlock errors, improve reliability +tags: deadlocks, locking, transactions, ordering +--- + +## Prevent Deadlocks with Consistent Lock Ordering + +Deadlocks occur when transactions lock resources in different orders. Always +acquire locks in a consistent order. + +**Incorrect (inconsistent lock ordering):** + +```sql +-- Transaction A -- Transaction B +begin; begin; +update accounts update accounts +set balance = balance - 100 set balance = balance - 50 +where id = 1; where id = 2; -- B locks row 2 + +update accounts update accounts +set balance = balance + 100 set balance = balance + 50 +where id = 2; -- A waits for B where id = 1; -- B waits for A + +-- DEADLOCK! Both waiting for each other +``` + +**Correct (lock rows in consistent order first):** + +```sql +-- Explicitly acquire locks in ID order before updating +begin; +select * from accounts where id in (1, 2) order by id for update; + +-- Now perform updates in any order - locks already held +update accounts set balance = balance - 100 where id = 1; +update accounts set balance = balance + 100 where id = 2; +commit; +``` + +Alternative: use a single statement to update atomically: + +```sql +-- Single statement acquires all locks atomically +begin; +update accounts +set balance = balance + case id + when 1 then -100 + when 2 then 100 +end +where id in (1, 2); +commit; +``` + +Detect deadlocks in logs: + +```sql +-- Check for recent deadlocks +select * from pg_stat_database where deadlocks > 0; + +-- Enable deadlock logging +set log_lock_waits = on; +set deadlock_timeout = '1s'; +``` + +Reference: +[Deadlocks](https://www.postgresql.org/docs/current/explicit-locking.html#LOCKING-DEADLOCKS) diff --git a/.agents/skills/supabase-postgres-best-practices/references/lock-short-transactions.md b/.agents/skills/supabase-postgres-best-practices/references/lock-short-transactions.md new file mode 100644 index 0000000..e6b8ef2 --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/lock-short-transactions.md @@ -0,0 +1,50 @@ +--- +title: Keep Transactions Short to Reduce Lock Contention +impact: MEDIUM-HIGH +impactDescription: 3-5x throughput improvement, fewer deadlocks +tags: transactions, locking, contention, performance +--- + +## Keep Transactions Short to Reduce Lock Contention + +Long-running transactions hold locks that block other queries. Keep transactions as short as possible. + +**Incorrect (long transaction with external calls):** + +```sql +begin; +select * from orders where id = 1 for update; -- Lock acquired + +-- Application makes HTTP call to payment API (2-5 seconds) +-- Other queries on this row are blocked! + +update orders set status = 'paid' where id = 1; +commit; -- Lock held for entire duration +``` + +**Correct (minimal transaction scope):** + +```sql +-- Validate data and call APIs outside transaction +-- Application: response = await paymentAPI.charge(...) + +-- Only hold lock for the actual update +begin; +update orders +set status = 'paid', payment_id = $1 +where id = $2 and status = 'pending' +returning *; +commit; -- Lock held for milliseconds +``` + +Use `statement_timeout` to prevent runaway transactions: + +```sql +-- Abort queries running longer than 30 seconds +set statement_timeout = '30s'; + +-- Or per-session +set local statement_timeout = '5s'; +``` + +Reference: [Transaction Management](https://www.postgresql.org/docs/current/tutorial-transactions.html) diff --git a/.agents/skills/supabase-postgres-best-practices/references/lock-skip-locked.md b/.agents/skills/supabase-postgres-best-practices/references/lock-skip-locked.md new file mode 100644 index 0000000..77bdbb9 --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/lock-skip-locked.md @@ -0,0 +1,54 @@ +--- +title: Use SKIP LOCKED for Non-Blocking Queue Processing +impact: MEDIUM-HIGH +impactDescription: 10x throughput for worker queues +tags: skip-locked, queue, workers, concurrency +--- + +## Use SKIP LOCKED for Non-Blocking Queue Processing + +When multiple workers process a queue, SKIP LOCKED allows workers to process different rows without waiting. + +**Incorrect (workers block each other):** + +```sql +-- Worker 1 and Worker 2 both try to get next job +begin; +select * from jobs where status = 'pending' order by created_at limit 1 for update; +-- Worker 2 waits for Worker 1's lock to release! +``` + +**Correct (SKIP LOCKED for parallel processing):** + +```sql +-- Each worker skips locked rows and gets the next available +begin; +select * from jobs +where status = 'pending' +order by created_at +limit 1 +for update skip locked; + +-- Worker 1 gets job 1, Worker 2 gets job 2 (no waiting) + +update jobs set status = 'processing' where id = $1; +commit; +``` + +Complete queue pattern: + +```sql +-- Atomic claim-and-update in one statement +update jobs +set status = 'processing', worker_id = $1, started_at = now() +where id = ( + select id from jobs + where status = 'pending' + order by created_at + limit 1 + for update skip locked +) +returning *; +``` + +Reference: [SELECT FOR UPDATE SKIP LOCKED](https://www.postgresql.org/docs/current/sql-select.html#SQL-FOR-UPDATE-SHARE) diff --git a/.agents/skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md b/.agents/skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md new file mode 100644 index 0000000..542978c --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md @@ -0,0 +1,45 @@ +--- +title: Use EXPLAIN ANALYZE to Diagnose Slow Queries +impact: LOW-MEDIUM +impactDescription: Identify exact bottlenecks in query execution +tags: explain, analyze, diagnostics, query-plan +--- + +## Use EXPLAIN ANALYZE to Diagnose Slow Queries + +EXPLAIN ANALYZE executes the query and shows actual timings, revealing the true performance bottlenecks. + +**Incorrect (guessing at performance issues):** + +```sql +-- Query is slow, but why? +select * from orders where customer_id = 123 and status = 'pending'; +-- "It must be missing an index" - but which one? +``` + +**Correct (use EXPLAIN ANALYZE):** + +```sql +explain (analyze, buffers, format text) +select * from orders where customer_id = 123 and status = 'pending'; + +-- Output reveals the issue: +-- Seq Scan on orders (cost=0.00..25000.00 rows=50 width=100) (actual time=0.015..450.123 rows=50 loops=1) +-- Filter: ((customer_id = 123) AND (status = 'pending'::text)) +-- Rows Removed by Filter: 999950 +-- Buffers: shared hit=5000 read=15000 +-- Planning Time: 0.150 ms +-- Execution Time: 450.500 ms +``` + +Key things to look for: + +```sql +-- Seq Scan on large tables = missing index +-- Rows Removed by Filter = poor selectivity or missing index +-- Buffers: read >> hit = data not cached, needs more memory +-- Nested Loop with high loops = consider different join strategy +-- Sort Method: external merge = work_mem too low +``` + +Reference: [EXPLAIN](https://supabase.com/docs/guides/database/inspect) diff --git a/.agents/skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md b/.agents/skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md new file mode 100644 index 0000000..d7e82f1 --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md @@ -0,0 +1,55 @@ +--- +title: Enable pg_stat_statements for Query Analysis +impact: LOW-MEDIUM +impactDescription: Identify top resource-consuming queries +tags: pg-stat-statements, monitoring, statistics, performance +--- + +## Enable pg_stat_statements for Query Analysis + +pg_stat_statements tracks execution statistics for all queries, helping identify slow and frequent queries. + +**Incorrect (no visibility into query patterns):** + +```sql +-- Database is slow, but which queries are the problem? +-- No way to know without pg_stat_statements +``` + +**Correct (enable and query pg_stat_statements):** + +```sql +-- Enable the extension +create extension if not exists pg_stat_statements; + +-- Find slowest queries by total time +select + calls, + round(total_exec_time::numeric, 2) as total_time_ms, + round(mean_exec_time::numeric, 2) as mean_time_ms, + query +from pg_stat_statements +order by total_exec_time desc +limit 10; + +-- Find most frequent queries +select calls, query +from pg_stat_statements +order by calls desc +limit 10; + +-- Reset statistics after optimization +select pg_stat_statements_reset(); +``` + +Key metrics to monitor: + +```sql +-- Queries with high mean time (candidates for optimization) +select query, mean_exec_time, calls +from pg_stat_statements +where mean_exec_time > 100 -- > 100ms average +order by mean_exec_time desc; +``` + +Reference: [pg_stat_statements](https://supabase.com/docs/guides/database/extensions/pg_stat_statements) diff --git a/.agents/skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md b/.agents/skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md new file mode 100644 index 0000000..e0e8ea0 --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md @@ -0,0 +1,55 @@ +--- +title: Maintain Table Statistics with VACUUM and ANALYZE +impact: MEDIUM +impactDescription: 2-10x better query plans with accurate statistics +tags: vacuum, analyze, statistics, maintenance, autovacuum +--- + +## Maintain Table Statistics with VACUUM and ANALYZE + +Outdated statistics cause the query planner to make poor decisions. VACUUM reclaims space, ANALYZE updates statistics. + +**Incorrect (stale statistics):** + +```sql +-- Table has 1M rows but stats say 1000 +-- Query planner chooses wrong strategy +explain select * from orders where status = 'pending'; +-- Shows: Seq Scan (because stats show small table) +-- Actually: Index Scan would be much faster +``` + +**Correct (maintain fresh statistics):** + +```sql +-- Manually analyze after large data changes +analyze orders; + +-- Analyze specific columns used in WHERE clauses +analyze orders (status, created_at); + +-- Check when tables were last analyzed +select + relname, + last_vacuum, + last_autovacuum, + last_analyze, + last_autoanalyze +from pg_stat_user_tables +order by last_analyze nulls first; +``` + +Autovacuum tuning for busy tables: + +```sql +-- Increase frequency for high-churn tables +alter table orders set ( + autovacuum_vacuum_scale_factor = 0.05, -- Vacuum at 5% dead tuples (default 20%) + autovacuum_analyze_scale_factor = 0.02 -- Analyze at 2% changes (default 10%) +); + +-- Check autovacuum status +select * from pg_stat_progress_vacuum; +``` + +Reference: [VACUUM](https://supabase.com/docs/guides/database/database-size#vacuum-operations) diff --git a/.agents/skills/supabase-postgres-best-practices/references/query-composite-indexes.md b/.agents/skills/supabase-postgres-best-practices/references/query-composite-indexes.md new file mode 100644 index 0000000..fea6452 --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/query-composite-indexes.md @@ -0,0 +1,44 @@ +--- +title: Create Composite Indexes for Multi-Column Queries +impact: HIGH +impactDescription: 5-10x faster multi-column queries +tags: indexes, composite-index, multi-column, query-optimization +--- + +## Create Composite Indexes for Multi-Column Queries + +When queries filter on multiple columns, a composite index is more efficient than separate single-column indexes. + +**Incorrect (separate indexes require bitmap scan):** + +```sql +-- Two separate indexes +create index orders_status_idx on orders (status); +create index orders_created_idx on orders (created_at); + +-- Query must combine both indexes (slower) +select * from orders where status = 'pending' and created_at > '2024-01-01'; +``` + +**Correct (composite index):** + +```sql +-- Single composite index (leftmost column first for equality checks) +create index orders_status_created_idx on orders (status, created_at); + +-- Query uses one efficient index scan +select * from orders where status = 'pending' and created_at > '2024-01-01'; +``` + +**Column order matters** - place equality columns first, range columns last: + +```sql +-- Good: status (=) before created_at (>) +create index idx on orders (status, created_at); + +-- Works for: WHERE status = 'pending' +-- Works for: WHERE status = 'pending' AND created_at > '2024-01-01' +-- Does NOT work for: WHERE created_at > '2024-01-01' (leftmost prefix rule) +``` + +Reference: [Multicolumn Indexes](https://www.postgresql.org/docs/current/indexes-multicolumn.html) diff --git a/.agents/skills/supabase-postgres-best-practices/references/query-covering-indexes.md b/.agents/skills/supabase-postgres-best-practices/references/query-covering-indexes.md new file mode 100644 index 0000000..9d2a494 --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/query-covering-indexes.md @@ -0,0 +1,40 @@ +--- +title: Use Covering Indexes to Avoid Table Lookups +impact: MEDIUM-HIGH +impactDescription: 2-5x faster queries by eliminating heap fetches +tags: indexes, covering-index, include, index-only-scan +--- + +## Use Covering Indexes to Avoid Table Lookups + +Covering indexes include all columns needed by a query, enabling index-only scans that skip the table entirely. + +**Incorrect (index scan + heap fetch):** + +```sql +create index users_email_idx on users (email); + +-- Must fetch name and created_at from table heap +select email, name, created_at from users where email = 'user@example.com'; +``` + +**Correct (index-only scan with INCLUDE):** + +```sql +-- Include non-searchable columns in the index +create index users_email_idx on users (email) include (name, created_at); + +-- All columns served from index, no table access needed +select email, name, created_at from users where email = 'user@example.com'; +``` + +Use INCLUDE for columns you SELECT but don't filter on: + +```sql +-- Searching by status, but also need customer_id and total +create index orders_status_idx on orders (status) include (customer_id, total); + +select status, customer_id, total from orders where status = 'shipped'; +``` + +Reference: [Index-Only Scans](https://www.postgresql.org/docs/current/indexes-index-only-scans.html) diff --git a/.agents/skills/supabase-postgres-best-practices/references/query-index-types.md b/.agents/skills/supabase-postgres-best-practices/references/query-index-types.md new file mode 100644 index 0000000..93b3259 --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/query-index-types.md @@ -0,0 +1,48 @@ +--- +title: Choose the Right Index Type for Your Data +impact: HIGH +impactDescription: 10-100x improvement with correct index type +tags: indexes, btree, gin, gist, brin, hash, index-types +--- + +## Choose the Right Index Type for Your Data + +Different index types excel at different query patterns. The default B-tree isn't always optimal. + +**Incorrect (B-tree for JSONB containment):** + +```sql +-- B-tree cannot optimize containment operators +create index products_attrs_idx on products (attributes); +select * from products where attributes @> '{"color": "red"}'; +-- Full table scan - B-tree doesn't support @> operator +``` + +**Correct (GIN for JSONB):** + +```sql +-- GIN supports @>, ?, ?&, ?| operators +create index products_attrs_idx on products using gin (attributes); +select * from products where attributes @> '{"color": "red"}'; +``` + +Index type guide: + +```sql +-- B-tree (default): =, <, >, BETWEEN, IN, IS NULL +create index users_created_idx on users (created_at); + +-- GIN: arrays, JSONB, full-text search +create index posts_tags_idx on posts using gin (tags); + +-- GiST: geometric data, range types, nearest-neighbor (KNN) queries +create index locations_idx on places using gist (location); + +-- BRIN: large time-series tables (10-100x smaller) +create index events_time_idx on events using brin (created_at); + +-- Hash: equality-only (slightly faster than B-tree for =) +create index sessions_token_idx on sessions using hash (token); +``` + +Reference: [Index Types](https://www.postgresql.org/docs/current/indexes-types.html) diff --git a/.agents/skills/supabase-postgres-best-practices/references/query-missing-indexes.md b/.agents/skills/supabase-postgres-best-practices/references/query-missing-indexes.md new file mode 100644 index 0000000..e6daace --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/query-missing-indexes.md @@ -0,0 +1,43 @@ +--- +title: Add Indexes on WHERE and JOIN Columns +impact: CRITICAL +impactDescription: 100-1000x faster queries on large tables +tags: indexes, performance, sequential-scan, query-optimization +--- + +## Add Indexes on WHERE and JOIN Columns + +Queries filtering or joining on unindexed columns cause full table scans, which become exponentially slower as tables grow. + +**Incorrect (sequential scan on large table):** + +```sql +-- No index on customer_id causes full table scan +select * from orders where customer_id = 123; + +-- EXPLAIN shows: Seq Scan on orders (cost=0.00..25000.00 rows=100 width=85) +``` + +**Correct (index scan):** + +```sql +-- Create index on frequently filtered column +create index orders_customer_id_idx on orders (customer_id); + +select * from orders where customer_id = 123; + +-- EXPLAIN shows: Index Scan using orders_customer_id_idx (cost=0.42..8.44 rows=100 width=85) +``` + +For JOIN columns, always index the foreign key side: + +```sql +-- Index the referencing column +create index orders_customer_id_idx on orders (customer_id); + +select c.name, o.total +from customers c +join orders o on o.customer_id = c.id; +``` + +Reference: [Query Optimization](https://supabase.com/docs/guides/database/query-optimization) diff --git a/.agents/skills/supabase-postgres-best-practices/references/query-partial-indexes.md b/.agents/skills/supabase-postgres-best-practices/references/query-partial-indexes.md new file mode 100644 index 0000000..3e61a34 --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/query-partial-indexes.md @@ -0,0 +1,45 @@ +--- +title: Use Partial Indexes for Filtered Queries +impact: HIGH +impactDescription: 5-20x smaller indexes, faster writes and queries +tags: indexes, partial-index, query-optimization, storage +--- + +## Use Partial Indexes for Filtered Queries + +Partial indexes only include rows matching a WHERE condition, making them smaller and faster when queries consistently filter on the same condition. + +**Incorrect (full index includes irrelevant rows):** + +```sql +-- Index includes all rows, even soft-deleted ones +create index users_email_idx on users (email); + +-- Query always filters active users +select * from users where email = 'user@example.com' and deleted_at is null; +``` + +**Correct (partial index matches query filter):** + +```sql +-- Index only includes active users +create index users_active_email_idx on users (email) +where deleted_at is null; + +-- Query uses the smaller, faster index +select * from users where email = 'user@example.com' and deleted_at is null; +``` + +Common use cases for partial indexes: + +```sql +-- Only pending orders (status rarely changes once completed) +create index orders_pending_idx on orders (created_at) +where status = 'pending'; + +-- Only non-null values +create index products_sku_idx on products (sku) +where sku is not null; +``` + +Reference: [Partial Indexes](https://www.postgresql.org/docs/current/indexes-partial.html) diff --git a/.agents/skills/supabase-postgres-best-practices/references/schema-constraints.md b/.agents/skills/supabase-postgres-best-practices/references/schema-constraints.md new file mode 100644 index 0000000..1d2ef8f --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/schema-constraints.md @@ -0,0 +1,80 @@ +--- +title: Add Constraints Safely in Migrations +impact: HIGH +impactDescription: Prevents migration failures and enables idempotent schema changes +tags: constraints, migrations, schema, alter-table +--- + +## Add Constraints Safely in Migrations + +PostgreSQL does not support `ADD CONSTRAINT IF NOT EXISTS`. Migrations using this syntax will fail. + +**Incorrect (causes syntax error):** + +```sql +-- ERROR: syntax error at or near "not" (SQLSTATE 42601) +alter table public.profiles +add constraint if not exists profiles_birthchart_id_unique unique (birthchart_id); +``` + +**Correct (idempotent constraint creation):** + +```sql +-- Use DO block to check before adding +do $$ +begin + if not exists ( + select 1 from pg_constraint + where conname = 'profiles_birthchart_id_unique' + and conrelid = 'public.profiles'::regclass + ) then + alter table public.profiles + add constraint profiles_birthchart_id_unique unique (birthchart_id); + end if; +end $$; +``` + +For all constraint types: + +```sql +-- Check constraints +do $$ +begin + if not exists ( + select 1 from pg_constraint + where conname = 'check_age_positive' + ) then + alter table users add constraint check_age_positive check (age > 0); + end if; +end $$; + +-- Foreign keys +do $$ +begin + if not exists ( + select 1 from pg_constraint + where conname = 'profiles_birthchart_id_fkey' + ) then + alter table profiles + add constraint profiles_birthchart_id_fkey + foreign key (birthchart_id) references birthcharts(id); + end if; +end $$; +``` + +Check if constraint exists: + +```sql +-- Query to check constraint existence +select conname, contype, pg_get_constraintdef(oid) +from pg_constraint +where conrelid = 'public.profiles'::regclass; + +-- contype values: +-- 'p' = PRIMARY KEY +-- 'f' = FOREIGN KEY +-- 'u' = UNIQUE +-- 'c' = CHECK +``` + +Reference: [Constraints](https://www.postgresql.org/docs/current/ddl-constraints.html) diff --git a/.agents/skills/supabase-postgres-best-practices/references/schema-data-types.md b/.agents/skills/supabase-postgres-best-practices/references/schema-data-types.md new file mode 100644 index 0000000..f253a58 --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/schema-data-types.md @@ -0,0 +1,46 @@ +--- +title: Choose Appropriate Data Types +impact: HIGH +impactDescription: 50% storage reduction, faster comparisons +tags: data-types, schema, storage, performance +--- + +## Choose Appropriate Data Types + +Using the right data types reduces storage, improves query performance, and prevents bugs. + +**Incorrect (wrong data types):** + +```sql +create table users ( + id int, -- Will overflow at 2.1 billion + email varchar(255), -- Unnecessary length limit + created_at timestamp, -- Missing timezone info + is_active varchar(5), -- String for boolean + price varchar(20) -- String for numeric +); +``` + +**Correct (appropriate data types):** + +```sql +create table users ( + id bigint generated always as identity primary key, -- 9 quintillion max + email text, -- No artificial limit, same performance as varchar + created_at timestamptz, -- Always store timezone-aware timestamps + is_active boolean default true, -- 1 byte vs variable string length + price numeric(10,2) -- Exact decimal arithmetic +); +``` + +Key guidelines: + +```sql +-- IDs: use bigint, not int (future-proofing) +-- Strings: use text, not varchar(n) unless constraint needed +-- Time: use timestamptz, not timestamp +-- Money: use numeric, not float (precision matters) +-- Enums: use text with check constraint or create enum type +``` + +Reference: [Data Types](https://www.postgresql.org/docs/current/datatype.html) diff --git a/.agents/skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md b/.agents/skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md new file mode 100644 index 0000000..6c3d6ff --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md @@ -0,0 +1,59 @@ +--- +title: Index Foreign Key Columns +impact: HIGH +impactDescription: 10-100x faster JOINs and CASCADE operations +tags: foreign-key, indexes, joins, schema +--- + +## Index Foreign Key Columns + +Postgres does not automatically index foreign key columns. Missing indexes cause slow JOINs and CASCADE operations. + +**Incorrect (unindexed foreign key):** + +```sql +create table orders ( + id bigint generated always as identity primary key, + customer_id bigint references customers(id) on delete cascade, + total numeric(10,2) +); + +-- No index on customer_id! +-- JOINs and ON DELETE CASCADE both require full table scan +select * from orders where customer_id = 123; -- Seq Scan +delete from customers where id = 123; -- Locks table, scans all orders +``` + +**Correct (indexed foreign key):** + +```sql +create table orders ( + id bigint generated always as identity primary key, + customer_id bigint references customers(id) on delete cascade, + total numeric(10,2) +); + +-- Always index the FK column +create index orders_customer_id_idx on orders (customer_id); + +-- Now JOINs and cascades are fast +select * from orders where customer_id = 123; -- Index Scan +delete from customers where id = 123; -- Uses index, fast cascade +``` + +Find missing FK indexes: + +```sql +select + conrelid::regclass as table_name, + a.attname as fk_column +from pg_constraint c +join pg_attribute a on a.attrelid = c.conrelid and a.attnum = any(c.conkey) +where c.contype = 'f' + and not exists ( + select 1 from pg_index i + where i.indrelid = c.conrelid and a.attnum = any(i.indkey) + ); +``` + +Reference: [Foreign Keys](https://www.postgresql.org/docs/current/ddl-constraints.html#DDL-CONSTRAINTS-FK) diff --git a/.agents/skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md b/.agents/skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md new file mode 100644 index 0000000..f007294 --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md @@ -0,0 +1,55 @@ +--- +title: Use Lowercase Identifiers for Compatibility +impact: MEDIUM +impactDescription: Avoid case-sensitivity bugs with tools, ORMs, and AI assistants +tags: naming, identifiers, case-sensitivity, schema, conventions +--- + +## Use Lowercase Identifiers for Compatibility + +PostgreSQL folds unquoted identifiers to lowercase. Quoted mixed-case identifiers require quotes forever and cause issues with tools, ORMs, and AI assistants that may not recognize them. + +**Incorrect (mixed-case identifiers):** + +```sql +-- Quoted identifiers preserve case but require quotes everywhere +CREATE TABLE "Users" ( + "userId" bigint PRIMARY KEY, + "firstName" text, + "lastName" text +); + +-- Must always quote or queries fail +SELECT "firstName" FROM "Users" WHERE "userId" = 1; + +-- This fails - Users becomes users without quotes +SELECT firstName FROM Users; +-- ERROR: relation "users" does not exist +``` + +**Correct (lowercase snake_case):** + +```sql +-- Unquoted lowercase identifiers are portable and tool-friendly +CREATE TABLE users ( + user_id bigint PRIMARY KEY, + first_name text, + last_name text +); + +-- Works without quotes, recognized by all tools +SELECT first_name FROM users WHERE user_id = 1; +``` + +Common sources of mixed-case identifiers: + +```sql +-- ORMs often generate quoted camelCase - configure them to use snake_case +-- Migrations from other databases may preserve original casing +-- Some GUI tools quote identifiers by default - disable this + +-- If stuck with mixed-case, create views as a compatibility layer +CREATE VIEW users AS SELECT "userId" AS user_id, "firstName" AS first_name FROM "Users"; +``` + +Reference: [Identifiers and Key Words](https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS) diff --git a/.agents/skills/supabase-postgres-best-practices/references/schema-partitioning.md b/.agents/skills/supabase-postgres-best-practices/references/schema-partitioning.md new file mode 100644 index 0000000..13137a0 --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/schema-partitioning.md @@ -0,0 +1,55 @@ +--- +title: Partition Large Tables for Better Performance +impact: MEDIUM-HIGH +impactDescription: 5-20x faster queries and maintenance on large tables +tags: partitioning, large-tables, time-series, performance +--- + +## Partition Large Tables for Better Performance + +Partitioning splits a large table into smaller pieces, improving query performance and maintenance operations. + +**Incorrect (single large table):** + +```sql +create table events ( + id bigint generated always as identity, + created_at timestamptz, + data jsonb +); + +-- 500M rows, queries scan everything +select * from events where created_at > '2024-01-01'; -- Slow +vacuum events; -- Takes hours, locks table +``` + +**Correct (partitioned by time range):** + +```sql +create table events ( + id bigint generated always as identity, + created_at timestamptz not null, + data jsonb +) partition by range (created_at); + +-- Create partitions for each month +create table events_2024_01 partition of events + for values from ('2024-01-01') to ('2024-02-01'); + +create table events_2024_02 partition of events + for values from ('2024-02-01') to ('2024-03-01'); + +-- Queries only scan relevant partitions +select * from events where created_at > '2024-01-15'; -- Only scans events_2024_01+ + +-- Drop old data instantly +drop table events_2023_01; -- Instant vs DELETE taking hours +``` + +When to partition: + +- Tables > 100M rows +- Time-series data with date-based queries +- Need to efficiently drop old data + +Reference: [Table Partitioning](https://www.postgresql.org/docs/current/ddl-partitioning.html) diff --git a/.agents/skills/supabase-postgres-best-practices/references/schema-primary-keys.md b/.agents/skills/supabase-postgres-best-practices/references/schema-primary-keys.md new file mode 100644 index 0000000..fb0fbb1 --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/schema-primary-keys.md @@ -0,0 +1,61 @@ +--- +title: Select Optimal Primary Key Strategy +impact: HIGH +impactDescription: Better index locality, reduced fragmentation +tags: primary-key, identity, uuid, serial, schema +--- + +## Select Optimal Primary Key Strategy + +Primary key choice affects insert performance, index size, and replication +efficiency. + +**Incorrect (problematic PK choices):** + +```sql +-- identity is the SQL-standard approach +create table users ( + id serial primary key -- Works, but IDENTITY is recommended +); + +-- Random UUIDs (v4) cause index fragmentation +create table orders ( + id uuid default gen_random_uuid() primary key -- UUIDv4 = random = scattered inserts +); +``` + +**Correct (optimal PK strategies):** + +```sql +-- Use IDENTITY for sequential IDs (SQL-standard, best for most cases) +create table users ( + id bigint generated always as identity primary key +); + +-- For distributed systems needing UUIDs, use UUIDv7 (time-ordered) +-- Requires pg_uuidv7 extension: create extension pg_uuidv7; +create table orders ( + id uuid default uuid_generate_v7() primary key -- Time-ordered, no fragmentation +); + +-- Alternative: time-prefixed IDs for sortable, distributed IDs (no extension needed) +create table events ( + id text default concat( + to_char(now() at time zone 'utc', 'YYYYMMDDHH24MISSMS'), + gen_random_uuid()::text + ) primary key +); +``` + +Guidelines: + +- Single database: `bigint identity` (sequential, 8 bytes, SQL-standard) +- Distributed/exposed IDs: UUIDv7 (requires pg_uuidv7) or ULID (time-ordered, no + fragmentation) +- `serial` works but `identity` is SQL-standard and preferred for new + applications +- Avoid random UUIDs (v4) as primary keys on large tables (causes index + fragmentation) + +Reference: +[Identity Columns](https://www.postgresql.org/docs/current/sql-createtable.html#SQL-CREATETABLE-PARMS-GENERATED-IDENTITY) diff --git a/.agents/skills/supabase-postgres-best-practices/references/security-privileges.md b/.agents/skills/supabase-postgres-best-practices/references/security-privileges.md new file mode 100644 index 0000000..448ec34 --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/security-privileges.md @@ -0,0 +1,54 @@ +--- +title: Apply Principle of Least Privilege +impact: MEDIUM +impactDescription: Reduced attack surface, better audit trail +tags: privileges, security, roles, permissions +--- + +## Apply Principle of Least Privilege + +Grant only the minimum permissions required. Never use superuser for application queries. + +**Incorrect (overly broad permissions):** + +```sql +-- Application uses superuser connection +-- Or grants ALL to application role +grant all privileges on all tables in schema public to app_user; +grant all privileges on all sequences in schema public to app_user; + +-- Any SQL injection becomes catastrophic +-- drop table users; cascades to everything +``` + +**Correct (minimal, specific grants):** + +```sql +-- Create role with no default privileges +create role app_readonly nologin; + +-- Grant only SELECT on specific tables +grant usage on schema public to app_readonly; +grant select on public.products, public.categories to app_readonly; + +-- Create role for writes with limited scope +create role app_writer nologin; +grant usage on schema public to app_writer; +grant select, insert, update on public.orders to app_writer; +grant usage on sequence orders_id_seq to app_writer; +-- No DELETE permission + +-- Login role inherits from these +create role app_user login password 'xxx'; +grant app_writer to app_user; +``` + +Revoke public defaults: + +```sql +-- Revoke default public access +revoke all on schema public from public; +revoke all on all tables in schema public from public; +``` + +Reference: [Roles and Privileges](https://supabase.com/blog/postgres-roles-and-privileges) diff --git a/.agents/skills/supabase-postgres-best-practices/references/security-rls-basics.md b/.agents/skills/supabase-postgres-best-practices/references/security-rls-basics.md new file mode 100644 index 0000000..c61e1a8 --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/security-rls-basics.md @@ -0,0 +1,50 @@ +--- +title: Enable Row Level Security for Multi-Tenant Data +impact: CRITICAL +impactDescription: Database-enforced tenant isolation, prevent data leaks +tags: rls, row-level-security, multi-tenant, security +--- + +## Enable Row Level Security for Multi-Tenant Data + +Row Level Security (RLS) enforces data access at the database level, ensuring users only see their own data. + +**Incorrect (application-level filtering only):** + +```sql +-- Relying only on application to filter +select * from orders where user_id = $current_user_id; + +-- Bug or bypass means all data is exposed! +select * from orders; -- Returns ALL orders +``` + +**Correct (database-enforced RLS):** + +```sql +-- Enable RLS on the table +alter table orders enable row level security; + +-- Create policy for users to see only their orders +create policy orders_user_policy on orders + for all + using (user_id = current_setting('app.current_user_id')::bigint); + +-- Force RLS even for table owners +alter table orders force row level security; + +-- Set user context and query +set app.current_user_id = '123'; +select * from orders; -- Only returns orders for user 123 +``` + +Policy for authenticated role: + +```sql +create policy orders_user_policy on orders + for all + to authenticated + using (user_id = auth.uid()); +``` + +Reference: [Row Level Security](https://supabase.com/docs/guides/database/postgres/row-level-security) diff --git a/.agents/skills/supabase-postgres-best-practices/references/security-rls-performance.md b/.agents/skills/supabase-postgres-best-practices/references/security-rls-performance.md new file mode 100644 index 0000000..b32d92f --- /dev/null +++ b/.agents/skills/supabase-postgres-best-practices/references/security-rls-performance.md @@ -0,0 +1,57 @@ +--- +title: Optimize RLS Policies for Performance +impact: HIGH +impactDescription: 5-10x faster RLS queries with proper patterns +tags: rls, performance, security, optimization +--- + +## Optimize RLS Policies for Performance + +Poorly written RLS policies can cause severe performance issues. Use subqueries and indexes strategically. + +**Incorrect (function called for every row):** + +```sql +create policy orders_policy on orders + using (auth.uid() = user_id); -- auth.uid() called per row! + +-- With 1M rows, auth.uid() is called 1M times +``` + +**Correct (wrap functions in SELECT):** + +```sql +create policy orders_policy on orders + using ((select auth.uid()) = user_id); -- Called once, cached + +-- 100x+ faster on large tables +``` + +Use security definer functions for complex checks: + +```sql +-- Create helper function (runs as definer, bypasses RLS) +create or replace function is_team_member(team_id bigint) +returns boolean +language sql +security definer +set search_path = '' +as $$ + select exists ( + select 1 from public.team_members + where team_id = $1 and user_id = (select auth.uid()) + ); +$$; + +-- Use in policy (indexed lookup, not per-row check) +create policy team_orders_policy on orders + using ((select is_team_member(team_id))); +``` + +Always add indexes on columns used in RLS policies: + +```sql +create index orders_user_id_idx on orders (user_id); +``` + +Reference: [RLS Performance](https://supabase.com/docs/guides/database/postgres/row-level-security#rls-performance-recommendations) diff --git a/.claude/skills/supabase-postgres-best-practices b/.claude/skills/supabase-postgres-best-practices new file mode 120000 index 0000000..4990773 --- /dev/null +++ b/.claude/skills/supabase-postgres-best-practices @@ -0,0 +1 @@ +../../.agents/skills/supabase-postgres-best-practices \ No newline at end of file diff --git a/.codebuddy/skills/supabase-postgres-best-practices b/.codebuddy/skills/supabase-postgres-best-practices new file mode 120000 index 0000000..4990773 --- /dev/null +++ b/.codebuddy/skills/supabase-postgres-best-practices @@ -0,0 +1 @@ +../../.agents/skills/supabase-postgres-best-practices \ No newline at end of file diff --git a/.commandcode/skills/supabase-postgres-best-practices b/.commandcode/skills/supabase-postgres-best-practices new file mode 120000 index 0000000..4990773 --- /dev/null +++ b/.commandcode/skills/supabase-postgres-best-practices @@ -0,0 +1 @@ +../../.agents/skills/supabase-postgres-best-practices \ No newline at end of file diff --git a/.continue/skills/supabase-postgres-best-practices b/.continue/skills/supabase-postgres-best-practices new file mode 120000 index 0000000..4990773 --- /dev/null +++ b/.continue/skills/supabase-postgres-best-practices @@ -0,0 +1 @@ +../../.agents/skills/supabase-postgres-best-practices \ No newline at end of file diff --git a/.crush/skills/supabase-postgres-best-practices b/.crush/skills/supabase-postgres-best-practices new file mode 120000 index 0000000..4990773 --- /dev/null +++ b/.crush/skills/supabase-postgres-best-practices @@ -0,0 +1 @@ +../../.agents/skills/supabase-postgres-best-practices \ No newline at end of file diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..b8cee73 --- /dev/null +++ b/.env.example @@ -0,0 +1,3 @@ +VITE_SUPABASE_URL= +VITE_SUPABASE_ANON_KEY= +VITE_SUPABASE_SCHEMA= diff --git a/.factory/skills/supabase-postgres-best-practices b/.factory/skills/supabase-postgres-best-practices new file mode 120000 index 0000000..4990773 --- /dev/null +++ b/.factory/skills/supabase-postgres-best-practices @@ -0,0 +1 @@ +../../.agents/skills/supabase-postgres-best-practices \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..868bfeb --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Env files +.env +.env.* +!.env.example + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.goose/skills/supabase-postgres-best-practices b/.goose/skills/supabase-postgres-best-practices new file mode 120000 index 0000000..4990773 --- /dev/null +++ b/.goose/skills/supabase-postgres-best-practices @@ -0,0 +1 @@ +../../.agents/skills/supabase-postgres-best-practices \ No newline at end of file diff --git a/.kilocode/skills/supabase-postgres-best-practices b/.kilocode/skills/supabase-postgres-best-practices new file mode 120000 index 0000000..4990773 --- /dev/null +++ b/.kilocode/skills/supabase-postgres-best-practices @@ -0,0 +1 @@ +../../.agents/skills/supabase-postgres-best-practices \ No newline at end of file diff --git a/.kiro/skills/supabase-postgres-best-practices b/.kiro/skills/supabase-postgres-best-practices new file mode 120000 index 0000000..4990773 --- /dev/null +++ b/.kiro/skills/supabase-postgres-best-practices @@ -0,0 +1 @@ +../../.agents/skills/supabase-postgres-best-practices \ No newline at end of file diff --git a/.mcpjam/skills/supabase-postgres-best-practices b/.mcpjam/skills/supabase-postgres-best-practices new file mode 120000 index 0000000..4990773 --- /dev/null +++ b/.mcpjam/skills/supabase-postgres-best-practices @@ -0,0 +1 @@ +../../.agents/skills/supabase-postgres-best-practices \ No newline at end of file diff --git a/.mux/skills/supabase-postgres-best-practices b/.mux/skills/supabase-postgres-best-practices new file mode 120000 index 0000000..4990773 --- /dev/null +++ b/.mux/skills/supabase-postgres-best-practices @@ -0,0 +1 @@ +../../.agents/skills/supabase-postgres-best-practices \ No newline at end of file diff --git a/.neovate/skills/supabase-postgres-best-practices b/.neovate/skills/supabase-postgres-best-practices new file mode 120000 index 0000000..4990773 --- /dev/null +++ b/.neovate/skills/supabase-postgres-best-practices @@ -0,0 +1 @@ +../../.agents/skills/supabase-postgres-best-practices \ No newline at end of file diff --git a/.openhands/skills/supabase-postgres-best-practices b/.openhands/skills/supabase-postgres-best-practices new file mode 120000 index 0000000..4990773 --- /dev/null +++ b/.openhands/skills/supabase-postgres-best-practices @@ -0,0 +1 @@ +../../.agents/skills/supabase-postgres-best-practices \ No newline at end of file diff --git a/.pi/skills/supabase-postgres-best-practices b/.pi/skills/supabase-postgres-best-practices new file mode 120000 index 0000000..4990773 --- /dev/null +++ b/.pi/skills/supabase-postgres-best-practices @@ -0,0 +1 @@ +../../.agents/skills/supabase-postgres-best-practices \ No newline at end of file diff --git a/.qoder/skills/supabase-postgres-best-practices b/.qoder/skills/supabase-postgres-best-practices new file mode 120000 index 0000000..4990773 --- /dev/null +++ b/.qoder/skills/supabase-postgres-best-practices @@ -0,0 +1 @@ +../../.agents/skills/supabase-postgres-best-practices \ No newline at end of file diff --git a/.qwen/skills/supabase-postgres-best-practices b/.qwen/skills/supabase-postgres-best-practices new file mode 120000 index 0000000..4990773 --- /dev/null +++ b/.qwen/skills/supabase-postgres-best-practices @@ -0,0 +1 @@ +../../.agents/skills/supabase-postgres-best-practices \ No newline at end of file diff --git a/.roo/skills/supabase-postgres-best-practices b/.roo/skills/supabase-postgres-best-practices new file mode 120000 index 0000000..4990773 --- /dev/null +++ b/.roo/skills/supabase-postgres-best-practices @@ -0,0 +1 @@ +../../.agents/skills/supabase-postgres-best-practices \ No newline at end of file diff --git a/.trae/skills/supabase-postgres-best-practices b/.trae/skills/supabase-postgres-best-practices new file mode 120000 index 0000000..4990773 --- /dev/null +++ b/.trae/skills/supabase-postgres-best-practices @@ -0,0 +1 @@ +../../.agents/skills/supabase-postgres-best-practices \ No newline at end of file diff --git a/.windsurf/skills/supabase-postgres-best-practices b/.windsurf/skills/supabase-postgres-best-practices new file mode 120000 index 0000000..4990773 --- /dev/null +++ b/.windsurf/skills/supabase-postgres-best-practices @@ -0,0 +1 @@ +../../.agents/skills/supabase-postgres-best-practices \ No newline at end of file diff --git a/.zencoder/skills/supabase-postgres-best-practices b/.zencoder/skills/supabase-postgres-best-practices new file mode 120000 index 0000000..4990773 --- /dev/null +++ b/.zencoder/skills/supabase-postgres-best-practices @@ -0,0 +1 @@ +../../.agents/skills/supabase-postgres-best-practices \ No newline at end of file diff --git a/Diseño de calendario.png b/Diseño de calendario.png new file mode 100644 index 0000000000000000000000000000000000000000..57f634115e05088442a35a7ecbe02c59e240ee25 GIT binary patch literal 431590 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

pn2Kxg^L;Fy3j+XJueD>Y&yA%7+@|V``WoRonm# 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 z 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%0AmH~N$`$z@s@Nk|#e0yL-#F9U_>gTNM*{6RtNFui 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

BPv;z3CzU9a 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 literal 0 HcmV?d00001 diff --git a/Ejemplo calendario y vista.png b/Ejemplo calendario y vista.png new file mode 100644 index 0000000000000000000000000000000000000000..8c8ab353dd978f8aec3a8b35f8a11d8ad7ba4584 GIT binary patch literal 39957 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md new file mode 100644 index 0000000..e9227fb --- /dev/null +++ b/README.md @@ -0,0 +1,89 @@ +# Naturcalabacera — Monorepo + +Monorepo with pnpm workspaces. Workspaces: `apps/web`, `apps/api`, `packages/shared`. + +## Getting started + +```bash +pnpm install +pnpm dev:web # start frontend +pnpm dev:api # start API server +pnpm build # build all +pnpm test # run shared package tests +``` + +--- + +## apps/web — React + TypeScript + Vite + +Minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## React Compiler + +The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: + +```js +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + + // Remove tseslint.configs.recommended and replace with this + tseslint.configs.recommendedTypeChecked, + // Alternatively, use this for stricter rules + tseslint.configs.strictTypeChecked, + // Optionally, add this for stylistic rules + tseslint.configs.stylisticTypeChecked, + + // Other configs... + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` + +You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: + +```js +// eslint.config.js +import reactX from 'eslint-plugin-react-x' +import reactDom from 'eslint-plugin-react-dom' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + // Enable lint rules for React + reactX.configs['recommended-typescript'], + // Enable lint rules for React DOM + reactDom.configs.recommended, + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` diff --git a/apps/api/.env.example b/apps/api/.env.example new file mode 100644 index 0000000..ee79242 --- /dev/null +++ b/apps/api/.env.example @@ -0,0 +1,30 @@ +# ───────────────────────────────────────────── +# apps/api — Variables de entorno +# Copia este archivo como .env y rellena los valores. +# NUNCA expongas estas variables al frontend. +# ───────────────────────────────────────────── + +# Servidor +API_PORT=3001 +NODE_ENV=development + +# Supabase (self-hosted) — usar service_role key (bypasea RLS) +SUPABASE_URL=https://tu-supabase.tudominio.com +SUPABASE_SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... + +# Resend — servicio de email +# Crear cuenta en https://resend.com y configurar dominio +RESEND_API_KEY=re_... +EMAIL_FROM=Naturcalabacera + +# Destinatarios de notificaciones (parametrizables, sin hardcodear) +NOTIFICATION_EMAIL_TENERIFFA=contacto-teneriffa@ejemplo.com +NOTIFICATION_EMAIL_NATUR=admin@naturcalabacera.com +NOTIFICATION_EMAIL_POOL_HEATING=jonathan@ejemplo.com # "Jonathan o las chicas" + +# URL del frontend para CORS +WEB_ORIGIN=http://localhost:5173 + +# Jobs — runner de notificaciones +JOB_RUNNER_INTERVAL_MS=300000 # 5 minutos (300000ms) +JOB_MAX_RETRIES=3 diff --git a/apps/api/package.json b/apps/api/package.json new file mode 100644 index 0000000..cbf45b0 --- /dev/null +++ b/apps/api/package.json @@ -0,0 +1,25 @@ +{ + "name": "@naturcalabacera/api", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "tsx watch --env-file=.env src/index.ts", + "build": "tsc", + "start": "node dist/index.js", + "lint": "eslint ." + }, + "dependencies": { + "@naturcalabacera/shared": "workspace:*", + "@supabase/supabase-js": "^2.95.3", + "cors": "^2.8.5", + "express": "^4.21.2" + }, + "devDependencies": { + "@types/cors": "^2.8.18", + "@types/express": "^5.0.0", + "@types/node": "^24.10.1", + "tsx": "^4.19.2", + "typescript": "~5.9.3" + } +} diff --git a/apps/api/src/config/env.ts b/apps/api/src/config/env.ts new file mode 100644 index 0000000..b25325c --- /dev/null +++ b/apps/api/src/config/env.ts @@ -0,0 +1,40 @@ +/** + * Configuración centralizada de variables de entorno. + * Falla al arrancar si faltan variables críticas. + */ + +function required(name: string): string { + const value = process.env[name]; + if (!value) throw new Error(`Variable de entorno requerida: ${name}`); + return value; +} + +function optional(name: string, defaultValue: string): string { + return process.env[name] ?? defaultValue; +} + +export const env = { + // Servidor + PORT: parseInt(optional('API_PORT', '3001'), 10), + NODE_ENV: optional('NODE_ENV', 'development'), + + // Supabase (self-hosted) + SUPABASE_URL: required('SUPABASE_URL'), + SUPABASE_SERVICE_ROLE_KEY: required('SUPABASE_SERVICE_ROLE_KEY'), + + // Email — Resend + RESEND_API_KEY: required('RESEND_API_KEY'), + EMAIL_FROM: optional('EMAIL_FROM', 'Naturcalabacera '), + + // Destinatarios de notificaciones (configurables, sin hardcodear) + NOTIFICATION_EMAIL_TENERIFFA: required('NOTIFICATION_EMAIL_TENERIFFA'), + NOTIFICATION_EMAIL_NATUR: required('NOTIFICATION_EMAIL_NATUR'), + NOTIFICATION_EMAIL_POOL_HEATING: required('NOTIFICATION_EMAIL_POOL_HEATING'), + + // Jobs + JOB_RUNNER_INTERVAL_MS: parseInt(optional('JOB_RUNNER_INTERVAL_MS', '300000'), 10), // 5 min + JOB_MAX_RETRIES: parseInt(optional('JOB_MAX_RETRIES', '3'), 10), + + // Origen del frontend para CORS + WEB_ORIGIN: optional('WEB_ORIGIN', 'http://localhost:5173'), +}; diff --git a/apps/api/src/events/handler.ts b/apps/api/src/events/handler.ts new file mode 100644 index 0000000..5ea693b --- /dev/null +++ b/apps/api/src/events/handler.ts @@ -0,0 +1,252 @@ +import { readFileSync } from 'fs'; +import { join, dirname } from 'path'; +import { fileURLToPath } from 'url'; +import { sendEmail } from '../services/email.js'; +import { env } from '../config/env.js'; +import type { Reservation, NotificationEventType } from '@naturcalabacera/shared'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const TEMPLATES_DIR = join(__dirname, '../templates'); + +/** + * Carga un template HTML y reemplaza las variables {{VARIABLE}}. + */ +function renderTemplate(templateName: string, vars: Record): string { + const filePath = join(TEMPLATES_DIR, `${templateName}.html`); + let html = readFileSync(filePath, 'utf-8'); + for (const [key, value] of Object.entries(vars)) { + html = html.replaceAll(`{{${key}}}`, value); + } + return html; +} + +function formatDate(dateStr: string): string { + const date = new Date(dateStr + 'T12:00:00Z'); + return date.toLocaleDateString('es-ES', { day: '2-digit', month: 'long', year: 'numeric' }); +} + +function formatDateShort(dateStr: string): string { + const date = new Date(dateStr + 'T12:00:00Z'); + return date.toLocaleDateString('es-ES', { day: '2-digit', month: 'short', year: 'numeric' }); +} + +function propertyLabel(property: string): string { + return property === 'los_dragos' ? 'Los Dragos' : 'La Esquinita'; +} + +function nightsCount(start: string, end: string): string { + const d1 = new Date(start + 'T12:00:00Z'); + const d2 = new Date(end + 'T12:00:00Z'); + const nights = Math.round((d2.getTime() - d1.getTime()) / (1000 * 60 * 60 * 24)); + return `${nights} noche${nights === 1 ? '' : 's'}`; +} + +function formatFieldValue(field: string, value: unknown): string { + if (value === null || value === undefined || value === '') return '—'; + if (field === 'start_date' || field === 'end_date') return formatDate(String(value)); + if (field === 'property') return propertyLabel(String(value)); + if (field === 'origin') return value === 'Teneriffa2000' ? 'Teneriffa' : 'Natur'; + if (typeof value === 'boolean') return value ? 'Sí' : 'No'; + return String(value); +} + +/** + * Genera el bloque HTML con la tabla de cambios entre dos versiones de reserva. + * Se incluye solo en emails de tipo "modificada". + */ +function buildChangesBlock(prev: Reservation, curr: Reservation): string { + const FIELD_LABELS: Record = { + client_name: 'Cliente', + start_date: 'Fecha de entrada', + end_date: 'Fecha de salida', + property: 'Propiedad', + adults_count: 'Adultos', + children_count: 'Niños', + has_cleaning: 'Limpieza incluida', + has_pool_heating: 'Calefacción de piscina', + has_flies_products: 'Productos antiparasitarios', + government_registration: 'Registro gubernamental', + observations: 'Observaciones', + is_event: 'Es evento', + event_type: 'Tipo de evento', + attendees_count: 'Nº asistentes', + }; + + const changes: Array<{ label: string; from: string; to: string }> = []; + + for (const [field, label] of Object.entries(FIELD_LABELS)) { + const prevVal = (prev as Record)[field]; + const currVal = (curr as Record)[field]; + const prevStr = formatFieldValue(field, prevVal); + const currStr = formatFieldValue(field, currVal); + if (prevStr !== currStr) { + changes.push({ label, from: prevStr, to: currStr }); + } + } + + if (changes.length === 0) { + return `

Sin cambios detectados en los datos principales.

`; + } + + let rows = ''; + for (const { label, from, to } of changes) { + rows += ` + + ${label} + ${from} + ${to} + `; + } + + return ` +
+

Cambios realizados

+ + + + + + + + + ${rows} +
CampoAntesAhora
+
`; +} + +/** + * Genera el bloque HTML de observaciones si existen. + */ +function buildObservationsBlock(observations?: string): string { + if (!observations || observations.trim() === '') return ''; + return ` +
+

Observaciones

+

${observations}

+
`; +} + +/** + * Genera la lista de servicios adicionales de la reserva. + */ +function buildServicesText(r: Reservation): string { + const services: string[] = []; + if (r.has_cleaning) services.push('Limpieza'); + if (r.has_pool_heating) services.push('Calefacción piscina'); + if (r.has_flies_products) services.push('Antiparasitarios'); + if (r.is_event && r.event_type) { + const label = r.event_type === 'Otro' ? `Evento: ${r.event_type_other ?? 'otro'}` : `Evento: ${r.event_type}`; + services.push(label); + } + return services.length > 0 ? services.join(' · ') : '—'; +} + +interface SendResult { + success: boolean; + error?: string; +} + +/** + * Envía el email correspondiente a un evento de notificación. + * Para reservation.updated acepta previousReservation para mostrar el diff. + */ +export async function handleNotificationEvent( + eventType: NotificationEventType, + reservation: Reservation, + previousReservation?: Reservation +): Promise { + const nights = nightsCount(reservation.start_date, reservation.end_date); + const dateRange = `${formatDateShort(reservation.start_date)} – ${formatDateShort(reservation.end_date)}`; + + const baseVars: Record = { + CLIENT_NAME: reservation.client_name, + START_DATE: formatDate(reservation.start_date), + END_DATE: formatDate(reservation.end_date), + PROPERTY: propertyLabel(reservation.property), + ORIGIN: reservation.origin === 'Teneriffa2000' ? 'Teneriffa' : 'Natur', + ADULTS: String(reservation.adults_count), + CHILDREN: String(reservation.children_count), + TOTAL_PERSONS: String(reservation.adults_count + reservation.children_count), + RESERVATION_ID: reservation.id, + INVOICE_NUMBER: reservation.invoice_number ?? '—', + NIGHTS: nights, + DATE_RANGE: dateRange, + SERVICES: buildServicesText(reservation), + GOVERNMENT_REG: reservation.government_registration ?? '—', + OBSERVATIONS_BLOCK: buildObservationsBlock(reservation.observations), + CHANGES_BLOCK: '', + CANCEL_ALERT: '', + }; + + switch (eventType) { + case 'reservation.created': { + const isTeenriffa = reservation.origin === 'Teneriffa2000'; + const template = isTeenriffa ? 'teneriffa-crud' : 'natur-crud'; + const originLabel = isTeenriffa ? 'Teneriffa' : 'Natur'; + const vars = { + ...baseVars, + ACTION: 'creada', + ACTION_LABEL: 'Nueva Reserva', + CHANGES_BLOCK: '', + }; + const html = renderTemplate(template, vars); + const subject = `[NUEVA RESERVA] ${originLabel} — ${reservation.client_name} | ${propertyLabel(reservation.property)} | ${dateRange}`; + return sendEmail({ to: [env.NOTIFICATION_EMAIL_TENERIFFA, env.NOTIFICATION_EMAIL_NATUR], subject, html }); + } + + case 'reservation.updated': { + const isTeenriffa = reservation.origin === 'Teneriffa2000'; + const template = isTeenriffa ? 'teneriffa-crud' : 'natur-crud'; + const originLabel = isTeenriffa ? 'Teneriffa' : 'Natur'; + const changesBlock = previousReservation + ? buildChangesBlock(previousReservation, reservation) + : `

No se recibieron datos anteriores para comparar.

`; + const vars = { + ...baseVars, + ACTION: 'modificada', + ACTION_LABEL: 'Reserva Modificada', + CHANGES_BLOCK: changesBlock, + }; + const html = renderTemplate(template, vars); + const subject = `[MODIFICADA] ${originLabel} — ${reservation.client_name} | ${propertyLabel(reservation.property)} | ${dateRange}`; + return sendEmail({ to: [env.NOTIFICATION_EMAIL_TENERIFFA, env.NOTIFICATION_EMAIL_NATUR], subject, html }); + } + + case 'reservation.cancelled': { + const isTeenriffa = reservation.origin === 'Teneriffa2000'; + const template = isTeenriffa ? 'teneriffa-crud' : 'natur-crud'; + const originLabel = isTeenriffa ? 'Teneriffa' : 'Natur'; + const vars = { + ...baseVars, + ACTION: 'cancelada', + ACTION_LABEL: 'Reserva Cancelada', + CHANGES_BLOCK: '', + CANCEL_ALERT: `

Esta reserva ha sido cancelada y eliminada del sistema.

`, + }; + const html = renderTemplate(template, vars); + const subject = `[CANCELADA] ${originLabel} — ${reservation.client_name} | ${propertyLabel(reservation.property)} | ${dateRange}`; + return sendEmail({ to: [env.NOTIFICATION_EMAIL_TENERIFFA, env.NOTIFICATION_EMAIL_NATUR], subject, html }); + } + + case 'reservation.reminder_24h': { + const html = renderTemplate('reminder-24h', baseVars); + const subject = `Recordatorio: Check-in mañana — ${reservation.client_name} (Los Dragos)`; + return sendEmail({ to: env.NOTIFICATION_EMAIL_TENERIFFA, subject, html }); + } + + case 'reservation.invoice_second_notice': { + const html = renderTemplate('invoice-10d', baseVars); + const subject = `Segunda factura en 10 días — ${reservation.client_name} (${propertyLabel(reservation.property)})`; + return sendEmail({ to: env.NOTIFICATION_EMAIL_NATUR, subject, html }); + } + + case 'reservation.pool_heating_notice': { + const html = renderTemplate('pool-heating-48h', baseVars); + const subject = `Calefacción de piscina en 48h — ${reservation.client_name} (${propertyLabel(reservation.property)})`; + return sendEmail({ to: env.NOTIFICATION_EMAIL_POOL_HEATING, subject, html }); + } + + default: + return { success: false, error: `Tipo de evento desconocido: ${eventType}` }; + } +} diff --git a/apps/api/src/events/types.ts b/apps/api/src/events/types.ts new file mode 100644 index 0000000..ec479eb --- /dev/null +++ b/apps/api/src/events/types.ts @@ -0,0 +1,67 @@ +import type { NotificationEventType } from '@naturcalabacera/shared'; +import type { Reservation, ReservationOrigin, Property } from '@naturcalabacera/shared'; + +export type CrudOperation = 'created' | 'updated' | 'cancelled'; + +/** + * Condiciones que determinan si se envía un evento de notificación. + * Permiten evaluar de forma declarativa sin dispersar la lógica. + */ +export interface NotificationCondition { + origin?: ReservationOrigin; + property?: Property; + hasPoolHeating?: boolean; +} + +/** + * Descriptor de cada tipo de evento: + * - conditions: cuándo se dispara + * - recipientEnvKey: qué env var contiene el destinatario + * - templateName: nombre del template HTML + * - offsetDays: días antes del check-in (para eventos programados; undefined = inmediato) + */ +export interface EventDescriptor { + eventType: NotificationEventType; + conditions: NotificationCondition; + recipientEnvKey: 'NOTIFICATION_EMAIL_TENERIFFA' | 'NOTIFICATION_EMAIL_NATUR' | 'NOTIFICATION_EMAIL_POOL_HEATING'; + templateName: string; + offsetDays?: number; // undefined = disparo inmediato (CRUD) +} + +/** + * Mapa declarativo de todos los eventos del sistema. + * Añadir un nuevo tipo de notificación = añadir una entrada aquí. + */ +export const EVENT_DESCRIPTORS: EventDescriptor[] = [ + { + eventType: 'reservation.reminder_24h', + conditions: { origin: 'Teneriffa2000', property: 'los_dragos' }, + recipientEnvKey: 'NOTIFICATION_EMAIL_TENERIFFA', + templateName: 'reminder-24h', + offsetDays: 1, + }, + { + eventType: 'reservation.invoice_second_notice', + conditions: { origin: 'Naturcalabacera' }, + recipientEnvKey: 'NOTIFICATION_EMAIL_NATUR', + templateName: 'invoice-10d', + offsetDays: 10, + }, + { + eventType: 'reservation.pool_heating_notice', + conditions: { hasPoolHeating: true }, + recipientEnvKey: 'NOTIFICATION_EMAIL_POOL_HEATING', + templateName: 'pool-heating-48h', + offsetDays: 2, + }, +]; + +/** + * Evalúa si una reserva cumple las condiciones de un descriptor de evento. + */ +export function matchesConditions(reservation: Reservation, conditions: NotificationCondition): boolean { + if (conditions.origin && reservation.origin !== conditions.origin) return false; + if (conditions.property && reservation.property !== conditions.property) return false; + if (conditions.hasPoolHeating !== undefined && reservation.has_pool_heating !== conditions.hasPoolHeating) return false; + return true; +} diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts new file mode 100644 index 0000000..1793f25 --- /dev/null +++ b/apps/api/src/index.ts @@ -0,0 +1,38 @@ +import express from 'express'; +import cors from 'cors'; +import { env } from './config/env.js'; +import { healthRouter } from './routes/health.js'; +import { notificationsRouter } from './routes/notifications.js'; +import { usersRouter } from './routes/users.js'; +import { runPendingJobs } from './jobs/runner.js'; + +const app = express(); + +// Middlewares +const allowedOrigin = env.NODE_ENV === 'development' + ? (origin: string | undefined, cb: (e: Error | null, ok?: boolean) => void) => cb(null, true) + : env.WEB_ORIGIN; +app.use(cors({ origin: allowedOrigin, credentials: true })); +app.use(express.json()); + +// Rutas +app.use('/health', healthRouter); +app.use('/api/notifications', notificationsRouter); +app.use('/api/users', usersRouter); + +// Arrancar servidor +app.listen(env.PORT, () => { + console.log(`[api] Servidor iniciado en puerto ${env.PORT} (${env.NODE_ENV})`); +}); + +// Job runner — procesa notificaciones pendientes cada JOB_RUNNER_INTERVAL_MS +// Solo una instancia debería ejecutarlo; el locking en BD evita duplicados si hay varias. +console.log(`[api] Job runner iniciado (intervalo: ${env.JOB_RUNNER_INTERVAL_MS / 1000}s)`); + +// Primera ejecución inmediata +runPendingJobs().catch(err => console.error('[jobs] Error en primera ejecución:', err)); + +// Ejecuciones periódicas +setInterval(() => { + runPendingJobs().catch(err => console.error('[jobs] Error en runner:', err)); +}, env.JOB_RUNNER_INTERVAL_MS); diff --git a/apps/api/src/jobs/runner.ts b/apps/api/src/jobs/runner.ts new file mode 100644 index 0000000..5cd3821 --- /dev/null +++ b/apps/api/src/jobs/runner.ts @@ -0,0 +1,168 @@ +import { supabaseAdmin } from '../lib/supabase.js'; +import { handleNotificationEvent } from '../events/handler.js'; +import { env } from '../config/env.js'; +import type { NotificationEventType, Reservation } from '@naturcalabacera/shared'; + +/** + * Runner de jobs con garantías de idempotencia y robustez: + * + * - Selecciona eventos pendientes con FOR UPDATE SKIP LOCKED (via RPC) + * para que múltiples instancias no procesen el mismo evento. + * - Actualiza status a 'processing' antes de procesar. + * - En éxito: status = 'sent'. En fallo: incrementa attempts, registra error. + * - Reintentos máximos configurables (JOB_MAX_RETRIES). + * - Todas las comparaciones de fechas en UTC. + */ + +interface NotificationRow { + id: string; + reservation_id: string; + event_type: NotificationEventType; + attempts: number; +} + +export async function runPendingJobs(): Promise { + const now = new Date().toISOString(); + + // Selecciona hasta 10 eventos pendientes cuyo scheduled_for ya ha pasado + // y que no hayan superado el máximo de reintentos + const { data: events, error: fetchError } = await supabaseAdmin + .from('notification_events') + .select('id, reservation_id, event_type, attempts') + .eq('status', 'pending') + .lte('scheduled_for', now) + .lt('attempts', env.JOB_MAX_RETRIES) + .order('scheduled_for', { ascending: true }) + .limit(10); + + if (fetchError) { + console.error('[jobs] Error al obtener eventos pendientes:', fetchError.message); + return; + } + + if (!events || events.length === 0) return; + + console.log(`[jobs] Procesando ${events.length} evento(s)...`); + + for (const event of events as NotificationRow[]) { + // Marcar como 'processing' para evitar que otra instancia lo tome + const { error: lockError } = await supabaseAdmin + .from('notification_events') + .update({ status: 'processing', attempts: event.attempts + 1 }) + .eq('id', event.id) + .eq('status', 'pending'); // Solo actualiza si sigue en pending (evita race) + + if (lockError) { + console.warn(`[jobs] Evento ${event.id} ya tomado por otra instancia`); + continue; + } + + // Obtener la reserva completa + const { data: reservation, error: resError } = await supabaseAdmin + .from('reservations') + .select('*') + .eq('id', event.reservation_id) + .single(); + + if (resError || !reservation) { + await markFailed(event.id, `Reserva no encontrada: ${event.reservation_id}`); + continue; + } + + // Procesar el evento + const result = await handleNotificationEvent(event.event_type, reservation as Reservation); + + if (result.success) { + await supabaseAdmin + .from('notification_events') + .update({ status: 'sent', sent_at: new Date().toISOString() }) + .eq('id', event.id); + console.log(`[jobs] ✓ Evento ${event.event_type} para reserva ${event.reservation_id}`); + } else { + const isLastAttempt = event.attempts + 1 >= env.JOB_MAX_RETRIES; + await supabaseAdmin + .from('notification_events') + .update({ + status: isLastAttempt ? 'failed' : 'pending', + last_error: result.error ?? 'Error desconocido', + }) + .eq('id', event.id); + console.error(`[jobs] ✗ Evento ${event.event_type}: ${result.error}`); + } + } +} + +async function markFailed(eventId: string, error: string): Promise { + await supabaseAdmin + .from('notification_events') + .update({ status: 'failed', last_error: error }) + .eq('id', eventId); +} + +/** + * Inserta eventos de notificación para una reserva según las condiciones del evento. + * Usa ON CONFLICT DO NOTHING para idempotencia — si ya existe, no hace nada. + */ +export async function scheduleNotificationsForReservation( + reservation: Reservation, + operation: 'created' | 'updated' | 'cancelled' +): Promise { + const eventsToInsert = []; + const startDate = new Date(reservation.start_date + 'T12:00:00Z'); + const now = new Date().toISOString(); + + // El email CRUD se envía directamente en la ruta, no se encola aquí. + + // 2. Recordatorio 24h antes — solo Teneriffa + Los Dragos + if (reservation.origin === 'Teneriffa2000' && reservation.property === 'los_dragos') { + const scheduled = new Date(startDate); + scheduled.setUTCHours(scheduled.getUTCHours() - 24); + if (scheduled > new Date()) { + eventsToInsert.push({ + reservation_id: reservation.id, + event_type: 'reservation.reminder_24h', + scheduled_for: scheduled.toISOString(), + status: 'pending', + }); + } + } + + // 3. Segunda factura 10 días antes — solo Natur + if (reservation.origin === 'Naturcalabacera') { + const scheduled = new Date(startDate); + scheduled.setUTCDate(scheduled.getUTCDate() - 10); + if (scheduled > new Date()) { + eventsToInsert.push({ + reservation_id: reservation.id, + event_type: 'reservation.invoice_second_notice', + scheduled_for: scheduled.toISOString(), + status: 'pending', + }); + } + } + + // 4. Aviso calefacción piscina 48h antes + if (reservation.has_pool_heating) { + const scheduled = new Date(startDate); + scheduled.setUTCHours(scheduled.getUTCHours() - 48); + if (scheduled > new Date()) { + eventsToInsert.push({ + reservation_id: reservation.id, + event_type: 'reservation.pool_heating_notice', + scheduled_for: scheduled.toISOString(), + status: 'pending', + }); + } + } + + if (eventsToInsert.length === 0) return; + + // onConflict con la constraint UNIQUE(reservation_id, event_type, scheduled_for) + const { error } = await supabaseAdmin + .from('notification_events') + .upsert(eventsToInsert, { onConflict: 'reservation_id,event_type,scheduled_for', ignoreDuplicates: true }); + + if (error) { + console.error('[jobs] Error al insertar notification_events:', error.message); + } +} diff --git a/apps/api/src/lib/supabase.ts b/apps/api/src/lib/supabase.ts new file mode 100644 index 0000000..49a0b7e --- /dev/null +++ b/apps/api/src/lib/supabase.ts @@ -0,0 +1,19 @@ +import { createClient } from '@supabase/supabase-js'; +import { env } from '../config/env.js'; + +/** + * Cliente Supabase con service_role key. + * Solo usar en el backend — nunca exponer al frontend. + * Bypasea RLS: úsalo con precaución. + */ +export const supabaseAdmin = createClient( + env.SUPABASE_URL, + env.SUPABASE_SERVICE_ROLE_KEY, + { + db: { schema: 'natur_reservas' }, + auth: { + autoRefreshToken: false, + persistSession: false, + }, + } +); diff --git a/apps/api/src/routes/health.ts b/apps/api/src/routes/health.ts new file mode 100644 index 0000000..eb7d3c0 --- /dev/null +++ b/apps/api/src/routes/health.ts @@ -0,0 +1,9 @@ +import { Router } from 'express'; + +const router = Router(); + +router.get('/', (_req, res) => { + res.json({ status: 'ok', timestamp: new Date().toISOString() }); +}); + +export { router as healthRouter }; diff --git a/apps/api/src/routes/notifications.ts b/apps/api/src/routes/notifications.ts new file mode 100644 index 0000000..3011996 --- /dev/null +++ b/apps/api/src/routes/notifications.ts @@ -0,0 +1,67 @@ +import { Router } from 'express'; +import { scheduleNotificationsForReservation } from '../jobs/runner.js'; +import { handleNotificationEvent } from '../events/handler.js'; +import { supabaseAdmin } from '../lib/supabase.js'; +import type { Reservation } from '@naturcalabacera/shared'; + +const router = Router(); + +/** + * POST /api/notifications/reservation-event + * + * Llamado por el frontend tras cada operación CRUD exitosa. + * - Envía el email CRUD inmediatamente (sin pasar por la cola) + * - Encola los eventos futuros (recordatorios, facturas, etc.) + * + * Body: { reservation: Reservation, operation: 'created' | 'updated' | 'cancelled' } + */ +router.post('/reservation-event', async (req, res) => { + const { reservation, operation, previousReservation } = req.body as { + reservation: Reservation; + operation: 'created' | 'updated' | 'cancelled'; + previousReservation?: Reservation; + }; + + if (!reservation || !operation) { + return res.status(400).json({ error: 'reservation y operation son requeridos' }); + } + + if (!['created', 'updated', 'cancelled'].includes(operation)) { + return res.status(400).json({ error: 'operation debe ser created, updated o cancelled' }); + } + + try { + // Enviar email CRUD al momento, sin esperar al job runner + const eventType = `reservation.${operation}` as const; + const now = new Date().toISOString(); + const emailResult = await handleNotificationEvent(eventType, reservation, previousReservation); + + // Registrar el evento en notification_events (historial) + await supabaseAdmin.from('notification_events').insert({ + reservation_id: reservation.id, + event_type: eventType, + scheduled_for: now, + status: emailResult.success ? 'sent' : 'failed', + sent_at: emailResult.success ? now : null, + last_error: emailResult.success ? null : (emailResult.error ?? 'Error desconocido'), + attempts: 1, + }); + + if (!emailResult.success) { + console.error(`[notifications] Email CRUD fallido: ${emailResult.error}`); + } else { + console.log(`[notifications] ✓ Email enviado para ${eventType} — ${reservation.client_name}`); + } + + // Encolar eventos futuros (recordatorios, avisos, etc.) + await scheduleNotificationsForReservation(reservation, operation); + + return res.json({ ok: true }); + } catch (err) { + const message = err instanceof Error ? err.message : 'Error interno'; + console.error('[notifications] Error:', message); + return res.status(500).json({ error: message }); + } +}); + +export { router as notificationsRouter }; diff --git a/apps/api/src/routes/users.ts b/apps/api/src/routes/users.ts new file mode 100644 index 0000000..541bc81 --- /dev/null +++ b/apps/api/src/routes/users.ts @@ -0,0 +1,154 @@ +import { Router, type Request, type Response, type NextFunction } from 'express'; +import { supabaseAdmin } from '../lib/supabase.js'; +import type { UserRole } from '@naturcalabacera/shared'; + +const router = Router(); + +const VALID_ROLES: UserRole[] = ['admin', 'internal_staff', 'external_availability_viewer']; + +/** + * Middleware: extrae el JWT del header Authorization, valida la sesión con + * Supabase y comprueba que el usuario es admin. Si pasa, deja el id del + * caller en res.locals.callerId. + */ +async function requireAdmin(req: Request, res: Response, next: NextFunction): Promise { + const auth = req.headers.authorization; + if (!auth || !auth.startsWith('Bearer ')) { + res.status(401).json({ error: 'Falta token de autenticación' }); + return; + } + const token = auth.slice('Bearer '.length); + + const { data: userData, error: userError } = await supabaseAdmin.auth.getUser(token); + if (userError || !userData.user) { + res.status(401).json({ error: 'Token inválido' }); + return; + } + + const { data: profile, error: profileError } = await supabaseAdmin + .from('user_profiles') + .select('role') + .eq('id', userData.user.id) + .single(); + + if (profileError || !profile) { + res.status(403).json({ error: 'Perfil no encontrado' }); + return; + } + + if (profile.role !== 'admin') { + res.status(403).json({ error: 'Solo admins pueden gestionar usuarios' }); + return; + } + + res.locals.callerId = userData.user.id; + next(); +} + +// GET /api/users — listar todos los perfiles +router.get('/', requireAdmin, async (_req, res) => { + const { data, error } = await supabaseAdmin + .from('user_profiles') + .select('id, email, role, display_name, created_at') + .order('created_at', { ascending: false }); + + if (error) { + return res.status(500).json({ error: error.message }); + } + return res.json({ users: data ?? [] }); +}); + +// POST /api/users/invite — invitar un usuario nuevo +router.post('/invite', requireAdmin, async (req, res) => { + const { email, role, display_name } = req.body as { + email?: string; + role?: UserRole; + display_name?: string; + }; + + if (!email || !role) { + return res.status(400).json({ error: 'email y role son requeridos' }); + } + if (!VALID_ROLES.includes(role)) { + return res.status(400).json({ error: 'Rol inválido' }); + } + + // 1. Invitar al usuario por email (envía correo con magic link) + const { data: invited, error: inviteError } = await supabaseAdmin.auth.admin.inviteUserByEmail(email); + if (inviteError || !invited.user) { + return res.status(400).json({ error: inviteError?.message ?? 'Error al invitar usuario' }); + } + + // 2. Crear el perfil con el rol seleccionado + const { data: profile, error: profileError } = await supabaseAdmin + .from('user_profiles') + .insert({ + id: invited.user.id, + email, + role, + display_name: display_name ?? null, + }) + .select() + .single(); + + if (profileError) { + // Best-effort cleanup: eliminar el usuario auth si el perfil falló + await supabaseAdmin.auth.admin.deleteUser(invited.user.id).catch(() => {}); + return res.status(500).json({ error: profileError.message }); + } + + return res.status(201).json({ user: profile }); +}); + +// PATCH /api/users/:id — actualizar rol o display_name +router.patch('/:id', requireAdmin, async (req, res) => { + const { id } = req.params; + const { role, display_name } = req.body as { + role?: UserRole; + display_name?: string; + }; + + if (role !== undefined && !VALID_ROLES.includes(role)) { + return res.status(400).json({ error: 'Rol inválido' }); + } + + const updates: Record = {}; + if (role !== undefined) updates.role = role; + if (display_name !== undefined) updates.display_name = display_name; + + if (Object.keys(updates).length === 0) { + return res.status(400).json({ error: 'Nada que actualizar' }); + } + + const { data, error } = await supabaseAdmin + .from('user_profiles') + .update(updates) + .eq('id', id) + .select() + .single(); + + if (error) { + return res.status(500).json({ error: error.message }); + } + return res.json({ user: data }); +}); + +// DELETE /api/users/:id — eliminar usuario auth + perfil +router.delete('/:id', requireAdmin, async (req, res) => { + const id = req.params.id as string; + const callerId = res.locals.callerId as string; + + if (id === callerId) { + return res.status(400).json({ error: 'No puedes eliminar tu propia cuenta' }); + } + + // ON DELETE CASCADE en user_profiles.id elimina el perfil al eliminar el usuario auth. + const { error } = await supabaseAdmin.auth.admin.deleteUser(id); + if (error) { + return res.status(500).json({ error: error.message }); + } + + return res.json({ ok: true }); +}); + +export { router as usersRouter }; diff --git a/apps/api/src/services/email.ts b/apps/api/src/services/email.ts new file mode 100644 index 0000000..c7fe816 --- /dev/null +++ b/apps/api/src/services/email.ts @@ -0,0 +1,50 @@ +import { env } from '../config/env.js'; + +interface SendEmailOptions { + to: string | string[]; + subject: string; + html: string; + replyTo?: string; +} + +interface ResendResponse { + id?: string; + error?: { message: string; name: string }; +} + +/** + * Envía un email usando la API de Resend. + * Docs: https://resend.com/docs/api-reference/emails/send-email + */ +export async function sendEmail(options: SendEmailOptions): Promise<{ success: boolean; id?: string; error?: string }> { + try { + const res = await fetch('https://api.resend.com/emails', { + method: 'POST', + headers: { + 'Authorization': `Bearer ${env.RESEND_API_KEY}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + from: env.EMAIL_FROM, + to: Array.isArray(options.to) ? options.to : [options.to], + subject: options.subject, + html: options.html, + ...(options.replyTo && { reply_to: options.replyTo }), + }), + }); + + const data = await res.json() as ResendResponse; + + if (!res.ok || data.error) { + const errorMsg = data.error?.message ?? `HTTP ${res.status}`; + console.error('[email] Error al enviar:', errorMsg); + return { success: false, error: errorMsg }; + } + + return { success: true, id: data.id }; + } catch (err) { + const errorMsg = err instanceof Error ? err.message : 'Error desconocido'; + console.error('[email] Error de red:', errorMsg); + return { success: false, error: errorMsg }; + } +} diff --git a/apps/api/src/templates/invoice-10d.html b/apps/api/src/templates/invoice-10d.html new file mode 100644 index 0000000..e22d750 --- /dev/null +++ b/apps/api/src/templates/invoice-10d.html @@ -0,0 +1,64 @@ + + + + + Segunda Factura en 10 días + + + +
+
+

📋 Segunda Factura — Natur

+

Aviso automático 10 días antes · Naturcalabacera

+
+
+
+ Aviso: La reserva de {{CLIENT_NAME}} comienza en 10 días. Pendiente segunda factura. +
+
+
+ + {{CLIENT_NAME}} +
+
+ + {{PROPERTY}} +
+
+ + {{INVOICE_NUMBER}} +
+
+ + {{TOTAL_PERSONS}} +
+
+ + {{START_DATE}} +
+
+ + {{END_DATE}} +
+
+
+ +
+ + diff --git a/apps/api/src/templates/natur-crud.html b/apps/api/src/templates/natur-crud.html new file mode 100644 index 0000000..706c9c5 --- /dev/null +++ b/apps/api/src/templates/natur-crud.html @@ -0,0 +1,120 @@ + + + + + {{ACTION_LABEL}} — Natur + + + +
+ + +
+
{{ACTION_LABEL}}
+

{{CLIENT_NAME}}

+

{{PROPERTY}}  ·  {{NIGHTS}}  ·  Natur

+

{{DATE_RANGE}}

+
+ +
+ + + {{CANCEL_ALERT}} + + +

Datos de la reserva

+
+
+ + {{PROPERTY}} +
+
+ + {{INVOICE_NUMBER}} +
+
+ + {{START_DATE}} +
+
+ + {{END_DATE}} +
+
+ + {{ADULTS}} +
+
+ + {{CHILDREN}} +
+
+ + {{GOVERNMENT_REG}} +
+
+ + {{SERVICES}} +
+
+ + + {{OBSERVATIONS_BLOCK}} + + + {{CHANGES_BLOCK}} + +
+ + +
+ + diff --git a/apps/api/src/templates/pool-heating-48h.html b/apps/api/src/templates/pool-heating-48h.html new file mode 100644 index 0000000..8e52a17 --- /dev/null +++ b/apps/api/src/templates/pool-heating-48h.html @@ -0,0 +1,61 @@ + + + + + Aviso Calefacción de Piscina + + + +
+
+

🌡️ Calefacción de Piscina — 48h

+

Aviso automático · Naturcalabacera

+
+
+
+ Acción requerida: En 48 horas llega {{CLIENT_NAME}} a {{PROPERTY}} con calefacción de piscina activada. + Por favor, encender la calefacción de piscina con suficiente antelación. +
+
+
+ + {{CLIENT_NAME}} +
+
+ + {{PROPERTY}} +
+
+ + {{START_DATE}} +
+
+ + {{END_DATE}} +
+
+ + {{TOTAL_PERSONS}} +
+
+
+ +
+ + diff --git a/apps/api/src/templates/reminder-24h.html b/apps/api/src/templates/reminder-24h.html new file mode 100644 index 0000000..d3083a4 --- /dev/null +++ b/apps/api/src/templates/reminder-24h.html @@ -0,0 +1,60 @@ + + + + + Recordatorio Check-in Mañana + + + +
+
+

⏰ Check-in Mañana — Los Dragos

+

Recordatorio automático 24h · Naturcalabacera

+
+
+
+ Recordatorio: Mañana llega {{CLIENT_NAME}} a Los Dragos. +
+
+
+ + {{CLIENT_NAME}} +
+
+ + {{INVOICE_NUMBER}} +
+
+ + {{START_DATE}} +
+
+ + {{END_DATE}} +
+
+ + {{TOTAL_PERSONS}} +
+
+
+ +
+ + diff --git a/apps/api/src/templates/teneriffa-crud.html b/apps/api/src/templates/teneriffa-crud.html new file mode 100644 index 0000000..5c83da0 --- /dev/null +++ b/apps/api/src/templates/teneriffa-crud.html @@ -0,0 +1,112 @@ + + + + + {{ACTION_LABEL}} — Teneriffa + + + +
+ + +
+
{{ACTION_LABEL}}
+

{{CLIENT_NAME}}

+

{{PROPERTY}}  ·  {{NIGHTS}}  ·  Teneriffa

+

{{DATE_RANGE}}

+
+ +
+ + + {{CANCEL_ALERT}} + + +

Datos de la reserva

+
+
+ + {{PROPERTY}} +
+
+ + {{INVOICE_NUMBER}} +
+
+ + {{START_DATE}} +
+
+ + {{END_DATE}} +
+
+ + {{ADULTS}} +
+
+ + {{CHILDREN}} +
+
+ + {{GOVERNMENT_REG}} +
+
+ + {{SERVICES}} +
+
+ + + {{OBSERVATIONS_BLOCK}} + + + {{CHANGES_BLOCK}} + +
+ + +
+ + diff --git a/apps/api/tsconfig.json b/apps/api/tsconfig.json new file mode 100644 index 0000000..2d23d6c --- /dev/null +++ b/apps/api/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "outDir": "./dist", + "rootDir": "./src", + "strict": true, + "skipLibCheck": true, + "esModuleInterop": true, + "declaration": true, + "paths": { + "@naturcalabacera/shared": ["../../packages/shared/src/index.ts"], + "@naturcalabacera/shared/*": ["../../packages/shared/src/*"] + } + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/apps/web/.env.example b/apps/web/.env.example new file mode 100644 index 0000000..4a9ea84 --- /dev/null +++ b/apps/web/.env.example @@ -0,0 +1,15 @@ +# ───────────────────────────────────────────── +# apps/web — Variables de entorno +# Copia este archivo como .env y rellena los valores. +# Los prefijos VITE_ son accesibles en el navegador. +# ───────────────────────────────────────────── + +# Supabase (self-hosted) +VITE_SUPABASE_URL=https://tu-supabase.tudominio.com +VITE_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... + +# URL del backend API (apps/api) +VITE_API_URL=http://localhost:3001 + +# Chatbot — poner true para mostrar el contenedor inferior +VITE_CHATBOT_ENABLED=false diff --git a/apps/web/eslint.config.js b/apps/web/eslint.config.js new file mode 100644 index 0000000..5e6b472 --- /dev/null +++ b/apps/web/eslint.config.js @@ -0,0 +1,23 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + }, +]) diff --git a/apps/web/index.html b/apps/web/index.html new file mode 100644 index 0000000..eac8330 --- /dev/null +++ b/apps/web/index.html @@ -0,0 +1,13 @@ + + + + + + + reservas-app + + +
+ + + diff --git a/apps/web/package.json b/apps/web/package.json new file mode 100644 index 0000000..3730646 --- /dev/null +++ b/apps/web/package.json @@ -0,0 +1,42 @@ +{ + "name": "@naturcalabacera/web", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@naturcalabacera/shared": "workspace:*", + "@supabase/supabase-js": "^2.95.3", + "clsx": "^2.1.1", + "date-fns": "^4.1.0", + "framer-motion": "^12.33.0", + "lucide-react": "^0.563.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-hook-form": "^7.71.1", + "sonner": "^2.0.7", + "tailwind-merge": "^3.4.0" + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@types/node": "^24.10.1", + "@types/react": "^19.2.5", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^5.1.1", + "autoprefixer": "^10.4.24", + "eslint": "^9.39.1", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "globals": "^16.5.0", + "postcss": "^8.5.6", + "tailwindcss": "^3.4.19", + "typescript": "~5.9.3", + "typescript-eslint": "^8.46.4", + "vite": "^7.2.4" + } +} diff --git a/apps/web/postcss.config.js b/apps/web/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/apps/web/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/apps/web/public/vite.svg b/apps/web/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/apps/web/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/web/src/App.css b/apps/web/src/App.css new file mode 100644 index 0000000..b9d355d --- /dev/null +++ b/apps/web/src/App.css @@ -0,0 +1,42 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx new file mode 100644 index 0000000..dea6919 --- /dev/null +++ b/apps/web/src/App.tsx @@ -0,0 +1,275 @@ +import { useState, useEffect } from 'react'; +import { useReservations } from './hooks/useReservations'; +import { usePropertyTheme } from './hooks/usePropertyTheme'; +import { Sidebar } from './components/Sidebar'; +import { MobileNavigation } from './components/MobileNavigation'; +import { CalendarGrid } from './components/CalendarGrid'; +import { ReservationModal } from './components/ReservationModal'; +import { SearchBar } from './components/SearchBar'; +import { SettingsPage } from './components/SettingsPage'; +import { YearlyCalendar } from './components/YearlyCalendar'; +import { UserManagement } from './components/UserManagement'; +import { LoginPage } from './components/LoginPage'; +import { ChatbotContainer } from './components/ChatbotContainer'; +import { useAuth } from './hooks/useAuth'; +import { PropertyProvider, useProperty } from './contexts/PropertyContext'; +import { UserRoleProvider, useUserRoleContext } from './contexts/UserRoleContext'; +import type { NewReservation, Reservation } from './types'; +import { format } from 'date-fns'; +import { Plus, Loader2 } from 'lucide-react'; +import { Toaster, toast } from 'sonner'; + +// Componente interno que ya tiene acceso al PropertyContext y UserRoleContext +function AppContent() { + const { property } = useProperty(); + const theme = usePropertyTheme(); + const { isViewer, isStaff, isAdmin } = useUserRoleContext(); + const { + reservations, + loading: reservationsLoading, + createReservation, + updateReservation, + deleteReservation, + refreshResolver, + } = useReservations(property); + + const [currentView, setCurrentView] = useState('calendar'); + const [modalOpen, setModalOpen] = useState(false); + const [modalMode, setModalMode] = useState<'create' | 'edit'>('create'); + const [selectedReservation, setSelectedReservation] = useState>({}); + const [searchTerm, setSearchTerm] = useState(''); + + const filteredReservations = reservations.filter(res => + res.client_name.toLowerCase().includes(searchTerm.toLowerCase()) + ); + + const handleSelectReservation = (event: Reservation) => { + setSelectedReservation(event); + setModalMode('edit'); + setModalOpen(true); + }; + + const handleSelectDay = (day: Date) => { + setSelectedReservation({ + start_date: format(day, 'yyyy-MM-dd'), + end_date: format(day, 'yyyy-MM-dd'), + origin: 'Teneriffa2000', + adults_count: 2, + children_count: 0, + }); + setModalMode('create'); + setModalOpen(true); + }; + + const handleSelectRange = (start: Date, end: Date) => { + setSelectedReservation({ + start_date: format(start, 'yyyy-MM-dd'), + end_date: format(end, 'yyyy-MM-dd'), + origin: 'Teneriffa2000', + adults_count: 2, + children_count: 0, + }); + setModalMode('create'); + setModalOpen(true); + }; + + const handleSave = async (data: NewReservation): Promise => { + try { + let savedReservation: Reservation; + const previousSnapshot = modalMode === 'edit' ? { ...selectedReservation } as Reservation : undefined; + if (modalMode === 'create') { + savedReservation = await createReservation(data); + } else { + if (selectedReservation.id) { + await updateReservation(selectedReservation.id, data); + savedReservation = { ...selectedReservation, ...data } as Reservation; + } else { + return; + } + } + refreshResolver(); + toast.success('Reserva guardada correctamente'); + + // Notificar al API backend para programar notificaciones + const operation = modalMode === 'create' ? 'created' : 'updated'; + void notifyApi(savedReservation, operation, previousSnapshot); + return savedReservation; + } catch (error) { + console.error('Error saving:', error); + toast.error('Error al guardar la reserva'); + } + }; + + const handleDelete = async (id: string) => { + try { + const reservationToDelete = reservations.find(r => r.id === id); + await deleteReservation(id); + setModalOpen(false); + refreshResolver(); + toast.success('Reserva eliminada correctamente'); + + if (reservationToDelete) { + void notifyApi(reservationToDelete, 'cancelled'); + } + } catch (error) { + console.error('Error deleting:', error); + toast.error('Error al eliminar la reserva'); + } + }; + + return ( +
+ + + +
+
+ {/* Relative container: center title absolutely, left/right content on sides */} +
+ {/* Left: status dot + tagline (desktop only) */} +
+ + + Gestiona tus reservas y disponibilidad + +
+ + {/* Center: property name — always truly centered */} +

+ {theme.name} +

+ + {/* Right: Nueva Reserva button */} + {isStaff && ( +
+ +
+ )} +
+ + {/* Mobile subtitle below title */} +
+ + + Gestiona tus reservas y disponibilidad + +
+
+ +
+ {currentView === 'calendar' && ( + <> + + + + )} + {currentView === 'settings' && } + {currentView === 'yearly' && ( + + )} + {currentView === 'users' && isAdmin && } +
+ + +
+ + + + {isStaff && ( + setModalOpen(false)} + onSave={handleSave} + onDelete={handleDelete} + /> + )} +
+ ); +} + +// Llama al API backend para programar notificaciones (fire-and-forget) +async function notifyApi( + reservation: Reservation, + operation: 'created' | 'updated' | 'cancelled', + previousReservation?: Reservation +) { + const apiUrl = import.meta.env.VITE_API_URL; + if (!apiUrl) return; // Si no hay API configurada, skip silencioso + + try { + await fetch(`${apiUrl}/api/notifications/reservation-event`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ reservation, operation, previousReservation }), + }); + } catch { + // No bloquear la UI si el API no está disponible + console.warn('[notifications] API no disponible'); + } +} + +function App() { + // Initialize theme from localStorage + useEffect(() => { + const savedTheme = localStorage.getItem('theme'); + const systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; + if (savedTheme === 'dark' || (!savedTheme && systemPrefersDark)) { + document.documentElement.classList.add('dark'); + } else { + document.documentElement.classList.remove('dark'); + } + }, []); + + const { session, loading: authLoading } = useAuth(); + + if (authLoading) { + return ( +
+ +
+ ); + } + + if (!session) { + return ( + <> + + + + ); + } + + return ( + + + + + + ); +} + +export default App; diff --git a/apps/web/src/assets/react.svg b/apps/web/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/apps/web/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/web/src/components/CalendarGrid.tsx b/apps/web/src/components/CalendarGrid.tsx new file mode 100644 index 0000000..2829520 --- /dev/null +++ b/apps/web/src/components/CalendarGrid.tsx @@ -0,0 +1,508 @@ +import { useEffect, useRef, useState } from 'react'; +import { + format, startOfMonth, endOfMonth, startOfWeek, endOfWeek, + eachDayOfInterval, isSameMonth, addMonths, subMonths, + isSameDay, differenceInDays, parseISO, isWithinInterval +} from 'date-fns'; +import { es } from 'date-fns/locale/es'; +import { ChevronLeft, ChevronRight, Users, Moon } from 'lucide-react'; +import type { Reservation } from '../types'; +import { useProperty } from '../contexts/PropertyContext'; +import { PROPERTY_CONFIG } from '@naturcalabacera/shared'; +import { ServiceIcons } from './ServiceIcons'; + +interface Props { + reservations: Reservation[]; + onSelectDay: (day: Date) => void; + onSelectReservation: (reservation: Reservation) => void; + onSelectRange?: (start: Date, end: Date) => void; + isLoading?: boolean; + viewerMode?: boolean; +} + +export function CalendarGrid({ + reservations, + onSelectDay, + onSelectReservation, + onSelectRange, + isLoading: _isLoading = false, + viewerMode = false, +}: Props) { + const { property } = useProperty(); + const propertyConfig = PROPERTY_CONFIG[property]; + const [currentDate, setCurrentDate] = useState(new Date()); + + // Drag-to-select state + const [dragStart, setDragStart] = useState(null); + const [dragEnd, setDragEnd] = useState(null); + const [isDragging, setIsDragging] = useState(false); + const gridBodyRef = useRef(null); + // Tracks mouse movement to distinguish click vs drag + const mouseMoved = useRef(false); + // Prevents the click event that fires after mouseUp from triggering onSelectDay + const dragJustFinished = useRef(false); + + const monthStart = startOfMonth(currentDate); + const monthEnd = endOfMonth(monthStart); + const calendarStart = startOfWeek(monthStart, { weekStartsOn: 0 }); + const calendarEnd = endOfWeek(monthEnd, { weekStartsOn: 0 }); + + const calendarDays = eachDayOfInterval({ start: calendarStart, end: calendarEnd }); + + const weeks: Date[][] = []; + for (let i = 0; i < calendarDays.length; i += 7) { + weeks.push(calendarDays.slice(i, i + 7)); + } + + const nextMonth = () => setCurrentDate(addMonths(currentDate, 1)); + const prevMonth = () => setCurrentDate(subMonths(currentDate, 1)); + + // Display occupancy: a day is occupied for rendering if within [start, end] inclusive + const isDayOccupied = (day: Date): boolean => { + return reservations.some(res => { + const s = parseISO(res.start_date); + const e = parseISO(res.end_date); + return isWithinInterval(day, { start: s, end: e }) || isSameDay(day, s) || isSameDay(day, e); + }); + }; + + // Get reservation for a specific day (for click-through on occupied cells) + const getReservationForDay = (day: Date): Reservation | undefined => { + return reservations.find(res => { + const s = parseISO(res.start_date); + const e = parseISO(res.end_date); + return isWithinInterval(day, { start: s, end: e }) || isSameDay(day, s) || isSameDay(day, e); + }); + }; + + // Calculate which calendar day is under a given coordinate + const getDayFromCoords = (clientX: number, clientY: number): Date | null => { + const el = gridBodyRef.current; + if (!el) return null; + const rect = el.getBoundingClientRect(); + const x = clientX - rect.left; + const y = clientY - rect.top; + if (x < 0 || x >= rect.width || y < 0 || y >= rect.height) return null; + const col = Math.min(Math.floor(x / (rect.width / 7)), 6); + const row = Math.min(Math.floor(y / (rect.height / weeks.length)), weeks.length - 1); + return weeks[row]?.[col] ?? null; + }; + + // Is a day inside the current drag selection range? + const isInDragSelection = (day: Date): boolean => { + if (!dragStart || !dragEnd) return false; + const start = dragStart <= dragEnd ? dragStart : dragEnd; + const end = dragStart <= dragEnd ? dragEnd : dragStart; + return day >= start && day <= end; + }; + + // Confirm drag and open modal + const confirmDrag = (start: Date, end: Date) => { + const s = start <= end ? start : end; + const e = start <= end ? end : start; + if (isSameDay(s, e)) { + onSelectDay(s); + } else if (onSelectRange) { + onSelectRange(s, e); + } else { + onSelectDay(s); + } + }; + + // --- Grid body mouse events --- + + const handleGridMouseDown = (ev: React.MouseEvent) => { + if (viewerMode) return; + const day = getDayFromCoords(ev.clientX, ev.clientY); + if (!day) return; + // Allow drag start on any day (free or occupied boundary) + // Drag is only initiated on non-occupied days + if (isDayOccupied(day)) return; + ev.preventDefault(); + mouseMoved.current = false; + setDragStart(day); + setDragEnd(day); + setIsDragging(true); + }; + + const handleGridMouseMove = (ev: React.MouseEvent) => { + if (!isDragging || !dragStart) return; + mouseMoved.current = true; + const day = getDayFromCoords(ev.clientX, ev.clientY); + if (day) setDragEnd(day); + }; + + const handleGridMouseUp = (ev: React.MouseEvent) => { + if (!isDragging || !dragStart || !dragEnd) return; + const hasMoved = mouseMoved.current; + const start = dragStart; + const end = dragEnd; + setIsDragging(false); + setDragStart(null); + setDragEnd(null); + if (hasMoved && !isSameDay(start, end)) { + dragJustFinished.current = true; + confirmDrag(start, end); + } + // Single clicks are handled entirely by handleGridClick + ev.stopPropagation(); + }; + + // Handle click on grid body (for free-day single clicks when drag is not involved) + const handleGridClick = (ev: React.MouseEvent) => { + if (viewerMode || isDragging) return; + // Ignore the synthetic click that fires immediately after a drag ends + if (dragJustFinished.current) { + dragJustFinished.current = false; + return; + } + const day = getDayFromCoords(ev.clientX, ev.clientY); + if (!day) return; + const res = getReservationForDay(day); + if (res) { + // Click on occupied day — open reservation + onSelectReservation(res); + } else { + // Click on free day — open create modal + onSelectDay(day); + } + }; + + // --- Touch events (mobile drag) --- + + const handleTouchStart = (ev: React.TouchEvent) => { + if (viewerMode) return; + const touch = ev.touches[0]; + const day = getDayFromCoords(touch.clientX, touch.clientY); + if (!day || isDayOccupied(day)) return; + mouseMoved.current = false; + setDragStart(day); + setDragEnd(day); + setIsDragging(true); + }; + + const handleTouchMove = (ev: React.TouchEvent) => { + if (!isDragging) return; + mouseMoved.current = true; + const touch = ev.touches[0]; + const day = getDayFromCoords(touch.clientX, touch.clientY); + if (day) setDragEnd(day); + }; + + const handleTouchEnd = () => { + if (!isDragging || !dragStart || !dragEnd) return; + const hasMoved = mouseMoved.current; + const start = dragStart; + const end = dragEnd; + setIsDragging(false); + setDragStart(null); + setDragEnd(null); + if (hasMoved && !isSameDay(start, end)) { + dragJustFinished.current = true; + confirmDrag(start, end); + } else { + onSelectDay(start); + } + }; + + // Cancel drag if mouse leaves the window + useEffect(() => { + const cancel = () => { + if (isDragging) { + setIsDragging(false); + setDragStart(null); + setDragEnd(null); + } + }; + document.addEventListener('mouseup', cancel); + return () => document.removeEventListener('mouseup', cancel); + }, [isDragging]); + + // --- Reservation blocks (visual only — clicks handled at grid body level) --- + const renderReservationBlocks = () => { + const blocks: React.ReactElement[] = []; + + reservations.forEach((res) => { + const startDate = parseISO(res.start_date); + const endDate = parseISO(res.end_date); + + const startIndex = calendarDays.findIndex(day => isSameDay(day, startDate)); + if (startIndex === -1) return; + + const endIndex = calendarDays.findIndex(day => isSameDay(day, endDate)); + if (endIndex === -1) return; + + const totalDuration = differenceInDays(endDate, startDate) + 1; + const nights = totalDuration - 1; + + const isTeneriffa = res.origin === 'Teneriffa2000'; + const gradient = viewerMode + ? 'bg-stone-400/30 dark:bg-stone-500/30' + : isTeneriffa + ? 'bg-blue-600/30 dark:bg-blue-500/30' + : 'bg-yellow-500/30 dark:bg-yellow-400/30'; + + const borderClass = viewerMode + ? 'border-l-4 border-stone-400' + : isTeneriffa + ? 'border-l-4 border-blue-500' + : 'border-l-4 border-yellow-500'; + const textShadow = 'drop-shadow-[0_1px_1px_rgba(0,0,0,0.8)]'; + + let currentDayIndex = startIndex; + let blockIndex = 0; + + while (currentDayIndex <= endIndex) { + const weekIndex = Math.floor(currentDayIndex / 7); + const dayOfWeek = currentDayIndex % 7; + const daysUntilWeekEnd = 7 - dayOfWeek; + const daysRemaining = endIndex - currentDayIndex + 1; + const daysInThisWeek = Math.min(daysUntilWeekEnd, daysRemaining); + const isFirstBlock = blockIndex === 0; + + blocks.push( +
+ {/* Desktop */} +
+
+ {viewerMode ? 'Ocupado' : res.client_name} +
+ {!viewerMode && isFirstBlock && ( +
+
+ + {nights}n +
+
+ + {res.adults_count + res.children_count}p +
+ +
+ )} +
+ + {/* Mobile */} +
+ {daysInThisWeek > 1 && ( + + {viewerMode ? 'Ocupado' : res.client_name} + + )} + {!viewerMode && daysInThisWeek > 2 && isFirstBlock && ( + + )} +
+
+ ); + + currentDayIndex += daysInThisWeek; + blockIndex++; + } + }); + + return blocks; + }; + + // Drag selection highlight blocks + const renderDragSelection = () => { + if (!isDragging || !dragStart || !dragEnd) return null; + const start = dragStart <= dragEnd ? dragStart : dragEnd; + const end = dragStart <= dragEnd ? dragEnd : dragStart; + const startIndex = calendarDays.findIndex(d => d >= start); + if (startIndex === -1) return null; + const endIndex = calendarDays.findIndex(d => d >= end); + const effectiveEnd = endIndex === -1 ? calendarDays.length - 1 : endIndex; + + const selBlocks: React.ReactElement[] = []; + let cur = startIndex; + while (cur <= effectiveEnd) { + const weekIndex = Math.floor(cur / 7); + const dayOfWeek = cur % 7; + const daysUntilWeekEnd = 7 - dayOfWeek; + const daysRemaining = effectiveEnd - cur + 1; + const span = Math.min(daysUntilWeekEnd, daysRemaining); + selBlocks.push( +
+ ); + cur += span; + } + return selBlocks; + }; + + // Days count label during drag + const dragNights = dragStart && dragEnd + ? Math.abs(differenceInDays(dragEnd, dragStart)) + : 0; + + return ( +
+ + + + {/* Header */} +
+
+
+

+ {format(currentDate, 'MMMM yyyy', { locale: es })} +

+ {/* Drag hint — shown only during active drag */} + {isDragging && dragNights > 0 && ( + + {dragNights} noche{dragNights !== 1 ? 's' : ''} + + )} +
+
+

+ {viewerMode ? 'Vista de disponibilidad' : 'Clic para crear · Arrastra para rango'} +

+ + {propertyConfig.label} + +
+
+
+ + +
+
+ + {/* Grid container */} +
+
+ + {/* Days header */} +
+ {['D', 'L', 'M', 'X', 'J', 'V', 'S'].map((day, i) => ( +
+ {day} + {['Dom', 'Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sáb'][i]} +
+ ))} +
+ + {/* Grid body — handles all pointer interactions via coordinates */} +
+ {/* Grid cells — purely visual, no pointer-events needed */} + {weeks.map((week, weekIdx) => ( +
+ {week.map((day) => { + const isCurrentMonth = isSameMonth(day, monthStart); + const isOccupied = isDayOccupied(day); + const inSel = isInDragSelection(day); + const isToday = isSameDay(day, new Date()); + + return ( +
+ + {format(day, 'd')} + +
+ ); + })} +
+ ))} + + {/* Reservation color blocks */} + {renderReservationBlocks()} + + {/* Drag selection overlay */} + {renderDragSelection()} +
+
+
+ + {/* Legend */} +
+
+
+ Teneriffa +
+
+
+ Natur +
+
+
+ ); +} diff --git a/apps/web/src/components/CalendarGrid.tsx.backup b/apps/web/src/components/CalendarGrid.tsx.backup new file mode 100644 index 0000000..f8b541b --- /dev/null +++ b/apps/web/src/components/CalendarGrid.tsx.backup @@ -0,0 +1,222 @@ +import { useState } from 'react'; +import { + format, startOfMonth, endOfMonth, startOfWeek, endOfWeek, + eachDayOfInterval, isSameMonth, addMonths, subMonths, + isSameDay, differenceInDays, parseISO, isWithinInterval +} from 'date-fns'; +import { es } from 'date-fns/locale/es'; +import { ChevronLeft, ChevronRight, Users, Moon, Ban } from 'lucide-react'; +import type { Reservation } from '../types'; + +interface Props { + reservations: Reservation[]; + onSelectDay: (day: Date) => void; + onSelectReservation: (reservation: Reservation) => void; +} + +export function CalendarGrid({ reservations, onSelectDay, onSelectReservation }: Props) { + const [currentDate, setCurrentDate] = useState(new Date()); + + const monthStart = startOfMonth(currentDate); + const monthEnd = endOfMonth(monthStart); + const calendarStart = startOfWeek(monthStart, { weekStartsOn: 0 }); + const calendarEnd = endOfWeek(monthEnd, { weekStartsOn: 0 }); + + const calendarDays = eachDayOfInterval({ start: calendarStart, end: calendarEnd }); + + // Organizar en semanas + const weeks: Date[][] = []; + for (let i = 0; i < calendarDays.length; i += 7) { + weeks.push(calendarDays.slice(i, i + 7)); + } + + const nextMonth = () => setCurrentDate(addMonths(currentDate, 1)); + const prevMonth = () => setCurrentDate(subMonths(currentDate, 1)); + + // Función para verificar si un día está ocupado + const isDayOccupied = (day: Date): boolean => { + return reservations.some(res => { + const startDate = parseISO(res.start_date); + const endDate = parseISO(res.end_date); + + // Un día está ocupado si está dentro del rango [start_date, end_date] (ambos inclusive) + return isWithinInterval(day, { start: startDate, end: endDate }) || + isSameDay(day, startDate) || + isSameDay(day, endDate); + }); + }; + + // Renderizar bloques de reserva + const renderReservationBlocks = () => { + return reservations.map((res) => { + const startDate = parseISO(res.start_date); + const endDate = parseISO(res.end_date); + + const dayIndex = calendarDays.findIndex(day => isSameDay(day, startDate)); + if (dayIndex === -1) return null; + + const weekIndex = Math.floor(dayIndex / 7); + const dayOfWeek = dayIndex % 7; + + const duration = differenceInDays(endDate, startDate) + 1; + const nights = duration - 1; + + const isTeneriffa = res.origin === 'Teneriffa2000'; + const gradient = isTeneriffa + ? 'from-blue-600/90 via-blue-500/90 to-blue-400/90' + : 'from-yellow-600/90 via-yellow-500/90 to-yellow-400/90'; + + const borderColor = isTeneriffa ? 'border-blue-400' : 'border-yellow-400'; + const shadowColor = isTeneriffa ? 'shadow-blue-500/50' : 'shadow-yellow-500/50'; + + return ( +
onSelectReservation(res)} + className={` + absolute cursor-pointer group + bg-gradient-to-r ${gradient} ${borderColor} + border-l-4 rounded-2xl p-3 + hover:scale-105 transition-all duration-300 + shadow-2xl ${shadowColor} + backdrop-blur-xl + z-10 + `} + style={{ + top: `${weekIndex * 100 + 50}px`, + left: `${(dayOfWeek * 100 / 7) + 0.75}%`, + width: `${Math.min(duration, 7 - dayOfWeek) * (100 / 7) - 1.5}%`, + height: '60px' + }} + > +
+
{res.client_name}
+
+ < div className =\"flex items-center gap-1 text-white/90\"> + < Moon className =\"w-3 h-3\" /> + < span className =\"text-[11px] font-semibold\">{nights}n +
+
+ < Users className =\"w-3 h-3\" /> + < span className =\"text-[11px] font-semibold\">{res.adults_count + res.children_count}p +
+
+
+
+ ); +}); + }; + +return ( +
+{/* Header */ } +
+ < div > +

+{ format(currentDate, 'MMMM yyyy', { locale: es }) } +

+

Vista mensual de reservas

+
+
+ < button +onClick = { prevMonth } +className =\"p-3 rounded-xl bg-gradient-to-br from-slate-700 to-slate-800 hover:from-slate-600 hover:to-slate-700 text-slate-200 transition-all duration-300 shadow-lg hover:shadow-xl hover:scale-110 border border-slate-600/50\" + > + + + +
+
+ + {/* Calendar */ } + < div className =\"bg-slate-800/30 backdrop-blur-xl rounded-2xl overflow-hidden border border-slate-700/50 shadow-2xl\"> +{/* Days header */ } +
+{ + ['Dom', 'Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sáb'].map((day) => ( +
+ { day } +
+ )) +} +
+ + {/* Calendar grid */ } + < div className =\"relative\"> +{ + weeks.map((week, weekIdx) => ( +
+ { + week.map((day) => { + const isCurrentMonth = isSameMonth(day, monthStart); + const isOccupied = isDayOccupied(day); + + return ( +
{ + if (!isOccupied) { + onSelectDay(day); + } + }} + className={` + relative h-28 p-3 border-r border-slate-700/30 last:border-r-0 + transition-all duration-300 group + ${!isCurrentMonth ? 'bg-slate-900/50' : ''} + ${isOccupied + ? 'cursor-not-allowed bg-red-900/10' + : 'cursor-pointer hover:bg-gradient-to-br hover:from-slate-700/50 hover:to-slate-600/30' + } + `} + > + + {format(day, 'd')} + + + {/* Indicador visual de día ocupado */} + {isOccupied && isCurrentMonth && ( +
+ +
+ ) + } +
+ ); + }) +} +
+ ))} + +{/* Reservation blocks */ } +{ renderReservationBlocks() } +
+
+ + {/* Legend */ } + < div className =\"mt-6 flex items-center gap-8 text-sm text-slate-400\"> + < div className =\"flex items-center gap-3 px-4 py-2 bg-gradient-to-r from-blue-500/10 to-transparent rounded-xl border border-blue-500/20\"> + < div className =\"w-4 h-4 rounded-lg bg-gradient-to-br from-blue-500 to-blue-600 shadow-lg shadow-blue-500/50\"> + < span className =\"font-semibold\">Teneriffa2000 + +
+ < div className =\"w-4 h-4 rounded-lg bg-gradient-to-br from-yellow-500 to-yellow-600 shadow-lg shadow-yellow-500/50\">
+ < span className =\"font-semibold\">Naturcalabacera + + + + ); +} diff --git a/apps/web/src/components/ChatbotContainer.tsx b/apps/web/src/components/ChatbotContainer.tsx new file mode 100644 index 0000000..482eaf3 --- /dev/null +++ b/apps/web/src/components/ChatbotContainer.tsx @@ -0,0 +1,591 @@ +/** + * ChatbotContainer — asistente conversacional con datos reales de Supabase. + * + * Arquitectura lista para IA real: la función processMessage() actualmente + * usa un motor de reglas. Para conectar un LLM, sustituye su cuerpo por + * una llamada a la API (Claude, GPT, etc.) pasando los datos de reservas + * como contexto del sistema. + */ + +import { useState, useEffect, useRef, useCallback } from 'react'; +import { MessageCircle, X, Send, Home, RefreshCw } from 'lucide-react'; +import { supabase } from '../lib/supabase'; +import type { Reservation, Property } from '../types'; +import { format, parseISO, isAfter, isBefore, differenceInDays } from 'date-fns'; +import { es } from 'date-fns/locale/es'; + +// ─── Types ──────────────────────────────────────────────────────────────────── + +interface Message { + id: string; + role: 'user' | 'assistant'; + content: string; + timestamp: Date; +} + +// ─── Helpers ───────────────────────────────────────────────────────────────── + +function fmtDate(d: string) { + return format(parseISO(d), "d MMM yyyy", { locale: es }); +} + +function fmtShort(d: string) { + return format(parseISO(d), "d MMM", { locale: es }); +} + +function propertyLabel(p: Property) { + return p === 'los_dragos' ? 'Los Dragos' : 'La Esquinita'; +} + +function nightsBetween(start: string, end: string) { + return differenceInDays(parseISO(end), parseISO(start)); +} + +// ─── Response engine ────────────────────────────────────────────────────────── + +function guestDetail(r: Reservation): string { + const nights = nightsBetween(r.start_date, r.end_date); + const pax = r.adults_count + r.children_count; + const lines: string[] = [ + `👤 **${r.client_name}**`, + `📅 ${fmtDate(r.start_date)} → ${fmtDate(r.end_date)} (${nights} noche${nights !== 1 ? 's' : ''})`, + `👥 ${pax} persona${pax !== 1 ? 's' : ''} (${r.adults_count} adultos, ${r.children_count} niños)`, + `🏷️ Origen: ${r.origin}`, + ]; + if (r.government_registration) { + lines.push(`🏛️ Reg. gubernamental: \`${r.government_registration}\``); + } else { + lines.push(`⚠️ Sin registro gubernamental`); + } + if (r.invoice_number) lines.push(`🧾 Factura: ${r.invoice_number}`); + if (r.has_cleaning) lines.push(`🧹 Servicio de limpieza incluido`); + if (r.has_pool_heating) lines.push(`♨️ Calefacción de piscina incluida`); + if (r.has_flies_products) lines.push(`🦟 Productos anti-mosquitos incluidos`); + if (r.is_event) { + lines.push(`🎉 Evento: ${r.event_type ?? ''}${r.event_type_other ? ` (${r.event_type_other})` : ''}`); + if (r.attendees_count) lines.push(` Asistentes: ${r.attendees_count}`); + } + if (r.pricing_snapshot) { + const p = r.pricing_snapshot; + lines.push(`💶 Total: ${p.total.toLocaleString('es-ES', { style: 'currency', currency: 'EUR' })}`); + } + if (r.observations) lines.push(`📝 Notas: ${r.observations}`); + return lines.join('\n'); +} + +function statsInfo(reservations: Reservation[], property: Property): string { + const now = new Date(); + const label = propertyLabel(property); + const total = reservations.length; + const active = reservations.filter(r => + !isAfter(parseISO(r.start_date), now) && !isBefore(parseISO(r.end_date), now) + ); + const upcoming = reservations.filter(r => isAfter(parseISO(r.start_date), now)); + const past = reservations.filter(r => isBefore(parseISO(r.end_date), now)); + const teneriffa = reservations.filter(r => r.origin === 'Teneriffa2000'); + const natur = reservations.filter(r => r.origin === 'Naturcalabacera'); + const withReg = reservations.filter(r => r.government_registration); + const withoutReg = reservations.filter(r => !r.government_registration); + const totalNights = reservations.reduce((sum, r) => sum + nightsBetween(r.start_date, r.end_date), 0); + + const lines = [ + `📊 **Resumen — ${label}**\n`, + `• Total reservas: **${total}**`, + `• Activas ahora: ${active.length}`, + `• Próximas: ${upcoming.length}`, + `• Pasadas: ${past.length}`, + `• Noches totales reservadas: ${totalNights}`, + ``, + `📋 **Por origen:**`, + `• Teneriffa2000: ${teneriffa.length}`, + `• Naturcalabacera: ${natur.length}`, + ``, + `🏛️ **Registros gubernamentales:**`, + `• Con registro: ${withReg.length}`, + `• Sin registro: ${withoutReg.length}${withoutReg.length > 0 ? ' ⚠️' : ' ✅'}`, + ]; + return lines.join('\n'); +} + +function contractsInfo(reservations: Reservation[]): string { + const now = new Date(); + const withReg = reservations.filter(r => r.government_registration); + const pendingReg = reservations.filter( + r => !r.government_registration && !isBefore(parseISO(r.end_date), now) + ); + + const lines: string[] = ['🏛️ **Registros y contratos**\n']; + + if (withReg.length > 0) { + lines.push(`✅ **Con registro (${withReg.length}):**`); + withReg.forEach(r => { + lines.push(`• ${r.client_name} — \`${r.government_registration}\``); + if (r.invoice_number) lines.push(` Factura: ${r.invoice_number}`); + lines.push(` ${fmtShort(r.start_date)} → ${fmtShort(r.end_date)}`); + }); + } + + if (pendingReg.length > 0) { + lines.push(`\n⚠️ **Sin registro (activas/futuras) — ${pendingReg.length}:**`); + pendingReg.forEach(r => { + lines.push(`• ${r.client_name} (${fmtShort(r.start_date)} → ${fmtShort(r.end_date)})`); + }); + } + + if (withReg.length === 0 && pendingReg.length === 0) { + lines.push('No hay reservas con información de contratos disponible.'); + } + + return lines.join('\n'); +} + +function upcomingInfo(reservations: Reservation[]): string { + const now = new Date(); + const upcoming = reservations + .filter(r => isAfter(parseISO(r.start_date), now)) + .sort((a, b) => a.start_date.localeCompare(b.start_date)) + .slice(0, 6); + + if (upcoming.length === 0) return 'No hay reservas futuras registradas.'; + + const lines = [`📅 **Próximas reservas (${upcoming.length}):**\n`]; + upcoming.forEach(r => { + const daysTo = differenceInDays(parseISO(r.start_date), now); + const nights = nightsBetween(r.start_date, r.end_date); + lines.push( + `**${r.client_name}** — en ${daysTo} día${daysTo !== 1 ? 's' : ''}\n` + + ` ${fmtShort(r.start_date)} → ${fmtShort(r.end_date)} · ${nights} noches · ${r.adults_count + r.children_count} pax\n` + + (r.government_registration ? ` ✅ Reg: \`${r.government_registration}\`` : ` ⚠️ Sin registro`) + ); + }); + return lines.join('\n'); +} + +function availabilityInfo(reservations: Reservation[]): string { + const now = new Date(); + const future = reservations + .filter(r => !isBefore(parseISO(r.end_date), now)) + .sort((a, b) => a.start_date.localeCompare(b.start_date)); + + if (future.length === 0) { + return '✅ No hay reservas futuras. La propiedad está completamente disponible.'; + } + + const lines = ['🗓️ **Disponibilidad próxima:**\n']; + + // Gap before first reservation + const firstStart = parseISO(future[0].start_date); + const daysToFirst = differenceInDays(firstStart, now); + if (daysToFirst > 0) { + lines.push(`✅ Libre ahora → ${fmtShort(future[0].start_date)} (${daysToFirst} días)`); + } + + // Gaps between reservations + for (let i = 0; i < future.length; i++) { + lines.push(`🔴 Ocupado: ${fmtShort(future[i].start_date)} → ${fmtShort(future[i].end_date)} (${future[i].client_name})`); + if (i < future.length - 1) { + const gapStart = parseISO(future[i].end_date); + const gapEnd = parseISO(future[i + 1].start_date); + const gapDays = differenceInDays(gapEnd, gapStart); + if (gapDays > 0) { + lines.push(`✅ Libre: ${fmtShort(future[i].end_date)} → ${fmtShort(future[i + 1].start_date)} (${gapDays} días)`); + } + } + } + + return lines.join('\n'); +} + +function allReservationsInfo(reservations: Reservation[]): string { + if (reservations.length === 0) return 'No hay reservas registradas.'; + + const sorted = [...reservations].sort((a, b) => a.start_date.localeCompare(b.start_date)); + const now = new Date(); + const lines = [`📋 **Todas las reservas (${sorted.length}):**\n`]; + + sorted.forEach(r => { + const isPast = isBefore(parseISO(r.end_date), now); + const isActive = !isAfter(parseISO(r.start_date), now) && !isBefore(parseISO(r.end_date), now); + const icon = isPast ? '⬜' : isActive ? '🟢' : '🔵'; + lines.push( + `${icon} **${r.client_name}** — ${fmtShort(r.start_date)} → ${fmtShort(r.end_date)}` + + (r.government_registration ? ` ✅` : ` ⚠️`) + ); + }); + + return lines.join('\n'); +} + +function processMessage(input: string, reservations: Reservation[], property: Property): string { + const lower = input.toLowerCase().trim(); + const now = new Date(); + const label = propertyLabel(property); + + // Greeting + if (/^(hola|buenos|buenas|hey|hi|ey|qué tal|que tal|buen)/.test(lower)) { + const total = reservations.length; + const upcoming = reservations.filter(r => isAfter(parseISO(r.start_date), now)).length; + const active = reservations.filter(r => + !isAfter(parseISO(r.start_date), now) && !isBefore(parseISO(r.end_date), now) + ).length; + return [ + `¡Hola! Soy tu asistente para **${label}** 🏡`, + ``, + `Estado actual:`, + `• ${active > 0 ? `🟢 ${active} reserva${active !== 1 ? 's' : ''} activa${active !== 1 ? 's' : ''} ahora mismo` : '⬜ Sin reservas activas hoy'}`, + `• 🔵 ${upcoming} próxima${upcoming !== 1 ? 's' : ''}`, + `• 📋 ${total} reserva${total !== 1 ? 's' : ''} en total`, + ``, + `¿Qué necesitas saber?`, + ].join('\n'); + } + + // Stats / summary + if (/estadist|resumen|total|cuántas|cuantas|dato|cifra|número|numeros|summary/.test(lower)) { + return statsInfo(reservations, property); + } + + // Contracts / government registration + if (/contrat|registro|viajero|govern|código|codigos|rvtca|factura|invoice|número de registro/.test(lower)) { + return contractsInfo(reservations); + } + + // Upcoming + if (/próxim|siguiente|futuras|upcoming|pronto|esta semana|este mes|entran|llegan/.test(lower)) { + return upcomingInfo(reservations); + } + + // Availability + if (/disponib|libre|ocup|vac|hueco|cuando|free|gap|abierto/.test(lower)) { + return availabilityInfo(reservations); + } + + // List all + if (/lista|todas|todos|ver todo|todas las|show all|all reserv/.test(lower)) { + return allReservationsInfo(reservations); + } + + // Search by guest name — scan all words in input against client names + const words = lower.split(/\s+/).filter(w => w.length > 2); + for (const word of words) { + const found = reservations.find(r => + r.client_name.toLowerCase().includes(word) + ); + if (found) return guestDetail(found); + } + + // Help / default + return [ + `Puedo ayudarte con información de **${label}**. Pregúntame sobre:`, + ``, + `• 📋 **Reservas** — "lista todas", "reservas de mayo"`, + `• 📅 **Próximas** — "próximas reservas"`, + `• 🗓️ **Disponibilidad** — "¿cuándo está libre?"`, + `• 🏛️ **Contratos** — "registros gubernamentales", "contratos"`, + `• 👤 **Huésped** — escribe el nombre del cliente`, + `• 📊 **Estadísticas** — "dame un resumen"`, + ].join('\n'); +} + +// ─── Quick-reply suggestions ────────────────────────────────────────────────── + +const QUICK_REPLIES = [ + { label: 'Próximas reservas', text: 'próximas reservas' }, + { label: 'Disponibilidad', text: '¿cuándo está libre?' }, + { label: 'Contratos y registros', text: 'registros gubernamentales' }, + { label: 'Resumen estadístico', text: 'dame un resumen' }, + { label: 'Todas las reservas', text: 'lista todas las reservas' }, +]; + +// ─── Message renderer (markdown-lite) ──────────────────────────────────────── + +function RenderMessage({ content }: { content: string }) { + const lines = content.split('\n'); + return ( +
+ {lines.map((line, i) => { + // Bold: **text** + const parts = line.split(/(\*\*[^*]+\*\*)/g).map((part, j) => { + if (part.startsWith('**') && part.endsWith('**')) { + return {part.slice(2, -2)}; + } + // Inline code: `text` + return part.split(/(`[^`]+`)/g).map((seg, k) => { + if (seg.startsWith('`') && seg.endsWith('`')) { + return ( + + {seg.slice(1, -1)} + + ); + } + return seg; + }); + }); + if (line === '') return
; + return

{parts}

; + })} +
+ ); +} + +// ─── Main component ─────────────────────────────────────────────────────────── + +export function ChatbotContainer() { + const [isOpen, setIsOpen] = useState(false); + const [messages, setMessages] = useState([]); + const [input, setInput] = useState(''); + const [selectedProperty, setSelectedProperty] = useState('los_dragos'); + const [reservationsMap, setReservationsMap] = useState>({ + los_dragos: [], + la_esquinita: [], + }); + const [loadingData, setLoadingData] = useState(false); + const [isTyping, setIsTyping] = useState(false); + const messagesEndRef = useRef(null); + const inputRef = useRef(null); + + // Fetch all reservations for both properties + const fetchAll = useCallback(async () => { + setLoadingData(true); + try { + const { data } = await supabase + .from('reservations') + .select('*') + .order('start_date', { ascending: true }); + if (data) { + setReservationsMap({ + los_dragos: data.filter((r: Reservation) => r.property === 'los_dragos'), + la_esquinita: data.filter((r: Reservation) => r.property === 'la_esquinita'), + }); + } + } finally { + setLoadingData(false); + } + }, []); + + useEffect(() => { + if (isOpen && messages.length === 0) { + fetchAll(); + // Initial greeting + const greeting: Message = { + id: crypto.randomUUID(), + role: 'assistant', + content: `¡Hola! 👋 Soy tu asistente de reservas.\n\nSelecciona una propiedad arriba y pregúntame lo que necesites: disponibilidad, contratos, huéspedes, estadísticas…`, + timestamp: new Date(), + }; + setMessages([greeting]); + } + }, [isOpen, messages.length, fetchAll]); + + useEffect(() => { + messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); + }, [messages, isTyping]); + + const handleSend = useCallback(async (text?: string) => { + const userText = (text ?? input).trim(); + if (!userText) return; + + const userMsg: Message = { + id: crypto.randomUUID(), + role: 'user', + content: userText, + timestamp: new Date(), + }; + setMessages(prev => [...prev, userMsg]); + setInput(''); + setIsTyping(true); + + // Simulate processing delay for UX + await new Promise(resolve => setTimeout(resolve, 400)); + + const reservations = reservationsMap[selectedProperty]; + const response = processMessage(userText, reservations, selectedProperty); + + const botMsg: Message = { + id: crypto.randomUUID(), + role: 'assistant', + content: response, + timestamp: new Date(), + }; + setIsTyping(false); + setMessages(prev => [...prev, botMsg]); + }, [input, reservationsMap, selectedProperty]); + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === 'Enter' && !e.shiftKey) { + e.preventDefault(); + handleSend(); + } + }; + + const handlePropertySwitch = (p: Property) => { + setSelectedProperty(p); + const switchMsg: Message = { + id: crypto.randomUUID(), + role: 'assistant', + content: `Cambiado a **${propertyLabel(p)}**. ¿Qué necesitas saber sobre esta propiedad?`, + timestamp: new Date(), + }; + setMessages(prev => [...prev, switchMsg]); + }; + + const isDragos = selectedProperty === 'los_dragos'; + const accentGradient = isDragos + ? 'from-emerald-600 to-teal-600' + : 'from-amber-600 to-orange-600'; + const accentBorder = isDragos ? 'border-emerald-500/30' : 'border-amber-500/30'; + const accentShadow = isDragos ? 'shadow-emerald-500/20' : 'shadow-amber-500/20'; + const accentBg = isDragos ? 'bg-emerald-600/20' : 'bg-amber-600/20'; + const accentText = isDragos ? 'text-emerald-300' : 'text-amber-300'; + const activePropBg = isDragos + ? 'bg-gradient-to-r from-emerald-600 to-teal-600 text-white shadow-lg shadow-emerald-500/30' + : 'bg-gradient-to-r from-amber-600 to-orange-600 text-white shadow-lg shadow-amber-500/30'; + + return ( + <> + {/* Floating button */} + + + {/* Chat panel */} + {isOpen && ( +
+ {/* Header */} +
+
+
+ +
+
+

Asistente de Reservas

+

{propertyLabel(selectedProperty)}

+
+
+
+ + +
+
+ + {/* Property selector */} +
+ {(['los_dragos', 'la_esquinita'] as Property[]).map(p => ( + + ))} +
+ + {/* Messages */} +
+ {messages.map(msg => ( +
+ {msg.role === 'assistant' && ( +
+ +
+ )} +
+ +

+ {format(msg.timestamp, 'HH:mm')} +

+
+
+ ))} + + {/* Typing indicator */} + {isTyping && ( +
+
+ +
+
+ + + +
+
+ )} + +
+
+ + {/* Quick replies */} + {messages.length <= 2 && ( +
+ {QUICK_REPLIES.map(qr => ( + + ))} +
+ )} + + {/* Input */} +
+ setInput(e.target.value)} + onKeyDown={handleKeyDown} + placeholder="Escribe tu pregunta…" + className="flex-1 bg-slate-800 border border-white/10 rounded-xl px-4 py-2.5 text-sm text-white placeholder-slate-500 outline-none focus:border-white/25 transition-colors" + /> + +
+
+ )} + + ); +} diff --git a/apps/web/src/components/ContractUpload.tsx b/apps/web/src/components/ContractUpload.tsx new file mode 100644 index 0000000..b9758fc --- /dev/null +++ b/apps/web/src/components/ContractUpload.tsx @@ -0,0 +1,234 @@ +import { useEffect, useRef, useState } from 'react'; +import { Upload, Trash2, FileText, AlertCircle, Loader2, X, Maximize2 } from 'lucide-react'; +import { useFileUpload, type UploadedContract } from '../hooks/useFileUpload'; +import { motion, AnimatePresence } from 'framer-motion'; + +interface Props { + reservationId: string; +} + +function formatBytes(bytes: number): string { + if (bytes < 1024) return `${bytes} B`; + if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; + return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; +} + +const isImage = (mimeType: string) => mimeType.startsWith('image/'); + +export function ContractUpload({ reservationId }: Props) { + const { uploading, error, uploadFile, fetchContracts, getSignedUrl, deleteContract } = useFileUpload(reservationId); + const [contracts, setContracts] = useState([]); + const [thumbnails, setThumbnails] = useState>({}); + const [lightboxUrl, setLightboxUrl] = useState(null); + const [loadingOpen, setLoadingOpen] = useState(null); + const [deletingId, setDeletingId] = useState(null); + const inputRef = useRef(null); + const [dragging, setDragging] = useState(false); + + useEffect(() => { + fetchContracts().then(list => { + setContracts(list); + // Pre-fetch signed URLs for image thumbnails + list.filter(c => isImage(c.mime_type)).forEach(async c => { + const url = await getSignedUrl(c.file_path); + if (url) setThumbnails(prev => ({ ...prev, [c.id]: url })); + }); + }); + }, [fetchContracts, getSignedUrl]); + + const handleFiles = async (files: FileList | null) => { + if (!files || files.length === 0) return; + for (const file of Array.from(files)) { + const result = await uploadFile(file); + if (result) { + setContracts(prev => [result, ...prev]); + // Pre-fetch thumbnail for image + if (isImage(result.mime_type)) { + const url = await getSignedUrl(result.file_path); + if (url) setThumbnails(prev => ({ ...prev, [result.id]: url })); + } + } + } + }; + + const handleOpen = async (contract: UploadedContract) => { + if (isImage(contract.mime_type) && thumbnails[contract.id]) { + setLightboxUrl(thumbnails[contract.id]); + return; + } + setLoadingOpen(contract.id); + const url = await getSignedUrl(contract.file_path); + setLoadingOpen(null); + if (url) { + if (isImage(contract.mime_type)) { + setLightboxUrl(url); + } else { + window.open(url, '_blank', 'noopener,noreferrer'); + } + } + }; + + const handleDelete = async (contract: UploadedContract) => { + setDeletingId(contract.id); + const ok = await deleteContract(contract.id, contract.file_path); + setDeletingId(null); + if (ok) { + setContracts(prev => prev.filter(c => c.id !== contract.id)); + setThumbnails(prev => { const n = { ...prev }; delete n[contract.id]; return n; }); + } + }; + + return ( + <> +
+ {/* Drop zone */} +
{ e.preventDefault(); setDragging(true); }} + onDragLeave={() => setDragging(false)} + onDrop={e => { e.preventDefault(); setDragging(false); handleFiles(e.dataTransfer.files); }} + onClick={() => inputRef.current?.click()} + className={` + border-2 border-dashed rounded-xl p-4 cursor-pointer transition-all text-center + ${dragging + ? 'border-emerald-500 bg-emerald-900/20' + : 'border-slate-600 bg-slate-800/50 hover:border-slate-500 hover:bg-slate-800' + } + `} + > + handleFiles(e.target.files)} + /> + {uploading ? ( +
+ + Subiendo... +
+ ) : ( +
+ + + Arrastra archivos o pulsa para seleccionar + + PDF, JPEG, PNG · máx. 10 MB +
+ )} +
+ + {/* Error */} + {error && ( +
+ + {error} +
+ )} + + {/* File list */} + {contracts.length > 0 && ( +
    + {contracts.map(contract => ( +
  • + {/* Image thumbnail */} + {isImage(contract.mime_type) && ( + + )} + + {/* File info row */} +
    + {!isImage(contract.mime_type) && ( +
    + +
    + )} +
    +

    {contract.filename}

    +

    {formatBytes(contract.size_bytes)}

    +
    + {!isImage(contract.mime_type) && ( + + )} + +
    +
  • + ))} +
+ )} +
+ + {/* Lightbox */} + + {lightboxUrl && ( + setLightboxUrl(null)} + className="fixed inset-0 bg-black/92 z-[100] flex items-center justify-center p-4" + > + + e.stopPropagation()} + /> + + )} + + + ); +} diff --git a/apps/web/src/components/CustomMobileCalendar.tsx b/apps/web/src/components/CustomMobileCalendar.tsx new file mode 100644 index 0000000..c7262e7 --- /dev/null +++ b/apps/web/src/components/CustomMobileCalendar.tsx @@ -0,0 +1,155 @@ +import { useState } from 'react'; +import { + format, startOfMonth, endOfMonth, startOfWeek, endOfWeek, + eachDayOfInterval, isSameMonth, isSameDay, addMonths, subMonths, + isWithinInterval, parseISO, isBefore +} from 'date-fns'; +import { es } from 'date-fns/locale/es'; +import { ChevronLeft, ChevronRight } from 'lucide-react'; +import { toast } from 'sonner'; +import type { Reservation } from '../types'; + +interface Props { + reservations: Reservation[]; + onSelectRange: (start: Date, end: Date) => void; + onSelectReservation: (reservation: Reservation) => void; +} + +export function CustomMobileCalendar({ reservations, onSelectRange, onSelectReservation }: Props) { + const [currentDate, setCurrentDate] = useState(new Date()); + const [selectionStart, setSelectionStart] = useState(null); + + const monthStart = startOfMonth(currentDate); + const monthEnd = endOfMonth(monthStart); + const startDate = startOfWeek(monthStart, { locale: es }); + const endDate = endOfWeek(monthEnd, { locale: es }); + + const days = eachDayOfInterval({ start: startDate, end: endDate }); + + const nextMonth = () => setCurrentDate(addMonths(currentDate, 1)); + const prevMonth = () => setCurrentDate(subMonths(currentDate, 1)); + + const getReservationForDay = (day: Date) => { + return reservations.find(res => + isWithinInterval(day, { start: parseISO(res.start_date), end: parseISO(res.end_date) }) + ); + }; + + const rangeHasOverlap = (start: Date, end: Date) => { + const rangeDays = eachDayOfInterval({ start, end }); + return rangeDays.some(day => getReservationForDay(day)); + }; + + const handleDayClick = (day: Date) => { + const existingRes = getReservationForDay(day); + + if (existingRes) { + onSelectReservation(existingRes); + setSelectionStart(null); + return; + } + + if (!selectionStart) { + setSelectionStart(day); + return; + } + + let start = selectionStart; + let end = day; + + if (isBefore(day, selectionStart)) { + start = day; + end = selectionStart; + } + + if (rangeHasOverlap(start, end)) { + toast.error("No puedes seleccionar un rango que incluya días ya reservados."); + setSelectionStart(null); + return; + } + + onSelectRange(start, end); + setSelectionStart(null); + }; + + return ( +
+ {/* Header */} +
+

+ {format(currentDate, 'MMMM yyyy', { locale: es })} +

+
+ + +
+
+ + {/* Week Days */} +
+ {['Dom', 'Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sáb'].map(day => ( +
+ {day} +
+ ))} +
+ + {/* Days Grid - NUEVO DISEÑO TIPO AIRBNB */} +
+ {days.map((day) => { + const dayRes = getReservationForDay(day); + const isSelected = selectionStart && isSameDay(day, selectionStart); + const isCurrentMonth = isSameMonth(day, monthStart); + + // Palette de colores según referencia + let bgColor = 'bg-white'; + let numberBgColor = ''; + let numberTextColor = 'text-gray-400'; + + if (dayRes) { + if (dayRes.origin === 'Teneriffa2000') { + bgColor = 'bg-blue-100'; // Fondo azul pastel + numberBgColor = 'bg-blue-500'; // Círculo azul intenso + numberTextColor = 'text-white'; + } else { + bgColor = 'bg-yellow-100'; // Fondo amarillo pastel + numberBgColor = 'bg-yellow-500'; // Círculo amarillo intenso + numberTextColor = 'text-white'; + } + } else if (isSelected) { + bgColor = 'bg-gray-800'; + numberBgColor = 'bg-white'; + numberTextColor = 'text-gray-800'; + } else if (isCurrentMonth) { + numberTextColor = 'text-gray-900'; + } + + return ( +
handleDayClick(day)} + className={` + relative h-12 flex items-center justify-center cursor-pointer + transition-all duration-150 + ${bgColor} + `} + > +
+ {format(day, 'd')} +
+
+ ); + })} +
+
+ ); +} diff --git a/apps/web/src/components/DocumentUpload.tsx b/apps/web/src/components/DocumentUpload.tsx new file mode 100644 index 0000000..f0a19b3 --- /dev/null +++ b/apps/web/src/components/DocumentUpload.tsx @@ -0,0 +1,390 @@ +import { useEffect, useImperativeHandle, useRef, useState, forwardRef } from 'react'; +import { Upload, Trash2, FileText, AlertCircle, Loader2, X, Maximize2 } from 'lucide-react'; +import { + useFileUpload, + validateFile, + uploadDocumentFile, + type UploadedContract, + type DocumentType, +} from '../hooks/useFileUpload'; +import { motion, AnimatePresence } from 'framer-motion'; + +/** + * Imperativo que expone el componente al padre. Cuando el modal se monta en + * modo "create" no hay reservation_id todavía, así que los archivos quedan en + * `pendingFiles`. Tras crear la reserva, el padre llama a `flushPending(id)` + * para subir todos los pendientes a la nueva reserva. + */ +export interface DocumentUploadHandle { + hasPending: () => boolean; + flushPending: (reservationId: string) => Promise; +} + +interface Props { + /** ID de la reserva. Si es undefined, los archivos se acumulan localmente. */ + reservationId?: string; + documentType: DocumentType; +} + +function formatBytes(bytes: number): string { + if (bytes < 1024) return `${bytes} B`; + if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; + return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; +} + +const isImage = (mimeType: string) => mimeType.startsWith('image/'); + +interface PendingFile { + id: string; // local id (uuid-ish) + file: File; + previewUrl: string | null; // para imágenes locales +} + +export const DocumentUpload = forwardRef(function DocumentUpload( + { reservationId, documentType }, + ref, +) { + const safeId = reservationId ?? '__pending__'; + const { uploading, error: uploadError, uploadFile, fetchContracts, getSignedUrl, deleteContract } = + useFileUpload(safeId, documentType); + const [contracts, setContracts] = useState([]); + const [thumbnails, setThumbnails] = useState>({}); + const [lightboxUrl, setLightboxUrl] = useState(null); + const [loadingOpen, setLoadingOpen] = useState(null); + const [deletingId, setDeletingId] = useState(null); + const [pending, setPending] = useState([]); + const [localError, setLocalError] = useState(null); + const inputRef = useRef(null); + const [dragging, setDragging] = useState(false); + + const error = localError ?? uploadError; + + // Carga lista de archivos remotos solo si hay reservationId + useEffect(() => { + if (!reservationId) { + setContracts([]); + return; + } + fetchContracts().then(list => { + setContracts(list); + list.filter(c => isImage(c.mime_type)).forEach(async c => { + const url = await getSignedUrl(c.file_path); + if (url) setThumbnails(prev => ({ ...prev, [c.id]: url })); + }); + }); + }, [reservationId, fetchContracts, getSignedUrl]); + + // Limpia las URLs de objeto al desmontar + useEffect(() => { + return () => { + pending.forEach(p => p.previewUrl && URL.revokeObjectURL(p.previewUrl)); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useImperativeHandle(ref, () => ({ + hasPending: () => pending.length > 0, + flushPending: async (newReservationId: string) => { + for (const p of pending) { + try { + await uploadDocumentFile(p.file, newReservationId, documentType); + } catch (err) { + console.error('Error subiendo archivo pendiente:', err); + } + } + pending.forEach(p => p.previewUrl && URL.revokeObjectURL(p.previewUrl)); + setPending([]); + }, + }), [pending, documentType]); + + const handleFiles = async (files: FileList | null) => { + if (!files || files.length === 0) return; + setLocalError(null); + + if (!reservationId) { + // Modo diferido: acumular localmente + const newPending: PendingFile[] = []; + for (const file of Array.from(files)) { + const validationError = validateFile(file); + if (validationError) { + setLocalError(validationError); + continue; + } + newPending.push({ + id: `pending-${Date.now()}-${Math.random().toString(36).slice(2)}`, + file, + previewUrl: isImage(file.type) ? URL.createObjectURL(file) : null, + }); + } + if (newPending.length > 0) { + setPending(prev => [...newPending, ...prev]); + } + return; + } + + // Modo directo: subir al servidor + for (const file of Array.from(files)) { + const result = await uploadFile(file); + if (result) { + setContracts(prev => [result, ...prev]); + if (isImage(result.mime_type)) { + const url = await getSignedUrl(result.file_path); + if (url) setThumbnails(prev => ({ ...prev, [result.id]: url })); + } + } + } + }; + + const handleOpen = async (contract: UploadedContract) => { + if (isImage(contract.mime_type) && thumbnails[contract.id]) { + setLightboxUrl(thumbnails[contract.id]); + return; + } + setLoadingOpen(contract.id); + const url = await getSignedUrl(contract.file_path); + setLoadingOpen(null); + if (url) { + if (isImage(contract.mime_type)) { + setLightboxUrl(url); + } else { + window.open(url, '_blank', 'noopener,noreferrer'); + } + } + }; + + const handleDelete = async (contract: UploadedContract) => { + setDeletingId(contract.id); + const ok = await deleteContract(contract.id, contract.file_path); + setDeletingId(null); + if (ok) { + setContracts(prev => prev.filter(c => c.id !== contract.id)); + setThumbnails(prev => { const n = { ...prev }; delete n[contract.id]; return n; }); + } + }; + + const handleDeletePending = (id: string) => { + setPending(prev => { + const target = prev.find(p => p.id === id); + if (target?.previewUrl) URL.revokeObjectURL(target.previewUrl); + return prev.filter(p => p.id !== id); + }); + }; + + const handleOpenPending = (p: PendingFile) => { + if (p.previewUrl) { + setLightboxUrl(p.previewUrl); + } else { + // Para PDFs locales, abre en nueva pestaña con object URL + const url = URL.createObjectURL(p.file); + window.open(url, '_blank', 'noopener,noreferrer'); + // No revocamos inmediatamente: el navegador lo necesita mientras esté abierto + } + }; + + return ( + <> +
+ {/* Drop zone */} +
{ e.preventDefault(); setDragging(true); }} + onDragLeave={() => setDragging(false)} + onDrop={e => { e.preventDefault(); setDragging(false); handleFiles(e.dataTransfer.files); }} + onClick={() => inputRef.current?.click()} + className={` + border-2 border-dashed rounded-xl p-4 cursor-pointer transition-all text-center + ${dragging + ? 'border-emerald-500 bg-emerald-900/20' + : 'border-slate-600 bg-slate-800/50 hover:border-slate-500 hover:bg-slate-800' + } + `} + > + handleFiles(e.target.files)} + /> + {uploading ? ( +
+ + Subiendo... +
+ ) : ( +
+ + + Arrastra archivos o pulsa para seleccionar + + PDF, JPEG, PNG · máx. 10 MB + {!reservationId && (pending.length > 0) && ( + + Se subirán al guardar la reserva + + )} +
+ )} +
+ + {/* Error */} + {error && ( +
+ + {error} +
+ )} + + {/* Pending files (modo diferido) */} + {pending.length > 0 && ( +
    + {pending.map(p => ( +
  • + {isImage(p.file.type) && p.previewUrl && ( + + )} +
    + {!isImage(p.file.type) && ( +
    + +
    + )} +
    +

    {p.file.name}

    +

    {formatBytes(p.file.size)} · pendiente

    +
    + {!isImage(p.file.type) && ( + + )} + +
    +
  • + ))} +
+ )} + + {/* Uploaded files */} + {contracts.length > 0 && ( +
    + {contracts.map(contract => ( +
  • + {isImage(contract.mime_type) && ( + + )} +
    + {!isImage(contract.mime_type) && ( +
    + +
    + )} +
    +

    {contract.filename}

    +

    {formatBytes(contract.size_bytes)}

    +
    + {!isImage(contract.mime_type) && ( + + )} + +
    +
  • + ))} +
+ )} +
+ + {/* Lightbox */} + + {lightboxUrl && ( + setLightboxUrl(null)} + className="fixed inset-0 bg-black/92 z-[100] flex items-center justify-center p-4" + > + + e.stopPropagation()} + /> + + )} + + + ); +}); diff --git a/apps/web/src/components/LoginPage.tsx b/apps/web/src/components/LoginPage.tsx new file mode 100644 index 0000000..bd21dcc --- /dev/null +++ b/apps/web/src/components/LoginPage.tsx @@ -0,0 +1,108 @@ +import React, { useState } from 'react'; +import { supabase } from '../lib/supabase'; +import { Calendar, Loader2, Lock, Mail, ArrowRight } from 'lucide-react'; +import { toast } from 'sonner'; + +export function LoginPage() { + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [loading, setLoading] = useState(false); + + const handleLogin = async (e: React.FormEvent) => { + e.preventDefault(); + setLoading(true); + + try { + const { error } = await supabase.auth.signInWithPassword({ + email, + password, + }); + + if (error) { + toast.error('Error al iniciar sesión: ' + error.message); + } else { + toast.success('¡Bienvenido de nuevo!'); + } + } catch (err) { + toast.error('Ocurrió un error inesperado'); + console.error(err); + } finally { + setLoading(false); + } + }; + + return ( +
+
+ + {/* Header */} +
+
+ +
+

+ Naturcalabacera +

+

+ Sistema de Gestión de Reservas +

+
+ + {/* Form */} +
+
+ +
+ + setEmail(e.target.value)} + className="w-full bg-stone-50 dark:bg-black/40 border border-stone-200 dark:border-emerald-900/30 rounded-xl py-3 pl-12 pr-4 text-stone-900 dark:text-white placeholder:text-stone-400 dark:placeholder:text-emerald-800/40 focus:outline-none focus:ring-2 focus:ring-emerald-500/50 focus:border-emerald-500/50 transition-all font-medium" + placeholder="nombre@empresa.com" + /> +
+
+ +
+ +
+ + setPassword(e.target.value)} + className="w-full bg-stone-50 dark:bg-black/40 border border-stone-200 dark:border-emerald-900/30 rounded-xl py-3 pl-12 pr-4 text-stone-900 dark:text-white placeholder:text-stone-400 dark:placeholder:text-emerald-800/40 focus:outline-none focus:ring-2 focus:ring-emerald-500/50 focus:border-emerald-500/50 transition-all font-medium" + placeholder="••••••••" + /> +
+
+ + +
+ + {/* Footer */} +
+

+ Protegido por autenticación segura +

+
+
+
+ ); +} diff --git a/apps/web/src/components/MobileNavigation.tsx b/apps/web/src/components/MobileNavigation.tsx new file mode 100644 index 0000000..8c1acc8 --- /dev/null +++ b/apps/web/src/components/MobileNavigation.tsx @@ -0,0 +1,89 @@ +import { Calendar, Settings, CalendarDays, Home, Users } from 'lucide-react'; +import { useProperty } from '../contexts/PropertyContext'; +import { PROPERTY_CONFIG, PROPERTIES } from '@naturcalabacera/shared'; +import type { Property } from '@naturcalabacera/shared'; + +interface Props { + currentView: string; + onNavigate: (view: string) => void; + isViewer?: boolean; + isAdmin?: boolean; +} + +export function MobileNavigation({ currentView, onNavigate, isViewer = false, isAdmin = false }: Props) { + const { property, setProperty } = useProperty(); + const allMenuItems = [ + { id: 'calendar', label: 'Mensual', icon: Calendar, requires: 'all' as const }, + { id: 'yearly', label: 'Anual', icon: CalendarDays, requires: 'all' as const }, + { id: 'users', label: 'Usuarios', icon: Users, requires: 'admin' as const }, + { id: 'settings', label: 'Ajustes', icon: Settings, requires: 'staff' as const }, + ]; + const menuItems = allMenuItems.filter(item => { + if (item.requires === 'all') return true; + if (item.requires === 'admin') return isAdmin; + if (item.requires === 'staff') return !isViewer; + return false; + }); + + return ( +
+ {/* Selector de propiedad en mobile — fila superior compacta (solo staff) */} + {!isViewer && ( +
+ {PROPERTIES.map((p: Property) => { + const config = PROPERTY_CONFIG[p]; + const isActive = property === p; + return ( + + ); + })} +
+ )} + + {/* Navegación principal */} +
+ {menuItems.map((item) => { + const Icon = item.icon; + const isActive = currentView === item.id; + + return ( + + ); + })} +
+
+ ); +} diff --git a/apps/web/src/components/PricingSection.tsx b/apps/web/src/components/PricingSection.tsx new file mode 100644 index 0000000..90a9bba --- /dev/null +++ b/apps/web/src/components/PricingSection.tsx @@ -0,0 +1,87 @@ +import { calculateNaturPrice, formatPrice, DEFAULT_IGIC_RATE } from '@naturcalabacera/shared'; +import { differenceInDays, parseISO } from 'date-fns'; +import { Calculator } from 'lucide-react'; +import type { Property } from '../types'; + +interface Props { + property: Property; + startDate: string; + endDate: string; + adults: number; + children: number; + igicRate?: number; +} + +/** + * Muestra el desglose de precios para reservas Naturcalabacera vacacional. + * El cálculo es en tiempo real — no requiere guardar para ver los precios. + * Al guardar, el llamador debe congelar el snapshot en pricing_snapshot. + */ +export function PricingSection({ property, startDate, endDate, adults, children, igicRate = DEFAULT_IGIC_RATE }: Props) { + const nights = startDate && endDate + ? Math.max(0, differenceInDays(parseISO(endDate), parseISO(startDate))) + : 0; + const totalPersons = (Number(adults) || 0) + (Number(children) || 0); + + if (nights <= 0 || totalPersons <= 0) { + return ( +
+ +

+ Introduce fechas y personas para ver el cálculo de precio +

+
+ ); + } + + const year = startDate ? parseISO(startDate).getFullYear() : new Date().getFullYear(); + const pricing = calculateNaturPrice({ property, nights, totalPersons, igicRate, year }); + + return ( +
+
+ + Precio Natur + + {nights}n · {totalPersons}p + +
+ +
+
+ Canon base ({nights} noches) + {formatPrice(pricing.basePrice)} +
+ + {pricing.extraPersons > 0 && ( +
+ + +{pricing.extraPersons} persona{pricing.extraPersons !== 1 ? 's' : ''} extra + (sobre {pricing.includedPersons} incluidas) + + {formatPrice(pricing.extraPersonsFee)} +
+ )} + +
+ Subtotal + {formatPrice(pricing.subtotal)} +
+ +
+ IGIC ({(igicRate * 100).toFixed(0)}%) + {formatPrice(pricing.igicAmount)} +
+ +
+ Total + {formatPrice(pricing.total)} +
+
+ +

+ * Precio calculado al vuelo. Se congela al guardar la reserva. +

+
+ ); +} diff --git a/apps/web/src/components/PropertySelector.tsx b/apps/web/src/components/PropertySelector.tsx new file mode 100644 index 0000000..7093afc --- /dev/null +++ b/apps/web/src/components/PropertySelector.tsx @@ -0,0 +1,43 @@ +import { useProperty } from '../contexts/PropertyContext'; +import { PROPERTY_CONFIG, PROPERTIES } from '@naturcalabacera/shared'; +import type { Property } from '@naturcalabacera/shared'; + +export function PropertySelector() { + const { property, setProperty } = useProperty(); + + return ( +
+ + Propiedad + +
+ {PROPERTIES.map((p: Property) => { + const config = PROPERTY_CONFIG[p]; + const isActive = property === p; + return ( + + ); + })} +
+
+ ); +} diff --git a/apps/web/src/components/ReservationModal.tsx b/apps/web/src/components/ReservationModal.tsx new file mode 100644 index 0000000..e5af702 --- /dev/null +++ b/apps/web/src/components/ReservationModal.tsx @@ -0,0 +1,628 @@ +import { useEffect, useRef, useState } from 'react'; +import { useForm } from 'react-hook-form'; +import type { NewReservation, Reservation, Property } from '../types'; +import { X, Check, Trash2, AlertCircle, ChevronDown, Zap, Paperclip, Receipt } from 'lucide-react'; +import { differenceInDays, parseISO } from 'date-fns'; +import { motion, AnimatePresence } from 'framer-motion'; +import { PROPERTY_CONFIG, getExtraPersonRate } from '@naturcalabacera/shared'; +import { useProperty } from '../contexts/PropertyContext'; +import { PricingSection } from './PricingSection'; +import { DocumentUpload, type DocumentUploadHandle } from './DocumentUpload'; + +interface Props { + isOpen: boolean; + mode: 'create' | 'edit'; + initialData?: Partial; + existingReservations?: Reservation[]; + onClose: () => void; + onSave: (data: NewReservation) => Promise; + onDelete?: (id: string) => Promise; +} + +const EVENT_TYPES = ['Boda', 'Comunión', 'Cumpleaños', 'Evento privado', 'Corporativo', 'Otro'] as const; + +export function ReservationModal({ + isOpen, + mode, + initialData, + existingReservations = [], + onClose, + onSave, + onDelete, +}: Props) { + const { property } = useProperty(); + const propertyConfig = PROPERTY_CONFIG[property]; + + const { + register, + handleSubmit, + watch, + reset, + setValue, + setError, + clearErrors, + formState: { errors }, + } = useForm(); + + // Event toggle — local state (not a form field, controls section visibility) + const [isEvent, setIsEvent] = useState(false); + + // Override manual de la tarifa por persona extra (€/pax/noche). + // null = usar tarifa automática por año. + const [extraRateOverride, setExtraRateOverride] = useState(null); + + // Refs a los DocumentUpload para hacer flush de archivos pendientes tras crear la reserva. + const contractUploadRef = useRef(null); + const invoiceUploadRef = useRef(null); + + useEffect(() => { + if (isOpen) { + reset({ + origin: 'Teneriffa2000', + adults_count: 2, + children_count: 0, + government_registration: '', + has_cleaning: false, + has_pool_heating: false, + has_flies_products: false, + observations: '', + is_event: false, + event_type: '', + event_type_other: '', + attendees_count: 0, + ...initialData, + }); + setIsEvent(initialData?.is_event ?? false); + const snapshotOverride = initialData?.pricing_snapshot?.extraPersonRateOverride; + setExtraRateOverride(snapshotOverride ?? null); + clearErrors(); + } + }, [isOpen, initialData, reset, clearErrors]); + + const startDate = watch('start_date'); + const endDate = watch('end_date'); + const adults = watch('adults_count'); + const children = watch('children_count'); + const origin = watch('origin'); + const eventType = watch('event_type'); + + const totalDays = startDate && endDate + ? Math.max(0, differenceInDays(parseISO(endDate), parseISO(startDate))) + : 0; + const totalPeople = (Number(adults) || 0) + (Number(children) || 0); + + // Auto-correct: if start_date moves ahead of end_date, set end_date = start_date + useEffect(() => { + if (startDate && endDate && parseISO(endDate) < parseISO(startDate)) { + setValue('end_date', startDate); + clearErrors('end_date'); + } + }, [startDate, endDate, setValue, clearErrors]); + + // Event pricing: uses totalPeople (adults + children) as attendee count. + // La tarifa por persona extra depende del año de start_date (12€ en 2026, 14€ desde 2027) + // y puede sobrescribirse manualmente con extraRateOverride. + const reservationYear = startDate ? parseISO(startDate).getFullYear() : new Date().getFullYear(); + const autoExtraRate = getExtraPersonRate(property, reservationYear); + const effectiveExtraRate = extraRateOverride ?? autoExtraRate; + const eventPricing = (() => { + const cfg = PROPERTY_CONFIG[property]; + const extra = Math.max(0, totalPeople - cfg.pricing.includedPersons); + const subtotal = cfg.pricing.baseRatePerNight + extra * effectiveExtraRate; + return { extra, subtotal, cfg, extraRate: effectiveExtraRate, isOverride: extraRateOverride !== null }; + })(); + + /** + * Overlap check — intervalos semi-abiertos [start, end). + * El día de salida de una reserva existente SÍ permite entrada ese mismo día: + * si res=[19, 20] y new=[20, 21], no hay solapamiento (check-out y check-in mismo día). + * Fórmula: overlap iff newStart < resEnd AND newEnd > resStart + */ + const checkOverlap = (start: string, end: string, currentProperty: Property): boolean => { + const newStart = parseISO(start); + const newEnd = parseISO(end); + const toCheck = existingReservations.filter(r => { + if (mode === 'edit' && r.id === initialData?.id) return false; + return r.property === currentProperty; + }); + return toCheck.some(res => { + const resStart = parseISO(res.start_date); + const resEnd = parseISO(res.end_date); + return newStart < resEnd && newEnd > resStart; + }); + }; + + const onSubmit = async (data: NewReservation) => { + if (!data.start_date || !data.end_date) { + setError('start_date', { type: 'manual', message: 'Las fechas son obligatorias' }); + return; + } + if (parseISO(data.end_date) < parseISO(data.start_date)) { + setError('end_date', { type: 'manual', message: 'La fecha de salida no puede ser anterior a la de entrada' }); + return; + } + if (checkOverlap(data.start_date, data.end_date, property)) { + setError('start_date', { + type: 'manual', + message: `Las fechas seleccionadas se superponen con otra reserva en ${propertyConfig.label}`, + }); + return; + } + + // Build a clean payload: only include event fields when actually used, + // to avoid sending unknown columns to Supabase if the migration hasn't run. + const saveData: NewReservation = { + origin: data.origin, + client_name: data.client_name, + start_date: data.start_date, + end_date: data.end_date, + adults_count: Number(data.adults_count) || 0, + children_count: Number(data.children_count) || 0, + has_cleaning: Boolean(data.has_cleaning), + has_pool_heating: Boolean(data.has_pool_heating), + has_flies_products: Boolean(data.has_flies_products), + government_registration: data.government_registration || undefined, + observations: data.observations || undefined, + igic_rate: data.igic_rate, + pricing_snapshot: data.pricing_snapshot, + property, + }; + + if (isEvent) { + saveData.is_event = true; + if (data.event_type) saveData.event_type = data.event_type; + if (data.event_type === 'Otro' && data.event_type_other) saveData.event_type_other = data.event_type_other; + if (totalPeople > 0) saveData.attendees_count = totalPeople; + + // Congelar el cálculo del canon en pricing_snapshot + const cfg = PROPERTY_CONFIG[property].pricing; + const igicRate = data.igic_rate ?? 0.07; + const basePrice = cfg.baseRatePerNight; + const extraPersonsFee = eventPricing.extra * effectiveExtraRate; + const subtotal = basePrice + extraPersonsFee; + const igicAmount = Math.round(subtotal * igicRate * 100) / 100; + const total = Math.round((subtotal + igicAmount) * 100) / 100; + saveData.pricing_snapshot = { + basePrice, + extraPersonsFee, + subtotal, + igicAmount, + total, + calculatedAt: new Date().toISOString(), + extraPersonRate: effectiveExtraRate, + ...(extraRateOverride !== null ? { extraPersonRateOverride: extraRateOverride } : {}), + }; + } + + const result = await onSave(saveData); + if (!result) { + // onSave abortó (error o falta de id en edit). No cerramos el modal. + return; + } + // Si creamos una reserva nueva, sube los documentos pendientes ahora que tenemos id + const newId = typeof result === 'object' && 'id' in result ? (result as Reservation).id : undefined; + if (newId) { + try { + await Promise.all([ + contractUploadRef.current?.flushPending(newId), + invoiceUploadRef.current?.flushPending(newId), + ]); + } catch (err) { + console.error('Error subiendo documentos pendientes:', err); + } + } + onClose(); + }; + + return ( + + {isOpen && ( + <> + {/* Backdrop */} + + + {/* Sheet — always dark */} + + {/* Drag handle */} +
+
+
+ +
+ {/* Header */} +
+
+

+ {mode === 'create' ? 'Nueva Estancia' : 'Editar Estancia'} +

+

+ {totalDays} noches · {totalPeople} personas +

+
+
+ {propertyConfig.label} +
+
+ +
+ +
+ + {/* Validation error */} + {(errors.start_date || errors.end_date) && ( +
+ +
+

Error de validación

+

+ {errors.start_date?.message || errors.end_date?.message} +

+
+
+ )} + + {/* 1. Empresa / Origen */} +
+ +
+