+19
-17
apps/tapper/index.ts
+19
-17
apps/tapper/index.ts
···
1
1
import { SimpleIndexer, Tap } from "@atproto/tap";
2
2
import { env } from "@tealfmbot/common/constants";
3
-
// import { isTealRecord } from "./utils";
4
-
// import { db } from "@tealfmbot/database/db"
3
+
import { db } from "@tealfmbot/database/db";
4
+
5
+
import { isTealRecord } from "./utils";
5
6
6
7
const tap = new Tap("https://tap.xero.systems", {
7
8
adminPassword: env.TAP_ADMIN_PASSWORD,
···
12
13
indexer.record(async (evt, opts) => {
13
14
const uri = `at://${evt.did}/${evt.collection}/${evt.rkey}`;
14
15
if (evt.action === "create") {
15
-
// if (isTealRecord(evt.record) && typeof evt !== "undefined" && typeof evt.record !== 'undefined') {
16
-
// await db.insertInto("plays").values({
17
-
// release_name: evt?.record?.releaseName,
18
-
// played_time: evt?.record?.playedTime,
19
-
// track_name: evt?.record?.trackName,
20
-
// indexed_at: new Date().toJSON(),
21
-
// live: evt.live
22
-
// }).execute()
23
-
// }
24
-
// await db.insertInto("plays").values({
25
-
// played_time: evt?.record?.playedTime,
26
-
// release_name: evt?.record?.releaseName,
27
-
// track_name: evt?.record?.trackName,
28
-
// user_id: 4
29
-
// }).execute
16
+
if (isTealRecord(evt.record)) {
17
+
await db
18
+
.insertInto("plays")
19
+
.values({
20
+
cid: evt?.cid,
21
+
rkey: evt?.rkey,
22
+
uri,
23
+
release_name: evt?.record?.releaseName,
24
+
played_time: evt?.record?.playedTime,
25
+
track_name: evt?.record?.trackName,
26
+
indexed_at: new Date().toJSON(),
27
+
live: evt.live,
28
+
user_id: 1
29
+
})
30
+
.execute();
31
+
}
30
32
console.log(evt.record);
31
33
} else {
32
34
console.log(`deleted: ${uri}`);
+2
-2
packages/database/database.d.ts
+2
-2
packages/database/database.d.ts
···
31
31
id: Generated<number>;
32
32
indexed_at: Generated<Timestamp>;
33
33
live: boolean | null;
34
-
played_time: Timestamp;
35
-
release_name: string;
34
+
played_time: Timestamp | null;
35
+
release_name: string | null;
36
36
rkey: string | null;
37
37
track_name: string;
38
38
uri: string | null;
+18
packages/database/migrations/1767554974033_release_name_and_played_time_optional.ts
+18
packages/database/migrations/1767554974033_release_name_and_played_time_optional.ts
···
1
+
import type { Kysely } from 'kysely'
2
+
3
+
// `any` is required here since migrations should be frozen in time. alternatively, keep a "snapshot" db interface.
4
+
export async function up(db: Kysely<any>): Promise<void> {
5
+
// up migration code goes here...
6
+
// note: up migrations are mandatory. you must implement this function.
7
+
// For more info, see: https://kysely.dev/docs/migrations
8
+
await db.schema.alterTable("plays").alterColumn("release_name", (col) => col.dropNotNull()).alterColumn("played_time", (col) => col.dropNotNull()).execute()
9
+
}
10
+
11
+
// `any` is required here since migrations should be frozen in time. alternatively, keep a "snapshot" db interface.
12
+
export async function down(db: Kysely<any>): Promise<void> {
13
+
// down migration code goes here...
14
+
// note: down migrations are optional. you can safely delete this function.
15
+
// For more info, see: https://kysely.dev/docs/migrations
16
+
await db.schema.alterTable("plays").alterColumn("played_time", (col) => col.setNotNull())
17
+
.alterColumn("release_name", (col) => col.setNotNull()).execute()
18
+
}