From 359558e2d6d8476b519dc7d78f4731a9fc41a0f4 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Thu, 13 Feb 2025 17:21:33 -0600 Subject: [PATCH 1/2] Remove unused docs and ansible directories --- ansible/playbook.yml | 30 ------------------------------ docs/auth.md | 23 ----------------------- docs/debugging.md | 27 --------------------------- docs/installation.md | 15 --------------- docs/mastodon-api.md | 9 --------- 5 files changed, 104 deletions(-) delete mode 100644 ansible/playbook.yml delete mode 100644 docs/auth.md delete mode 100644 docs/debugging.md delete mode 100644 docs/installation.md delete mode 100644 docs/mastodon-api.md diff --git a/ansible/playbook.yml b/ansible/playbook.yml deleted file mode 100644 index 59c2c8ea..00000000 --- a/ansible/playbook.yml +++ /dev/null @@ -1,30 +0,0 @@ ---- -- name: Update Ditto - hosts: all - become: true - tasks: - - name: Update Deno - shell: - cmd: curl -fsSL https://deno.land/x/install/install.sh | sh - environment: - DENO_INSTALL: /usr/local - become_user: root - - - name: Update Soapbox - shell: - cmd: deno task soapbox - chdir: /opt/ditto - become_user: ditto - - - name: Update ditto from the main branch - git: - repo: 'https://gitlab.com/soapbox-pub/ditto.git' - dest: '/opt/ditto' - version: main - become_user: ditto - - - name: Restart ditto service - systemd: - name: ditto - state: restarted - become_user: root diff --git a/docs/auth.md b/docs/auth.md deleted file mode 100644 index 119a7dc2..00000000 --- a/docs/auth.md +++ /dev/null @@ -1,23 +0,0 @@ -# Authentication in Ditto - -One of the main benefits of Nostr is that users control their keys. Instead of a username and password, the user has a public key (`npub` or `pubkey`) and private key (`nsec`). The public key is a globally-unique identifier for the user, and the private key can be used to sign events, producing a signature that only the pubkey could have produced. - -With keys, users have full control over their identity. They can move between servers freely, and post to multiple servers at once. But with such power comes great responsibilities. Users cannot lose control of their key, or they'll lose control over their account forever. - -## Managing Keys - -There are several ways to manage keys in Nostr, and they all come with trade-offs. It's new territory, and people are still coming up with new ideas. - -The main concerns are how to **conveniently log in on multiple devices**, and **who/what to trust with your key.** - -### Current Solutions - -1. **Private key text.** Users copy their key between devices/apps, giving apps full control over their key. Users might email the key to themselves, or better yet use a password manager, or apps might even provide a QR code for other apps to scan. This method is convenient, but it's not secure. Keys can get compromised in transit, or by a malicious or vulnerable app. - -2. **Browser extension.** For web clients, an extension can expose `getPublicKey` and `signEvent` functions to web-pages without exposing the private key directly. This option is secure, but it only works well for laptop/desktop devices. On mobile, only FireFox can do it, with no support from Safari or Chrome. It also offers no way to share a key across devices on its own. - -3. **Remote signer**. Users can run a remote signer program and then connect apps to it. The signer should be running 24/7, so it's best suited for running on a server. This idea has evolved into the creation of "bunker" services. Bunkers allow users to have a traditional username and password and login from anywhere. This method solves a lot of problems, but it also creates some problems. Users have to create an account on a separate website before they can log into your website. This makes it an option for more advanced users. Also, it's concerning that the administrator of the bunker server has full control over your keys. None of this is a problem if you run your own remote signer, but it's not a mainstream option. - -4. **Custodial**. Apps which make you log you in with a username/password, and then keep Nostr keys for each user in their database. You might not even be able to export your keys. This option may be easier for users at first, but it puts a whole lot of liability on the server, since leaks can cause permanent damage. It also gives up a lot of the benefits of Nostr. - -Each of these ideas could be improved upon greatly with new experiments and technical progress. But to Ditto, user freedom matters the most, so we're focusing on non-custodial solution. Even though there are security risks to copying around keys, the onus is on the user. The user may fall victim to a targeted attack (or make a stupid mistake), whereas custodial servers have the ability to wipe out entire demographics of users at once. Therefore we believe that custodial solutions are actually _less_ secure than users copying around keys. Users must take precautions about which apps to trust with their private key until we improve upon the area to make it more secure (likely with better support of browser extensions, OS key management, and more). diff --git a/docs/debugging.md b/docs/debugging.md deleted file mode 100644 index 879f36cd..00000000 --- a/docs/debugging.md +++ /dev/null @@ -1,27 +0,0 @@ -# Debugging Ditto - -Running the command `deno task debug` will start the Ditto server in debug mode, making it possible to inspect with Chromium-based browsers by visiting `chrome://inspect`. - -From there, go to the "Performance" tab and click "Start profiling". Perform the actions you want to profile, then click "Stop profiling". You can then inspect the call stack and see where the time is being spent. - -## Remote debugging - -If the Ditto server is on a separate machine, you will first need to put it into debug mode. Edit its systemd file (usually located at `/etc/systemd/system/ditto.service`) and change `deno task start` to `deno task debug` in the `ExecStart` line. Then run `systemctl daemon-reload` and `systemctl restart ditto`. - -To access the debugger remotely, you can use SSH port forwarding. Run this command on your local machine, replacing `@` with the SSH login for the remote machine: - -```sh -ssh -L 9229:localhost:9229 @ -``` - -Then, in Chromium, go to `chrome://inspect` and the Ditto server should be available. - -## SQL performance - -To track slow queries, first set `DEBUG=ditto:sql` in the environment so only SQL logs are shown. - -Then, grep for any logs above 0.001s: - -```sh -journalctl -fu ditto | grep -v '(0.00s)' -``` diff --git a/docs/installation.md b/docs/installation.md deleted file mode 100644 index 9077a7cb..00000000 --- a/docs/installation.md +++ /dev/null @@ -1,15 +0,0 @@ -# Installing Ditto - -First, install Deno: - -```sh -curl -fsSL https://deno.land/x/install/install.sh | sudo DENO_INSTALL=/usr/local sh -``` - -Now, run Ditto: - -```sh -deno run -A https://gitlab.com/soapbox-pub/ditto/-/raw/main/src/server.ts -``` - -That's it! Ditto is now running on your machine. diff --git a/docs/mastodon-api.md b/docs/mastodon-api.md deleted file mode 100644 index 48684b6f..00000000 --- a/docs/mastodon-api.md +++ /dev/null @@ -1,9 +0,0 @@ -# Mastodon API - -Ditto implements Mastodon's client-server API, a REST API used by Mastodon mobile apps and frontends to interact with Mastodon servers. While it was originally designed for Mastodon, it has been adopted by other ActivityPub servers such as Pleroma, Mitra, Friendica, and many others. - -Note that Mastodon API is **not** ActivityPub. It is not the API used to federate between servers. Instead, it enables user interfaces, mobile apps, bots, and other clients to interact with Mastodon servers. - -Mastodon is built in Ruby on Rails, and its API is inspired by Twitter's legacy REST API. Rails, being an MVC framework, has "models", which it maps directly to "Entities" in its API. - -Endpoints return either a single Entity, or an array of Entities. Entities Entities are JSON objects with a specific structure, and are documented in the [Mastodon API documentation](https://docs.joinmastodon.org/api/). From a2de8cdf82fbd10227b10ee2a3f96d72e7ed0eec Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Thu, 13 Feb 2025 17:41:30 -0600 Subject: [PATCH 2/2] Remove unnecessary lint rules from deno.json, avoid explicit any --- deno.json | 10 ---------- src/app.ts | 1 + src/db/migrations/000_create_events.ts | 4 ++-- src/db/migrations/001_add_relays.ts | 4 ++-- src/db/migrations/002_events_fts.ts | 4 ++-- src/db/migrations/003_events_admin.ts | 4 ++-- src/db/migrations/004_add_user_indexes.ts | 4 ++-- src/db/migrations/005_rework_tags.ts | 4 ++-- src/db/migrations/006_pragma.ts | 4 ++-- src/db/migrations/007_unattached_media.ts | 4 ++-- src/db/migrations/008_wal.ts | 4 ++-- src/db/migrations/009_add_stats.ts | 4 ++-- src/db/migrations/010_drop_users.ts | 4 ++-- src/db/migrations/011_kind_author_index.ts | 4 ++-- src/db/migrations/012_tags_composite_index.ts | 4 ++-- src/db/migrations/013_soft_deletion.ts | 4 ++-- src/db/migrations/014_stats_indexes.ts.ts | 4 ++-- src/db/migrations/015_add_pubkey_domains.ts | 4 ++-- src/db/migrations/016_pubkey_domains_updated_at.ts | 4 ++-- src/db/migrations/017_rm_relays.ts | 4 ++-- src/db/migrations/018_events_created_at_kind_index.ts | 4 ++-- src/db/migrations/019_ndatabase_schema.ts | 4 ++-- src/db/migrations/020_drop_deleted_at.ts | 3 ++- src/db/migrations/020_pgfts.ts | 4 ++-- src/db/migrations/021_pgfts_index.ts | 4 ++-- src/db/migrations/022_event_stats_reactions.ts | 4 ++-- src/db/migrations/023_add_nip46_tokens.ts | 4 ++-- src/db/migrations/024_event_stats_quotes_count.ts | 4 ++-- src/db/migrations/025_event_stats_add_zap_count.ts | 4 ++-- src/db/migrations/026_tags_name_index.ts | 4 ++-- src/db/migrations/027_add_zap_events.ts | 4 ++-- src/db/migrations/028_stable_sort.ts | 4 ++-- src/db/migrations/029_tag_queries.ts | 4 ++-- src/db/migrations/030_pg_events_jsonb.ts | 4 ++-- src/db/migrations/031_rm_unattached_media.ts | 4 ++-- src/db/migrations/032_add_author_search.ts | 4 ++-- src/db/migrations/033_add_language.ts | 4 ++-- .../034_move_author_search_to_author_stats.ts | 3 ++- src/db/migrations/035_author_stats_followers_index.ts | 4 ++-- src/db/migrations/036_stats64.ts | 3 ++- src/db/migrations/038_push_subscriptions.ts | 4 ++-- src/db/migrations/039_pg_notify.ts | 4 ++-- src/db/migrations/040_add_bunker_pubkey.ts | 3 ++- src/db/migrations/041_pg_notify_id_only.ts | 4 ++-- src/db/migrations/042_add_search_ext.ts | 4 ++-- src/db/migrations/043_rm_language.ts | 4 ++-- src/db/migrations/044_search_ext_drop_default.ts | 4 ++-- src/db/migrations/048_rm_pubkey_domains.ts | 2 +- src/db/migrations/049_author_stats_sorted.ts | 1 + src/storages/EventsDB.ts | 3 ++- src/utils/formdata.ts | 2 ++ 51 files changed, 97 insertions(+), 98 deletions(-) diff --git a/deno.json b/deno.json index 2a8d18f9..36529d96 100644 --- a/deno.json +++ b/deno.json @@ -100,16 +100,6 @@ "zod": "npm:zod@^3.23.8", "~/fixtures/": "./fixtures/" }, - "lint": { - "rules": { - "tags": [ - "recommended" - ], - "exclude": [ - "no-explicit-any" - ] - } - }, "fmt": { "useTabs": false, "lineWidth": 120, diff --git a/src/app.ts b/src/app.ts index 8482d491..3c11a78c 100644 --- a/src/app.ts +++ b/src/app.ts @@ -170,6 +170,7 @@ export interface AppEnv extends HonoEnv { type AppContext = Context; type AppMiddleware = MiddlewareHandler; +// deno-lint-ignore no-explicit-any type AppController

= Handler>; const app = new Hono({ strict: false }); diff --git a/src/db/migrations/000_create_events.ts b/src/db/migrations/000_create_events.ts index f08a614e..9cfffc6c 100644 --- a/src/db/migrations/000_create_events.ts +++ b/src/db/migrations/000_create_events.ts @@ -1,6 +1,6 @@ import { Kysely } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema .createTable('events') .addColumn('id', 'text', (col) => col.primaryKey()) @@ -52,7 +52,7 @@ export async function up(db: Kysely): Promise { .execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.dropTable('events').execute(); await db.schema.dropTable('tags').execute(); await db.schema.dropTable('users').execute(); diff --git a/src/db/migrations/001_add_relays.ts b/src/db/migrations/001_add_relays.ts index 11c68844..c1685e34 100644 --- a/src/db/migrations/001_add_relays.ts +++ b/src/db/migrations/001_add_relays.ts @@ -1,6 +1,6 @@ import { Kysely } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema .createTable('relays') .addColumn('url', 'text', (col) => col.primaryKey()) @@ -9,6 +9,6 @@ export async function up(db: Kysely): Promise { .execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.dropTable('relays').execute(); } diff --git a/src/db/migrations/002_events_fts.ts b/src/db/migrations/002_events_fts.ts index 45ad03e4..392d3c0a 100644 --- a/src/db/migrations/002_events_fts.ts +++ b/src/db/migrations/002_events_fts.ts @@ -1,8 +1,8 @@ import { Kysely } from 'kysely'; -export async function up(_db: Kysely): Promise { +export async function up(_db: Kysely): Promise { // This migration used to create an FTS table for SQLite, but SQLite support was removed. } -export async function down(_db: Kysely): Promise { +export async function down(_db: Kysely): Promise { } diff --git a/src/db/migrations/003_events_admin.ts b/src/db/migrations/003_events_admin.ts index 388a3a47..46dbb37b 100644 --- a/src/db/migrations/003_events_admin.ts +++ b/src/db/migrations/003_events_admin.ts @@ -1,8 +1,8 @@ import { Kysely } from 'kysely'; -export async function up(_db: Kysely): Promise { +export async function up(_db: Kysely): Promise { } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.alterTable('users').dropColumn('admin').execute(); } diff --git a/src/db/migrations/004_add_user_indexes.ts b/src/db/migrations/004_add_user_indexes.ts index fca9c5f3..1759644e 100644 --- a/src/db/migrations/004_add_user_indexes.ts +++ b/src/db/migrations/004_add_user_indexes.ts @@ -1,9 +1,9 @@ import { Kysely } from 'kysely'; -export async function up(_db: Kysely): Promise { +export async function up(_db: Kysely): Promise { } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.dropIndex('idx_users_pubkey').execute(); await db.schema.dropIndex('idx_users_username').execute(); } diff --git a/src/db/migrations/005_rework_tags.ts b/src/db/migrations/005_rework_tags.ts index 1f95810e..29d83962 100644 --- a/src/db/migrations/005_rework_tags.ts +++ b/src/db/migrations/005_rework_tags.ts @@ -1,6 +1,6 @@ import { Kysely, sql } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema .createTable('tags_new') .addColumn('tag', 'text', (col) => col.notNull()) @@ -42,7 +42,7 @@ export async function up(db: Kysely): Promise { .execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.dropTable('tags').execute(); await db.schema diff --git a/src/db/migrations/006_pragma.ts b/src/db/migrations/006_pragma.ts index f20ee9bd..41c6883f 100644 --- a/src/db/migrations/006_pragma.ts +++ b/src/db/migrations/006_pragma.ts @@ -1,7 +1,7 @@ import { Kysely } from 'kysely'; -export async function up(_db: Kysely): Promise { +export async function up(_db: Kysely): Promise { } -export async function down(_db: Kysely): Promise { +export async function down(_db: Kysely): Promise { } diff --git a/src/db/migrations/007_unattached_media.ts b/src/db/migrations/007_unattached_media.ts index a36c5d35..eb738ecb 100644 --- a/src/db/migrations/007_unattached_media.ts +++ b/src/db/migrations/007_unattached_media.ts @@ -1,6 +1,6 @@ import { Kysely } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema .createTable('unattached_media') .addColumn('id', 'text', (c) => c.primaryKey()) @@ -29,6 +29,6 @@ export async function up(db: Kysely): Promise { .execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.dropTable('unattached_media').execute(); } diff --git a/src/db/migrations/008_wal.ts b/src/db/migrations/008_wal.ts index f20ee9bd..41c6883f 100644 --- a/src/db/migrations/008_wal.ts +++ b/src/db/migrations/008_wal.ts @@ -1,7 +1,7 @@ import { Kysely } from 'kysely'; -export async function up(_db: Kysely): Promise { +export async function up(_db: Kysely): Promise { } -export async function down(_db: Kysely): Promise { +export async function down(_db: Kysely): Promise { } diff --git a/src/db/migrations/009_add_stats.ts b/src/db/migrations/009_add_stats.ts index ef1c4438..3865847e 100644 --- a/src/db/migrations/009_add_stats.ts +++ b/src/db/migrations/009_add_stats.ts @@ -1,6 +1,6 @@ import { Kysely } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema .createTable('author_stats') .addColumn('pubkey', 'text', (col) => col.primaryKey()) @@ -18,7 +18,7 @@ export async function up(db: Kysely): Promise { .execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.dropTable('author_stats').execute(); await db.schema.dropTable('event_stats').execute(); } diff --git a/src/db/migrations/010_drop_users.ts b/src/db/migrations/010_drop_users.ts index c36f2fa9..e936fa00 100644 --- a/src/db/migrations/010_drop_users.ts +++ b/src/db/migrations/010_drop_users.ts @@ -1,8 +1,8 @@ import { Kysely } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema.dropTable('users').ifExists().execute(); } -export async function down(_db: Kysely): Promise { +export async function down(_db: Kysely): Promise { } diff --git a/src/db/migrations/011_kind_author_index.ts b/src/db/migrations/011_kind_author_index.ts index c41910b4..844c105c 100644 --- a/src/db/migrations/011_kind_author_index.ts +++ b/src/db/migrations/011_kind_author_index.ts @@ -1,6 +1,6 @@ import { Kysely } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema .createIndex('idx_events_kind_pubkey_created_at') .on('events') @@ -8,6 +8,6 @@ export async function up(db: Kysely): Promise { .execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.dropIndex('idx_events_kind_pubkey_created_at').execute(); } diff --git a/src/db/migrations/012_tags_composite_index.ts b/src/db/migrations/012_tags_composite_index.ts index 412fa599..3894ed27 100644 --- a/src/db/migrations/012_tags_composite_index.ts +++ b/src/db/migrations/012_tags_composite_index.ts @@ -1,6 +1,6 @@ import { Kysely } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema.dropIndex('idx_tags_tag').execute(); await db.schema.dropIndex('idx_tags_value').execute(); @@ -11,7 +11,7 @@ export async function up(db: Kysely): Promise { .execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.dropIndex('idx_tags_tag_value').execute(); await db.schema diff --git a/src/db/migrations/013_soft_deletion.ts b/src/db/migrations/013_soft_deletion.ts index df19da50..17fcf5ea 100644 --- a/src/db/migrations/013_soft_deletion.ts +++ b/src/db/migrations/013_soft_deletion.ts @@ -1,9 +1,9 @@ import { Kysely } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema.alterTable('events').addColumn('deleted_at', 'integer').execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.alterTable('events').dropColumn('deleted_at').execute(); } diff --git a/src/db/migrations/014_stats_indexes.ts.ts b/src/db/migrations/014_stats_indexes.ts.ts index 0f27a7fa..db52b89a 100644 --- a/src/db/migrations/014_stats_indexes.ts.ts +++ b/src/db/migrations/014_stats_indexes.ts.ts @@ -1,11 +1,11 @@ import { Kysely } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema.createIndex('idx_author_stats_pubkey').on('author_stats').column('pubkey').execute(); await db.schema.createIndex('idx_event_stats_event_id').on('event_stats').column('event_id').execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.dropIndex('idx_author_stats_pubkey').on('author_stats').execute(); await db.schema.dropIndex('idx_event_stats_event_id').on('event_stats').execute(); } diff --git a/src/db/migrations/015_add_pubkey_domains.ts b/src/db/migrations/015_add_pubkey_domains.ts index 4b7e23c4..91a480d5 100644 --- a/src/db/migrations/015_add_pubkey_domains.ts +++ b/src/db/migrations/015_add_pubkey_domains.ts @@ -1,6 +1,6 @@ import { Kysely } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema .createTable('pubkey_domains') .ifNotExists() @@ -16,6 +16,6 @@ export async function up(db: Kysely): Promise { .execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.dropTable('pubkey_domains').execute(); } diff --git a/src/db/migrations/016_pubkey_domains_updated_at.ts b/src/db/migrations/016_pubkey_domains_updated_at.ts index 8b1f75d0..26f45fb7 100644 --- a/src/db/migrations/016_pubkey_domains_updated_at.ts +++ b/src/db/migrations/016_pubkey_domains_updated_at.ts @@ -1,12 +1,12 @@ import { Kysely } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema .alterTable('pubkey_domains') .addColumn('last_updated_at', 'integer', (col) => col.notNull().defaultTo(0)) .execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.alterTable('pubkey_domains').dropColumn('last_updated_at').execute(); } diff --git a/src/db/migrations/017_rm_relays.ts b/src/db/migrations/017_rm_relays.ts index 70a274d0..eeea4d06 100644 --- a/src/db/migrations/017_rm_relays.ts +++ b/src/db/migrations/017_rm_relays.ts @@ -1,10 +1,10 @@ import { Kysely } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema.dropTable('relays').execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema .createTable('relays') .addColumn('url', 'text', (col) => col.primaryKey()) diff --git a/src/db/migrations/018_events_created_at_kind_index.ts b/src/db/migrations/018_events_created_at_kind_index.ts index 8e6c67c0..17ffa856 100644 --- a/src/db/migrations/018_events_created_at_kind_index.ts +++ b/src/db/migrations/018_events_created_at_kind_index.ts @@ -1,6 +1,6 @@ import { Kysely } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema .createIndex('idx_events_created_at_kind') .on('events') @@ -9,6 +9,6 @@ export async function up(db: Kysely): Promise { .execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.dropIndex('idx_events_created_at_kind').ifExists().execute(); } diff --git a/src/db/migrations/019_ndatabase_schema.ts b/src/db/migrations/019_ndatabase_schema.ts index 79d8cbc9..a394ed71 100644 --- a/src/db/migrations/019_ndatabase_schema.ts +++ b/src/db/migrations/019_ndatabase_schema.ts @@ -1,12 +1,12 @@ import { Kysely } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema.alterTable('events').renameTo('nostr_events').execute(); await db.schema.alterTable('tags').renameTo('nostr_tags').execute(); await db.schema.alterTable('nostr_tags').renameColumn('tag', 'name').execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.alterTable('nostr_events').renameTo('events').execute(); await db.schema.alterTable('nostr_tags').renameTo('tags').execute(); await db.schema.alterTable('tags').renameColumn('name', 'tag').execute(); diff --git a/src/db/migrations/020_drop_deleted_at.ts b/src/db/migrations/020_drop_deleted_at.ts index 4894b9f5..a55fe537 100644 --- a/src/db/migrations/020_drop_deleted_at.ts +++ b/src/db/migrations/020_drop_deleted_at.ts @@ -1,10 +1,11 @@ import { Kysely } from 'kysely'; +// deno-lint-ignore no-explicit-any export async function up(db: Kysely): Promise { await db.deleteFrom('nostr_events').where('deleted_at', 'is not', null).execute(); await db.schema.alterTable('nostr_events').dropColumn('deleted_at').execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.alterTable('nostr_events').addColumn('deleted_at', 'integer').execute(); } diff --git a/src/db/migrations/020_pgfts.ts b/src/db/migrations/020_pgfts.ts index 26e320ec..8b22a4e3 100644 --- a/src/db/migrations/020_pgfts.ts +++ b/src/db/migrations/020_pgfts.ts @@ -1,6 +1,6 @@ import { Kysely, sql } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema.createTable('nostr_pgfts') .ifNotExists() .addColumn('event_id', 'text', (c) => c.primaryKey().references('nostr_events.id').onDelete('cascade')) @@ -8,6 +8,6 @@ export async function up(db: Kysely): Promise { .execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.dropTable('nostr_pgfts').ifExists().execute(); } diff --git a/src/db/migrations/021_pgfts_index.ts b/src/db/migrations/021_pgfts_index.ts index 7ad24546..497adaeb 100644 --- a/src/db/migrations/021_pgfts_index.ts +++ b/src/db/migrations/021_pgfts_index.ts @@ -1,6 +1,6 @@ import { Kysely } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema .createIndex('nostr_pgfts_gin_search_vec') .ifNotExists() @@ -10,6 +10,6 @@ export async function up(db: Kysely): Promise { .execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.dropIndex('nostr_pgfts_gin_search_vec').ifExists().execute(); } diff --git a/src/db/migrations/022_event_stats_reactions.ts b/src/db/migrations/022_event_stats_reactions.ts index 0bc69147..25cb7d99 100644 --- a/src/db/migrations/022_event_stats_reactions.ts +++ b/src/db/migrations/022_event_stats_reactions.ts @@ -1,12 +1,12 @@ import { Kysely } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema .alterTable('event_stats') .addColumn('reactions', 'text', (col) => col.defaultTo('{}')) .execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.alterTable('event_stats').dropColumn('reactions').execute(); } diff --git a/src/db/migrations/023_add_nip46_tokens.ts b/src/db/migrations/023_add_nip46_tokens.ts index 01d71640..27ac05d6 100644 --- a/src/db/migrations/023_add_nip46_tokens.ts +++ b/src/db/migrations/023_add_nip46_tokens.ts @@ -1,6 +1,6 @@ import { Kysely, sql } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema .createTable('nip46_tokens') .addColumn('api_token', 'text', (col) => col.primaryKey().notNull()) @@ -12,6 +12,6 @@ export async function up(db: Kysely): Promise { .execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.dropTable('nip46_tokens').execute(); } diff --git a/src/db/migrations/024_event_stats_quotes_count.ts b/src/db/migrations/024_event_stats_quotes_count.ts index f62baf57..e5cffb2b 100644 --- a/src/db/migrations/024_event_stats_quotes_count.ts +++ b/src/db/migrations/024_event_stats_quotes_count.ts @@ -1,12 +1,12 @@ import { Kysely } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema .alterTable('event_stats') .addColumn('quotes_count', 'integer', (col) => col.notNull().defaultTo(0)) .execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.alterTable('event_stats').dropColumn('quotes_count').execute(); } diff --git a/src/db/migrations/025_event_stats_add_zap_count.ts b/src/db/migrations/025_event_stats_add_zap_count.ts index 91479907..da021f07 100644 --- a/src/db/migrations/025_event_stats_add_zap_count.ts +++ b/src/db/migrations/025_event_stats_add_zap_count.ts @@ -1,12 +1,12 @@ import { Kysely } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema .alterTable('event_stats') .addColumn('zaps_amount', 'integer', (col) => col.notNull().defaultTo(0)) .execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.alterTable('event_stats').dropColumn('zaps_amount').execute(); } diff --git a/src/db/migrations/026_tags_name_index.ts b/src/db/migrations/026_tags_name_index.ts index a15587fb..18c2519d 100644 --- a/src/db/migrations/026_tags_name_index.ts +++ b/src/db/migrations/026_tags_name_index.ts @@ -1,6 +1,6 @@ import { Kysely } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema .createIndex('idx_tags_name') .on('nostr_tags') @@ -9,6 +9,6 @@ export async function up(db: Kysely): Promise { .execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.dropIndex('idx_tags_name').ifExists().execute(); } diff --git a/src/db/migrations/027_add_zap_events.ts b/src/db/migrations/027_add_zap_events.ts index 2fcc101c..6445105f 100644 --- a/src/db/migrations/027_add_zap_events.ts +++ b/src/db/migrations/027_add_zap_events.ts @@ -1,6 +1,6 @@ import { Kysely } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema .createTable('event_zaps') .addColumn('receipt_id', 'text', (col) => col.primaryKey()) @@ -25,7 +25,7 @@ export async function up(db: Kysely): Promise { .execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.dropIndex('idx_event_zaps_amount_millisats').ifExists().execute(); await db.schema.dropIndex('idx_event_zaps_target_event_id').ifExists().execute(); await db.schema.dropTable('event_zaps').execute(); diff --git a/src/db/migrations/028_stable_sort.ts b/src/db/migrations/028_stable_sort.ts index 191f32ca..c27c6a5f 100644 --- a/src/db/migrations/028_stable_sort.ts +++ b/src/db/migrations/028_stable_sort.ts @@ -1,6 +1,6 @@ import { Kysely } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema .createIndex('nostr_events_created_at_kind') .on('nostr_events') @@ -19,7 +19,7 @@ export async function up(db: Kysely): Promise { await db.schema.dropIndex('idx_events_kind_pubkey_created_at').execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.dropIndex('nostr_events_created_at_kind').execute(); await db.schema.dropIndex('nostr_events_kind_pubkey_created_at').execute(); diff --git a/src/db/migrations/029_tag_queries.ts b/src/db/migrations/029_tag_queries.ts index 5a27d720..a2ad209c 100644 --- a/src/db/migrations/029_tag_queries.ts +++ b/src/db/migrations/029_tag_queries.ts @@ -1,6 +1,6 @@ import { Kysely, sql } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema .createTable('nostr_tags_new') .addColumn('event_id', 'text', (col) => col.notNull().references('nostr_events.id').onDelete('cascade')) @@ -66,7 +66,7 @@ export async function up(db: Kysely): Promise { .execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema .createTable('nostr_tags_old') .addColumn('event_id', 'text', (col) => col.references('nostr_events.id').onDelete('cascade')) diff --git a/src/db/migrations/030_pg_events_jsonb.ts b/src/db/migrations/030_pg_events_jsonb.ts index dcd6ad85..6b28bfc3 100644 --- a/src/db/migrations/030_pg_events_jsonb.ts +++ b/src/db/migrations/030_pg_events_jsonb.ts @@ -1,6 +1,6 @@ import { Kysely, sql } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { // Create new table and indexes. await db.schema .createTable('nostr_events_new') @@ -132,6 +132,6 @@ If you don't want to wait, you can create a fresh database and then import your await db.schema.alterTable('nostr_events_new').renameTo('nostr_events').execute(); } -export function down(_db: Kysely): Promise { +export function down(_db: Kysely): Promise { throw new Error("Sorry, you can't migrate back from here."); } diff --git a/src/db/migrations/031_rm_unattached_media.ts b/src/db/migrations/031_rm_unattached_media.ts index febd85e1..34a5a735 100644 --- a/src/db/migrations/031_rm_unattached_media.ts +++ b/src/db/migrations/031_rm_unattached_media.ts @@ -1,10 +1,10 @@ import { Kysely } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema.dropTable('unattached_media').execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema .createTable('unattached_media') .addColumn('id', 'text', (c) => c.primaryKey()) diff --git a/src/db/migrations/032_add_author_search.ts b/src/db/migrations/032_add_author_search.ts index 4323c252..8160f82b 100644 --- a/src/db/migrations/032_add_author_search.ts +++ b/src/db/migrations/032_add_author_search.ts @@ -1,6 +1,6 @@ import { Kysely, sql } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema .createTable('author_search') .addColumn('pubkey', 'char(64)', (col) => col.primaryKey()) @@ -12,7 +12,7 @@ export async function up(db: Kysely): Promise { await sql`CREATE INDEX author_search_search_idx ON author_search USING GIN (search gin_trgm_ops)`.execute(db); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.dropIndex('author_search_search_idx').ifExists().execute(); await db.schema.dropTable('author_search').execute(); } diff --git a/src/db/migrations/033_add_language.ts b/src/db/migrations/033_add_language.ts index 77bfc37e..a12c9ed3 100644 --- a/src/db/migrations/033_add_language.ts +++ b/src/db/migrations/033_add_language.ts @@ -1,6 +1,6 @@ import { Kysely } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema.alterTable('nostr_events').addColumn('language', 'char(2)').execute(); await db.schema.createIndex('nostr_events_language_created_idx') @@ -9,7 +9,7 @@ export async function up(db: Kysely): Promise { .execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.alterTable('nostr_events').dropColumn('language').execute(); await db.schema.dropIndex('nostr_events_language_created_idx').execute(); } diff --git a/src/db/migrations/034_move_author_search_to_author_stats.ts b/src/db/migrations/034_move_author_search_to_author_stats.ts index 6d21ca39..819fac0a 100644 --- a/src/db/migrations/034_move_author_search_to_author_stats.ts +++ b/src/db/migrations/034_move_author_search_to_author_stats.ts @@ -1,5 +1,6 @@ import { Kysely, sql } from 'kysely'; +// deno-lint-ignore no-explicit-any export async function up(db: Kysely): Promise { await db.schema .alterTable('author_stats') @@ -26,7 +27,7 @@ export async function up(db: Kysely): Promise { await db.schema.dropTable('author_search').execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.dropIndex('author_stats_search_idx').ifExists().execute(); await db.schema.alterTable('author_stats').dropColumn('search').execute(); } diff --git a/src/db/migrations/035_author_stats_followers_index.ts b/src/db/migrations/035_author_stats_followers_index.ts index 0509d403..83472220 100644 --- a/src/db/migrations/035_author_stats_followers_index.ts +++ b/src/db/migrations/035_author_stats_followers_index.ts @@ -1,6 +1,6 @@ import { Kysely } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema .createIndex('author_stats_followers_count_idx') .ifNotExists() @@ -12,6 +12,6 @@ export async function up(db: Kysely): Promise { await db.schema.dropIndex('idx_author_stats_pubkey').ifExists().execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.dropIndex('author_stats_followers_count_idx').ifExists().execute(); } diff --git a/src/db/migrations/036_stats64.ts b/src/db/migrations/036_stats64.ts index fa9d357e..ca13f69a 100644 --- a/src/db/migrations/036_stats64.ts +++ b/src/db/migrations/036_stats64.ts @@ -1,5 +1,6 @@ import { Kysely, sql } from 'kysely'; +// deno-lint-ignore no-explicit-any export async function up(db: Kysely): Promise { await db.deleteFrom('event_stats').where(sql`length(event_id)`, '>', 64).execute(); await db.deleteFrom('author_stats').where(sql`length(pubkey)`, '>', 64).execute(); @@ -8,7 +9,7 @@ export async function up(db: Kysely): Promise { await db.schema.alterTable('author_stats').alterColumn('pubkey', (col) => col.setDataType('char(64)')).execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.alterTable('event_stats').alterColumn('event_id', (col) => col.setDataType('text')).execute(); await db.schema.alterTable('author_stats').alterColumn('pubkey', (col) => col.setDataType('text')).execute(); } diff --git a/src/db/migrations/038_push_subscriptions.ts b/src/db/migrations/038_push_subscriptions.ts index ecce1b1f..d75418bd 100644 --- a/src/db/migrations/038_push_subscriptions.ts +++ b/src/db/migrations/038_push_subscriptions.ts @@ -1,6 +1,6 @@ import { Kysely, sql } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema .createTable('push_subscriptions') .addColumn('id', 'bigserial', (c) => c.primaryKey()) @@ -22,6 +22,6 @@ export async function up(db: Kysely): Promise { .execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.dropTable('push_subscriptions').execute(); } diff --git a/src/db/migrations/039_pg_notify.ts b/src/db/migrations/039_pg_notify.ts index 6d75844d..fb0a21ea 100644 --- a/src/db/migrations/039_pg_notify.ts +++ b/src/db/migrations/039_pg_notify.ts @@ -1,6 +1,6 @@ import { Kysely, sql } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await sql` CREATE OR REPLACE FUNCTION notify_nostr_event() RETURNS TRIGGER AS $$ @@ -31,7 +31,7 @@ export async function up(db: Kysely): Promise { `.execute(db); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await sql`DROP TRIGGER nostr_event_trigger ON nostr_events`.execute(db); await sql`DROP FUNCTION notify_nostr_event()`.execute(db); } diff --git a/src/db/migrations/040_add_bunker_pubkey.ts b/src/db/migrations/040_add_bunker_pubkey.ts index 58ab0a5e..9f0dff2b 100644 --- a/src/db/migrations/040_add_bunker_pubkey.ts +++ b/src/db/migrations/040_add_bunker_pubkey.ts @@ -1,5 +1,6 @@ import { Kysely } from 'kysely'; +// deno-lint-ignore no-explicit-any export async function up(db: Kysely): Promise { await db.schema .alterTable('auth_tokens') @@ -14,7 +15,7 @@ export async function up(db: Kysely): Promise { .execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema .alterTable('auth_tokens') .dropColumn('bunker_pubkey') diff --git a/src/db/migrations/041_pg_notify_id_only.ts b/src/db/migrations/041_pg_notify_id_only.ts index 192dd42f..47668894 100644 --- a/src/db/migrations/041_pg_notify_id_only.ts +++ b/src/db/migrations/041_pg_notify_id_only.ts @@ -1,6 +1,6 @@ import { Kysely, sql } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await sql`DROP TRIGGER IF EXISTS nostr_event_trigger ON nostr_events`.execute(db); await sql` @@ -21,7 +21,7 @@ export async function up(db: Kysely): Promise { `.execute(db); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await sql`DROP TRIGGER nostr_event_trigger ON nostr_events`.execute(db); await sql`DROP FUNCTION notify_nostr_event()`.execute(db); } diff --git a/src/db/migrations/042_add_search_ext.ts b/src/db/migrations/042_add_search_ext.ts index 6ebe42a4..754e1571 100644 --- a/src/db/migrations/042_add_search_ext.ts +++ b/src/db/migrations/042_add_search_ext.ts @@ -1,6 +1,6 @@ import { Kysely, sql } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema .alterTable('nostr_events') .addColumn('search_ext', 'jsonb', (col) => col.notNull().defaultTo(sql`'{}'::jsonb`)) @@ -19,7 +19,7 @@ export async function up(db: Kysely): Promise { .execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema .dropIndex('nostr_events_search_ext_idx') .on('nostr_events') diff --git a/src/db/migrations/043_rm_language.ts b/src/db/migrations/043_rm_language.ts index 8fb26b52..e61edc12 100644 --- a/src/db/migrations/043_rm_language.ts +++ b/src/db/migrations/043_rm_language.ts @@ -1,10 +1,10 @@ import { Kysely } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema.alterTable('nostr_events').dropColumn('language').execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema.alterTable('nostr_events').addColumn('language', 'char(2)').execute(); await db.schema.createIndex('nostr_events_language_created_idx') diff --git a/src/db/migrations/044_search_ext_drop_default.ts b/src/db/migrations/044_search_ext_drop_default.ts index c32590d2..6c8c053f 100644 --- a/src/db/migrations/044_search_ext_drop_default.ts +++ b/src/db/migrations/044_search_ext_drop_default.ts @@ -1,10 +1,10 @@ import { Kysely } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema.alterTable('nostr_events').alterColumn('search_ext', (col) => col.dropDefault()).execute(); } -export async function down(db: Kysely): Promise { +export async function down(db: Kysely): Promise { await db.schema .alterTable('nostr_events') .alterColumn('search_ext', (col) => col.setDefault("'{}'::jsonb")) diff --git a/src/db/migrations/048_rm_pubkey_domains.ts b/src/db/migrations/048_rm_pubkey_domains.ts index 20938159..5f052df2 100644 --- a/src/db/migrations/048_rm_pubkey_domains.ts +++ b/src/db/migrations/048_rm_pubkey_domains.ts @@ -1,6 +1,6 @@ import { Kysely } from 'kysely'; -export async function up(db: Kysely): Promise { +export async function up(db: Kysely): Promise { await db.schema.dropTable('pubkey_domains').execute(); } diff --git a/src/db/migrations/049_author_stats_sorted.ts b/src/db/migrations/049_author_stats_sorted.ts index 6eca40cd..99aae4bf 100644 --- a/src/db/migrations/049_author_stats_sorted.ts +++ b/src/db/migrations/049_author_stats_sorted.ts @@ -1,5 +1,6 @@ import { Kysely, sql } from 'kysely'; +// deno-lint-ignore no-explicit-any export async function up(db: Kysely): Promise { await db.schema .createView('top_authors') diff --git a/src/storages/EventsDB.ts b/src/storages/EventsDB.ts index c0a9bec4..91757449 100644 --- a/src/storages/EventsDB.ts +++ b/src/storages/EventsDB.ts @@ -270,7 +270,7 @@ class EventsDB extends NPostgres { override async count( filters: NostrFilter[], opts: { signal?: AbortSignal; timeout?: number } = {}, - ): Promise<{ count: number; approximate: any }> { + ): Promise<{ count: number; approximate: boolean }> { if (opts.signal?.aborted) return Promise.reject(abortError()); logi({ level: 'debug', ns: 'ditto.count', source: 'db', filters: filters as JsonValue }); @@ -428,6 +428,7 @@ class EventsDB extends NPostgres { return filters; } + // deno-lint-ignore no-explicit-any override async transaction(callback: (store: NPostgres, kysely: Kysely) => Promise): Promise { return super.transaction((store, kysely) => callback(store, kysely as unknown as Kysely)); } diff --git a/src/utils/formdata.ts b/src/utils/formdata.ts index 6d5d997b..47fffa04 100644 --- a/src/utils/formdata.ts +++ b/src/utils/formdata.ts @@ -16,10 +16,12 @@ export function parseFormData(formData: FormData): unknown { /** Deeply sets a value in an object based on a Rails-style nested key. */ function deepSet( /** The target object to modify. */ + // deno-lint-ignore no-explicit-any target: Record, /** The Rails-style key (e.g., "fields_attributes[0][name]"). */ key: string, /** The value to set. */ + // deno-lint-ignore no-explicit-any value: any, ): void { const keys = key.match(/[^[\]]+/g); // Extract keys like ["fields_attributes", "0", "name"]