From 19fff3a92f1033aae1d8afd95434a0e84ef9be07 Mon Sep 17 00:00:00 2001 From: andwati Date: Sun, 14 Jun 2026 13:19:39 +0300 Subject: [PATCH] paystack --- .env.example | 24 + .idea/gradle.xml | 1 + DEPLOYMENT.md | 55 + README.md | 38 +- compose.yml | 74 + orders-backend/.env.example | 8 +- .../orders/OrdersBackendApplication.java | 4 +- .../orders/config/PaystackProperties.java | 32 + .../andwati/orders/config/SecurityConfig.java | 4 + .../orders/controller/CheckoutController.java | 30 + .../controller/PaystackPaymentController.java | 51 + .../dto/request/CheckoutQuoteRequest.java | 16 + .../request/PaystackInitializeRequest.java | 19 + .../dto/response/CheckoutQuoteResponse.java | 13 + .../response/PaystackInitializeResponse.java | 18 + .../dto/response/PaystackVerifyResponse.java | 17 + .../com/andwati/orders/model/Payment.java | 250 ++ .../andwati/orders/model/PaymentStatus.java | 9 + .../orders/repository/PaymentRepository.java | 14 + .../andwati/orders/services/OrderService.java | 19 +- .../orders/services/PaymentService.java | 412 ++ .../orders/services/PaystackClient.java | 80 + .../orders/services/PendingOrderResult.java | 7 + .../src/main/resources/application.properties | 6 + orders-frontend/.vscode/settings.json | 66 +- orders-frontend/Dockerfile | 4 +- orders-frontend/biome.json | 3 +- orders-frontend/src/api/auth.ts | 26 +- orders-frontend/src/api/client.ts | 140 +- orders-frontend/src/api/fare.ts | 30 +- orders-frontend/src/api/inventory.ts | 34 +- orders-frontend/src/api/orders.ts | 81 +- orders-frontend/src/api/payments.ts | 38 + orders-frontend/src/api/products.ts | 26 +- orders-frontend/src/api/rides.ts | 28 +- orders-frontend/src/api/users.ts | 28 +- .../src/components/app-sidebar.tsx | 377 +- .../src/components/app/AppShell.tsx | 145 +- .../src/components/app/WorkspacePages.tsx | 3333 ++++++++++------- .../src/components/chart-area-interactive.tsx | 554 ++- .../src/components/dashboard/Dashboard.tsx | 1241 +++--- orders-frontend/src/components/data-table.tsx | 1525 ++++---- orders-frontend/src/components/login-form.tsx | 186 +- .../src/components/nav-documents.tsx | 162 +- orders-frontend/src/components/nav-main.tsx | 276 +- .../src/components/nav-projects.tsx | 136 +- .../src/components/nav-secondary.tsx | 68 +- orders-frontend/src/components/nav-user.tsx | 198 +- .../src/components/section-cards.tsx | 194 +- .../src/components/signup-form.tsx | 260 +- .../src/components/site-header.tsx | 80 +- .../src/components/store/AuthDialog.tsx | 223 +- .../src/components/store/ProductCard.tsx | 139 +- .../src/components/store/ProductGrid.tsx | 56 +- .../src/components/store/QuantityStepper.tsx | 102 +- .../src/components/store/SiteHeader.tsx | 109 +- .../src/components/store/StoreHome.tsx | 116 +- .../src/components/team-switcher.tsx | 140 +- .../src/components/theme-provider.tsx | 24 +- .../src/components/theme-toggle.tsx | 64 +- .../src/components/ui/EmptyState.tsx | 20 +- .../src/components/ui/ErrorState.tsx | 46 +- .../src/components/ui/LoadingState.tsx | 35 +- orders-frontend/src/components/ui/avatar.tsx | 164 +- orders-frontend/src/components/ui/badge.tsx | 78 +- .../src/components/ui/breadcrumb.tsx | 158 +- orders-frontend/src/components/ui/button.tsx | 110 +- orders-frontend/src/components/ui/card.tsx | 136 +- orders-frontend/src/components/ui/chart.tsx | 620 ++- .../src/components/ui/checkbox.tsx | 48 +- .../src/components/ui/collapsible.tsx | 38 +- orders-frontend/src/components/ui/dialog.tsx | 227 +- orders-frontend/src/components/ui/drawer.tsx | 184 +- .../src/components/ui/dropdown-menu.tsx | 378 +- orders-frontend/src/components/ui/field.tsx | 398 +- orders-frontend/src/components/ui/input.tsx | 32 +- orders-frontend/src/components/ui/label.tsx | 32 +- orders-frontend/src/components/ui/select.tsx | 288 +- .../src/components/ui/separator.tsx | 42 +- orders-frontend/src/components/ui/sheet.tsx | 202 +- orders-frontend/src/components/ui/sidebar.tsx | 1222 +++--- .../src/components/ui/skeleton.tsx | 18 +- orders-frontend/src/components/ui/sonner.tsx | 66 +- .../src/components/ui/status-badge.tsx | 79 +- orders-frontend/src/components/ui/table.tsx | 172 +- orders-frontend/src/components/ui/tabs.tsx | 140 +- .../src/components/ui/toggle-group.tsx | 137 +- orders-frontend/src/components/ui/toggle.tsx | 76 +- orders-frontend/src/components/ui/tooltip.tsx | 74 +- orders-frontend/src/hooks/formatCurrency.ts | 12 +- orders-frontend/src/hooks/formatDate.ts | 16 +- orders-frontend/src/hooks/use-mobile.ts | 28 +- orders-frontend/src/hooks/useAuth.tsx | 158 +- orders-frontend/src/hooks/useCart.tsx | 201 +- .../src/hooks/useFareCalculation.ts | 18 +- orders-frontend/src/hooks/useInventory.ts | 30 +- orders-frontend/src/hooks/useOrders.ts | 103 +- orders-frontend/src/hooks/usePayments.ts | 61 + orders-frontend/src/hooks/useProducts.ts | 67 +- orders-frontend/src/hooks/useRides.ts | 83 +- orders-frontend/src/hooks/useUsers.ts | 79 +- orders-frontend/src/lib/auth-navigation.ts | 8 +- orders-frontend/src/lib/queryClient.ts | 28 +- orders-frontend/src/lib/utils.ts | 8 +- orders-frontend/src/routeTree.gen.ts | 22 + orders-frontend/src/router.tsx | 10 +- orders-frontend/src/routes/__root.tsx | 59 +- .../src/routes/admin.customers.tsx | 6 +- orders-frontend/src/routes/admin.drivers.tsx | 6 +- orders-frontend/src/routes/admin.index.tsx | 6 +- .../src/routes/admin.inventory.tsx | 6 +- .../src/routes/admin.orders.index.tsx | 6 +- .../src/routes/admin.orders.pending.tsx | 6 +- orders-frontend/src/routes/admin.orders.tsx | 4 +- .../src/routes/admin.products.index.tsx | 6 +- .../src/routes/admin.products.new.tsx | 6 +- orders-frontend/src/routes/admin.products.tsx | 4 +- .../src/routes/admin.rides.accepted.tsx | 6 +- .../src/routes/admin.rides.index.tsx | 6 +- .../src/routes/admin.rides.requested.tsx | 6 +- orders-frontend/src/routes/admin.rides.tsx | 4 +- orders-frontend/src/routes/admin.tsx | 4 +- orders-frontend/src/routes/admin.users.tsx | 6 +- orders-frontend/src/routes/cart.tsx | 613 +-- .../src/routes/driver.rides.accepted.tsx | 6 +- .../src/routes/driver.rides.completed.tsx | 6 +- .../src/routes/driver.rides.index.tsx | 6 +- .../src/routes/driver.rides.requested.tsx | 6 +- orders-frontend/src/routes/driver.rides.tsx | 4 +- orders-frontend/src/routes/index.tsx | 36 +- orders-frontend/src/routes/orders.index.tsx | 6 +- orders-frontend/src/routes/orders.status.tsx | 6 +- orders-frontend/src/routes/orders.tsx | 4 +- .../src/routes/payments.paystack.callback.tsx | 136 + .../src/routes/products.$productId.tsx | 278 +- .../src/routes/products.featured.tsx | 6 +- orders-frontend/src/routes/products.index.tsx | 6 +- orders-frontend/src/routes/products.tsx | 4 +- orders-frontend/src/routes/rides.index.tsx | 6 +- orders-frontend/src/routes/rides.new.tsx | 6 +- orders-frontend/src/routes/rides.tsx | 4 +- orders-frontend/src/types/api.ts | 22 +- orders-frontend/src/types/auth.ts | 14 +- orders-frontend/src/types/fare.ts | 18 +- orders-frontend/src/types/inventory.ts | 24 +- orders-frontend/src/types/order.ts | 78 +- orders-frontend/src/types/payment.ts | 34 + orders-frontend/src/types/product.ts | 32 +- orders-frontend/src/types/ride.ts | 40 +- orders-frontend/src/types/user.ts | 24 +- orders-frontend/vite.config.ts | 39 +- render.yaml | 8 + 152 files changed, 10908 insertions(+), 8276 deletions(-) create mode 100644 .env.example create mode 100644 DEPLOYMENT.md create mode 100644 compose.yml create mode 100644 orders-backend/src/main/java/com/andwati/orders/config/PaystackProperties.java create mode 100644 orders-backend/src/main/java/com/andwati/orders/controller/CheckoutController.java create mode 100644 orders-backend/src/main/java/com/andwati/orders/controller/PaystackPaymentController.java create mode 100644 orders-backend/src/main/java/com/andwati/orders/dto/request/CheckoutQuoteRequest.java create mode 100644 orders-backend/src/main/java/com/andwati/orders/dto/request/PaystackInitializeRequest.java create mode 100644 orders-backend/src/main/java/com/andwati/orders/dto/response/CheckoutQuoteResponse.java create mode 100644 orders-backend/src/main/java/com/andwati/orders/dto/response/PaystackInitializeResponse.java create mode 100644 orders-backend/src/main/java/com/andwati/orders/dto/response/PaystackVerifyResponse.java create mode 100644 orders-backend/src/main/java/com/andwati/orders/model/Payment.java create mode 100644 orders-backend/src/main/java/com/andwati/orders/model/PaymentStatus.java create mode 100644 orders-backend/src/main/java/com/andwati/orders/repository/PaymentRepository.java create mode 100644 orders-backend/src/main/java/com/andwati/orders/services/PaymentService.java create mode 100644 orders-backend/src/main/java/com/andwati/orders/services/PaystackClient.java create mode 100644 orders-backend/src/main/java/com/andwati/orders/services/PendingOrderResult.java create mode 100644 orders-frontend/src/api/payments.ts create mode 100644 orders-frontend/src/hooks/usePayments.ts create mode 100644 orders-frontend/src/routes/payments.paystack.callback.tsx create mode 100644 orders-frontend/src/types/payment.ts diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..921d2a4 --- /dev/null +++ b/.env.example @@ -0,0 +1,24 @@ +POSTGRES_DB=cymelle +POSTGRES_USER=cymelle +POSTGRES_PASSWORD=cymelle +POSTGRES_PORT=5432 + +API_PORT=8080 +WEB_PORT=3000 +VITE_API_BASE_URL=http://localhost:8080/api +APP_CORS_ALLOWED_ORIGINS=http://localhost:3000 +SEED_DATA=true + +LOW_STOCK_THRESHOLD=10 + +FARE_BASE_FARE=100.00 +FARE_PER_KM_RATE=50.00 +FARE_MINIMUM_FARE=150.00 +FARE_DEFAULT_SURGE_MULTIPLIER=1.0 +FARE_CURRENCY=KES + +PAYSTACK_SECRET_KEY= +PAYSTACK_PUBLIC_KEY= +PAYSTACK_CALLBACK_URL=http://localhost:3000/payments/paystack/callback +PAYSTACK_WEBHOOK_SECRET= +PAYSTACK_API_BASE_URL=https://api.paystack.co diff --git a/.idea/gradle.xml b/.idea/gradle.xml index d690f0f..b6e414a 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,5 +1,6 @@ +