From 6f5f29c30eda09d49d3400120a6fef41005fc204 Mon Sep 17 00:00:00 2001 From: aditya Date: Fri, 22 May 2026 01:05:22 +0530 Subject: [PATCH 1/4] add upi-gateway logic --- server/bun.lock | 49 ++++++++++++++++++++----------- server/package.json | 1 + server/src/database/schema.ts | 2 +- server/src/routes/order.ts | 33 ++++++++------------- server/src/routes/webhook.ts | 33 +++++++++++++++++++++ server/src/services/upigateway.ts | 5 ++++ server/src/types/index.ts | 14 +++++++++ 7 files changed, 98 insertions(+), 39 deletions(-) create mode 100644 server/src/routes/webhook.ts create mode 100644 server/src/services/upigateway.ts diff --git a/server/bun.lock b/server/bun.lock index 80cfccd..7e19404 100644 --- a/server/bun.lock +++ b/server/bun.lock @@ -5,25 +5,26 @@ "": { "name": "server", "dependencies": { - "@aws-sdk/client-s3": "latest", - "@aws-sdk/s3-request-presigner": "latest", - "@hono/zod-validator": "latest", - "@libsql/client": "latest", - "better-sse": "latest", - "dotenv": "latest", - "drizzle-orm": "latest", - "google-auth-library": "latest", - "hono": "latest", - "pdf-lib": "latest", - "razorpay": "latest", - "short-unique-id": "latest", - "zod": "latest", + "@aws-sdk/client-s3": "^3.1051.0", + "@aws-sdk/s3-request-presigner": "^3.1051.0", + "@hono/zod-validator": "^0.8.0", + "@libsql/client": "^0.17.3", + "better-sse": "^0.16.1", + "dotenv": "^17.4.2", + "drizzle-orm": "^0.45.2", + "google-auth-library": "^10.6.2", + "hono": "^4.12.21", + "pdf-lib": "^1.17.1", + "razorpay": "^2.9.6", + "short-unique-id": "^5.3.2", + "upigateway": "^1.0.4", + "zod": "^4.4.3", }, "devDependencies": { - "@types/bun": "latest", - "drizzle-kit": "latest", - "typescript": "latest", - "wrangler": "latest", + "@types/bun": "^1.3.14", + "drizzle-kit": "^0.31.10", + "typescript": "^6.0.3", + "wrangler": "^4.93.1", }, }, }, @@ -468,6 +469,8 @@ "unenv": ["unenv@2.0.0-rc.24", "", { "dependencies": { "pathe": "^2.0.3" } }, "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw=="], + "upigateway": ["upigateway@1.0.4", "", { "dependencies": { "axios": "^1.15.2" } }, "sha512-Cn4KOK4GosXICB4w9oBHKws4HXCkqzNuvs5taNzZftDGO2UHZN5E2DrL3rNbpzcjtD2KbERFCEqv7A8z+VQGOA=="], + "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], "workerd": ["workerd@1.20260520.1", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20260520.1", "@cloudflare/workerd-darwin-arm64": "1.20260520.1", "@cloudflare/workerd-linux-64": "1.20260520.1", "@cloudflare/workerd-linux-arm64": "1.20260520.1", "@cloudflare/workerd-windows-64": "1.20260520.1" }, "bin": { "workerd": "bin/workerd" } }, "sha512-mwW6H/NEKObeBVd0qkq91EGyOIC3TaNJBxp7kj5uChif/+qYD7nM5HE8ZYruwvEd15pRwUet+V8r21DCXCGDQQ=="], @@ -496,6 +499,8 @@ "tsx/esbuild": ["esbuild@0.28.0", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.0", "@esbuild/android-arm": "0.28.0", "@esbuild/android-arm64": "0.28.0", "@esbuild/android-x64": "0.28.0", "@esbuild/darwin-arm64": "0.28.0", "@esbuild/darwin-x64": "0.28.0", "@esbuild/freebsd-arm64": "0.28.0", "@esbuild/freebsd-x64": "0.28.0", "@esbuild/linux-arm": "0.28.0", "@esbuild/linux-arm64": "0.28.0", "@esbuild/linux-ia32": "0.28.0", "@esbuild/linux-loong64": "0.28.0", "@esbuild/linux-mips64el": "0.28.0", "@esbuild/linux-ppc64": "0.28.0", "@esbuild/linux-riscv64": "0.28.0", "@esbuild/linux-s390x": "0.28.0", "@esbuild/linux-x64": "0.28.0", "@esbuild/netbsd-arm64": "0.28.0", "@esbuild/netbsd-x64": "0.28.0", "@esbuild/openbsd-arm64": "0.28.0", "@esbuild/openbsd-x64": "0.28.0", "@esbuild/openharmony-arm64": "0.28.0", "@esbuild/sunos-x64": "0.28.0", "@esbuild/win32-arm64": "0.28.0", "@esbuild/win32-ia32": "0.28.0", "@esbuild/win32-x64": "0.28.0" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw=="], + "upigateway/axios": ["axios@1.16.1", "", { "dependencies": { "follow-redirects": "^1.16.0", "form-data": "^4.0.5", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } }, "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A=="], + "wrangler/esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="], "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.18.20", "", { "os": "android", "cpu": "arm" }, "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw=="], @@ -596,6 +601,14 @@ "tsx/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.0", "", { "os": "win32", "cpu": "x64" }, "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw=="], + "upigateway/axios/follow-redirects": ["follow-redirects@1.16.0", "", {}, "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw=="], + + "upigateway/axios/form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], + + "upigateway/axios/https-proxy-agent": ["https-proxy-agent@5.0.1", "", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="], + + "upigateway/axios/proxy-from-env": ["proxy-from-env@2.1.0", "", {}, "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA=="], + "wrangler/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], "wrangler/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="], @@ -647,5 +660,7 @@ "wrangler/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q=="], "wrangler/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="], + + "upigateway/axios/https-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], } } diff --git a/server/package.json b/server/package.json index cd9d2e3..289bc4c 100644 --- a/server/package.json +++ b/server/package.json @@ -17,6 +17,7 @@ "pdf-lib": "^1.17.1", "razorpay": "^2.9.6", "short-unique-id": "^5.3.2", + "upigateway": "^1.0.4", "zod": "^4.4.3" }, "devDependencies": { diff --git a/server/src/database/schema.ts b/server/src/database/schema.ts index 431755d..70a292e 100644 --- a/server/src/database/schema.ts +++ b/server/src/database/schema.ts @@ -5,9 +5,9 @@ export const orders = sqliteTable("orders", { id: text("id") .primaryKey() .$defaultFn(() => crypto.randomUUID()), - name: text("name").notNull(), email: text("email").notNull(), amount: real("amount").notNull(), + paymentRequestId: text("payment_request_id").notNull(), paid: integer("paid", { mode: "boolean" }).notNull().default(false), status: integer("status").notNull().default(0), createdAt: integer("created_at", { mode: "timestamp_ms" }) diff --git a/server/src/routes/order.ts b/server/src/routes/order.ts index bc19dee..e64837b 100644 --- a/server/src/routes/order.ts +++ b/server/src/routes/order.ts @@ -9,9 +9,7 @@ import { OAuth2Client } from "google-auth-library"; import { orderChannel } from "../channels/orderChannel"; import { authMiddleware } from "../middlewares/auth"; import { PrintConfig } from "../types/index"; -import { Session } from "better-sse"; -import { upgradeWebSocket } from "hono/cloudflare-workers"; -import { WSContext } from "hono/ws"; +import { upiGateway } from "../services/upigateway"; const app = new Hono(); const client = new OAuth2Client(); @@ -22,7 +20,6 @@ app.post( zValidator("json", z.array(PrintConfig)), async (c) => { const file = c.req.valid("json")[0]; - // const user = c.get("w"); const metadataResponse = await database.query.metadata.findFirst({ where: eq(metadata.fileId, file.fileId), @@ -32,37 +29,31 @@ app.post( if (!metadataResponse) return c.json({ message: "something went wrong" }, 400); - // // if (!metadataResponse || !user.email) - // // return c.json({ message: "something went wrong" }); - // + const amount = metadataResponse.pages * 2; - const orderId = await database.transaction(async (tx) => { + const payment = await upiGateway.createRequest({ + amount: amount.toFixed(2), + }); + + const order = await database.transaction(async (tx) => { const [order] = await tx .insert(orders) .values({ - name: file.name, - amount: metadataResponse.pages * 2, + amount, email: "adityadav1809@gmail.com", + paymentRequestId: payment.id, }) - .returning({ id: orders.id }); + .returning({ id: orders.id, amount: orders.amount }); await tx.insert(files).values({ order: order.id, ...file, }); - return order.id; + return order; }); - orderChannel.broadcast(file); - - // const response = await razorpay.orders.create({ - // amount: "100", - // currency: "INR", - // receipt: "payment for print #1", - // }); - - return c.json({ orderId }); + return c.json({ order, payment }); }, ); diff --git a/server/src/routes/webhook.ts b/server/src/routes/webhook.ts new file mode 100644 index 0000000..15565cf --- /dev/null +++ b/server/src/routes/webhook.ts @@ -0,0 +1,33 @@ +import { createResponse } from "better-sse"; +import { Hono } from "hono"; +import { orderChannel } from "../channels/orderChannel.js"; +import { WEBHOOK_DATA, WEBHOOK_TYPE } from "../types/index.js"; +import database from "../database"; +import { eq } from "drizzle-orm"; +import { orders } from "../database/schema.js"; + +const app = new Hono(); + +app.get(`/${process.env.WEBHOOK_SECRET || "webhook"}`, async (c) => { + const body: WEBHOOK_DATA = await c.req.json(); + + if (body.type !== WEBHOOK_TYPE.SUCCESS) + return c.text("error: payment failed"); + + // todo: update database + + const order = await database.query.orders.findFirst({ + where: eq(orders.paymentRequestId, body.requestId), + with: { + files: true, + }, + }); + + if (!order) return c.text("error: invalid order"); + + orderChannel.broadcast(order.files); + + return c.text("ok: done with payment"); +}); + +export default app; diff --git a/server/src/services/upigateway.ts b/server/src/services/upigateway.ts new file mode 100644 index 0000000..ae4c4db --- /dev/null +++ b/server/src/services/upigateway.ts @@ -0,0 +1,5 @@ +import UpiGateway from "upigateway"; + +const upiGateway = new UpiGateway(process.env.UPI_GATEWAY_TOKEN!); + +export { upiGateway }; diff --git a/server/src/types/index.ts b/server/src/types/index.ts index e065960..de1d4c6 100644 --- a/server/src/types/index.ts +++ b/server/src/types/index.ts @@ -15,3 +15,17 @@ export const PrintConfig = z.object({ }); export type PrintConfigType = z.infer; + +export enum WEBHOOK_TYPE { + SUCCESS = "SUCCESS", // 1 + EXPIRED = "EXPIRED", // 2 + CANCELLED = "CANCELLED", // 3 +} + +export type WEBHOOK_DATA = { + type: WEBHOOK_TYPE; + webhookId: string; + requestId: string; + status: number; + timestamp: number; +}; From 8cc793b34c4f32e38e0ae958ff61f412f5ee5851 Mon Sep 17 00:00:00 2001 From: aditya Date: Fri, 22 May 2026 02:09:34 +0530 Subject: [PATCH 2/4] database migration --- ...nkful_toad.sql => 0000_youthful_zaran.sql} | 4 +- .../drizzle/0001_common_steve_rogers.sql | 15 -- .../database/drizzle/meta/0000_snapshot.json | 20 +- .../database/drizzle/meta/0001_snapshot.json | 204 ------------------ .../src/database/drizzle/meta/_journal.json | 11 +- server/src/index.ts | 7 +- server/src/routes/webhook.ts | 5 +- 7 files changed, 23 insertions(+), 243 deletions(-) rename server/src/database/drizzle/{0000_thankful_toad.sql => 0000_youthful_zaran.sql} (90%) delete mode 100644 server/src/database/drizzle/0001_common_steve_rogers.sql delete mode 100644 server/src/database/drizzle/meta/0001_snapshot.json diff --git a/server/src/database/drizzle/0000_thankful_toad.sql b/server/src/database/drizzle/0000_youthful_zaran.sql similarity index 90% rename from server/src/database/drizzle/0000_thankful_toad.sql rename to server/src/database/drizzle/0000_youthful_zaran.sql index ea13109..c228fd3 100644 --- a/server/src/database/drizzle/0000_thankful_toad.sql +++ b/server/src/database/drizzle/0000_youthful_zaran.sql @@ -21,10 +21,10 @@ CREATE TABLE `metadata` ( --> statement-breakpoint CREATE TABLE `orders` ( `id` text PRIMARY KEY NOT NULL, - `name` text NOT NULL, `email` text NOT NULL, `amount` real NOT NULL, + `payment_request_id` text NOT NULL, `paid` integer DEFAULT false NOT NULL, - `status` text DEFAULT 'processing' NOT NULL, + `status` integer DEFAULT 0 NOT NULL, `created_at` integer NOT NULL ); diff --git a/server/src/database/drizzle/0001_common_steve_rogers.sql b/server/src/database/drizzle/0001_common_steve_rogers.sql deleted file mode 100644 index 6e37137..0000000 --- a/server/src/database/drizzle/0001_common_steve_rogers.sql +++ /dev/null @@ -1,15 +0,0 @@ -PRAGMA foreign_keys=OFF;--> statement-breakpoint -CREATE TABLE `__new_orders` ( - `id` text PRIMARY KEY NOT NULL, - `name` text NOT NULL, - `email` text NOT NULL, - `amount` real NOT NULL, - `paid` integer DEFAULT false NOT NULL, - `status` integer DEFAULT 0 NOT NULL, - `created_at` integer NOT NULL -); ---> statement-breakpoint -INSERT INTO `__new_orders`("id", "name", "email", "amount", "paid", "status", "created_at") SELECT "id", "name", "email", "amount", "paid", "status", "created_at" FROM `orders`;--> statement-breakpoint -DROP TABLE `orders`;--> statement-breakpoint -ALTER TABLE `__new_orders` RENAME TO `orders`;--> statement-breakpoint -PRAGMA foreign_keys=ON; \ No newline at end of file diff --git a/server/src/database/drizzle/meta/0000_snapshot.json b/server/src/database/drizzle/meta/0000_snapshot.json index 7e72082..b31d954 100644 --- a/server/src/database/drizzle/meta/0000_snapshot.json +++ b/server/src/database/drizzle/meta/0000_snapshot.json @@ -1,7 +1,7 @@ { "version": "6", "dialect": "sqlite", - "id": "c7e23e83-068d-4b16-92d4-c837d2ba0100", + "id": "96645ee7-79de-4d70-9564-2e4d4faa5df5", "prevId": "00000000-0000-0000-0000-000000000000", "tables": { "files": { @@ -139,13 +139,6 @@ "notNull": true, "autoincrement": false }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, "email": { "name": "email", "type": "text", @@ -160,6 +153,13 @@ "notNull": true, "autoincrement": false }, + "payment_request_id": { + "name": "payment_request_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, "paid": { "name": "paid", "type": "integer", @@ -170,11 +170,11 @@ }, "status": { "name": "status", - "type": "text", + "type": "integer", "primaryKey": false, "notNull": true, "autoincrement": false, - "default": "'processing'" + "default": 0 }, "created_at": { "name": "created_at", diff --git a/server/src/database/drizzle/meta/0001_snapshot.json b/server/src/database/drizzle/meta/0001_snapshot.json deleted file mode 100644 index 88416e4..0000000 --- a/server/src/database/drizzle/meta/0001_snapshot.json +++ /dev/null @@ -1,204 +0,0 @@ -{ - "version": "6", - "dialect": "sqlite", - "id": "8ea45a78-e586-4b2a-9b30-11df74a1df96", - "prevId": "c7e23e83-068d-4b16-92d4-c837d2ba0100", - "tables": { - "files": { - "name": "files", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "order": { - "name": "order", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "orientation": { - "name": "orientation", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "color": { - "name": "color", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "copies": { - "name": "copies", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "paper_format": { - "name": "paper_format", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "page_ranges": { - "name": "page_ranges", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "number_up": { - "name": "number_up", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "sides": { - "name": "sides", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "print_scaling": { - "name": "print_scaling", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "document_format": { - "name": "document_format", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "metadata": { - "name": "metadata", - "columns": { - "file_id": { - "name": "file_id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "type": { - "name": "type", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "pages": { - "name": "pages", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "orders": { - "name": "orders", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "amount": { - "name": "amount", - "type": "real", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "paid": { - "name": "paid", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "status": { - "name": "status", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - } - }, - "views": {}, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - }, - "internal": { - "indexes": {} - } -} \ No newline at end of file diff --git a/server/src/database/drizzle/meta/_journal.json b/server/src/database/drizzle/meta/_journal.json index 79ce7ef..d29f6d1 100644 --- a/server/src/database/drizzle/meta/_journal.json +++ b/server/src/database/drizzle/meta/_journal.json @@ -5,15 +5,8 @@ { "idx": 0, "version": "6", - "when": 1757149051180, - "tag": "0000_thankful_toad", - "breakpoints": true - }, - { - "idx": 1, - "version": "6", - "when": 1779301867292, - "tag": "0001_common_steve_rogers", + "when": 1779394160491, + "tag": "0000_youthful_zaran", "breakpoints": true } ] diff --git a/server/src/index.ts b/server/src/index.ts index 85a4c32..7ef78c8 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -2,15 +2,20 @@ import { Hono } from "hono"; import orderRouter from "./routes/order"; import uploadRouter from "./routes/file"; import eventRouter from "./routes/event"; +import webhookRouter from "./routes/webhook"; const app = new Hono(); app.route("/order", orderRouter); app.route("/file", uploadRouter); app.route("/event", eventRouter); +app.route("/webhook", webhookRouter); app.get("/", async (c) => { return c.text("server up"); }); -export default app; +export default { + fetch: app.fetch, + idleTimeout: 0, +}; diff --git a/server/src/routes/webhook.ts b/server/src/routes/webhook.ts index 15565cf..86fb5b5 100644 --- a/server/src/routes/webhook.ts +++ b/server/src/routes/webhook.ts @@ -8,7 +8,8 @@ import { orders } from "../database/schema.js"; const app = new Hono(); -app.get(`/${process.env.WEBHOOK_SECRET || "webhook"}`, async (c) => { +app.post(`/${process.env.WEBHOOK_SECRET || "webhook"}`, async (c) => { + console.log("got webhook"); const body: WEBHOOK_DATA = await c.req.json(); if (body.type !== WEBHOOK_TYPE.SUCCESS) @@ -25,7 +26,7 @@ app.get(`/${process.env.WEBHOOK_SECRET || "webhook"}`, async (c) => { if (!order) return c.text("error: invalid order"); - orderChannel.broadcast(order.files); + orderChannel.broadcast(order.files[0]); return c.text("ok: done with payment"); }); From c5eea7aa6bb45dbb98c97ed4805552b60dd8a131 Mon Sep 17 00:00:00 2001 From: aditya Date: Mon, 25 May 2026 00:37:26 +0530 Subject: [PATCH 3/4] add razorpay --- server/src/routes/file.ts | 4 ++++ server/src/routes/order.ts | 16 ++++++++++------ server/src/routes/webhook.ts | 18 +++++++++++++----- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/server/src/routes/file.ts b/server/src/routes/file.ts index eaac5c6..f5b0ac2 100644 --- a/server/src/routes/file.ts +++ b/server/src/routes/file.ts @@ -12,6 +12,8 @@ const app = new Hono(); const sui = new shortUniqueId({ dictionary: "alpha_lower", length: 10 }); app.post("/create", async (c) => { + console.log("file"); + const { file } = await c.req.parseBody(); if (!(file instanceof File)) return c.text("not a file", 200); @@ -41,6 +43,8 @@ app.post("/create", async (c) => { pages: pdf.getPageCount(), }); + // pdf.flush(); + return c.json({ fileId }); }); diff --git a/server/src/routes/order.ts b/server/src/routes/order.ts index e64837b..5046b99 100644 --- a/server/src/routes/order.ts +++ b/server/src/routes/order.ts @@ -4,7 +4,7 @@ import { z } from "zod"; import database from "../database/index"; import { metadata, orders, files } from "../database/schema"; import { eq } from "drizzle-orm"; -// import { razorpay } from "../services/razorpay"; +import { razorpay } from "../services/razorpay"; import { OAuth2Client } from "google-auth-library"; import { orderChannel } from "../channels/orderChannel"; import { authMiddleware } from "../middlewares/auth"; @@ -19,6 +19,7 @@ app.post( // authMiddleware, zValidator("json", z.array(PrintConfig)), async (c) => { + console.log("order"); const file = c.req.valid("json")[0]; const metadataResponse = await database.query.metadata.findFirst({ @@ -31,17 +32,20 @@ app.post( const amount = metadataResponse.pages * 2; - const payment = await upiGateway.createRequest({ - amount: amount.toFixed(2), + const rp = await razorpay.orders.create({ + amount: amount * 100, + currency: "INR", + method: "upi", + receipt: "print #1", }); - const order = await database.transaction(async (tx) => { + await database.transaction(async (tx) => { const [order] = await tx .insert(orders) .values({ amount, email: "adityadav1809@gmail.com", - paymentRequestId: payment.id, + paymentRequestId: rp.id, }) .returning({ id: orders.id, amount: orders.amount }); @@ -53,7 +57,7 @@ app.post( return order; }); - return c.json({ order, payment }); + return c.json(rp); }, ); diff --git a/server/src/routes/webhook.ts b/server/src/routes/webhook.ts index 86fb5b5..a24cfe7 100644 --- a/server/src/routes/webhook.ts +++ b/server/src/routes/webhook.ts @@ -4,26 +4,34 @@ import { orderChannel } from "../channels/orderChannel.js"; import { WEBHOOK_DATA, WEBHOOK_TYPE } from "../types/index.js"; import database from "../database"; import { eq } from "drizzle-orm"; +// import { type } from "razorpay"; import { orders } from "../database/schema.js"; const app = new Hono(); app.post(`/${process.env.WEBHOOK_SECRET || "webhook"}`, async (c) => { console.log("got webhook"); - const body: WEBHOOK_DATA = await c.req.json(); + let payload = await c.req.json(); - if (body.type !== WEBHOOK_TYPE.SUCCESS) - return c.text("error: payment failed"); + if (payload.event != "order.paid") return c.text("ok: done with payment"); - // todo: update database + let id = payload.payload.order.entity.id; + console.dir(payload, { depth: 100 }); + + // if (body.type !== WEBHOOK_TYPE.SUCCESS) + // return c.text("error: payment failed"); + + // // todo: update database const order = await database.query.orders.findFirst({ - where: eq(orders.paymentRequestId, body.requestId), + where: eq(orders.paymentRequestId, id), with: { files: true, }, }); + console.log(order); + if (!order) return c.text("error: invalid order"); orderChannel.broadcast(order.files[0]); From f7f8a7b239f0de7600f7640b99cd2eb95c5f1cd4 Mon Sep 17 00:00:00 2001 From: aditya Date: Mon, 25 May 2026 11:29:21 +0530 Subject: [PATCH 4/4] cleanup for razorpay --- server/bun.lock | 18 ------------------ server/package.json | 2 -- server/src/routes/file.ts | 4 ---- server/src/routes/order.ts | 3 --- server/src/routes/webhook.ts | 10 ++-------- server/src/services/upigateway.ts | 5 ----- server/src/types/index.ts | 14 -------------- 7 files changed, 2 insertions(+), 54 deletions(-) delete mode 100644 server/src/services/upigateway.ts diff --git a/server/bun.lock b/server/bun.lock index 7e19404..1f31dfc 100644 --- a/server/bun.lock +++ b/server/bun.lock @@ -6,7 +6,6 @@ "name": "server", "dependencies": { "@aws-sdk/client-s3": "^3.1051.0", - "@aws-sdk/s3-request-presigner": "^3.1051.0", "@hono/zod-validator": "^0.8.0", "@libsql/client": "^0.17.3", "better-sse": "^0.16.1", @@ -17,7 +16,6 @@ "pdf-lib": "^1.17.1", "razorpay": "^2.9.6", "short-unique-id": "^5.3.2", - "upigateway": "^1.0.4", "zod": "^4.4.3", }, "devDependencies": { @@ -79,8 +77,6 @@ "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.997.10", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "^3.974.12", "@aws-sdk/signature-v4-multi-region": "^3.996.27", "@aws-sdk/types": "^3.973.8", "@smithy/core": "^3.24.2", "@smithy/fetch-http-handler": "^5.4.2", "@smithy/node-http-handler": "^4.7.2", "@smithy/types": "^4.14.1", "tslib": "^2.6.2" } }, "sha512-FtQ/Bt327peZJuyo4WZSOLVUTw9ujRxntepiC7L65FxA2P82Xlq0g14T22BuqBUeMjDoxa9nvwiMHjLIfP3eUg=="], - "@aws-sdk/s3-request-presigner": ["@aws-sdk/s3-request-presigner@3.1051.0", "", { "dependencies": { "@aws-sdk/core": "^3.974.12", "@aws-sdk/signature-v4-multi-region": "^3.996.27", "@aws-sdk/types": "^3.973.8", "@smithy/core": "^3.24.2", "@smithy/types": "^4.14.1", "tslib": "^2.6.2" } }, "sha512-9ZULJHf5IAObmqtg2XhiufMmgEl+aM9jlRog2V9qbICeSOgDCHekmlRxF9FuqZKMqrpLzGtJPDbd8gGAHJZv/A=="], - "@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.996.27", "", { "dependencies": { "@aws-sdk/types": "^3.973.8", "@smithy/core": "^3.24.2", "@smithy/signature-v4": "^5.4.2", "@smithy/types": "^4.14.1", "tslib": "^2.6.2" } }, "sha512-0Phbz4t6HI3D3skxvG2uI+VWU034/nSIw1T8d+FPzzQG9EQTrw94o9mOKO2Gv3n3Oc8P7JD7RAUxkoneLWv5Eg=="], "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.1049.0", "", { "dependencies": { "@aws-sdk/core": "^3.974.12", "@aws-sdk/nested-clients": "^3.997.10", "@aws-sdk/types": "^3.973.8", "@smithy/core": "^3.24.2", "@smithy/types": "^4.14.1", "tslib": "^2.6.2" } }, "sha512-r7+d0lQMTHKypkmaF5jRTBYLYHCUHzt3gaVoN9SidLhQeWhCmHk3AKrboDTpPF5b7Pt7vKu3+oeMjznM2Eu1ow=="], @@ -469,8 +465,6 @@ "unenv": ["unenv@2.0.0-rc.24", "", { "dependencies": { "pathe": "^2.0.3" } }, "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw=="], - "upigateway": ["upigateway@1.0.4", "", { "dependencies": { "axios": "^1.15.2" } }, "sha512-Cn4KOK4GosXICB4w9oBHKws4HXCkqzNuvs5taNzZftDGO2UHZN5E2DrL3rNbpzcjtD2KbERFCEqv7A8z+VQGOA=="], - "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], "workerd": ["workerd@1.20260520.1", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20260520.1", "@cloudflare/workerd-darwin-arm64": "1.20260520.1", "@cloudflare/workerd-linux-64": "1.20260520.1", "@cloudflare/workerd-linux-arm64": "1.20260520.1", "@cloudflare/workerd-windows-64": "1.20260520.1" }, "bin": { "workerd": "bin/workerd" } }, "sha512-mwW6H/NEKObeBVd0qkq91EGyOIC3TaNJBxp7kj5uChif/+qYD7nM5HE8ZYruwvEd15pRwUet+V8r21DCXCGDQQ=="], @@ -499,8 +493,6 @@ "tsx/esbuild": ["esbuild@0.28.0", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.0", "@esbuild/android-arm": "0.28.0", "@esbuild/android-arm64": "0.28.0", "@esbuild/android-x64": "0.28.0", "@esbuild/darwin-arm64": "0.28.0", "@esbuild/darwin-x64": "0.28.0", "@esbuild/freebsd-arm64": "0.28.0", "@esbuild/freebsd-x64": "0.28.0", "@esbuild/linux-arm": "0.28.0", "@esbuild/linux-arm64": "0.28.0", "@esbuild/linux-ia32": "0.28.0", "@esbuild/linux-loong64": "0.28.0", "@esbuild/linux-mips64el": "0.28.0", "@esbuild/linux-ppc64": "0.28.0", "@esbuild/linux-riscv64": "0.28.0", "@esbuild/linux-s390x": "0.28.0", "@esbuild/linux-x64": "0.28.0", "@esbuild/netbsd-arm64": "0.28.0", "@esbuild/netbsd-x64": "0.28.0", "@esbuild/openbsd-arm64": "0.28.0", "@esbuild/openbsd-x64": "0.28.0", "@esbuild/openharmony-arm64": "0.28.0", "@esbuild/sunos-x64": "0.28.0", "@esbuild/win32-arm64": "0.28.0", "@esbuild/win32-ia32": "0.28.0", "@esbuild/win32-x64": "0.28.0" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw=="], - "upigateway/axios": ["axios@1.16.1", "", { "dependencies": { "follow-redirects": "^1.16.0", "form-data": "^4.0.5", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } }, "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A=="], - "wrangler/esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="], "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.18.20", "", { "os": "android", "cpu": "arm" }, "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw=="], @@ -601,14 +593,6 @@ "tsx/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.0", "", { "os": "win32", "cpu": "x64" }, "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw=="], - "upigateway/axios/follow-redirects": ["follow-redirects@1.16.0", "", {}, "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw=="], - - "upigateway/axios/form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], - - "upigateway/axios/https-proxy-agent": ["https-proxy-agent@5.0.1", "", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="], - - "upigateway/axios/proxy-from-env": ["proxy-from-env@2.1.0", "", {}, "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA=="], - "wrangler/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], "wrangler/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="], @@ -660,7 +644,5 @@ "wrangler/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q=="], "wrangler/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="], - - "upigateway/axios/https-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], } } diff --git a/server/package.json b/server/package.json index 289bc4c..113ebaf 100644 --- a/server/package.json +++ b/server/package.json @@ -6,7 +6,6 @@ }, "dependencies": { "@aws-sdk/client-s3": "^3.1051.0", - "@aws-sdk/s3-request-presigner": "^3.1051.0", "@hono/zod-validator": "^0.8.0", "@libsql/client": "^0.17.3", "better-sse": "^0.16.1", @@ -17,7 +16,6 @@ "pdf-lib": "^1.17.1", "razorpay": "^2.9.6", "short-unique-id": "^5.3.2", - "upigateway": "^1.0.4", "zod": "^4.4.3" }, "devDependencies": { diff --git a/server/src/routes/file.ts b/server/src/routes/file.ts index f5b0ac2..eaac5c6 100644 --- a/server/src/routes/file.ts +++ b/server/src/routes/file.ts @@ -12,8 +12,6 @@ const app = new Hono(); const sui = new shortUniqueId({ dictionary: "alpha_lower", length: 10 }); app.post("/create", async (c) => { - console.log("file"); - const { file } = await c.req.parseBody(); if (!(file instanceof File)) return c.text("not a file", 200); @@ -43,8 +41,6 @@ app.post("/create", async (c) => { pages: pdf.getPageCount(), }); - // pdf.flush(); - return c.json({ fileId }); }); diff --git a/server/src/routes/order.ts b/server/src/routes/order.ts index 5046b99..6e4257d 100644 --- a/server/src/routes/order.ts +++ b/server/src/routes/order.ts @@ -6,10 +6,8 @@ import { metadata, orders, files } from "../database/schema"; import { eq } from "drizzle-orm"; import { razorpay } from "../services/razorpay"; import { OAuth2Client } from "google-auth-library"; -import { orderChannel } from "../channels/orderChannel"; import { authMiddleware } from "../middlewares/auth"; import { PrintConfig } from "../types/index"; -import { upiGateway } from "../services/upigateway"; const app = new Hono(); const client = new OAuth2Client(); @@ -19,7 +17,6 @@ app.post( // authMiddleware, zValidator("json", z.array(PrintConfig)), async (c) => { - console.log("order"); const file = c.req.valid("json")[0]; const metadataResponse = await database.query.metadata.findFirst({ diff --git a/server/src/routes/webhook.ts b/server/src/routes/webhook.ts index a24cfe7..eb4a9c7 100644 --- a/server/src/routes/webhook.ts +++ b/server/src/routes/webhook.ts @@ -1,10 +1,7 @@ -import { createResponse } from "better-sse"; import { Hono } from "hono"; import { orderChannel } from "../channels/orderChannel.js"; -import { WEBHOOK_DATA, WEBHOOK_TYPE } from "../types/index.js"; import database from "../database"; import { eq } from "drizzle-orm"; -// import { type } from "razorpay"; import { orders } from "../database/schema.js"; const app = new Hono(); @@ -15,13 +12,12 @@ app.post(`/${process.env.WEBHOOK_SECRET || "webhook"}`, async (c) => { if (payload.event != "order.paid") return c.text("ok: done with payment"); - let id = payload.payload.order.entity.id; - console.dir(payload, { depth: 100 }); + const id = payload.payload.order.entity.id; // if (body.type !== WEBHOOK_TYPE.SUCCESS) // return c.text("error: payment failed"); - // // todo: update database + // // todo: update database & check key const order = await database.query.orders.findFirst({ where: eq(orders.paymentRequestId, id), @@ -30,8 +26,6 @@ app.post(`/${process.env.WEBHOOK_SECRET || "webhook"}`, async (c) => { }, }); - console.log(order); - if (!order) return c.text("error: invalid order"); orderChannel.broadcast(order.files[0]); diff --git a/server/src/services/upigateway.ts b/server/src/services/upigateway.ts deleted file mode 100644 index ae4c4db..0000000 --- a/server/src/services/upigateway.ts +++ /dev/null @@ -1,5 +0,0 @@ -import UpiGateway from "upigateway"; - -const upiGateway = new UpiGateway(process.env.UPI_GATEWAY_TOKEN!); - -export { upiGateway }; diff --git a/server/src/types/index.ts b/server/src/types/index.ts index de1d4c6..e065960 100644 --- a/server/src/types/index.ts +++ b/server/src/types/index.ts @@ -15,17 +15,3 @@ export const PrintConfig = z.object({ }); export type PrintConfigType = z.infer; - -export enum WEBHOOK_TYPE { - SUCCESS = "SUCCESS", // 1 - EXPIRED = "EXPIRED", // 2 - CANCELLED = "CANCELLED", // 3 -} - -export type WEBHOOK_DATA = { - type: WEBHOOK_TYPE; - webhookId: string; - requestId: string; - status: number; - timestamp: number; -};