Refactor: Use email (login) for user identification

Update the system to use the user's email (login) as the primary identifier for linking users, WhatsApp groups, and transactions. This includes changes to the `grupos_whatsapp` and `transacoes` tables, as well as adjustments to queries and data retrieval logic. The `user_id` field is maintained for compatibility.
This commit is contained in:
gpt-engineer-app[bot] 2025-05-20 01:08:48 +00:00
parent 8435c03464
commit 6a38fd0bf1
4 changed files with 96 additions and 45 deletions

View File

@ -52,11 +52,18 @@ export function TransactionForm({ onSuccess, onCancel, defaultTipo = 'despesa',
// Buscar grupos do usuário ao carregar o formulário
useState(() => {
const fetchGrupos = async () => {
const userId = localStorage.getItem('userId') || 'default';
const userEmail = localStorage.getItem('userEmail');
if (!userEmail) {
console.error('Email do usuário não encontrado');
return;
}
const normalizedEmail = userEmail.trim().toLowerCase();
const { data, error } = await supabase
.from('grupos_whatsapp')
.select('remote_jid, nome_grupo')
.eq('user_id', userId);
.eq('login', normalizedEmail);
if (error) {
console.error('Erro ao buscar grupos:', error);
@ -85,10 +92,23 @@ export function TransactionForm({ onSuccess, onCancel, defaultTipo = 'despesa',
setIsSubmitting(true);
try {
// Get user ID from localStorage - with RLS disabled, this is just for reference
const userId = localStorage.getItem('userId') || 'default';
const userEmail = localStorage.getItem('userEmail') || '';
const userName = localStorage.getItem('userName') || '';
// Get user email from localStorage - principal identifier now
const userEmail = localStorage.getItem('userEmail');
if (!userEmail) {
toast({
title: "Erro no formulário",
description: "Email do usuário não encontrado",
variant: "destructive"
});
return;
}
// Normalizar o email (minúsculo e sem espaços)
const normalizedEmail = userEmail.trim().toLowerCase();
// Get user ID from localStorage - kept for compatibility
const userId = localStorage.getItem('userId') || '';
const valorNumerico = parseFloat(data.valor.replace(',', '.'));
@ -106,11 +126,12 @@ export function TransactionForm({ onSuccess, onCancel, defaultTipo = 'despesa',
? Math.abs(valorNumerico)
: Math.abs(valorNumerico);
console.log(`Salvando transação para usuário: ${userId} (${userEmail || userName})`);
console.log(`Salvando transação para usuário: ${normalizedEmail} (ID: ${userId})`);
// Preparar dados da transação incluindo o grupo_id se fornecido
// Preparar dados da transação incluindo o login e grupo_id
const transactionData = {
user: userId,
user: userId, // Mantido por compatibilidade
login: normalizedEmail, // Campo principal para identificação
estabelecimento: data.estabelecimento,
valor: valorFinal,
detalhes: data.detalhes,

View File

@ -18,13 +18,11 @@ export async function cadastrarGrupoWhatsApp(): Promise<WhatsAppGroup | null> {
// Criar registro na tabela grupos_whatsapp
const { data, error } = await supabase
.from('grupos_whatsapp')
.insert([
{
user_id: localStorage.getItem('userId') || '',
login: normalizedEmail,
status: 'pendente'
}
])
.insert({
user_id: localStorage.getItem('userId') || '', // Mantido por compatibilidade
login: normalizedEmail,
status: 'pendente'
})
.select();
if (error) {

View File

@ -5,16 +5,24 @@ import { Transaction, CategorySummary } from "@/types/financialTypes";
export async function getTransacoes(): Promise<Transaction[]> {
console.log("Buscando transações do Supabase...");
// Obter o ID do usuário atual do localStorage
const userId = localStorage.getItem('userId') || 'default';
console.log("Buscando transações para o usuário:", userId);
// Obter o email do usuário do localStorage
const userEmail = localStorage.getItem('userEmail');
if (!userEmail) {
console.error('Email do usuário não encontrado no localStorage');
return [];
}
// Normalizar o email (minúsculo e sem espaços)
const normalizedEmail = userEmail.trim().toLowerCase();
console.log("Buscando transações para o usuário com email:", normalizedEmail);
try {
// Primeiro, buscar todos os grupos do usuário
// Primeiro, buscar todos os grupos do usuário pelo email
const { data: userGroups, error: groupsError } = await supabase
.from('grupos_whatsapp')
.select('remote_jid')
.eq('user_id', userId);
.eq('login', normalizedEmail);
if (groupsError) {
console.error('Erro ao buscar grupos do usuário:', groupsError);
@ -24,11 +32,11 @@ export async function getTransacoes(): Promise<Transaction[]> {
const groupIds = userGroups ? userGroups.map(group => group.remote_jid) : [];
console.log(`Encontrados ${groupIds.length} grupos vinculados ao usuário:`, groupIds);
// Buscar transações com filtro aprimorado
// Buscar transações com filtro baseado no email (login) ou grupo_id
const { data, error } = await supabase
.from('transacoes')
.select('*')
.or(`user.eq.${userId},${groupIds.length > 0 ? `grupo_id.in.(${groupIds.map(id => `"${id}"`).join(',')})` : ''}`)
.or(`login.eq.${normalizedEmail},${groupIds.length > 0 ? `grupo_id.in.(${groupIds.map(id => `"${id}"`).join(',')})` : ''}`)
.order('quando', { ascending: false });
if (error) {
@ -42,6 +50,7 @@ export async function getTransacoes(): Promise<Transaction[]> {
return data.map((item: any) => ({
id: item.id.toString(),
user: item.user || '',
login: item.login || normalizedEmail, // Garantir que o campo login esteja preenchido
created_at: item.created_at,
valor: item.tipo?.toLowerCase() === 'receita' ? Math.abs(item.valor || 0) : -Math.abs(item.valor || 0),
quando: item.quando || new Date().toISOString(),
@ -60,15 +69,23 @@ export async function getTransacoes(): Promise<Transaction[]> {
export async function getTransactionSummary() {
console.log("Buscando resumo das transações...");
// Obter o ID do usuário atual do localStorage
const userId = localStorage.getItem('userId') || 'default';
// Obter o email do usuário do localStorage
const userEmail = localStorage.getItem('userEmail');
if (!userEmail) {
console.error('Email do usuário não encontrado no localStorage');
return { receitas: 0, despesas: 0, saldo: 0 };
}
// Normalizar o email (minúsculo e sem espaços)
const normalizedEmail = userEmail.trim().toLowerCase();
try {
// Primeiro, buscar todos os grupos do usuário
// Primeiro, buscar todos os grupos do usuário pelo email
const { data: userGroups, error: groupsError } = await supabase
.from('grupos_whatsapp')
.select('remote_jid')
.eq('user_id', userId);
.eq('login', normalizedEmail);
if (groupsError) {
console.error('Erro ao buscar grupos do usuário:', groupsError);
@ -77,11 +94,11 @@ export async function getTransactionSummary() {
// Extrair IDs dos grupos para usar no filtro
const groupIds = userGroups ? userGroups.map(group => group.remote_jid) : [];
// Buscar resumo das transações com filtro aprimorado
// Buscar resumo das transações com filtro aprimorado baseado no email (login) ou grupo_id
const { data, error } = await supabase
.from('transacoes')
.select('tipo, valor')
.or(`user.eq.${userId},${groupIds.length > 0 ? `grupo_id.in.(${groupIds.map(id => `"${id}"`).join(',')})` : ''}`);
.or(`login.eq.${normalizedEmail},${groupIds.length > 0 ? `grupo_id.in.(${groupIds.map(id => `"${id}"`).join(',')})` : ''}`);
if (error) {
console.error('Erro ao buscar resumo das transações:', error);
@ -115,15 +132,23 @@ export async function getTransactionSummary() {
export async function getCategorySummary(tipoFiltro: string = 'despesa') {
console.log(`Buscando resumo de categorias para tipo: ${tipoFiltro}`);
// Obter o ID do usuário atual do localStorage
const userId = localStorage.getItem('userId') || 'default';
// Obter o email do usuário do localStorage
const userEmail = localStorage.getItem('userEmail');
if (!userEmail) {
console.error('Email do usuário não encontrado no localStorage');
return [];
}
// Normalizar o email (minúsculo e sem espaços)
const normalizedEmail = userEmail.trim().toLowerCase();
try {
// Primeiro, buscar todos os grupos do usuário
// Primeiro, buscar todos os grupos do usuário pelo email
const { data: userGroups, error: groupsError } = await supabase
.from('grupos_whatsapp')
.select('remote_jid')
.eq('user_id', userId);
.eq('login', normalizedEmail);
if (groupsError) {
console.error('Erro ao buscar grupos do usuário:', groupsError);
@ -132,11 +157,11 @@ export async function getCategorySummary(tipoFiltro: string = 'despesa') {
// Extrair IDs dos grupos para usar no filtro
const groupIds = userGroups ? userGroups.map(group => group.remote_jid) : [];
// Buscar resumo de categorias com filtro aprimorado
// Buscar resumo de categorias com filtro aprimorado baseado no email (login) ou grupo_id
const { data, error } = await supabase
.from('transacoes')
.select('categoria, valor, tipo')
.or(`user.eq.${userId},${groupIds.length > 0 ? `grupo_id.in.(${groupIds.map(id => `"${id}"`).join(',')})` : ''}`);
.or(`login.eq.${normalizedEmail},${groupIds.length > 0 ? `grupo_id.in.(${groupIds.map(id => `"${id}"`).join(',')})` : ''}`);
if (error) {
console.error('Erro ao buscar resumo de categorias:', error);
@ -192,15 +217,23 @@ export async function getCategorySummary(tipoFiltro: string = 'despesa') {
export async function getMonthlyData() {
console.log("Buscando dados mensais...");
// Obter o ID do usuário atual do localStorage
const userId = localStorage.getItem('userId') || 'default';
// Obter o email do usuário do localStorage
const userEmail = localStorage.getItem('userEmail');
if (!userEmail) {
console.error('Email do usuário não encontrado no localStorage');
return [];
}
// Normalizar o email (minúsculo e sem espaços)
const normalizedEmail = userEmail.trim().toLowerCase();
try {
// Primeiro, buscar todos os grupos do usuário
// Primeiro, buscar todos os grupos do usuário pelo email
const { data: userGroups, error: groupsError } = await supabase
.from('grupos_whatsapp')
.select('remote_jid')
.eq('user_id', userId);
.eq('login', normalizedEmail);
if (groupsError) {
console.error('Erro ao buscar grupos do usuário:', groupsError);
@ -209,11 +242,11 @@ export async function getMonthlyData() {
// Extrair IDs dos grupos para usar no filtro
const groupIds = userGroups ? userGroups.map(group => group.remote_jid) : [];
// Buscar dados mensais com filtro aprimorado
// Buscar dados mensais com filtro aprimorado baseado no email (login) ou grupo_id
const { data, error } = await supabase
.from('transacoes')
.select('quando, valor, tipo')
.or(`user.eq.${userId},${groupIds.length > 0 ? `grupo_id.in.(${groupIds.map(id => `"${id}"`).join(',')})` : ''}`);
.or(`login.eq.${normalizedEmail},${groupIds.length > 0 ? `grupo_id.in.(${groupIds.map(id => `"${id}"`).join(',')})` : ''}`);
if (error) {
console.error('Erro ao buscar dados mensais:', error);

View File

@ -1,8 +1,8 @@
export interface Transaction {
id: string;
user: string;
login?: string; // E-mail do usuário como identificador principal
created_at: string;
valor: number;
quando: string;
@ -60,11 +60,10 @@ export interface ResultadoMeta {
export interface WhatsAppGroup {
id: number;
user_id: string;
user_id: string | null; // Mantido apenas por compatibilidade
remote_jid: string | null;
nome_grupo: string | null;
created_at: string;
status: string;
login: string;
login: string; // E-mail do usuário como identificador principal
}