- Migration 141: issues, issue_attachments, issue_comments - src/routes/admin/issues.js: session-auth UI routes (list/new/detail/status/assign/comments/upload) - src/routes/api.js: /api/internal/issues REST surface (Bearer token) - src/services/issueNotifier.js: Discord webhook helper (DISCORD_ISSUE_WEBHOOK_URL) - Views: index (list+filters), new (mobile-first form), detail (screenshots, comments, workflow) - layout.ejs: sidebar nav link - package.json: add multer ^1.4.5-lts.1 - CSRF token passed via query param on multipart forms (body unparsed when csurf runs) - Screenshots stored in services/arbiter-3.0/uploads/issues/ (10MB limit, 6 files max)
47 lines
1.8 KiB
SQL
47 lines
1.8 KiB
SQL
-- Migration 141: Trinity Console Issue Tracker (Task #166)
|
|
-- Filed by Chronicler #89 on REQ-2026-04-14-issue-tracker.
|
|
-- Creates issues + attachments + comments tables.
|
|
|
|
CREATE TABLE IF NOT EXISTS issues (
|
|
id SERIAL PRIMARY KEY,
|
|
issue_number INTEGER UNIQUE,
|
|
title VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
status VARCHAR(20) DEFAULT 'open', -- open, in_progress, blocked, resolved, closed
|
|
priority VARCHAR(20) DEFAULT 'medium', -- critical, high, medium, low
|
|
category VARCHAR(50) DEFAULT 'general', -- bug, feature, content, infrastructure, holly, general
|
|
submitted_by VARCHAR(100) NOT NULL, -- Discord username
|
|
assigned_to VARCHAR(100) DEFAULT 'unassigned',
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ DEFAULT NOW(),
|
|
resolved_at TIMESTAMPTZ,
|
|
resolved_by VARCHAR(100)
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_issues_status ON issues (status);
|
|
CREATE INDEX IF NOT EXISTS idx_issues_priority ON issues (priority);
|
|
CREATE INDEX IF NOT EXISTS idx_issues_category ON issues (category);
|
|
CREATE INDEX IF NOT EXISTS idx_issues_submitter ON issues (submitted_by);
|
|
|
|
CREATE TABLE IF NOT EXISTS issue_attachments (
|
|
id SERIAL PRIMARY KEY,
|
|
issue_id INTEGER REFERENCES issues(id) ON DELETE CASCADE,
|
|
filename VARCHAR(255) NOT NULL,
|
|
original_name VARCHAR(255),
|
|
mime_type VARCHAR(100),
|
|
file_size INTEGER,
|
|
uploaded_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_issue_attachments_issue ON issue_attachments (issue_id);
|
|
|
|
CREATE TABLE IF NOT EXISTS issue_comments (
|
|
id SERIAL PRIMARY KEY,
|
|
issue_id INTEGER REFERENCES issues(id) ON DELETE CASCADE,
|
|
author VARCHAR(100) NOT NULL,
|
|
content TEXT NOT NULL,
|
|
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_issue_comments_issue ON issue_comments (issue_id);
|