Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions apps/api/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
"migration:gen": "drizzle-kit generate",
"prod": "doppler run -- node dist/server.js",
"release": "release-it",
"sdk:gen:react-query": "npm run sdk:gen:swagger && rimraf ../../packages/react-query-sdk/src/api && openapi-qraft --plugin tanstack-query-react --plugin openapi-typescript ./swagger/swagger.json -o ../../packages/react-query-sdk/src/api",
"sdk:gen:swagger": "rimraf ./swagger && ts-node -r tsconfig-paths/register scripts/generateSwagger.ts",
"start": "webpack --config webpack.dev.js --watch",
"test": "jest --selectProjects unit functional",
"test:ci-setup": "dc up -d db mock-oauth2-server provider-proxy",
Expand Down Expand Up @@ -116,6 +118,7 @@
"@akashnetwork/docker": "*",
"@akashnetwork/releaser": "*",
"@faker-js/faker": "^8.4.1",
"@openapi-qraft/cli": "^2.5.0",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🌐 Web query:

latest stable version @openapi-qraft/cli npm package

💡 Result:

Latest stable version: 2.12.0 (published Aug 17, 2025). [1][2]

Sources:
[1] npm package page for @openapi-qraft/cli.
[2] Yarn package listing (shows 2.12.0 published Aug 17, 2025).


🌐 Web query:

latest stable version rimraf npm package

💡 Result:

Latest stable version: rimraf 6.1.2 (as of Dec 30, 2025). [1][2]

Sources:

  • Yarn package info showing v6.1.2 (Nov 19, 2025). [1]
  • Snyk package page listing latest version 6.1.2. [2]

🏁 Script executed:

sed -n '155p' apps/api/package.json

Repository: akash-network/console

Length of output: 88


Update to latest dependency versions.

@openapi-qraft/cli is outdated (currently ^2.5.0, latest is 2.12.0). rimraf is also outdated (currently ^6.0.1, latest is 6.1.2). Update both dependencies to their latest stable versions.

Also applies to: 155-155

🤖 Prompt for AI Agents
In apps/api/package.json around lines 121 and 155, update outdated dependency
versions: change "@openapi-qraft/cli" from "^2.5.0" to "^2.12.0" and change
"rimraf" from "^6.0.1" to "^6.1.2"; ensure package.json formatting and commas
remain valid, then run npm install (or yarn) and update lockfile
(package-lock.json or yarn.lock) to persist the new versions.

"@types/bcryptjs": "^2.4.6",
"@types/dot-object": "^2.1.6",
"@types/http-assert": "^1.5.5",
Expand Down Expand Up @@ -149,6 +152,7 @@
"openapi3-ts": "^4.5.0",
"prettier": "^3.3.0",
"prettier-plugin-tailwindcss": "^0.6.1",
"rimraf": "^6.0.1",
"supertest": "^6.1.5",
"ts-jest": "^29.1.4",
"ts-loader": "^9.5.2",
Expand Down
48 changes: 48 additions & 0 deletions apps/api/scripts/generateSwagger.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import "reflect-metadata";
import "@akashnetwork/env-loader";
import "../src/app";

import * as fsp from "fs/promises";
import { dirname, resolve } from "path";
import { container } from "tsyringe";

import { openApiHonoHandlers } from "../src/app/rest-handlers";
import { OpenApiDocsService } from "../src/core/services/openapi-docs/openapi-docs.service";

async function main() {
const outputPathArg = process.argv[2];
const defaultOutputPath = resolve(process.cwd(), "swagger/swagger.json");
const outputPath = outputPathArg ? resolve(process.cwd(), outputPathArg) : defaultOutputPath;
const scope = (process.argv[3] as "full" | "console") || "full";

if (!["full", "console"].includes(scope)) {
console.error(`Invalid scope: ${scope}. Valid options: "full", "console"`);
process.exit(1);
}

console.log(`Generating OpenAPI docs with scope: ${scope}`);
console.log(`Output path: ${outputPath}`);

try {
const openApiDocsService = container.resolve<OpenApiDocsService>(OpenApiDocsService);
const docs = await openApiDocsService.generateDocs(openApiHonoHandlers, { scope });

// Sanitize path parameter names - remove '?' from optional path parameters
// Hono supports {param?} but OpenAPI doesn't, and it causes invalid TypeScript identifiers
const sanitizedDocs = {
...docs,
paths: Object.fromEntries(Object.entries(docs.paths || {}).map(([path, pathItem]) => [path.replace(/\{(\w+)\?}/g, "{$1}"), pathItem]))
};

const outputDir = dirname(outputPath);
await fsp.mkdir(outputDir, { recursive: true });
await fsp.writeFile(outputPath, JSON.stringify(sanitizedDocs, null, 2));

console.log(`✓ Swagger JSON written successfully to ${outputPath}`);
} catch (error) {
console.error("Error generating Swagger docs:", error);
process.exit(1);
}
}

main();
99 changes: 99 additions & 0 deletions apps/api/src/app/rest-handlers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
import { addressRouter } from "@src/address";
import { apiKeysRouter, sendVerificationEmailRouter } from "@src/auth";
import { verifyEmailRouter } from "@src/auth/routes/verify-email/verify-email.router";
import { bidsRouter } from "@src/bid/routes/bids/bids.router";
import {
checkoutRouter,
getBalancesRouter,
getWalletListRouter,
signAndBroadcastTxRouter,
startTrialRouter,
stripeCouponsRouter,
stripeCustomersRouter,
stripePaymentMethodsRouter,
stripePricesRouter,
stripeTransactionsRouter,
stripeWebhook,
usageRouter,
walletSettingRouter
} from "@src/billing";
import { blockPredictionRouter, blocksRouter } from "@src/block";
import { certificateRouter } from "@src/certificate/routes/certificate.router";
import type { OpenApiHonoHandler } from "@src/core/services/open-api-hono-handler/open-api-hono-handler";
import { dashboardDataRouter, graphDataRouter, leasesDurationRouter, marketDataRouter, networkCapacityRouter } from "@src/dashboard";
import { deploymentSettingRouter } from "@src/deployment/routes/deployment-setting/deployment-setting.router";
import { deploymentsRouter } from "@src/deployment/routes/deployments/deployments.router";
import { leasesRouter } from "@src/deployment/routes/leases/leases.router";
import { gpuRouter } from "@src/gpu";
import { networkRouter } from "@src/network";
import { pricingRouter } from "@src/pricing";
import { proposalsRouter } from "@src/proposal";
import {
auditorsRouter,
providerAttributesSchemaRouter,
providerDashboardRouter,
providerDeploymentsRouter,
providerEarningsRouter,
providerGraphDataRouter,
providerJwtTokenRouter,
providerRegionsRouter,
providersRouter,
providerVersionsRouter
} from "@src/provider";
import { templatesRouter } from "@src/template";
import { transactionsRouter } from "@src/transaction";
import { createAnonymousUserRouter, getAnonymousUserRouter, getCurrentUserRouter, registerUserRouter } from "@src/user";
import { validatorsRouter } from "@src/validator";

export const openApiHonoHandlers: OpenApiHonoHandler[] = [
startTrialRouter,
getWalletListRouter,
walletSettingRouter,
signAndBroadcastTxRouter,
checkoutRouter,
stripeWebhook,
stripePricesRouter,
stripeCouponsRouter,
stripeCustomersRouter,
stripePaymentMethodsRouter,
stripeTransactionsRouter,
usageRouter,
createAnonymousUserRouter,
getAnonymousUserRouter,
registerUserRouter,
getCurrentUserRouter,
sendVerificationEmailRouter,
verifyEmailRouter,
deploymentSettingRouter,
deploymentsRouter,
leasesRouter,
apiKeysRouter,
bidsRouter,
certificateRouter,
getBalancesRouter,
providersRouter,
auditorsRouter,
providerAttributesSchemaRouter,
providerRegionsRouter,
providerDashboardRouter,
providerEarningsRouter,
providerVersionsRouter,
providerGraphDataRouter,
providerDeploymentsRouter,
providerJwtTokenRouter,
graphDataRouter,
dashboardDataRouter,
networkCapacityRouter,
blocksRouter,
blockPredictionRouter,
transactionsRouter,
marketDataRouter,
validatorsRouter,
pricingRouter,
gpuRouter,
proposalsRouter,
templatesRouter,
leasesDurationRouter,
addressRouter,
networkRouter
];
2 changes: 1 addition & 1 deletion apps/api/src/billing/services/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@ export * from "./wallet-initializer/wallet-initializer.service";
export * from "@src/billing/lib/wallet/wallet";
export * from "@src/billing/lib/batch-signing-client/batch-signing-client.service";
export * from "@src/billing/services/managed-signer/managed-signer.service";
export * from "./remaining-credits/remaining-credits.service.ts";
export * from "./remaining-credits/remaining-credits.service";
export * from "./wallet-settings/wallet-settings.service";
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,14 @@ export class OpenApiDocsService {
});

Object.assign(docs.paths, handlerDocs.paths);

if (handlerDocs.components?.schemas) {
Object.assign(docs.components.schemas, handlerDocs.components.schemas);
}

if (handlerDocs.components?.securitySchemes) {
Object.assign(docs.components.securitySchemes, handlerDocs.components.securitySchemes);
}
} catch (error) {
logger.error({
name: `Error generating OpenAPI docs for handler, example path: ${handler.routes[0]?.path || "unknown"}`,
Expand Down
2 changes: 1 addition & 1 deletion apps/api/src/deployment/services/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1 @@
export * from "./active-deployments-count/active-deployments-count.service.ts";
export * from "./active-deployments-count/active-deployments-count.service";
99 changes: 1 addition & 98 deletions apps/api/src/rest-app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,14 @@ import assert from "http-assert";
import { container } from "tsyringe";

import packageJson from "../package.json";
import { verifyEmailRouter } from "./auth/routes/verify-email/verify-email.router";
import { openApiHonoHandlers } from "./app/rest-handlers";
import { AuthInterceptor } from "./auth/services/auth.interceptor";
import { bidsRouter } from "./bid/routes/bids/bids.router";
import { certificateRouter } from "./certificate/routes/certificate.router";
import { HonoErrorHandlerService } from "./core/services/hono-error-handler/hono-error-handler.service";
import type { OpenApiHonoHandler } from "./core/services/open-api-hono-handler/open-api-hono-handler";
import { OpenApiDocsService } from "./core/services/openapi-docs/openapi-docs.service";
import { RequestContextInterceptor } from "./core/services/request-context-interceptor/request-context.interceptor";
import { startServer } from "./core/services/start-server/start-server";
import type { AppEnv } from "./core/types/app-context";
import { connectUsingSequelize } from "./db/dbConnection";
import { deploymentSettingRouter } from "./deployment/routes/deployment-setting/deployment-setting.router";
import { deploymentsRouter } from "./deployment/routes/deployments/deployments.router";
import { leasesRouter } from "./deployment/routes/leases/leases.router";
import { healthzRouter } from "./healthz/routes/healthz.router";
import { clientInfoMiddleware } from "./middlewares/clientInfoMiddleware";
import { notificationsApiProxy } from "./notifications/routes/proxy/proxy.route";
Expand All @@ -35,46 +29,7 @@ import { legacyRouter } from "./routers/legacyRouter";
import { userRouter } from "./routers/userRouter";
import { web3IndexRouter } from "./routers/web3indexRouter";
import { bytesToHumanReadableSize } from "./utils/files";
import { addressRouter } from "./address";
import { apiKeysRouter, sendVerificationEmailRouter } from "./auth";
import {
checkoutRouter,
getBalancesRouter,
getWalletListRouter,
signAndBroadcastTxRouter,
startTrialRouter,
stripeCouponsRouter,
stripeCustomersRouter,
stripePaymentMethodsRouter,
stripePricesRouter,
stripeTransactionsRouter,
stripeWebhook,
usageRouter,
walletSettingRouter
} from "./billing";
import { blockPredictionRouter, blocksRouter } from "./block";
import { CORE_CONFIG, migratePG } from "./core";
import { dashboardDataRouter, graphDataRouter, leasesDurationRouter, marketDataRouter, networkCapacityRouter } from "./dashboard";
import { gpuRouter } from "./gpu";
import { networkRouter } from "./network";
import { pricingRouter } from "./pricing";
import { proposalsRouter } from "./proposal";
import {
auditorsRouter,
providerAttributesSchemaRouter,
providerDashboardRouter,
providerDeploymentsRouter,
providerEarningsRouter,
providerGraphDataRouter,
providerJwtTokenRouter,
providerRegionsRouter,
providersRouter,
providerVersionsRouter
} from "./provider";
import { templatesRouter } from "./template";
import { transactionsRouter } from "./transaction";
import { createAnonymousUserRouter, getAnonymousUserRouter, getCurrentUserRouter, registerUserRouter } from "./user";
import { validatorsRouter } from "./validator";

const appHono = new Hono<AppEnv>();
appHono.use("*", otel());
Expand Down Expand Up @@ -104,58 +59,6 @@ appHono.route("/dashboard", dashboardRouter);
appHono.route("/internal", internalRouter);
appHono.route("/deployments", deploymentRouter);

const openApiHonoHandlers: OpenApiHonoHandler[] = [
startTrialRouter,
getWalletListRouter,
walletSettingRouter,
signAndBroadcastTxRouter,
checkoutRouter,
stripeWebhook,
stripePricesRouter,
stripeCouponsRouter,
stripeCustomersRouter,
stripePaymentMethodsRouter,
stripeTransactionsRouter,
usageRouter,
createAnonymousUserRouter,
getAnonymousUserRouter,
registerUserRouter,
getCurrentUserRouter,
sendVerificationEmailRouter,
verifyEmailRouter,
deploymentSettingRouter,
deploymentsRouter,
leasesRouter,
apiKeysRouter,
bidsRouter,
certificateRouter,
getBalancesRouter,
providersRouter,
auditorsRouter,
providerAttributesSchemaRouter,
providerRegionsRouter,
providerDashboardRouter,
providerEarningsRouter,
providerVersionsRouter,
providerGraphDataRouter,
providerDeploymentsRouter,
providerJwtTokenRouter,
graphDataRouter,
dashboardDataRouter,
networkCapacityRouter,
blocksRouter,
blockPredictionRouter,
transactionsRouter,
marketDataRouter,
validatorsRouter,
pricingRouter,
gpuRouter,
proposalsRouter,
templatesRouter,
leasesDurationRouter,
addressRouter,
networkRouter
];
for (const handler of openApiHonoHandlers) {
appHono.route("/", handler);
}
Expand Down
Loading
Loading