2 Commits

Author SHA1 Message Date
Thomas
9095d4d9ae Merge pull request #1 from tuxitheone/codex/implement-customer-portal-with-bug-tracking
Add TuxiNet branding assets and document templates
2025-10-28 13:57:24 +01:00
Thomas
3755435890 Add TuxiNet branding and document templates 2025-10-28 13:56:54 +01:00
4 changed files with 1 additions and 196 deletions

View File

@@ -1,19 +0,0 @@
<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

View File

@@ -60,8 +60,7 @@ class Config
} }
foreach ($lines as $line) { foreach ($lines as $line) {
$trimmed = trim($line); if (str_starts_with(trim($line), '#')) {
if ($trimmed === '' || $trimmed[0] === '#') {
continue; continue;
} }

View File

@@ -2,14 +2,6 @@
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)
{ {

View File

@@ -1,167 +0,0 @@
-- 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;