0806aec4a4
- New models: Attachment, Webhook, Notification, SavedView - New fields: User.notificationPrefs (Json), indexes on Ticket - post-push.sql manages the tsvector columns + GIN indexes + triggers for FTS on Ticket (title/overview/displayId) and Comment (body); Prisma can't express these - package.json scripts: db:push and start:prod now chain `prisma db execute` against post-push.sql after `prisma db push` - db:migrate script removed — project uses push workflow, not migrations - Shared Zod schemas: attachment (25MB limit + mimetype allowlist), savedView, notification (prefs, mark-read, webhook CRUD) - Shared type additions: Attachment, Notification, SavedView, Webhook, PaginatedResponse<T> - Test fixtures updated for the new User.notificationPrefs column Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
129 lines
2.2 KiB
TypeScript
129 lines
2.2 KiB
TypeScript
import type { Role, TicketStatus } from './schemas/enums';
|
|
|
|
export type { Role, TicketStatus };
|
|
|
|
export interface UserSummary {
|
|
id: string;
|
|
username: string;
|
|
displayName: string;
|
|
}
|
|
|
|
export interface User extends UserSummary {
|
|
email: string;
|
|
role: Role;
|
|
apiKey?: string | null;
|
|
createdAt?: string;
|
|
}
|
|
|
|
export interface Category {
|
|
id: string;
|
|
name: string;
|
|
}
|
|
|
|
export interface CTIType {
|
|
id: string;
|
|
name: string;
|
|
categoryId: string;
|
|
category?: Category;
|
|
}
|
|
|
|
export interface Item {
|
|
id: string;
|
|
name: string;
|
|
typeId: string;
|
|
type?: CTIType & { category?: Category };
|
|
}
|
|
|
|
export interface Comment {
|
|
id: string;
|
|
body: string;
|
|
ticketId: string;
|
|
authorId: string;
|
|
author: UserSummary;
|
|
createdAt: string;
|
|
}
|
|
|
|
export interface AuditLog {
|
|
id: string;
|
|
ticketId: string;
|
|
userId: string;
|
|
action: string;
|
|
detail: string | null;
|
|
createdAt: string;
|
|
user: UserSummary;
|
|
}
|
|
|
|
export interface Ticket {
|
|
id: string;
|
|
displayId: string;
|
|
title: string;
|
|
overview: string;
|
|
severity: number;
|
|
status: TicketStatus;
|
|
categoryId: string;
|
|
typeId: string;
|
|
itemId: string;
|
|
assigneeId: string | null;
|
|
createdById: string;
|
|
resolvedAt: string | null;
|
|
createdAt: string;
|
|
updatedAt: string;
|
|
category: Category;
|
|
type: CTIType;
|
|
item: Item;
|
|
assignee: UserSummary | null;
|
|
createdBy: UserSummary;
|
|
comments?: Comment[];
|
|
_count?: { comments: number; attachments?: number };
|
|
}
|
|
|
|
export interface Attachment {
|
|
id: string;
|
|
filename: string;
|
|
mimetype: string;
|
|
size: number;
|
|
ticketId: string | null;
|
|
commentId: string | null;
|
|
uploadedById: string;
|
|
uploadedBy: UserSummary;
|
|
createdAt: string;
|
|
}
|
|
|
|
export interface Notification {
|
|
id: string;
|
|
userId: string;
|
|
kind: string;
|
|
ticketId: string | null;
|
|
commentId: string | null;
|
|
data: unknown;
|
|
readAt: string | null;
|
|
createdAt: string;
|
|
}
|
|
|
|
export interface SavedView {
|
|
id: string;
|
|
userId: string;
|
|
name: string;
|
|
filters: Record<string, unknown>;
|
|
createdAt: string;
|
|
updatedAt: string;
|
|
}
|
|
|
|
export interface Webhook {
|
|
id: string;
|
|
name: string;
|
|
url: string;
|
|
events: string[];
|
|
secret?: string;
|
|
active: boolean;
|
|
createdAt: string;
|
|
updatedAt: string;
|
|
}
|
|
|
|
export interface PaginatedResponse<T> {
|
|
data: T[];
|
|
total: number;
|
|
page: number;
|
|
pageSize: number;
|
|
}
|