<?php
require(__DIR__ . '/boot.php');
logicaCadastro();
exit(0);
function logicaCadastro(): void
{
session_start();
// Nao autenticado: mostrar form de autenticacao
if (empty($_SESSION['autenticado'])) {
if (empty($_POST['senha'])) {
exibirFormAutenticacao(null);
return;
}
if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) === false) {
exibirFormAutenticacao('O e-mail informado não é válido.', $_POST);
return;
}
if (!hash_equals($_POST['senha'], APP_SENHA)) {
exibirFormAutenticacao('A senha informada é inválida.', $_POST);
return;
}
autenticar($_POST['email']);
redirecionar('/cadastro.php?acao=listar');
return;
}
// Mostrar lista de jogos para edicao
if (!isset($_GET['acao']) || $_GET['acao'] === 'listar') {
exibirListaJogos();
return;
}
// Inserir novo jogo
if ($_GET['acao'] === 'inserir') {
if (empty($_POST['salvar'])) {
exibirFormCadastro('inserir');
return;
}
$erro = '';
$idJogo = cadastrarJogo($_POST, $erro);
if (!$idJogo) {
exibirFormCadastro('inserir', $erro, $_POST);
return;
}
$dados = [
'title' => 'Sucesso - Cadastro de Jogos do Linha do Texto',
'pagina' => '/cadastro.php',
'breadcrumb' => [
['nome' => 'Início', 'url' => formatarLink('/index.php')],
['nome' => 'Autenticação', 'url' => formatarLink('/cadastro.php?acao=desconectar')],
['nome' => 'Cadastro de jogos', 'url' => formatarLink('/cadastro.php?acao=listar')],
['nome' => 'Inserir novo jogo', 'url' => formatarLink('/cadastro.php?acao=inserir')],
['nome' => 'Cadastro com sucesso'],
],
'sucesso' => sprintf('Jogo cadastrado com sucesso com o ID %s', $idJogo),
];
view('cadastro/sucesso', $dados);
return;
}
// Editar jogo
if ($_GET['acao'] === 'editar' && !empty($_GET['id'])) {
$jogo = consultarJogo($_GET['id']);
if ($jogo['email'] !== $_SESSION['email']) {
header('Content-type: text/plain; charset=UTF-8', true, 403);
printf('Jogo pertence a outro usuário');
return;
}
if (empty($_POST['salvar'])) {
exibirFormCadastro('editar', null, $jogo, $jogo['id_jogo']);
return;
}
$erro = '';
$alterado = alterarJogo($jogo, $_POST, $erro);
if (!$alterado) {
exibirFormCadastro('editar', $erro, $_POST, $jogo['id_jogo']);
return;
}
$dados = [
'title' => 'Sucesso - Cadastro de Jogos do Linha do Texto',
'pagina' => '/cadastro.php',
'breadcrumb' => [
['nome' => 'Início', 'url' => formatarLink('/index.php')],
['nome' => 'Autenticação', 'url' => formatarLink('/cadastro.php?acao=desconectar')],
['nome' => 'Cadastro de jogos', 'url' => formatarLink('/cadastro.php?acao=listar')],
['nome' => sprintf('Editar jogo #%d', $jogo['id_jogo']), 'url' => formatarLink(sprintf('/cadastro.php?acao=editar&id=%d', $jogo['id_jogo']))],
['nome' => 'Alterado com sucesso'],
],
'sucesso' => 'Jogo alterado com sucesso.',
];
view('cadastro/sucesso', $dados);
return;
}
// Desconectar
if ($_GET['acao'] === 'desconectar') {
desconectar();
redirecionar('/cadastro.php');
return;
}
header('Content-type: text/html', true, 404);
return;
}
function exibirFormAutenticacao(string $erro = null, array $credenciais = []): void
{
$dados = [
'title' => 'Autenticação - Cadastro de Jogos do Linha do Texto',
'pagina' => '/cadastro.php',
'breadcrumb' => [
['nome' => 'Início', 'url' => formatarLink('/index.php')],
['nome' => 'Autenticação'],
],
'webmaster' => APP_WEBMASTER,
'erro' => $erro,
'form' => $credenciais,
];
view('cadastro/login', $dados);
}
function exibirListaJogos(): void
{
$dados = [
'title' => 'Cadastro de Jogos do Linha do Texto',
'pagina' => '/cadastro.php?acao=listar',
'breadcrumb' => [
['nome' => 'Início', 'url' => formatarLink('/index.php')],
['nome' => 'Autenticação', 'url' => formatarLink('/cadastro.php?acao=desconectar')],
['nome' => 'Cadastro de jogos'],
],
'filtro' => [
'email' => $_SESSION['email'],
],
];
$limit = 10;
$offset = isset($_GET['pagina']) ? ($_GET['pagina'] - 1) * $limit : 0;
$condicoes = [];
$valores = [];
if (isset($_GET['id']) && $_GET['id'] !== '') {
$condicoes[] = 'j.id_jogo = :id_jogo';
$valores[':id_jogo'] = $_GET['id'];
$dados['filtro']['id'] = $_GET['id'];
}
if (isset($_GET['jogo']) && $_GET['jogo'] !== '') {
$condicoes[] = 'j.jogo LIKE :jogo';
$valores[':jogo'] = '%' . $_GET['jogo'] . '%';
$dados['filtro']['jogo'] = $_GET['jogo'];
}
$condicao = sprintf('WHERE email = :email %s', $condicoes ? sprintf('AND %s', implode(' OR ', $condicoes)) : '');
$valores[':email'] = $_SESSION['email'];
try {
$pdo = conectarBd();
$stmt = $pdo->prepare(sprintf('SELECT COUNT(1) total FROM jogo j %s', $condicao));
$stmt->execute($valores);
$total = $stmt->fetchObject()->total;
$stmt = $pdo->prepare(sprintf('SELECT j.id_jogo, j.jogo, j.email, COUNT(v.id_voto) total_votos FROM jogo j LEFT JOIN voto v ON j.id_jogo = v.id_jogo %s GROUP BY j.id_jogo ORDER BY j.id_jogo ASC LIMIT %d OFFSET %d', $condicao, $limit, $offset));
$stmt->execute($valores);
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$dados['jogos'] = $stmt;
$path = '/cadastro.php?' . http_build_query(['acao' => 'listar', 'jogo' => $_GET['jogo'] ?? null, 'id' => $_GET['id'] ?? null]);
$dados['paginacao'] = montarPaginacao($path, $total, $limit, $_GET['pagina'] ?? 1);
} catch (Exception $e) {
error_log($e->getMessage());
$dados['erro'] = 'Erro ao buscar jogos.';
}
view('cadastro/lista', $dados);
}
function exibirFormCadastro(string $acao = 'inserir', string $erro = null, array $jogo = [], int $idJogo = null): void
{
$dados = [
'title' => 'Cadastro de Jogos do Linha do Texto',
'pagina' => sprintf('/cadastro.php?acao=%s', $acao),
'breadcrumb' => [
['nome' => 'Início', 'url' => formatarLink('/index.php')],
['nome' => 'Autenticação', 'url' => formatarLink('/cadastro.php?acao=desconectar')],
['nome' => 'Cadastro de jogos', 'url' => formatarLink('/cadastro.php?acao=listar')],
$acao == 'inserir'
? ['nome' => 'Inserir novo jogo']
: ['nome' => sprintf('Editar jogo #%s', $idJogo)],
],
'max_textos' => APP_MAX_TEXTOS,
'max_parametros' => APP_MAX_PARAMETROS,
'erro' => $erro,
'jogo' => array_merge($jogo, ['email' => $_SESSION['email']]),
'acao' => $acao,
];
view('cadastro/form', $dados);
}
function autenticar(string $email): void
{
$_SESSION['autenticado'] = true;
$_SESSION['email'] = $email;
}
function desconectar(): void
{
unset($_SESSION['autenticado']);
session_destroy();
$params = session_get_cookie_params();
setcookie(
session_name(),
'',
time() - 42000,
$params['path'],
$params['domain'],
$params['secure'],
$params['httponly'],
);
}
function validarJogo(array $jogo, string &$erro = ''): bool
{
if (empty($jogo['jogo'])) {
$erro = 'O nome do jogo não foi preenchido.';
return false;
}
if (strip_tags($jogo['jogo']) !== $jogo['jogo']) {
$erro = 'O nome do jogo possui tags HTML proibidas.';
return false;
}
if (empty($jogo['email'])) {
$erro = 'O e-mail não foi preenchido.';
return false;
}
if (strip_tags($jogo['email']) !== $jogo['email']) {
$erro = 'O e-mail possui tags HTML proibidas.';
return false;
}
if (empty($jogo['textos']) || !is_array($jogo['textos'])) {
$erro = 'Não foi informado nenhum texto.';
return false;
}
if (empty($jogo['parametros']) || !is_array($jogo['parametros'])) {
$erro = 'Não foi informado nenhum parametro.';
return false;
}
if (count($jogo['textos']) > APP_MAX_TEXTOS) {
$erro = 'Foram informados muitos textos.';
return false;
}
if (count($jogo['parametros']) > APP_MAX_PARAMETROS) {
$erro = 'Foram informados muitos parâmetros.';
return false;
}
foreach (array_values($jogo['textos']) as $i => $texto) {
if (empty($texto['titulo'])) {
$erro = sprintf('Não foi informado o título do texto %d.', $i + 1);
return false;
}
if (strip_tags($texto['titulo']) !== $texto['titulo']) {
$erro = sprintf('O título do texto %d possui tags HTML proibidas.', $i + 1);
return false;
}
if (empty($texto['texto'])) {
$erro = sprintf('Não foi informado o texto do texto %d.', $i + 1);
return false;
}
if (strip_tags($texto['texto'], '<br>') !== $texto['texto']) {
$erro = sprintf('O texto %d possui tags HTML proibidas.', $i + 1);
return false;
}
}
foreach (array_values($jogo['parametros']) as $i => $parametro) {
if (empty($parametro['parametroa'])) {
$erro = sprintf('Não foi informado o parâmetro A para o item %d.', $i + 1);
return false;
}
if (strip_tags($parametro['parametroa']) !== $parametro['parametroa']) {
$erro = sprintf('O parâmetro A do item %d possui tags HTML proibidas.', $i + 1);
return false;
}
if (empty($parametro['parametrob'])) {
$erro = sprintf('Não foi informado o parâmetro B para o item %d.', $i + 1);
return false;
}
if (strip_tags($parametro['parametrob']) !== $parametro['parametrob']) {
$erro = sprintf('O parâmetro B do item %d possui tags HTML proibidas.', $i + 1);
return false;
}
if ($parametro['parametroa'] === $parametro['parametrob']) {
$erro = sprintf('O parâmetro A não pode ser igual ao parâmetro B para o item %d.', $i + 1);
return false;
}
}
return true;
}
function cadastrarJogo(array $jogo, string &$erro = ''): int
{
$jogo['email'] = $_SESSION['email'];
if (!validarJogo($jogo, $erro)) {
return 0;
}
try {
$pdo = conectarBd();
// Inserir jogo
$stmt = $pdo->prepare('INSERT INTO jogo (jogo, email) VALUES(:jogo, :email)');
$stmt->execute([':jogo' => $jogo['jogo'], ':email' => $jogo['email']]);
$idJogo = $pdo->lastInsertId();
// Inserir parametros
$stmt = $pdo->prepare('INSERT INTO parametro (id_jogo, parametroa, parametrob) VALUES(:id_jogo, :parametroa, :parametrob)');
foreach ($jogo['parametros'] as $parametro) {
$stmt->execute([':id_jogo' => $idJogo, ':parametroa' => $parametro['parametroa'], ':parametrob' => $parametro['parametrob']]);
}
// Inserir textos
$stmt = $pdo->prepare('INSERT INTO texto (id_jogo, titulo, texto) VALUES(:id_jogo, :titulo, :texto)');
foreach ($jogo['textos'] as $texto) {
$stmt->execute([':id_jogo' => $idJogo, ':titulo' => $texto['titulo'], ':texto' => formatarTextoJogo($texto['texto'])]);
}
} catch (Exception $e) {
error_log($e->getMessage());
$erro = 'Erro inesperado ao cadastrar o jogo.';
return 0;
}
return $idJogo;
}
function alterarJogo(array $jogo, array $novoJogo, string &$erro = ''): bool
{
$novoJogo['email'] = $_SESSION['email'];
if (!validarJogo($novoJogo, $erro)) {
return false;
}
// Nao pode alterar se o jogo ja tem votos
if (possuiVotos($jogo['id_jogo'])) {
$erro = sprintf('O jogo #%d já possui votos e não pode ser editado.', $jogo['id_jogo']);
return false;
}
try {
$pdo = conectarBd();
// Alterar jogo
if ($jogo['jogo'] !== $novoJogo['jogo'] || $jogo['email'] !== $novoJogo['email']) {
$stmt = $pdo->prepare('UPDATE jogo SET jogo = :jogo WHERE id_jogo = :id_jogo LIMIT 1');
$stmt->execute([':id_jogo' => $jogo['id_jogo'], ':jogo' => $novoJogo['jogo']]);
}
// Alterar parametros
$stmtUpdateParametro = $pdo->prepare('UPDATE parametro SET parametroa = :parametroa, parametrob = :parametrob WHERE id_parametro = :id_parametro LIMIT 1');
$stmtDeleteParametro = $pdo->prepare('DELETE FROM parametro WHERE id_parametro = :id_parametro LIMIT 1');
$i = 0;
foreach ($jogo['parametros'] as $i => $parametro) {
if (isset($novoJogo['parametros'][$i])) {
$novoParametro = $novoJogo['parametros'][$i];
$stmtUpdateParametro->execute([':id_parametro' => $parametro['id_parametro'], ':parametroa' => $novoParametro['parametroa'], ':parametrob' => $novoParametro['parametrob']]);
} else {
$stmtDeleteParametro->execute([':id_parametro' => $parametro['id_parametro']]);
}
}
// Adicionando parametros novos
$stmtInsertParametro = $pdo->prepare('INSERT INTO parametro (id_jogo, parametroa, parametrob) VALUES (:id_jogo, :parametroa, :parametrob)');
for ($j = $i + 1; $j < count($novoJogo['parametros']); $j++) {
$novoParametro = $novoJogo['parametros'][$j];
$stmtInsertParametro->execute([':id_jogo' => $jogo['id_jogo'], ':parametroa' => $novoParametro['parametroa'], ':parametrob' => $novoParametro['parametrob']]);
}
// Alterar textos
$stmtUpdateTexto = $pdo->prepare('UPDATE texto SET titulo = :titulo, texto = :texto WHERE id_texto = :id_texto LIMIT 1');
$stmtDeleteTexto = $pdo->prepare('DELETE FROM texto WHERE id_texto = :id_texto LIMIT 1');
$i = 0;
foreach ($jogo['textos'] as $i => $texto) {
if (isset($novoJogo['textos'][$i])) {
$novoTexto = $novoJogo['textos'][$i];
$stmtUpdateTexto->execute([':id_texto' => $texto['id_texto'], ':titulo' => $novoTexto['titulo'], ':texto' => formatarTextoJogo($novoTexto['texto'])]);
} else {
$stmtDeleteTexto->execute([':id_texto' => $texto['id_texto']]);
}
}
// Adicionando textos novos
$stmtInsertTexto = $pdo->prepare('INSERT INTO texto (id_jogo, titulo, texto) VALUES (:id_jogo, :titulo, :texto)');
for ($j = $i + 1; $j < count($novoJogo['textos']); $j++) {
$novoTexto = $novoJogo['textos'][$j];
$stmtInsertTexto->execute([':id_jogo' => $jogo['id_jogo'], ':titulo' => $novoTexto['titulo'], ':texto' => formatarTextoJogo($novoTexto['texto'])]);
}
} catch (Exception $e) {
error_log($e->getMessage());
$erro = sprintf('Erro inesperado ao alterar o jogo %d.', $jogo['id_jogo']);
return false;
}
return true;
}