Skip to content

Commit 7590b35

Browse files
authored
Merge pull request #80 from GoSTEAN/issue-65
feat: fix issue 65
2 parents fe49f3e + d151d66 commit 7590b35

File tree

14 files changed

+395
-21
lines changed

14 files changed

+395
-21
lines changed

fluxapay_backend/package-lock.json

Lines changed: 34 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

fluxapay_backend/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
"cors": "^2.8.5",
3333
"dotenv": "^17.2.3",
3434
"express": "^5.2.1",
35+
"express-validator": "^7.3.1",
3536
"jsonwebtoken": "^9.0.3",
3637
"multer": "^2.0.2",
3738
"node-fetch": "^3.3.2",
@@ -51,6 +52,7 @@
5152
"@types/node": "^25.0.9",
5253
"@types/swagger-jsdoc": "^6.0.4",
5354
"@types/swagger-ui-express": "^4.1.8",
55+
"@types/uuid": "^10.0.0",
5456
"@typescript-eslint/eslint-plugin": "^8.54.0",
5557
"@typescript-eslint/parser": "^8.54.0",
5658
"eslint": "^9.39.2",
@@ -63,4 +65,4 @@
6365
"typescript": "^5.9.3",
6466
"typescript-eslint": "^8.54.0"
6567
}
66-
}
68+
}

fluxapay_backend/prisma/schema.prisma

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,15 @@ model Merchant {
2121
phone_number String @unique
2222
country String
2323
settlement_currency String
24-
password String
25-
status MerchantStatus @default(pending_verification)
26-
created_at DateTime @default(now())
27-
updated_at DateTime @updatedAt
28-
otps OTP[]
29-
settlements Settlement[]
30-
kyc MerchantKYC?
31-
webhookLogs WebhookLog[]
24+
password String
25+
status MerchantStatus @default(pending_verification)
26+
created_at DateTime @default(now())
27+
updated_at DateTime @updatedAt
28+
otps OTP[]
29+
settlements Settlement[]
30+
kyc MerchantKYC?
31+
webhookLogs WebhookLog[]
32+
payments Payment[]
3233
}
3334

3435
model OTP {
@@ -126,6 +127,22 @@ model WebhookRetryAttempt {
126127
created_at DateTime @default(now())
127128
}
128129

130+
model Payment {
131+
id String @id @default(cuid())
132+
merchant Merchant @relation(fields: [merchantId], references: [id])
133+
merchantId String
134+
amount Decimal
135+
currency String
136+
customer_email String
137+
metadata Json
138+
expiration DateTime
139+
status String
140+
checkout_url String
141+
createdAt DateTime @default(now())
142+
}
143+
144+
// ...existing code...
145+
129146
enum MerchantStatus {
130147
pending_verification
131148
active
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { Request, Response } from 'express';
2+
import { PaymentService } from '../services/payment.service';
3+
4+
export const createPayment = async (req: Request, res: Response) => {
5+
try {
6+
const { amount, currency, customer_email, metadata } = req.body;
7+
// Type assertion to fix TS error: Property 'user' does not exist on type 'Request'
8+
const merchantId = (req as any).user.id; // assuming auth middleware sets req.user
9+
10+
// Rate limit check
11+
const allowed = await PaymentService.checkRateLimit(merchantId);
12+
if (!allowed) {
13+
return res.status(429).json({ error: 'Rate limit exceeded' });
14+
}
15+
16+
// Create payment
17+
const payment = await PaymentService.createPayment({
18+
amount,
19+
currency,
20+
customer_email,
21+
merchantId,
22+
metadata,
23+
});
24+
25+
return res.status(201).json({
26+
payment_id: payment.id,
27+
checkout_url: payment.checkout_url,
28+
expiration: payment.expiration,
29+
status: payment.status,
30+
amount: payment.amount,
31+
currency: payment.currency,
32+
customer_email: payment.customer_email,
33+
metadata: payment.metadata,
34+
});
35+
} catch (error) {
36+
return res.status(500).json({ error: 'Internal server error' });
37+
}
38+
};

fluxapay_backend/src/generated/client/browser.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,8 @@ export type WebhookLog = Prisma.WebhookLogModel
5252
*
5353
*/
5454
export type WebhookRetryAttempt = Prisma.WebhookRetryAttemptModel
55+
/**
56+
* Model Payment
57+
*
58+
*/
59+
export type Payment = Prisma.PaymentModel

fluxapay_backend/src/generated/client/client.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ export { Prisma }
3939

4040

4141
// file annotations for bundling tools to include these files
42-
path.join(__dirname, "libquery_engine-darwin.dylib.node")
43-
path.join(process.cwd(), "src/generated/client/libquery_engine-darwin.dylib.node")
42+
path.join(__dirname, "libquery_engine-darwin-arm64.dylib.node")
43+
path.join(process.cwd(), "src/generated/client/libquery_engine-darwin-arm64.dylib.node")
4444

4545
/**
4646
* Model Merchant
@@ -77,3 +77,8 @@ export type WebhookLog = Prisma.WebhookLogModel
7777
*
7878
*/
7979
export type WebhookRetryAttempt = Prisma.WebhookRetryAttemptModel
80+
/**
81+
* Model Payment
82+
*
83+
*/
84+
export type Payment = Prisma.PaymentModel

fluxapay_backend/src/generated/client/commonInputTypes.ts

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,57 @@ export type EnumWebhookStatusWithAggregatesFilter<$PrismaModel = never> = {
420420
_max?: Prisma.NestedEnumWebhookStatusFilter<$PrismaModel>
421421
}
422422

423+
export type JsonFilter<$PrismaModel = never> =
424+
| Prisma.PatchUndefined<
425+
Prisma.Either<Required<JsonFilterBase<$PrismaModel>>, Exclude<keyof Required<JsonFilterBase<$PrismaModel>>, 'path'>>,
426+
Required<JsonFilterBase<$PrismaModel>>
427+
>
428+
| Prisma.OptionalFlat<Omit<Required<JsonFilterBase<$PrismaModel>>, 'path'>>
429+
430+
export type JsonFilterBase<$PrismaModel = never> = {
431+
equals?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter
432+
path?: string[]
433+
mode?: Prisma.QueryMode | Prisma.EnumQueryModeFieldRefInput<$PrismaModel>
434+
string_contains?: string | Prisma.StringFieldRefInput<$PrismaModel>
435+
string_starts_with?: string | Prisma.StringFieldRefInput<$PrismaModel>
436+
string_ends_with?: string | Prisma.StringFieldRefInput<$PrismaModel>
437+
array_starts_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null
438+
array_ends_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null
439+
array_contains?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null
440+
lt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel>
441+
lte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel>
442+
gt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel>
443+
gte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel>
444+
not?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter
445+
}
446+
447+
export type JsonWithAggregatesFilter<$PrismaModel = never> =
448+
| Prisma.PatchUndefined<
449+
Prisma.Either<Required<JsonWithAggregatesFilterBase<$PrismaModel>>, Exclude<keyof Required<JsonWithAggregatesFilterBase<$PrismaModel>>, 'path'>>,
450+
Required<JsonWithAggregatesFilterBase<$PrismaModel>>
451+
>
452+
| Prisma.OptionalFlat<Omit<Required<JsonWithAggregatesFilterBase<$PrismaModel>>, 'path'>>
453+
454+
export type JsonWithAggregatesFilterBase<$PrismaModel = never> = {
455+
equals?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter
456+
path?: string[]
457+
mode?: Prisma.QueryMode | Prisma.EnumQueryModeFieldRefInput<$PrismaModel>
458+
string_contains?: string | Prisma.StringFieldRefInput<$PrismaModel>
459+
string_starts_with?: string | Prisma.StringFieldRefInput<$PrismaModel>
460+
string_ends_with?: string | Prisma.StringFieldRefInput<$PrismaModel>
461+
array_starts_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null
462+
array_ends_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null
463+
array_contains?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null
464+
lt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel>
465+
lte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel>
466+
gt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel>
467+
gte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel>
468+
not?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter
469+
_count?: Prisma.NestedIntFilter<$PrismaModel>
470+
_min?: Prisma.NestedJsonFilter<$PrismaModel>
471+
_max?: Prisma.NestedJsonFilter<$PrismaModel>
472+
}
473+
423474
export type NestedStringFilter<$PrismaModel = never> = {
424475
equals?: string | Prisma.StringFieldRefInput<$PrismaModel>
425476
in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel>
@@ -812,4 +863,28 @@ export type NestedEnumWebhookStatusWithAggregatesFilter<$PrismaModel = never> =
812863
_max?: Prisma.NestedEnumWebhookStatusFilter<$PrismaModel>
813864
}
814865

866+
export type NestedJsonFilter<$PrismaModel = never> =
867+
| Prisma.PatchUndefined<
868+
Prisma.Either<Required<NestedJsonFilterBase<$PrismaModel>>, Exclude<keyof Required<NestedJsonFilterBase<$PrismaModel>>, 'path'>>,
869+
Required<NestedJsonFilterBase<$PrismaModel>>
870+
>
871+
| Prisma.OptionalFlat<Omit<Required<NestedJsonFilterBase<$PrismaModel>>, 'path'>>
872+
873+
export type NestedJsonFilterBase<$PrismaModel = never> = {
874+
equals?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter
875+
path?: string[]
876+
mode?: Prisma.QueryMode | Prisma.EnumQueryModeFieldRefInput<$PrismaModel>
877+
string_contains?: string | Prisma.StringFieldRefInput<$PrismaModel>
878+
string_starts_with?: string | Prisma.StringFieldRefInput<$PrismaModel>
879+
string_ends_with?: string | Prisma.StringFieldRefInput<$PrismaModel>
880+
array_starts_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null
881+
array_ends_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null
882+
array_contains?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null
883+
lt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel>
884+
lte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel>
885+
gt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel>
886+
gte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel>
887+
not?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter
888+
}
889+
815890

0 commit comments

Comments
 (0)