require_once __DIR__ . '/../../src/Router.php';
require_once __DIR__ . '/../../src/HTTPException.php';
$router = new Router();
$router->on('get', function ($request, $services) {
    session_start();
    $stmt = $services['pdo']->prepare('
			SELECT 
				`id`, 
				`username`, 
				UNIX_TIMESTAMP(`created`) AS `created`,
				`admin`
			FROM `User` 
			WHERE `id` = (
				SELECT `ownerID` 
				FROM `Session` 
				WHERE `id` = :sessionID 
					AND `active` = 1
				LIMIT 1)');
    $stmt->bindValue('sessionID', session_id(), PDO::PARAM_STR);
    $stmt->execute();
    $result = $stmt->fetch(PDO::FETCH_ASSOC);
    if ($result) {
        $result['id'] = intval($result['id']);
        $result['created'] = intval($result['created']);
        $result['admin'] = $result['admin'] !== '0';
        return $result;
    } else {
        throw new UnauthorizedException();
    }
});
$router->route();
<?php

require_once __DIR__ . '/../../config.php';
require_once __DIR__ . '/../../src/Router.php';
require_once __DIR__ . '/../../src/HTTPException.php';
$router = new Router();
$router->on('post', function ($request, $services) {
    $request->params->mustHave('username');
    $request->params->mustHave('password');
    $stmt = $services['pdo']->prepare('INSERT INTO `User` (`username`, `password`) VALUES (:username, :password)');
    $stmt->bindValue('username', $request->params['username'], PDO::PARAM_STR);
    $password = password_hash($request->params['password'], PASSWORD_DEFAULT);
    $stmt->bindValue('password', $password, PDO::PARAM_STR);
    try {
        $stmt->execute();
    } catch (PDOException $e) {
        if (-1 !== strpos($e->getMessage(), 'Integrity constraint violation')) {
            throw new ConflictExistsException('Username taken.');
        }
    }
    if ($stmt->rowCount() < 1) {
        throw new ConflictExistsException('Username taken.');
    }
});
$router->route();
<?php

require_once __DIR__ . '/../../config.php';
require_once __DIR__ . '/../../src/Router.php';
require_once __DIR__ . '/../../src/HTTPException';
$router = new Router();
$router->on('get', function ($request, $services) {
    $sql = '
	SELECT 
		`id`, 
		`name`, 
		`ownerID`, 
		`start`, 
		`end`, 
		`location` 
	FROM `Event` 
	WHERE `name` LIKE "%:query%"';
    $stmt = $services['pdo']->prepare($sql);
    $stmt->bindValue('query', $request['query'], PDO::PARAM_STR);
    $stmt->execute();
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    if ($result) {
        return $result;
    } else {
        throw new InternalServerError('Failed to search events.');
    }
});
$router->route();
require_once __DIR__ . '/../../config.php';
require_once __DIR__ . '/../../src/Router.php';
require_once __DIR__ . '/../../src/HTTPException.php';
$router = new Router();
$router->on('post', function ($request, $services) {
    $request->params->mustHave('username');
    $request->params->mustHave('password');
    $stmt = $services['pdo']->prepare('SELECT `password`, `id` FROM `User` WHERE `username` = :username LIMIT 1');
    $stmt->bindValue('username', $request->params['username'], PDO::PARAM_STR);
    $stmt->execute();
    $stmt->bindColumn('password', $passwordHash, PDO::PARAM_STR);
    $stmt->bindColumn('id', $userID, PDO::PARAM_INT);
    if (!$stmt->fetch(PDO::FETCH_BOUND) || !$passwordHash || !password_verify($request->params['password'], $passwordHash)) {
        throw new UnauthorizedException('Login failed.');
    }
    session_start();
    $stmt = $services['pdo']->prepare('UPDATE `Session` SET `active` = 0 WHERE `id` = :sessionID LIMIT 1');
    $stmt->bindValue('sessionID', session_id(), PDO::PARAM_STR);
    $stmt->execute();
    session_regenerate_id();
    $stmt = $services['pdo']->prepare('INSERT INTO `Session` (`id`, `ownerID`, `expiration`, `active`) VALUES (:id, :ownerID, CURRENT_TIMESTAMP() + INTERVAL 1 HOUR, 1)');
    $stmt->bindValue('id', session_id(), PDO::PARAM_STR);
    $stmt->bindValue('ownerID', $userID, PDO::PARAM_INT);
    $stmt->execute();
    if ($stmt->rowCount() < 1) {
        throw new InternalServerException('Failed to register session.');
    }
    return ['sessionID' => session_id()];
});
$router->route();
$router->on('post', function ($request, $services) {
    session_start();
    $stmt = $services['pdo']->prepare('SELECT `ownerID` FROM `Session` WHERE `id` = :sessionID');
    $stmt->bindValue('sessionID', session_id(), PDO::PARAM_STR);
    $stmt->execute();
    $currentUID = $stmt->fetchColumn(0);
    if ($currentUID === false) {
        throw new UnauthorizedException('You are not allowed to create events.');
    }
    $request->params->mustHave('name');
    $request->params->mustHave('start');
    $request->params->mustHave('end');
    $request->params->mustHave('location');
    $stmt = $services['pdo']->prepare('
		INSERT INTO `Event` (
			`name`, 
			`ownerID`, 
			`start`, 
			`end`, 
			`location`
		) VALUES (
			:name,
			:ownerID,
			FROM_UNIXTIME(:start),
			FROM_UNIXTIME(:end),
			:location
		)');
    $stmt->bindValue('name', $request->params['name'], PDO::PARAM_STR);
    $stmt->bindValue('ownerID', $currentUID, PDO::PARAM_INT);
    $stmt->bindValue('start', $request->params['start'], PDO::PARAM_INT);
    $stmt->bindValue('end', $request->params['end'], PDO::PARAM_INT);
    $stmt->bindValue('location', $request->params['location'], PDO::PARAM_STR);
    $stmt->execute();
    if ($stmt->rowCount() < 0) {
        return new Response('', 304);
    }
});
require_once __DIR__ . '/../../config.php';
require_once __DIR__ . '/../../src/Router.php';
require_once __DIR__ . '/../../src/HTTPException.php';
$router = new Router();
$router->on('post', function ($request, $services) {
    session_start();
    $stmt = $services['pdo']->prepare('SELECT `ownerID` FROM `Session` WHERE `id` = :sessionID');
    $stmt->bindValue('sessionID', session_id(), PDO::PARAM_STR);
    $stmt->execute();
    $currentUID = $stmt->fetchColumn(0);
    if ($currentUID === false) {
        throw new UnauthorizedException('You must be logged in to delete events.');
    }
    $request->params->mustHave('id');
    $stmt = $services['pdo']->prepare('
		DELETE e FROM `Event` AS e
		WHERE e.`id` = :eventID 
			AND EXISTS (
				SELECT * FROM `User` AS u
				WHERE u.`id` = :currentUID
					AND (e.`ownerID` = u.`id` OR u.`admin` = 1)
				LIMIT 1
		)');
    $stmt->bindValue('eventID', $request->params['id'], PDO::PARAM_INT);
    $stmt->bindValue('currentUID', $currentUID, PDO::PARAM_INT);
    $stmt->execute();
    if ($stmt->rowCount() < 1) {
        return new Response('', 304);
    }
});
$router->route();
<?php

require_once __DIR__ . '/../../config.php';
require_once __DIR__ . '/../../src/Router.php';
$router = new Router();
$router->on('get', function ($request, $services) {
    $stmt = $services['pdo']->prepare('
		SELECT 
			`id`, 
			`name`, 
			`ownerID`, 
			UNIX_TIMESTAMP(`start`) AS `start`, 
			UNIX_TIMESTAMP(`end`) AS `end`, 
			`location`
		FROM `Event` 
		ORDER BY `id` ASC');
    $stmt->execute();
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    if ($result === false) {
        throw new InternalServiceException('Failed to list events.');
    }
    foreach ($result as &$event) {
        $event['id'] = intval($event['id']);
        $event['ownerID'] = intval($event['ownerID']);
        $event['start'] = intval($event['start']);
        $event['end'] = intval($event['end']);
    }
    return $result;
});
$router->route();
<?php

require_once __DIR__ . '/../../config.php';
require_once __DIR__ . '/../../src/Router.php';
$router = new Router();
$router->on('post', function ($request, $services) {
    session_start();
    $stmt = $services['pdo']->prepare('UPDATE `Session` SET `active` = 0 WHERE `id` = :sessionID');
    $stmt->bindValue('sessionID', session_id(), PDO::PARAM_STR);
    $stmt->execute();
});
$router->route();