Sergio Brighenti 6 سال پیش
والد
کامیت
945790bedd
2فایلهای تغییر یافته به همراه118 افزوده شده و 82 حذف شده
  1. 45 22
      install/index.php
  2. 73 60
      install/templates/install.twig

+ 45 - 22
install/index.php

@@ -48,27 +48,8 @@ $container['view'] = function ($container) use (&$config) {
 	return $view;
 };
 
-$app = new App($container);
-
-$app->get('/', function (Request $request, Response $response) {
-	return $this->view->render($response, 'install.twig');
-});
-
-$app->post('/', function (Request $request, Response $response) use (&$config) {
-	$config['base_url'] = $request->getParam('base_url');
-	$config['storage_dir'] = $request->getParam('storage_dir');
-	$config['displayErrorDetails'] = false;
-	$config['db']['connection'] = $request->getParam('connection');
-	$config['db']['dsn'] = $request->getParam('dsn');
-	$config['db']['username'] = $request->getParam('db_user');
-	$config['db']['password'] = $request->getParam('db_password');
-
-
-	file_put_contents(__DIR__ . '/../config.php', '<?php' . PHP_EOL . 'return ' . var_export($config, true) . ';');
-
-
-	DB::setDsn($config['db']['connection'] . ':' . __DIR__ . '/../' . $config['db']['dsn'], $config['db']['username'], $config['db']['password']);
-
+function migrate($config)
+{
 	$firstMigrate = false;
 	if (!file_exists(__DIR__ . '/../' . $config['db']['dsn']) && DB::driver() === 'sqlite') {
 		touch(__DIR__ . '/../' . $config['db']['dsn']);
@@ -105,7 +86,7 @@ $app->post('/', function (Request $request, Response $response) use (&$config) {
 			if (basename($file) === $migration->name && $migration->migrated) {
 				$continue = true;
 				break;
-			} elseif (basename($file) === $migration->name && !$migration->migrated) {
+			} else if (basename($file) === $migration->name && !$migration->migrated) {
 				$exists = true;
 				break;
 			}
@@ -127,9 +108,51 @@ $app->post('/', function (Request $request, Response $response) use (&$config) {
 			throw $exception;
 		}
 	}
+}
+
+function cleanDir($path)
+{
+	$directoryIterator = new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS);
+	$iteratorIterator = new RecursiveIteratorIterator($directoryIterator, RecursiveIteratorIterator::CHILD_FIRST);
+	foreach ($iteratorIterator as $file) {
+		if ($file->getFilename() !== '.gitkeep') {
+			$file->isDir() ? rmdir($file) : unlink($file);
+		}
+	}
+}
+
+$app = new App($container);
+
+$app->get('/', function (Request $request, Response $response) {
+
+	$installed = file_exists(__DIR__ . '/../config.php');
+
+	return $this->view->render($response, 'install.twig', ['installed' => $installed]);
+});
+
+$app->post('/', function (Request $request, Response $response) use (&$config) {
+	if (!file_exists(__DIR__ . '/../config.php')) {
+		$config['base_url'] = $request->getParam('base_url');
+		$config['storage_dir'] = $request->getParam('storage_dir');
+		$config['displayErrorDetails'] = false;
+		$config['db']['connection'] = $request->getParam('connection');
+		$config['db']['dsn'] = $request->getParam('dsn');
+		$config['db']['username'] = $request->getParam('db_user');
+		$config['db']['password'] = $request->getParam('db_password');
+
+
+		file_put_contents(__DIR__ . '/../config.php', '<?php' . PHP_EOL . 'return ' . var_export($config, true) . ';');
+	}
+
+	DB::setDsn($config['db']['connection'] . ':' . __DIR__ . '/../' . $config['db']['dsn'], $config['db']['username'], $config['db']['password']);
+
+	migrate($config);
 
 	DB::query("INSERT INTO `users` (`email`, `username`, `password`, `is_admin`, `user_code`) VALUES (?, 'admin', ?, 1, ?)", [$request->getParam('email'), password_hash($request->getParam('password'), PASSWORD_DEFAULT), substr(md5(microtime()), rand(0, 26), 5)]);
 
+	cleanDir(__DIR__ . '/../resources/cache');
+	cleanDir(__DIR__ . '/../resources/sessions');
+
 	return $response->withRedirect('../?afterInstall=true');
 });
 

+ 73 - 60
install/templates/install.twig

@@ -47,80 +47,93 @@
                 <div class="card-header">Install XBackBone</div>
                 <div class="card-body">
                     <form method="post" action="">
-
-                        <div class="form-group row">
-                            <label for="base_url" class="col-sm-3 col-form-label">Base URL</label>
-                            <div class="col-sm-9">
-                                <input type="text" class="form-control" id="base_url" name="base_url"
-                                       value="{{ config.base_url }}" autocomplete="off" required>
+                        {% if not installed %}
+                            <div class="form-group row">
+                                <label for="base_url" class="col-sm-3 col-form-label">Base URL</label>
+                                <div class="col-sm-9">
+                                    <input type="text" class="form-control" id="base_url" name="base_url"
+                                           value="{{ config.base_url }}" autocomplete="off" required>
+                                </div>
                             </div>
-                        </div>
-                        <hr>
-                        <div class="form-group row">
-                            <label for="connection" class="col-sm-3 col-form-label">SQL Engine</label>
-                            <div class="col-sm-9">
-                                <select name="connection" id="connection" required class="form-control">
-                                    <option value="sqlite" selected>SQLite</option>
-                                    <option value="mysql">MySQL</option>
-                                </select>
+                            <hr>
+                            <div class="form-group row">
+                                <label for="connection" class="col-sm-3 col-form-label">SQL Engine</label>
+                                <div class="col-sm-9">
+                                    <select name="connection" id="connection" required class="form-control">
+                                        <option value="sqlite" selected>SQLite</option>
+                                        <option value="mysql">MySQL</option>
+                                    </select>
+                                </div>
                             </div>
-                        </div>
 
-                        <div class="form-group row">
-                            <label for="dsn" class="col-sm-3 col-form-label">Database Source Name (DSN)</label>
-                            <div class="col-sm-9">
-                                <input type="text" class="form-control" id="dsn" name="dsn" value="{{ config.db.dsn }}"
-                                       autocomplete="off" required>
+                            <div class="form-group row">
+                                <label for="dsn" class="col-sm-3 col-form-label">Database Source Name (DSN)</label>
+                                <div class="col-sm-9">
+                                    <input type="text" class="form-control" id="dsn" name="dsn"
+                                           value="{{ config.db.dsn }}"
+                                           autocomplete="off" required>
+                                </div>
                             </div>
-                        </div>
 
-                        <div class="form-group row">
-                            <label for="db_user" class="col-sm-3 col-form-label">Database Username</label>
-                            <div class="col-sm-9">
-                                <input type="text" class="form-control" id="db_user" name="db_user" autocomplete="off" disabled>
+                            <div class="form-group row">
+                                <label for="db_user" class="col-sm-3 col-form-label">Database Username</label>
+                                <div class="col-sm-9">
+                                    <input type="text" class="form-control" id="db_user" name="db_user"
+                                           autocomplete="off"
+                                           disabled>
+                                </div>
                             </div>
-                        </div>
 
-                        <div class="form-group row">
-                            <label for="db_password" class="col-sm-3 col-form-label">Database Password</label>
-                            <div class="col-sm-9">
-                                <input type="password" class="form-control" id="db_password" name="db_password"
-                                       autocomplete="off" disabled>
+                            <div class="form-group row">
+                                <label for="db_password" class="col-sm-3 col-form-label">Database Password</label>
+                                <div class="col-sm-9">
+                                    <input type="password" class="form-control" id="db_password" name="db_password"
+                                           autocomplete="off" disabled>
+                                </div>
+                            </div>
+                            <hr>
+                            <div class="form-group row">
+                                <label for="storage_dir" class="col-sm-3 col-form-label">Storage Directory</label>
+                                <div class="col-sm-9">
+                                    <input type="text" class="form-control" id="storage_dir" name="storage_dir"
+                                           value="{{ config.storage_dir }}" autocomplete="off" required>
+                                    <small>Must be a writable directory</small>
+                                </div>
                             </div>
-                        </div>
-                        <hr>
-                        <div class="form-group row">
-                            <label for="storage_dir" class="col-sm-3 col-form-label">Storage Directory</label>
-                            <div class="col-sm-9">
-                                <input type="text" class="form-control" id="storage_dir" name="storage_dir"
-                                       value="{{ config.storage_dir }}" autocomplete="off" required>
-                                <small>Must be a writable directory</small>
+                            <hr>
+                            <div class="form-group row">
+                                <label for="email" class="col-sm-3 col-form-label">Admin email</label>
+                                <div class="col-sm-9">
+                                    <input type="email" class="form-control" id="email" placeholder="email@example.com"
+                                           name="email" autocomplete="off" required>
+                                </div>
                             </div>
-                        </div>
-                        <hr>
-                        <div class="form-group row">
-                            <label for="email" class="col-sm-3 col-form-label">Admin email</label>
-                            <div class="col-sm-9">
-                                <input type="email" class="form-control" id="email" placeholder="email@example.com"
-                                       name="email" autocomplete="off" required>
+
+                            <div class="form-group row">
+                                <label for="password" class="col-sm-3 col-form-label">Admin password</label>
+                                <div class="col-sm-9">
+                                    <input type="password" class="form-control" id="password" placeholder="Password"
+                                           name="password" autocomplete="off" required>
+                                </div>
                             </div>
-                        </div>
 
-                        <div class="form-group row">
-                            <label for="password" class="col-sm-3 col-form-label">Admin password</label>
-                            <div class="col-sm-9">
-                                <input type="password" class="form-control" id="password" placeholder="Password"
-                                       name="password" autocomplete="off" required>
+                            <div class="form-group row justify-content-md-end">
+                                <div class="col-sm-9">
+                                    <button type="submit" class="btn btn-outline-success">
+                                        <i class="fas fa-save fa-fw"></i> Configure & Install
+                                    </button>
+                                </div>
                             </div>
-                        </div>
 
-                        <div class="form-group row justify-content-md-end">
-                            <div class="col-sm-9">
-                                <button type="submit" class="btn btn-outline-success">
-                                    <i class="fas fa-save fa-fw"></i> Configure & Install
-                                </button>
+                        {% else %}
+                            <div class="form-group row">
+                                <div class="col-sm-12 d-flex justify-content-center">
+                                    <button type="submit" class="btn btn-lg btn-outline-primary">
+                                        <i class="fas fa-sync fa-fw"></i> Update database
+                                    </button>
+                                </div>
                             </div>
-                        </div>
+                        {% endif %}
                     </form>
                 </div>
             </div>