73 lines
3.2 KiB
TypeScript
73 lines
3.2 KiB
TypeScript
import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';
|
|
import { sql } from 'drizzle-orm';
|
|
|
|
export const users = sqliteTable('users', {
|
|
id: text('id').primaryKey().$defaultFn(() => crypto.randomUUID()),
|
|
giteaId: text('gitea_id').notNull().unique(),
|
|
giteaUsername: text('gitea_username').notNull(),
|
|
giteaEmail: text('gitea_email'),
|
|
displayName: text('display_name'),
|
|
avatarUrl: text('avatar_url'),
|
|
role: text('role').default('admin'),
|
|
createdAt: integer('created_at', { mode: 'timestamp' }).default(sql`(unixepoch())`),
|
|
lastLogin: integer('last_login', { mode: 'timestamp' }),
|
|
});
|
|
|
|
// Events table
|
|
export const events = sqliteTable('events', {
|
|
id: text('id').primaryKey().$defaultFn(() => crypto.randomUUID()),
|
|
title: text('title').notNull(),
|
|
date: text('date').notNull(),
|
|
description: text('description').notNull(),
|
|
imageUrl: text('image_url').notNull(),
|
|
displayOrder: integer('display_order').notNull(),
|
|
isPublished: integer('is_published', { mode: 'boolean' }).default(true),
|
|
createdAt: integer('created_at', { mode: 'timestamp' }).default(sql`(unixepoch())`),
|
|
updatedAt: integer('updated_at', { mode: 'timestamp' }).default(sql`(unixepoch())`),
|
|
});
|
|
|
|
// Gallery images table
|
|
export const galleryImages = sqliteTable('gallery_images', {
|
|
id: text('id').primaryKey().$defaultFn(() => crypto.randomUUID()),
|
|
imageUrl: text('image_url').notNull(),
|
|
altText: text('alt_text').notNull(),
|
|
displayOrder: integer('display_order').notNull(),
|
|
isPublished: integer('is_published', { mode: 'boolean' }).default(true),
|
|
createdAt: integer('created_at', { mode: 'timestamp' }).default(sql`(unixepoch())`),
|
|
});
|
|
|
|
// Content sections table (for text-based sections)
|
|
export const contentSections = sqliteTable('content_sections', {
|
|
id: text('id').primaryKey().$defaultFn(() => crypto.randomUUID()),
|
|
sectionName: text('section_name').notNull().unique(),
|
|
contentJson: text('content_json', { mode: 'json' }).notNull(),
|
|
updatedAt: integer('updated_at', { mode: 'timestamp' }).default(sql`(unixepoch())`),
|
|
});
|
|
|
|
// Site settings table (global config)
|
|
export const siteSettings = sqliteTable('site_settings', {
|
|
key: text('key').primaryKey(),
|
|
value: text('value').notNull(),
|
|
updatedAt: integer('updated_at', { mode: 'timestamp' }).default(sql`(unixepoch())`),
|
|
});
|
|
|
|
// Publish history (audit log)
|
|
export const publishHistory = sqliteTable('publish_history', {
|
|
id: text('id').primaryKey().$defaultFn(() => crypto.randomUUID()),
|
|
userId: text('user_id').references(() => users.id),
|
|
commitHash: text('commit_hash'),
|
|
commitMessage: text('commit_message'),
|
|
publishedAt: integer('published_at', { mode: 'timestamp' }).default(sql`(unixepoch())`),
|
|
});
|
|
|
|
// Banner table (for announcements like holidays, special info)
|
|
export const banners = sqliteTable('banners', {
|
|
id: text('id').primaryKey().$defaultFn(() => crypto.randomUUID()),
|
|
text: text('text').notNull(),
|
|
startDate: text('start_date').notNull(), // ISO date string
|
|
endDate: text('end_date').notNull(), // ISO date string
|
|
isActive: integer('is_active', { mode: 'boolean' }).default(true),
|
|
createdAt: integer('created_at', { mode: 'timestamp' }).default(sql`(unixepoch())`),
|
|
updatedAt: integer('updated_at', { mode: 'timestamp' }).default(sql`(unixepoch())`),
|
|
});
|