From 54624c4cc67915e3f52fe4ea15a22a856dffd1a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andri=20=C3=93skarsson?= Date: Tue, 24 Dec 2024 08:33:31 +0100 Subject: [PATCH] cleaning up --- .continuerc.json | 16 + .../atutils => apps/classifier}/.gitignore | 0 apps/classifier/README.md | 15 + apps/classifier/index.ts | 11 + apps/classifier/package.json | 17 + .../atutils => apps/classifier}/tsconfig.json | 0 apps/jetstream/.gitignore | 175 +++++++++ apps/jetstream/README.md | 15 + .../stream-listener.ts => jetstream/index.ts} | 0 apps/jetstream/package.json | 17 + apps/jetstream/tsconfig.json | 27 ++ apps/web/app.db | Bin 335872 -> 0 bytes apps/web/db/db.ts | 7 - .../drizzle/0000_equal_living_lightning.sql | 41 -- .../web/db/drizzle/0001_slim_sister_grimm.sql | 4 - .../db/drizzle/0002_fair_captain_cross.sql | 13 - apps/web/db/drizzle/0003_foamy_swordsman.sql | 1 - apps/web/db/drizzle/0004_fixed_harrier.sql | 4 - .../web/db/drizzle/0005_safe_vin_gonzales.sql | 1 - .../web/db/drizzle/0006_milky_white_queen.sql | 13 - .../db/drizzle/0007_sudden_dark_phoenix.sql | 12 - .../db/drizzle/0008_redundant_spectrum.sql | 1 - apps/web/db/drizzle/0009_skinny_cerebro.sql | 12 - apps/web/db/drizzle/0010_sad_salo.sql | 13 - apps/web/db/drizzle/meta/0000_snapshot.json | 293 -------------- apps/web/db/drizzle/meta/0001_snapshot.json | 292 -------------- apps/web/db/drizzle/meta/0002_snapshot.json | 292 -------------- apps/web/db/drizzle/meta/0003_snapshot.json | 300 --------------- apps/web/db/drizzle/meta/0004_snapshot.json | 324 ---------------- apps/web/db/drizzle/meta/0007_snapshot.json | 317 --------------- apps/web/db/drizzle/meta/0008_snapshot.json | 319 ---------------- apps/web/db/drizzle/meta/0009_snapshot.json | 303 --------------- apps/web/db/drizzle/meta/0010_snapshot.json | 290 -------------- apps/web/db/drizzle/meta/_journal.json | 83 ---- apps/web/db/schema.ts | 137 ------- apps/web/drizzle.config.ts | 6 +- apps/web/package.json | 12 +- apps/web/scripts/run-server.ts | 7 +- apps/web/src/actions/index.ts | 17 + apps/web/src/base.css | 4 + apps/web/src/config.ts | 14 - apps/web/src/layouts/Layout.astro | 36 +- .../web/src/pages/.well-known/did.json.ts | 6 +- apps/web/src/pages/_react/post-moderator.tsx | 53 +++ apps/web/src/pages/index.astro | 2 - apps/web/src/pages/mrq.astro | 35 ++ .../xrpc/app.bsky.feed.getFeedSkeleton.ts | 15 +- apps/web/zstd_dictionary.dat | Bin 112640 -> 0 bytes bun.lockb | Bin 325536 -> 326728 bytes package.json | 3 + packages/atproto/api/types.ts | 3 - packages/atproto/app.db | Bin 335872 -> 0 bytes .../atproto/classifiers/tech/github-links.ts | 20 + .../atproto/classifiers/tech/muted-words.ts | 13 + .../atproto/classifiers/tech/tech-words.ts | 17 + packages/atproto/classifiers/types.ts | 12 + packages/atproto/config.ts | 7 +- packages/atproto/context.ts | 17 +- packages/atproto/db/db.ts | 7 - .../drizzle/0000_equal_living_lightning.sql | 41 -- .../atproto/db/drizzle/0000_public_pride.sql | 46 +++ .../db/drizzle/0001_cultured_ultimates.sql | 2 + .../db/drizzle/0001_slim_sister_grimm.sql | 4 - .../db/drizzle/0002_fair_captain_cross.sql | 13 - .../db/drizzle/0002_nifty_sharon_carter.sql | 3 + .../db/drizzle/0003_foamy_swordsman.sql | 1 - .../drizzle/0003_useful_infant_terrible.sql | 1 + .../atproto/db/drizzle/0004_fixed_harrier.sql | 4 - .../atproto/db/drizzle/0004_icy_scream.sql | 2 + .../db/drizzle/0005_plain_liz_osborn.sql | 1 + .../db/drizzle/0005_safe_vin_gonzales.sql | 1 - .../db/drizzle/0006_milky_white_queen.sql | 13 - .../db/drizzle/0006_productive_lizard.sql | 9 + .../db/drizzle/0007_busy_sabretooth.sql | 4 + .../db/drizzle/0007_sudden_dark_phoenix.sql | 12 - .../db/drizzle/0008_redundant_spectrum.sql | 1 - .../atproto/db/drizzle/0008_steep_scourge.sql | 1 + .../atproto/db/drizzle/0009_rich_manta.sql | 1 + .../db/drizzle/0009_skinny_cerebro.sql | 12 - .../db/drizzle/0010_nifty_miss_america.sql | 1 + packages/atproto/db/drizzle/0010_sad_salo.sql | 13 - .../atproto/db/drizzle/0011_steep_namor.sql | 1 + .../db/drizzle/0012_wonderful_tinkerer.sql | 2 + .../db/drizzle/meta/0000_snapshot.json | 259 +++++++------ .../db/drizzle/meta/0001_snapshot.json | 284 ++++++++------ .../db/drizzle/meta/0002_snapshot.json | 292 ++++++++------ .../db/drizzle/meta/0003_snapshot.json | 290 +++++++------- .../db/drizzle/meta/0004_snapshot.json | 236 ++++++------ .../db/drizzle/meta/0005_snapshot.json | 241 ++++++------ .../db/drizzle/meta/0006_snapshot.json | 301 +++++++++------ .../db/drizzle/meta/0007_snapshot.json | 309 ++++++++++----- .../db/drizzle/meta/0008_snapshot.json | 361 +++++++++++------- .../db/drizzle/meta/0009_snapshot.json | 359 +++++++++++------ .../db/drizzle/meta/0010_snapshot.json | 336 +++++++++++----- .../db/drizzle/meta/0011_snapshot.json | 327 +++++++++++----- .../db/drizzle/meta/0012_snapshot.json | 325 +++++++++++----- .../atproto/db/drizzle/meta/_journal.json | 82 ++-- packages/atproto/db/schema.ts | 77 +++- packages/atproto/domain/classify-manually.ts | 31 ++ packages/atproto/domain/get-feed-posts.ts | 15 +- .../atproto/domain/jetstream-subscription.ts | 31 +- packages/atproto/domain/jetstream.ts | 19 +- .../domain/queue-for-classification.ts | 42 +- packages/atproto/drizzle.config.ts | 5 +- packages/atproto/feeds/README.md | 7 + packages/atproto/index.ts | 7 + packages/atproto/package.json | 2 + packages/atproto/pt1.ts | 6 - packages/atproto/scripts/classify.ts | 58 +++ packages/db/.gitignore | 175 +++++++++ packages/db/README.md | 15 + packages/db/package.json | 13 + packages/db/tsconfig.json | 27 ++ packages/{ => old}/atproto-feed/README.md | 0 packages/old/atutils/.gitignore | 175 +++++++++ packages/{ => old}/atutils/README.md | 0 packages/{ => old}/atutils/index.ts | 0 packages/{ => old}/atutils/package.json | 0 packages/old/atutils/tsconfig.json | 27 ++ .../classifiers/is-about-programming.ts | 0 .../classifiers/naive-bayes-classifier.ts | 0 packages/{ => old}/classifiers/tokenizer.ts | 0 122 files changed, 3752 insertions(+), 4842 deletions(-) create mode 100644 .continuerc.json rename {packages/atutils => apps/classifier}/.gitignore (100%) create mode 100644 apps/classifier/README.md create mode 100644 apps/classifier/index.ts create mode 100644 apps/classifier/package.json rename {packages/atutils => apps/classifier}/tsconfig.json (100%) create mode 100644 apps/jetstream/.gitignore create mode 100644 apps/jetstream/README.md rename apps/{web/scripts/stream-listener.ts => jetstream/index.ts} (100%) create mode 100644 apps/jetstream/package.json create mode 100644 apps/jetstream/tsconfig.json delete mode 100644 apps/web/app.db delete mode 100644 apps/web/db/db.ts delete mode 100644 apps/web/db/drizzle/0000_equal_living_lightning.sql delete mode 100644 apps/web/db/drizzle/0001_slim_sister_grimm.sql delete mode 100644 apps/web/db/drizzle/0002_fair_captain_cross.sql delete mode 100644 apps/web/db/drizzle/0003_foamy_swordsman.sql delete mode 100644 apps/web/db/drizzle/0004_fixed_harrier.sql delete mode 100644 apps/web/db/drizzle/0005_safe_vin_gonzales.sql delete mode 100644 apps/web/db/drizzle/0006_milky_white_queen.sql delete mode 100644 apps/web/db/drizzle/0007_sudden_dark_phoenix.sql delete mode 100644 apps/web/db/drizzle/0008_redundant_spectrum.sql delete mode 100644 apps/web/db/drizzle/0009_skinny_cerebro.sql delete mode 100644 apps/web/db/drizzle/0010_sad_salo.sql delete mode 100644 apps/web/db/drizzle/meta/0000_snapshot.json delete mode 100644 apps/web/db/drizzle/meta/0001_snapshot.json delete mode 100644 apps/web/db/drizzle/meta/0002_snapshot.json delete mode 100644 apps/web/db/drizzle/meta/0003_snapshot.json delete mode 100644 apps/web/db/drizzle/meta/0004_snapshot.json delete mode 100644 apps/web/db/drizzle/meta/0007_snapshot.json delete mode 100644 apps/web/db/drizzle/meta/0008_snapshot.json delete mode 100644 apps/web/db/drizzle/meta/0009_snapshot.json delete mode 100644 apps/web/db/drizzle/meta/0010_snapshot.json delete mode 100644 apps/web/db/drizzle/meta/_journal.json delete mode 100644 apps/web/db/schema.ts create mode 100644 apps/web/src/base.css delete mode 100644 apps/web/src/config.ts rename packages/atproto/api/well-known-did.ts => apps/web/src/pages/.well-known/did.json.ts (70%) create mode 100644 apps/web/src/pages/_react/post-moderator.tsx create mode 100644 apps/web/src/pages/mrq.astro rename packages/atproto/api/get-feed-skeleton.ts => apps/web/src/pages/xrpc/app.bsky.feed.getFeedSkeleton.ts (66%) delete mode 100644 apps/web/zstd_dictionary.dat delete mode 100644 packages/atproto/api/types.ts delete mode 100644 packages/atproto/app.db create mode 100644 packages/atproto/classifiers/tech/github-links.ts create mode 100644 packages/atproto/classifiers/tech/muted-words.ts create mode 100644 packages/atproto/classifiers/tech/tech-words.ts create mode 100644 packages/atproto/classifiers/types.ts delete mode 100644 packages/atproto/db/db.ts delete mode 100644 packages/atproto/db/drizzle/0000_equal_living_lightning.sql create mode 100644 packages/atproto/db/drizzle/0000_public_pride.sql create mode 100644 packages/atproto/db/drizzle/0001_cultured_ultimates.sql delete mode 100644 packages/atproto/db/drizzle/0001_slim_sister_grimm.sql delete mode 100644 packages/atproto/db/drizzle/0002_fair_captain_cross.sql create mode 100644 packages/atproto/db/drizzle/0002_nifty_sharon_carter.sql delete mode 100644 packages/atproto/db/drizzle/0003_foamy_swordsman.sql create mode 100644 packages/atproto/db/drizzle/0003_useful_infant_terrible.sql delete mode 100644 packages/atproto/db/drizzle/0004_fixed_harrier.sql create mode 100644 packages/atproto/db/drizzle/0004_icy_scream.sql create mode 100644 packages/atproto/db/drizzle/0005_plain_liz_osborn.sql delete mode 100644 packages/atproto/db/drizzle/0005_safe_vin_gonzales.sql delete mode 100644 packages/atproto/db/drizzle/0006_milky_white_queen.sql create mode 100644 packages/atproto/db/drizzle/0006_productive_lizard.sql create mode 100644 packages/atproto/db/drizzle/0007_busy_sabretooth.sql delete mode 100644 packages/atproto/db/drizzle/0007_sudden_dark_phoenix.sql delete mode 100644 packages/atproto/db/drizzle/0008_redundant_spectrum.sql create mode 100644 packages/atproto/db/drizzle/0008_steep_scourge.sql create mode 100644 packages/atproto/db/drizzle/0009_rich_manta.sql delete mode 100644 packages/atproto/db/drizzle/0009_skinny_cerebro.sql create mode 100644 packages/atproto/db/drizzle/0010_nifty_miss_america.sql delete mode 100644 packages/atproto/db/drizzle/0010_sad_salo.sql create mode 100644 packages/atproto/db/drizzle/0011_steep_namor.sql create mode 100644 packages/atproto/db/drizzle/0012_wonderful_tinkerer.sql rename apps/web/db/drizzle/meta/0005_snapshot.json => packages/atproto/db/drizzle/meta/0011_snapshot.json (51%) rename apps/web/db/drizzle/meta/0006_snapshot.json => packages/atproto/db/drizzle/meta/0012_snapshot.json (50%) create mode 100644 packages/atproto/domain/classify-manually.ts create mode 100644 packages/atproto/feeds/README.md create mode 100644 packages/atproto/scripts/classify.ts create mode 100644 packages/db/.gitignore create mode 100644 packages/db/README.md create mode 100644 packages/db/package.json create mode 100644 packages/db/tsconfig.json rename packages/{ => old}/atproto-feed/README.md (100%) create mode 100644 packages/old/atutils/.gitignore rename packages/{ => old}/atutils/README.md (100%) rename packages/{ => old}/atutils/index.ts (100%) rename packages/{ => old}/atutils/package.json (100%) create mode 100644 packages/old/atutils/tsconfig.json rename packages/{ => old}/classifiers/is-about-programming.ts (100%) rename packages/{ => old}/classifiers/naive-bayes-classifier.ts (100%) rename packages/{ => old}/classifiers/tokenizer.ts (100%) diff --git a/.continuerc.json b/.continuerc.json new file mode 100644 index 0000000..fa95ac7 --- /dev/null +++ b/.continuerc.json @@ -0,0 +1,16 @@ +{ + "contextProviders": [ + { + "name": "postgres", + "params": { + "host": "localhost", + "port": 5432, + "user": "devuser", + "password": "devpass", + "database": "devdb", + "schema": "public", + "sampleRows": 3 + } + } + ] +} \ No newline at end of file diff --git a/packages/atutils/.gitignore b/apps/classifier/.gitignore similarity index 100% rename from packages/atutils/.gitignore rename to apps/classifier/.gitignore diff --git a/apps/classifier/README.md b/apps/classifier/README.md new file mode 100644 index 0000000..8ff526b --- /dev/null +++ b/apps/classifier/README.md @@ -0,0 +1,15 @@ +# classifier + +To install dependencies: + +```bash +bun install +``` + +To run: + +```bash +bun run index.ts +``` + +This project was created using `bun init` in bun v1.1.40. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime. diff --git a/apps/classifier/index.ts b/apps/classifier/index.ts new file mode 100644 index 0000000..bff9582 --- /dev/null +++ b/apps/classifier/index.ts @@ -0,0 +1,11 @@ +import { classifier } from "@andrioid/atproto"; + +classifier() + .catch((err) => { + console.log("[classifier] app level error"); + console.error(err); + process.exit(1); + }) + .then(() => { + process.exit(0); + }); diff --git a/apps/classifier/package.json b/apps/classifier/package.json new file mode 100644 index 0000000..9ca0b12 --- /dev/null +++ b/apps/classifier/package.json @@ -0,0 +1,17 @@ +{ + "name": "classifier", + "module": "index.ts", + "type": "module", + "scripts": { + "dev": "bun --env-file=../../.env index.ts" + }, + "dependencies": { + "@andrioid/atproto": "workspace:*" + }, + "devDependencies": { + "@types/bun": "latest" + }, + "peerDependencies": { + "typescript": "^5.0.0" + } +} diff --git a/packages/atutils/tsconfig.json b/apps/classifier/tsconfig.json similarity index 100% rename from packages/atutils/tsconfig.json rename to apps/classifier/tsconfig.json diff --git a/apps/jetstream/.gitignore b/apps/jetstream/.gitignore new file mode 100644 index 0000000..9b1ee42 --- /dev/null +++ b/apps/jetstream/.gitignore @@ -0,0 +1,175 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Caches + +.cache + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/apps/jetstream/README.md b/apps/jetstream/README.md new file mode 100644 index 0000000..9e2bc2c --- /dev/null +++ b/apps/jetstream/README.md @@ -0,0 +1,15 @@ +# jetstream + +To install dependencies: + +```bash +bun install +``` + +To run: + +```bash +bun run index.ts +``` + +This project was created using `bun init` in bun v1.1.40. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime. diff --git a/apps/web/scripts/stream-listener.ts b/apps/jetstream/index.ts similarity index 100% rename from apps/web/scripts/stream-listener.ts rename to apps/jetstream/index.ts diff --git a/apps/jetstream/package.json b/apps/jetstream/package.json new file mode 100644 index 0000000..448656d --- /dev/null +++ b/apps/jetstream/package.json @@ -0,0 +1,17 @@ +{ + "name": "jetstream", + "module": "index.ts", + "type": "module", + "scripts": { + "dev": "bun --env-file=../../.env index.ts" + }, + "dependencies": { + "@andrioid/atproto": "workspace:*" + }, + "devDependencies": { + "@types/bun": "latest" + }, + "peerDependencies": { + "typescript": "^5.0.0" + } +} diff --git a/apps/jetstream/tsconfig.json b/apps/jetstream/tsconfig.json new file mode 100644 index 0000000..238655f --- /dev/null +++ b/apps/jetstream/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +} diff --git a/apps/web/app.db b/apps/web/app.db deleted file mode 100644 index 105abc67f944535df85e3a91e86602a7a8f623a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 335872 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 R71DB2i!)MFz;0Bk1psq_9ESh^ diff --git a/apps/web/db/db.ts b/apps/web/db/db.ts deleted file mode 100644 index 30adb46..0000000 --- a/apps/web/db/db.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Database } from "bun:sqlite"; -import { drizzle } from "drizzle-orm/bun-sqlite"; -import { config } from "../config"; -const sqlite = new Database(config.sqliteFile); -export const db = drizzle({ - client: sqlite, -}); diff --git a/apps/web/db/drizzle/0000_equal_living_lightning.sql b/apps/web/db/drizzle/0000_equal_living_lightning.sql deleted file mode 100644 index de3b82e..0000000 --- a/apps/web/db/drizzle/0000_equal_living_lightning.sql +++ /dev/null @@ -1,41 +0,0 @@ -CREATE TABLE `follow` ( - `followed_by` text NOT NULL, - `follows` text NOT NULL, - `modified` text DEFAULT (CURRENT_TIMESTAMP) NOT NULL, - PRIMARY KEY(`follows`, `followed_by`), - FOREIGN KEY (`followed_by`) REFERENCES `user`(`did`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`follows`) REFERENCES `user`(`did`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE TABLE `post_data` ( - `post_id` text, - FOREIGN KEY (`post_id`) REFERENCES `post`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE UNIQUE INDEX `post_data_post_id_unique` ON `post_data` (`post_id`);--> statement-breakpoint -CREATE TABLE `post` ( - `id` text PRIMARY KEY NOT NULL, - `author_id` text, - `created` text DEFAULT (CURRENT_TIMESTAMP) NOT NULL, - `modified` text DEFAULT (CURRENT_TIMESTAMP) NOT NULL, - FOREIGN KEY (`author_id`) REFERENCES `user`(`did`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE TABLE `post_tag` ( - `tag_id` text NOT NULL, - `post_id` text NOT NULL, - `probability` real, - PRIMARY KEY(`post_id`, `tag_id`), - FOREIGN KEY (`tag_id`) REFERENCES `tag`(`id`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`post_id`) REFERENCES `post`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE TABLE `tag` ( - `id` text PRIMARY KEY NOT NULL, - `description` text -); ---> statement-breakpoint -CREATE TABLE `user` ( - `did` text PRIMARY KEY NOT NULL, - `modified` text DEFAULT (CURRENT_TIMESTAMP) NOT NULL -); diff --git a/apps/web/db/drizzle/0001_slim_sister_grimm.sql b/apps/web/db/drizzle/0001_slim_sister_grimm.sql deleted file mode 100644 index 4ea8316..0000000 --- a/apps/web/db/drizzle/0001_slim_sister_grimm.sql +++ /dev/null @@ -1,4 +0,0 @@ -DROP INDEX `post_data_post_id_unique`;--> statement-breakpoint -ALTER TABLE `post_data` ADD `type` text NOT NULL;--> statement-breakpoint -CREATE INDEX `post_idx` ON `post_data` (`post_id`);--> statement-breakpoint -ALTER TABLE `follow` DROP COLUMN `modified`; \ No newline at end of file diff --git a/apps/web/db/drizzle/0002_fair_captain_cross.sql b/apps/web/db/drizzle/0002_fair_captain_cross.sql deleted file mode 100644 index 2fc2028..0000000 --- a/apps/web/db/drizzle/0002_fair_captain_cross.sql +++ /dev/null @@ -1,13 +0,0 @@ -PRAGMA foreign_keys=OFF;--> statement-breakpoint -CREATE TABLE `__new_post` ( - `id` text PRIMARY KEY NOT NULL, - `author_id` text NOT NULL, - `created` text DEFAULT (CURRENT_TIMESTAMP) NOT NULL, - `modified` text DEFAULT (CURRENT_TIMESTAMP) NOT NULL, - FOREIGN KEY (`author_id`) REFERENCES `user`(`did`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -INSERT INTO `__new_post`("id", "author_id", "created", "modified") SELECT "id", "author_id", "created", "modified" FROM `post`;--> statement-breakpoint -DROP TABLE `post`;--> statement-breakpoint -ALTER TABLE `__new_post` RENAME TO `post`;--> statement-breakpoint -PRAGMA foreign_keys=ON; \ No newline at end of file diff --git a/apps/web/db/drizzle/0003_foamy_swordsman.sql b/apps/web/db/drizzle/0003_foamy_swordsman.sql deleted file mode 100644 index 6a76f3b..0000000 --- a/apps/web/db/drizzle/0003_foamy_swordsman.sql +++ /dev/null @@ -1 +0,0 @@ -CREATE INDEX `followedby_idx` ON `follow` (`followed_by`); \ No newline at end of file diff --git a/apps/web/db/drizzle/0004_fixed_harrier.sql b/apps/web/db/drizzle/0004_fixed_harrier.sql deleted file mode 100644 index c2bbb2f..0000000 --- a/apps/web/db/drizzle/0004_fixed_harrier.sql +++ /dev/null @@ -1,4 +0,0 @@ -CREATE TABLE `app` ( - `k` text PRIMARY KEY NOT NULL, - `v` text -); diff --git a/apps/web/db/drizzle/0005_safe_vin_gonzales.sql b/apps/web/db/drizzle/0005_safe_vin_gonzales.sql deleted file mode 100644 index 1ee4ff3..0000000 --- a/apps/web/db/drizzle/0005_safe_vin_gonzales.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE `post_data` ADD `value` text; \ No newline at end of file diff --git a/apps/web/db/drizzle/0006_milky_white_queen.sql b/apps/web/db/drizzle/0006_milky_white_queen.sql deleted file mode 100644 index 855dc4e..0000000 --- a/apps/web/db/drizzle/0006_milky_white_queen.sql +++ /dev/null @@ -1,13 +0,0 @@ -PRAGMA foreign_keys=OFF;--> statement-breakpoint -CREATE TABLE `__new_post_data` ( - `post_id` text PRIMARY KEY NOT NULL, - `type` text NOT NULL, - `value` text, - FOREIGN KEY (`post_id`) REFERENCES `post`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -INSERT INTO `__new_post_data`("post_id", "type", "value") SELECT "post_id", "type", "value" FROM `post_data`;--> statement-breakpoint -DROP TABLE `post_data`;--> statement-breakpoint -ALTER TABLE `__new_post_data` RENAME TO `post_data`;--> statement-breakpoint -PRAGMA foreign_keys=ON;--> statement-breakpoint -CREATE INDEX `post_idx` ON `post_data` (`post_id`); \ No newline at end of file diff --git a/apps/web/db/drizzle/0007_sudden_dark_phoenix.sql b/apps/web/db/drizzle/0007_sudden_dark_phoenix.sql deleted file mode 100644 index 6cb6a97..0000000 --- a/apps/web/db/drizzle/0007_sudden_dark_phoenix.sql +++ /dev/null @@ -1,12 +0,0 @@ -PRAGMA foreign_keys=OFF;--> statement-breakpoint -CREATE TABLE `__new_post_data` ( - `post_id` text PRIMARY KEY NOT NULL, - `type` text NOT NULL, - `value` text -); ---> statement-breakpoint -INSERT INTO `__new_post_data`("post_id", "type", "value") SELECT "post_id", "type", "value" FROM `post_data`;--> statement-breakpoint -DROP TABLE `post_data`;--> statement-breakpoint -ALTER TABLE `__new_post_data` RENAME TO `post_data`;--> statement-breakpoint -PRAGMA foreign_keys=ON;--> statement-breakpoint -CREATE INDEX `post_idx` ON `post_data` (`post_id`); \ No newline at end of file diff --git a/apps/web/db/drizzle/0008_redundant_spectrum.sql b/apps/web/db/drizzle/0008_redundant_spectrum.sql deleted file mode 100644 index 753831b..0000000 --- a/apps/web/db/drizzle/0008_redundant_spectrum.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE `post_data` RENAME TO `post_queue`; \ No newline at end of file diff --git a/apps/web/db/drizzle/0009_skinny_cerebro.sql b/apps/web/db/drizzle/0009_skinny_cerebro.sql deleted file mode 100644 index eb8adfc..0000000 --- a/apps/web/db/drizzle/0009_skinny_cerebro.sql +++ /dev/null @@ -1,12 +0,0 @@ -PRAGMA foreign_keys=OFF;--> statement-breakpoint -CREATE TABLE `__new_post` ( - `id` text PRIMARY KEY NOT NULL, - `author_id` text NOT NULL, - `created` text DEFAULT (CURRENT_TIMESTAMP) NOT NULL, - `modified` text DEFAULT (CURRENT_TIMESTAMP) NOT NULL -); ---> statement-breakpoint -INSERT INTO `__new_post`("id", "author_id", "created", "modified") SELECT "id", "author_id", "created", "modified" FROM `post`;--> statement-breakpoint -DROP TABLE `post`;--> statement-breakpoint -ALTER TABLE `__new_post` RENAME TO `post`;--> statement-breakpoint -PRAGMA foreign_keys=ON; \ No newline at end of file diff --git a/apps/web/db/drizzle/0010_sad_salo.sql b/apps/web/db/drizzle/0010_sad_salo.sql deleted file mode 100644 index 3bbe845..0000000 --- a/apps/web/db/drizzle/0010_sad_salo.sql +++ /dev/null @@ -1,13 +0,0 @@ -PRAGMA foreign_keys=OFF;--> statement-breakpoint -CREATE TABLE `__new_follow` ( - `followed_by` text NOT NULL, - `follows` text NOT NULL, - PRIMARY KEY(`follows`, `followed_by`), - FOREIGN KEY (`followed_by`) REFERENCES `user`(`did`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -INSERT INTO `__new_follow`("followed_by", "follows") SELECT "followed_by", "follows" FROM `follow`;--> statement-breakpoint -DROP TABLE `follow`;--> statement-breakpoint -ALTER TABLE `__new_follow` RENAME TO `follow`;--> statement-breakpoint -PRAGMA foreign_keys=ON;--> statement-breakpoint -CREATE INDEX `followedby_idx` ON `follow` (`followed_by`); \ No newline at end of file diff --git a/apps/web/db/drizzle/meta/0000_snapshot.json b/apps/web/db/drizzle/meta/0000_snapshot.json deleted file mode 100644 index 796356f..0000000 --- a/apps/web/db/drizzle/meta/0000_snapshot.json +++ /dev/null @@ -1,293 +0,0 @@ -{ - "version": "6", - "dialect": "sqlite", - "id": "f28baea5-3649-4a26-ac42-82d5571894ed", - "prevId": "00000000-0000-0000-0000-000000000000", - "tables": { - "follow": { - "name": "follow", - "columns": { - "followed_by": { - "name": "followed_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "follows": { - "name": "follows", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "modified": { - "name": "modified", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - } - }, - "indexes": {}, - "foreignKeys": { - "follow_followed_by_user_did_fk": { - "name": "follow_followed_by_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", - "columnsFrom": [ - "followed_by" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "follow_follows_user_did_fk": { - "name": "follow_follows_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", - "columnsFrom": [ - "follows" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "follow_follows_followed_by_pk": { - "columns": [ - "follows", - "followed_by" - ], - "name": "follow_follows_followed_by_pk" - } - }, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post_data": { - "name": "post_data", - "columns": { - "post_id": { - "name": "post_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "post_data_post_id_unique": { - "name": "post_data_post_id_unique", - "columns": [ - "post_id" - ], - "isUnique": true - } - }, - "foreignKeys": { - "post_data_post_id_post_id_fk": { - "name": "post_data_post_id_post_id_fk", - "tableFrom": "post_data", - "tableTo": "post", - "columnsFrom": [ - "post_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post": { - "name": "post", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "author_id": { - "name": "author_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created": { - "name": "created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - }, - "modified": { - "name": "modified", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - } - }, - "indexes": {}, - "foreignKeys": { - "post_author_id_user_did_fk": { - "name": "post_author_id_user_did_fk", - "tableFrom": "post", - "tableTo": "user", - "columnsFrom": [ - "author_id" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post_tag": { - "name": "post_tag", - "columns": { - "tag_id": { - "name": "tag_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "post_id": { - "name": "post_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "probability": { - "name": "probability", - "type": "real", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "post_tag_tag_id_tag_id_fk": { - "name": "post_tag_tag_id_tag_id_fk", - "tableFrom": "post_tag", - "tableTo": "tag", - "columnsFrom": [ - "tag_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "post_tag_post_id_post_id_fk": { - "name": "post_tag_post_id_post_id_fk", - "tableFrom": "post_tag", - "tableTo": "post", - "columnsFrom": [ - "post_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "post_tag_post_id_tag_id_pk": { - "columns": [ - "post_id", - "tag_id" - ], - "name": "post_tag_post_id_tag_id_pk" - } - }, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "tag": { - "name": "tag", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "user": { - "name": "user", - "columns": { - "did": { - "name": "did", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "modified": { - "name": "modified", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - } - }, - "views": {}, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - }, - "internal": { - "indexes": {} - } -} \ No newline at end of file diff --git a/apps/web/db/drizzle/meta/0001_snapshot.json b/apps/web/db/drizzle/meta/0001_snapshot.json deleted file mode 100644 index a47ac1a..0000000 --- a/apps/web/db/drizzle/meta/0001_snapshot.json +++ /dev/null @@ -1,292 +0,0 @@ -{ - "version": "6", - "dialect": "sqlite", - "id": "b71f2809-5f01-4370-8d00-c42f4bd56216", - "prevId": "f28baea5-3649-4a26-ac42-82d5571894ed", - "tables": { - "follow": { - "name": "follow", - "columns": { - "followed_by": { - "name": "followed_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "follows": { - "name": "follows", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "follow_followed_by_user_did_fk": { - "name": "follow_followed_by_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", - "columnsFrom": [ - "followed_by" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "follow_follows_user_did_fk": { - "name": "follow_follows_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", - "columnsFrom": [ - "follows" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "follow_follows_followed_by_pk": { - "columns": [ - "follows", - "followed_by" - ], - "name": "follow_follows_followed_by_pk" - } - }, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post_data": { - "name": "post_data", - "columns": { - "post_id": { - "name": "post_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "type": { - "name": "type", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "post_idx": { - "name": "post_idx", - "columns": [ - "post_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "post_data_post_id_post_id_fk": { - "name": "post_data_post_id_post_id_fk", - "tableFrom": "post_data", - "tableTo": "post", - "columnsFrom": [ - "post_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post": { - "name": "post", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "author_id": { - "name": "author_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created": { - "name": "created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - }, - "modified": { - "name": "modified", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - } - }, - "indexes": {}, - "foreignKeys": { - "post_author_id_user_did_fk": { - "name": "post_author_id_user_did_fk", - "tableFrom": "post", - "tableTo": "user", - "columnsFrom": [ - "author_id" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post_tag": { - "name": "post_tag", - "columns": { - "tag_id": { - "name": "tag_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "post_id": { - "name": "post_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "probability": { - "name": "probability", - "type": "real", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "post_tag_tag_id_tag_id_fk": { - "name": "post_tag_tag_id_tag_id_fk", - "tableFrom": "post_tag", - "tableTo": "tag", - "columnsFrom": [ - "tag_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "post_tag_post_id_post_id_fk": { - "name": "post_tag_post_id_post_id_fk", - "tableFrom": "post_tag", - "tableTo": "post", - "columnsFrom": [ - "post_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "post_tag_post_id_tag_id_pk": { - "columns": [ - "post_id", - "tag_id" - ], - "name": "post_tag_post_id_tag_id_pk" - } - }, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "tag": { - "name": "tag", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "user": { - "name": "user", - "columns": { - "did": { - "name": "did", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "modified": { - "name": "modified", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - } - }, - "views": {}, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - }, - "internal": { - "indexes": {} - } -} \ No newline at end of file diff --git a/apps/web/db/drizzle/meta/0002_snapshot.json b/apps/web/db/drizzle/meta/0002_snapshot.json deleted file mode 100644 index c40025d..0000000 --- a/apps/web/db/drizzle/meta/0002_snapshot.json +++ /dev/null @@ -1,292 +0,0 @@ -{ - "version": "6", - "dialect": "sqlite", - "id": "15955115-bfb7-46d2-8201-0dbb0123e4a3", - "prevId": "b71f2809-5f01-4370-8d00-c42f4bd56216", - "tables": { - "follow": { - "name": "follow", - "columns": { - "followed_by": { - "name": "followed_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "follows": { - "name": "follows", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "follow_followed_by_user_did_fk": { - "name": "follow_followed_by_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", - "columnsFrom": [ - "followed_by" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "follow_follows_user_did_fk": { - "name": "follow_follows_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", - "columnsFrom": [ - "follows" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "follow_follows_followed_by_pk": { - "columns": [ - "follows", - "followed_by" - ], - "name": "follow_follows_followed_by_pk" - } - }, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post_data": { - "name": "post_data", - "columns": { - "post_id": { - "name": "post_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "type": { - "name": "type", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "post_idx": { - "name": "post_idx", - "columns": [ - "post_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "post_data_post_id_post_id_fk": { - "name": "post_data_post_id_post_id_fk", - "tableFrom": "post_data", - "tableTo": "post", - "columnsFrom": [ - "post_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post": { - "name": "post", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "author_id": { - "name": "author_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created": { - "name": "created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - }, - "modified": { - "name": "modified", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - } - }, - "indexes": {}, - "foreignKeys": { - "post_author_id_user_did_fk": { - "name": "post_author_id_user_did_fk", - "tableFrom": "post", - "tableTo": "user", - "columnsFrom": [ - "author_id" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post_tag": { - "name": "post_tag", - "columns": { - "tag_id": { - "name": "tag_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "post_id": { - "name": "post_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "probability": { - "name": "probability", - "type": "real", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "post_tag_tag_id_tag_id_fk": { - "name": "post_tag_tag_id_tag_id_fk", - "tableFrom": "post_tag", - "tableTo": "tag", - "columnsFrom": [ - "tag_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "post_tag_post_id_post_id_fk": { - "name": "post_tag_post_id_post_id_fk", - "tableFrom": "post_tag", - "tableTo": "post", - "columnsFrom": [ - "post_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "post_tag_post_id_tag_id_pk": { - "columns": [ - "post_id", - "tag_id" - ], - "name": "post_tag_post_id_tag_id_pk" - } - }, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "tag": { - "name": "tag", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "user": { - "name": "user", - "columns": { - "did": { - "name": "did", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "modified": { - "name": "modified", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - } - }, - "views": {}, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - }, - "internal": { - "indexes": {} - } -} \ No newline at end of file diff --git a/apps/web/db/drizzle/meta/0003_snapshot.json b/apps/web/db/drizzle/meta/0003_snapshot.json deleted file mode 100644 index b9d1c21..0000000 --- a/apps/web/db/drizzle/meta/0003_snapshot.json +++ /dev/null @@ -1,300 +0,0 @@ -{ - "version": "6", - "dialect": "sqlite", - "id": "e93a951d-60aa-40bc-bcbe-6d480f9dabe8", - "prevId": "15955115-bfb7-46d2-8201-0dbb0123e4a3", - "tables": { - "follow": { - "name": "follow", - "columns": { - "followed_by": { - "name": "followed_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "follows": { - "name": "follows", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "followedby_idx": { - "name": "followedby_idx", - "columns": [ - "followed_by" - ], - "isUnique": false - } - }, - "foreignKeys": { - "follow_followed_by_user_did_fk": { - "name": "follow_followed_by_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", - "columnsFrom": [ - "followed_by" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "follow_follows_user_did_fk": { - "name": "follow_follows_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", - "columnsFrom": [ - "follows" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "follow_follows_followed_by_pk": { - "columns": [ - "follows", - "followed_by" - ], - "name": "follow_follows_followed_by_pk" - } - }, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post_data": { - "name": "post_data", - "columns": { - "post_id": { - "name": "post_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "type": { - "name": "type", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "post_idx": { - "name": "post_idx", - "columns": [ - "post_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "post_data_post_id_post_id_fk": { - "name": "post_data_post_id_post_id_fk", - "tableFrom": "post_data", - "tableTo": "post", - "columnsFrom": [ - "post_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post": { - "name": "post", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "author_id": { - "name": "author_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created": { - "name": "created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - }, - "modified": { - "name": "modified", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - } - }, - "indexes": {}, - "foreignKeys": { - "post_author_id_user_did_fk": { - "name": "post_author_id_user_did_fk", - "tableFrom": "post", - "tableTo": "user", - "columnsFrom": [ - "author_id" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post_tag": { - "name": "post_tag", - "columns": { - "tag_id": { - "name": "tag_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "post_id": { - "name": "post_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "probability": { - "name": "probability", - "type": "real", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "post_tag_tag_id_tag_id_fk": { - "name": "post_tag_tag_id_tag_id_fk", - "tableFrom": "post_tag", - "tableTo": "tag", - "columnsFrom": [ - "tag_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "post_tag_post_id_post_id_fk": { - "name": "post_tag_post_id_post_id_fk", - "tableFrom": "post_tag", - "tableTo": "post", - "columnsFrom": [ - "post_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "post_tag_post_id_tag_id_pk": { - "columns": [ - "post_id", - "tag_id" - ], - "name": "post_tag_post_id_tag_id_pk" - } - }, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "tag": { - "name": "tag", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "user": { - "name": "user", - "columns": { - "did": { - "name": "did", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "modified": { - "name": "modified", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - } - }, - "views": {}, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - }, - "internal": { - "indexes": {} - } -} \ No newline at end of file diff --git a/apps/web/db/drizzle/meta/0004_snapshot.json b/apps/web/db/drizzle/meta/0004_snapshot.json deleted file mode 100644 index 28b62e4..0000000 --- a/apps/web/db/drizzle/meta/0004_snapshot.json +++ /dev/null @@ -1,324 +0,0 @@ -{ - "version": "6", - "dialect": "sqlite", - "id": "154e4024-fe4a-47ed-9d97-5cfe9ee6d84f", - "prevId": "e93a951d-60aa-40bc-bcbe-6d480f9dabe8", - "tables": { - "app": { - "name": "app", - "columns": { - "k": { - "name": "k", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "v": { - "name": "v", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "follow": { - "name": "follow", - "columns": { - "followed_by": { - "name": "followed_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "follows": { - "name": "follows", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "followedby_idx": { - "name": "followedby_idx", - "columns": [ - "followed_by" - ], - "isUnique": false - } - }, - "foreignKeys": { - "follow_followed_by_user_did_fk": { - "name": "follow_followed_by_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", - "columnsFrom": [ - "followed_by" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "follow_follows_user_did_fk": { - "name": "follow_follows_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", - "columnsFrom": [ - "follows" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "follow_follows_followed_by_pk": { - "columns": [ - "follows", - "followed_by" - ], - "name": "follow_follows_followed_by_pk" - } - }, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post_data": { - "name": "post_data", - "columns": { - "post_id": { - "name": "post_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "type": { - "name": "type", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "post_idx": { - "name": "post_idx", - "columns": [ - "post_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "post_data_post_id_post_id_fk": { - "name": "post_data_post_id_post_id_fk", - "tableFrom": "post_data", - "tableTo": "post", - "columnsFrom": [ - "post_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post": { - "name": "post", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "author_id": { - "name": "author_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created": { - "name": "created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - }, - "modified": { - "name": "modified", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - } - }, - "indexes": {}, - "foreignKeys": { - "post_author_id_user_did_fk": { - "name": "post_author_id_user_did_fk", - "tableFrom": "post", - "tableTo": "user", - "columnsFrom": [ - "author_id" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post_tag": { - "name": "post_tag", - "columns": { - "tag_id": { - "name": "tag_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "post_id": { - "name": "post_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "probability": { - "name": "probability", - "type": "real", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "post_tag_tag_id_tag_id_fk": { - "name": "post_tag_tag_id_tag_id_fk", - "tableFrom": "post_tag", - "tableTo": "tag", - "columnsFrom": [ - "tag_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "post_tag_post_id_post_id_fk": { - "name": "post_tag_post_id_post_id_fk", - "tableFrom": "post_tag", - "tableTo": "post", - "columnsFrom": [ - "post_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "post_tag_post_id_tag_id_pk": { - "columns": [ - "post_id", - "tag_id" - ], - "name": "post_tag_post_id_tag_id_pk" - } - }, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "tag": { - "name": "tag", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "user": { - "name": "user", - "columns": { - "did": { - "name": "did", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "modified": { - "name": "modified", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - } - }, - "views": {}, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - }, - "internal": { - "indexes": {} - } -} \ No newline at end of file diff --git a/apps/web/db/drizzle/meta/0007_snapshot.json b/apps/web/db/drizzle/meta/0007_snapshot.json deleted file mode 100644 index fd808b4..0000000 --- a/apps/web/db/drizzle/meta/0007_snapshot.json +++ /dev/null @@ -1,317 +0,0 @@ -{ - "version": "6", - "dialect": "sqlite", - "id": "5d0b0ba7-935d-4a87-96ab-196d84605482", - "prevId": "da6f951c-777b-4561-a816-aa814502a02b", - "tables": { - "app": { - "name": "app", - "columns": { - "k": { - "name": "k", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "v": { - "name": "v", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "follow": { - "name": "follow", - "columns": { - "followed_by": { - "name": "followed_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "follows": { - "name": "follows", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "followedby_idx": { - "name": "followedby_idx", - "columns": [ - "followed_by" - ], - "isUnique": false - } - }, - "foreignKeys": { - "follow_followed_by_user_did_fk": { - "name": "follow_followed_by_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", - "columnsFrom": [ - "followed_by" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "follow_follows_user_did_fk": { - "name": "follow_follows_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", - "columnsFrom": [ - "follows" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "follow_follows_followed_by_pk": { - "columns": [ - "follows", - "followed_by" - ], - "name": "follow_follows_followed_by_pk" - } - }, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post_data": { - "name": "post_data", - "columns": { - "post_id": { - "name": "post_id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "type": { - "name": "type", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "value": { - "name": "value", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "post_idx": { - "name": "post_idx", - "columns": [ - "post_id" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post": { - "name": "post", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "author_id": { - "name": "author_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created": { - "name": "created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - }, - "modified": { - "name": "modified", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - } - }, - "indexes": {}, - "foreignKeys": { - "post_author_id_user_did_fk": { - "name": "post_author_id_user_did_fk", - "tableFrom": "post", - "tableTo": "user", - "columnsFrom": [ - "author_id" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post_tag": { - "name": "post_tag", - "columns": { - "tag_id": { - "name": "tag_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "post_id": { - "name": "post_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "probability": { - "name": "probability", - "type": "real", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "post_tag_tag_id_tag_id_fk": { - "name": "post_tag_tag_id_tag_id_fk", - "tableFrom": "post_tag", - "tableTo": "tag", - "columnsFrom": [ - "tag_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "post_tag_post_id_post_id_fk": { - "name": "post_tag_post_id_post_id_fk", - "tableFrom": "post_tag", - "tableTo": "post", - "columnsFrom": [ - "post_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "post_tag_post_id_tag_id_pk": { - "columns": [ - "post_id", - "tag_id" - ], - "name": "post_tag_post_id_tag_id_pk" - } - }, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "tag": { - "name": "tag", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "user": { - "name": "user", - "columns": { - "did": { - "name": "did", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "modified": { - "name": "modified", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - } - }, - "views": {}, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - }, - "internal": { - "indexes": {} - } -} \ No newline at end of file diff --git a/apps/web/db/drizzle/meta/0008_snapshot.json b/apps/web/db/drizzle/meta/0008_snapshot.json deleted file mode 100644 index 9b1bbac..0000000 --- a/apps/web/db/drizzle/meta/0008_snapshot.json +++ /dev/null @@ -1,319 +0,0 @@ -{ - "version": "6", - "dialect": "sqlite", - "id": "69149008-c187-4f4f-acfc-86c339f41cb3", - "prevId": "5d0b0ba7-935d-4a87-96ab-196d84605482", - "tables": { - "app": { - "name": "app", - "columns": { - "k": { - "name": "k", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "v": { - "name": "v", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "follow": { - "name": "follow", - "columns": { - "followed_by": { - "name": "followed_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "follows": { - "name": "follows", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "followedby_idx": { - "name": "followedby_idx", - "columns": [ - "followed_by" - ], - "isUnique": false - } - }, - "foreignKeys": { - "follow_followed_by_user_did_fk": { - "name": "follow_followed_by_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", - "columnsFrom": [ - "followed_by" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "follow_follows_user_did_fk": { - "name": "follow_follows_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", - "columnsFrom": [ - "follows" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "follow_follows_followed_by_pk": { - "columns": [ - "follows", - "followed_by" - ], - "name": "follow_follows_followed_by_pk" - } - }, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post": { - "name": "post", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "author_id": { - "name": "author_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created": { - "name": "created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - }, - "modified": { - "name": "modified", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - } - }, - "indexes": {}, - "foreignKeys": { - "post_author_id_user_did_fk": { - "name": "post_author_id_user_did_fk", - "tableFrom": "post", - "tableTo": "user", - "columnsFrom": [ - "author_id" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post_tag": { - "name": "post_tag", - "columns": { - "tag_id": { - "name": "tag_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "post_id": { - "name": "post_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "probability": { - "name": "probability", - "type": "real", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "post_tag_tag_id_tag_id_fk": { - "name": "post_tag_tag_id_tag_id_fk", - "tableFrom": "post_tag", - "tableTo": "tag", - "columnsFrom": [ - "tag_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "post_tag_post_id_post_id_fk": { - "name": "post_tag_post_id_post_id_fk", - "tableFrom": "post_tag", - "tableTo": "post", - "columnsFrom": [ - "post_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "post_tag_post_id_tag_id_pk": { - "columns": [ - "post_id", - "tag_id" - ], - "name": "post_tag_post_id_tag_id_pk" - } - }, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post_queue": { - "name": "post_queue", - "columns": { - "post_id": { - "name": "post_id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "type": { - "name": "type", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "value": { - "name": "value", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "post_idx": { - "name": "post_idx", - "columns": [ - "post_id" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "tag": { - "name": "tag", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "user": { - "name": "user", - "columns": { - "did": { - "name": "did", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "modified": { - "name": "modified", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - } - }, - "views": {}, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": { - "\"post_data\"": "\"post_queue\"" - }, - "columns": {} - }, - "internal": { - "indexes": {} - } -} \ No newline at end of file diff --git a/apps/web/db/drizzle/meta/0009_snapshot.json b/apps/web/db/drizzle/meta/0009_snapshot.json deleted file mode 100644 index 65a27aa..0000000 --- a/apps/web/db/drizzle/meta/0009_snapshot.json +++ /dev/null @@ -1,303 +0,0 @@ -{ - "version": "6", - "dialect": "sqlite", - "id": "ec42ebc4-c344-4ad8-b5c8-8916b4867068", - "prevId": "69149008-c187-4f4f-acfc-86c339f41cb3", - "tables": { - "app": { - "name": "app", - "columns": { - "k": { - "name": "k", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "v": { - "name": "v", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "follow": { - "name": "follow", - "columns": { - "followed_by": { - "name": "followed_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "follows": { - "name": "follows", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "followedby_idx": { - "name": "followedby_idx", - "columns": [ - "followed_by" - ], - "isUnique": false - } - }, - "foreignKeys": { - "follow_followed_by_user_did_fk": { - "name": "follow_followed_by_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", - "columnsFrom": [ - "followed_by" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "follow_follows_user_did_fk": { - "name": "follow_follows_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", - "columnsFrom": [ - "follows" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "follow_follows_followed_by_pk": { - "columns": [ - "follows", - "followed_by" - ], - "name": "follow_follows_followed_by_pk" - } - }, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post": { - "name": "post", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "author_id": { - "name": "author_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created": { - "name": "created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - }, - "modified": { - "name": "modified", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post_tag": { - "name": "post_tag", - "columns": { - "tag_id": { - "name": "tag_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "post_id": { - "name": "post_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "probability": { - "name": "probability", - "type": "real", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "post_tag_tag_id_tag_id_fk": { - "name": "post_tag_tag_id_tag_id_fk", - "tableFrom": "post_tag", - "tableTo": "tag", - "columnsFrom": [ - "tag_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "post_tag_post_id_post_id_fk": { - "name": "post_tag_post_id_post_id_fk", - "tableFrom": "post_tag", - "tableTo": "post", - "columnsFrom": [ - "post_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "post_tag_post_id_tag_id_pk": { - "columns": [ - "post_id", - "tag_id" - ], - "name": "post_tag_post_id_tag_id_pk" - } - }, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post_queue": { - "name": "post_queue", - "columns": { - "post_id": { - "name": "post_id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "type": { - "name": "type", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "value": { - "name": "value", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "post_idx": { - "name": "post_idx", - "columns": [ - "post_id" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "tag": { - "name": "tag", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "user": { - "name": "user", - "columns": { - "did": { - "name": "did", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "modified": { - "name": "modified", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - } - }, - "views": {}, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - }, - "internal": { - "indexes": {} - } -} \ No newline at end of file diff --git a/apps/web/db/drizzle/meta/0010_snapshot.json b/apps/web/db/drizzle/meta/0010_snapshot.json deleted file mode 100644 index d29600e..0000000 --- a/apps/web/db/drizzle/meta/0010_snapshot.json +++ /dev/null @@ -1,290 +0,0 @@ -{ - "version": "6", - "dialect": "sqlite", - "id": "cd10b5bf-2e31-4641-bdfc-19fd88bec42e", - "prevId": "ec42ebc4-c344-4ad8-b5c8-8916b4867068", - "tables": { - "app": { - "name": "app", - "columns": { - "k": { - "name": "k", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "v": { - "name": "v", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "follow": { - "name": "follow", - "columns": { - "followed_by": { - "name": "followed_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "follows": { - "name": "follows", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "followedby_idx": { - "name": "followedby_idx", - "columns": [ - "followed_by" - ], - "isUnique": false - } - }, - "foreignKeys": { - "follow_followed_by_user_did_fk": { - "name": "follow_followed_by_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", - "columnsFrom": [ - "followed_by" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "follow_follows_followed_by_pk": { - "columns": [ - "follows", - "followed_by" - ], - "name": "follow_follows_followed_by_pk" - } - }, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post": { - "name": "post", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "author_id": { - "name": "author_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created": { - "name": "created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - }, - "modified": { - "name": "modified", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post_tag": { - "name": "post_tag", - "columns": { - "tag_id": { - "name": "tag_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "post_id": { - "name": "post_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "probability": { - "name": "probability", - "type": "real", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "post_tag_tag_id_tag_id_fk": { - "name": "post_tag_tag_id_tag_id_fk", - "tableFrom": "post_tag", - "tableTo": "tag", - "columnsFrom": [ - "tag_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "post_tag_post_id_post_id_fk": { - "name": "post_tag_post_id_post_id_fk", - "tableFrom": "post_tag", - "tableTo": "post", - "columnsFrom": [ - "post_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "post_tag_post_id_tag_id_pk": { - "columns": [ - "post_id", - "tag_id" - ], - "name": "post_tag_post_id_tag_id_pk" - } - }, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post_queue": { - "name": "post_queue", - "columns": { - "post_id": { - "name": "post_id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "type": { - "name": "type", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "value": { - "name": "value", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "post_idx": { - "name": "post_idx", - "columns": [ - "post_id" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "tag": { - "name": "tag", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "user": { - "name": "user", - "columns": { - "did": { - "name": "did", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "modified": { - "name": "modified", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - } - }, - "views": {}, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - }, - "internal": { - "indexes": {} - } -} \ No newline at end of file diff --git a/apps/web/db/drizzle/meta/_journal.json b/apps/web/db/drizzle/meta/_journal.json deleted file mode 100644 index fc727a7..0000000 --- a/apps/web/db/drizzle/meta/_journal.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "version": "7", - "dialect": "sqlite", - "entries": [ - { - "idx": 0, - "version": "6", - "when": 1734777195321, - "tag": "0000_equal_living_lightning", - "breakpoints": true - }, - { - "idx": 1, - "version": "6", - "when": 1734778152257, - "tag": "0001_slim_sister_grimm", - "breakpoints": true - }, - { - "idx": 2, - "version": "6", - "when": 1734778382151, - "tag": "0002_fair_captain_cross", - "breakpoints": true - }, - { - "idx": 3, - "version": "6", - "when": 1734778476053, - "tag": "0003_foamy_swordsman", - "breakpoints": true - }, - { - "idx": 4, - "version": "6", - "when": 1734785140860, - "tag": "0004_fixed_harrier", - "breakpoints": true - }, - { - "idx": 5, - "version": "6", - "when": 1734790233945, - "tag": "0005_safe_vin_gonzales", - "breakpoints": true - }, - { - "idx": 6, - "version": "6", - "when": 1734798238305, - "tag": "0006_milky_white_queen", - "breakpoints": true - }, - { - "idx": 7, - "version": "6", - "when": 1734812702811, - "tag": "0007_sudden_dark_phoenix", - "breakpoints": true - }, - { - "idx": 8, - "version": "6", - "when": 1734812798498, - "tag": "0008_redundant_spectrum", - "breakpoints": true - }, - { - "idx": 9, - "version": "6", - "when": 1734812969373, - "tag": "0009_skinny_cerebro", - "breakpoints": true - }, - { - "idx": 10, - "version": "6", - "when": 1734813044639, - "tag": "0010_sad_salo", - "breakpoints": true - } - ] -} \ No newline at end of file diff --git a/apps/web/db/schema.ts b/apps/web/db/schema.ts deleted file mode 100644 index 66bc185..0000000 --- a/apps/web/db/schema.ts +++ /dev/null @@ -1,137 +0,0 @@ -import type { AppBskyFeedPost } from "@atproto/api"; -import { relations, sql } from "drizzle-orm"; -import { - index, - primaryKey, - real, - sqliteTable, - text, -} from "drizzle-orm/sqlite-core"; - -export const appData = sqliteTable( - "app", - { - k: text("k", { enum: ["session"] }).primaryKey(), - v: text("v", { - mode: "json", - }), - }, - (t) => [] -); - -export const followTable = sqliteTable( - "follow", - { - followedBy: text("followed_by") - .notNull() - .references(() => userTable.did), - follows: text("follows").notNull(), - }, - (t) => [ - primaryKey({ - columns: [t.follows, t.followedBy], - }), - index("followedby_idx").on(t.followedBy), - ] -); - -export const postTable = sqliteTable( - "post", - { - id: text().primaryKey(), // bluesky post id - authorId: text("author_id").notNull(), - created: text() - .default(sql`(CURRENT_TIMESTAMP)`) - .notNull(), - modified: text() - .default(sql`(CURRENT_TIMESTAMP)`) - .notNull(), - }, - () => [] -); - -// Should be deleted after processing -export const post_queue = sqliteTable( - "post_queue", - { - postId: text("post_id").primaryKey(), - type: text({ - enum: ["AppBskyFeedPost.Record"], - }).notNull(), - value: text({ mode: "json" }).$type(), - }, - (t) => [index("post_idx").on(t.postId)] -); - -export const tagTable = sqliteTable( - "tag", - { - id: text().primaryKey(), - description: text(), - }, - () => [] -); - -export const postTags = sqliteTable( - "post_tag", - { - tagId: text("tag_id") - .notNull() - .references(() => tagTable.id), - postId: text("post_id") - .notNull() - .references(() => postTable.id), - probability: real(), - }, - (t) => [primaryKey({ columns: [t.postId, t.tagId] })] -); - -export const userTable = sqliteTable( - "user", - { - did: text("did").primaryKey(), - modified: text() - .default(sql`(CURRENT_TIMESTAMP)`) - .notNull(), - }, - () => [] -); - -export const postsToTagsRelations = relations(postTags, ({ one }) => ({ - post: one(postTable, { - fields: [postTags.postId], - references: [postTable.id], - }), - tag: one(tagTable, { - fields: [postTags.tagId], - references: [tagTable.id], - }), -})); - -export const postRelations = relations(postTable, ({ one, many }) => ({ - author: one(userTable, { - fields: [postTable.authorId], - references: [userTable.did], - }), - // TODO: add followedby - unprocessed: one(post_queue, { - fields: [postTable.id], - references: [post_queue.postId], - }), - tags: many(postTags), -})); - -export const tagRelations = relations(tagTable, ({ one, many }) => ({ - posts: many(postTags), -})); - -export const followTableRelations = relations(followTable, ({ one }) => ({ - follower: one(userTable, { - fields: [followTable.followedBy], - references: [userTable.did], - }), - follwedBy: one(userTable, { - fields: [followTable.follows], - references: [userTable.did], - }), -})); diff --git a/apps/web/drizzle.config.ts b/apps/web/drizzle.config.ts index d2f9bb1..3ac90c8 100644 --- a/apps/web/drizzle.config.ts +++ b/apps/web/drizzle.config.ts @@ -1,10 +1,12 @@ import { defineConfig } from "drizzle-kit"; export default defineConfig({ - dialect: "sqlite", + dialect: "postgresql", schema: "./db/schema.ts", out: "./db/drizzle", dbCredentials: { - url: "./app.db", + url: + process.env["PG_URL"] ?? + "postgres://devuser:devpass@localhost:5432/devdb", }, }); diff --git a/apps/web/package.json b/apps/web/package.json index 4e712ef..80204e0 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -3,16 +3,11 @@ "type": "module", "version": "0.0.1", "scripts": { - "dev": "bunx --bun astro dev", + "dev": "bun --env-file=../../.env --bun astro dev", "build": "astro build", "server": "bun run-server.mjs", "preview": "astro preview", - "astro": "astro", - "db:generate": "bunx drizzle-kit generate", - "db:migrate": "bunx drizzle-kit migrate", - "db:studio": "bunx drizzle-kit studio", - "db:update": "bunx drizzle-kit generate && bunx drizzle-kit migrate", - "db:wipe": "rm -rf db/drizzle app.db" + "astro": "astro" }, "dependencies": { "@andrioid/atproto": "workspace:*", @@ -25,8 +20,9 @@ "@atproto/oauth-client-node": "^0.2.3", "@atproto/xrpc-server": "^0.7.3", "astro": "5.1.1", - "atutils": "workspace:*", + "drizzle-orm": "^0.38.2", "express": "^4.21.2", + "postgres": "^3.4.5", "react": "^19.0.0", "react-dom": "^19.0.0", "tailwindcss": "^3.4.16" diff --git a/apps/web/scripts/run-server.ts b/apps/web/scripts/run-server.ts index 4e97ef9..e11eea0 100644 --- a/apps/web/scripts/run-server.ts +++ b/apps/web/scripts/run-server.ts @@ -1,10 +1,9 @@ // @ts-check import express from "express"; -import { handler as ssrHandler } from "./dist/server/entry.mjs"; - +import { handler as ssrHandler } from "../dist/server/entry.mjs"; const app = express(); -app.use("/", express.static('dist/client/')) +app.use("/", express.static("dist/client/")); app.use(ssrHandler); -app.listen(process.env["port"] ?? 8080) \ No newline at end of file +app.listen(process.env["port"] ?? 8080); diff --git a/apps/web/src/actions/index.ts b/apps/web/src/actions/index.ts index 34aafc9..55e2f16 100644 --- a/apps/web/src/actions/index.ts +++ b/apps/web/src/actions/index.ts @@ -1,3 +1,4 @@ +import { classifyPost } from "@andrioid/atproto"; import { defineAction } from "astro:actions"; import { z } from "astro:schema"; @@ -19,4 +20,20 @@ export const server = { return true; }, }), + classifyManually: defineAction({ + input: z.object({ + postUri: z.string(), + match: z.boolean(), + tag: z.string().default("tech"), + }), + handler: async (input, ctx) => { + await classifyPost(ctx.locals.at, { + postUri: input.postUri, + algorithm: "manual", + score: input.match ? 100 : 0, + tag: "tech", + }); + // insert a manual tag on the post + }, + }), }; diff --git a/apps/web/src/base.css b/apps/web/src/base.css new file mode 100644 index 0000000..9627217 --- /dev/null +++ b/apps/web/src/base.css @@ -0,0 +1,4 @@ +/* The integration's default injected base.css file */ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/apps/web/src/config.ts b/apps/web/src/config.ts deleted file mode 100644 index ca144be..0000000 --- a/apps/web/src/config.ts +++ /dev/null @@ -1,14 +0,0 @@ -export const config = (() => { - const identifier = process.env["DID_HANDLE"]; - const password = process.env["DID_PASSWORD"]; - const port = process.env["port"] ?? 8080; - - if (!identifier || !password) throw Error("Missing config"); - - // TODO: Make this understand DEV vs Server - return { - identifier, - password, - port, - }; -})(); diff --git a/apps/web/src/layouts/Layout.astro b/apps/web/src/layouts/Layout.astro index e455c61..32b27f0 100644 --- a/apps/web/src/layouts/Layout.astro +++ b/apps/web/src/layouts/Layout.astro @@ -1,22 +1,26 @@ +--- +import "../base.css"; +--- + - - - - - - Astro Basics - - - - + + + + + + Astro Basics + + + + diff --git a/packages/atproto/api/well-known-did.ts b/apps/web/src/pages/.well-known/did.json.ts similarity index 70% rename from packages/atproto/api/well-known-did.ts rename to apps/web/src/pages/.well-known/did.json.ts index 264a965..c22f824 100644 --- a/packages/atproto/api/well-known-did.ts +++ b/apps/web/src/pages/.well-known/did.json.ts @@ -1,7 +1,7 @@ -import { config } from "../config"; -import type { HandlerFn } from "./types"; +import { config } from "@andrioid/atproto/config"; +import type { APIRoute } from "astro"; -export const wellKnownDidHandler: HandlerFn = async (req) => { +export const GET: APIRoute = async ({ request }) => { const res = Response.json({ "@context": ["https://www.w3.org/ns/did/v1"], id: config.feedGenDid, diff --git a/apps/web/src/pages/_react/post-moderator.tsx b/apps/web/src/pages/_react/post-moderator.tsx new file mode 100644 index 0000000..16f185c --- /dev/null +++ b/apps/web/src/pages/_react/post-moderator.tsx @@ -0,0 +1,53 @@ +import { AtUri } from "@atproto/api"; +import { actions } from "astro:actions"; +import { useTransition } from "react"; + +export function PostModerator({ + postId, + text, +}: { + postId: string; + text: string; +}) { + const [isPending, startTransition] = useTransition(); + + const atUri = new AtUri(postId); + const postUrl = `https://bsky.app/profile/${atUri.hostname}/post/${atUri.rkey}`; + + async function onClassifyHandler(isMatch: boolean) { + return actions.classifyManually({ + match: isMatch, + postUri: postId, + tag: "tech", + }); + } + + return ( +

+
+ +
{text}
+
Tags
+
+
+ + +
+
+ ); +} diff --git a/apps/web/src/pages/index.astro b/apps/web/src/pages/index.astro index afcf7a2..5646c60 100644 --- a/apps/web/src/pages/index.astro +++ b/apps/web/src/pages/index.astro @@ -1,8 +1,6 @@ --- -import { helloFromAtUtils } from "atutils"; import Layout from "../layouts/Layout.astro"; import { JetStream } from "./_react/jetstream"; -helloFromAtUtils(); // Welcome to Astro! Wondering what to do next? Check out the Astro documentation at https://docs.astro.build // Don't want to use any of this? Delete everything in this file, the `assets`, `components`, and `layouts` directories, and start fresh. --- diff --git a/apps/web/src/pages/mrq.astro b/apps/web/src/pages/mrq.astro new file mode 100644 index 0000000..a14d7b4 --- /dev/null +++ b/apps/web/src/pages/mrq.astro @@ -0,0 +1,35 @@ +--- +import { + postRecords, + postScores, + postTable, +} from "@andrioid/atproto/db/schema"; +import { desc, eq } from "drizzle-orm/expressions"; +import Layout from "../layouts/Layout.astro"; +import { PostModerator } from "./_react/post-moderator"; +const db = Astro.locals.at.db; +const posts = await db + .select() + .from(postTable) + .innerJoin(postRecords, eq(postTable.id, postRecords.postId)) + .innerJoin(postScores, eq(postTable.id, postScores.postId)) + .orderBy(desc(postTable.created)) + .limit(50); +--- + + +
+ { + posts.map((r) => ( + + )) + } +
+
+ + diff --git a/packages/atproto/api/get-feed-skeleton.ts b/apps/web/src/pages/xrpc/app.bsky.feed.getFeedSkeleton.ts similarity index 66% rename from packages/atproto/api/get-feed-skeleton.ts rename to apps/web/src/pages/xrpc/app.bsky.feed.getFeedSkeleton.ts index 46cd589..229b0cc 100644 --- a/packages/atproto/api/get-feed-skeleton.ts +++ b/apps/web/src/pages/xrpc/app.bsky.feed.getFeedSkeleton.ts @@ -1,10 +1,13 @@ +import { + getOrUpdateFollows, + getTechFollowingFeed, + jwtFromRequest, +} from "@andrioid/atproto"; import type { AppBskyFeedGetFeedSkeleton } from "@atproto/api"; -import { getFeedPosts } from "../domain/get-feed-posts"; -import { getOrUpdateFollows } from "../domain/get-or-update-follows"; -import { jwtFromRequest } from "../helpers/jwt"; -import type { HandlerFn } from "./types"; +import type { APIRoute } from "astro"; -export const getFeedSkeletonHandler: HandlerFn = async (req, ctx) => { +export const GET: APIRoute = async ({ request: req, locals }) => { + const ctx = locals.at; const jwt = jwtFromRequest(req); // if (!jwt) // return new Response( @@ -14,7 +17,7 @@ export const getFeedSkeletonHandler: HandlerFn = async (req, ctx) => { // This should only be done once in a while, not every time const actor = jwt?.iss ?? "did:plc:rrrwbar3wv576qpsymwey5p5"; await getOrUpdateFollows(ctx, actor); - const posts = (await getFeedPosts(ctx, actor)).map((p) => ({ + const posts = (await getTechFollowingFeed(ctx, actor)).map((p) => ({ post: p, })); diff --git a/apps/web/zstd_dictionary.dat b/apps/web/zstd_dictionary.dat deleted file mode 100644 index 106847e7007b4ac409fd58912fed85d69aedb352..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112640 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 NGcW*;mlJ#98UX)HUhe<^ diff --git a/bun.lockb b/bun.lockb index 38b27deb45193b6023f466d2fc4b49d31c361ecb..dd85f7f707dd3a76ca613e4c4ff87f919d0f3ec7 100755 GIT binary patch delta 62104 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 delta 60175 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 D4mj2k diff --git a/package.json b/package.json index ddf30ab..feae629 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,9 @@ "module": "index.ts", "type": "module", "private": true, + "scripts": { + "dev": "bun --filter '*' dev" + }, "devDependencies": { "@types/bun": "latest" }, diff --git a/packages/atproto/api/types.ts b/packages/atproto/api/types.ts deleted file mode 100644 index 4f753d7..0000000 --- a/packages/atproto/api/types.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { AtContext } from "../context"; - -export type HandlerFn = (req: Request, ctx: AtContext) => Promise; diff --git a/packages/atproto/app.db b/packages/atproto/app.db deleted file mode 100644 index caf385c56f9522b2786cd0190807bcc4012332db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 335872 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.pCHdgQqg31C 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 diff --git a/packages/atproto/classifiers/tech/github-links.ts b/packages/atproto/classifiers/tech/github-links.ts new file mode 100644 index 0000000..11badac --- /dev/null +++ b/packages/atproto/classifiers/tech/github-links.ts @@ -0,0 +1,20 @@ +import type { AppBskyEmbedExternal } from "@atproto/api"; +import type { ClassifierFn } from "../types"; + +export const gitHubLinkClassifier: ClassifierFn = async ({ ctx, post }) => { + if (!post.record.embed?.external) return notInterested; + const external = post.record.embed?.external as AppBskyEmbedExternal.External; + if (external.uri.match(/^https:\/\/(www\.)?github.com/)) { + return { + score: 80, + tag: "tech", + }; + } + // Not interested + return notInterested; +}; + +const notInterested = { + score: null, + tag: "tech", +} as const; diff --git a/packages/atproto/classifiers/tech/muted-words.ts b/packages/atproto/classifiers/tech/muted-words.ts new file mode 100644 index 0000000..9832c7a --- /dev/null +++ b/packages/atproto/classifiers/tech/muted-words.ts @@ -0,0 +1,13 @@ +import type { ClassifierFn } from "../types"; + +const matcher = new RegExp(/\b(trump|election|government|politics|erotic)\b/i); +export const mutedWordsClassifier: ClassifierFn = async ({ ctx, post }) => { + let score = null; + if (matcher.test(post.record.text)) { + return { score: 0, tag: "tech" }; + } + return { + score: null, + tag: "tech", + }; +}; diff --git a/packages/atproto/classifiers/tech/tech-words.ts b/packages/atproto/classifiers/tech/tech-words.ts new file mode 100644 index 0000000..8788f86 --- /dev/null +++ b/packages/atproto/classifiers/tech/tech-words.ts @@ -0,0 +1,17 @@ +import type { ClassifierFn } from "../types"; + +const matcher = new RegExp( + /\b(typescript|php|c#|refactor|graphql|atproto|in\ code|engineering\ team|tree\ shakable|ISO\ 8601)|algorithms|algorithm\b/i +); + +/** Very simple with whitelisted words. Will be replaced later. */ +export const techWordsRegExp: ClassifierFn = async ({ ctx, post }) => { + let score = null; + if (matcher.test(post.record.text)) { + return { score: 85, tag: "tech" }; + } + return { + score: null, + tag: "tech", + }; +}; diff --git a/packages/atproto/classifiers/types.ts b/packages/atproto/classifiers/types.ts new file mode 100644 index 0000000..0777a7c --- /dev/null +++ b/packages/atproto/classifiers/types.ts @@ -0,0 +1,12 @@ +import type { AtContext } from "../context"; +import type { FeedPostWithUri } from "../domain/queue-for-classification"; + +export type ClassifierFn = (args: { + ctx: AtContext; + post: FeedPostWithUri; +}) => Promise<{ + score: number | null; // null if not interested + tag: ClassifierTags; +}>; + +export type ClassifierTags = "tech"; diff --git a/packages/atproto/config.ts b/packages/atproto/config.ts index 3a75bf9..a3788bf 100644 --- a/packages/atproto/config.ts +++ b/packages/atproto/config.ts @@ -3,9 +3,10 @@ export const config = (() => { const password = process.env["DID_PASSWORD"]; const port = process.env["PORT"] ?? 3000; const fgHostname = - process.env["FEEDGEN_HOSTNAME"] ?? "2a21-87-104-249-212.ngrok-free.app"; + process.env["FEEDGEN_HOSTNAME"] ?? "857d-87-104-249-212.ngrok-free.app"; const recordName = "testfeed"; - const sqliteFile = process.env["SQLITE_FILE"] ?? "app.db"; + const pgURL = + process.env["PG_URL"] ?? "postgres://devuser:devpass@localhost:5432/devdb"; if (!identifier || !password) throw Error("DID_HANDLE or DID_PASSWORD missing"); @@ -17,6 +18,6 @@ export const config = (() => { feedGenDid: process.env.FEEDGEN_SERVICE_DID ?? `did:web:${fgHostname}`, feedGenHostname: fgHostname, recordName, - sqliteFile, + pgURL, }; })(); diff --git a/packages/atproto/context.ts b/packages/atproto/context.ts index b434b34..8f6c2e4 100644 --- a/packages/atproto/context.ts +++ b/packages/atproto/context.ts @@ -1,15 +1,18 @@ import { AtpAgent, type AtpSessionData } from "@atproto/api"; import { eq } from "drizzle-orm"; +import { drizzle } from "drizzle-orm/postgres-js"; import { config } from "./config"; -import { db } from "./db/db"; import { appData } from "./db/schema"; export async function createAtContext() { + const db = drizzle(config.pgURL); const atpAgent = new AtpAgent({ service: "https://bsky.social", // TODO: look up actual pds - persistSession: (evt, sessionData) => { + persistSession: async (evt, sessionData) => { if (!sessionData) return; - db.insert(appData) + console.log("[atproto] storing session"); + await db + .insert(appData) .values({ k: "session", v: sessionData, @@ -32,7 +35,9 @@ export async function createAtContext() { if (existingSession.length === 1) { const sdata = existingSession[0] .existingSession as unknown as AtpSessionData; + console.log("[atproto] attempting to reuse session"); const res = await atpAgent.resumeSession(sdata); + //process.exit(1); } else { await atpAgent.login({ @@ -43,11 +48,15 @@ export async function createAtContext() { const ctx = { atpAgent, - db: db, + db: drizzle(process.env["PG_URL"] ?? "fail"), }; return ctx; } catch (err) { + // Last ditch attempt + console.log( + "[atproto] encountered problem with normal login flow, last ditch" + ); await atpAgent.login({ identifier: config.identifier, password: config.password, diff --git a/packages/atproto/db/db.ts b/packages/atproto/db/db.ts deleted file mode 100644 index 30adb46..0000000 --- a/packages/atproto/db/db.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Database } from "bun:sqlite"; -import { drizzle } from "drizzle-orm/bun-sqlite"; -import { config } from "../config"; -const sqlite = new Database(config.sqliteFile); -export const db = drizzle({ - client: sqlite, -}); diff --git a/packages/atproto/db/drizzle/0000_equal_living_lightning.sql b/packages/atproto/db/drizzle/0000_equal_living_lightning.sql deleted file mode 100644 index de3b82e..0000000 --- a/packages/atproto/db/drizzle/0000_equal_living_lightning.sql +++ /dev/null @@ -1,41 +0,0 @@ -CREATE TABLE `follow` ( - `followed_by` text NOT NULL, - `follows` text NOT NULL, - `modified` text DEFAULT (CURRENT_TIMESTAMP) NOT NULL, - PRIMARY KEY(`follows`, `followed_by`), - FOREIGN KEY (`followed_by`) REFERENCES `user`(`did`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`follows`) REFERENCES `user`(`did`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE TABLE `post_data` ( - `post_id` text, - FOREIGN KEY (`post_id`) REFERENCES `post`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE UNIQUE INDEX `post_data_post_id_unique` ON `post_data` (`post_id`);--> statement-breakpoint -CREATE TABLE `post` ( - `id` text PRIMARY KEY NOT NULL, - `author_id` text, - `created` text DEFAULT (CURRENT_TIMESTAMP) NOT NULL, - `modified` text DEFAULT (CURRENT_TIMESTAMP) NOT NULL, - FOREIGN KEY (`author_id`) REFERENCES `user`(`did`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE TABLE `post_tag` ( - `tag_id` text NOT NULL, - `post_id` text NOT NULL, - `probability` real, - PRIMARY KEY(`post_id`, `tag_id`), - FOREIGN KEY (`tag_id`) REFERENCES `tag`(`id`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`post_id`) REFERENCES `post`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE TABLE `tag` ( - `id` text PRIMARY KEY NOT NULL, - `description` text -); ---> statement-breakpoint -CREATE TABLE `user` ( - `did` text PRIMARY KEY NOT NULL, - `modified` text DEFAULT (CURRENT_TIMESTAMP) NOT NULL -); diff --git a/packages/atproto/db/drizzle/0000_public_pride.sql b/packages/atproto/db/drizzle/0000_public_pride.sql new file mode 100644 index 0000000..ce918c2 --- /dev/null +++ b/packages/atproto/db/drizzle/0000_public_pride.sql @@ -0,0 +1,46 @@ +CREATE TABLE "app" ( + "k" text PRIMARY KEY NOT NULL, + "v" jsonb +); +--> statement-breakpoint +CREATE TABLE "follow" ( + "followed_by" text NOT NULL, + "follows" text NOT NULL, + CONSTRAINT "follow_follows_followed_by_pk" PRIMARY KEY("follows","followed_by") +); +--> statement-breakpoint +CREATE TABLE "post" ( + "id" text PRIMARY KEY NOT NULL, + "author_id" text NOT NULL, + "created" text DEFAULT (CURRENT_TIMESTAMP) NOT NULL, + "modified" text DEFAULT (CURRENT_TIMESTAMP) NOT NULL +); +--> statement-breakpoint +CREATE TABLE "post_tag" ( + "tag_id" text NOT NULL, + "post_id" text NOT NULL, + "probability" real, + CONSTRAINT "post_tag_post_id_tag_id_pk" PRIMARY KEY("post_id","tag_id") +); +--> statement-breakpoint +CREATE TABLE "post_queue" ( + "post_id" text PRIMARY KEY NOT NULL, + "type" text NOT NULL, + "value" jsonb +); +--> statement-breakpoint +CREATE TABLE "tag" ( + "id" text PRIMARY KEY NOT NULL, + "description" text +); +--> statement-breakpoint +CREATE TABLE "user" ( + "did" text PRIMARY KEY NOT NULL, + "modified" text DEFAULT (CURRENT_TIMESTAMP) NOT NULL +); +--> statement-breakpoint +ALTER TABLE "follow" ADD CONSTRAINT "follow_followed_by_user_did_fk" FOREIGN KEY ("followed_by") REFERENCES "public"."user"("did") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "post_tag" ADD CONSTRAINT "post_tag_tag_id_tag_id_fk" FOREIGN KEY ("tag_id") REFERENCES "public"."tag"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "post_tag" ADD CONSTRAINT "post_tag_post_id_post_id_fk" FOREIGN KEY ("post_id") REFERENCES "public"."post"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +CREATE INDEX "followedby_idx" ON "follow" USING btree ("followed_by");--> statement-breakpoint +CREATE INDEX "post_idx" ON "post_queue" USING btree ("post_id"); \ No newline at end of file diff --git a/packages/atproto/db/drizzle/0001_cultured_ultimates.sql b/packages/atproto/db/drizzle/0001_cultured_ultimates.sql new file mode 100644 index 0000000..3e528fd --- /dev/null +++ b/packages/atproto/db/drizzle/0001_cultured_ultimates.sql @@ -0,0 +1,2 @@ +ALTER TABLE "post_tag" DROP CONSTRAINT "post_tag_post_id_tag_id_pk";--> statement-breakpoint +CREATE INDEX "tagpost_idx" ON "post_tag" USING btree ("post_id","tag_id"); \ No newline at end of file diff --git a/packages/atproto/db/drizzle/0001_slim_sister_grimm.sql b/packages/atproto/db/drizzle/0001_slim_sister_grimm.sql deleted file mode 100644 index 4ea8316..0000000 --- a/packages/atproto/db/drizzle/0001_slim_sister_grimm.sql +++ /dev/null @@ -1,4 +0,0 @@ -DROP INDEX `post_data_post_id_unique`;--> statement-breakpoint -ALTER TABLE `post_data` ADD `type` text NOT NULL;--> statement-breakpoint -CREATE INDEX `post_idx` ON `post_data` (`post_id`);--> statement-breakpoint -ALTER TABLE `follow` DROP COLUMN `modified`; \ No newline at end of file diff --git a/packages/atproto/db/drizzle/0002_fair_captain_cross.sql b/packages/atproto/db/drizzle/0002_fair_captain_cross.sql deleted file mode 100644 index 2fc2028..0000000 --- a/packages/atproto/db/drizzle/0002_fair_captain_cross.sql +++ /dev/null @@ -1,13 +0,0 @@ -PRAGMA foreign_keys=OFF;--> statement-breakpoint -CREATE TABLE `__new_post` ( - `id` text PRIMARY KEY NOT NULL, - `author_id` text NOT NULL, - `created` text DEFAULT (CURRENT_TIMESTAMP) NOT NULL, - `modified` text DEFAULT (CURRENT_TIMESTAMP) NOT NULL, - FOREIGN KEY (`author_id`) REFERENCES `user`(`did`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -INSERT INTO `__new_post`("id", "author_id", "created", "modified") SELECT "id", "author_id", "created", "modified" FROM `post`;--> statement-breakpoint -DROP TABLE `post`;--> statement-breakpoint -ALTER TABLE `__new_post` RENAME TO `post`;--> statement-breakpoint -PRAGMA foreign_keys=ON; \ No newline at end of file diff --git a/packages/atproto/db/drizzle/0002_nifty_sharon_carter.sql b/packages/atproto/db/drizzle/0002_nifty_sharon_carter.sql new file mode 100644 index 0000000..8a0bfde --- /dev/null +++ b/packages/atproto/db/drizzle/0002_nifty_sharon_carter.sql @@ -0,0 +1,3 @@ +ALTER TABLE "post_tag" ALTER COLUMN "probability" SET DATA TYPE integer;--> statement-breakpoint +ALTER TABLE "post_tag" ALTER COLUMN "probability" SET NOT NULL;--> statement-breakpoint +ALTER TABLE "post_tag" ADD COLUMN "algo" text NOT NULL; \ No newline at end of file diff --git a/packages/atproto/db/drizzle/0003_foamy_swordsman.sql b/packages/atproto/db/drizzle/0003_foamy_swordsman.sql deleted file mode 100644 index 6a76f3b..0000000 --- a/packages/atproto/db/drizzle/0003_foamy_swordsman.sql +++ /dev/null @@ -1 +0,0 @@ -CREATE INDEX `followedby_idx` ON `follow` (`followed_by`); \ No newline at end of file diff --git a/packages/atproto/db/drizzle/0003_useful_infant_terrible.sql b/packages/atproto/db/drizzle/0003_useful_infant_terrible.sql new file mode 100644 index 0000000..b744024 --- /dev/null +++ b/packages/atproto/db/drizzle/0003_useful_infant_terrible.sql @@ -0,0 +1 @@ +ALTER TABLE "post_tag" RENAME COLUMN "probability" TO "score"; \ No newline at end of file diff --git a/packages/atproto/db/drizzle/0004_fixed_harrier.sql b/packages/atproto/db/drizzle/0004_fixed_harrier.sql deleted file mode 100644 index c2bbb2f..0000000 --- a/packages/atproto/db/drizzle/0004_fixed_harrier.sql +++ /dev/null @@ -1,4 +0,0 @@ -CREATE TABLE `app` ( - `k` text PRIMARY KEY NOT NULL, - `v` text -); diff --git a/packages/atproto/db/drizzle/0004_icy_scream.sql b/packages/atproto/db/drizzle/0004_icy_scream.sql new file mode 100644 index 0000000..e1d2c78 --- /dev/null +++ b/packages/atproto/db/drizzle/0004_icy_scream.sql @@ -0,0 +1,2 @@ +ALTER TABLE "post_queue" RENAME TO "post_records";--> statement-breakpoint +ALTER TABLE "post_records" ADD CONSTRAINT "post_records_post_id_post_id_fk" FOREIGN KEY ("post_id") REFERENCES "public"."post"("id") ON DELETE no action ON UPDATE no action; \ No newline at end of file diff --git a/packages/atproto/db/drizzle/0005_plain_liz_osborn.sql b/packages/atproto/db/drizzle/0005_plain_liz_osborn.sql new file mode 100644 index 0000000..522c6f8 --- /dev/null +++ b/packages/atproto/db/drizzle/0005_plain_liz_osborn.sql @@ -0,0 +1 @@ +ALTER TABLE "post_records" ADD COLUMN "cid" text NOT NULL; \ No newline at end of file diff --git a/packages/atproto/db/drizzle/0005_safe_vin_gonzales.sql b/packages/atproto/db/drizzle/0005_safe_vin_gonzales.sql deleted file mode 100644 index 1ee4ff3..0000000 --- a/packages/atproto/db/drizzle/0005_safe_vin_gonzales.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE `post_data` ADD `value` text; \ No newline at end of file diff --git a/packages/atproto/db/drizzle/0006_milky_white_queen.sql b/packages/atproto/db/drizzle/0006_milky_white_queen.sql deleted file mode 100644 index 855dc4e..0000000 --- a/packages/atproto/db/drizzle/0006_milky_white_queen.sql +++ /dev/null @@ -1,13 +0,0 @@ -PRAGMA foreign_keys=OFF;--> statement-breakpoint -CREATE TABLE `__new_post_data` ( - `post_id` text PRIMARY KEY NOT NULL, - `type` text NOT NULL, - `value` text, - FOREIGN KEY (`post_id`) REFERENCES `post`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -INSERT INTO `__new_post_data`("post_id", "type", "value") SELECT "post_id", "type", "value" FROM `post_data`;--> statement-breakpoint -DROP TABLE `post_data`;--> statement-breakpoint -ALTER TABLE `__new_post_data` RENAME TO `post_data`;--> statement-breakpoint -PRAGMA foreign_keys=ON;--> statement-breakpoint -CREATE INDEX `post_idx` ON `post_data` (`post_id`); \ No newline at end of file diff --git a/packages/atproto/db/drizzle/0006_productive_lizard.sql b/packages/atproto/db/drizzle/0006_productive_lizard.sql new file mode 100644 index 0000000..0a69fd7 --- /dev/null +++ b/packages/atproto/db/drizzle/0006_productive_lizard.sql @@ -0,0 +1,9 @@ +CREATE TABLE "post_ranking" ( + "post_id" text NOT NULL, + "tag_id" text, + "score" integer NOT NULL, + "algo" text NOT NULL +); +--> statement-breakpoint +ALTER TABLE "post_ranking" ADD CONSTRAINT "post_ranking_post_id_post_id_fk" FOREIGN KEY ("post_id") REFERENCES "public"."post"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "post_ranking" ADD CONSTRAINT "post_ranking_tag_id_tag_id_fk" FOREIGN KEY ("tag_id") REFERENCES "public"."tag"("id") ON DELETE no action ON UPDATE no action; \ No newline at end of file diff --git a/packages/atproto/db/drizzle/0007_busy_sabretooth.sql b/packages/atproto/db/drizzle/0007_busy_sabretooth.sql new file mode 100644 index 0000000..ffdf5a1 --- /dev/null +++ b/packages/atproto/db/drizzle/0007_busy_sabretooth.sql @@ -0,0 +1,4 @@ +ALTER TABLE "post_records" RENAME TO "post_record";--> statement-breakpoint +ALTER TABLE "post_record" DROP CONSTRAINT "post_records_post_id_post_id_fk"; +--> statement-breakpoint +ALTER TABLE "post_record" ADD CONSTRAINT "post_record_post_id_post_id_fk" FOREIGN KEY ("post_id") REFERENCES "public"."post"("id") ON DELETE no action ON UPDATE no action; \ No newline at end of file diff --git a/packages/atproto/db/drizzle/0007_sudden_dark_phoenix.sql b/packages/atproto/db/drizzle/0007_sudden_dark_phoenix.sql deleted file mode 100644 index 6cb6a97..0000000 --- a/packages/atproto/db/drizzle/0007_sudden_dark_phoenix.sql +++ /dev/null @@ -1,12 +0,0 @@ -PRAGMA foreign_keys=OFF;--> statement-breakpoint -CREATE TABLE `__new_post_data` ( - `post_id` text PRIMARY KEY NOT NULL, - `type` text NOT NULL, - `value` text -); ---> statement-breakpoint -INSERT INTO `__new_post_data`("post_id", "type", "value") SELECT "post_id", "type", "value" FROM `post_data`;--> statement-breakpoint -DROP TABLE `post_data`;--> statement-breakpoint -ALTER TABLE `__new_post_data` RENAME TO `post_data`;--> statement-breakpoint -PRAGMA foreign_keys=ON;--> statement-breakpoint -CREATE INDEX `post_idx` ON `post_data` (`post_id`); \ No newline at end of file diff --git a/packages/atproto/db/drizzle/0008_redundant_spectrum.sql b/packages/atproto/db/drizzle/0008_redundant_spectrum.sql deleted file mode 100644 index 753831b..0000000 --- a/packages/atproto/db/drizzle/0008_redundant_spectrum.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE `post_data` RENAME TO `post_queue`; \ No newline at end of file diff --git a/packages/atproto/db/drizzle/0008_steep_scourge.sql b/packages/atproto/db/drizzle/0008_steep_scourge.sql new file mode 100644 index 0000000..e00f386 --- /dev/null +++ b/packages/atproto/db/drizzle/0008_steep_scourge.sql @@ -0,0 +1 @@ +ALTER TABLE "post_tag" ADD CONSTRAINT "post_tag_algo_post_id_tag_id_unique" UNIQUE("algo","post_id","tag_id"); \ No newline at end of file diff --git a/packages/atproto/db/drizzle/0009_rich_manta.sql b/packages/atproto/db/drizzle/0009_rich_manta.sql new file mode 100644 index 0000000..c9a3ea3 --- /dev/null +++ b/packages/atproto/db/drizzle/0009_rich_manta.sql @@ -0,0 +1 @@ +CREATE VIEW "public"."posts_with_tags" AS (select "id" from "post"); \ No newline at end of file diff --git a/packages/atproto/db/drizzle/0009_skinny_cerebro.sql b/packages/atproto/db/drizzle/0009_skinny_cerebro.sql deleted file mode 100644 index eb8adfc..0000000 --- a/packages/atproto/db/drizzle/0009_skinny_cerebro.sql +++ /dev/null @@ -1,12 +0,0 @@ -PRAGMA foreign_keys=OFF;--> statement-breakpoint -CREATE TABLE `__new_post` ( - `id` text PRIMARY KEY NOT NULL, - `author_id` text NOT NULL, - `created` text DEFAULT (CURRENT_TIMESTAMP) NOT NULL, - `modified` text DEFAULT (CURRENT_TIMESTAMP) NOT NULL -); ---> statement-breakpoint -INSERT INTO `__new_post`("id", "author_id", "created", "modified") SELECT "id", "author_id", "created", "modified" FROM `post`;--> statement-breakpoint -DROP TABLE `post`;--> statement-breakpoint -ALTER TABLE `__new_post` RENAME TO `post`;--> statement-breakpoint -PRAGMA foreign_keys=ON; \ No newline at end of file diff --git a/packages/atproto/db/drizzle/0010_nifty_miss_america.sql b/packages/atproto/db/drizzle/0010_nifty_miss_america.sql new file mode 100644 index 0000000..f1e3446 --- /dev/null +++ b/packages/atproto/db/drizzle/0010_nifty_miss_america.sql @@ -0,0 +1 @@ +DROP VIEW "public"."posts_with_tags"; \ No newline at end of file diff --git a/packages/atproto/db/drizzle/0010_sad_salo.sql b/packages/atproto/db/drizzle/0010_sad_salo.sql deleted file mode 100644 index 3bbe845..0000000 --- a/packages/atproto/db/drizzle/0010_sad_salo.sql +++ /dev/null @@ -1,13 +0,0 @@ -PRAGMA foreign_keys=OFF;--> statement-breakpoint -CREATE TABLE `__new_follow` ( - `followed_by` text NOT NULL, - `follows` text NOT NULL, - PRIMARY KEY(`follows`, `followed_by`), - FOREIGN KEY (`followed_by`) REFERENCES `user`(`did`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -INSERT INTO `__new_follow`("followed_by", "follows") SELECT "followed_by", "follows" FROM `follow`;--> statement-breakpoint -DROP TABLE `follow`;--> statement-breakpoint -ALTER TABLE `__new_follow` RENAME TO `follow`;--> statement-breakpoint -PRAGMA foreign_keys=ON;--> statement-breakpoint -CREATE INDEX `followedby_idx` ON `follow` (`followed_by`); \ No newline at end of file diff --git a/packages/atproto/db/drizzle/0011_steep_namor.sql b/packages/atproto/db/drizzle/0011_steep_namor.sql new file mode 100644 index 0000000..a9579a9 --- /dev/null +++ b/packages/atproto/db/drizzle/0011_steep_namor.sql @@ -0,0 +1 @@ +CREATE VIEW "public"."posts_tag_avg" AS (select "post_id", "tag_id", round(avg("score"), 0) as "avg_score" from "post_tag" group by "post_tag"."post_id", "post_tag"."tag_id"); \ No newline at end of file diff --git a/packages/atproto/db/drizzle/0012_wonderful_tinkerer.sql b/packages/atproto/db/drizzle/0012_wonderful_tinkerer.sql new file mode 100644 index 0000000..c28d69e --- /dev/null +++ b/packages/atproto/db/drizzle/0012_wonderful_tinkerer.sql @@ -0,0 +1,2 @@ +DROP VIEW "public"."posts_tag_avg";--> statement-breakpoint +CREATE VIEW "public"."posts_tag_avg" AS (select "post_id", "tag_id", round(avg("score"), 0) as "avg_score", ARRAY_AGG(DISTINCT "algo") as "algos" from "post_tag" group by "post_tag"."post_id", "post_tag"."tag_id"); \ No newline at end of file diff --git a/packages/atproto/db/drizzle/meta/0000_snapshot.json b/packages/atproto/db/drizzle/meta/0000_snapshot.json index 796356f..177cb07 100644 --- a/packages/atproto/db/drizzle/meta/0000_snapshot.json +++ b/packages/atproto/db/drizzle/meta/0000_snapshot.json @@ -1,36 +1,68 @@ { - "version": "6", - "dialect": "sqlite", - "id": "f28baea5-3649-4a26-ac42-82d5571894ed", + "id": "faad4e12-f984-48b0-99f9-f22f21a99af0", "prevId": "00000000-0000-0000-0000-000000000000", + "version": "7", + "dialect": "postgresql", "tables": { - "follow": { + "public.app": { + "name": "app", + "schema": "", + "columns": { + "k": { + "name": "k", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "v": { + "name": "v", + "type": "jsonb", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.follow": { "name": "follow", + "schema": "", "columns": { "followed_by": { "name": "followed_by", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "follows": { "name": "follows", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "modified": { - "name": "modified", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(CURRENT_TIMESTAMP)" + "notNull": true + } + }, + "indexes": { + "followedby_idx": { + "name": "followedby_idx", + "columns": [ + { + "expression": "followed_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, - "indexes": {}, "foreignKeys": { "follow_followed_by_user_did_fk": { "name": "follow_followed_by_user_did_fk", @@ -44,95 +76,43 @@ ], "onDelete": "no action", "onUpdate": "no action" - }, - "follow_follows_user_did_fk": { - "name": "follow_follows_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", - "columnsFrom": [ - "follows" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" } }, "compositePrimaryKeys": { "follow_follows_followed_by_pk": { + "name": "follow_follows_followed_by_pk", "columns": [ "follows", "followed_by" - ], - "name": "follow_follows_followed_by_pk" - } - }, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post_data": { - "name": "post_data", - "columns": { - "post_id": { - "name": "post_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "post_data_post_id_unique": { - "name": "post_data_post_id_unique", - "columns": [ - "post_id" - ], - "isUnique": true + ] } }, - "foreignKeys": { - "post_data_post_id_post_id_fk": { - "name": "post_data_post_id_post_id_fk", - "tableFrom": "post_data", - "tableTo": "post", - "columnsFrom": [ - "post_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post": { + "public.post": { "name": "post", + "schema": "", "columns": { "id": { "name": "id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "author_id": { "name": "author_id", "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": true }, "created": { "name": "created", "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" }, "modified": { @@ -140,53 +120,38 @@ "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" } }, "indexes": {}, - "foreignKeys": { - "post_author_id_user_did_fk": { - "name": "post_author_id_user_did_fk", - "tableFrom": "post", - "tableTo": "user", - "columnsFrom": [ - "author_id" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, + "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post_tag": { + "public.post_tag": { "name": "post_tag", + "schema": "", "columns": { "tag_id": { "name": "tag_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "post_id": { "name": "post_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "probability": { "name": "probability", "type": "real", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, @@ -220,56 +185,105 @@ }, "compositePrimaryKeys": { "post_tag_post_id_tag_id_pk": { + "name": "post_tag_post_id_tag_id_pk", "columns": [ "post_id", "tag_id" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.post_queue": { + "name": "post_queue", + "schema": "", + "columns": { + "post_id": { + "name": "post_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "jsonb", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "post_idx": { + "name": "post_idx", + "columns": [ + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } ], - "name": "post_tag_post_id_tag_id_pk" + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "tag": { + "public.tag": { "name": "tag", + "schema": "", "columns": { "id": { "name": "id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "description": { "name": "description", "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "user": { + "public.user": { "name": "user", + "schema": "", "columns": { "did": { "name": "did", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "modified": { "name": "modified", "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" } }, @@ -277,17 +291,20 @@ "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false } }, - "views": {}, "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, "_meta": { + "columns": {}, "schemas": {}, - "tables": {}, - "columns": {} - }, - "internal": { - "indexes": {} + "tables": {} } } \ No newline at end of file diff --git a/packages/atproto/db/drizzle/meta/0001_snapshot.json b/packages/atproto/db/drizzle/meta/0001_snapshot.json index a47ac1a..7ed2705 100644 --- a/packages/atproto/db/drizzle/meta/0001_snapshot.json +++ b/packages/atproto/db/drizzle/meta/0001_snapshot.json @@ -1,28 +1,68 @@ { - "version": "6", - "dialect": "sqlite", - "id": "b71f2809-5f01-4370-8d00-c42f4bd56216", - "prevId": "f28baea5-3649-4a26-ac42-82d5571894ed", + "id": "353ee649-aa20-43f3-9357-c0afb42168ac", + "prevId": "faad4e12-f984-48b0-99f9-f22f21a99af0", + "version": "7", + "dialect": "postgresql", "tables": { - "follow": { + "public.app": { + "name": "app", + "schema": "", + "columns": { + "k": { + "name": "k", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "v": { + "name": "v", + "type": "jsonb", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.follow": { "name": "follow", + "schema": "", "columns": { "followed_by": { "name": "followed_by", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "follows": { "name": "follows", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true + } + }, + "indexes": { + "followedby_idx": { + "name": "followedby_idx", + "columns": [ + { + "expression": "followed_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, - "indexes": {}, "foreignKeys": { "follow_followed_by_user_did_fk": { "name": "follow_followed_by_user_did_fk", @@ -36,102 +76,43 @@ ], "onDelete": "no action", "onUpdate": "no action" - }, - "follow_follows_user_did_fk": { - "name": "follow_follows_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", - "columnsFrom": [ - "follows" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" } }, "compositePrimaryKeys": { "follow_follows_followed_by_pk": { + "name": "follow_follows_followed_by_pk", "columns": [ "follows", "followed_by" - ], - "name": "follow_follows_followed_by_pk" + ] } }, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post_data": { - "name": "post_data", - "columns": { - "post_id": { - "name": "post_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "type": { - "name": "type", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "post_idx": { - "name": "post_idx", - "columns": [ - "post_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "post_data_post_id_post_id_fk": { - "name": "post_data_post_id_post_id_fk", - "tableFrom": "post_data", - "tableTo": "post", - "columnsFrom": [ - "post_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post": { + "public.post": { "name": "post", + "schema": "", "columns": { "id": { "name": "id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "author_id": { "name": "author_id", "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": true }, "created": { "name": "created", "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" }, "modified": { @@ -139,56 +120,63 @@ "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" } }, "indexes": {}, - "foreignKeys": { - "post_author_id_user_did_fk": { - "name": "post_author_id_user_did_fk", - "tableFrom": "post", - "tableTo": "user", - "columnsFrom": [ - "author_id" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, + "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post_tag": { + "public.post_tag": { "name": "post_tag", + "schema": "", "columns": { "tag_id": { "name": "tag_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "post_id": { "name": "post_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "probability": { "name": "probability", "type": "real", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false + } + }, + "indexes": { + "tagpost_idx": { + "name": "tagpost_idx", + "columns": [ + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "tag_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, - "indexes": {}, "foreignKeys": { "post_tag_tag_id_tag_id_fk": { "name": "post_tag_tag_id_tag_id_fk", @@ -217,58 +205,99 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "post_tag_post_id_tag_id_pk": { + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.post_queue": { + "name": "post_queue", + "schema": "", + "columns": { + "post_id": { + "name": "post_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "jsonb", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "post_idx": { + "name": "post_idx", "columns": [ - "post_id", - "tag_id" + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } ], - "name": "post_tag_post_id_tag_id_pk" + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "tag": { + "public.tag": { "name": "tag", + "schema": "", "columns": { "id": { "name": "id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "description": { "name": "description", "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "user": { + "public.user": { "name": "user", + "schema": "", "columns": { "did": { "name": "did", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "modified": { "name": "modified", "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" } }, @@ -276,17 +305,20 @@ "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false } }, - "views": {}, "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, "_meta": { + "columns": {}, "schemas": {}, - "tables": {}, - "columns": {} - }, - "internal": { - "indexes": {} + "tables": {} } } \ No newline at end of file diff --git a/packages/atproto/db/drizzle/meta/0002_snapshot.json b/packages/atproto/db/drizzle/meta/0002_snapshot.json index c40025d..e9fd2d3 100644 --- a/packages/atproto/db/drizzle/meta/0002_snapshot.json +++ b/packages/atproto/db/drizzle/meta/0002_snapshot.json @@ -1,28 +1,68 @@ { - "version": "6", - "dialect": "sqlite", - "id": "15955115-bfb7-46d2-8201-0dbb0123e4a3", - "prevId": "b71f2809-5f01-4370-8d00-c42f4bd56216", + "id": "75391ffd-2485-447a-a592-11d52bf2b6bf", + "prevId": "353ee649-aa20-43f3-9357-c0afb42168ac", + "version": "7", + "dialect": "postgresql", "tables": { - "follow": { + "public.app": { + "name": "app", + "schema": "", + "columns": { + "k": { + "name": "k", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "v": { + "name": "v", + "type": "jsonb", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.follow": { "name": "follow", + "schema": "", "columns": { "followed_by": { "name": "followed_by", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "follows": { "name": "follows", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true + } + }, + "indexes": { + "followedby_idx": { + "name": "followedby_idx", + "columns": [ + { + "expression": "followed_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, - "indexes": {}, "foreignKeys": { "follow_followed_by_user_did_fk": { "name": "follow_followed_by_user_did_fk", @@ -36,102 +76,43 @@ ], "onDelete": "no action", "onUpdate": "no action" - }, - "follow_follows_user_did_fk": { - "name": "follow_follows_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", - "columnsFrom": [ - "follows" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" } }, "compositePrimaryKeys": { "follow_follows_followed_by_pk": { + "name": "follow_follows_followed_by_pk", "columns": [ "follows", "followed_by" - ], - "name": "follow_follows_followed_by_pk" + ] } }, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post_data": { - "name": "post_data", - "columns": { - "post_id": { - "name": "post_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "type": { - "name": "type", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "post_idx": { - "name": "post_idx", - "columns": [ - "post_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "post_data_post_id_post_id_fk": { - "name": "post_data_post_id_post_id_fk", - "tableFrom": "post_data", - "tableTo": "post", - "columnsFrom": [ - "post_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post": { + "public.post": { "name": "post", + "schema": "", "columns": { "id": { "name": "id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "author_id": { "name": "author_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "created": { "name": "created", "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" }, "modified": { @@ -139,56 +120,69 @@ "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" } }, "indexes": {}, - "foreignKeys": { - "post_author_id_user_did_fk": { - "name": "post_author_id_user_did_fk", - "tableFrom": "post", - "tableTo": "user", - "columnsFrom": [ - "author_id" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, + "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post_tag": { + "public.post_tag": { "name": "post_tag", + "schema": "", "columns": { "tag_id": { "name": "tag_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "post_id": { "name": "post_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "probability": { "name": "probability", - "type": "real", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": true + }, + "algo": { + "name": "algo", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "tagpost_idx": { + "name": "tagpost_idx", + "columns": [ + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "tag_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, - "indexes": {}, "foreignKeys": { "post_tag_tag_id_tag_id_fk": { "name": "post_tag_tag_id_tag_id_fk", @@ -217,58 +211,99 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "post_tag_post_id_tag_id_pk": { + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.post_queue": { + "name": "post_queue", + "schema": "", + "columns": { + "post_id": { + "name": "post_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "jsonb", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "post_idx": { + "name": "post_idx", "columns": [ - "post_id", - "tag_id" + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } ], - "name": "post_tag_post_id_tag_id_pk" + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "tag": { + "public.tag": { "name": "tag", + "schema": "", "columns": { "id": { "name": "id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "description": { "name": "description", "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "user": { + "public.user": { "name": "user", + "schema": "", "columns": { "did": { "name": "did", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "modified": { "name": "modified", "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" } }, @@ -276,17 +311,20 @@ "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false } }, - "views": {}, "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, "_meta": { + "columns": {}, "schemas": {}, - "tables": {}, - "columns": {} - }, - "internal": { - "indexes": {} + "tables": {} } } \ No newline at end of file diff --git a/packages/atproto/db/drizzle/meta/0003_snapshot.json b/packages/atproto/db/drizzle/meta/0003_snapshot.json index b9d1c21..75025c5 100644 --- a/packages/atproto/db/drizzle/meta/0003_snapshot.json +++ b/packages/atproto/db/drizzle/meta/0003_snapshot.json @@ -1,34 +1,66 @@ { - "version": "6", - "dialect": "sqlite", - "id": "e93a951d-60aa-40bc-bcbe-6d480f9dabe8", - "prevId": "15955115-bfb7-46d2-8201-0dbb0123e4a3", + "id": "91ea1a3f-747d-4e05-afa7-7ba5da99ac41", + "prevId": "75391ffd-2485-447a-a592-11d52bf2b6bf", + "version": "7", + "dialect": "postgresql", "tables": { - "follow": { + "public.app": { + "name": "app", + "schema": "", + "columns": { + "k": { + "name": "k", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "v": { + "name": "v", + "type": "jsonb", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.follow": { "name": "follow", + "schema": "", "columns": { "followed_by": { "name": "followed_by", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "follows": { "name": "follows", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true } }, "indexes": { "followedby_idx": { "name": "followedby_idx", "columns": [ - "followed_by" + { + "expression": "followed_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } ], - "isUnique": false + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, "foreignKeys": { @@ -44,102 +76,43 @@ ], "onDelete": "no action", "onUpdate": "no action" - }, - "follow_follows_user_did_fk": { - "name": "follow_follows_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", - "columnsFrom": [ - "follows" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" } }, "compositePrimaryKeys": { "follow_follows_followed_by_pk": { + "name": "follow_follows_followed_by_pk", "columns": [ "follows", "followed_by" - ], - "name": "follow_follows_followed_by_pk" - } - }, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post_data": { - "name": "post_data", - "columns": { - "post_id": { - "name": "post_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "type": { - "name": "type", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "post_idx": { - "name": "post_idx", - "columns": [ - "post_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "post_data_post_id_post_id_fk": { - "name": "post_data_post_id_post_id_fk", - "tableFrom": "post_data", - "tableTo": "post", - "columnsFrom": [ - "post_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" + ] } }, - "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post": { + "public.post": { "name": "post", + "schema": "", "columns": { "id": { "name": "id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "author_id": { "name": "author_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "created": { "name": "created", "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" }, "modified": { @@ -147,56 +120,69 @@ "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" } }, "indexes": {}, - "foreignKeys": { - "post_author_id_user_did_fk": { - "name": "post_author_id_user_did_fk", - "tableFrom": "post", - "tableTo": "user", - "columnsFrom": [ - "author_id" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, + "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post_tag": { + "public.post_tag": { "name": "post_tag", + "schema": "", "columns": { "tag_id": { "name": "tag_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "post_id": { "name": "post_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true + }, + "score": { + "name": "score", + "type": "integer", + "primaryKey": false, + "notNull": true }, - "probability": { - "name": "probability", - "type": "real", + "algo": { + "name": "algo", + "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": true + } + }, + "indexes": { + "tagpost_idx": { + "name": "tagpost_idx", + "columns": [ + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "tag_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, - "indexes": {}, "foreignKeys": { "post_tag_tag_id_tag_id_fk": { "name": "post_tag_tag_id_tag_id_fk", @@ -225,58 +211,99 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "post_tag_post_id_tag_id_pk": { + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.post_queue": { + "name": "post_queue", + "schema": "", + "columns": { + "post_id": { + "name": "post_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "jsonb", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "post_idx": { + "name": "post_idx", "columns": [ - "post_id", - "tag_id" + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } ], - "name": "post_tag_post_id_tag_id_pk" + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "tag": { + "public.tag": { "name": "tag", + "schema": "", "columns": { "id": { "name": "id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "description": { "name": "description", "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "user": { + "public.user": { "name": "user", + "schema": "", "columns": { "did": { "name": "did", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "modified": { "name": "modified", "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" } }, @@ -284,17 +311,20 @@ "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false } }, - "views": {}, "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, "_meta": { + "columns": {}, "schemas": {}, - "tables": {}, - "columns": {} - }, - "internal": { - "indexes": {} + "tables": {} } } \ No newline at end of file diff --git a/packages/atproto/db/drizzle/meta/0004_snapshot.json b/packages/atproto/db/drizzle/meta/0004_snapshot.json index 28b62e4..44907d6 100644 --- a/packages/atproto/db/drizzle/meta/0004_snapshot.json +++ b/packages/atproto/db/drizzle/meta/0004_snapshot.json @@ -1,58 +1,66 @@ { - "version": "6", - "dialect": "sqlite", - "id": "154e4024-fe4a-47ed-9d97-5cfe9ee6d84f", - "prevId": "e93a951d-60aa-40bc-bcbe-6d480f9dabe8", + "id": "1faded27-2b97-4eb0-b673-017a92f61560", + "prevId": "91ea1a3f-747d-4e05-afa7-7ba5da99ac41", + "version": "7", + "dialect": "postgresql", "tables": { - "app": { + "public.app": { "name": "app", + "schema": "", "columns": { "k": { "name": "k", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "v": { "name": "v", - "type": "text", + "type": "jsonb", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "follow": { + "public.follow": { "name": "follow", + "schema": "", "columns": { "followed_by": { "name": "followed_by", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "follows": { "name": "follows", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true } }, "indexes": { "followedby_idx": { "name": "followedby_idx", "columns": [ - "followed_by" + { + "expression": "followed_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } ], - "isUnique": false + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, "foreignKeys": { @@ -68,64 +76,66 @@ ], "onDelete": "no action", "onUpdate": "no action" - }, - "follow_follows_user_did_fk": { - "name": "follow_follows_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", - "columnsFrom": [ - "follows" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" } }, "compositePrimaryKeys": { "follow_follows_followed_by_pk": { + "name": "follow_follows_followed_by_pk", "columns": [ "follows", "followed_by" - ], - "name": "follow_follows_followed_by_pk" + ] } }, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post_data": { - "name": "post_data", + "public.post_records": { + "name": "post_records", + "schema": "", "columns": { "post_id": { "name": "post_id", "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "type": { "name": "type", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true + }, + "value": { + "name": "value", + "type": "jsonb", + "primaryKey": false, + "notNull": false } }, "indexes": { "post_idx": { "name": "post_idx", "columns": [ - "post_id" + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } ], - "isUnique": false + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, "foreignKeys": { - "post_data_post_id_post_id_fk": { - "name": "post_data_post_id_post_id_fk", - "tableFrom": "post_data", + "post_records_post_id_post_id_fk": { + "name": "post_records_post_id_post_id_fk", + "tableFrom": "post_records", "tableTo": "post", "columnsFrom": [ "post_id" @@ -139,31 +149,31 @@ }, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post": { + "public.post": { "name": "post", + "schema": "", "columns": { "id": { "name": "id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "author_id": { "name": "author_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "created": { "name": "created", "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" }, "modified": { @@ -171,56 +181,69 @@ "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" } }, "indexes": {}, - "foreignKeys": { - "post_author_id_user_did_fk": { - "name": "post_author_id_user_did_fk", - "tableFrom": "post", - "tableTo": "user", - "columnsFrom": [ - "author_id" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, + "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post_tag": { + "public.post_tag": { "name": "post_tag", + "schema": "", "columns": { "tag_id": { "name": "tag_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "post_id": { "name": "post_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, - "probability": { - "name": "probability", - "type": "real", + "score": { + "name": "score", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": true + }, + "algo": { + "name": "algo", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "tagpost_idx": { + "name": "tagpost_idx", + "columns": [ + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "tag_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, - "indexes": {}, "foreignKeys": { "post_tag_tag_id_tag_id_fk": { "name": "post_tag_tag_id_tag_id_fk", @@ -249,58 +272,52 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "post_tag_post_id_tag_id_pk": { - "columns": [ - "post_id", - "tag_id" - ], - "name": "post_tag_post_id_tag_id_pk" - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "tag": { + "public.tag": { "name": "tag", + "schema": "", "columns": { "id": { "name": "id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "description": { "name": "description", "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "user": { + "public.user": { "name": "user", + "schema": "", "columns": { "did": { "name": "did", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "modified": { "name": "modified", "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" } }, @@ -308,17 +325,20 @@ "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false } }, - "views": {}, "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, "_meta": { + "columns": {}, "schemas": {}, - "tables": {}, - "columns": {} - }, - "internal": { - "indexes": {} + "tables": {} } } \ No newline at end of file diff --git a/packages/atproto/db/drizzle/meta/0005_snapshot.json b/packages/atproto/db/drizzle/meta/0005_snapshot.json index 67fda82..0203280 100644 --- a/packages/atproto/db/drizzle/meta/0005_snapshot.json +++ b/packages/atproto/db/drizzle/meta/0005_snapshot.json @@ -1,58 +1,66 @@ { - "version": "6", - "dialect": "sqlite", - "id": "795c7067-865d-4cd3-a628-410d5fb01dd1", - "prevId": "154e4024-fe4a-47ed-9d97-5cfe9ee6d84f", + "id": "308bff5c-8a27-435d-93bb-7d6397f87e98", + "prevId": "1faded27-2b97-4eb0-b673-017a92f61560", + "version": "7", + "dialect": "postgresql", "tables": { - "app": { + "public.app": { "name": "app", + "schema": "", "columns": { "k": { "name": "k", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "v": { "name": "v", - "type": "text", + "type": "jsonb", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "follow": { + "public.follow": { "name": "follow", + "schema": "", "columns": { "followed_by": { "name": "followed_by", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "follows": { "name": "follows", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true } }, "indexes": { "followedby_idx": { "name": "followedby_idx", "columns": [ - "followed_by" + { + "expression": "followed_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } ], - "isUnique": false + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, "foreignKeys": { @@ -68,71 +76,72 @@ ], "onDelete": "no action", "onUpdate": "no action" - }, - "follow_follows_user_did_fk": { - "name": "follow_follows_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", - "columnsFrom": [ - "follows" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" } }, "compositePrimaryKeys": { "follow_follows_followed_by_pk": { + "name": "follow_follows_followed_by_pk", "columns": [ "follows", "followed_by" - ], - "name": "follow_follows_followed_by_pk" + ] } }, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post_data": { - "name": "post_data", + "public.post_records": { + "name": "post_records", + "schema": "", "columns": { "post_id": { "name": "post_id", "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "type": { "name": "type", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true + }, + "cid": { + "name": "cid", + "type": "text", + "primaryKey": false, + "notNull": true }, "value": { "name": "value", - "type": "text", + "type": "jsonb", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": { "post_idx": { "name": "post_idx", "columns": [ - "post_id" + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } ], - "isUnique": false + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, "foreignKeys": { - "post_data_post_id_post_id_fk": { - "name": "post_data_post_id_post_id_fk", - "tableFrom": "post_data", + "post_records_post_id_post_id_fk": { + "name": "post_records_post_id_post_id_fk", + "tableFrom": "post_records", "tableTo": "post", "columnsFrom": [ "post_id" @@ -146,31 +155,31 @@ }, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post": { + "public.post": { "name": "post", + "schema": "", "columns": { "id": { "name": "id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "author_id": { "name": "author_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "created": { "name": "created", "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" }, "modified": { @@ -178,56 +187,69 @@ "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" } }, "indexes": {}, - "foreignKeys": { - "post_author_id_user_did_fk": { - "name": "post_author_id_user_did_fk", - "tableFrom": "post", - "tableTo": "user", - "columnsFrom": [ - "author_id" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, + "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post_tag": { + "public.post_tag": { "name": "post_tag", + "schema": "", "columns": { "tag_id": { "name": "tag_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "post_id": { "name": "post_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true + }, + "score": { + "name": "score", + "type": "integer", + "primaryKey": false, + "notNull": true }, - "probability": { - "name": "probability", - "type": "real", + "algo": { + "name": "algo", + "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": true + } + }, + "indexes": { + "tagpost_idx": { + "name": "tagpost_idx", + "columns": [ + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "tag_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, - "indexes": {}, "foreignKeys": { "post_tag_tag_id_tag_id_fk": { "name": "post_tag_tag_id_tag_id_fk", @@ -256,58 +278,52 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "post_tag_post_id_tag_id_pk": { - "columns": [ - "post_id", - "tag_id" - ], - "name": "post_tag_post_id_tag_id_pk" - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "tag": { + "public.tag": { "name": "tag", + "schema": "", "columns": { "id": { "name": "id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "description": { "name": "description", "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "user": { + "public.user": { "name": "user", + "schema": "", "columns": { "did": { "name": "did", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "modified": { "name": "modified", "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" } }, @@ -315,17 +331,20 @@ "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false } }, - "views": {}, "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, "_meta": { + "columns": {}, "schemas": {}, - "tables": {}, - "columns": {} - }, - "internal": { - "indexes": {} + "tables": {} } } \ No newline at end of file diff --git a/packages/atproto/db/drizzle/meta/0006_snapshot.json b/packages/atproto/db/drizzle/meta/0006_snapshot.json index 4eaec9d..7000efc 100644 --- a/packages/atproto/db/drizzle/meta/0006_snapshot.json +++ b/packages/atproto/db/drizzle/meta/0006_snapshot.json @@ -1,58 +1,66 @@ { - "version": "6", - "dialect": "sqlite", - "id": "da6f951c-777b-4561-a816-aa814502a02b", - "prevId": "795c7067-865d-4cd3-a628-410d5fb01dd1", + "id": "bbf9582d-10af-4c16-8e47-7c9319388591", + "prevId": "308bff5c-8a27-435d-93bb-7d6397f87e98", + "version": "7", + "dialect": "postgresql", "tables": { - "app": { + "public.app": { "name": "app", + "schema": "", "columns": { "k": { "name": "k", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "v": { "name": "v", - "type": "text", + "type": "jsonb", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "follow": { + "public.follow": { "name": "follow", + "schema": "", "columns": { "followed_by": { "name": "followed_by", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "follows": { "name": "follows", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true } }, "indexes": { "followedby_idx": { "name": "followedby_idx", "columns": [ - "followed_by" + { + "expression": "followed_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } ], - "isUnique": false + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, "foreignKeys": { @@ -68,71 +76,136 @@ ], "onDelete": "no action", "onUpdate": "no action" - }, - "follow_follows_user_did_fk": { - "name": "follow_follows_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", - "columnsFrom": [ - "follows" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" } }, "compositePrimaryKeys": { "follow_follows_followed_by_pk": { + "name": "follow_follows_followed_by_pk", "columns": [ "follows", "followed_by" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.post_ranking": { + "name": "post_ranking", + "schema": "", + "columns": { + "post_id": { + "name": "post_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "tag_id": { + "name": "tag_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "score": { + "name": "score", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "algo": { + "name": "algo", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "post_ranking_post_id_post_id_fk": { + "name": "post_ranking_post_id_post_id_fk", + "tableFrom": "post_ranking", + "tableTo": "post", + "columnsFrom": [ + "post_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "post_ranking_tag_id_tag_id_fk": { + "name": "post_ranking_tag_id_tag_id_fk", + "tableFrom": "post_ranking", + "tableTo": "tag", + "columnsFrom": [ + "tag_id" ], - "name": "follow_follows_followed_by_pk" + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" } }, + "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post_data": { - "name": "post_data", + "public.post_records": { + "name": "post_records", + "schema": "", "columns": { "post_id": { "name": "post_id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "type": { "name": "type", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true + }, + "cid": { + "name": "cid", + "type": "text", + "primaryKey": false, + "notNull": true }, "value": { "name": "value", - "type": "text", + "type": "jsonb", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": { "post_idx": { "name": "post_idx", "columns": [ - "post_id" + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } ], - "isUnique": false + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, "foreignKeys": { - "post_data_post_id_post_id_fk": { - "name": "post_data_post_id_post_id_fk", - "tableFrom": "post_data", + "post_records_post_id_post_id_fk": { + "name": "post_records_post_id_post_id_fk", + "tableFrom": "post_records", "tableTo": "post", "columnsFrom": [ "post_id" @@ -146,31 +219,31 @@ }, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post": { + "public.post": { "name": "post", + "schema": "", "columns": { "id": { "name": "id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "author_id": { "name": "author_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "created": { "name": "created", "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" }, "modified": { @@ -178,56 +251,69 @@ "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" } }, "indexes": {}, - "foreignKeys": { - "post_author_id_user_did_fk": { - "name": "post_author_id_user_did_fk", - "tableFrom": "post", - "tableTo": "user", - "columnsFrom": [ - "author_id" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, + "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post_tag": { + "public.post_tag": { "name": "post_tag", + "schema": "", "columns": { "tag_id": { "name": "tag_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "post_id": { "name": "post_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, - "probability": { - "name": "probability", - "type": "real", + "score": { + "name": "score", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "algo": { + "name": "algo", + "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": true + } + }, + "indexes": { + "tagpost_idx": { + "name": "tagpost_idx", + "columns": [ + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "tag_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, - "indexes": {}, "foreignKeys": { "post_tag_tag_id_tag_id_fk": { "name": "post_tag_tag_id_tag_id_fk", @@ -256,58 +342,52 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "post_tag_post_id_tag_id_pk": { - "columns": [ - "post_id", - "tag_id" - ], - "name": "post_tag_post_id_tag_id_pk" - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "tag": { + "public.tag": { "name": "tag", + "schema": "", "columns": { "id": { "name": "id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "description": { "name": "description", "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "user": { + "public.user": { "name": "user", + "schema": "", "columns": { "did": { "name": "did", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "modified": { "name": "modified", "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" } }, @@ -315,17 +395,20 @@ "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false } }, - "views": {}, "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, "_meta": { + "columns": {}, "schemas": {}, - "tables": {}, - "columns": {} - }, - "internal": { - "indexes": {} + "tables": {} } } \ No newline at end of file diff --git a/packages/atproto/db/drizzle/meta/0007_snapshot.json b/packages/atproto/db/drizzle/meta/0007_snapshot.json index fd808b4..64bc4cd 100644 --- a/packages/atproto/db/drizzle/meta/0007_snapshot.json +++ b/packages/atproto/db/drizzle/meta/0007_snapshot.json @@ -1,58 +1,66 @@ { - "version": "6", - "dialect": "sqlite", - "id": "5d0b0ba7-935d-4a87-96ab-196d84605482", - "prevId": "da6f951c-777b-4561-a816-aa814502a02b", + "id": "eee5aad9-c69f-48f9-8560-cef348944519", + "prevId": "bbf9582d-10af-4c16-8e47-7c9319388591", + "version": "7", + "dialect": "postgresql", "tables": { - "app": { + "public.app": { "name": "app", + "schema": "", "columns": { "k": { "name": "k", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "v": { "name": "v", - "type": "text", + "type": "jsonb", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "follow": { + "public.follow": { "name": "follow", + "schema": "", "columns": { "followed_by": { "name": "followed_by", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "follows": { "name": "follows", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true } }, "indexes": { "followedby_idx": { "name": "followedby_idx", "columns": [ - "followed_by" + { + "expression": "followed_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } ], - "isUnique": false + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, "foreignKeys": { @@ -68,95 +76,174 @@ ], "onDelete": "no action", "onUpdate": "no action" - }, - "follow_follows_user_did_fk": { - "name": "follow_follows_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", - "columnsFrom": [ - "follows" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" } }, "compositePrimaryKeys": { "follow_follows_followed_by_pk": { + "name": "follow_follows_followed_by_pk", "columns": [ "follows", "followed_by" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.post_ranking": { + "name": "post_ranking", + "schema": "", + "columns": { + "post_id": { + "name": "post_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "tag_id": { + "name": "tag_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "score": { + "name": "score", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "algo": { + "name": "algo", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "post_ranking_post_id_post_id_fk": { + "name": "post_ranking_post_id_post_id_fk", + "tableFrom": "post_ranking", + "tableTo": "post", + "columnsFrom": [ + "post_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "post_ranking_tag_id_tag_id_fk": { + "name": "post_ranking_tag_id_tag_id_fk", + "tableFrom": "post_ranking", + "tableTo": "tag", + "columnsFrom": [ + "tag_id" ], - "name": "follow_follows_followed_by_pk" + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" } }, + "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post_data": { - "name": "post_data", + "public.post_record": { + "name": "post_record", + "schema": "", "columns": { "post_id": { "name": "post_id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "type": { "name": "type", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true + }, + "cid": { + "name": "cid", + "type": "text", + "primaryKey": false, + "notNull": true }, "value": { "name": "value", - "type": "text", + "type": "jsonb", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": { "post_idx": { "name": "post_idx", "columns": [ + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "post_record_post_id_post_id_fk": { + "name": "post_record_post_id_post_id_fk", + "tableFrom": "post_record", + "tableTo": "post", + "columnsFrom": [ "post_id" ], - "isUnique": false + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" } }, - "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post": { + "public.post": { "name": "post", + "schema": "", "columns": { "id": { "name": "id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "author_id": { "name": "author_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "created": { "name": "created", "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" }, "modified": { @@ -164,56 +251,69 @@ "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" } }, "indexes": {}, - "foreignKeys": { - "post_author_id_user_did_fk": { - "name": "post_author_id_user_did_fk", - "tableFrom": "post", - "tableTo": "user", - "columnsFrom": [ - "author_id" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, + "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post_tag": { + "public.post_tag": { "name": "post_tag", + "schema": "", "columns": { "tag_id": { "name": "tag_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "post_id": { "name": "post_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, - "probability": { - "name": "probability", - "type": "real", + "score": { + "name": "score", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": true + }, + "algo": { + "name": "algo", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "tagpost_idx": { + "name": "tagpost_idx", + "columns": [ + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "tag_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, - "indexes": {}, "foreignKeys": { "post_tag_tag_id_tag_id_fk": { "name": "post_tag_tag_id_tag_id_fk", @@ -242,58 +342,52 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "post_tag_post_id_tag_id_pk": { - "columns": [ - "post_id", - "tag_id" - ], - "name": "post_tag_post_id_tag_id_pk" - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "tag": { + "public.tag": { "name": "tag", + "schema": "", "columns": { "id": { "name": "id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "description": { "name": "description", "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "user": { + "public.user": { "name": "user", + "schema": "", "columns": { "did": { "name": "did", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "modified": { "name": "modified", "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" } }, @@ -301,17 +395,20 @@ "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false } }, - "views": {}, "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, "_meta": { + "columns": {}, "schemas": {}, - "tables": {}, - "columns": {} - }, - "internal": { - "indexes": {} + "tables": {} } } \ No newline at end of file diff --git a/packages/atproto/db/drizzle/meta/0008_snapshot.json b/packages/atproto/db/drizzle/meta/0008_snapshot.json index 9b1bbac..d31a935 100644 --- a/packages/atproto/db/drizzle/meta/0008_snapshot.json +++ b/packages/atproto/db/drizzle/meta/0008_snapshot.json @@ -1,58 +1,66 @@ { - "version": "6", - "dialect": "sqlite", - "id": "69149008-c187-4f4f-acfc-86c339f41cb3", - "prevId": "5d0b0ba7-935d-4a87-96ab-196d84605482", + "id": "b93fd232-a7dc-4700-b3d3-2d27545865c7", + "prevId": "eee5aad9-c69f-48f9-8560-cef348944519", + "version": "7", + "dialect": "postgresql", "tables": { - "app": { + "public.app": { "name": "app", + "schema": "", "columns": { "k": { "name": "k", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "v": { "name": "v", - "type": "text", + "type": "jsonb", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "follow": { + "public.follow": { "name": "follow", + "schema": "", "columns": { "followed_by": { "name": "followed_by", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "follows": { "name": "follows", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true } }, "indexes": { "followedby_idx": { "name": "followedby_idx", "columns": [ - "followed_by" + { + "expression": "followed_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } ], - "isUnique": false + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, "foreignKeys": { @@ -68,56 +76,174 @@ ], "onDelete": "no action", "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "follow_follows_followed_by_pk": { + "name": "follow_follows_followed_by_pk", + "columns": [ + "follows", + "followed_by" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.post_ranking": { + "name": "post_ranking", + "schema": "", + "columns": { + "post_id": { + "name": "post_id", + "type": "text", + "primaryKey": false, + "notNull": true }, - "follow_follows_user_did_fk": { - "name": "follow_follows_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", + "tag_id": { + "name": "tag_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "score": { + "name": "score", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "algo": { + "name": "algo", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "post_ranking_post_id_post_id_fk": { + "name": "post_ranking_post_id_post_id_fk", + "tableFrom": "post_ranking", + "tableTo": "post", "columnsFrom": [ - "follows" + "post_id" ], "columnsTo": [ - "did" + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "post_ranking_tag_id_tag_id_fk": { + "name": "post_ranking_tag_id_tag_id_fk", + "tableFrom": "post_ranking", + "tableTo": "tag", + "columnsFrom": [ + "tag_id" + ], + "columnsTo": [ + "id" ], "onDelete": "no action", "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "follow_follows_followed_by_pk": { + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.post_record": { + "name": "post_record", + "schema": "", + "columns": { + "post_id": { + "name": "post_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "cid": { + "name": "cid", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "jsonb", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "post_idx": { + "name": "post_idx", "columns": [ - "follows", - "followed_by" + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } ], - "name": "follow_follows_followed_by_pk" + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, + "foreignKeys": { + "post_record_post_id_post_id_fk": { + "name": "post_record_post_id_post_id_fk", + "tableFrom": "post_record", + "tableTo": "post", + "columnsFrom": [ + "post_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post": { + "public.post": { "name": "post", + "schema": "", "columns": { "id": { "name": "id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "author_id": { "name": "author_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "created": { "name": "created", "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" }, "modified": { @@ -125,56 +251,69 @@ "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" } }, "indexes": {}, - "foreignKeys": { - "post_author_id_user_did_fk": { - "name": "post_author_id_user_did_fk", - "tableFrom": "post", - "tableTo": "user", - "columnsFrom": [ - "author_id" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, + "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post_tag": { + "public.post_tag": { "name": "post_tag", + "schema": "", "columns": { "tag_id": { "name": "tag_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "post_id": { "name": "post_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true + }, + "score": { + "name": "score", + "type": "integer", + "primaryKey": false, + "notNull": true }, - "probability": { - "name": "probability", - "type": "real", + "algo": { + "name": "algo", + "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": true + } + }, + "indexes": { + "tagpost_idx": { + "name": "tagpost_idx", + "columns": [ + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "tag_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, - "indexes": {}, "foreignKeys": { "post_tag_tag_id_tag_id_fk": { "name": "post_tag_tag_id_tag_id_fk", @@ -203,97 +342,62 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "post_tag_post_id_tag_id_pk": { + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "post_tag_algo_post_id_tag_id_unique": { + "name": "post_tag_algo_post_id_tag_id_unique", + "nullsNotDistinct": false, "columns": [ + "algo", "post_id", "tag_id" - ], - "name": "post_tag_post_id_tag_id_pk" + ] } }, - "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post_queue": { - "name": "post_queue", - "columns": { - "post_id": { - "name": "post_id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "type": { - "name": "type", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "value": { - "name": "value", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "post_idx": { - "name": "post_idx", - "columns": [ - "post_id" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "tag": { + "public.tag": { "name": "tag", + "schema": "", "columns": { "id": { "name": "id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "description": { "name": "description", "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "user": { + "public.user": { "name": "user", + "schema": "", "columns": { "did": { "name": "did", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "modified": { "name": "modified", "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" } }, @@ -301,19 +405,20 @@ "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false } }, - "views": {}, "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, "_meta": { + "columns": {}, "schemas": {}, - "tables": { - "\"post_data\"": "\"post_queue\"" - }, - "columns": {} - }, - "internal": { - "indexes": {} + "tables": {} } } \ No newline at end of file diff --git a/packages/atproto/db/drizzle/meta/0009_snapshot.json b/packages/atproto/db/drizzle/meta/0009_snapshot.json index 65a27aa..3ed94df 100644 --- a/packages/atproto/db/drizzle/meta/0009_snapshot.json +++ b/packages/atproto/db/drizzle/meta/0009_snapshot.json @@ -1,58 +1,66 @@ { - "version": "6", - "dialect": "sqlite", - "id": "ec42ebc4-c344-4ad8-b5c8-8916b4867068", - "prevId": "69149008-c187-4f4f-acfc-86c339f41cb3", + "id": "8f9004b1-160a-49a6-a470-0839333031c1", + "prevId": "b93fd232-a7dc-4700-b3d3-2d27545865c7", + "version": "7", + "dialect": "postgresql", "tables": { - "app": { + "public.app": { "name": "app", + "schema": "", "columns": { "k": { "name": "k", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "v": { "name": "v", - "type": "text", + "type": "jsonb", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "follow": { + "public.follow": { "name": "follow", + "schema": "", "columns": { "followed_by": { "name": "followed_by", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "follows": { "name": "follows", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true } }, "indexes": { "followedby_idx": { "name": "followedby_idx", "columns": [ - "followed_by" + { + "expression": "followed_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } ], - "isUnique": false + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, "foreignKeys": { @@ -68,56 +76,174 @@ ], "onDelete": "no action", "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "follow_follows_followed_by_pk": { + "name": "follow_follows_followed_by_pk", + "columns": [ + "follows", + "followed_by" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.post_ranking": { + "name": "post_ranking", + "schema": "", + "columns": { + "post_id": { + "name": "post_id", + "type": "text", + "primaryKey": false, + "notNull": true }, - "follow_follows_user_did_fk": { - "name": "follow_follows_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", + "tag_id": { + "name": "tag_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "score": { + "name": "score", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "algo": { + "name": "algo", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "post_ranking_post_id_post_id_fk": { + "name": "post_ranking_post_id_post_id_fk", + "tableFrom": "post_ranking", + "tableTo": "post", + "columnsFrom": [ + "post_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "post_ranking_tag_id_tag_id_fk": { + "name": "post_ranking_tag_id_tag_id_fk", + "tableFrom": "post_ranking", + "tableTo": "tag", "columnsFrom": [ - "follows" + "tag_id" ], "columnsTo": [ - "did" + "id" ], "onDelete": "no action", "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "follow_follows_followed_by_pk": { + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.post_record": { + "name": "post_record", + "schema": "", + "columns": { + "post_id": { + "name": "post_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "cid": { + "name": "cid", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "jsonb", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "post_idx": { + "name": "post_idx", "columns": [ - "follows", - "followed_by" + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } ], - "name": "follow_follows_followed_by_pk" + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, + "foreignKeys": { + "post_record_post_id_post_id_fk": { + "name": "post_record_post_id_post_id_fk", + "tableFrom": "post_record", + "tableTo": "post", + "columnsFrom": [ + "post_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post": { + "public.post": { "name": "post", + "schema": "", "columns": { "id": { "name": "id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "author_id": { "name": "author_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "created": { "name": "created", "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" }, "modified": { @@ -125,7 +251,6 @@ "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" } }, @@ -133,34 +258,62 @@ "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post_tag": { + "public.post_tag": { "name": "post_tag", + "schema": "", "columns": { "tag_id": { "name": "tag_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "post_id": { "name": "post_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, - "probability": { - "name": "probability", - "type": "real", + "score": { + "name": "score", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": true + }, + "algo": { + "name": "algo", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "tagpost_idx": { + "name": "tagpost_idx", + "columns": [ + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "tag_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, - "indexes": {}, "foreignKeys": { "post_tag_tag_id_tag_id_fk": { "name": "post_tag_tag_id_tag_id_fk", @@ -189,97 +342,62 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "post_tag_post_id_tag_id_pk": { + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "post_tag_algo_post_id_tag_id_unique": { + "name": "post_tag_algo_post_id_tag_id_unique", + "nullsNotDistinct": false, "columns": [ + "algo", "post_id", "tag_id" - ], - "name": "post_tag_post_id_tag_id_pk" - } - }, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post_queue": { - "name": "post_queue", - "columns": { - "post_id": { - "name": "post_id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "type": { - "name": "type", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "value": { - "name": "value", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "post_idx": { - "name": "post_idx", - "columns": [ - "post_id" - ], - "isUnique": false + ] } }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "tag": { + "public.tag": { "name": "tag", + "schema": "", "columns": { "id": { "name": "id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "description": { "name": "description", "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "user": { + "public.user": { "name": "user", + "schema": "", "columns": { "did": { "name": "did", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "modified": { "name": "modified", "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" } }, @@ -287,17 +405,36 @@ "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false } }, - "views": {}, "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": { + "public.posts_with_tags": { + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + } + }, + "definition": "select \"id\" from \"post\"", + "name": "posts_with_tags", + "schema": "public", + "isExisting": false, + "materialized": false + } + }, "_meta": { + "columns": {}, "schemas": {}, - "tables": {}, - "columns": {} - }, - "internal": { - "indexes": {} + "tables": {} } } \ No newline at end of file diff --git a/packages/atproto/db/drizzle/meta/0010_snapshot.json b/packages/atproto/db/drizzle/meta/0010_snapshot.json index d29600e..68bb6c9 100644 --- a/packages/atproto/db/drizzle/meta/0010_snapshot.json +++ b/packages/atproto/db/drizzle/meta/0010_snapshot.json @@ -1,58 +1,66 @@ { - "version": "6", - "dialect": "sqlite", - "id": "cd10b5bf-2e31-4641-bdfc-19fd88bec42e", - "prevId": "ec42ebc4-c344-4ad8-b5c8-8916b4867068", + "id": "85e48b9f-9291-4450-8103-1731f11ecf83", + "prevId": "8f9004b1-160a-49a6-a470-0839333031c1", + "version": "7", + "dialect": "postgresql", "tables": { - "app": { + "public.app": { "name": "app", + "schema": "", "columns": { "k": { "name": "k", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "v": { "name": "v", - "type": "text", + "type": "jsonb", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "follow": { + "public.follow": { "name": "follow", + "schema": "", "columns": { "followed_by": { "name": "followed_by", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "follows": { "name": "follows", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true } }, "indexes": { "followedby_idx": { "name": "followedby_idx", "columns": [ - "followed_by" + { + "expression": "followed_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } ], - "isUnique": false + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, "foreignKeys": { @@ -72,39 +80,170 @@ }, "compositePrimaryKeys": { "follow_follows_followed_by_pk": { + "name": "follow_follows_followed_by_pk", "columns": [ "follows", "followed_by" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.post_ranking": { + "name": "post_ranking", + "schema": "", + "columns": { + "post_id": { + "name": "post_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "tag_id": { + "name": "tag_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "score": { + "name": "score", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "algo": { + "name": "algo", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "post_ranking_post_id_post_id_fk": { + "name": "post_ranking_post_id_post_id_fk", + "tableFrom": "post_ranking", + "tableTo": "post", + "columnsFrom": [ + "post_id" ], - "name": "follow_follows_followed_by_pk" + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "post_ranking_tag_id_tag_id_fk": { + "name": "post_ranking_tag_id_tag_id_fk", + "tableFrom": "post_ranking", + "tableTo": "tag", + "columnsFrom": [ + "tag_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" } }, + "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post": { + "public.post_record": { + "name": "post_record", + "schema": "", + "columns": { + "post_id": { + "name": "post_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "cid": { + "name": "cid", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "jsonb", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "post_idx": { + "name": "post_idx", + "columns": [ + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "post_record_post_id_post_id_fk": { + "name": "post_record_post_id_post_id_fk", + "tableFrom": "post_record", + "tableTo": "post", + "columnsFrom": [ + "post_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.post": { "name": "post", + "schema": "", "columns": { "id": { "name": "id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "author_id": { "name": "author_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "created": { "name": "created", "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" }, "modified": { @@ -112,7 +251,6 @@ "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" } }, @@ -120,34 +258,62 @@ "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post_tag": { + "public.post_tag": { "name": "post_tag", + "schema": "", "columns": { "tag_id": { "name": "tag_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "post_id": { "name": "post_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, - "probability": { - "name": "probability", - "type": "real", + "score": { + "name": "score", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": true + }, + "algo": { + "name": "algo", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "tagpost_idx": { + "name": "tagpost_idx", + "columns": [ + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "tag_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, - "indexes": {}, "foreignKeys": { "post_tag_tag_id_tag_id_fk": { "name": "post_tag_tag_id_tag_id_fk", @@ -176,97 +342,62 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "post_tag_post_id_tag_id_pk": { + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "post_tag_algo_post_id_tag_id_unique": { + "name": "post_tag_algo_post_id_tag_id_unique", + "nullsNotDistinct": false, "columns": [ + "algo", "post_id", "tag_id" - ], - "name": "post_tag_post_id_tag_id_pk" - } - }, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "post_queue": { - "name": "post_queue", - "columns": { - "post_id": { - "name": "post_id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "type": { - "name": "type", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "value": { - "name": "value", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "post_idx": { - "name": "post_idx", - "columns": [ - "post_id" - ], - "isUnique": false + ] } }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "tag": { + "public.tag": { "name": "tag", + "schema": "", "columns": { "id": { "name": "id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "description": { "name": "description", "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "user": { + "public.user": { "name": "user", + "schema": "", "columns": { "did": { "name": "did", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "modified": { "name": "modified", "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" } }, @@ -274,17 +405,20 @@ "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false } }, - "views": {}, "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, "_meta": { + "columns": {}, "schemas": {}, - "tables": {}, - "columns": {} - }, - "internal": { - "indexes": {} + "tables": {} } } \ No newline at end of file diff --git a/apps/web/db/drizzle/meta/0005_snapshot.json b/packages/atproto/db/drizzle/meta/0011_snapshot.json similarity index 51% rename from apps/web/db/drizzle/meta/0005_snapshot.json rename to packages/atproto/db/drizzle/meta/0011_snapshot.json index 67fda82..af67e20 100644 --- a/apps/web/db/drizzle/meta/0005_snapshot.json +++ b/packages/atproto/db/drizzle/meta/0011_snapshot.json @@ -1,58 +1,66 @@ { - "version": "6", - "dialect": "sqlite", - "id": "795c7067-865d-4cd3-a628-410d5fb01dd1", - "prevId": "154e4024-fe4a-47ed-9d97-5cfe9ee6d84f", + "id": "9b4d7eb7-ed7e-4d4e-8bfa-c5318882d9a3", + "prevId": "85e48b9f-9291-4450-8103-1731f11ecf83", + "version": "7", + "dialect": "postgresql", "tables": { - "app": { + "public.app": { "name": "app", + "schema": "", "columns": { "k": { "name": "k", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "v": { "name": "v", - "type": "text", + "type": "jsonb", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "follow": { + "public.follow": { "name": "follow", + "schema": "", "columns": { "followed_by": { "name": "followed_by", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "follows": { "name": "follows", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true } }, "indexes": { "followedby_idx": { "name": "followedby_idx", "columns": [ - "followed_by" + { + "expression": "followed_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } ], - "isUnique": false + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, "foreignKeys": { @@ -68,71 +76,136 @@ ], "onDelete": "no action", "onUpdate": "no action" - }, - "follow_follows_user_did_fk": { - "name": "follow_follows_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", - "columnsFrom": [ - "follows" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" } }, "compositePrimaryKeys": { "follow_follows_followed_by_pk": { + "name": "follow_follows_followed_by_pk", "columns": [ "follows", "followed_by" - ], - "name": "follow_follows_followed_by_pk" + ] } }, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post_data": { - "name": "post_data", + "public.post_ranking": { + "name": "post_ranking", + "schema": "", "columns": { "post_id": { "name": "post_id", "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": true + }, + "tag_id": { + "name": "tag_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "score": { + "name": "score", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "algo": { + "name": "algo", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "post_ranking_post_id_post_id_fk": { + "name": "post_ranking_post_id_post_id_fk", + "tableFrom": "post_ranking", + "tableTo": "post", + "columnsFrom": [ + "post_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "post_ranking_tag_id_tag_id_fk": { + "name": "post_ranking_tag_id_tag_id_fk", + "tableFrom": "post_ranking", + "tableTo": "tag", + "columnsFrom": [ + "tag_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.post_record": { + "name": "post_record", + "schema": "", + "columns": { + "post_id": { + "name": "post_id", + "type": "text", + "primaryKey": true, + "notNull": true }, "type": { "name": "type", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true + }, + "cid": { + "name": "cid", + "type": "text", + "primaryKey": false, + "notNull": true }, "value": { "name": "value", - "type": "text", + "type": "jsonb", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": { "post_idx": { "name": "post_idx", "columns": [ - "post_id" + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } ], - "isUnique": false + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, "foreignKeys": { - "post_data_post_id_post_id_fk": { - "name": "post_data_post_id_post_id_fk", - "tableFrom": "post_data", + "post_record_post_id_post_id_fk": { + "name": "post_record_post_id_post_id_fk", + "tableFrom": "post_record", "tableTo": "post", "columnsFrom": [ "post_id" @@ -146,31 +219,31 @@ }, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post": { + "public.post": { "name": "post", + "schema": "", "columns": { "id": { "name": "id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "author_id": { "name": "author_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "created": { "name": "created", "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" }, "modified": { @@ -178,56 +251,69 @@ "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" } }, "indexes": {}, - "foreignKeys": { - "post_author_id_user_did_fk": { - "name": "post_author_id_user_did_fk", - "tableFrom": "post", - "tableTo": "user", - "columnsFrom": [ - "author_id" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, + "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post_tag": { + "public.post_tag": { "name": "post_tag", + "schema": "", "columns": { "tag_id": { "name": "tag_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "post_id": { "name": "post_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, - "probability": { - "name": "probability", - "type": "real", + "score": { + "name": "score", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "algo": { + "name": "algo", + "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": true + } + }, + "indexes": { + "tagpost_idx": { + "name": "tagpost_idx", + "columns": [ + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "tag_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, - "indexes": {}, "foreignKeys": { "post_tag_tag_id_tag_id_fk": { "name": "post_tag_tag_id_tag_id_fk", @@ -256,58 +342,62 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "post_tag_post_id_tag_id_pk": { + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "post_tag_algo_post_id_tag_id_unique": { + "name": "post_tag_algo_post_id_tag_id_unique", + "nullsNotDistinct": false, "columns": [ + "algo", "post_id", "tag_id" - ], - "name": "post_tag_post_id_tag_id_pk" + ] } }, - "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "tag": { + "public.tag": { "name": "tag", + "schema": "", "columns": { "id": { "name": "id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "description": { "name": "description", "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "user": { + "public.user": { "name": "user", + "schema": "", "columns": { "did": { "name": "did", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "modified": { "name": "modified", "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" } }, @@ -315,17 +405,42 @@ "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false } }, - "views": {}, "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": { + "public.posts_tag_avg": { + "columns": { + "post_id": { + "name": "post_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "tag_id": { + "name": "tag_id", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "definition": "select \"post_id\", \"tag_id\", round(avg(\"score\"), 0) as \"avg_score\" from \"post_tag\" group by \"post_tag\".\"post_id\", \"post_tag\".\"tag_id\"", + "name": "posts_tag_avg", + "schema": "public", + "isExisting": false, + "materialized": false + } + }, "_meta": { + "columns": {}, "schemas": {}, - "tables": {}, - "columns": {} - }, - "internal": { - "indexes": {} + "tables": {} } } \ No newline at end of file diff --git a/apps/web/db/drizzle/meta/0006_snapshot.json b/packages/atproto/db/drizzle/meta/0012_snapshot.json similarity index 50% rename from apps/web/db/drizzle/meta/0006_snapshot.json rename to packages/atproto/db/drizzle/meta/0012_snapshot.json index 4eaec9d..66d5e13 100644 --- a/apps/web/db/drizzle/meta/0006_snapshot.json +++ b/packages/atproto/db/drizzle/meta/0012_snapshot.json @@ -1,58 +1,66 @@ { - "version": "6", - "dialect": "sqlite", - "id": "da6f951c-777b-4561-a816-aa814502a02b", - "prevId": "795c7067-865d-4cd3-a628-410d5fb01dd1", + "id": "420ff829-ec9f-4ee3-83ae-67a06115ab6e", + "prevId": "9b4d7eb7-ed7e-4d4e-8bfa-c5318882d9a3", + "version": "7", + "dialect": "postgresql", "tables": { - "app": { + "public.app": { "name": "app", + "schema": "", "columns": { "k": { "name": "k", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "v": { "name": "v", - "type": "text", + "type": "jsonb", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "follow": { + "public.follow": { "name": "follow", + "schema": "", "columns": { "followed_by": { "name": "followed_by", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "follows": { "name": "follows", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true } }, "indexes": { "followedby_idx": { "name": "followedby_idx", "columns": [ - "followed_by" + { + "expression": "followed_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } ], - "isUnique": false + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, "foreignKeys": { @@ -68,71 +76,136 @@ ], "onDelete": "no action", "onUpdate": "no action" - }, - "follow_follows_user_did_fk": { - "name": "follow_follows_user_did_fk", - "tableFrom": "follow", - "tableTo": "user", - "columnsFrom": [ - "follows" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" } }, "compositePrimaryKeys": { "follow_follows_followed_by_pk": { + "name": "follow_follows_followed_by_pk", "columns": [ "follows", "followed_by" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.post_ranking": { + "name": "post_ranking", + "schema": "", + "columns": { + "post_id": { + "name": "post_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "tag_id": { + "name": "tag_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "score": { + "name": "score", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "algo": { + "name": "algo", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "post_ranking_post_id_post_id_fk": { + "name": "post_ranking_post_id_post_id_fk", + "tableFrom": "post_ranking", + "tableTo": "post", + "columnsFrom": [ + "post_id" ], - "name": "follow_follows_followed_by_pk" + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "post_ranking_tag_id_tag_id_fk": { + "name": "post_ranking_tag_id_tag_id_fk", + "tableFrom": "post_ranking", + "tableTo": "tag", + "columnsFrom": [ + "tag_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" } }, + "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post_data": { - "name": "post_data", + "public.post_record": { + "name": "post_record", + "schema": "", "columns": { "post_id": { "name": "post_id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "type": { "name": "type", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true + }, + "cid": { + "name": "cid", + "type": "text", + "primaryKey": false, + "notNull": true }, "value": { "name": "value", - "type": "text", + "type": "jsonb", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": { "post_idx": { "name": "post_idx", "columns": [ - "post_id" + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } ], - "isUnique": false + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, "foreignKeys": { - "post_data_post_id_post_id_fk": { - "name": "post_data_post_id_post_id_fk", - "tableFrom": "post_data", + "post_record_post_id_post_id_fk": { + "name": "post_record_post_id_post_id_fk", + "tableFrom": "post_record", "tableTo": "post", "columnsFrom": [ "post_id" @@ -146,31 +219,31 @@ }, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post": { + "public.post": { "name": "post", + "schema": "", "columns": { "id": { "name": "id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "author_id": { "name": "author_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "created": { "name": "created", "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" }, "modified": { @@ -178,56 +251,69 @@ "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" } }, "indexes": {}, - "foreignKeys": { - "post_author_id_user_did_fk": { - "name": "post_author_id_user_did_fk", - "tableFrom": "post", - "tableTo": "user", - "columnsFrom": [ - "author_id" - ], - "columnsTo": [ - "did" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, + "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "post_tag": { + "public.post_tag": { "name": "post_tag", + "schema": "", "columns": { "tag_id": { "name": "tag_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "post_id": { "name": "post_id", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, - "probability": { - "name": "probability", - "type": "real", + "score": { + "name": "score", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "algo": { + "name": "algo", + "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": true + } + }, + "indexes": { + "tagpost_idx": { + "name": "tagpost_idx", + "columns": [ + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "tag_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} } }, - "indexes": {}, "foreignKeys": { "post_tag_tag_id_tag_id_fk": { "name": "post_tag_tag_id_tag_id_fk", @@ -256,58 +342,62 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "post_tag_post_id_tag_id_pk": { + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "post_tag_algo_post_id_tag_id_unique": { + "name": "post_tag_algo_post_id_tag_id_unique", + "nullsNotDistinct": false, "columns": [ + "algo", "post_id", "tag_id" - ], - "name": "post_tag_post_id_tag_id_pk" + ] } }, - "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "tag": { + "public.tag": { "name": "tag", + "schema": "", "columns": { "id": { "name": "id", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "description": { "name": "description", "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false }, - "user": { + "public.user": { "name": "user", + "schema": "", "columns": { "did": { "name": "did", "type": "text", "primaryKey": true, - "notNull": true, - "autoincrement": false + "notNull": true }, "modified": { "name": "modified", "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, "default": "(CURRENT_TIMESTAMP)" } }, @@ -315,17 +405,42 @@ "foreignKeys": {}, "compositePrimaryKeys": {}, "uniqueConstraints": {}, - "checkConstraints": {} + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false } }, - "views": {}, "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": { + "public.posts_tag_avg": { + "columns": { + "post_id": { + "name": "post_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "tag_id": { + "name": "tag_id", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "definition": "select \"post_id\", \"tag_id\", round(avg(\"score\"), 0) as \"avg_score\", ARRAY_AGG(DISTINCT \"algo\") as \"algos\" from \"post_tag\" group by \"post_tag\".\"post_id\", \"post_tag\".\"tag_id\"", + "name": "posts_tag_avg", + "schema": "public", + "isExisting": false, + "materialized": false + } + }, "_meta": { + "columns": {}, "schemas": {}, - "tables": {}, - "columns": {} - }, - "internal": { - "indexes": {} + "tables": {} } } \ No newline at end of file diff --git a/packages/atproto/db/drizzle/meta/_journal.json b/packages/atproto/db/drizzle/meta/_journal.json index fc727a7..3c4757a 100644 --- a/packages/atproto/db/drizzle/meta/_journal.json +++ b/packages/atproto/db/drizzle/meta/_journal.json @@ -1,82 +1,96 @@ { "version": "7", - "dialect": "sqlite", + "dialect": "postgresql", "entries": [ { "idx": 0, - "version": "6", - "when": 1734777195321, - "tag": "0000_equal_living_lightning", + "version": "7", + "when": 1734875626532, + "tag": "0000_public_pride", "breakpoints": true }, { "idx": 1, - "version": "6", - "when": 1734778152257, - "tag": "0001_slim_sister_grimm", + "version": "7", + "when": 1734894959235, + "tag": "0001_cultured_ultimates", "breakpoints": true }, { "idx": 2, - "version": "6", - "when": 1734778382151, - "tag": "0002_fair_captain_cross", + "version": "7", + "when": 1734936460897, + "tag": "0002_nifty_sharon_carter", "breakpoints": true }, { "idx": 3, - "version": "6", - "when": 1734778476053, - "tag": "0003_foamy_swordsman", + "version": "7", + "when": 1734936956342, + "tag": "0003_useful_infant_terrible", "breakpoints": true }, { "idx": 4, - "version": "6", - "when": 1734785140860, - "tag": "0004_fixed_harrier", + "version": "7", + "when": 1734937149566, + "tag": "0004_icy_scream", "breakpoints": true }, { "idx": 5, - "version": "6", - "when": 1734790233945, - "tag": "0005_safe_vin_gonzales", + "version": "7", + "when": 1734937300017, + "tag": "0005_plain_liz_osborn", "breakpoints": true }, { "idx": 6, - "version": "6", - "when": 1734798238305, - "tag": "0006_milky_white_queen", + "version": "7", + "when": 1734938505564, + "tag": "0006_productive_lizard", "breakpoints": true }, { "idx": 7, - "version": "6", - "when": 1734812702811, - "tag": "0007_sudden_dark_phoenix", + "version": "7", + "when": 1734938538034, + "tag": "0007_busy_sabretooth", "breakpoints": true }, { "idx": 8, - "version": "6", - "when": 1734812798498, - "tag": "0008_redundant_spectrum", + "version": "7", + "when": 1734945432189, + "tag": "0008_steep_scourge", "breakpoints": true }, { "idx": 9, - "version": "6", - "when": 1734812969373, - "tag": "0009_skinny_cerebro", + "version": "7", + "when": 1734946899688, + "tag": "0009_rich_manta", "breakpoints": true }, { "idx": 10, - "version": "6", - "when": 1734813044639, - "tag": "0010_sad_salo", + "version": "7", + "when": 1734950421808, + "tag": "0010_nifty_miss_america", + "breakpoints": true + }, + { + "idx": 11, + "version": "7", + "when": 1734950637315, + "tag": "0011_steep_namor", + "breakpoints": true + }, + { + "idx": 12, + "version": "7", + "when": 1734953811872, + "tag": "0012_wonderful_tinkerer", "breakpoints": true } ] diff --git a/packages/atproto/db/schema.ts b/packages/atproto/db/schema.ts index 66bc185..83142f1 100644 --- a/packages/atproto/db/schema.ts +++ b/packages/atproto/db/schema.ts @@ -2,24 +2,26 @@ import type { AppBskyFeedPost } from "@atproto/api"; import { relations, sql } from "drizzle-orm"; import { index, + integer, + jsonb, + pgTable, + pgView, primaryKey, - real, - sqliteTable, text, -} from "drizzle-orm/sqlite-core"; + unique, +} from "drizzle-orm/pg-core"; +import { type ClassifierTags } from "../classifiers/types"; -export const appData = sqliteTable( +export const appData = pgTable( "app", { k: text("k", { enum: ["session"] }).primaryKey(), - v: text("v", { - mode: "json", - }), + v: jsonb("v"), }, (t) => [] ); -export const followTable = sqliteTable( +export const followTable = pgTable( "follow", { followedBy: text("followed_by") @@ -35,7 +37,7 @@ export const followTable = sqliteTable( ] ); -export const postTable = sqliteTable( +export const postTable = pgTable( "post", { id: text().primaryKey(), // bluesky post id @@ -51,28 +53,31 @@ export const postTable = sqliteTable( ); // Should be deleted after processing -export const post_queue = sqliteTable( - "post_queue", +export const postRecords = pgTable( + "post_record", { - postId: text("post_id").primaryKey(), + postId: text("post_id") + .primaryKey() + .references(() => postTable.id), type: text({ enum: ["AppBskyFeedPost.Record"], }).notNull(), - value: text({ mode: "json" }).$type(), + cid: text().notNull(), + value: jsonb().$type(), }, (t) => [index("post_idx").on(t.postId)] ); -export const tagTable = sqliteTable( +export const tagTable = pgTable( "tag", { - id: text().primaryKey(), + id: text().primaryKey().$type(), description: text(), }, () => [] ); -export const postTags = sqliteTable( +export const postTags = pgTable( "post_tag", { tagId: text("tag_id") @@ -81,12 +86,29 @@ export const postTags = sqliteTable( postId: text("post_id") .notNull() .references(() => postTable.id), - probability: real(), + // Allows an algorithm to give post a relevancy score for tag + score: integer("score").notNull(), // 0-100 + // popularity should be in its own table, regardless of algorithms + //popularity: integer("popularity"), + algo: text("algo").notNull(), }, - (t) => [primaryKey({ columns: [t.postId, t.tagId] })] + (t) => [ + index("tagpost_idx").on(t.postId, t.tagId), + unique().on(t.algo, t.postId, t.tagId), + ] ); -export const userTable = sqliteTable( +// Enable algorithms to affect post ranking +export const postRanking = pgTable("post_ranking", { + postId: text("post_id") + .notNull() + .references(() => postTable.id), + tagId: text("tag_id").references(() => tagTable.id), // optionally relevant to tag, + score: integer("score").notNull(), // 0-100 + algo: text().notNull(), +}); + +export const userTable = pgTable( "user", { did: text("did").primaryKey(), @@ -114,9 +136,9 @@ export const postRelations = relations(postTable, ({ one, many }) => ({ references: [userTable.did], }), // TODO: add followedby - unprocessed: one(post_queue, { + unprocessed: one(postRecords, { fields: [postTable.id], - references: [post_queue.postId], + references: [postRecords.postId], }), tags: many(postTags), })); @@ -135,3 +157,16 @@ export const followTableRelations = relations(followTable, ({ one }) => ({ references: [userTable.did], }), })); + +// Views +export const postScores = pgView("posts_tag_avg").as((qb) => { + return qb + .select({ + postId: postTags.postId, + tagId: postTags.tagId, + avgScore: sql`round(avg(${postTags.score}), 0)`.as("avg_score"), + algos: sql`ARRAY_AGG(DISTINCT ${postTags.algo})`.as("algos"), + }) + .from(postTags) + .groupBy(sql`${postTags.postId}, ${postTags.tagId}`); +}); diff --git a/packages/atproto/domain/classify-manually.ts b/packages/atproto/domain/classify-manually.ts new file mode 100644 index 0000000..afd44f2 --- /dev/null +++ b/packages/atproto/domain/classify-manually.ts @@ -0,0 +1,31 @@ +import type { ClassifierTags } from "../classifiers/types"; +import type { AtContext } from "../context"; +import { postTags, tagTable } from "../db/schema"; + +export async function classifyPost( + ctx: AtContext, + { + postUri, + tag, + score, + algorithm, + }: { postUri: string; tag: ClassifierTags; score: number; algorithm: string } +) { + await ctx.db.transaction(async (tx) => { + await tx + .insert(tagTable) + .values({ + id: tag, + }) + .onConflictDoNothing(); + await tx + .insert(postTags) + .values({ + algo: algorithm, + postId: postUri, + score, + tagId: tag, + }) + .onConflictDoNothing(); + }); +} diff --git a/packages/atproto/domain/get-feed-posts.ts b/packages/atproto/domain/get-feed-posts.ts index b31906b..c8d74a3 100644 --- a/packages/atproto/domain/get-feed-posts.ts +++ b/packages/atproto/domain/get-feed-posts.ts @@ -1,8 +1,8 @@ -import { eq } from "drizzle-orm/expressions"; +import { and, desc, eq, gte } from "drizzle-orm/expressions"; import type { AtContext } from "../context"; -import { followTable, postTable } from "../db/schema"; +import { followTable, postScores, postTable } from "../db/schema"; -export async function getFeedPosts( +export async function getTechFollowingFeed( ctx: AtContext, did: string ): Promise> { @@ -15,7 +15,14 @@ export async function getFeedPosts( const posts = await ctx.db .select({ id: postTable.id }) .from(postTable) - .innerJoin(fls, eq(postTable.authorId, fls.follows)); + .innerJoin(fls, eq(postTable.authorId, fls.follows)) + .innerJoin( + postScores, + and(eq(postScores.postId, postTable.id), eq(postScores.tagId, "tech")) + ) + .where(gte(postScores.avgScore, 80)) // TODO: Raise this to 80 + .orderBy(desc(postTable.created)) + .limit(50); return posts.map((post) => post.id); } diff --git a/packages/atproto/domain/jetstream-subscription.ts b/packages/atproto/domain/jetstream-subscription.ts index 8a4f27d..b48b4f0 100644 --- a/packages/atproto/domain/jetstream-subscription.ts +++ b/packages/atproto/domain/jetstream-subscription.ts @@ -1,8 +1,12 @@ -import { AtUri, type AppBskyFeedPost } from "@atproto/api"; +import { AtUri } from "@atproto/api"; +import { desc } from "drizzle-orm"; import type { AtContext } from "../context"; -import { followTable } from "../db/schema"; +import { followTable, postTable } from "../db/schema"; import { createJetStreamListener } from "./jetstream"; -import { queueForClassification } from "./queue-for-classification"; +import { + queueForClassification, + type FeedPostWithUri, +} from "./queue-for-classification"; export async function listenForPosts(ctx: AtContext) { const wantedDids = await ctx.db @@ -15,17 +19,26 @@ export async function listenForPosts(ctx: AtContext) { return; } - async function handlePostCreated( - uri: string, - postRecord: AppBskyFeedPost.Record - ) { - const atUrl = new AtUri(uri); + const latestPost = await ctx.db + .select() + .from(postTable) + .orderBy(desc(postTable.created)) + .limit(1); - await queueForClassification(ctx, { uri, record: postRecord }); + const cursor = + latestPost.length > 0 + ? Math.floor(new Date(latestPost[0].created).getTime() / 1000) + : undefined; + + async function handlePostCreated(args: FeedPostWithUri) { + const atUrl = new AtUri(args.uri); + + await queueForClassification(ctx, args); } createJetStreamListener({ wantedDids: dids, onPostCreated: handlePostCreated, + cursor: cursor?.toString(), }); } diff --git a/packages/atproto/domain/jetstream.ts b/packages/atproto/domain/jetstream.ts index 3b36482..f02352b 100644 --- a/packages/atproto/domain/jetstream.ts +++ b/packages/atproto/domain/jetstream.ts @@ -1,7 +1,9 @@ import type { AppBskyFeedPost } from "@atproto/api"; import zstd from "@bokuweb/zstd-wasm"; +import path from "path"; +import type { FeedPostWithUri } from "./queue-for-classification"; -const zDictionary = Bun.file("./zstd_dictionary.dat"); +const zDictionary = Bun.file(path.join(__dirname, "../zstd_dictionary.dat")); type PostRecord = AppBskyFeedPost.Record & { reply?: { @@ -21,6 +23,7 @@ type StreamCollection = { time_us: number; kind: "commit"; commit: { + cid: string; collection: "app.bsky.feed.post"; rev: string; operation: "create"; @@ -45,8 +48,9 @@ export async function createJetStreamListener({ }: { wantedCollections?: Array; wantedDids?: Array; + /** Typically the unixtime of the last received post */ cursor?: string; - onPostCreated?: (uri: string, post: AppBskyFeedPost.Record) => void; + onPostCreated?: (post: FeedPostWithUri) => void; }) { async function init() { await zstd.init(); @@ -69,6 +73,7 @@ export async function createJetStreamListener({ }); url.searchParams.append("requireHello", "true"); url.searchParams.append("compress", "true"); + if (cursor) url.searchParams.append("cursor", cursor); const query = url.toString(); console.log(`[JETSTREAM] query (${requestDids.length})`, query); @@ -88,6 +93,7 @@ export async function createJetStreamListener({ }); wss.addEventListener("close", (ev) => { console.log("[jetstream] closed", ev.code, ev.reason, ev.wasClean); + // TODO: Wait a while, and reconnect }); wss.addEventListener("error", (ev) => { console.log("[jetstream] error"); @@ -111,10 +117,11 @@ export async function createJetStreamListener({ data.commit.operation === "create" && data.commit.collection === "app.bsky.feed.post" ) { - onPostCreated?.( - `at://${data.did}/app.bsky.feed.post/${data.commit.rkey}`, - data.commit.record - ); + onPostCreated?.({ + uri: `at://${data.did}/app.bsky.feed.post/${data.commit.rkey}`, + record: data.commit.record, + cid: data.commit.cid, + }); } } diff --git a/packages/atproto/domain/queue-for-classification.ts b/packages/atproto/domain/queue-for-classification.ts index e00bf4d..9695c8d 100644 --- a/packages/atproto/domain/queue-for-classification.ts +++ b/packages/atproto/domain/queue-for-classification.ts @@ -1,29 +1,49 @@ import { AtUri, type AppBskyFeedPost } from "@atproto/api"; import type { AtContext } from "../context"; -import { post_queue } from "../db/schema"; +import { postRecords, postTable } from "../db/schema"; export type FeedPostWithUri = { uri: string; + cid: string; record: AppBskyFeedPost.Record; }; export async function queueForClassification( ctx: AtContext, - // TODO: Just receive the entire PostRecord post: FeedPostWithUri ) { - // TODO: Eliminate replies + //if (!!post.record.reply) return; // TODO: Eliminate anything other than english + if (!post.record.langs?.includes("en")) return; const uri = new AtUri(post.uri); const authorId = uri.hostname; - - await ctx.db.transaction(async (tx) => { - await tx.insert(post_queue).values({ - type: "AppBskyFeedPost.Record", - postId: post.uri, - value: post.record, + try { + await ctx.db.transaction(async (tx) => { + await tx + .insert(postTable) + .values({ + authorId, + id: post.uri, + created: post.record.createdAt, + modified: post.record.createdAt, + }) + .onConflictDoNothing(); + // TODO: Maybe store author in a table later for scoring + await tx + .insert(postRecords) + .values({ + type: "AppBskyFeedPost.Record", + postId: post.uri, + value: post.record, + cid: post.cid, + }) + .onConflictDoNothing(); + }); + console.log(`[queue] ${post.uri} stored`); + } catch (err) { + throw new Error(`[queue] failed to store post: ${post.uri}`, { + cause: err, }); - }); - console.log(`[classifier] ${post.uri} stored`); + } } diff --git a/packages/atproto/drizzle.config.ts b/packages/atproto/drizzle.config.ts index 13e3f04..a2b96c3 100644 --- a/packages/atproto/drizzle.config.ts +++ b/packages/atproto/drizzle.config.ts @@ -1,11 +1,10 @@ import { defineConfig } from "drizzle-kit"; -import { config } from "./config"; export default defineConfig({ - dialect: "sqlite", + dialect: "postgresql", schema: "./db/schema.ts", out: "./db/drizzle", dbCredentials: { - url: config.sqliteFile, + url: process.env["PG_URL"] ?? "fail", }, }); diff --git a/packages/atproto/feeds/README.md b/packages/atproto/feeds/README.md new file mode 100644 index 0000000..8265714 --- /dev/null +++ b/packages/atproto/feeds/README.md @@ -0,0 +1,7 @@ +# feeds + +## Ideas + +1. Tech (follows) +2. Tech (all) +3. Passthrough debug diff --git a/packages/atproto/index.ts b/packages/atproto/index.ts index 7b60380..ee01872 100644 --- a/packages/atproto/index.ts +++ b/packages/atproto/index.ts @@ -1,2 +1,9 @@ export * from "./context"; +export * from "./domain/classify-manually"; +export * from "./domain/get-feed-posts"; +export * from "./domain/get-or-update-follows"; +export * from "./domain/jetstream"; export * from "./domain/jetstream-subscription"; +export * from "./domain/queue-for-classification"; +export * from "./helpers/jwt"; +export * from "./scripts/classify"; diff --git a/packages/atproto/package.json b/packages/atproto/package.json index c82463e..8adb0db 100644 --- a/packages/atproto/package.json +++ b/packages/atproto/package.json @@ -19,10 +19,12 @@ "typescript": "^5.0.0" }, "dependencies": { + "db": "workspace:*", "@atproto/api": "^0.13.21", "@bokuweb/zstd-wasm": "^0.0.22", "@skyware/jetstream": "^0.2.1", "drizzle-orm": "^0.38.2", + "postgres": "^3.4.5", "zstddec": "^0.1.0" } } diff --git a/packages/atproto/pt1.ts b/packages/atproto/pt1.ts index e75f952..5fc8eec 100644 --- a/packages/atproto/pt1.ts +++ b/packages/atproto/pt1.ts @@ -1,5 +1,3 @@ -import { getFeedSkeletonHandler } from "./api/get-feed-skeleton"; -import { wellKnownDidHandler } from "./api/well-known-did"; import { config } from "./config"; import { createAtContext } from "./context"; import { listenForPosts } from "./domain/jetstream-subscription"; @@ -20,10 +18,6 @@ Bun.serve({ switch (url.pathname) { case "/": return new Response("Bare bones feed generator for Bluesky"); - case "/.well-known/did.json": - return wellKnownDidHandler(req, atContext); - case "/xrpc/app.bsky.feed.getFeedSkeleton": - return getFeedSkeletonHandler(req, atContext); default: return new Response("404!"); } diff --git a/packages/atproto/scripts/classify.ts b/packages/atproto/scripts/classify.ts new file mode 100644 index 0000000..795f090 --- /dev/null +++ b/packages/atproto/scripts/classify.ts @@ -0,0 +1,58 @@ +import { eq } from "drizzle-orm"; +import { gitHubLinkClassifier } from "../classifiers/tech/github-links"; +import { mutedWordsClassifier } from "../classifiers/tech/muted-words"; +import { techWordsRegExp } from "../classifiers/tech/tech-words"; +import type { ClassifierFn } from "../classifiers/types"; +import { createAtContext } from "../context"; +import { postRecords, postTable, postTags, tagTable } from "../db/schema"; + +const classifiers: Array = [ + mutedWordsClassifier, + techWordsRegExp, + gitHubLinkClassifier, +]; + +export async function classifier() { + // 1. Process existing records in batches + const ctx = await createAtContext(); + + const res = await ctx.db + .select() + .from(postTable) + .innerJoin(postRecords, eq(postTable.id, postRecords.postId)); + //.limit(100); + + for (const pr of res) { + for (const cf of classifiers) { + const record = pr.post_record.value; + if (!record) continue; + const res = await cf({ + ctx, + post: { + uri: pr.post.id, + record: record, + cid: pr.post_record.cid, + }, + }); + if (res.score === null) continue; + await ctx.db.transaction(async (tx) => { + await tx + .insert(tagTable) + .values({ + id: res.tag, + }) + .onConflictDoNothing(); + await tx + .insert(postTags) + .values({ + algo: cf.name, + postId: pr.post.id, + score: res.score as number, + tagId: res.tag, + }) + .onConflictDoNothing(); + }); + } + } + // 2. Listen/Notify from Postgres +} diff --git a/packages/db/.gitignore b/packages/db/.gitignore new file mode 100644 index 0000000..9b1ee42 --- /dev/null +++ b/packages/db/.gitignore @@ -0,0 +1,175 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Caches + +.cache + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/packages/db/README.md b/packages/db/README.md new file mode 100644 index 0000000..68e62ee --- /dev/null +++ b/packages/db/README.md @@ -0,0 +1,15 @@ +# db + +To install dependencies: + +```bash +bun install +``` + +To run: + +```bash +bun run index.ts +``` + +This project was created using `bun init` in bun v1.1.40. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime. diff --git a/packages/db/package.json b/packages/db/package.json new file mode 100644 index 0000000..b067a2d --- /dev/null +++ b/packages/db/package.json @@ -0,0 +1,13 @@ +{ + "name": "db", + "type": "module", + "scripts": { + "dev": "cd ../../ && docker compose up" + }, + "devDependencies": { + "@types/bun": "latest" + }, + "peerDependencies": { + "typescript": "^5.0.0" + } +} diff --git a/packages/db/tsconfig.json b/packages/db/tsconfig.json new file mode 100644 index 0000000..238655f --- /dev/null +++ b/packages/db/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +} diff --git a/packages/atproto-feed/README.md b/packages/old/atproto-feed/README.md similarity index 100% rename from packages/atproto-feed/README.md rename to packages/old/atproto-feed/README.md diff --git a/packages/old/atutils/.gitignore b/packages/old/atutils/.gitignore new file mode 100644 index 0000000..9b1ee42 --- /dev/null +++ b/packages/old/atutils/.gitignore @@ -0,0 +1,175 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Caches + +.cache + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/packages/atutils/README.md b/packages/old/atutils/README.md similarity index 100% rename from packages/atutils/README.md rename to packages/old/atutils/README.md diff --git a/packages/atutils/index.ts b/packages/old/atutils/index.ts similarity index 100% rename from packages/atutils/index.ts rename to packages/old/atutils/index.ts diff --git a/packages/atutils/package.json b/packages/old/atutils/package.json similarity index 100% rename from packages/atutils/package.json rename to packages/old/atutils/package.json diff --git a/packages/old/atutils/tsconfig.json b/packages/old/atutils/tsconfig.json new file mode 100644 index 0000000..238655f --- /dev/null +++ b/packages/old/atutils/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +} diff --git a/packages/classifiers/is-about-programming.ts b/packages/old/classifiers/is-about-programming.ts similarity index 100% rename from packages/classifiers/is-about-programming.ts rename to packages/old/classifiers/is-about-programming.ts diff --git a/packages/classifiers/naive-bayes-classifier.ts b/packages/old/classifiers/naive-bayes-classifier.ts similarity index 100% rename from packages/classifiers/naive-bayes-classifier.ts rename to packages/old/classifiers/naive-bayes-classifier.ts diff --git a/packages/classifiers/tokenizer.ts b/packages/old/classifiers/tokenizer.ts similarity index 100% rename from packages/classifiers/tokenizer.ts rename to packages/old/classifiers/tokenizer.ts -- 2.51.2