task_manager/mirzaev/beejee/system/controllers/tasksController.php

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();
}
}