A light weight PHP PDO SQLite3 KanBan Board.
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.
 
 
 
 
mykanban2/api/database.php

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
);
}