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:
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user