This commit is contained in:
root
2022-10-13 07:07:04 +03:00
parent 30fd8f0ec3
commit 6d6712e9d2
21 changed files with 590 additions and 98 deletions

View File

@@ -33,7 +33,7 @@ final class accounts_model extends core
/**
* Хеш
*/
public string $hash;
public ?string $hash;
/**
* Время активности хеша
@@ -361,21 +361,17 @@ final class accounts_model extends core
* Проверить разрешение
*
* @param string $permission Разрешение
* @param int|null $id Идентификатор аккаунта
* @param array &$errors Журнал ошибок
*
* @return bool|null Статус разрешения, если оно записано
*/
public static function access(string $permission, int|null $id = null, array &$errors = []): ?bool
public function access(string $permission, array &$errors = []): ?bool
{
// Инициализация журнала ошибок
$errors['account'] ?? $errors['account'] = [];
try {
// Инициализация аккаунта
$account = isset($id) ? self::read(['id' => $id], $errors) : self::account($errors);
return isset($account->permissions[$permission]) ? (bool) $account->permissions[$permission] : null;
return isset($this->permissions[$permission]) ? (bool) $this->permissions[$permission] : null;
} catch (exception $e) {
// Запись в журнал ошибок
$errors['account'][]= [

View File

@@ -17,12 +17,62 @@ use exception;
*/
final class books_model extends core
{
/**
* Запись в базу данных
*
* @param string $title Название
* @param string|null $description Описание
* @param int|null $account Аккаунт (идентификатор)
* @param array &$errors Журнал ошибок
*
* @return int|null Идентификатор записанной книги
*/
public static function write(string $title, ?string $description = null, ?int $account = null, array &$errors = []): ?int
{
// Инициализация журнала ошибок
$errors['books'] ?? $errors['books'] = [];
try {
// Инициализация аккаунта
$account = accounts::init($account, $errors);
// Инициализация запроса
$request = static::$db->prepare("INSERT INTO `books` (`account`, `title`, `description`) VALUES (:account, :title, :description)");
// Инициализация параметров
$params = [
':account' => $account->id,
':title' => $title,
':description' => $description
];
// Отправка запроса
$request->execute($params);
if ($id = static::$db->lastInsertId()) {
// Получен идентификатор загруженной книги (подразумевается)
return (int) $id;
}
} catch (exception $e) {
// Запись в журнал ошибок
$errors['books'][] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
return null;
}
/**
* Чтение
*
* @param array $expression Выражение поиска
* @param int $limit Ограничение по количеству
* @param int $page Страница (сдвиг)
* @param int $page Страница (для списка книг)
* @param array &$errors Журнал ошибок
*
* @return array Книги
@@ -76,48 +126,26 @@ final class books_model extends core
}
/**
* Запись в базу данных
* Удаление из базы данных
*
* @param string $title Название
* @param string|null $description Описание
* @param int|null $account Аккаунт (идентификатор)
* @param int $id Идентификатор
* @param array &$errors Журнал ошибок
*
* @return int|null Идентификатор записанной книги
* @return bool Статус выполнения
*/
public static function write(string $title, ?string $description = null, ?int $account = null, array &$errors = []): ?int
public static function delete(int $id, array &$errors = []): bool
{
// Инициализация журнала ошибок
$errors['books'] ?? $errors['books'] = [];
try {
// Инициализация аккаунта
$account = accounts::init($account, $errors);
if (empty($account) || !accounts::access('books', $account->id)) {
// Не удалось найти аккаунт или разрешение на управление книгами не выдано
throw new exception('У вас нет разрешения на управление книгами');
}
// Инициализация запроса
$request = static::$db->prepare("INSERT INTO `books` (`account`, `title`, `description`) VALUES (:account, :title, :description)");
// Инициализация параметров
$params = [
':account' => $account->id,
':title' => $title,
':description' => $description
];
$request = static::$db->prepare("DELETE FROM `books` WHERE `id` = :id LIMIT 1");
// Отправка запроса
$request->execute($params);
$request->execute([':id' => $id]);
if ($id = static::$db->lastInsertId()) {
// Получен идентификатор загруженной книги (подразумевается)
return (int) $id;
}
return true;
} catch (exception $e) {
// Запись в журнал ошибок
$errors['books'][] = [
@@ -128,7 +156,7 @@ final class books_model extends core
];
}
return null;
return false;
}
/**
@@ -155,12 +183,6 @@ final class books_model extends core
// Инициализация аккаунта
$account = accounts::init($account, $errors);
if (empty($account) || !accounts::access('books', $account->id)) {
// Не найден аккаунт или разрешение на управление книгами не выдано
throw new exception('У вас нет разрешения на управление книгами');
}
// Инициализация буфера инициализированных книг
$initialized = [];
@@ -238,6 +260,66 @@ final class books_model extends core
return $writed ?? [];
}
/**
* Чтение
*
* @param int $id Идентификатор
* @param int $page Страница (сдвиг)
* @param array &$errors Журнал ошибок
*
* @return bool Статус выполнения
*/
public static function rotate(int $id, int $page = 1, array &$errors = []): bool
{
// Инициализация журнала ошибок
$errors['books'] ?? $errors['books'] = [];
try {
// Инициализация запроса
$request = static::$db->prepare("SELECT EXISTS (SELECT * FROM `books` WHERE `id` = :id LIMIT 1)");
// Отправка запроса
$request->execute([':id' => $id]);
if ($request->fetch(pdo::FETCH_NUM)[0] === 1) {
// Найдена книга
// Инициализация пути книги
$book = \STORAGE . DIRECTORY_SEPARATOR . 'books' . DIRECTORY_SEPARATOR . $id;
// Инициализация пути до файла
$file = $book . DIRECTORY_SEPARATOR . "$page.jpg";
// Инициализация пути до нового местоположения файла
$old = $book . DIRECTORY_SEPARATOR . 'old' . DIRECTORY_SEPARATOR . "$page.jpg";
// Инициализация директории
if (!file_exists($book)) throw new exception('Не удалось найти директорию книги');
// Инициализация директории оригинальных изображений
if (!file_exists($book . DIRECTORY_SEPARATOR . 'old')) if (!mkdir($book . DIRECTORY_SEPARATOR . 'old', 0755, true)) throw new exception('Не удалось записать директорию для оригинальных страниц книги');
// Перемещение страницы в директорию оригинальных страниц
exec("mv $file $old");
// Переворачивание файла и возвращение на нужное местоположение
exec("jpegtran -rotate 90 $old > $file");
return true;
}
} catch (exception $e) {
// Запись в журнал ошибок
$errors['books'][] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
return false;
}
/**
* Подсчёт количества страниц
*