Skip to content

Commit caa0356

Browse files
committed
Correção da inserção de itens na lista
1 parent 32a5f09 commit caa0356

File tree

10 files changed

+802
-246
lines changed

10 files changed

+802
-246
lines changed

CHANGELOG.md

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,29 @@
11
# Changelog
22

3-
## [1.0.0] - 2025-02-09
3+
## [1.1.0] - 2025-02-09
4+
### Adicionado
5+
- Sistema de logs detalhado para todas as operações
6+
- Validação de propriedade de itens antes de operações
7+
- Novo método `verificarProprietarioItem` na classe Lista
8+
9+
### Corrigido
10+
- Erro na autenticação de usuário em operações AJAX
11+
- Problema com checkbox em itens recém-adicionados
12+
- Erro 500 ao adicionar novos itens
13+
- Referências incorretas à tabela de itens no banco de dados
14+
15+
### Alterado
16+
- Melhorada a estrutura do HTML gerado para novos itens
17+
- Atualizado o sistema de tratamento de erros
18+
- Refatorado o código de manipulação de itens
19+
- Melhorada a documentação do projeto
20+
21+
### Segurança
22+
- Adicionada verificação de autenticação em todos os endpoints AJAX
23+
- Implementada validação de propriedade de itens
24+
- Melhorado o sistema de sanitização de inputs
25+
26+
## [1.0.0] - 2025-02-01
427
### Lançamento Oficial
528
- Primeira versão estável do sistema
629
- Interface completamente redesenhada e responsiva

ajax/adicionar_item.php

Lines changed: 102 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,110 @@
11
<?php
22
session_start();
3-
header('Content-Type: application/json');
43

5-
// Verificar se o usuário está logado
6-
if(!isset($_SESSION['usuario_id'])) {
7-
echo json_encode(['sucesso' => false, 'mensagem' => 'Usuário não autenticado']);
8-
exit();
4+
// Configuração de erros e logs
5+
error_reporting(E_ALL);
6+
ini_set('display_errors', 0);
7+
ini_set('log_errors', 1);
8+
ini_set('error_log', dirname(__DIR__) . '/logs/php_error.log');
9+
10+
// Função para log personalizado
11+
function logError($message, $data = null) {
12+
$log = date('Y-m-d H:i:s') . " - " . $message;
13+
if ($data !== null) {
14+
$log .= " - Data: " . print_r($data, true);
15+
}
16+
error_log($log);
917
}
1018

11-
require_once '../models/Lista.php';
19+
// Garantir que a resposta seja sempre JSON
20+
header('Content-Type: application/json');
1221

13-
// Validar dados recebidos
14-
if(!isset($_POST['lista_id']) || !isset($_POST['nome']) ||
15-
!isset($_POST['quantidade']) || !isset($_POST['unidade'])) {
16-
echo json_encode(['sucesso' => false, 'mensagem' => 'Dados incompletos']);
17-
exit();
18-
}
22+
try {
23+
logError("Iniciando processamento de adicionar_item.php");
24+
logError("POST data", $_POST);
25+
logError("SESSION data", $_SESSION);
26+
27+
// Verificar se o usuário está logado
28+
if(!isset($_SESSION['user_id'])) {
29+
logError("Falha na autenticação: user_id não encontrado na sessão");
30+
throw new Exception('Usuário não autenticado');
31+
}
32+
33+
// Incluir arquivos necessários
34+
$config_file = dirname(__DIR__) . '/config/database.php';
35+
$model_file = dirname(__DIR__) . '/models/Lista.php';
36+
37+
if (!file_exists($config_file)) {
38+
logError("Arquivo de configuração não encontrado: " . $config_file);
39+
throw new Exception('Erro de configuração do sistema');
40+
}
41+
42+
if (!file_exists($model_file)) {
43+
logError("Arquivo de modelo não encontrado: " . $model_file);
44+
throw new Exception('Erro de configuração do sistema');
45+
}
46+
47+
require_once $config_file;
48+
require_once $model_file;
49+
50+
// Validar dados recebidos
51+
$campos_obrigatorios = ['lista_id', 'nome', 'quantidade', 'unidade'];
52+
$dados_faltando = [];
53+
foreach ($campos_obrigatorios as $campo) {
54+
if (!isset($_POST[$campo]) || trim($_POST[$campo]) === '') {
55+
$dados_faltando[] = $campo;
56+
}
57+
}
58+
59+
if (!empty($dados_faltando)) {
60+
logError("Campos obrigatórios faltando", $dados_faltando);
61+
throw new Exception('Campos obrigatórios faltando: ' . implode(', ', $dados_faltando));
62+
}
63+
64+
// Instanciar Lista e configurar
65+
$lista_model = new Lista();
66+
$lista_model->id = intval($_POST['lista_id']);
67+
$lista_model->usuario_id = $_SESSION['user_id'];
68+
69+
// Verificar se a lista pertence ao usuário
70+
if (!$lista_model->verificarProprietario()) {
71+
logError("Tentativa de adicionar item em lista não pertencente ao usuário", [
72+
'lista_id' => $_POST['lista_id'],
73+
'usuario_id' => $_SESSION['user_id']
74+
]);
75+
throw new Exception('Você não tem permissão para modificar esta lista');
76+
}
77+
78+
// Adicionar item
79+
$resultado = $lista_model->adicionarItem(
80+
trim($_POST['nome']),
81+
floatval($_POST['quantidade']),
82+
trim($_POST['unidade'])
83+
);
84+
85+
if($resultado) {
86+
$item_id = $lista_model->getUltimoItemId();
87+
logError("Item adicionado com sucesso", [
88+
'item_id' => $item_id,
89+
'lista_id' => $_POST['lista_id']
90+
]);
91+
echo json_encode([
92+
'sucesso' => true,
93+
'item_id' => $item_id,
94+
'mensagem' => 'Item adicionado com sucesso'
95+
]);
96+
} else {
97+
throw new Exception('Erro ao adicionar item no banco de dados');
98+
}
1999

20-
$lista_model = new Lista();
21-
$lista_model->id = intval($_POST['lista_id']);
22-
23-
// Adicionar item
24-
$resultado = $lista_model->adicionarItem(
25-
$_POST['nome'],
26-
floatval($_POST['quantidade']),
27-
$_POST['unidade']
28-
);
29-
30-
if($resultado) {
31-
$item_id = $lista_model->getUltimoItemId(); // Novo método para obter o último ID
32-
echo json_encode(['sucesso' => true, 'item_id' => $item_id]);
33-
} else {
34-
echo json_encode(['sucesso' => false, 'mensagem' => 'Erro ao adicionar item']);
100+
} catch (Exception $e) {
101+
logError("Erro ao adicionar item: " . $e->getMessage());
102+
logError("Stack trace: " . $e->getTraceAsString());
103+
104+
http_response_code(500);
105+
echo json_encode([
106+
'sucesso' => false,
107+
'mensagem' => $e->getMessage(),
108+
'erro_detalhes' => 'Verifique o log para mais informações'
109+
]);
35110
}
36-
?>

ajax/marcar_item.php

Lines changed: 57 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,67 @@
11
<?php
22
session_start();
3-
header('Content-Type: application/json');
43

5-
// Verificar se o usuário está logado
6-
if(!isset($_SESSION['usuario_id'])) {
7-
echo json_encode(['sucesso' => false, 'mensagem' => 'Usuário não autenticado']);
8-
exit();
4+
// Configuração de erros e logs
5+
error_reporting(E_ALL);
6+
ini_set('display_errors', 0);
7+
ini_set('log_errors', 1);
8+
ini_set('error_log', dirname(__DIR__) . '/logs/php_error.log');
9+
10+
// Função para log personalizado
11+
function logError($message, $data = null) {
12+
$log = date('Y-m-d H:i:s') . " - " . $message;
13+
if ($data !== null) {
14+
$log .= " - Data: " . print_r($data, true);
15+
}
16+
error_log($log);
917
}
1018

11-
require_once '../models/Lista.php';
19+
header('Content-Type: application/json');
1220

13-
// Validar dados recebidos
14-
if(!isset($_POST['item_id']) || !isset($_POST['comprado'])) {
15-
echo json_encode(['sucesso' => false, 'mensagem' => 'Dados incompletos']);
16-
exit();
17-
}
21+
try {
22+
logError("Iniciando processamento de marcar_item.php");
23+
logError("POST data", $_POST);
24+
logError("SESSION data", $_SESSION);
25+
26+
// Verificar se o usuário está logado
27+
if (!isset($_SESSION['user_id'])) {
28+
throw new Exception('Usuário não autenticado');
29+
}
30+
31+
// Validar dados recebidos
32+
if (!isset($_POST['item_id']) || !isset($_POST['comprado'])) {
33+
throw new Exception('Dados incompletos');
34+
}
35+
36+
require_once dirname(__DIR__) . '/models/Lista.php';
37+
38+
$lista_model = new Lista();
39+
$item_id = intval($_POST['item_id']);
40+
$comprado = intval($_POST['comprado']);
1841

19-
$lista_model = new Lista();
42+
// Marcar item como comprado/não comprado
43+
$resultado = $lista_model->marcarItemComprado($item_id, $comprado === 1);
2044

21-
// Marcar item como comprado/não comprado
22-
$resultado = $lista_model->marcarItemComprado(
23-
intval($_POST['item_id']),
24-
intval($_POST['comprado']) === 1
25-
);
45+
if($resultado) {
46+
logError("Item marcado com sucesso", [
47+
'item_id' => $item_id,
48+
'comprado' => $comprado
49+
]);
50+
echo json_encode([
51+
'sucesso' => true,
52+
'mensagem' => 'Status do item atualizado com sucesso'
53+
]);
54+
} else {
55+
throw new Exception('Erro ao atualizar status do item');
56+
}
2657

27-
if($resultado) {
28-
echo json_encode(['sucesso' => true]);
29-
} else {
30-
echo json_encode(['sucesso' => false, 'mensagem' => 'Erro ao marcar item']);
58+
} catch (Exception $e) {
59+
logError("Erro ao marcar item: " . $e->getMessage());
60+
logError("Stack trace: " . $e->getTraceAsString());
61+
62+
http_response_code(500);
63+
echo json_encode([
64+
'sucesso' => false,
65+
'mensagem' => $e->getMessage()
66+
]);
3167
}
32-
?>

ajax/remover_item.php

Lines changed: 54 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,67 @@
11
<?php
22
session_start();
3-
header('Content-Type: application/json');
43

5-
// Verificar se o usuário está logado
6-
if(!isset($_SESSION['usuario_id'])) {
7-
echo json_encode(['sucesso' => false, 'mensagem' => 'Usuário não autenticado']);
8-
exit();
4+
// Configuração de erros e logs
5+
error_reporting(E_ALL);
6+
ini_set('display_errors', 0);
7+
ini_set('log_errors', 1);
8+
ini_set('error_log', dirname(__DIR__) . '/logs/php_error.log');
9+
10+
// Função para log personalizado
11+
function logError($message, $data = null) {
12+
$log = date('Y-m-d H:i:s') . " - " . $message;
13+
if ($data !== null) {
14+
$log .= " - Data: " . print_r($data, true);
15+
}
16+
error_log($log);
917
}
1018

11-
require_once '../config/database.php';
19+
header('Content-Type: application/json');
1220

13-
// Validar dados recebidos
14-
if(!isset($_POST['item_id'])) {
15-
echo json_encode(['sucesso' => false, 'mensagem' => 'Dados incompletos']);
16-
exit();
17-
}
21+
try {
22+
logError("Iniciando processamento de remover_item.php");
23+
logError("POST data", $_POST);
24+
logError("SESSION data", $_SESSION);
1825

19-
$database = new Database();
20-
$conexao = $database->conectar();
26+
// Verificar se o usuário está logado
27+
if (!isset($_SESSION['user_id'])) {
28+
throw new Exception('Usuário não autenticado');
29+
}
2130

22-
if(!$conexao) {
23-
echo json_encode(['sucesso' => false, 'mensagem' => 'Erro de conexão com o banco de dados']);
24-
exit();
25-
}
31+
// Validar dados recebidos
32+
if (!isset($_POST['item_id'])) {
33+
throw new Exception('ID do item não fornecido');
34+
}
2635

27-
try {
28-
$query = "DELETE FROM itens_lista WHERE id = :item_id";
29-
$stmt = $conexao->prepare($query);
30-
$stmt->bindParam(':item_id', $_POST['item_id'], PDO::PARAM_INT);
31-
32-
$resultado = $stmt->execute();
36+
require_once dirname(__DIR__) . '/config/database.php';
37+
require_once dirname(__DIR__) . '/models/Lista.php';
38+
39+
$lista = new Lista();
40+
$item_id = intval($_POST['item_id']);
3341

34-
if($resultado) {
35-
echo json_encode(['sucesso' => true]);
42+
// Verificar se o item pertence a uma lista do usuário
43+
if (!$lista->verificarProprietarioItem($item_id, $_SESSION['user_id'])) {
44+
throw new Exception('Você não tem permissão para remover este item');
45+
}
46+
47+
// Remover o item
48+
if ($lista->removerItem($item_id)) {
49+
logError("Item removido com sucesso", ['item_id' => $item_id]);
50+
echo json_encode([
51+
'sucesso' => true,
52+
'mensagem' => 'Item removido com sucesso'
53+
]);
3654
} else {
37-
echo json_encode(['sucesso' => false, 'mensagem' => 'Erro ao remover item']);
55+
throw new Exception('Erro ao remover o item');
3856
}
39-
} catch(PDOException $e) {
40-
echo json_encode(['sucesso' => false, 'mensagem' => 'Erro: ' . $e->getMessage()]);
57+
58+
} catch (Exception $e) {
59+
logError("Erro ao remover item: " . $e->getMessage());
60+
logError("Stack trace: " . $e->getTraceAsString());
61+
62+
http_response_code(500);
63+
echo json_encode([
64+
'sucesso' => false,
65+
'mensagem' => $e->getMessage()
66+
]);
4167
}
42-
?>

assets/js/lista.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,31 @@ document.addEventListener('DOMContentLoaded', function() {
77
e.preventDefault();
88

99
const formData = new FormData(this);
10+
11+
// Validar se todos os campos necessários estão presentes
12+
const camposObrigatorios = ['lista_id', 'nome', 'quantidade', 'unidade'];
13+
for (const campo of camposObrigatorios) {
14+
if (!formData.get(campo)) {
15+
console.error(`Campo obrigatório ausente: ${campo}`);
16+
alert(`Por favor, preencha o campo ${campo}`);
17+
return;
18+
}
19+
}
20+
21+
console.log('Enviando dados:', Object.fromEntries(formData));
1022

1123
fetch('ajax/adicionar_item.php', {
1224
method: 'POST',
1325
body: formData
1426
})
15-
.then(response => response.json())
27+
.then(response => {
28+
if (!response.ok) {
29+
throw new Error(`HTTP error! status: ${response.status}`);
30+
}
31+
return response.json();
32+
})
1633
.then(data => {
34+
console.log('Resposta recebida:', data);
1735
if(data.sucesso) {
1836
// Adicionar item dinamicamente à lista
1937
const novoItem = document.createElement('li');

0 commit comments

Comments
 (0)