Compare commits
4 Commits
main
...
codex/impl
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
706ef5350d | ||
|
|
975704b333 | ||
|
|
2ff756febd | ||
|
|
8e608d03ec |
19
.htaccess
Normal file
19
.htaccess
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<IfModule mod_rewrite.c>
|
||||||
|
RewriteEngine On
|
||||||
|
RewriteBase /
|
||||||
|
|
||||||
|
# Allow direct access to files that actually exist in the public directory
|
||||||
|
RewriteCond %{DOCUMENT_ROOT}/public/$1 -f
|
||||||
|
RewriteRule ^(.*)$ public/$1 [L]
|
||||||
|
|
||||||
|
RewriteCond %{DOCUMENT_ROOT}/public/$1 -d
|
||||||
|
RewriteRule ^(.*)$ public/$1/ [L]
|
||||||
|
|
||||||
|
# Block direct access to sensitive directories
|
||||||
|
RewriteRule ^(app|bootstrap|config|database|resources|routes)/ - [F,L]
|
||||||
|
|
||||||
|
# Everything else goes through the front controller
|
||||||
|
RewriteRule ^ public/index.php [QSA,L]
|
||||||
|
</IfModule>
|
||||||
|
|
||||||
|
DirectoryIndex public/index.php
|
||||||
@@ -60,7 +60,8 @@ class Config
|
|||||||
}
|
}
|
||||||
|
|
||||||
foreach ($lines as $line) {
|
foreach ($lines as $line) {
|
||||||
if (str_starts_with(trim($line), '#')) {
|
$trimmed = trim($line);
|
||||||
|
if ($trimmed === '' || $trimmed[0] === '#') {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,14 @@
|
|||||||
|
|
||||||
use App\Core\Config;
|
use App\Core\Config;
|
||||||
|
|
||||||
|
// Ensure the configuration class is loaded even if SPL autoloading is not yet available
|
||||||
|
if (!class_exists(Config::class, false)) {
|
||||||
|
$configPath = __DIR__ . '/../app/Core/Config.php';
|
||||||
|
if (file_exists($configPath)) {
|
||||||
|
require_once $configPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!function_exists('config')) {
|
if (!function_exists('config')) {
|
||||||
function config(string $key, $default = null)
|
function config(string $key, $default = null)
|
||||||
{
|
{
|
||||||
|
|||||||
167
database/schema.sql
Normal file
167
database/schema.sql
Normal file
@@ -0,0 +1,167 @@
|
|||||||
|
-- CMS schema export for phpMyAdmin import
|
||||||
|
-- Generated to match the PHP migrations
|
||||||
|
|
||||||
|
SET NAMES utf8mb4;
|
||||||
|
SET time_zone = '+00:00';
|
||||||
|
|
||||||
|
SET foreign_key_checks = 0;
|
||||||
|
SET sql_notes = 0;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS attachments;
|
||||||
|
DROP TABLE IF EXISTS comments;
|
||||||
|
DROP TABLE IF EXISTS issue_labels;
|
||||||
|
DROP TABLE IF EXISTS labels;
|
||||||
|
DROP TABLE IF EXISTS issues;
|
||||||
|
DROP TABLE IF EXISTS subscriptions;
|
||||||
|
DROP TABLE IF EXISTS activity;
|
||||||
|
DROP TABLE IF EXISTS audit;
|
||||||
|
DROP TABLE IF EXISTS projects;
|
||||||
|
DROP TABLE IF EXISTS settings;
|
||||||
|
DROP TABLE IF EXISTS users;
|
||||||
|
DROP TABLE IF EXISTS customers;
|
||||||
|
|
||||||
|
SET foreign_key_checks = 1;
|
||||||
|
SET sql_notes = 1;
|
||||||
|
|
||||||
|
CREATE TABLE customers (
|
||||||
|
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
name VARCHAR(255) NOT NULL,
|
||||||
|
orgno VARCHAR(100) NOT NULL,
|
||||||
|
billing_email VARCHAR(255) NOT NULL,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
CREATE TABLE users (
|
||||||
|
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
role ENUM('sysadmin','developer','customer') NOT NULL,
|
||||||
|
name VARCHAR(255) NOT NULL,
|
||||||
|
email VARCHAR(255) NOT NULL UNIQUE,
|
||||||
|
pass_hash VARCHAR(255) NOT NULL,
|
||||||
|
phone VARCHAR(50) NULL,
|
||||||
|
address VARCHAR(255) NULL,
|
||||||
|
customer_id INT UNSIGNED NULL,
|
||||||
|
is_active TINYINT(1) NOT NULL DEFAULT 1,
|
||||||
|
twofa_secret VARCHAR(255) NULL,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||||
|
CONSTRAINT fk_users_customer FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE SET NULL
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
CREATE TABLE projects (
|
||||||
|
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
customer_id INT UNSIGNED NOT NULL,
|
||||||
|
name VARCHAR(255) NOT NULL,
|
||||||
|
description TEXT NULL,
|
||||||
|
status ENUM('active','archived') NOT NULL DEFAULT 'active',
|
||||||
|
created_by INT UNSIGNED NOT NULL,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||||
|
CONSTRAINT fk_projects_customer FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT fk_projects_creator FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE CASCADE,
|
||||||
|
INDEX idx_projects_customer_status (customer_id, status)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
CREATE TABLE labels (
|
||||||
|
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
project_id INT UNSIGNED NOT NULL,
|
||||||
|
name VARCHAR(100) NOT NULL,
|
||||||
|
color VARCHAR(7) NOT NULL,
|
||||||
|
CONSTRAINT fk_labels_project FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
CREATE TABLE issues (
|
||||||
|
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
project_id INT UNSIGNED NOT NULL,
|
||||||
|
type ENUM('bug','feature','task') NOT NULL,
|
||||||
|
priority ENUM('low','medium','high','urgent') NOT NULL DEFAULT 'medium',
|
||||||
|
status ENUM('new','in_progress','in_review','resolved','closed') NOT NULL DEFAULT 'new',
|
||||||
|
assignee_id INT UNSIGNED NULL,
|
||||||
|
title VARCHAR(255) NOT NULL,
|
||||||
|
description TEXT NOT NULL,
|
||||||
|
environment VARCHAR(50) NULL,
|
||||||
|
version VARCHAR(100) NULL,
|
||||||
|
steps_to_reproduce TEXT NULL,
|
||||||
|
created_by INT UNSIGNED NOT NULL,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||||
|
CONSTRAINT fk_issues_project FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT fk_issues_assignee FOREIGN KEY (assignee_id) REFERENCES users(id) ON DELETE SET NULL,
|
||||||
|
CONSTRAINT fk_issues_creator FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE CASCADE,
|
||||||
|
INDEX idx_issues_project_status (project_id, status),
|
||||||
|
INDEX idx_issues_priority (priority),
|
||||||
|
INDEX idx_issues_assignee (assignee_id)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
CREATE TABLE issue_labels (
|
||||||
|
issue_id INT UNSIGNED NOT NULL,
|
||||||
|
label_id INT UNSIGNED NOT NULL,
|
||||||
|
PRIMARY KEY (issue_id, label_id),
|
||||||
|
CONSTRAINT fk_issue_labels_issue FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT fk_issue_labels_label FOREIGN KEY (label_id) REFERENCES labels(id) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
CREATE TABLE comments (
|
||||||
|
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
issue_id INT UNSIGNED NOT NULL,
|
||||||
|
user_id INT UNSIGNED NOT NULL,
|
||||||
|
body TEXT NOT NULL,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
CONSTRAINT fk_comments_issue FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT fk_comments_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
||||||
|
INDEX idx_comments_issue_created (issue_id, created_at)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
CREATE TABLE attachments (
|
||||||
|
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
comment_id INT UNSIGNED NOT NULL,
|
||||||
|
filename VARCHAR(255) NOT NULL,
|
||||||
|
path VARCHAR(255) NOT NULL,
|
||||||
|
size INT UNSIGNED NOT NULL,
|
||||||
|
mime VARCHAR(255) NOT NULL,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
CONSTRAINT fk_attachments_comment FOREIGN KEY (comment_id) REFERENCES comments(id) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
CREATE TABLE subscriptions (
|
||||||
|
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
user_id INT UNSIGNED NOT NULL,
|
||||||
|
project_id INT UNSIGNED NULL,
|
||||||
|
issue_id INT UNSIGNED NULL,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
CONSTRAINT fk_subscriptions_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT fk_subscriptions_project FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT fk_subscriptions_issue FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE,
|
||||||
|
INDEX idx_subscriptions_user (user_id)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
CREATE TABLE activity (
|
||||||
|
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
entity_type VARCHAR(50) NOT NULL,
|
||||||
|
entity_id INT UNSIGNED NOT NULL,
|
||||||
|
user_id INT UNSIGNED NOT NULL,
|
||||||
|
action VARCHAR(100) NOT NULL,
|
||||||
|
meta_json JSON NULL,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
CONSTRAINT fk_activity_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
||||||
|
INDEX idx_activity_entity (entity_type, entity_id),
|
||||||
|
INDEX idx_activity_user (user_id)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
CREATE TABLE audit (
|
||||||
|
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
user_id INT UNSIGNED NULL,
|
||||||
|
entity VARCHAR(100) NOT NULL,
|
||||||
|
entity_id INT UNSIGNED NULL,
|
||||||
|
action VARCHAR(100) NOT NULL,
|
||||||
|
meta_json JSON NULL,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
CONSTRAINT fk_audit_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL,
|
||||||
|
INDEX idx_audit_entity (entity, entity_id)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
CREATE TABLE settings (
|
||||||
|
`key` VARCHAR(100) PRIMARY KEY,
|
||||||
|
`value` TEXT NULL,
|
||||||
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||||
|
|
||||||
Reference in New Issue
Block a user