+6
PLAN.md
+6
PLAN.md
···
1
+
# rough notes on how I think this should work
2
+
3
+
- we start of with no accounts
4
+
- ``/teal auth`` sends user a link to log in with atproto account
5
+
- after auth success, we take did and send http request to tap instance to start backfilling for repo
6
+
- user can now use bot commands
db/migrator.ts
kysely/migrator.ts
db/migrator.ts
kysely/migrator.ts
+14
kysely/db.ts
+14
kysely/db.ts
···
1
+
import type { DB } from "kysely-codegen"
2
+
import { Pool } from "pg"
3
+
import { Kysely, PostgresDialect } from "kysely"
4
+
import { DATABASE_URL } from "../constants.ts"
5
+
6
+
const dialect = new PostgresDialect({
7
+
pool: new Pool({
8
+
connectionString: DATABASE_URL
9
+
})
10
+
})
11
+
12
+
export const db = new Kysely<DB>({
13
+
dialect
14
+
})
+17
kysely/seed.ts
+17
kysely/seed.ts
···
1
+
// import { db } from "./db.ts"
2
+
3
+
async function main() {
4
+
// const result = await db.insertInto("users").values({
5
+
// did: "did:plc:qttsv4e7pu2jl3ilanfgc3zn"
6
+
// }).returning(['did', 'created_at'])
7
+
// .executeTakeFirst()
8
+
// console.log({ result })
9
+
10
+
// const users = await db.selectFrom("users").select(["id", "did"]).execute()
11
+
// console.log({ users })
12
+
// await db.deleteFrom("users").where("did", "=", "did:plc:qttsv4e7pu2jl3ilanfgc3zn").execute()
13
+
// const plays = await db.selectFrom("plays").where("plays.user_id", "=", 4).select(["plays.played_time", "plays.track_name"]).execute()
14
+
// console.log({ plays })
15
+
}
16
+
17
+
main().catch(error => console.error(error))
+1
-1
migrations/schema.ts
+1
-1
migrations/schema.ts
···
4
4
await db.schema
5
5
.createTable("users").ifNotExists()
6
6
.addColumn("id", "serial", (col) => col.primaryKey())
7
-
.addColumn("did", "varchar", (col) => col.notNull())
7
+
.addColumn("did", "varchar", (col) => col.notNull().unique())
8
8
.addColumn('created_at', 'timestamp', (col) =>
9
9
col.defaultTo(sql`now()`).notNull(),
10
10
)
+2
-1
package.json
+2
-1
package.json
···
9
9
"deploy-commands": "tsx deploy-commands.ts",
10
10
"tapper:dev": "NODE_ENV=development tsx tapper.ts",
11
11
"tapper:prod": "NODE_ENV=production tsx tapper.ts",
12
-
"migrate": "tsx db/migrator.ts",
12
+
"migrate": "tsx kysely/migrator.ts",
13
13
"codegen": "kysely-codegen --dialect postgres",
14
+
"seed": "tsx kysely/seed.ts",
14
15
"typecheck": "tsc --noEmit"
15
16
},
16
17
"keywords": [
+8
-1
tapper.ts
+8
-1
tapper.ts
···
1
1
import { SimpleIndexer, Tap } from "@atproto/tap";
2
2
import { TAP_ADMIN_PASSWORD } from "./constants.ts";
3
+
// import { db } from "./kysely/db.ts"
3
4
4
5
const tap = new Tap("https://tap.xero.systems", {
5
6
adminPassword: TAP_ADMIN_PASSWORD,
···
10
11
indexer.record(async (evt, opts) => {
11
12
const uri = `at://${evt.did}/${evt.collection}/${evt.rkey}`;
12
13
if (evt.action === "create" || evt.action === "update") {
13
-
console.log(evt.record);
14
+
// await db.insertInto("plays").values({
15
+
// played_time: evt?.record?.playedTime,
16
+
// release_name: evt?.record?.releaseName,
17
+
// track_name: evt?.record?.trackName,
18
+
// user_id: 4
19
+
// }).execute()
20
+
console.log(evt.record)
14
21
} else {
15
22
console.log(`deleted: ${uri}`);
16
23
}