diff --git a/api/src/db/schema.ts b/api/src/db/schema.ts index 297783b..90614c1 100644 --- a/api/src/db/schema.ts +++ b/api/src/db/schema.ts @@ -1,5 +1,7 @@ -import { integer, text, sqliteTable } from "drizzle-orm/sqlite-core"; +import { integer, text, sqliteTable, sqliteView } from "drizzle-orm/sqlite-core"; +import { eq, sql } from "drizzle-orm"; +// Tables export const attraction = sqliteTable('attraction', { id: integer().primaryKey({ autoIncrement: true }), name: text().notNull(), @@ -23,7 +25,7 @@ export const logbook = sqliteTable('logbook', { realWaittime: integer() }) -export const notificationMethod = sqliteTable('notification', { +export const notificationMethod = sqliteTable('notification_method', { id: integer().primaryKey({ autoIncrement: true }), webhookUrl: text().notNull(), shownName: text().notNull(), @@ -42,4 +44,24 @@ export const user = sqliteTable('user', { id: integer().primaryKey({ autoIncrement: true }), username: text().notNull(), isActive: integer({ mode: 'boolean' }).default(false) -}) \ No newline at end of file +}) + +// Views +export const subscribedThemeparks = sqliteView('subscribed_themeparks').as((qb) => + qb.selectDistinct({ + apiName: sql`themepark.api_name`.as('api_name') + }).from(attractionNotification) + .innerJoin(attraction, eq(attractionNotification.attractionId, attraction.id)) + .innerJoin(themepark, eq(attraction.themeparkId, themepark.id)) +); + +export const attractionSubscriptions = sqliteView('attraction_subscriptions').as((qb) => + qb.selectDistinct({ + attractionApiCode: sql`attraction.api_code`.as('attraction_api_code'), + themeparkApiName: sql`themepark.api_name`.as('themepark_api_name'), + webhookUrl: sql`notification_method.webhook_url`.as('webhook_url') + }).from(attractionNotification) + .innerJoin(attraction, eq(attractionNotification.attractionId, attraction.id)) + .innerJoin(themepark, eq(attraction.themeparkId, themepark.id)) + .innerJoin(notificationMethod, eq(attractionNotification.notificationMethodId, notificationMethod.id)) +); \ No newline at end of file diff --git a/api/src/types/attractionNotification.ts b/api/src/types/attraction-notification.ts similarity index 100% rename from api/src/types/attractionNotification.ts rename to api/src/types/attraction-notification.ts diff --git a/api/src/types/attraction-subscriptions.ts b/api/src/types/attraction-subscriptions.ts new file mode 100644 index 0000000..a5e6b70 --- /dev/null +++ b/api/src/types/attraction-subscriptions.ts @@ -0,0 +1,3 @@ +import { attractionSubscriptions } from '../db/schema'; + +export type AttractionSubscription = typeof attractionSubscriptions.$inferSelect; \ No newline at end of file diff --git a/api/src/types/notificationMethod.ts b/api/src/types/notification-method.ts similarity index 100% rename from api/src/types/notificationMethod.ts rename to api/src/types/notification-method.ts diff --git a/api/src/types/subscribed-themeparks.ts b/api/src/types/subscribed-themeparks.ts new file mode 100644 index 0000000..085c524 --- /dev/null +++ b/api/src/types/subscribed-themeparks.ts @@ -0,0 +1,3 @@ +import { subscribedThemeparks } from '../db/schema'; + +export type SubscribedThemeparks = typeof subscribedThemeparks.$inferSelect; \ No newline at end of file