feat(fase-1): auth, collective management, and DB migrations

- SQL migrations: users, collectives, collective_members, collective_invitations,
  full RLS policies, is_active_member/is_member/is_admin helpers,
  accept_invitation SECURITY DEFINER function, admin auto-promote trigger,
  avatars storage bucket
- Auth refactor: replace keycloak-js with Supabase OAuth (GoTrue OIDC proxy,
  Option B). signInWithOAuth({ provider: 'keycloak' }) + PKCE flow
- GoTrue config: GOTRUE_EXTERNAL_KEYCLOAK_URL + GOTRUE_EXTERNAL_KEYCLOAK_REDIRECT_URI
  added to docker-compose.dev.yml; Keycloak realm updated with GoTrue callback URI
- New routes: /auth/callback, /invitation/[token], /(app)/collective/manage
- Functional onboarding: create collective or join via invite link
- Full settings page: display name (debounced), avatar (initials/emoji/upload),
  language switcher, Keycloak account console link
- Components: Avatar.svelte (initials/emoji/upload with fallback),
  ImageCropper.svelte (cropperjs, 1:1 crop, lazy-loaded)
- i18n: added all Fase 1 message keys (en + es); renamed 'delete' → 'action_delete'
  (JS reserved word); fixed plugin-m-function-matcher major-version URL format
- Database types: manually seeded packages/types/src/database.ts from migrations
- .env.development: committed public dev defaults for SvelteKit type checking
- CLAUDE.md: documented /etc/hosts requirement for keycloak hostname

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-12 15:29:29 +02:00
parent f197a81a42
commit 7d91705fc2
31 changed files with 8770 additions and 199 deletions

View File

@@ -11,15 +11,58 @@
"login_title": "Accede a Colectivo",
"login_button": "Iniciar sesión",
"logout_button": "Cerrar sesión",
"auth_back_to_home": "Volver al inicio",
"onboarding_title": "Bienvenido a Colectivo",
"onboarding_subtitle": "Crea un nuevo colectivo o únete a uno existente.",
"onboarding_create_tab": "Crear",
"onboarding_join_tab": "Unirse",
"onboarding_create_collective": "Crear un colectivo",
"onboarding_join_collective": "Unirme con un enlace de invitación",
"onboarding_collective_name": "Nombre del colectivo",
"onboarding_collective_name_placeholder": "p. ej. Nuestro Hogar",
"onboarding_collective_emoji": "Icono",
"onboarding_invite_link_label": "Enlace de invitación",
"onboarding_invite_link_placeholder": "Pega aquí el enlace de invitación…",
"onboarding_create_btn": "Crear colectivo",
"onboarding_join_btn": "Unirse al colectivo",
"collective_name_label": "Nombre del colectivo",
"collective_name_placeholder": "p. ej. Nuestro Hogar",
"invitation_title": "Tienes una invitación",
"invitation_subtitle": "Te han invitado a unirte a un colectivo.",
"invitation_accept_btn": "Aceptar invitación",
"invitation_success": "¡Te has unido al colectivo!",
"invitation_invalid_link": "Ese no parece un enlace de invitación válido.",
"invitation_error_not_found": "Este enlace de invitación no es válido.",
"invitation_error_already_used": "Esta invitación ya ha sido utilizada.",
"invitation_error_expired": "Esta invitación ha caducado.",
"invitation_error_already_member": "Ya eres miembro de este colectivo.",
"invitation_error_unauthenticated": "Debes iniciar sesión para aceptar una invitación.",
"invitation_error_unknown": "Algo salió mal. Por favor, inténtalo de nuevo.",
"manage_title": "Gestionar colectivo",
"manage_members": "Miembros",
"manage_you": "tú",
"manage_remove": "Eliminar miembro",
"manage_invite_title": "Invitar a alguien",
"manage_invite_role": "Rol",
"manage_generate_link": "Generar enlace de invitación",
"manage_copy": "Copiar",
"manage_copied": "¡Copiado!",
"manage_link_expires": "El enlace caduca en 7 días.",
"role_admin": "Administrador",
"role_member": "Miembro",
"role_guest": "Invitado",
"settings_title": "Ajustes",
"settings_display_name": "Nombre visible",
"settings_saving": "Guardando…",
"settings_language": "Idioma",
"settings_avatar": "Avatar",
"settings_avatar_initials": "Iniciales",
"settings_avatar_emoji": "Emoji",
"settings_avatar_upload": "Foto",
"settings_avatar_upload_btn": "Subir foto…",
"settings_account": "Cuenta",
"settings_keycloak_link": "Cambiar correo o contraseña",
"settings_logout": "Cerrar sesión",
"settings_save": "Guardar cambios",
"settings_saved": "Cambios guardados",
"invite_member": "Invitar miembro",
@@ -44,7 +87,7 @@
"confirm_delete": "¿Eliminar?",
"cancel": "Cancelar",
"save": "Guardar",
"delete": "Eliminar",
"action_delete": "Eliminar",
"edit": "Editar",
"add": "Añadir",
"done": "Listo"