Files
firefrost-services/services/arbiter-3.0/migrations/141_issues.sql
Claude Code b0b69fb172 Task #166: Trinity Console Issue Tracker (REQ-2026-04-14-issue-tracker)
- 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)
2026-04-15 01:53:18 -05:00

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