A Prediction Market on the AT Protocol
at main 68 lines 2.1 kB view raw
1import { text, integer, json, pgTable, timestamp, pgEnum, index } from "drizzle-orm/pg-core"; 2import { relations } from "drizzle-orm"; 3import { drizzle } from "drizzle-orm/node-postgres"; 4import { ENV } from "@/core/env"; 5 6const SHARED_SCHEMA = { 7 uri: text().primaryKey().notNull(), 8 did: text().notNull(), 9 rev: text().notNull(), 10 rkey: text().notNull(), 11 cid: text().notNull(), 12 record: json().notNull(), 13 createdAt: timestamp({ withTimezone: true }).notNull(), 14} 15 16export const betPositionEnum = pgEnum("bet_position", ["yes", "no"]); 17export const resolutionAnswerEnum = pgEnum("resolution_answer", ["yes", "no"]); 18 19export const marketsTable = pgTable("markets", { 20 ...SHARED_SCHEMA, 21 question: text().notNull(), 22 liquidity: integer().notNull(), 23 closesAt: timestamp({ withTimezone: true }).notNull(), 24}); 25 26export const betsTable = pgTable("bets", { 27 ...SHARED_SCHEMA, 28 position: betPositionEnum().notNull(), 29 marketUri: text().notNull().references(() => marketsTable.uri), 30}, (table) => [ 31 index('bets_market_uri_idx').on(table.marketUri), 32]); 33 34export const resolutionsTable = pgTable("resolutions", { 35 ...SHARED_SCHEMA, 36 answer: resolutionAnswerEnum().notNull(), 37 marketUri: text().notNull().unique().references(() => marketsTable.uri), 38}); 39 40export const marketsRelations = relations(marketsTable, ({ many, one }) => ({ 41 bets: many(betsTable), 42 resolution: one(resolutionsTable), 43})); 44 45export const betsRelations = relations(betsTable, ({ one }) => ({ 46 market: one(marketsTable, { 47 fields: [betsTable.marketUri], 48 references: [marketsTable.uri], 49 }), 50})); 51 52export const resolutionsRelations = relations(resolutionsTable, ({ one }) => ({ 53 market: one(marketsTable, { 54 fields: [resolutionsTable.marketUri], 55 references: [marketsTable.uri], 56 }), 57})); 58 59export const db = drizzle(ENV.DATABASE_URL, { 60 schema: { 61 marketsTable, 62 betsTable, 63 resolutionsTable, 64 marketsRelations, 65 betsRelations, 66 resolutionsRelations 67 } 68});