A decentralized music tracking and discovery platform built on AT Protocol 🎵

Hydrate artists with DB pictures

+38 -4
+38 -4
apps/api/src/xrpc/app/rocksky/artist/getArtists.ts
··· 4 4 import type { ArtistViewBasic } from "lexicon/types/app/rocksky/artist/defs"; 5 5 import type { QueryParams } from "lexicon/types/app/rocksky/artist/getArtists"; 6 6 import { deepCamelCaseKeys } from "lib"; 7 + import tables from "schema"; 8 + import { inArray } from "drizzle-orm"; 7 9 8 10 export default function (server: Server, ctx: Context) { 9 11 const getArtists = (params) => ··· 35 37 }: { 36 38 params: QueryParams; 37 39 ctx: Context; 38 - }): Effect.Effect<{ data: Artist[] }, Error> => { 40 + }): Effect.Effect<{ data: Artist[]; ctx: Context }, Error> => { 39 41 return Effect.tryPromise({ 40 - try: () => 41 - ctx.analytics.post("library.getArtists", { 42 + try: async () => { 43 + const response = await ctx.analytics.post("library.getArtists", { 42 44 pagination: { 43 45 skip: params.offset || 0, 44 46 take: params.limit || 100, 45 47 }, 46 - }), 48 + }); 49 + return { data: response.data, ctx }; 50 + }, 47 51 catch: (error) => new Error(`Failed to retrieve artists: ${error}`), 52 + }); 53 + }; 54 + 55 + const hydrate = ({ 56 + data, 57 + ctx, 58 + }: { 59 + data: Artist[]; 60 + ctx: Context; 61 + }): Effect.Effect<{ data: Artist[] }, Error> => { 62 + return Effect.tryPromise({ 63 + try: async () => { 64 + const artists = await ctx.db 65 + .select() 66 + .from(tables.artists) 67 + .where( 68 + inArray( 69 + tables.artists.id, 70 + data.map((artist) => artist.id), 71 + ), 72 + ) 73 + .execute(); 74 + return { 75 + data: data.map((artist) => ({ 76 + ...artist, 77 + picture: artists.find((a) => a.id === artist.id)?.picture, 78 + })), 79 + }; 80 + }, 81 + catch: (error) => new Error(`Failed to hydrate artists: ${error}`), 48 82 }); 49 83 }; 50 84