From a71fef316b7543fe56fcdf7f6f6d0557625e02cb Mon Sep 17 00:00:00 2001 From: Robert Jansen Date: Tue, 21 Jan 2025 13:02:05 +0000 Subject: [PATCH] add ratings to api --- package.json | 14 +++--- pnpm-lock.yaml | 80 +++++++++++++++++------------------ src/api/index.ts | 6 ++- src/crontabs/update-prices.ts | 22 +++++++--- src/globals/builtbybit.ts | 2 + src/globals/sourcexchange.ts | 2 + src/schema.ts | 2 +- 7 files changed, 71 insertions(+), 57 deletions(-) diff --git a/package.json b/package.json index 5904c15..9f290c9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "api", - "version": "1.4.3", + "version": "1.5.0", "scripts": { "build": "rm -rf lib && esbuild `find src \\( -name '*.ts' -o -name '*.tsx' \\)` --platform='node' --sourcemap --ignore-annotations --format='cjs' --target='es2022' --outdir='lib' && esbuild src/index.ts --platform='node' --sourcemap --ignore-annotations --format='cjs' --target='es2022' --outdir='lib' --banner:js='require(\"module-alias\").addAlias(\"@\", __dirname);'", "kit": "drizzle-kit", @@ -8,16 +8,16 @@ "dev": "pnpm build && cd lib && NODE_ENV=development node --enable-source-maps index && cd .." }, "keywords": [], - "author": "", - "license": "ISC", + "author": "0x7d8", + "license": "MIT", "dependencies": { "@rjweb/runtime-node": "^1.1.1", "@rjweb/sentry": "^2.1.5", "@rjweb/utils": "^1.12.27", - "@sentry/node": "^8.48.0", + "@sentry/node": "^8.50.0", "ansi-colors": "^4.1.3", - "drizzle-kit": "^0.28.1", - "drizzle-orm": "^0.36.4", + "drizzle-orm": "^0.38.4", + "drizzle-kit": "^0.30.2", "ioredis": "^5.4.2", "module-alias": "^2.2.3", "node-cron": "^3.0.3", @@ -26,7 +26,7 @@ "zod": "^3.24.1" }, "devDependencies": { - "@types/node": "^22.10.6", + "@types/node": "^22.10.7", "@types/node-cron": "^3.0.11", "@types/pg": "^8.11.10", "esbuild": "^0.24.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7044f6a..e5289c4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,17 +18,17 @@ importers: specifier: ^1.12.27 version: 1.12.27 '@sentry/node': - specifier: ^8.48.0 - version: 8.48.0 + specifier: ^8.50.0 + version: 8.50.0 ansi-colors: specifier: ^4.1.3 version: 4.1.3 drizzle-kit: - specifier: ^0.28.1 - version: 0.28.1 + specifier: ^0.30.2 + version: 0.30.2 drizzle-orm: - specifier: ^0.36.4 - version: 0.36.4(@opentelemetry/api@1.9.0)(@types/pg@8.11.10)(pg@8.13.1) + specifier: ^0.38.4 + version: 0.38.4(@opentelemetry/api@1.9.0)(@types/pg@8.11.10)(pg@8.13.1) ioredis: specifier: ^5.4.2 version: 5.4.2 @@ -49,8 +49,8 @@ importers: version: 3.24.1 devDependencies: '@types/node': - specifier: ^22.10.6 - version: 22.10.6 + specifier: ^22.10.7 + version: 22.10.7 '@types/node-cron': specifier: ^3.0.11 version: 3.0.11 @@ -733,16 +733,16 @@ packages: resolution: {integrity: sha512-8XEf4WyAJpicJyDAwwq+rDajXyh6aRlN1eE22iz9vcmmb0MFZIsk1i826ExnwmE4mxtww6lA44YDtH+CygWtPQ==} engines: {node: '>=18.0.0'} - '@sentry/core@8.48.0': - resolution: {integrity: sha512-VGwYgTfLpvJ5LRO5A+qWo1gpo6SfqaGXL9TOzVgBucAdpzbrYHpZ87sEarDVq/4275uk1b0S293/mfsskFczyw==} + '@sentry/core@8.50.0': + resolution: {integrity: sha512-q71m8Ha9YGwqn4Gd7sWvcFTRgbHXxEfU4QeIFtwMBpwHfq2Q+9koiF8DOoOHqIEOsnlvZWRQgGggIOdHzajnVw==} engines: {node: '>=14.18'} - '@sentry/node@8.48.0': - resolution: {integrity: sha512-pnprAuUOc8cxnJdZA09hutHXNsbQZoDgzf3zPyXMNx0ewB/RviFMOgfe7ViX1mIB/oVrcFenXBgO5uvTd7JwPg==} + '@sentry/node@8.50.0': + resolution: {integrity: sha512-I9eGIdcoWKVy4O8a1f2t0jGVTdN1z9McxbGW8aWwDE5Vd9gpuNjFh9qGapmBEPzysWBX8rjsemDdSa3TcijJMw==} engines: {node: '>=14.18'} - '@sentry/opentelemetry@8.48.0': - resolution: {integrity: sha512-1JLXgmIvD3T7xn9ypwWW0V3GirNy4BN2fOUbZau/nUX/Jj5DttSoPn7x7xTaPSpfaA24PiP93zXmJEfZvCk00Q==} + '@sentry/opentelemetry@8.50.0': + resolution: {integrity: sha512-uAZjAMPAulFHL88ThK2k+XPx2QzvZ/I7e7sP1In28Tb/yLH0mi+51AUH+zcnLELIPC86m1aDYl8uwYcP6tV4dA==} engines: {node: '>=14.18'} peerDependencies: '@opentelemetry/api': ^1.9.0 @@ -760,8 +760,8 @@ packages: '@types/node-cron@3.0.11': resolution: {integrity: sha512-0ikrnug3/IyneSHqCBeslAhlK2aBfYek1fGo4bP4QnZPmiqSGRK+Oy7ZMisLWkesffJvQ1cqAcBnJC+8+nxIAg==} - '@types/node@22.10.6': - resolution: {integrity: sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ==} + '@types/node@22.10.7': + resolution: {integrity: sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==} '@types/pg-pool@2.0.6': resolution: {integrity: sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==} @@ -881,15 +881,15 @@ packages: resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} engines: {node: '>=0.10'} - drizzle-kit@0.28.1: - resolution: {integrity: sha512-JimOV+ystXTWMgZkLHYHf2w3oS28hxiH1FR0dkmJLc7GHzdGJoJAQtQS5DRppnabsRZwE2U1F6CuezVBgmsBBQ==} + drizzle-kit@0.30.2: + resolution: {integrity: sha512-vhdLrxWA32WNVF77NabpSnX7pQBornx64VDQDmKddRonOB2Xe/yY4glQ7rECoa+ogqcQNo7VblLUbeBK6Zn9Ow==} hasBin: true - drizzle-orm@0.36.4: - resolution: {integrity: sha512-1OZY3PXD7BR00Gl61UUOFihslDldfH4NFRH2MbP54Yxi0G/PKn4HfO65JYZ7c16DeP3SpM3Aw+VXVG9j6CRSXA==} + drizzle-orm@0.38.4: + resolution: {integrity: sha512-s7/5BpLKO+WJRHspvpqTydxFob8i1vo2rEx4pY6TGY7QSMuUfWUuzaY0DIpXCkgHOo37BaFC+SJQb99dDUXT3Q==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' - '@cloudflare/workers-types': '>=3' + '@cloudflare/workers-types': '>=4' '@electric-sql/pglite': '>=0.2.0' '@libsql/client': '>=0.10.0' '@libsql/client-wasm': '>=0.10.0' @@ -1018,8 +1018,8 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-tsconfig@4.8.1: - resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} + get-tsconfig@4.10.0: + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -1385,7 +1385,7 @@ snapshots: '@esbuild-kit/esm-loader@2.6.5': dependencies: '@esbuild-kit/core-utils': 3.3.2 - get-tsconfig: 4.8.1 + get-tsconfig: 4.10.0 '@esbuild/aix-ppc64@0.19.12': optional: true @@ -1899,7 +1899,7 @@ snapshots: '@rjweb/sentry@2.1.5': dependencies: - '@sentry/node': 8.48.0 + '@sentry/node': 8.50.0 rjweb-server: 9.8.4 transitivePeerDependencies: - supports-color @@ -1908,9 +1908,9 @@ snapshots: dependencies: ts-arithmetic: 0.1.1 - '@sentry/core@8.48.0': {} + '@sentry/core@8.50.0': {} - '@sentry/node@8.48.0': + '@sentry/node@8.50.0': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/context-async-hooks': 1.30.1(@opentelemetry/api@1.9.0) @@ -1944,32 +1944,32 @@ snapshots: '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.28.0 '@prisma/instrumentation': 5.22.0 - '@sentry/core': 8.48.0 - '@sentry/opentelemetry': 8.48.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.28.0) + '@sentry/core': 8.50.0 + '@sentry/opentelemetry': 8.50.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.28.0) import-in-the-middle: 1.12.0 transitivePeerDependencies: - supports-color - '@sentry/opentelemetry@8.48.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.28.0)': + '@sentry/opentelemetry@8.50.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.28.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.56.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.28.0 - '@sentry/core': 8.48.0 + '@sentry/core': 8.50.0 '@types/connect@3.4.36': dependencies: - '@types/node': 22.10.6 + '@types/node': 22.10.7 '@types/mysql@2.15.26': dependencies: - '@types/node': 22.10.6 + '@types/node': 22.10.7 '@types/node-cron@3.0.11': {} - '@types/node@22.10.6': + '@types/node@22.10.7': dependencies: undici-types: 6.20.0 @@ -1979,13 +1979,13 @@ snapshots: '@types/pg@8.11.10': dependencies: - '@types/node': 22.10.6 + '@types/node': 22.10.7 pg-protocol: 1.7.0 pg-types: 4.0.2 '@types/pg@8.6.1': dependencies: - '@types/node': 22.10.6 + '@types/node': 22.10.7 pg-protocol: 1.7.0 pg-types: 2.2.0 @@ -1993,7 +1993,7 @@ snapshots: '@types/tedious@4.0.14': dependencies: - '@types/node': 22.10.6 + '@types/node': 22.10.7 acorn-import-attributes@1.9.5(acorn@8.14.0): dependencies: @@ -2079,7 +2079,7 @@ snapshots: denque@2.1.0: {} - drizzle-kit@0.28.1: + drizzle-kit@0.30.2: dependencies: '@drizzle-team/brocli': 0.10.2 '@esbuild-kit/esm-loader': 2.6.5 @@ -2088,7 +2088,7 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.36.4(@opentelemetry/api@1.9.0)(@types/pg@8.11.10)(pg@8.13.1): + drizzle-orm@0.38.4(@opentelemetry/api@1.9.0)(@types/pg@8.11.10)(pg@8.13.1): optionalDependencies: '@opentelemetry/api': 1.9.0 '@types/pg': 8.11.10 @@ -2196,7 +2196,7 @@ snapshots: get-caller-file@2.0.5: {} - get-tsconfig@4.8.1: + get-tsconfig@4.10.0: dependencies: resolve-pkg-maps: 1.0.0 diff --git a/src/api/index.ts b/src/api/index.ts index 984add1..e81496e 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -98,8 +98,10 @@ server.schema('Extension', { properties: { url: { type: 'string', format: 'uri' }, price: { type: 'number' }, - currency: { type: 'string', enum: Array.from(database.schema.currency) } - }, required: ['url', 'price', 'currency'] + currency: { type: 'string', enum: Array.from(database.schema.currency) }, + reviews: { type: 'integer' }, + rating: { type: 'number' } + }, required: ['url', 'price', 'currency', 'reviews'] } }, diff --git a/src/crontabs/update-prices.ts b/src/crontabs/update-prices.ts index 3129bdf..8bff463 100644 --- a/src/crontabs/update-prices.ts +++ b/src/crontabs/update-prices.ts @@ -28,8 +28,6 @@ export default new Crontab() ]) for (const extension of extensions) { - if (!Object.keys(extension.platforms).filter((platform) => platform !== 'GITHUB').length) continue - logger() .text('Updating Extension Prices of') .text(extension.name, (c) => c.cyan) @@ -44,7 +42,9 @@ export default new Crontab() platforms.SOURCEXCHANGE = { url: extension.platforms.SOURCEXCHANGE.url, price: product.price, - currency: product.currency + currency: product.currency, + reviews: product.review_count, + rating: product.rating_avg || undefined } } } @@ -56,16 +56,24 @@ export default new Crontab() platforms.BUILTBYBIT = { url: extension.platforms.BUILTBYBIT.url, price: product.price, - currency: product.currency + currency: product.currency, + reviews: product.review_count, + rating: product.review_average || undefined } } } + if (extension.platforms.GITHUB && (!platforms.GITHUB.price || !platforms.GITHUB.currency || !platforms.GITHUB.reviews)) { + platforms.GITHUB = Object.assign(extension.platforms.GITHUB, { + price: 0, + currency: 'USD', + reviews: 0 + }) + } + if (JSON.stringify(platforms) !== JSON.stringify(extension.platforms)) { await ctx.database.write.update(ctx.database.schema.extensions) - .set({ - platforms - }) + .set({ platforms }) .where(eq(ctx.database.schema.extensions.id, extension.id)) } diff --git a/src/globals/builtbybit.ts b/src/globals/builtbybit.ts index 993bd93..bc002a8 100644 --- a/src/globals/builtbybit.ts +++ b/src/globals/builtbybit.ts @@ -4,6 +4,8 @@ import { Currency } from "@/schema" export type BBBProduct = { price: number currency: Currency + review_average: number | null + review_count: number } /** diff --git a/src/globals/sourcexchange.ts b/src/globals/sourcexchange.ts index 7953ce2..eb73576 100644 --- a/src/globals/sourcexchange.ts +++ b/src/globals/sourcexchange.ts @@ -5,6 +5,8 @@ export type SXCProduct = { price: number currency: Currency url: string + rating_avg: number | null + review_count: number } /** diff --git a/src/schema.ts b/src/schema.ts index 567b37e..6628474 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -80,7 +80,7 @@ export const extensions = pgTable('extensions', { identifier: varchar('identifier', { length: 63 }).notNull(), summary: varchar('summary', { length: 255 }).notNull(), - platforms: jsonb('platforms').notNull().$type>(), + platforms: jsonb('platforms').notNull().$type>(), keywords: varchar('keywords', { length: 255 }).array().notNull().default([]), banner: varchar('banner', { length: 255 }).notNull(),