84 lines
2.4 KiB
JavaScript
84 lines
2.4 KiB
JavaScript
/*
|
|
|--------------------------------------------------------------------------
|
|
| Agência PSI
|
|
|--------------------------------------------------------------------------
|
|
| Criado e desenvolvido por Leonardo Nohama
|
|
|
|
|
| Tecnologia aplicada à escuta.
|
|
| Estrutura para o cuidado.
|
|
|
|
|
| Arquivo: src/composables/useAuth.js
|
|
| Data: 2026
|
|
| Local: São Carlos/SP — Brasil
|
|
|--------------------------------------------------------------------------
|
|
| © 2026 — Todos os direitos reservados
|
|
|--------------------------------------------------------------------------
|
|
*/
|
|
|
|
/**
|
|
* ---------------------------------------------------------
|
|
* useAuth()
|
|
* ---------------------------------------------------------
|
|
*
|
|
* Stack do projeto:
|
|
* - Vue 3 (Composition API)
|
|
* - PrimeVue (UI)
|
|
* - Supabase (Auth + Database)
|
|
*
|
|
* Responsabilidade:
|
|
* Camada global de AUTENTICAÇÃO baseada no Supabase.
|
|
*
|
|
* O que este composable faz:
|
|
* - Obtém a sessão atual do Supabase (auth.getSession)
|
|
* - Mantém o estado reativo do usuário autenticado
|
|
* - Escuta mudanças de autenticação (login, logout, refresh de token)
|
|
* - Expõe apenas a identidade do usuário (user)
|
|
*
|
|
* O que ele NÃO faz:
|
|
* - Não controla permissões
|
|
* - Não valida roles
|
|
* - Não decide acesso a telas ou botões
|
|
* - Não aplica regras de plano (Free/Pro)
|
|
*
|
|
* Conceito arquitetural:
|
|
* Este arquivo trata apenas de IDENTIDADE (Auth).
|
|
*
|
|
* Auth → "Quem é o usuário autenticado?"
|
|
* AuthZ → "O que esse usuário pode acessar ou executar?"
|
|
*
|
|
* A AUTORIZAÇÃO deve ser tratada em outra camada,
|
|
* como por exemplo:
|
|
* - useAuthz()
|
|
* - tenantStore (membership.role)
|
|
* - entitlementsStore (features do plano)
|
|
*
|
|
* Observação importante:
|
|
* O role do usuário NÃO vem do Supabase Auth.
|
|
* Ele é definido na tabela de membership (multi-tenant).
|
|
*
|
|
* Portanto:
|
|
* Nunca utilizar apenas `user` para controle de acesso.
|
|
*
|
|
* Esse composable é apenas a base de identidade do sistema.
|
|
*/
|
|
|
|
import { ref, onMounted } from 'vue';
|
|
import { supabase } from '@/lib/supabase/client';
|
|
|
|
const user = ref(null);
|
|
|
|
export function useAuth() {
|
|
const init = async () => {
|
|
const { data } = await supabase.auth.getSession();
|
|
user.value = data.session?.user || null;
|
|
};
|
|
|
|
supabase.auth.onAuthStateChange((_, session) => {
|
|
user.value = session?.user || null;
|
|
});
|
|
|
|
onMounted(init);
|
|
|
|
return { user };
|
|
}
|