71 lines
2.0 KiB
PHP
71 lines
2.0 KiB
PHP
<?php
|
|
|
|
namespace humhub\modules\space_profiles\services;
|
|
|
|
use humhub\modules\space\models\Space;
|
|
use Yii;
|
|
|
|
class ModuleSetupService
|
|
{
|
|
public static function runForSpace(Space $space): array
|
|
{
|
|
$result = static::applyModuleMigrations();
|
|
|
|
$defaultUrl = $space->createUrl('/space_profiles/profile/view');
|
|
$settings = $space->getSettings();
|
|
$settings->set('indexUrl', $defaultUrl);
|
|
$settings->set('indexGuestUrl', $defaultUrl);
|
|
|
|
$result['defaultHomeUrl'] = $defaultUrl;
|
|
return $result;
|
|
}
|
|
|
|
private static function applyModuleMigrations(): array
|
|
{
|
|
$migrationDir = dirname(__DIR__) . '/migrations';
|
|
$files = glob($migrationDir . '/m*.php') ?: [];
|
|
sort($files, SORT_NATURAL);
|
|
|
|
$existingVersions = Yii::$app->db->createCommand('SELECT version FROM migration')->queryColumn();
|
|
$history = array_fill_keys($existingVersions, true);
|
|
|
|
$applied = [];
|
|
$skipped = [];
|
|
|
|
foreach ($files as $file) {
|
|
$version = pathinfo($file, PATHINFO_FILENAME);
|
|
if (isset($history[$version])) {
|
|
$skipped[] = $version;
|
|
continue;
|
|
}
|
|
|
|
if (!class_exists($version, false)) {
|
|
require_once $file;
|
|
}
|
|
|
|
if (!class_exists($version, false)) {
|
|
throw new \RuntimeException('Migration class not found: ' . $version);
|
|
}
|
|
|
|
$migration = new $version();
|
|
$ok = method_exists($migration, 'safeUp') ? $migration->safeUp() : $migration->up();
|
|
if ($ok === false) {
|
|
throw new \RuntimeException('Migration failed: ' . $version);
|
|
}
|
|
|
|
Yii::$app->db->createCommand()->insert('migration', [
|
|
'version' => $version,
|
|
'apply_time' => time(),
|
|
])->execute();
|
|
|
|
$applied[] = $version;
|
|
$history[$version] = true;
|
|
}
|
|
|
|
return [
|
|
'applied' => $applied,
|
|
'skipped' => $skipped,
|
|
];
|
|
}
|
|
}
|