mirror of
https://github.com/versia-pub/server.git
synced 2025-12-06 08:28:19 +01:00
292 lines
13 KiB
TypeScript
292 lines
13 KiB
TypeScript
import { pgTable, varchar, timestamp, text, integer, foreignKey, uuid, boolean, uniqueIndex, jsonb, index } from "drizzle-orm/pg-core"
|
|
import { sql } from "drizzle-orm"
|
|
|
|
|
|
|
|
export const prismaMigrations = pgTable("_prisma_migrations", {
|
|
id: varchar("id", { length: 36 }).primaryKey().notNull(),
|
|
checksum: varchar("checksum", { length: 64 }).notNull(),
|
|
finishedAt: timestamp("finished_at", { withTimezone: true, mode: 'string' }),
|
|
migrationName: varchar("migration_name", { length: 255 }).notNull(),
|
|
logs: text("logs"),
|
|
rolledBackAt: timestamp("rolled_back_at", { withTimezone: true, mode: 'string' }),
|
|
startedAt: timestamp("started_at", { withTimezone: true, mode: 'string' }).defaultNow().notNull(),
|
|
appliedStepsCount: integer("applied_steps_count").default(0).notNull(),
|
|
});
|
|
|
|
export const emoji = pgTable("Emoji", {
|
|
id: uuid("id").default(sql`uuid_generate_v7()`).primaryKey().notNull(),
|
|
shortcode: text("shortcode").notNull(),
|
|
url: text("url").notNull(),
|
|
visibleInPicker: boolean("visible_in_picker").notNull(),
|
|
instanceId: uuid("instanceId").references(() => instance.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
alt: text("alt"),
|
|
contentType: text("content_type").notNull(),
|
|
});
|
|
|
|
export const like = pgTable("Like", {
|
|
id: uuid("id").default(sql`uuid_generate_v7()`).primaryKey().notNull(),
|
|
likerId: uuid("likerId").notNull().references(() => user.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
likedId: uuid("likedId").notNull().references(() => status.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
createdAt: timestamp("createdAt", { precision: 3, mode: 'string' }).defaultNow().notNull(),
|
|
});
|
|
|
|
export const lysandObject = pgTable("LysandObject", {
|
|
id: uuid("id").default(sql`uuid_generate_v7()`).primaryKey().notNull(),
|
|
remoteId: text("remote_id").notNull(),
|
|
type: text("type").notNull(),
|
|
uri: text("uri").notNull(),
|
|
createdAt: timestamp("created_at", { precision: 3, mode: 'string' }).defaultNow().notNull(),
|
|
authorId: uuid("authorId"),
|
|
extraData: jsonb("extra_data").notNull(),
|
|
extensions: jsonb("extensions").notNull(),
|
|
},
|
|
(table) => {
|
|
return {
|
|
remoteIdKey: uniqueIndex("LysandObject_remote_id_key").on(table.remoteId),
|
|
uriKey: uniqueIndex("LysandObject_uri_key").on(table.uri),
|
|
lysandObjectAuthorIdFkey: foreignKey({
|
|
columns: [table.authorId],
|
|
foreignColumns: [table.id],
|
|
name: "LysandObject_authorId_fkey"
|
|
}).onUpdate("cascade").onDelete("cascade"),
|
|
}
|
|
});
|
|
|
|
export const relationship = pgTable("Relationship", {
|
|
id: uuid("id").default(sql`uuid_generate_v7()`).primaryKey().notNull(),
|
|
ownerId: uuid("ownerId").notNull().references(() => user.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
subjectId: uuid("subjectId").notNull().references(() => user.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
following: boolean("following").notNull(),
|
|
showingReblogs: boolean("showingReblogs").notNull(),
|
|
notifying: boolean("notifying").notNull(),
|
|
followedBy: boolean("followedBy").notNull(),
|
|
blocking: boolean("blocking").notNull(),
|
|
blockedBy: boolean("blockedBy").notNull(),
|
|
muting: boolean("muting").notNull(),
|
|
mutingNotifications: boolean("mutingNotifications").notNull(),
|
|
requested: boolean("requested").notNull(),
|
|
domainBlocking: boolean("domainBlocking").notNull(),
|
|
endorsed: boolean("endorsed").notNull(),
|
|
languages: text("languages").array(),
|
|
note: text("note").notNull(),
|
|
createdAt: timestamp("createdAt", { precision: 3, mode: 'string' }).defaultNow().notNull(),
|
|
updatedAt: timestamp("updatedAt", { precision: 3, mode: 'string' }).notNull(),
|
|
});
|
|
|
|
export const application = pgTable("Application", {
|
|
id: uuid("id").default(sql`uuid_generate_v7()`).primaryKey().notNull(),
|
|
name: text("name").notNull(),
|
|
website: text("website"),
|
|
vapidKey: text("vapid_key"),
|
|
clientId: text("client_id").notNull(),
|
|
secret: text("secret").notNull(),
|
|
scopes: text("scopes").notNull(),
|
|
redirectUris: text("redirect_uris").notNull(),
|
|
},
|
|
(table) => {
|
|
return {
|
|
clientIdKey: uniqueIndex("Application_client_id_key").on(table.clientId),
|
|
}
|
|
});
|
|
|
|
export const token = pgTable("Token", {
|
|
id: uuid("id").default(sql`uuid_generate_v7()`).primaryKey().notNull(),
|
|
tokenType: text("token_type").notNull(),
|
|
scope: text("scope").notNull(),
|
|
accessToken: text("access_token").notNull(),
|
|
code: text("code").notNull(),
|
|
createdAt: timestamp("created_at", { precision: 3, mode: 'string' }).defaultNow().notNull(),
|
|
userId: uuid("userId").references(() => user.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
applicationId: uuid("applicationId").references(() => application.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
});
|
|
|
|
export const emojiToUser = pgTable("_EmojiToUser", {
|
|
a: uuid("A").notNull().references(() => emoji.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
b: uuid("B").notNull().references(() => user.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
},
|
|
(table) => {
|
|
return {
|
|
abUnique: uniqueIndex("_EmojiToUser_AB_unique").on(table.a, table.b),
|
|
bIdx: index().on(table.b),
|
|
}
|
|
});
|
|
|
|
export const emojiToStatus = pgTable("_EmojiToStatus", {
|
|
a: uuid("A").notNull().references(() => emoji.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
b: uuid("B").notNull().references(() => status.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
},
|
|
(table) => {
|
|
return {
|
|
abUnique: uniqueIndex("_EmojiToStatus_AB_unique").on(table.a, table.b),
|
|
bIdx: index().on(table.b),
|
|
}
|
|
});
|
|
|
|
export const statusToUser = pgTable("_StatusToUser", {
|
|
a: uuid("A").notNull().references(() => status.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
b: uuid("B").notNull().references(() => user.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
},
|
|
(table) => {
|
|
return {
|
|
abUnique: uniqueIndex("_StatusToUser_AB_unique").on(table.a, table.b),
|
|
bIdx: index().on(table.b),
|
|
}
|
|
});
|
|
|
|
export const userPinnedNotes = pgTable("_UserPinnedNotes", {
|
|
a: uuid("A").notNull().references(() => status.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
b: uuid("B").notNull().references(() => user.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
},
|
|
(table) => {
|
|
return {
|
|
abUnique: uniqueIndex("_UserPinnedNotes_AB_unique").on(table.a, table.b),
|
|
bIdx: index().on(table.b),
|
|
}
|
|
});
|
|
|
|
export const attachment = pgTable("Attachment", {
|
|
id: uuid("id").default(sql`uuid_generate_v7()`).primaryKey().notNull(),
|
|
url: text("url").notNull(),
|
|
remoteUrl: text("remote_url"),
|
|
thumbnailUrl: text("thumbnail_url"),
|
|
mimeType: text("mime_type").notNull(),
|
|
description: text("description"),
|
|
blurhash: text("blurhash"),
|
|
sha256: text("sha256"),
|
|
fps: integer("fps"),
|
|
duration: integer("duration"),
|
|
width: integer("width"),
|
|
height: integer("height"),
|
|
size: integer("size"),
|
|
statusId: uuid("statusId").references(() => status.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
});
|
|
|
|
export const notification = pgTable("Notification", {
|
|
id: uuid("id").default(sql`uuid_generate_v7()`).primaryKey().notNull(),
|
|
type: text("type").notNull(),
|
|
createdAt: timestamp("createdAt", { precision: 3, mode: 'string' }).defaultNow().notNull(),
|
|
notifiedId: uuid("notifiedId").notNull().references(() => user.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
accountId: uuid("accountId").notNull().references(() => user.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
statusId: uuid("statusId").references(() => status.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
});
|
|
|
|
export const status = pgTable("Status", {
|
|
id: uuid("id").default(sql`uuid_generate_v7()`).primaryKey().notNull(),
|
|
uri: text("uri"),
|
|
authorId: uuid("authorId").notNull().references(() => user.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
createdAt: timestamp("createdAt", { precision: 3, mode: 'string' }).defaultNow().notNull(),
|
|
updatedAt: timestamp("updatedAt", { precision: 3, mode: 'string' }).notNull(),
|
|
reblogId: uuid("reblogId"),
|
|
content: text("content").default('').notNull(),
|
|
contentType: text("contentType").default('text/plain').notNull(),
|
|
visibility: text("visibility").notNull(),
|
|
inReplyToPostId: uuid("inReplyToPostId"),
|
|
quotingPostId: uuid("quotingPostId"),
|
|
instanceId: uuid("instanceId").references(() => instance.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
sensitive: boolean("sensitive").notNull(),
|
|
spoilerText: text("spoilerText").default('').notNull(),
|
|
applicationId: uuid("applicationId").references(() => application.id, { onDelete: "set null", onUpdate: "cascade" } ),
|
|
contentSource: text("contentSource").default('').notNull(),
|
|
},
|
|
(table) => {
|
|
return {
|
|
uriKey: uniqueIndex("Status_uri_key").on(table.uri),
|
|
statusReblogIdFkey: foreignKey({
|
|
columns: [table.reblogId],
|
|
foreignColumns: [table.id],
|
|
name: "Status_reblogId_fkey"
|
|
}).onUpdate("cascade").onDelete("cascade"),
|
|
statusInReplyToPostIdFkey: foreignKey({
|
|
columns: [table.inReplyToPostId],
|
|
foreignColumns: [table.id],
|
|
name: "Status_inReplyToPostId_fkey"
|
|
}).onUpdate("cascade").onDelete("set null"),
|
|
statusQuotingPostIdFkey: foreignKey({
|
|
columns: [table.quotingPostId],
|
|
foreignColumns: [table.id],
|
|
name: "Status_quotingPostId_fkey"
|
|
}).onUpdate("cascade").onDelete("set null"),
|
|
}
|
|
});
|
|
|
|
export const instance = pgTable("Instance", {
|
|
id: uuid("id").default(sql`uuid_generate_v7()`).primaryKey().notNull(),
|
|
baseUrl: text("base_url").notNull(),
|
|
name: text("name").notNull(),
|
|
version: text("version").notNull(),
|
|
logo: jsonb("logo").notNull(),
|
|
disableAutomoderation: boolean("disableAutomoderation").default(false).notNull(),
|
|
});
|
|
|
|
export const openIdAccount = pgTable("OpenIdAccount", {
|
|
id: uuid("id").default(sql`uuid_generate_v7()`).primaryKey().notNull(),
|
|
userId: uuid("userId").references(() => user.id, { onDelete: "set null", onUpdate: "cascade" } ),
|
|
serverId: text("serverId").notNull(),
|
|
issuerId: text("issuerId").notNull(),
|
|
});
|
|
|
|
export const user = pgTable("User", {
|
|
id: uuid("id").default(sql`uuid_generate_v7()`).primaryKey().notNull(),
|
|
uri: text("uri"),
|
|
username: text("username").notNull(),
|
|
displayName: text("displayName").notNull(),
|
|
password: text("password"),
|
|
email: text("email"),
|
|
note: text("note").default('').notNull(),
|
|
isAdmin: boolean("isAdmin").default(false).notNull(),
|
|
endpoints: jsonb("endpoints"),
|
|
source: jsonb("source").notNull(),
|
|
avatar: text("avatar").notNull(),
|
|
header: text("header").notNull(),
|
|
createdAt: timestamp("createdAt", { precision: 3, mode: 'string' }).defaultNow().notNull(),
|
|
updatedAt: timestamp("updatedAt", { precision: 3, mode: 'string' }).notNull(),
|
|
isBot: boolean("isBot").default(false).notNull(),
|
|
isLocked: boolean("isLocked").default(false).notNull(),
|
|
isDiscoverable: boolean("isDiscoverable").default(false).notNull(),
|
|
sanctions: text("sanctions").default('RRAY[').array(),
|
|
publicKey: text("publicKey").notNull(),
|
|
privateKey: text("privateKey"),
|
|
instanceId: uuid("instanceId").references(() => instance.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
disableAutomoderation: boolean("disableAutomoderation").default(false).notNull(),
|
|
},
|
|
(table) => {
|
|
return {
|
|
uriKey: uniqueIndex("User_uri_key").on(table.uri),
|
|
usernameKey: uniqueIndex("User_username_key").on(table.username),
|
|
emailKey: uniqueIndex("User_email_key").on(table.email),
|
|
}
|
|
});
|
|
|
|
export const openIdLoginFlow = pgTable("OpenIdLoginFlow", {
|
|
id: uuid("id").default(sql`uuid_generate_v7()`).primaryKey().notNull(),
|
|
codeVerifier: text("codeVerifier").notNull(),
|
|
applicationId: uuid("applicationId").references(() => application.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
issuerId: text("issuerId").notNull(),
|
|
});
|
|
|
|
export const flag = pgTable("Flag", {
|
|
id: uuid("id").default(sql`uuid_generate_v7()`).primaryKey().notNull(),
|
|
flagType: text("flagType").default('other').notNull(),
|
|
createdAt: timestamp("createdAt", { precision: 3, mode: 'string' }).defaultNow().notNull(),
|
|
flaggeStatusId: uuid("flaggeStatusId").references(() => status.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
flaggedUserId: uuid("flaggedUserId").references(() => user.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
});
|
|
|
|
export const modNote = pgTable("ModNote", {
|
|
id: uuid("id").default(sql`uuid_generate_v7()`).primaryKey().notNull(),
|
|
notedStatusId: uuid("notedStatusId").references(() => status.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
notedUserId: uuid("notedUserId").references(() => user.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
modId: uuid("modId").notNull().references(() => user.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
note: text("note").notNull(),
|
|
createdAt: timestamp("createdAt", { precision: 3, mode: 'string' }).defaultNow().notNull(),
|
|
});
|
|
|
|
export const modTag = pgTable("ModTag", {
|
|
id: uuid("id").default(sql`uuid_generate_v7()`).primaryKey().notNull(),
|
|
taggedStatusId: uuid("taggedStatusId").references(() => status.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
taggedUserId: uuid("taggedUserId").references(() => user.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
modId: uuid("modId").notNull().references(() => user.id, { onDelete: "cascade", onUpdate: "cascade" } ),
|
|
tag: text("tag").notNull(),
|
|
createdAt: timestamp("createdAt", { precision: 3, mode: 'string' }).defaultNow().notNull(),
|
|
}); |