Инициализация

This commit is contained in:
Arsen Mirzaev Tatyano-Muradovich
2022-03-06 05:21:24 +10:00
commit ab752bf34f
39 changed files with 2648 additions and 0 deletions

View File

@@ -0,0 +1,168 @@
<?php
declare(strict_types=1);
namespace mirzaev\surikovlib\controllers;
use mirzaev\surikovlib\controllers\core;
use mirzaev\surikovlib\models\accounts_model as accounts;
/**
* Контроллер пользователей
*
* @package mirzaev\surikovlib\controllers
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
final class accounts_controller extends core
{
/**
* Страница профиля
*
* @param array $vars
*/
public function index(array $vars = []): ?string
{
return null;
}
/**
* Регистрация
*
* @param array $vars Параметры запроса
*
* @return string|null HTML-документ
*/
public function registration(array $vars = []): ?string
{
// Инициализация журнала ошибок
$vars['errors'] = ['account' => []];
if ($vars['account'] = accounts::registration(email: $vars['email'] ?? null, password: $vars['password'] ?? null, errors: $vars['errors']['account'])) {
// Удалось зарегистрироваться
if ($vars['account'] = accounts::authentication($vars['email'] ?? null, $vars['password'] ?? null, (bool) ($vars['remember'] ?? false), $vars)) {
// Удалось аутентифицироваться
} else {
// Не удалось аутентифицироваться
// Запись кода ответа
http_response_code(401);
}
} else {
// Не удалось зарегистрироваться
// Запись кода ответа
http_response_code(401);
}
// Инициализаци пути для перенаправления
$redirect = isset($vars['redirect']) ? $vars['redirect'] : $_SERVER['HTTP_REFERER'] ?? '/';
// Перенаправление
header("Location: $redirect", response_code: 303);
return null;
}
/**
* Аутентификация
*
* @param array $vars Параметры запроса
*
* @return string|null HTML-документ
*/
public function authentication(array $vars = []): ?string
{
// Инициализация журнала ошибок
$vars['errors'] = ['account' => []];
if ($vars['account'] = accounts::authentication($vars['email'] ?? null, $vars['password'] ?? null, (bool) ($vars['remember'] ?? false), errors: $vars['errors']['account'])) {
// Удалось аутентифицироваться
} else {
// Не удалось аутентифицироваться
// Запись кода ответа
http_response_code(401);
}
// Инициализаци пути для перенаправления
$redirect = isset($vars['redirect']) ? $vars['redirect'] : $_SERVER['HTTP_REFERER'] ?? '/';
// Перенаправление
header("Location: $redirect", response_code: 303);
return null;
}
/**
* Деаутентификация
*
* @param array $vars Параметры запроса
*
* @return string|null HTML-документ
*/
public function deauthentication(array $vars = []): ?string
{
// Инициализация журнала ошибок
$vars['errors'] = ['account' => []];
if (accounts::deauthentication(errors: $vars['errors']['account'])) {
// Удалось деаутентифицироваться
// Деинициализация аккаунта
$vars['account'] = null;
} else {
// Не удалось деаутентифицироваться
// Запись кода ответа
http_response_code(500);
}
// Перенаправление
header('Location: /', response_code: 303);
return null;
}
/**
* Данные аккаунта
*
* Если информацию запрашивает администратор, то вернётся вся, иначе только разрешённая публично
*
* @param array $vars Параметры запроса
*
* @return string JSON-документ
*/
public function data(array $vars = []): ?string
{
// Инициализация журнала ошибок
$vars['errors'] = ['account' => []];
if ($account = accounts::read(['id' => $vars['id']], $vars['errors'])) {
// Найдены данные запрашиваемого аккаунта
// Инициализация аккаунта
$vars['account'] = accounts::account($vars['errors']);
if ($vars['account'] && $vars['account']['permissions']['accounts'] ?? 0 === 1) {
// Удалось аутентифицироваться и пройдена проверка авторизации
} else {
// Не удалось аутентифицироваться
// Удаление запрещённых к публикации полей
$account['password'] = $account['hash'] = $account['time'] = null;
}
// Генерация ответа
return json_encode($account ?? '');
} else {
// Не найдены данные запрашиваемого аккаунта
// Запись кода ответа
http_response_code(404);
}
return null;
}
}

View File

@@ -0,0 +1,170 @@
<?php
declare(strict_types=1);
namespace mirzaev\surikovlib\controllers;
use mirzaev\surikovlib\controllers\core;
use mirzaev\surikovlib\models\accounts_model as accounts;
use mirzaev\surikovlib\models\books_model as books;
/**
* Контроллер пользователей
*
* @package mirzaev\surikovlib\controllers
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
final class books_controller extends core
{
/**
* Страница с библеотекой
*
* @param array $vars
*/
public function index(array $vars = []): ?string
{
// Проверка аутентифицированности
$vars['account'] = accounts::account($vars);
if (!empty($vars['id'])) {
// Определённая книга
// Чтение книги
$vars['book'] = books::read(['id' => $vars['id']])[0] ?? null;
if (empty($vars['book'])) {
// Не найдена книга
return null;
}
// Генерация представления
return $this->view->render(DIRECTORY_SEPARATOR . 'books' . DIRECTORY_SEPARATOR . 'book.html', $vars);
} else {
// Все книги
// Чтение книг
$vars['books'] = books::read(limit: 30, page: isset($vars['page']) && $vars['page'] > 0 ? $vars['page'] : 1);
// Генерация представления
return $this->view->render(DIRECTORY_SEPARATOR . 'books' . DIRECTORY_SEPARATOR . 'index.html', $vars);
}
}
/**
* Обложка
*
* @param array $vars
*
* @return string|null Файл, если найден
*/
public function cover(array $vars = []): ?string
{
// Проверка входных параметров
if (empty($vars['id'])) return null;
// Инициализация пути до файла
$file = \STORAGE . DIRECTORY_SEPARATOR . 'books' . DIRECTORY_SEPARATOR . $vars['id'] . DIRECTORY_SEPARATOR . '0.jpg';
if (file_exists($file)) {
// Найден файл
// Настройка заголовков
header('Content-Description: File Transfer');
header('Content-Type: image/jpeg');
header('Content-Disposition: attachment; filename=' . basename($file));
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
// Очистить буфер вывода
ob_end_clean();
return file_get_contents($file);
}
return null;
}
/**
* Запись
*
* @param array $vars Параметры
* @param array $files Файлы
*
* @return string|null HTML-документ
*/
public function write(array $vars = [], array $files = []): ?string
{
// ПЕРЕНЕСТИ В МОДЕЛЬ
// Инициализация буфера сохранённых книг
$books = [];
for ($i = -1; count($files['books']['name']) > ++$i;) {
// Перебор загруженных книг
// Генерация хеша файла
$hash = hash_file('md5', $files['books']['tmp_name'][$i]) ?? 0;
if (move_uploaded_file($files['books']['tmp_name'][$i], \STORAGE . DIRECTORY_SEPARATOR . 'temp' . DIRECTORY_SEPARATOR . $hash . '_' . $files['books']['name'][$i])) {
// Загружен и перемещён из временной папки файл с книгой
// Запись в буфер сохранённых книг
$books[] = $hash . '_' . $files['books']['name'][$i];
}
}
foreach ($books as $book) {
// Перебор сохранённых книг
// Запись в базу данных
// Инициализация пути до хранилища
$storage = \STORAGE . DIRECTORY_SEPARATOR . 'books' . DIRECTORY_SEPARATOR . 'id' . DIRECTORY_SEPARATOR;
// Извлечение изображений из PDF-документа
exec("cd $storage && pdfimages -j $book");
}
// Перенаправление
header('Location: /books', response_code: 303);
return null;
}
/**
* Чтение
*
* @param array $vars Параметры запроса
*
* @return string|null HTML-документ
*/
public function read(array $vars = []): ?string
{
if (accounts::deauthentication($vars)) {
// Удалось деаутентифицироваться
}
// Генерация представления
return $this->view->render(DIRECTORY_SEPARATOR . 'main' . DIRECTORY_SEPARATOR . 'index.html', $vars);
}
/**
* Удаление
*
* @param array $vars Параметры запроса
*
* @return string|null HTML-документ
*/
public function delete(array $vars = []): ?string
{
if (accounts::deauthentication($vars)) {
// Удалось деаутентифицироваться
}
// Генерация представления
return $this->view->render(DIRECTORY_SEPARATOR . 'main' . DIRECTORY_SEPARATOR . 'index.html', $vars);
}
}

View File

@@ -0,0 +1,34 @@
<?php
declare(strict_types=1);
namespace mirzaev\surikovlib\controllers;
use mirzaev\surikovlib\views\manager;
use mirzaev\surikovlib\models\core as models;
use mirzaev\minimal\controller;
/**
* Ядро контроллеров
*
* @package mirzaev\surikovlib\controllers
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
class core extends controller
{
/**
* Конструктор
*
* @return void
*/
public function __construct()
{
parent::__construct();
// Инициализация ядра моделей (соединение с базой данных...)
new models();
$this->view = new manager;
}
}

View File

@@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace mirzaev\surikovlib\controllers;
use mirzaev\surikovlib\controllers\core;
use Twig\Loader\FilesystemLoader;
use Twig\Environment as view;
/**
* Контроллер основной страницы
*
* @package mirzaev\surikovlib\controllers
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
final class errors_controller extends core
{
public function error404(): ?string
{
// Генерация представления
return 'Ошибка 404 (не найдено)';
}
public function error500(): ?string
{
// Генерация представления
return 'Ошибка 500 (на стороне сервера)';
}
}

View File

@@ -0,0 +1,29 @@
<?php
declare(strict_types=1);
namespace mirzaev\surikovlib\controllers;
use mirzaev\surikovlib\controllers\core;
use mirzaev\surikovlib\models\accounts_model as accounts;
use Twig\Loader\FilesystemLoader;
use Twig\Environment as view;
/**
* Контроллер основной страницы
*
* @package mirzaev\surikovlib\controllers
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
final class main_controller extends core
{
public function index(array $vars = []): ?string
{
// Проверка аутентифицированности
$vars['account'] = accounts::account($vars);
// Генерация представления
return $this->view->render(DIRECTORY_SEPARATOR . 'main' . DIRECTORY_SEPARATOR . 'index.html', $vars);
}
}