chat.sad.ovh/src/lib/server/db/schema.ts

95 lines
3.1 KiB
TypeScript

import { boolean } from 'drizzle-orm/singlestore-core';
import { Status } from '../../index.ts';
import { sqliteTable, integer, text } from 'drizzle-orm/sqlite-core';
export const user = sqliteTable('user', {
id: text('id').primaryKey(),
username: text('username').notNull().unique(),
email: text('email').notNull().unique(),
passwordHash: text('password_hash').notNull(),
statusOverwrite: integer('status_overwrite').default(Status.ONLINE).notNull(),
friends: text('friends', { mode: 'json' }).default([]).notNull(),
servers: text('servers', { mode: 'json' }).default([]).notNull(), // string[] of ServerIDs
groups: text('groups', { mode: 'json' }).default([]).notNull() // string[] of GroupIDs
});
export const session = sqliteTable('session', {
id: text('id').primaryKey(),
userId: text('user_id')
.notNull()
.references(() => user.id),
expiresAt: integer('expires_at', { mode: 'timestamp' }).notNull()
});
export const server = sqliteTable('server', {
id: text('id').primaryKey(),
name: text('name').notNull(),
owner: text('owner')
.notNull()
.references(() => user.id),
members: text('members', { mode: 'json' }).default([]).notNull(),
channels: text('channels', { mode: 'json' }).default([]).notNull() // string[] of ChannelIDs
});
export const group = sqliteTable('group', {
id: text('id').primaryKey(),
name: text('name').notNull(),
owner: text('owner')
.notNull()
.references(() => user.id),
changeTitle: integer('change_title').default(1).notNull(),
addMembers: integer('add_members').default(1).notNull(),
removeMembers: integer('remove_members').default(0).notNull(),
members: text('members', { mode: 'json' }).default([]).notNull(),
messages: text('messages', { mode: 'json' }).default([]).notNull()
});
export const channel = sqliteTable('channel', {
id: text('id').primaryKey(),
name: text('name').notNull(),
serverId: text('server_id')
.notNull()
.references(() => server.id),
messages: text('messages', { mode: 'json' }).default([]).notNull()
});
export const directMessage = sqliteTable('directMessage', {
id: text('id').primaryKey(),
firstMember: text('first_member')
.notNull()
.references(() => user.id),
secondMember: text('second_member')
.notNull()
.references(() => user.id),
messages: text('messages', { mode: 'json' }).default([]).notNull()
});
export const friendRequest = sqliteTable('friendRequest', {
id: text('id').primaryKey(),
fromUser: text('from_user')
.notNull()
.references(() => user.id),
fromUsername: text('from_username')
.notNull()
.references(() => user.id),
toUsername: text('to_username')
.notNull()
.references(() => user.id),
toUser: text('to_user')
.notNull()
.references(() => user.id)
});
export const invite = sqliteTable('invite', {
id: text('id').primaryKey(),
serverId: text('server_id')
.notNull()
.references(() => server.id),
code: text('code').notNull()
});
export type Session = typeof session.$inferSelect;
export type User = typeof user.$inferSelect;
export type Group = typeof group.$inferSelect;
export type Server = typeof server.$inferSelect;