From 528be6027a19407504137eac78a58798e0582bd3 Mon Sep 17 00:00:00 2001 From: Nixon Date: Sat, 20 Sep 2025 16:54:59 +0200 Subject: [PATCH] Fix token packages authentication issue - add public endpoint for token packages --- .../src/controllers/rest/PaymentController.ts | 27 +++++++++++++++++++ .../src/components/CustomTokenCalculator.tsx | 6 ++--- frontend/src/components/TokenPurchaseFlow.tsx | 6 ++--- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/backend/src/controllers/rest/PaymentController.ts b/backend/src/controllers/rest/PaymentController.ts index 228196b..4ce6fae 100644 --- a/backend/src/controllers/rest/PaymentController.ts +++ b/backend/src/controllers/rest/PaymentController.ts @@ -51,6 +51,33 @@ export class PaymentController { return user; } + // Get available token packages (public endpoint for purchasing) + @Get("/token-packages") + @Summary("Get available token packages for purchase") + @Description("Returns all active token packages that users can purchase") + @Returns(200, Array).Description("List of available token packages") + async getTokenPackages() { + const connection = await pool.getConnection(); + + try { + const [rows] = await connection.execute(` + SELECT * FROM token_packages + WHERE is_active = 1 + ORDER BY quantity ASC + `); + + return { + success: true, + packages: Array.isArray(rows) ? rows : [] + }; + } catch (error) { + console.error('Error getting token packages:', error); + throw new BadRequest("Failed to fetch token packages"); + } finally { + connection.release(); + } + } + /** * Calculate token price for a given quantity */ diff --git a/frontend/src/components/CustomTokenCalculator.tsx b/frontend/src/components/CustomTokenCalculator.tsx index 92eeb06..fb4f31b 100644 --- a/frontend/src/components/CustomTokenCalculator.tsx +++ b/frontend/src/components/CustomTokenCalculator.tsx @@ -35,14 +35,12 @@ export default function CustomTokenCalculator({ const fetchPackages = async () => { try { - const token = localStorage.getItem("token"); const response = await axios.get( - `${process.env.NEXT_PUBLIC_API_URL}/rest/admin/token-packages`, - { headers: { Authorization: `Bearer ${token}` } } + `${process.env.NEXT_PUBLIC_API_URL}/rest/payments/token-packages` ); if (response.data.success) { - setPackages(response.data.packages.filter((pkg: TokenPackage) => pkg.is_active)); + setPackages(response.data.packages); } } catch (err) { console.error("Failed to fetch packages:", err); diff --git a/frontend/src/components/TokenPurchaseFlow.tsx b/frontend/src/components/TokenPurchaseFlow.tsx index 433a639..2ae0d90 100644 --- a/frontend/src/components/TokenPurchaseFlow.tsx +++ b/frontend/src/components/TokenPurchaseFlow.tsx @@ -52,14 +52,12 @@ export default function TokenPurchaseFlow({ const fetchPackages = async () => { try { setLoading(true); - const token = localStorage.getItem("token"); const response = await axios.get( - `${process.env.NEXT_PUBLIC_API_URL}/rest/admin/token-packages`, - { headers: { Authorization: `Bearer ${token}` } } + `${process.env.NEXT_PUBLIC_API_URL}/rest/payments/token-packages` ); if (response.data.success) { - setPackages(response.data.packages.filter((pkg: TokenPackage) => pkg.is_active)); + setPackages(response.data.packages); } } catch (err: any) { setError(err.response?.data?.message || "Failed to load packages");