forked from
rocksky.app/rocksky
A decentralized music tracking and discovery platform built on AT Protocol 馃幍
1import chalk from "chalk";
2import type { Context } from "context";
3import { eq } from "drizzle-orm";
4import _ from "lodash";
5import { StringCodec } from "nats";
6import tables from "schema";
7
8export function onNewTrack(ctx: Context) {
9 const sc = StringCodec();
10 const sub = ctx.nc.subscribe("rocksky.track");
11 (async () => {
12 for await (const m of sub) {
13 const payload: {
14 track: { xata_id: string };
15 artist_album: {
16 artist_id: { xata_id: string };
17 album_id: { xata_id: string };
18 };
19 } = JSON.parse(sc.decode(m.data));
20
21 const [tracks, artists, albums] = await Promise.all([
22 ctx.db
23 .select()
24 .from(tables.tracks)
25 .where(eq(tables.tracks.id, payload.track.xata_id))
26 .execute(),
27 ctx.db
28 .select()
29 .from(tables.artists)
30 .where(eq(tables.artists.id, payload.artist_album.artist_id.xata_id))
31 .execute(),
32 ctx.db
33 .select()
34 .from(tables.albums)
35 .where(eq(tables.albums.id, payload.artist_album.album_id.xata_id))
36 .execute(),
37 ]);
38
39 console.log(`New track: ${chalk.cyan(_.get(tracks, "0.title"))}`);
40
41 await Promise.all([
42 ctx.meilisearch.post(`indexes/albums/documents?primaryKey=id`, albums),
43 ctx.meilisearch.post(
44 `indexes/artists/documents?primaryKey=id`,
45 artists,
46 ),
47 ctx.meilisearch.post(`indexes/tracks/documents?primaryKey=id`, tracks),
48 ]);
49 }
50 })();
51}