import { pgEnum, pgTable } from 'drizzle-orm/pg-core' import { relations } from 'drizzle-orm' export const users = pgTable('users', (t) => ({ id: t.bigint({mode: 'number'}).primaryKey(), firstName: t.text().notNull(), lastName: t.text().notNull(), username: t.text(), languageCode: t.text().notNull(), allowsWriteToPm: t.boolean().notNull(), photoUrl: t.text(), createdAt: t.timestamp({ withTimezone: true }).defaultNow(), updatedAt: t.timestamp({ withTimezone: true }).defaultNow().$onUpdateFn(() => new Date()) })) export const organizations = pgTable('organizations', (t) => ({ id: t.integer().primaryKey().generatedAlwaysAsIdentity(), title: t.text().notNull(), imageUrl: t.text(), description: t.text(), organizationTypeId: t.integer().notNull(), createdAt: t.timestamp({ withTimezone: true }).defaultNow(), updatedAt: t.timestamp({ withTimezone: true }).defaultNow().$onUpdateFn(() => new Date()) })) export const organizationTypes = pgTable('organization_types', (t) => ({ id: t.integer().primaryKey().generatedAlwaysAsIdentity(), title: t.text().notNull(), createdAt: t.timestamp({ withTimezone: true }).defaultNow(), updatedAt: t.timestamp({ withTimezone: true }).defaultNow().$onUpdateFn(() => new Date()) })) export const formatEnum = pgEnum('format', ['online', 'offline']) export const events = pgTable('events', (t) => ({ id: t.integer().primaryKey().generatedAlwaysAsIdentity(), title: t.text().notNull(), description: t.text().notNull(), imageUrl: t.text(), userId: t.integer().notNull().references(() => users.id), organizationId: t.integer().notNull().references(() => organizations.id), location: t.text().notNull(), startTime: t.timestamp({ withTimezone: true }).notNull(), endTime: t.timestamp({ withTimezone: true }).notNull(), format: formatEnum().default('offline'), createdAt: t.timestamp({ withTimezone: true }).defaultNow(), updatedAt: t.timestamp({ withTimezone: true }).defaultNow().$onUpdateFn(() => new Date()) })) export const tags = pgTable('tags', (t) => ({ id: t.integer().primaryKey().generatedAlwaysAsIdentity(), name: t.text().notNull().unique(), createdAt: t.timestamp({ withTimezone: true }).defaultNow(), updatedAt: t.timestamp({ withTimezone: true }).defaultNow().$onUpdateFn(() => new Date()) })) export const eventTags = pgTable('event_tags', (t) => ({ eventId: t.integer().notNull().references(() => events.id), tagId: t.integer().notNull().references(() => tags.id) })) export const roles = pgTable('roles', (t) => ({ id: t.integer().primaryKey().generatedAlwaysAsIdentity(), name: t.text().notNull().unique(), createdAt: t.timestamp({ withTimezone: true }).defaultNow(), updatedAt: t.timestamp({ withTimezone: true }).defaultNow().$onUpdateFn(() => new Date()) })) export const userRoles = pgTable('user_roles', (t) => ({ id: t.integer().primaryKey().generatedAlwaysAsIdentity(), userId: t.integer().notNull().references(() => users.id), organizationId: t.integer().notNull().references(() => organizations.id), roleId: t.integer().notNull().references(() => roles.id) })) export const usersRelations = relations(users, ({ many }) => ({ roles: many(userRoles) })) export const organizationsRelations = relations(organizations, ({ many, one }) => ({ roles: many(userRoles), organizationType: one(organizationTypes, { fields: [organizations.organizationTypeId], references: [organizationTypes.id] }) })) export const rolesRelations = relations(roles, ({ many }) => ({ userRoles: many(userRoles) })) export const userRolesRelations = relations(userRoles, ({ one }) => ({ user: one(users, { fields: [userRoles.userId], references: [users.id] }), organization: one(organizations, { fields: [userRoles.organizationId], references: [organizations.id] }), role: one(roles, { fields: [userRoles.roleId], references: [roles.id] }) })) export const eventsRelations = relations(events, ({ many, one }) => ({ user: one(users, { fields: [events.userId], references: [users.id] }), organization: one(organizations, { fields: [events.organizationId], references: [organizations.id] }), tags: many(eventTags) })) export const tagsRelations = relations(tags, ({ many }) => ({ events: many(eventTags) })) export const eventTagsRelations = relations(eventTags, ({ one }) => ({ event: one(events, { fields: [eventTags.eventId], references: [events.id] }), tag: one(tags, { fields: [eventTags.tagId], references: [tags.id] }) }))