34 lines
1.7 KiB
PHP
34 lines
1.7 KiB
PHP
<?php
|
|
/** Read-only экспорт существующих групп; выполняется внутри текущего API-контейнера. */
|
|
declare(strict_types=1);
|
|
define('APP_ROOT', getenv('APP_ROOT') ?: getcwd());
|
|
require APP_ROOT . '/vendor/autoload.php';
|
|
require APP_ROOT . '/vendor/yiisoft/yii2/Yii.php';
|
|
$db = Yii::createObject(require APP_ROOT . '/config/database.php');
|
|
$transaction = $db->beginTransaction(yii\db\Transaction::REPEATABLE_READ);
|
|
try {
|
|
$db->createCommand('SET TRANSACTION READ ONLY')->execute();
|
|
$db->createCommand("SET LOCAL statement_timeout = '5s'")->execute();
|
|
$groups = [];
|
|
foreach (['degr' => 'degr_groups', 'tp' => 'tarif_groups', 'cons' => 'consent_groups'] as $marker => $table) {
|
|
$query = (new yii\db\Query())->select(['number', 'name'])
|
|
->from('{{%' . $table . '}}')->where(['between', 'number', 1, 9])->orderBy(['number' => SORT_ASC]);
|
|
if ($marker !== 'degr') {
|
|
$query->andWhere(['deleted_at' => null]);
|
|
}
|
|
$groups[$marker] = array_map(static fn(array $row): array => [
|
|
'number' => (int) $row['number'], 'name' => (string) $row['name'],
|
|
], $query->all($db));
|
|
}
|
|
$transaction->commit();
|
|
echo json_encode(['host' => 'zoomzilla.ru', 'generated_at' => gmdate(DATE_ATOM), 'groups' => $groups],
|
|
JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), "\n";
|
|
} catch (Throwable $exception) {
|
|
if ($transaction->isActive) {
|
|
$transaction->rollBack();
|
|
}
|
|
// Сообщения PDO могут содержать DSN: наружу только безопасный результат.
|
|
fwrite(STDERR, "Каталог групп не обновлён.\n");
|
|
exit(1);
|
|
}
|