import type { APIEmbed, APIMessageTopLevelComponent } from "@stealth-developers/db"; import { type Static, type TSchema, t } from "elysia"; export const GuildSchema = t.Object({ id: t.Number(), discordId: t.String(), name: t.String(), icon: t.Nullable(t.String()), createdAt: t.Date(), updatedAt: t.Date(), }); export type SanitisedGuild = Static; export const UserSchema = t.Object({ id: t.Number(), discordId: t.Nullable(t.String()), username: t.Nullable(t.String()), displayName: t.Nullable(t.String()), createdAt: t.Date(), updatedAt: t.Date(), }); export type SanitisedUser = Static; export const ActorSchema = t.Object({ actorId: t.Number(), guildId: t.Nullable(t.Number()), userId: t.Nullable(t.Number()), discordId: t.Nullable(t.String()), username: t.Nullable(t.String()), displayName: t.Nullable(t.String()), avatar: t.Nullable(t.String()), createdAt: t.Date(), updatedAt: t.Date(), }); export type SanitisedActor = Static; export const ActorWithGuildSchema = t.Object({ ...ActorSchema.properties, guild: t.Nullable(GuildSchema), }); export type SanitisedActorWithGuild = Static; export const TicketSchema = t.Object({ id: t.String(), guildId: t.Number(), localId: t.Number(), status: t.String(), channelId: t.Nullable(t.String()), threadId: t.Nullable(t.String()), closeReason: t.Nullable(t.String()), privateReason: t.Nullable(t.String()), openedAt: t.Date(), closedAt: t.Nullable(t.Date()), closedBy: t.Nullable(t.Number()), lastSubjectActivityAt: t.Nullable(t.Date()), lastClaimantActivityAt: t.Nullable(t.Date()), openedBy: t.Number(), openReason: t.Nullable(t.String()), subject: t.Nullable(t.Number()), claimedBy: t.Nullable(t.Number()), claimedAt: t.Nullable(t.Date()), thankedAt: t.Nullable(t.Date()), warnedAt: t.Nullable(t.Date()), lastMessageAt: t.Nullable(t.Date()), hasModeratorMessage: t.Nullable(t.Boolean()), hasAuthorMessage: t.Nullable(t.Boolean()), subjects: t.Object({ participants: t.Array(ActorSchema), subject: ActorSchema, opener: ActorSchema, closedBy: t.Nullable(ActorSchema), claimedBy: t.Nullable(ActorSchema), }), }); export type SanitisedTicket = Static; const APIEmbedSchema = t.Any() as unknown as TSchema & { static: APIEmbed }; const APIMessageComponentSchema = t.Any() as unknown as TSchema & { static: APIMessageTopLevelComponent; }; export const TicketMessageSchema = t.Object({ id: t.String(), messageId: t.Nullable(t.String()), ticketId: t.String(), actorId: t.Nullable(t.Number()), actorRole: t.String(), isPrivate: t.Boolean(), content: t.String(), embeds: t.Array(APIEmbedSchema), components: t.Array(APIMessageComponentSchema), createdAt: t.Date(), editedAt: t.Nullable(t.Date()), deletedAt: t.Nullable(t.Date()), actors: t.Object({ author: t.Nullable(ActorSchema), }), }); export type SanitisedTicketMessage = Static; export const TicketParticipantSchema = t.Object({ id: t.Number(), ticketId: t.String(), actorId: t.Number(), role: t.String(), reason: t.Nullable(t.String()), createdAt: t.Date(), actors: t.Object({ participant: ActorSchema, }), }); export type SanitisedTicketParticipant = Static; export const TicketCommentSchema = t.Object({ id: t.String(), ticketId: t.String(), actorId: t.Number(), content: t.String(), createdAt: t.Date(), updatedAt: t.Date(), actors: t.Object({ author: ActorSchema, }), }); export type SanitisedTicketComment = Static; export const TicketAttachmentSchema = t.Object({ id: t.String(), messageId: t.Nullable(t.String()), ticketId: t.String(), actorId: t.Nullable(t.Number()), fileName: t.String(), fileType: t.String(), fileSize: t.Number(), key: t.String(), actors: t.Object({ author: t.Nullable(ActorSchema), }), }); export type SanitisedTicketAttachment = Static; export const ErrorSchema = t.Object({ message: t.String(), }); export type ErrorResponse = Static; export const GuildAccessSchema = t.Object({ id: t.Number(), discordId: t.String(), name: t.String(), icon: t.Nullable(t.String()), actor: t.Object({ username: t.Nullable(t.String()), displayName: t.Nullable(t.String()), avatar: t.Nullable(t.String()), actorId: t.Number(), userId: t.Nullable(t.Number()), discordId: t.Nullable(t.String()), }), }); export type GuildAccess = Static; export const TicketsResponseSchema = t.Object({ tickets: t.Array(TicketSchema), count: t.Number(), }); export type TicketsResponse = Static;