diff --git a/drizzle/relations.ts b/drizzle/relations.ts index d0cd1c6c..07370757 100644 --- a/drizzle/relations.ts +++ b/drizzle/relations.ts @@ -1,22 +1,26 @@ import { relations } from "drizzle-orm/relations"; -import { identities, bsky_profiles, publications, documents, comments_on_documents, entities, facts, entity_sets, permission_tokens, email_subscriptions_to_entity, email_auth_tokens, custom_domains, phone_rsvps_to_entity, custom_domain_routes, poll_votes_on_entity, bsky_follows, subscribers_to_publications, document_mentions_in_bsky, bsky_posts, permission_token_on_homepage, documents_in_publications, publication_domains, publication_subscriptions, leaflets_in_publications, permission_token_rights } from "./schema"; +import { identities, publications, documents, comments_on_documents, bsky_profiles, entity_sets, entities, facts, email_auth_tokens, poll_votes_on_entity, permission_tokens, phone_rsvps_to_entity, custom_domains, custom_domain_routes, email_subscriptions_to_entity, bsky_follows, subscribers_to_publications, permission_token_on_homepage, documents_in_publications, document_mentions_in_bsky, bsky_posts, publication_domains, leaflets_in_publications, publication_subscriptions, permission_token_rights } from "./schema"; -export const bsky_profilesRelations = relations(bsky_profiles, ({one, many}) => ({ +export const publicationsRelations = relations(publications, ({one, many}) => ({ identity: one(identities, { - fields: [bsky_profiles.did], + fields: [publications.identity_did], references: [identities.atp_did] }), - comments_on_documents: many(comments_on_documents), + subscribers_to_publications: many(subscribers_to_publications), + documents_in_publications: many(documents_in_publications), + publication_domains: many(publication_domains), + leaflets_in_publications: many(leaflets_in_publications), + publication_subscriptions: many(publication_subscriptions), })); export const identitiesRelations = relations(identities, ({one, many}) => ({ - bsky_profiles: many(bsky_profiles), publications: many(publications), + email_auth_tokens: many(email_auth_tokens), + bsky_profiles: many(bsky_profiles), permission_token: one(permission_tokens, { fields: [identities.home_page], references: [permission_tokens.id] }), - email_auth_tokens: many(email_auth_tokens), custom_domains_identity: many(custom_domains, { relationName: "custom_domains_identity_identities_email" }), @@ -35,18 +39,6 @@ export const identitiesRelations = relations(identities, ({one, many}) => ({ publication_subscriptions: many(publication_subscriptions), })); -export const publicationsRelations = relations(publications, ({one, many}) => ({ - identity: one(identities, { - fields: [publications.identity_did], - references: [identities.atp_did] - }), - subscribers_to_publications: many(subscribers_to_publications), - documents_in_publications: many(documents_in_publications), - publication_domains: many(publication_domains), - publication_subscriptions: many(publication_subscriptions), - leaflets_in_publications: many(leaflets_in_publications), -})); - export const comments_on_documentsRelations = relations(comments_on_documents, ({one}) => ({ document: one(documents, { fields: [comments_on_documents.document], @@ -60,33 +52,34 @@ export const comments_on_documentsRelations = relations(comments_on_documents, ( export const documentsRelations = relations(documents, ({many}) => ({ comments_on_documents: many(comments_on_documents), - document_mentions_in_bskies: many(document_mentions_in_bsky), documents_in_publications: many(documents_in_publications), + document_mentions_in_bskies: many(document_mentions_in_bsky), leaflets_in_publications: many(leaflets_in_publications), })); -export const factsRelations = relations(facts, ({one}) => ({ - entity: one(entities, { - fields: [facts.entity], - references: [entities.id] +export const bsky_profilesRelations = relations(bsky_profiles, ({one, many}) => ({ + comments_on_documents: many(comments_on_documents), + identity: one(identities, { + fields: [bsky_profiles.did], + references: [identities.atp_did] }), })); export const entitiesRelations = relations(entities, ({one, many}) => ({ - facts: many(facts), entity_set: one(entity_sets, { fields: [entities.set], references: [entity_sets.id] }), - permission_tokens: many(permission_tokens), - email_subscriptions_to_entities: many(email_subscriptions_to_entity), - phone_rsvps_to_entities: many(phone_rsvps_to_entity), + facts: many(facts), poll_votes_on_entities_option_entity: many(poll_votes_on_entity, { relationName: "poll_votes_on_entity_option_entity_entities_id" }), poll_votes_on_entities_poll_entity: many(poll_votes_on_entity, { relationName: "poll_votes_on_entity_poll_entity_entities_id" }), + permission_tokens: many(permission_tokens), + phone_rsvps_to_entities: many(phone_rsvps_to_entity), + email_subscriptions_to_entities: many(email_subscriptions_to_entity), })); export const entity_setsRelations = relations(entity_sets, ({many}) => ({ @@ -94,57 +87,51 @@ export const entity_setsRelations = relations(entity_sets, ({many}) => ({ permission_token_rights: many(permission_token_rights), })); +export const factsRelations = relations(facts, ({one}) => ({ + entity: one(entities, { + fields: [facts.entity], + references: [entities.id] + }), +})); + +export const email_auth_tokensRelations = relations(email_auth_tokens, ({one}) => ({ + identity: one(identities, { + fields: [email_auth_tokens.identity], + references: [identities.id] + }), +})); + +export const poll_votes_on_entityRelations = relations(poll_votes_on_entity, ({one}) => ({ + entity_option_entity: one(entities, { + fields: [poll_votes_on_entity.option_entity], + references: [entities.id], + relationName: "poll_votes_on_entity_option_entity_entities_id" + }), + entity_poll_entity: one(entities, { + fields: [poll_votes_on_entity.poll_entity], + references: [entities.id], + relationName: "poll_votes_on_entity_poll_entity_entities_id" + }), +})); + export const permission_tokensRelations = relations(permission_tokens, ({one, many}) => ({ entity: one(entities, { fields: [permission_tokens.root_entity], references: [entities.id] }), identities: many(identities), - email_subscriptions_to_entities: many(email_subscriptions_to_entity), custom_domain_routes_edit_permission_token: many(custom_domain_routes, { relationName: "custom_domain_routes_edit_permission_token_permission_tokens_id" }), custom_domain_routes_view_permission_token: many(custom_domain_routes, { relationName: "custom_domain_routes_view_permission_token_permission_tokens_id" }), + email_subscriptions_to_entities: many(email_subscriptions_to_entity), permission_token_on_homepages: many(permission_token_on_homepage), leaflets_in_publications: many(leaflets_in_publications), permission_token_rights: many(permission_token_rights), })); -export const email_subscriptions_to_entityRelations = relations(email_subscriptions_to_entity, ({one}) => ({ - entity: one(entities, { - fields: [email_subscriptions_to_entity.entity], - references: [entities.id] - }), - permission_token: one(permission_tokens, { - fields: [email_subscriptions_to_entity.token], - references: [permission_tokens.id] - }), -})); - -export const email_auth_tokensRelations = relations(email_auth_tokens, ({one}) => ({ - identity: one(identities, { - fields: [email_auth_tokens.identity], - references: [identities.id] - }), -})); - -export const custom_domainsRelations = relations(custom_domains, ({one, many}) => ({ - identity_identity: one(identities, { - fields: [custom_domains.identity], - references: [identities.email], - relationName: "custom_domains_identity_identities_email" - }), - identity_identity_id: one(identities, { - fields: [custom_domains.identity_id], - references: [identities.id], - relationName: "custom_domains_identity_id_identities_id" - }), - custom_domain_routes: many(custom_domain_routes), - publication_domains: many(publication_domains), -})); - export const phone_rsvps_to_entityRelations = relations(phone_rsvps_to_entity, ({one}) => ({ entity: one(entities, { fields: [phone_rsvps_to_entity.entity], @@ -169,16 +156,29 @@ export const custom_domain_routesRelations = relations(custom_domain_routes, ({o }), })); -export const poll_votes_on_entityRelations = relations(poll_votes_on_entity, ({one}) => ({ - entity_option_entity: one(entities, { - fields: [poll_votes_on_entity.option_entity], - references: [entities.id], - relationName: "poll_votes_on_entity_option_entity_entities_id" +export const custom_domainsRelations = relations(custom_domains, ({one, many}) => ({ + custom_domain_routes: many(custom_domain_routes), + identity_identity: one(identities, { + fields: [custom_domains.identity], + references: [identities.email], + relationName: "custom_domains_identity_identities_email" }), - entity_poll_entity: one(entities, { - fields: [poll_votes_on_entity.poll_entity], - references: [entities.id], - relationName: "poll_votes_on_entity_poll_entity_entities_id" + identity_identity_id: one(identities, { + fields: [custom_domains.identity_id], + references: [identities.id], + relationName: "custom_domains_identity_id_identities_id" + }), + publication_domains: many(publication_domains), +})); + +export const email_subscriptions_to_entityRelations = relations(email_subscriptions_to_entity, ({one}) => ({ + entity: one(entities, { + fields: [email_subscriptions_to_entity.entity], + references: [entities.id] + }), + permission_token: one(permission_tokens, { + fields: [email_subscriptions_to_entity.token], + references: [permission_tokens.id] }), })); @@ -206,21 +206,6 @@ export const subscribers_to_publicationsRelations = relations(subscribers_to_pub }), })); -export const document_mentions_in_bskyRelations = relations(document_mentions_in_bsky, ({one}) => ({ - document: one(documents, { - fields: [document_mentions_in_bsky.document], - references: [documents.uri] - }), - bsky_post: one(bsky_posts, { - fields: [document_mentions_in_bsky.uri], - references: [bsky_posts.uri] - }), -})); - -export const bsky_postsRelations = relations(bsky_posts, ({many}) => ({ - document_mentions_in_bskies: many(document_mentions_in_bsky), -})); - export const permission_token_on_homepageRelations = relations(permission_token_on_homepage, ({one}) => ({ identity: one(identities, { fields: [permission_token_on_homepage.identity], @@ -243,6 +228,21 @@ export const documents_in_publicationsRelations = relations(documents_in_publica }), })); +export const document_mentions_in_bskyRelations = relations(document_mentions_in_bsky, ({one}) => ({ + document: one(documents, { + fields: [document_mentions_in_bsky.document], + references: [documents.uri] + }), + bsky_post: one(bsky_posts, { + fields: [document_mentions_in_bsky.uri], + references: [bsky_posts.uri] + }), +})); + +export const bsky_postsRelations = relations(bsky_posts, ({many}) => ({ + document_mentions_in_bskies: many(document_mentions_in_bsky), +})); + export const publication_domainsRelations = relations(publication_domains, ({one}) => ({ custom_domain: one(custom_domains, { fields: [publication_domains.domain], @@ -258,17 +258,6 @@ export const publication_domainsRelations = relations(publication_domains, ({one }), })); -export const publication_subscriptionsRelations = relations(publication_subscriptions, ({one}) => ({ - identity: one(identities, { - fields: [publication_subscriptions.identity], - references: [identities.atp_did] - }), - publication: one(publications, { - fields: [publication_subscriptions.publication], - references: [publications.uri] - }), -})); - export const leaflets_in_publicationsRelations = relations(leaflets_in_publications, ({one}) => ({ document: one(documents, { fields: [leaflets_in_publications.doc], @@ -284,6 +273,17 @@ export const leaflets_in_publicationsRelations = relations(leaflets_in_publicati }), })); +export const publication_subscriptionsRelations = relations(publication_subscriptions, ({one}) => ({ + identity: one(identities, { + fields: [publication_subscriptions.identity], + references: [identities.atp_did] + }), + publication: one(publications, { + fields: [publication_subscriptions.publication], + references: [publications.uri] + }), +})); + export const permission_token_rightsRelations = relations(permission_token_rights, ({one}) => ({ entity_set: one(entity_sets, { fields: [permission_token_rights.entity_set], diff --git a/drizzle/schema.ts b/drizzle/schema.ts index 7bb2bd1f..2eeb931b 100644 --- a/drizzle/schema.ts +++ b/drizzle/schema.ts @@ -1,17 +1,21 @@ -import { pgTable, pgEnum, text, jsonb, foreignKey, timestamp, uuid, bigint, boolean, unique, uniqueIndex, smallint, primaryKey } from "drizzle-orm/pg-core" +import { pgTable, pgEnum, text, jsonb, index, foreignKey, timestamp, uuid, bigint, boolean, unique, uniqueIndex, smallint, primaryKey } from "drizzle-orm/pg-core" import { sql } from "drizzle-orm" export const aal_level = pgEnum("aal_level", ['aal1', 'aal2', 'aal3']) export const code_challenge_method = pgEnum("code_challenge_method", ['s256', 'plain']) export const factor_status = pgEnum("factor_status", ['unverified', 'verified']) -export const factor_type = pgEnum("factor_type", ['totp', 'webauthn']) +export const factor_type = pgEnum("factor_type", ['totp', 'webauthn', 'phone']) +export const oauth_authorization_status = pgEnum("oauth_authorization_status", ['pending', 'approved', 'denied', 'expired']) +export const oauth_client_type = pgEnum("oauth_client_type", ['public', 'confidential']) +export const oauth_registration_type = pgEnum("oauth_registration_type", ['dynamic', 'manual']) +export const oauth_response_type = pgEnum("oauth_response_type", ['code']) export const one_time_token_type = pgEnum("one_time_token_type", ['confirmation_token', 'reauthentication_token', 'recovery_token', 'email_change_token_new', 'email_change_token_current', 'phone_change_token']) -export const request_status = pgEnum("request_status", ['PENDING', 'SUCCESS', 'ERROR']) export const key_status = pgEnum("key_status", ['default', 'valid', 'invalid', 'expired']) export const key_type = pgEnum("key_type", ['aead-ietf', 'aead-det', 'hmacsha512', 'hmacsha256', 'auth', 'shorthash', 'generichash', 'kdf', 'secretbox', 'secretstream', 'stream_xchacha20']) export const rsvp_status = pgEnum("rsvp_status", ['GOING', 'NOT_GOING', 'MAYBE']) export const action = pgEnum("action", ['INSERT', 'UPDATE', 'DELETE', 'TRUNCATE', 'ERROR']) export const equality_op = pgEnum("equality_op", ['eq', 'neq', 'lt', 'lte', 'gt', 'gte', 'in']) +export const buckettype = pgEnum("buckettype", ['STANDARD', 'ANALYTICS']) export const oauth_state_store = pgTable("oauth_state_store", { @@ -19,31 +23,17 @@ export const oauth_state_store = pgTable("oauth_state_store", { state: jsonb("state").notNull(), }); -export const oauth_session_store = pgTable("oauth_session_store", { - key: text("key").primaryKey().notNull(), - session: jsonb("session").notNull(), -}); - -export const bsky_profiles = pgTable("bsky_profiles", { - did: text("did").primaryKey().notNull().references(() => identities.atp_did, { onDelete: "cascade" } ), - record: jsonb("record").notNull(), - indexed_at: timestamp("indexed_at", { withTimezone: true, mode: 'string' }).defaultNow().notNull(), - handle: text("handle"), -}); - export const publications = pgTable("publications", { uri: text("uri").primaryKey().notNull(), indexed_at: timestamp("indexed_at", { withTimezone: true, mode: 'string' }).defaultNow().notNull(), name: text("name").notNull(), identity_did: text("identity_did").notNull().references(() => identities.atp_did, { onDelete: "cascade" } ), record: jsonb("record"), -}); - -export const bsky_posts = pgTable("bsky_posts", { - uri: text("uri").primaryKey().notNull(), - indexed_at: timestamp("indexed_at", { withTimezone: true, mode: 'string' }).defaultNow().notNull(), - post_view: jsonb("post_view").notNull(), - cid: text("cid").notNull(), +}, +(table) => { + return { + identity_did_idx: index("publications_identity_did_idx").on(table.identity_did), + } }); export const comments_on_documents = pgTable("comments_on_documents", { @@ -54,6 +44,17 @@ export const comments_on_documents = pgTable("comments_on_documents", { profile: text("profile").references(() => bsky_profiles.did, { onDelete: "set null", onUpdate: "cascade" } ), }); +export const entities = pgTable("entities", { + id: uuid("id").primaryKey().notNull(), + created_at: timestamp("created_at", { withTimezone: true, mode: 'string' }).defaultNow().notNull(), + set: uuid("set").notNull().references(() => entity_sets.id, { onDelete: "cascade", onUpdate: "cascade" } ), +}, +(table) => { + return { + set_idx: index("entities_set_idx").on(table.set), + } +}); + export const facts = pgTable("facts", { id: uuid("id").primaryKey().notNull(), entity: uuid("entity").notNull().references(() => entities.id, { onDelete: "cascade", onUpdate: "restrict" } ), @@ -63,12 +64,11 @@ export const facts = pgTable("facts", { updated_at: timestamp("updated_at", { mode: 'string' }), // You can use { mode: "bigint" } if numbers are exceeding js number limitations version: bigint("version", { mode: "number" }).default(0).notNull(), -}); - -export const documents = pgTable("documents", { - uri: text("uri").primaryKey().notNull(), - data: jsonb("data").notNull(), - indexed_at: timestamp("indexed_at", { withTimezone: true, mode: 'string' }).defaultNow().notNull(), +}, +(table) => { + return { + entity_idx: index("facts_entity_idx").on(table.entity), + } }); export const replicache_clients = pgTable("replicache_clients", { @@ -76,12 +76,34 @@ export const replicache_clients = pgTable("replicache_clients", { client_group: text("client_group").notNull(), // You can use { mode: "bigint" } if numbers are exceeding js number limitations last_mutation: bigint("last_mutation", { mode: "number" }).notNull(), +}, +(table) => { + return { + client_group_idx: index("replicache_clients_client_group_idx").on(table.client_group), + } }); -export const entities = pgTable("entities", { - id: uuid("id").primaryKey().notNull(), +export const email_auth_tokens = pgTable("email_auth_tokens", { + id: uuid("id").defaultRandom().primaryKey().notNull(), created_at: timestamp("created_at", { withTimezone: true, mode: 'string' }).defaultNow().notNull(), - set: uuid("set").notNull().references(() => entity_sets.id, { onDelete: "cascade", onUpdate: "cascade" } ), + confirmed: boolean("confirmed").default(false).notNull(), + email: text("email"), + confirmation_code: text("confirmation_code").notNull(), + identity: uuid("identity").references(() => identities.id, { onDelete: "cascade", onUpdate: "cascade" } ), +}); + +export const bsky_posts = pgTable("bsky_posts", { + uri: text("uri").primaryKey().notNull(), + indexed_at: timestamp("indexed_at", { withTimezone: true, mode: 'string' }).defaultNow().notNull(), + post_view: jsonb("post_view").notNull(), + cid: text("cid").notNull(), +}); + +export const bsky_profiles = pgTable("bsky_profiles", { + did: text("did").primaryKey().notNull().references(() => identities.atp_did, { onDelete: "cascade" } ), + record: jsonb("record").notNull(), + indexed_at: timestamp("indexed_at", { withTimezone: true, mode: 'string' }).defaultNow().notNull(), + handle: text("handle"), }); export const entity_sets = pgTable("entity_sets", { @@ -89,6 +111,14 @@ export const entity_sets = pgTable("entity_sets", { created_at: timestamp("created_at", { withTimezone: true, mode: 'string' }).defaultNow().notNull(), }); +export const poll_votes_on_entity = pgTable("poll_votes_on_entity", { + id: uuid("id").defaultRandom().primaryKey().notNull(), + created_at: timestamp("created_at", { withTimezone: true, mode: 'string' }).defaultNow().notNull(), + poll_entity: uuid("poll_entity").notNull().references(() => entities.id, { onDelete: "cascade", onUpdate: "cascade" } ), + option_entity: uuid("option_entity").notNull().references(() => entities.id, { onDelete: "cascade", onUpdate: "cascade" } ), + voter_token: uuid("voter_token").notNull(), +}); + export const permission_tokens = pgTable("permission_tokens", { id: uuid("id").defaultRandom().primaryKey().notNull(), root_entity: uuid("root_entity").notNull().references(() => entities.id, { onDelete: "cascade", onUpdate: "cascade" } ), @@ -110,25 +140,6 @@ export const identities = pgTable("identities", { } }); -export const email_subscriptions_to_entity = pgTable("email_subscriptions_to_entity", { - id: uuid("id").defaultRandom().primaryKey().notNull(), - entity: uuid("entity").notNull().references(() => entities.id, { onDelete: "cascade" } ), - email: text("email").notNull(), - created_at: timestamp("created_at", { withTimezone: true, mode: 'string' }).defaultNow().notNull(), - token: uuid("token").notNull().references(() => permission_tokens.id, { onDelete: "cascade" } ), - confirmed: boolean("confirmed").default(false).notNull(), - confirmation_code: text("confirmation_code").notNull(), -}); - -export const email_auth_tokens = pgTable("email_auth_tokens", { - id: uuid("id").defaultRandom().primaryKey().notNull(), - created_at: timestamp("created_at", { withTimezone: true, mode: 'string' }).defaultNow().notNull(), - confirmed: boolean("confirmed").default(false).notNull(), - email: text("email"), - confirmation_code: text("confirmation_code").notNull(), - identity: uuid("identity").references(() => identities.id, { onDelete: "cascade", onUpdate: "cascade" } ), -}); - export const phone_number_auth_tokens = pgTable("phone_number_auth_tokens", { id: uuid("id").defaultRandom().primaryKey().notNull(), created_at: timestamp("created_at", { withTimezone: true, mode: 'string' }).defaultNow().notNull(), @@ -138,14 +149,6 @@ export const phone_number_auth_tokens = pgTable("phone_number_auth_tokens", { country_code: text("country_code").notNull(), }); -export const custom_domains = pgTable("custom_domains", { - domain: text("domain").primaryKey().notNull(), - identity: text("identity").default('').references(() => identities.email, { onDelete: "cascade", onUpdate: "cascade" } ), - confirmed: boolean("confirmed").notNull(), - created_at: timestamp("created_at", { withTimezone: true, mode: 'string' }).defaultNow().notNull(), - identity_id: uuid("identity_id").references(() => identities.id, { onDelete: "cascade" } ), -}); - export const phone_rsvps_to_entity = pgTable("phone_rsvps_to_entity", { created_at: timestamp("created_at", { withTimezone: true, mode: 'string' }).defaultNow().notNull(), phone_number: text("phone_number").notNull(), @@ -172,20 +175,42 @@ export const custom_domain_routes = pgTable("custom_domain_routes", { }, (table) => { return { + edit_permission_token_idx: index("custom_domain_routes_edit_permission_token_idx").on(table.edit_permission_token), custom_domain_routes_domain_route_key: unique("custom_domain_routes_domain_route_key").on(table.domain, table.route), } }); -export const poll_votes_on_entity = pgTable("poll_votes_on_entity", { +export const custom_domains = pgTable("custom_domains", { + domain: text("domain").primaryKey().notNull(), + identity: text("identity").default('').references(() => identities.email, { onDelete: "cascade", onUpdate: "cascade" } ), + confirmed: boolean("confirmed").notNull(), + created_at: timestamp("created_at", { withTimezone: true, mode: 'string' }).defaultNow().notNull(), + identity_id: uuid("identity_id").references(() => identities.id, { onDelete: "cascade" } ), +}); + +export const email_subscriptions_to_entity = pgTable("email_subscriptions_to_entity", { id: uuid("id").defaultRandom().primaryKey().notNull(), + entity: uuid("entity").notNull().references(() => entities.id, { onDelete: "cascade" } ), + email: text("email").notNull(), created_at: timestamp("created_at", { withTimezone: true, mode: 'string' }).defaultNow().notNull(), - poll_entity: uuid("poll_entity").notNull().references(() => entities.id, { onDelete: "cascade", onUpdate: "cascade" } ), - option_entity: uuid("option_entity").notNull().references(() => entities.id, { onDelete: "cascade", onUpdate: "cascade" } ), - voter_token: uuid("voter_token").notNull(), + token: uuid("token").notNull().references(() => permission_tokens.id, { onDelete: "cascade" } ), + confirmed: boolean("confirmed").default(false).notNull(), + confirmation_code: text("confirmation_code").notNull(), +}); + +export const documents = pgTable("documents", { + uri: text("uri").primaryKey().notNull(), + data: jsonb("data").notNull(), + indexed_at: timestamp("indexed_at", { withTimezone: true, mode: 'string' }).defaultNow().notNull(), +}); + +export const oauth_session_store = pgTable("oauth_session_store", { + key: text("key").primaryKey().notNull(), + session: jsonb("session").notNull(), }); export const bsky_follows = pgTable("bsky_follows", { - identity: text("identity").default('').notNull().references(() => identities.atp_did, { onDelete: "cascade" } ), + identity: text("identity").notNull().references(() => identities.atp_did, { onDelete: "cascade" } ), follows: text("follows").notNull().references(() => identities.atp_did, { onDelete: "cascade" } ), }, (table) => { @@ -205,17 +230,6 @@ export const subscribers_to_publications = pgTable("subscribers_to_publications" } }); -export const document_mentions_in_bsky = pgTable("document_mentions_in_bsky", { - uri: text("uri").notNull().references(() => bsky_posts.uri, { onDelete: "cascade" } ), - link: text("link").notNull(), - document: text("document").notNull().references(() => documents.uri, { onDelete: "cascade" } ), -}, -(table) => { - return { - document_mentions_in_bsky_pkey: primaryKey({ columns: [table.uri, table.document], name: "document_mentions_in_bsky_pkey"}), - } -}); - export const permission_token_on_homepage = pgTable("permission_token_on_homepage", { token: uuid("token").notNull().references(() => permission_tokens.id, { onDelete: "cascade" } ), identity: uuid("identity").notNull().references(() => identities.id, { onDelete: "cascade" } ), @@ -234,33 +248,33 @@ export const documents_in_publications = pgTable("documents_in_publications", { }, (table) => { return { + publication_idx: index("documents_in_publications_publication_idx").on(table.publication), documents_in_publications_pkey: primaryKey({ columns: [table.publication, table.document], name: "documents_in_publications_pkey"}), } }); -export const publication_domains = pgTable("publication_domains", { - publication: text("publication").notNull().references(() => publications.uri, { onDelete: "cascade" } ), - domain: text("domain").notNull().references(() => custom_domains.domain, { onDelete: "cascade" } ), - created_at: timestamp("created_at", { withTimezone: true, mode: 'string' }).defaultNow().notNull(), - identity: text("identity").notNull().references(() => identities.atp_did, { onDelete: "cascade", onUpdate: "cascade" } ), +export const document_mentions_in_bsky = pgTable("document_mentions_in_bsky", { + uri: text("uri").notNull().references(() => bsky_posts.uri, { onDelete: "cascade" } ), + link: text("link").notNull(), + document: text("document").notNull().references(() => documents.uri, { onDelete: "cascade" } ), + indexed_at: timestamp("indexed_at", { withTimezone: true, mode: 'string' }).defaultNow().notNull(), }, (table) => { return { - publication_domains_pkey: primaryKey({ columns: [table.publication, table.domain], name: "publication_domains_pkey"}), + document_mentions_in_bsky_pkey: primaryKey({ columns: [table.uri, table.document], name: "document_mentions_in_bsky_pkey"}), } }); -export const publication_subscriptions = pgTable("publication_subscriptions", { +export const publication_domains = pgTable("publication_domains", { publication: text("publication").notNull().references(() => publications.uri, { onDelete: "cascade" } ), - identity: text("identity").notNull().references(() => identities.atp_did, { onDelete: "cascade" } ), + domain: text("domain").notNull().references(() => custom_domains.domain, { onDelete: "cascade" } ), created_at: timestamp("created_at", { withTimezone: true, mode: 'string' }).defaultNow().notNull(), - record: jsonb("record").notNull(), - uri: text("uri").notNull(), + identity: text("identity").notNull().references(() => identities.atp_did, { onDelete: "cascade", onUpdate: "cascade" } ), }, (table) => { return { - publication_subscriptions_pkey: primaryKey({ columns: [table.publication, table.identity], name: "publication_subscriptions_pkey"}), - publication_subscriptions_uri_key: unique("publication_subscriptions_uri_key").on(table.uri), + publication_idx: index("publication_domains_publication_idx").on(table.publication), + publication_domains_pkey: primaryKey({ columns: [table.publication, table.domain], name: "publication_domains_pkey"}), } }); @@ -273,10 +287,27 @@ export const leaflets_in_publications = pgTable("leaflets_in_publications", { }, (table) => { return { + leaflet_idx: index("leaflets_in_publications_leaflet_idx").on(table.leaflet), + publication_idx: index("leaflets_in_publications_publication_idx").on(table.publication), leaflets_in_publications_pkey: primaryKey({ columns: [table.publication, table.leaflet], name: "leaflets_in_publications_pkey"}), } }); +export const publication_subscriptions = pgTable("publication_subscriptions", { + publication: text("publication").notNull().references(() => publications.uri, { onDelete: "cascade" } ), + identity: text("identity").notNull().references(() => identities.atp_did, { onDelete: "cascade" } ), + created_at: timestamp("created_at", { withTimezone: true, mode: 'string' }).defaultNow().notNull(), + record: jsonb("record").notNull(), + uri: text("uri").notNull(), +}, +(table) => { + return { + publication_idx: index("publication_subscriptions_publication_idx").on(table.publication), + publication_subscriptions_pkey: primaryKey({ columns: [table.publication, table.identity], name: "publication_subscriptions_pkey"}), + publication_subscriptions_uri_key: unique("publication_subscriptions_uri_key").on(table.uri), + } +}); + export const permission_token_rights = pgTable("permission_token_rights", { token: uuid("token").notNull().references(() => permission_tokens.id, { onDelete: "cascade", onUpdate: "cascade" } ), entity_set: uuid("entity_set").notNull().references(() => entity_sets.id, { onDelete: "cascade", onUpdate: "cascade" } ), @@ -288,6 +319,8 @@ export const permission_token_rights = pgTable("permission_token_rights", { }, (table) => { return { + token_idx: index("permission_token_rights_token_idx").on(table.token), + entity_set_idx: index("permission_token_rights_entity_set_idx").on(table.entity_set), permission_token_rights_pkey: primaryKey({ columns: [table.token, table.entity_set], name: "permission_token_rights_pkey"}), } }); \ No newline at end of file diff --git a/supabase/database.types.ts b/supabase/database.types.ts index 5847d1fe..24a7ad17 100644 --- a/supabase/database.types.ts +++ b/supabase/database.types.ts @@ -244,16 +244,19 @@ export type Database = { document_mentions_in_bsky: { Row: { document: string + indexed_at: string link: string uri: string } Insert: { document: string + indexed_at?: string link: string uri: string } Update: { document?: string + indexed_at?: string link?: string uri?: string } diff --git a/supabase/migrations/20251017160632_add_indexed_at_to_document_mentions_in_bsky.sql b/supabase/migrations/20251017160632_add_indexed_at_to_document_mentions_in_bsky.sql new file mode 100644 index 00000000..36d66c70 --- /dev/null +++ b/supabase/migrations/20251017160632_add_indexed_at_to_document_mentions_in_bsky.sql @@ -0,0 +1 @@ +alter table "public"."document_mentions_in_bsky" add column "indexed_at" timestamp with time zone not null default now();