You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.0 KiB
87 lines
2.0 KiB
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
function getDatabase(): PDO
|
|
{
|
|
static $pdo = null;
|
|
|
|
if ($pdo instanceof PDO) {
|
|
return $pdo;
|
|
}
|
|
|
|
$databaseDirectory = dirname(__DIR__) . '/data';
|
|
$databaseFile = $databaseDirectory . '/kanban.sqlite';
|
|
|
|
if (!is_dir($databaseDirectory)) {
|
|
if (!mkdir($databaseDirectory, 0775, true)) {
|
|
throw new RuntimeException(
|
|
'Unable to create the database directory.'
|
|
);
|
|
}
|
|
}
|
|
|
|
$pdo = new PDO('sqlite:' . $databaseFile);
|
|
|
|
$pdo->setAttribute(
|
|
PDO::ATTR_ERRMODE,
|
|
PDO::ERRMODE_EXCEPTION
|
|
);
|
|
|
|
$pdo->setAttribute(
|
|
PDO::ATTR_DEFAULT_FETCH_MODE,
|
|
PDO::FETCH_ASSOC
|
|
);
|
|
|
|
$pdo->exec('PRAGMA foreign_keys = ON');
|
|
$pdo->exec('PRAGMA busy_timeout = 5000');
|
|
$pdo->exec('PRAGMA journal_mode = WAL');
|
|
|
|
createSchema($pdo);
|
|
|
|
return $pdo;
|
|
}
|
|
|
|
function createSchema(PDO $pdo): void
|
|
{
|
|
$pdo->exec(
|
|
<<<'SQL'
|
|
CREATE TABLE IF NOT EXISTS kanban_tasks (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
|
|
column_id INTEGER NOT NULL
|
|
CHECK (column_id BETWEEN 1 AND 6),
|
|
|
|
position INTEGER NOT NULL DEFAULT 0,
|
|
|
|
assign_to TEXT NOT NULL DEFAULT 'me',
|
|
content TEXT NOT NULL,
|
|
description TEXT,
|
|
tags TEXT,
|
|
color TEXT NOT NULL DEFAULT 'yellow',
|
|
|
|
due_at TEXT,
|
|
start_date TEXT,
|
|
|
|
priority INTEGER NOT NULL DEFAULT 0
|
|
CHECK (priority BETWEEN 0 AND 10),
|
|
|
|
complexity INTEGER NOT NULL DEFAULT 0
|
|
CHECK (complexity BETWEEN 0 AND 10),
|
|
|
|
estimate_hours REAL,
|
|
time_spent_hours REAL,
|
|
|
|
created_at TEXT NOT NULL
|
|
DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
updated_at TEXT NOT NULL
|
|
DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS
|
|
idx_kanban_tasks_column_position
|
|
ON kanban_tasks (column_id, position);
|
|
SQL
|
|
);
|
|
}
|
|
|