Fix bad name. Changed pool to poll.

This commit is contained in:
KJ 2024-10-04 18:55:16 -04:00
parent a6b849e36f
commit 28417bfeeb
23 changed files with 129 additions and 129 deletions

View File

@ -2,12 +2,12 @@
// Configuración de la base de datos
define('DB_TYPE', 'mysql');
define('DB_HOST', 'localhost');
define('DB_NAME', 'pool');
define('DB_NAME', 'poll');
define('DB_USER', 'root');
define('DB_PASS', '');
// Configuración del sitio
define('SITE_URL', 'https://pool.kj5.top/');
define('SITE_URL', 'https://poll.kj5.top/');
define('PRIVATE_KEY', 'AerohrejaeLohz2eojai2ba1ohCiegoh');

View File

@ -4,21 +4,21 @@ CREATE TABLE users (
password VARCHAR(255)
);
CREATE TABLE pools (
CREATE TABLE polls (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(255)
);
CREATE TABLE pool_options (
CREATE TABLE poll_options (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
value TEXT,
pool_id BIGINT,
FOREIGN KEY (pool_id) REFERENCES pools(id)
poll_id BIGINT,
FOREIGN KEY (poll_id) REFERENCES polls(id)
);
CREATE TABLE answers (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
option_id BIGINT,
create_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (option_id) REFERENCES pool_options(id)
FOREIGN KEY (option_id) REFERENCES poll_options(id)
);

View File

@ -8,7 +8,7 @@
text-align: center;
}
.pool-options {
.poll-options {
display: grid;
gap: 10px;
}

View File

@ -24,18 +24,18 @@ Un sistema de encuestas con solo 3 opciones a elegir (por si acaso, es posible a
** Encuestas (En el hardcode solo se trabajará con la última creada)
| pools |
| polls |
|-------|
| id |
| title |
** Opciones elegibles como respuesta a la encuesta.
| pool_options |
| poll_options |
|--------------|
| id |
| value |
| pool_id |
| poll_id |
** Votos de los clientes

View File

@ -0,0 +1,19 @@
<?php
namespace Controllers\Poll;
use Libs\HTMX;
use Requests\PollRequest;
class HomeController {
/**
* handle
*
* @return void
*/
public static function handle(PollRequest $request): void
{
HTMX::render('Poll', [
'poll' => $request->poll
]);
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace Controllers\Poll;
use Models\Poll;
use Models\PollOption;
use Requests\PollCreateRequest;
class PollCreateController {
public static function handle(PollCreateRequest $request): void
{
$poll = new Poll;
$poll->title = $request->post->title;
$poll->beginTransaction();
$poll->save();
for($i=1; $i <= 3; $i++) {
$option = new PollOption;
$option->value = $request->post->{'option'.$i};
$option->poll_id = $poll->id;
$option->save();
}
$poll->commit();
$request->saved = true;
PollFormController::handle($request);
}
}

View File

@ -1,12 +1,12 @@
<?php
namespace Controllers\Pool;
namespace Controllers\Poll;
use Libs\HTMX;
use Requests\UserRequest;
class PoolFormController {
class PollFormController {
public static function handle(UserRequest $request) {
HTMX::render('PoolConfig', [
HTMX::render('PollConfig', [
'saved' => $request->saved ?? false
]);
}

View File

@ -0,0 +1,14 @@
<?php
namespace Controllers\Poll;
use Libs\HTMX;
use Requests\PollRequest;
class PollResultController {
public static function handle(PollRequest $request): void
{
HTMX::render('Result', [
'poll' => $request->poll
]);
}
}

View File

@ -1,17 +1,17 @@
<?php
namespace Controllers\Pool;
namespace Controllers\Poll;
use Models\Answer;
use Requests\VoteRequest;
class PoolVoteController {
class PollVoteController {
public static function handle(VoteRequest $request): void
{
if (!$request->pool->isVoted()) {
if (!$request->poll->isVoted()) {
$vote = new Answer;
$vote->option_id = $request->option->id;
$vote->save();
$request->pool->createCookie();
$request->poll->createCookie();
}
echo '¡Gracias por participar!';

View File

@ -1,19 +0,0 @@
<?php
namespace Controllers\Pool;
use Libs\HTMX;
use Requests\PoolRequest;
class HomeController {
/**
* handle
*
* @return void
*/
public static function handle(PoolRequest $request): void
{
HTMX::render('Pool', [
'pool' => $request->pool
]);
}
}

View File

@ -1,27 +0,0 @@
<?php
namespace Controllers\Pool;
use Models\Pool;
use Models\PoolOption;
use Requests\PoolCreateRequest;
class PoolCreateController {
public static function handle(PoolCreateRequest $request): void
{
$pool = new Pool;
$pool->title = $request->post->title;
$pool->beginTransaction();
$pool->save();
for($i=1; $i <= 3; $i++) {
$option = new PoolOption;
$option->value = $request->post->{'option'.$i};
$option->pool_id = $pool->id;
$option->save();
}
$pool->commit();
$request->saved = true;
PoolFormController::handle($request);
}
}

View File

@ -1,14 +0,0 @@
<?php
namespace Controllers\Pool;
use Libs\HTMX;
use Requests\PoolRequest;
class PoolResultController {
public static function handle(PoolRequest $request): void
{
HTMX::render('Result', [
'pool' => $request->pool
]);
}
}

View File

@ -4,7 +4,7 @@ namespace Models;
use Libs\Crypto;
use Libs\Model;
class Pool extends Model {
class Poll extends Model {
public string $title;
protected array $options;
protected int $votes;
@ -20,12 +20,12 @@ class Pool extends Model {
/**
* Devuelve las opciones de la encuesta.
*
* @return array<PoolOption>
* @return array<PollOption>
*/
public function getOptions(): array
{
if (!isset($this->options))
$this->options = PoolOption::where('pool_id', $this->id)->get();
$this->options = PollOption::where('poll_id', $this->id)->get();
return $this->options;
}
@ -43,7 +43,7 @@ class Pool extends Model {
'pid' => $this->id,
'exp' => time()+43200
]));
setcookie('POOL_VOTE', $cookieValue, time()+43200, parse_url(SITE_URL, PHP_URL_PATH));
setcookie('POLL_VOTE', $cookieValue, time()+43200, parse_url(SITE_URL, PHP_URL_PATH));
}
/**
@ -53,10 +53,10 @@ class Pool extends Model {
*/
public function isVoted(): bool
{
if (!isset($_COOKIE['POOL_VOTE']))
if (!isset($_COOKIE['POLL_VOTE']))
return false;
$cookie = json_decode(Crypto::decrypt64($_COOKIE['POOL_VOTE']));
$cookie = json_decode(Crypto::decrypt64($_COOKIE['POLL_VOTE']));
return (json_last_error() == JSON_ERROR_NONE &&
$cookie->exp > time() &&

View File

@ -3,9 +3,9 @@ namespace Models;
use Libs\Model;
class PoolOption extends Model {
class PollOption extends Model {
public string $value;
public int $pool_id;
public int $poll_id;
protected int $votes;
public function votes(): int

View File

@ -47,7 +47,7 @@ class User extends Model {
*/
public function createLoginCookie(): void
{
setcookie('POOL_LC', $this->getSessionToken(), time()+1209600, parse_url(SITE_URL, PHP_URL_PATH));
setcookie('POLL_LC', $this->getSessionToken(), time()+1209600, parse_url(SITE_URL, PHP_URL_PATH));
}
/**
@ -55,7 +55,7 @@ class User extends Model {
* @return void
*/
public static function logout(): void {
setcookie('POOL_LC', '', 0);
setcookie('POLL_LC', '', 0);
}
/**
@ -65,10 +65,10 @@ class User extends Model {
*/
public static function isLogged(): static|null
{
if (!isset($_COOKIE['POOL_LC']))
if (!isset($_COOKIE['POLL_LC']))
return null;
$cookie = json_decode(Crypto::decrypt64($_COOKIE['POOL_LC']));
$cookie = json_decode(Crypto::decrypt64($_COOKIE['POLL_LC']));
if (json_last_error() == JSON_ERROR_NONE &&
isset($cookie->expire) &&

View File

@ -3,7 +3,7 @@ namespace Requests;
use Libs\HTMX;
class PoolCreateRequest extends UserRequest {
class PollCreateRequest extends UserRequest {
public static function rules(): array
{
return [

View File

@ -2,15 +2,15 @@
namespace Requests;
use Libs\Request;
use Models\Pool;
use Models\Poll;
class PoolRequest extends Request {
public ?Pool $pool;
class PollRequest extends Request {
public ?Poll $poll;
public function validate(): bool
{
$this->pool = Pool::orderBy('id', 'DESC')->getFirst();
$this->poll = Poll::orderBy('id', 'DESC')->getFirst();
if (is_null($this->pool))
if (is_null($this->poll))
return $this->onInvalid('Aún no hay una encuesta configurada.');
return parent::validate();

View File

@ -1,21 +1,21 @@
<?php
namespace Requests;
use Models\PoolOption;
use Models\PollOption;
class VoteRequest extends PoolRequest {
public ?PoolOption $option;
class VoteRequest extends PollRequest {
public ?PollOption $option;
public function validate(): bool
{
if (!parent::validate())
return false;
if ($this->pool->id != $this->params->pid)
if ($this->poll->id != $this->params->pid)
return $this->onInvalid('Voto no válido.');
$this->option = PoolOption::getById($this->params->vid);
if (is_null($this->option) || $this->option->pool_id != $this->params->pid)
$this->option = PollOption::getById($this->params->vid);
if (is_null($this->option) || $this->option->poll_id != $this->params->pid)
return $this->onInvalid('Voto no válido.');
return true;

16
src/Routers/poll.php Normal file
View File

@ -0,0 +1,16 @@
<?php
use Controllers\Poll\HomeController;
use Controllers\Poll\PollCreateController;
use Controllers\Poll\PollFormController;
use Controllers\Poll\PollResultController;
use Controllers\Poll\PollVoteController;
use Libs\Router;
Router::get('/', [HomeController::class, 'handle']);
Router::get('/config', [PollFormController::class, 'handle']);
Router::post('/config', [PollCreateController::class, 'handle']);
Router::post('/poll/{pid}/vote/{vid}', [PollVoteController::class, 'handle']);
Router::get('/results', [PollResultController::class, 'handle']);

View File

@ -1,16 +0,0 @@
<?php
use Controllers\Pool\HomeController;
use Controllers\Pool\PoolCreateController;
use Controllers\Pool\PoolFormController;
use Controllers\Pool\PoolResultController;
use Controllers\Pool\PoolVoteController;
use Libs\Router;
Router::get('/', [HomeController::class, 'handle']);
Router::get('/config', [PoolFormController::class, 'handle']);
Router::post('/config', [PoolCreateController::class, 'handle']);
Router::post('/pool/{pid}/vote/{vid}', [PoolVoteController::class, 'handle']);
Router::get('/results', [PoolResultController::class, 'handle']);

View File

@ -2,16 +2,16 @@
<div class="poll-wrapper">
<article class="center">
<header>
<h1><?=htmlspecialchars($this->pool->title)?></h1>
<h1><?=htmlspecialchars($this->poll->title)?></h1>
</header>
<div class="pool-options">
<?php if ($this->pool->isVoted()): ?>
<div class="poll-options">
<?php if ($this->poll->isVoted()): ?>
¡Gracias por participar!
<?php else: ?>
<?php foreach($this->pool->getOptions() as $option): ?>
<?php foreach($this->poll->getOptions() as $option): ?>
<div role="button"
hx-target=".pool-options"
hx-post="<?=$this->route('/pool/'.$this->pool->id.'/vote/'.$option->id)?>"
hx-target=".poll-options"
hx-post="<?=$this->route('/poll/'.$this->poll->id.'/vote/'.$option->id)?>"
tabindex="0">
<?=htmlspecialchars($option->value)?>
</div>

View File

@ -6,15 +6,15 @@
<!-- /nothtmx -->
<article class="center">
<header>
<h1><?=htmlspecialchars($this->pool->title)?></h1>
<h1><?=htmlspecialchars($this->poll->title)?></h1>
</header>
<div class="pool-options">
<?php foreach($this->pool->getOptions() as $option): ?>
<div class="poll-options">
<?php foreach($this->poll->getOptions() as $option): ?>
<?php
if ($option->votes() == 0)
$percent = 0;
else
$percent = round(($option->votes() * 100 / $this->pool->votes()), 2);
$percent = round(($option->votes() * 100 / $this->poll->votes()), 2);
?>
<label>
<strong>
@ -27,7 +27,7 @@
</div>
<footer>
<strong>
Total de votos: <?=$this->pool->votes()?>
Total de votos: <?=$this->poll->votes()?>
</strong>
</footer>
</article>