Files
portabase/src/db/schema/09_notification-channel.ts
T

50 lines
2.0 KiB
TypeScript

import {boolean, jsonb, pgEnum, pgTable, primaryKey, unique, uuid, varchar} from "drizzle-orm/pg-core";
import {timestamps} from "@/db/schema/00_common";
import {organization} from "@/db/schema/03_organization";
import {relations} from "drizzle-orm";
import {createSelectSchema} from "drizzle-zod";
import {z} from "zod";
export const providerKindEnum = pgEnum('provider_kind', ['curl', 'slack', 'smtp', 'webhook']);
export const notificationChannel = pgTable('notification_channel', {
id: uuid("id").defaultRandom().primaryKey(),
provider: providerKindEnum('provider').notNull(),
name: varchar('name', {length: 255}).notNull(),
config: jsonb('config').notNull(),
enabled: boolean('enabled').default(false).notNull(),
...timestamps
});
export const organizationNotificationChannel = pgTable(
"organization_notification_channels",
{
organizationId: uuid('organization_id')
.notNull()
.references(() => organization.id, {onDelete: 'cascade'}),
notificationChannelId: uuid('notification_channel_id')
.notNull()
.references(() => notificationChannel.id, {onDelete: 'cascade'}),
},
(t) => [unique().on(t.organizationId, t.notificationChannelId)]
);
export const notificationChannelRelations = relations(notificationChannel, ({many}) => ({
organizations: many(organizationNotificationChannel),
}));
export const organizationNotificationChannelRelations = relations(organizationNotificationChannel, ({one}) => ({
organization: one(organization, {
fields: [organizationNotificationChannel.organizationId],
references: [organization.id],
}),
notificationChannel: one(notificationChannel, {
fields: [organizationNotificationChannel.notificationChannelId],
references: [notificationChannel.id],
}),
}));
export const notificationChannelSchema = createSelectSchema(notificationChannel);
export type NotificationChannel = z.infer<typeof notificationChannelSchema>;