148 lines
4.1 KiB
PHP
Executable File
148 lines
4.1 KiB
PHP
Executable File
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace mirzaev\beejee\controllers;
|
|
|
|
use mirzaev\beejee\controllers\controller;
|
|
|
|
/**
|
|
* Контроллер основной страницы
|
|
*
|
|
* @package mirzaev\beejee\controllers
|
|
* @author Arsen Mirzaev Tatyano-Muradovich <red@hood.su>
|
|
*/
|
|
final class tasksController extends controller
|
|
{
|
|
/**
|
|
* Записать в базу данных
|
|
*
|
|
* @param array $params
|
|
*
|
|
* @return string|null
|
|
*/
|
|
public function create(array $params): ?string
|
|
{
|
|
// Инициализация параметров
|
|
$name = $params['name'];
|
|
$email = $params['email'];
|
|
$task = $params['task'];
|
|
|
|
session_start();
|
|
|
|
if (!isset($_SESSION['task_create_last']) || (isset($_SESSION['task_create_last']) && $_SESSION['task_create_last'] < time() - 5)) {
|
|
// Если это первый вызов или последний вызов был более 5 секунд назад
|
|
|
|
// Запись задания
|
|
$this->model->create($name, $email, $task);
|
|
|
|
$_SESSION['task_create_last'] = time();
|
|
|
|
return null;
|
|
}
|
|
|
|
return 'Следующее задание можно создать через ' . (5 - (time() - $_SESSION['task_create_last'])) . ' секунд';
|
|
}
|
|
|
|
/**
|
|
* Прочитать из базы данных
|
|
*
|
|
* @param array $params
|
|
*
|
|
* @return array
|
|
*/
|
|
public function read(array $params): array
|
|
{
|
|
// Нормализация
|
|
$page['current'] = filter_var(filter_var($params['page'], FILTER_SANITIZE_NUMBER_INT), FILTER_VALIDATE_INT, ['options' => ['default' => 1]]);
|
|
$page['sort'] = filter_var($params['sort'] ?? '', FILTER_SANITIZE_STRING);
|
|
|
|
// Инициализация параметров
|
|
$limit = 3;
|
|
$sort = empty($params['sort']) ? 'id' : $params['sort'];
|
|
$page = ($params['page'] - 1) * $limit;
|
|
|
|
// Чтение заданий
|
|
return $this->model->read($page, $limit, $sort);
|
|
}
|
|
|
|
/**
|
|
* Обновить в базе данных
|
|
*
|
|
* @param array $params
|
|
*
|
|
* @return void
|
|
*/
|
|
public function update(array $params): void
|
|
{
|
|
session_start();
|
|
|
|
// Нормализация
|
|
$page['id'] = filter_var(filter_var($params['id'], FILTER_SANITIZE_NUMBER_INT), FILTER_VALIDATE_INT, ['options' => ['default' => 1]]);
|
|
$page['name'] = filter_var($params['name'], FILTER_SANITIZE_STRING);
|
|
$page['email'] = filter_var($params['email'], FILTER_SANITIZE_EMAIL);
|
|
$page['task'] = filter_var($params['task'], FILTER_SANITIZE_STRING);
|
|
|
|
// Инициализация параметров
|
|
$id = (int) $params['id'];
|
|
$name = $params['name'];
|
|
$email = $params['email'];
|
|
$task = $params['task'];
|
|
$completed = $_SESSION['admin'] == 1 ? $params['completed'] : null;
|
|
|
|
// Запись задания
|
|
$this->model->update($id, $name, $email, $task, $completed);
|
|
}
|
|
|
|
/**
|
|
* Удалить из базы данных
|
|
*
|
|
* @param array $params
|
|
*
|
|
* @return void
|
|
*/
|
|
public function delete(array $params): void
|
|
{
|
|
// Инициализация параметров
|
|
$id = (int) $params['id'];
|
|
|
|
// ВНИМАНИЕ: Сессию можно подобрать брутфорсом (либо ещё как-нибудь узнать)
|
|
// Я бы не стал так делать на нормальном проекте - писал привязку к IP, например
|
|
session_start();
|
|
if ($_SESSION['admin'] == 1) {
|
|
// Если пользователь является админстратором
|
|
$this->model->delete($id);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Сгенерировать представление HTML-листа заданий
|
|
*
|
|
* @param array $params
|
|
*
|
|
* @return string
|
|
*/
|
|
public function genList(array $params): string
|
|
{
|
|
// Инициализация заданий
|
|
$tasks = $this->read($params);
|
|
|
|
// Инициализация админ-прав
|
|
session_start();
|
|
$admin = $_SESSION['admin'];
|
|
|
|
// Генерация представления
|
|
return $this->view->render(DIRECTORY_SEPARATOR . 'tasks' . DIRECTORY_SEPARATOR . 'list.html', ['tasks' => $tasks, 'admin' => $admin]);
|
|
}
|
|
|
|
/**
|
|
* Подсчитать количество заданий
|
|
*
|
|
* @return int
|
|
*/
|
|
public function count(): int
|
|
{
|
|
return $this->__get('model')->count();
|
|
}
|
|
}
|