From 4f94ee2dd4f4c0ec9f55c532159fd81b7e273071 Mon Sep 17 00:00:00 2001 From: Lncvrt Date: Sat, 24 Jan 2026 08:27:36 -0700 Subject: [PATCH] Add endpoint for getting specific icons --- src/index.ts | 17 ++ .../berrydash/icon-marketplace/icon/get.ts | 149 ++++++++++++++++++ 2 files changed, 166 insertions(+) create mode 100644 src/routes/berrydash/icon-marketplace/icon/get.ts diff --git a/src/index.ts b/src/index.ts index cf944ce..0ef8184 100644 --- a/src/index.ts +++ b/src/index.ts @@ -30,6 +30,7 @@ import { handler as berrydashProfilePostsPutHandler } from './routes/berrydash/p import { handler as berryDashIconMarketplacePostHandler } from './routes/berrydash/icon-marketplace/post' import { handler as berryDashIconMarketplaceUploadPostHandler } from './routes/berrydash/icon-marketplace/upload/post' +import { handler as berryDashIconMarketplaceIconGetHandler } from './routes/berrydash/icon-marketplace/icon/get' import { handler as berryDashAccountLoginPostHandler } from './routes/berrydash/account/login/post' import { handler as berryDashAccountRegisterPostHandler } from './routes/berrydash/account/register/post' @@ -424,6 +425,22 @@ app.post( }) } ) +app.get( + '/berrydash/icon-marketplace/icon', + context => berryDashIconMarketplaceIconGetHandler(context), + { + detail: { + description: 'The endpoint for getting a specific icon marketplace icon.', + tags: ['Berry Dash', 'Icon Marketplace'] + }, + query: t.Object({ + uuid: t.Optional(t.String()), + id: t.Optional(t.String()), + uuids: t.Optional(t.String()), + ids: t.Optional(t.String()) + }) + } +) app.post( '/berrydash/account/login', context => berryDashAccountLoginPostHandler(context), diff --git a/src/routes/berrydash/icon-marketplace/icon/get.ts b/src/routes/berrydash/icon-marketplace/icon/get.ts new file mode 100644 index 0000000..fa61fee --- /dev/null +++ b/src/routes/berrydash/icon-marketplace/icon/get.ts @@ -0,0 +1,149 @@ +import { Context } from 'elysia' +import { getDatabaseConnection, jsonResponse } from '../../../../lib/util' +import { berryDashMarketplaceIcons, users } from '../../../../lib/tables' +import { eq, inArray } from 'drizzle-orm' + +export async function handler (context: Context) { + const dbInfo0 = getDatabaseConnection(0) + const dbInfo1 = getDatabaseConnection(1) + + if (!dbInfo0 || !dbInfo1) + return jsonResponse( + { success: false, message: 'Failed to connect to database', data: null }, + 500 + ) + + const { connection: connection0, db: db0 } = dbInfo0 + const { connection: connection1, db: db1 } = dbInfo1 + + let uuidQuery = context.query.uuid + let idQuery = context.query.id ? parseInt(context.query.id, 10) : 0 + let uuidsQuery = context.query.uuids + let idsQuery = context.query.ids + if (!uuidQuery && !idQuery && !uuidsQuery && !idsQuery) { + connection0.end() + connection1.end() + return jsonResponse( + { + success: false, + message: 'Must have either ID, UUID, IDS, or UUIDS in params', + data: null + }, + 400 + ) + } + try { + if (uuidsQuery) uuidsQuery = JSON.parse(uuidsQuery) + if (idsQuery) idsQuery = JSON.parse(idsQuery) + } catch { + connection0.end() + connection1.end() + return jsonResponse( + { + success: false, + message: 'Failed to parse query', + data: null + }, + 400 + ) + } + + if (idQuery || uuidQuery) { + const icon = await db1 + .select() + .from(berryDashMarketplaceIcons) + .where( + !uuidQuery + ? eq(berryDashMarketplaceIcons.id, idQuery) + : eq(berryDashMarketplaceIcons.uuid, uuidQuery) + ) + .limit(1) + .execute() + if (!icon[0]) { + connection0.end() + connection1.end() + return jsonResponse( + { + success: false, + message: 'Icon does not exist', + data: null + }, + 400 + ) + } + + const userData = await db0 + .select({ username: users.username }) + .from(users) + .where(eq(users.id, icon[0].userId)) + .limit(1) + .execute() + if (!userData[0]) { + connection0.end() + connection1.end() + return jsonResponse( + { + success: false, + message: 'Icon does not exist', + data: null + }, + 400 + ) + } + + const result = { + username: userData[0].username, + userId: icon[0].userId, + data: icon[0].data, + id: icon[0].id, + price: icon[0].price, + buyable: icon[0].state == 1, + name: atob(icon[0].name) + } + + connection0.end() + connection1.end() + + return jsonResponse({ success: true, message: null, data: result }) + } else { + const icons = await db1 + .select() + .from(berryDashMarketplaceIcons) + .where( + !uuidsQuery + ? inArray( + berryDashMarketplaceIcons.id, + idsQuery as unknown as number[] + ) + : inArray( + berryDashMarketplaceIcons.uuid, + uuidsQuery as unknown as string[] + ) + ) + .execute() + + const userIds = Array.from(new Set(icons.map(i => i.userId))) + const usersData = await db0 + .select({ id: users.id, username: users.username }) + .from(users) + .where(inArray(users.id, userIds)) + .execute() + + const usersMap = Object.fromEntries(usersData.map(u => [u.id, u.username])) + + const result = icons.map(i => ({ + username: usersMap[i.userId] ?? 'Unknown', + userId: i.userId, + data: i.data, + id: i.id, + price: i.price, + buyable: i.state == 1, + name: atob(i.name) + })) + + connection0.end() + connection1.end() + + return jsonResponse({ success: true, message: null, data: result }) + } +}