Add a get endpoint for icon marketplace icons, and also fixes

This commit is contained in:
2026-01-24 18:14:23 -07:00
parent abc4a2473f
commit 046e193a98
4 changed files with 79 additions and 57 deletions

View File

@@ -28,6 +28,7 @@ import { handler as berrydashProfilePostsGetHandler } from './routes/berrydash/p
import { handler as berrydashProfilePostsPostHandler } from './routes/berrydash/profile/posts/post' import { handler as berrydashProfilePostsPostHandler } from './routes/berrydash/profile/posts/post'
import { handler as berrydashProfilePostsPutHandler } from './routes/berrydash/profile/posts/put' import { handler as berrydashProfilePostsPutHandler } from './routes/berrydash/profile/posts/put'
import { handler as berryDashIconMarketplaceGetHandler } from './routes/berrydash/icon-marketplace/get'
import { handler as berryDashIconMarketplacePostHandler } from './routes/berrydash/icon-marketplace/post' import { handler as berryDashIconMarketplacePostHandler } from './routes/berrydash/icon-marketplace/post'
import { handler as berryDashIconMarketplaceUploadPostHandler } from './routes/berrydash/icon-marketplace/upload/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 berryDashIconMarketplaceIconGetHandler } from './routes/berrydash/icon-marketplace/icon/get'
@@ -388,13 +389,23 @@ app.put(
}) })
} }
) )
app.get(
'/berrydash/icon-marketplace',
context => berryDashIconMarketplaceGetHandler(context),
{
detail: {
description: 'The endpoint for getting the icon marketplace icons.',
tags: ['Berry Dash', 'Icon Marketplace']
}
}
)
app.post( app.post(
'/berrydash/icon-marketplace', '/berrydash/icon-marketplace',
context => berryDashIconMarketplacePostHandler(context), context => berryDashIconMarketplacePostHandler(context),
{ {
detail: { detail: {
description: description:
'The endpoint for getting the icon marketplace icons.\n\nPretty much none of the body types are correct.', 'The endpoint for getting the icon marketplace icons with filters.\n\nPretty much none of the body types are correct.',
tags: ['Berry Dash', 'Icon Marketplace'] tags: ['Berry Dash', 'Icon Marketplace']
}, },
body: t.Object({ body: t.Object({

View File

@@ -0,0 +1,58 @@
import { Context } from 'elysia'
import { getDatabaseConnection, jsonResponse } from '../../../lib/util'
import { berryDashMarketplaceIcons, users } from '../../../lib/tables'
import { desc, 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
const icons = await db1
.select({
id: berryDashMarketplaceIcons.id,
userId: berryDashMarketplaceIcons.userId,
data: berryDashMarketplaceIcons.data,
hash: berryDashMarketplaceIcons.hash,
timestamp: berryDashMarketplaceIcons.timestamp,
state: berryDashMarketplaceIcons.state,
price: berryDashMarketplaceIcons.price,
name: berryDashMarketplaceIcons.name
})
.from(berryDashMarketplaceIcons)
.where(eq(berryDashMarketplaceIcons.state, 1))
.orderBy(desc(berryDashMarketplaceIcons.place))
.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 })
}

View File

@@ -102,20 +102,7 @@ export async function handler (context: Context) {
? null ? null
: dataQuery && dataQuery.toLowerCase() == 'false' : dataQuery && dataQuery.toLowerCase() == 'false'
? null ? null
: (() => { : icon[0].data,
const q = Math.floor(icon[0].data.length / 4)
const hq = Math.floor(icon[0].hash.length / 4)
return (
icon[0].data.slice(0, q) +
icon[0].hash.slice(0, hq) +
icon[0].data.slice(q, q * 2) +
icon[0].hash.slice(hq, hq * 2) +
icon[0].data.slice(q * 2, q * 3) +
icon[0].hash.slice(hq * 2, hq * 3) +
icon[0].data.slice(q * 3) +
icon[0].hash.slice(hq * 3)
)
})(),
id: icon[0].id, id: icon[0].id,
price: icon[0].price, price: icon[0].price,
buyable: icon[0].state == 1, buyable: icon[0].state == 1,
@@ -145,23 +132,7 @@ export async function handler (context: Context) {
const result = icons.map(i => ({ const result = icons.map(i => ({
username: usersMap[i.userId] ?? 'Unknown', username: usersMap[i.userId] ?? 'Unknown',
userId: i.userId, userId: i.userId,
data: data: dataQuery && dataQuery.toLowerCase() == 'false' ? null : i.data,
dataQuery && dataQuery.toLowerCase() == 'false'
? null
: (() => {
const q = Math.floor(i.data.length / 4)
const hq = Math.floor(i.hash.length / 4)
return (
i.data.slice(0, q) +
i.hash.slice(0, hq) +
i.data.slice(q, q * 2) +
i.hash.slice(hq, hq * 2) +
i.data.slice(q * 2, q * 3) +
i.hash.slice(hq * 2, hq * 3) +
i.data.slice(q * 3) +
i.hash.slice(hq * 3)
)
})(),
id: i.id, id: i.id,
price: i.price, price: i.price,
buyable: i.state == 1, buyable: i.state == 1,

View File

@@ -5,7 +5,7 @@ import {
jsonResponse jsonResponse
} from '../../../lib/util' } from '../../../lib/util'
import { berryDashMarketplaceIcons, users } from '../../../lib/tables' import { berryDashMarketplaceIcons, users } from '../../../lib/tables'
import { and, eq, inArray, or, sql, not } from 'drizzle-orm' import { and, eq, inArray, or, sql, not, desc, asc } from 'drizzle-orm'
import { checkAuthorization } from '../../../lib/bd/auth' import { checkAuthorization } from '../../../lib/bd/auth'
type Body = { type Body = {
@@ -81,12 +81,7 @@ export async function handler (context: Context) {
body2.currentIcons = JSON.parse(atob(body.currentIcons)) body2.currentIcons = JSON.parse(atob(body.currentIcons))
const body3: Body = body2 as Body const body3: Body = body2 as Body
const filters: any[] = [ const filters: any[] = [eq(berryDashMarketplaceIcons.state, 1)]
or(
eq(berryDashMarketplaceIcons.state, 1),
eq(berryDashMarketplaceIcons.state, 2)
)
]
if (body3.priceRangeEnabled) { if (body3.priceRangeEnabled) {
filters.push( filters.push(
@@ -120,16 +115,16 @@ export async function handler (context: Context) {
let orderBy: any let orderBy: any
switch (body3.sortBy) { switch (body3.sortBy) {
case 1: case 1:
orderBy = sql`price ASC` orderBy = asc(berryDashMarketplaceIcons.price)
break break
case 2: case 2:
orderBy = sql`place ASC` orderBy = asc(berryDashMarketplaceIcons.place)
break break
case 3: case 3:
orderBy = sql`place DESC` orderBy = desc(berryDashMarketplaceIcons.place)
break break
default: default:
orderBy = sql`price DESC` orderBy = desc(berryDashMarketplaceIcons.price)
break break
} }
@@ -161,20 +156,7 @@ export async function handler (context: Context) {
const result = icons.map(i => ({ const result = icons.map(i => ({
username: usersMap[i.userId] ?? 'Unknown', username: usersMap[i.userId] ?? 'Unknown',
userId: i.userId, userId: i.userId,
data: (() => { data: i.data,
const q = Math.floor(i.data.length / 4)
const hq = Math.floor(i.hash.length / 4)
return (
i.data.slice(0, q) +
i.hash.slice(0, hq) +
i.data.slice(q, q * 2) +
i.hash.slice(hq, hq * 2) +
i.data.slice(q * 2, q * 3) +
i.hash.slice(hq * 2, hq * 3) +
i.data.slice(q * 3) +
i.hash.slice(hq * 3)
)
})(),
id: i.id, id: i.id,
price: i.price, price: i.price,
buyable: i.state == 1, buyable: i.state == 1,