Big fat commit
This commit is contained in:
parent
287b2c2224
commit
7882449469
@ -3,14 +3,21 @@
|
|||||||
class App
|
class App
|
||||||
{
|
{
|
||||||
public array $config;
|
public array $config;
|
||||||
public object $database;
|
public Database $database;
|
||||||
public object $session;
|
public Session $session;
|
||||||
|
public User $user;
|
||||||
|
|
||||||
public function __construct(array $config, Database $database, Session $session)
|
public function __construct(
|
||||||
|
array $config,
|
||||||
|
Database $database,
|
||||||
|
Session $session,
|
||||||
|
User $user
|
||||||
|
)
|
||||||
{
|
{
|
||||||
$this->config = $config;
|
$this->config = $config;
|
||||||
$this->database = $database;
|
$this->database = $database;
|
||||||
$this->session = $session;
|
$this->session = $session;
|
||||||
|
$this->user = $user;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Grab model
|
// Grab model
|
||||||
@ -40,4 +47,11 @@ class App
|
|||||||
// Convert and respond with data
|
// Convert and respond with data
|
||||||
echo json_encode($data);
|
echo json_encode($data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Redirect to given url
|
||||||
|
public function redirect(string $url): void
|
||||||
|
{
|
||||||
|
header("Location: $url");
|
||||||
|
die();
|
||||||
|
}
|
||||||
}
|
}
|
@ -4,11 +4,12 @@
|
|||||||
// TODO: refactor and add different driver implementations
|
// TODO: refactor and add different driver implementations
|
||||||
class Database
|
class Database
|
||||||
{
|
{
|
||||||
public object $conn; // Holds PDO connection object
|
public PDO $conn;
|
||||||
|
|
||||||
public function __construct(array $config)
|
public function __construct(array $config)
|
||||||
{
|
{
|
||||||
if ($config['name'] !== 'mysql') {
|
if ($config['name'] !== 'mysql')
|
||||||
|
{
|
||||||
throw new Exception("Database error: ".$config['name']." is not implemented");
|
throw new Exception("Database error: ".$config['name']." is not implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,4 +11,70 @@ class Session
|
|||||||
session_start();
|
session_start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function has(string $key): bool
|
||||||
|
{
|
||||||
|
return array_key_exists($key, $_SESSION);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function get(string $key): mixed
|
||||||
|
{
|
||||||
|
if ($this->has($key))
|
||||||
|
{
|
||||||
|
return $_SESSION[$key];
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function set(string $key, mixed $value): void
|
||||||
|
{
|
||||||
|
$_SESSION[$key] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function remove(string $key): void
|
||||||
|
{
|
||||||
|
if ($this->has($key))
|
||||||
|
{
|
||||||
|
unset($_SESSION[$key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function clear(): void
|
||||||
|
{
|
||||||
|
session_unset();
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: throwaway code; rewrite for readability and also implement proper flashing by removing messages after one request
|
||||||
|
public function flash(string $msg, string $type = 'info'): void
|
||||||
|
{
|
||||||
|
$key = 'flashed_messages';
|
||||||
|
if (!$this->has($key)) {
|
||||||
|
$this->set($key, []);
|
||||||
|
}
|
||||||
|
if (count($this->get($key)) >= 100) {
|
||||||
|
$this->remove($key);
|
||||||
|
throw new Exception('Too many flashed messages!');
|
||||||
|
}
|
||||||
|
$msgs = $this->get($key);
|
||||||
|
$msgs[] = [
|
||||||
|
"message" => htmlspecialchars($msg),
|
||||||
|
"type" => $type
|
||||||
|
];
|
||||||
|
$this->set(
|
||||||
|
$key,
|
||||||
|
$msgs
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getFlashedMessages(): ?array
|
||||||
|
{
|
||||||
|
$key = 'flashed_messages';
|
||||||
|
if ($this->has($key)) {
|
||||||
|
$msgs = $this->get($key);
|
||||||
|
$this->remove($key);
|
||||||
|
return $msgs;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
// END TODO;
|
||||||
}
|
}
|
29
app/core/User.php
Normal file
29
app/core/User.php
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// TODO: ...
|
||||||
|
class User
|
||||||
|
{
|
||||||
|
private Session $session;
|
||||||
|
|
||||||
|
public ?bool $loggedIn;
|
||||||
|
public ?string $username;
|
||||||
|
|
||||||
|
public function __construct(Session $session)
|
||||||
|
{
|
||||||
|
$this->session = $session;
|
||||||
|
|
||||||
|
$this->loggedIn = $this->session->get('loggedIn');
|
||||||
|
$this->username = $this->session->get('username');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function login(string $username, string $password): bool
|
||||||
|
{
|
||||||
|
if ($username === 'William' && $password === 'William')
|
||||||
|
{
|
||||||
|
$this->session->set('loggedIn', TRUE);
|
||||||
|
$this->session->set('username', 'William');
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
12
app/inc.php
12
app/inc.php
@ -12,6 +12,9 @@
|
|||||||
Tread carefully
|
Tread carefully
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// Disable type coercion
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
// Autoloader
|
// Autoloader
|
||||||
spl_autoload_register(function ($class_name) {
|
spl_autoload_register(function ($class_name) {
|
||||||
require __DIR__ . '/core/' . $class_name . '.php';
|
require __DIR__ . '/core/' . $class_name . '.php';
|
||||||
@ -21,18 +24,21 @@ spl_autoload_register(function ($class_name) {
|
|||||||
$config = require __DIR__ . '/config.php';
|
$config = require __DIR__ . '/config.php';
|
||||||
$database = new Database($config['database']);
|
$database = new Database($config['database']);
|
||||||
$session = new Session;
|
$session = new Session;
|
||||||
|
$user = new User($session);
|
||||||
|
|
||||||
$app = new App(
|
$app = new App(
|
||||||
$config,
|
$config,
|
||||||
$database,
|
$database,
|
||||||
$session
|
$session,
|
||||||
|
$user
|
||||||
);
|
);
|
||||||
|
|
||||||
// We will want to use $app instead
|
// We will use $app instead
|
||||||
unset(
|
unset(
|
||||||
$config,
|
$config,
|
||||||
$database,
|
$database,
|
||||||
$session
|
$session,
|
||||||
|
$user
|
||||||
);
|
);
|
||||||
|
|
||||||
return $app;
|
return $app;
|
2
app/view/example.php
Normal file
2
app/view/example.php
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
<h1>Eksempel side</h1>
|
||||||
|
<p>Dette er en eksempel side</p>
|
@ -1,3 +1,3 @@
|
|||||||
<h1>Velkommen til forsida!</h1>
|
<h1>Forside</h1>
|
||||||
<p>Ting fungerer noen ganger.</p>
|
<p>Ting fungerer noen ganger.</p>
|
||||||
<p><?=$data?></p>
|
<p><?=$data?></p>
|
@ -10,15 +10,22 @@
|
|||||||
<body>
|
<body>
|
||||||
|
|
||||||
<div id="header">
|
<div id="header">
|
||||||
<a>Stafett for livet tellesystem</a>
|
<a href="<?=$this->config['root_url']?>">Stafett for livet tellesystem</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<hr class="hidden">
|
<hr class="hidden">
|
||||||
|
|
||||||
<div id="menu">
|
<div id="menu">
|
||||||
<small>
|
<small>
|
||||||
|
|
||||||
|
<?php if ($this->user->loggedIn): ?>
|
||||||
|
<span><?=htmlspecialchars($this->user->username)?></span>
|
||||||
|
<a href="<?=$this->config['root_url']?>logout.php">Logg ut</a>
|
||||||
|
<?php else: ?>
|
||||||
<span>Ikke pålogget</span>
|
<span>Ikke pålogget</span>
|
||||||
<a href="<?=$this->config['root_url']?>login.php">Logg inn</a>
|
<a href="<?=$this->config['root_url']?>login.php">Logg inn</a>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
</small>
|
</small>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -30,10 +37,21 @@
|
|||||||
<ul>
|
<ul>
|
||||||
<li><a href="<?=$this->config['root_url']?>index.php">Forside</a></li>
|
<li><a href="<?=$this->config['root_url']?>index.php">Forside</a></li>
|
||||||
<li><a href="<?=$this->config['root_url']?>login.php">Logg inn</a></li>
|
<li><a href="<?=$this->config['root_url']?>login.php">Logg inn</a></li>
|
||||||
<li><a href="<?=$this->config['root_url']?>">Eksempel</a></li>
|
<li><a href="<?=$this->config['root_url']?>example.php">Eksempel</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<hr class="hidden">
|
<hr class="hidden">
|
||||||
|
|
||||||
<div id="main">
|
<div id="main">
|
||||||
|
<?php
|
||||||
|
// Display flashed messages
|
||||||
|
$msgs = $this->session->getFlashedMessages();
|
||||||
|
if ($msgs)
|
||||||
|
{
|
||||||
|
foreach ($msgs as $msg)
|
||||||
|
{
|
||||||
|
echo "<div class=\"alert {$msg["type"]}\">{$msg["message"]}</div>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
11
public/example.php
Normal file
11
public/example.php
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<?php
|
||||||
|
$app = require '../app/inc.php';
|
||||||
|
|
||||||
|
$app->session->flash('Eksempel', 'info');
|
||||||
|
$app->session->flash('Eksempel', 'success');
|
||||||
|
$app->session->flash('Eksempel', 'warning');
|
||||||
|
$app->session->flash('Eksempel', 'danger');
|
||||||
|
|
||||||
|
$app->view('template/header', ['title' => 'Eksempel side']);
|
||||||
|
$app->view('example');
|
||||||
|
$app->view('template/footer');
|
@ -4,7 +4,5 @@ $app = require '../app/inc.php';
|
|||||||
$model = $app->model('Index');
|
$model = $app->model('Index');
|
||||||
|
|
||||||
$app->view('template/header', ["title" => "Forside"]);
|
$app->view('template/header', ["title" => "Forside"]);
|
||||||
$app->view('index', [
|
$app->view('index', ["data" => $model->getUsername()]);
|
||||||
"data" => $model->getUsername()
|
|
||||||
]);
|
|
||||||
$app->view('template/footer');
|
$app->view('template/footer');
|
@ -1,6 +1,21 @@
|
|||||||
<?php
|
<?php
|
||||||
$app = require '../app/inc.php';
|
$app = require '../app/inc.php';
|
||||||
|
|
||||||
|
if ($app->user->loggedIn) {
|
||||||
|
$app->session->flash('Du er allerede pålogget');
|
||||||
|
$app->redirect('index.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($_SERVER['REQUEST_METHOD'] === 'POST')
|
||||||
|
{
|
||||||
|
if ($app->user->login($_POST['username'], $_POST['password']))
|
||||||
|
{
|
||||||
|
$app->session->flash("Velkommen {$_POST['username']}!");
|
||||||
|
$app->redirect('index.php');
|
||||||
|
}
|
||||||
|
$app->session->flash('Feil påloggingsinformasjon', 'danger');
|
||||||
|
}
|
||||||
|
|
||||||
$app->view('template/header', ["title" => "Logg inn"]);
|
$app->view('template/header', ["title" => "Logg inn"]);
|
||||||
$app->view('login');
|
$app->view('login');
|
||||||
$app->view('template/footer');
|
$app->view('template/footer');
|
6
public/logout.php
Normal file
6
public/logout.php
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?php
|
||||||
|
$app = require '../app/inc.php';
|
||||||
|
|
||||||
|
$app->session->clear();
|
||||||
|
$app->session->flash('Du har blitt logget av');
|
||||||
|
$app->redirect("{$app->config["root_url"]}login.php");
|
Reference in New Issue
Block a user