From 9296822e72b350a9ed9672430cfa960b05893dbf Mon Sep 17 00:00:00 2001 From: Afaq Karim <51118245+afaq-karim@users.noreply.github.com> Date: Tue, 5 Dec 2023 17:21:48 +0500 Subject: [PATCH 1/5] feat: Created transaction API's Co-Authored-By: Afaq Karim <51118245+afaq-karim@users.noreply.github.com> --- src/utils/middlewares.ts | 4 +- src/v1/routes.ts | 67 +++++++------- src/v1/transaction.ts | 153 +++++++++++++++++++++++++++++-- src/v1/transaction.validation.ts | 42 +++++++++ src/v1/user.ts | 6 +- 5 files changed, 230 insertions(+), 42 deletions(-) create mode 100644 src/v1/transaction.validation.ts diff --git a/src/utils/middlewares.ts b/src/utils/middlewares.ts index d3c9f21..5637362 100644 --- a/src/utils/middlewares.ts +++ b/src/utils/middlewares.ts @@ -21,7 +21,7 @@ export const validateYupSchemaAgainstAnObject = async function (schema: any, obj export const middlewareValidateYupSchemaAgainstReqBody = function (schema: any) { return async function (req: any, res: any, next: any) { - let validate = await validateYupSchemaAgainstAnObject(schema, req.body.input); + let validate = await validateYupSchemaAgainstAnObject(schema, req.body); if (validate.length > 0) { return res.status(400).json({ message: "Validation Error", @@ -36,7 +36,7 @@ export const validateUserExistsSentThroughReqBody = function (path: any) { return async function (req: any, res: any, next: any) { let user = await prisma.user.findUnique({ where: { - id: get(req, path, null), + id: parseInt(get(req, path, null)), }, }); if (user === null) { diff --git a/src/v1/routes.ts b/src/v1/routes.ts index d22f501..c591efd 100644 --- a/src/v1/routes.ts +++ b/src/v1/routes.ts @@ -3,38 +3,43 @@ import { createUserSchema, updateUserSchema } from "./user.validation"; import { createUser, getUserBalance, updateUser } from "./user"; import express from "express"; +import { + createTransaction, + deleteTransaction, + getTransaction, + getTransactions, + getTransactionsByUser, + updateTransaction, +} from "./transaction"; +import { transactionSchema } from "./transaction.validation"; const v1Routes = express.Router(); -v1Routes.get("/createTransaction", function (req, res) { - res.status(200).json({ - message: "createTransaction", - }); -}); -v1Routes.get("/updateTransaction", function (req, res) { - res.status(200).json({ - message: "updateTransaction", - }); -}); -v1Routes.delete("/deleteTransaction", function (req, res) { - res.status(200).json({ - message: "deleteTransaction", - }); -}); -v1Routes.get("/getTransaction", function (req, res) { - res.status(200).json({ - message: "getTransaction", - }); -}); -v1Routes.get("/getTransactions", function (req, res) { - res.status(200).json({ - message: "getTransactions", - }); -}); -v1Routes.get("/getTransactionsByUser", function (req, res) { - res.status(200).json({ - message: "getTransactionsByUser", - }); -}); + +v1Routes.post( + "/createTransaction", + validateUserExistsSentThroughReqBody("body.user_id"), + middlewareValidateYupSchemaAgainstReqBody(transactionSchema), + createTransaction, +); + +v1Routes.put( + "/updateTransaction/:id", + validateUserExistsSentThroughReqBody("body.user_id"), + middlewareValidateYupSchemaAgainstReqBody(transactionSchema), + updateTransaction, +); + +v1Routes.delete("/deleteTransaction/:id", deleteTransaction); + +v1Routes.get("/getTransaction/:id", getTransaction); + +v1Routes.get("/getTransactions", getTransactions); + +v1Routes.get( + "/getTransactionsByUser/:userId", + validateUserExistsSentThroughReqBody("params.userId"), + getTransactionsByUser, +); v1Routes.post("/createWallet", function (req, res) { res.status(200).json({ @@ -45,7 +50,7 @@ v1Routes.post("/createWallet", function (req, res) { v1Routes.post("/createUser", middlewareValidateYupSchemaAgainstReqBody(createUserSchema), createUser); v1Routes.put( "/updateUser", - validateUserExistsSentThroughReqBody("body.input.id"), + validateUserExistsSentThroughReqBody("body.id"), middlewareValidateYupSchemaAgainstReqBody(updateUserSchema), updateUser, ); diff --git a/src/v1/transaction.ts b/src/v1/transaction.ts index 7da3afa..ba6b8fa 100644 --- a/src/v1/transaction.ts +++ b/src/v1/transaction.ts @@ -1,6 +1,147 @@ -export const createTransaction = () => {}; -export const updateTransaction = () => {}; -export const deleteTransaction = () => {}; -export const getTransaction = () => {}; -export const getTransactions = () => {}; -export const getTransactionsByUser = () => {}; +import prisma from "./../database/prisma"; +import { Response, Request } from "express"; +import { generateError } from "../utils/errors"; + +export const createTransaction = async (req: Request, res: Response) => { + try { + // Check if wallet_id exists + const wallet = await prisma.wallet.findUnique({ + where: { id: req.body.wallet_id }, + }); + if (!wallet) { + return res.status(400).json({ message: "Wallet not found" }); + } + + // Create transaction + let response = await prisma.transaction.create({ + data: { + transaction_type: req.body.transaction_type, + user_id: req.body.user_id, + wallet_id: req.body.wallet_id, + amount: req.body.amount, + }, + }); + + res.status(200).json({ + message: "Transaction created successfully", + user: response, + }); + } catch (e) { + generateError(res, e); + } +}; + +export const updateTransaction = async (req: Request, res: Response) => { + try { + const { id } = req.params; + const updateData = req.body; + + // Check if transaction exists + const existingTransaction = await prisma.transaction.findUnique({ + where: { id: parseInt(id) }, + }); + if (!existingTransaction) { + return res.status(404).json({ message: "Transaction not found" }); + } + + if (updateData.wallet_id) { + const wallet = await prisma.wallet.findUnique({ + where: { id: updateData.wallet_id }, + }); + if (!wallet) { + return res.status(400).json({ message: "Wallet not found" }); + } + } + + // Update the transaction + const updatedTransaction = await prisma.transaction.update({ + where: { id: parseInt(id) }, + data: updateData, + }); + + res.status(200).json({ + message: "Transaction updated successfully", + transaction: updatedTransaction, + }); + } catch (e) { + generateError(res, e); + } +}; + +export const deleteTransaction = async (req: Request, res: Response) => { + try { + const { id } = req.params; + + // Check if the transaction exists + const existingTransaction = await prisma.transaction.findUnique({ + where: { id: parseInt(id) }, + }); + if (!existingTransaction) { + return res.status(404).json({ message: "Transaction not found" }); + } + + // Delete the transaction + await prisma.transaction.delete({ + where: { id: parseInt(id) }, + }); + + res.status(200).json({ message: "Transaction deleted successfully" }); + } catch (e) { + generateError(res, e); + } +}; + +export const getTransaction = async (req: Request, res: Response) => { + try { + const { id } = req.params; + + // Retrieve the transaction + const transaction = await prisma.transaction.findUnique({ + where: { id: parseInt(id) }, + }); + + if (!transaction) { + return res.status(404).json({ message: "Transaction not found" }); + } + + res.status(200).json(transaction); + } catch (e) { + generateError(res, e); + } +}; + +export const getTransactions = async (req: Request, res: Response) => { + try { + const transactions = await prisma.transaction.findMany(); + + if (!transactions) { + return res.status(404).json({ message: "Transactions not found" }); + } + + res.status(200).json(transactions); + } catch (e) { + generateError(res, e); + } +}; + +export const getTransactionsByUser = async (req: Request, res: Response) => { + try { + const { userId } = req.params; + + // Check if user exists + const user = await prisma.user.findUnique({ + where: { id: parseInt(userId) }, + }); + + // Retrieve transactions for the user + const transactions = await prisma.transaction.findMany({ + where: { + user_id: user?.id, + }, + }); + + res.status(200).json(transactions); + } catch (e) { + generateError(res, e); + } +}; diff --git a/src/v1/transaction.validation.ts b/src/v1/transaction.validation.ts new file mode 100644 index 0000000..83878f9 --- /dev/null +++ b/src/v1/transaction.validation.ts @@ -0,0 +1,42 @@ +import * as yup from "yup"; + +// Define the transaction validation schema +export const transactionSchema = yup.object({ + transaction_type: yup + .string() + .required("Transaction type is required") + .oneOf(["credit", "debit"], "Transaction type must be either credit or debit"), + user_id: yup + .number() + .required("User ID is required") + .positive("User ID must be a positive integer") + .integer("User ID must be an integer"), + wallet_id: yup + .number() + .required("Wallet ID is required") + .positive("Wallet ID must be a positive integer") + .integer("Wallet ID must be an integer"), + amount: yup + .number() + .required("Amount is required") + .positive("Amount must be a positive integer") + .integer("Amount must be an integer"), + created_at: yup + .date() + .default(() => new Date()) + .required("Creation date is required"), + updated_at: yup + .date() + .default(() => new Date()) + .required("Update date is required"), +}); + +// Define the type for the expected shape of the transaction data +export interface TransactionData { + transaction_type: "credit" | "debit"; + user_id: number; + wallet_id: number; + amount: number; + created_at: Date; + updated_at: Date; +} diff --git a/src/v1/user.ts b/src/v1/user.ts index d86e6e9..be6195f 100644 --- a/src/v1/user.ts +++ b/src/v1/user.ts @@ -6,9 +6,9 @@ export const createUser = async (req: Request, res: Response) => { try { let response = await prisma.user.create({ data: { - email: req.body.input.email, - username: req.body.input.username, - application_user_id: req.body.input.application_user_id, + email: req.body.email, + username: req.body.username, + application_user_id: req.body.application_user_id, }, }); res.status(200).json({ From 97093210f86f65d0f409273fac8d69fe0831b9e1 Mon Sep 17 00:00:00 2001 From: Ilyas Karim Date: Wed, 3 Jan 2024 03:11:46 +0500 Subject: [PATCH 2/5] feat: transactions updates feat: transactions updates --- src/utils/middlewares.ts | 2 +- src/v1/routes.ts | 6 ++--- src/v1/transaction.ts | 19 +++++++++------- src/v1/transaction.validation.ts | 39 ++++++++++++-------------------- src/v1/user.validation.ts | 2 +- 5 files changed, 31 insertions(+), 37 deletions(-) diff --git a/src/utils/middlewares.ts b/src/utils/middlewares.ts index 5637362..aab231d 100644 --- a/src/utils/middlewares.ts +++ b/src/utils/middlewares.ts @@ -21,7 +21,7 @@ export const validateYupSchemaAgainstAnObject = async function (schema: any, obj export const middlewareValidateYupSchemaAgainstReqBody = function (schema: any) { return async function (req: any, res: any, next: any) { - let validate = await validateYupSchemaAgainstAnObject(schema, req.body); + let validate = await validateYupSchemaAgainstAnObject(schema, req.body.input); if (validate.length > 0) { return res.status(400).json({ message: "Validation Error", diff --git a/src/v1/routes.ts b/src/v1/routes.ts index c591efd..9cb43bf 100644 --- a/src/v1/routes.ts +++ b/src/v1/routes.ts @@ -11,21 +11,21 @@ import { getTransactionsByUser, updateTransaction, } from "./transaction"; -import { transactionSchema } from "./transaction.validation"; +import { createTransactionSchema, updateTransactionSchema } from "./transaction.validation"; const v1Routes = express.Router(); v1Routes.post( "/createTransaction", validateUserExistsSentThroughReqBody("body.user_id"), - middlewareValidateYupSchemaAgainstReqBody(transactionSchema), + middlewareValidateYupSchemaAgainstReqBody(createTransactionSchema), createTransaction, ); v1Routes.put( "/updateTransaction/:id", validateUserExistsSentThroughReqBody("body.user_id"), - middlewareValidateYupSchemaAgainstReqBody(transactionSchema), + middlewareValidateYupSchemaAgainstReqBody(updateTransactionSchema), updateTransaction, ); diff --git a/src/v1/transaction.ts b/src/v1/transaction.ts index ba6b8fa..a17371b 100644 --- a/src/v1/transaction.ts +++ b/src/v1/transaction.ts @@ -6,7 +6,7 @@ export const createTransaction = async (req: Request, res: Response) => { try { // Check if wallet_id exists const wallet = await prisma.wallet.findUnique({ - where: { id: req.body.wallet_id }, + where: { id: req.body.input.wallet_id }, }); if (!wallet) { return res.status(400).json({ message: "Wallet not found" }); @@ -15,10 +15,10 @@ export const createTransaction = async (req: Request, res: Response) => { // Create transaction let response = await prisma.transaction.create({ data: { - transaction_type: req.body.transaction_type, - user_id: req.body.user_id, - wallet_id: req.body.wallet_id, - amount: req.body.amount, + transaction_type: req.body.input.transaction_type, + user_id: req.body.input.user_id, + wallet_id: req.body.input.wallet_id, + amount: req.body.input.amount, }, }); @@ -34,7 +34,7 @@ export const createTransaction = async (req: Request, res: Response) => { export const updateTransaction = async (req: Request, res: Response) => { try { const { id } = req.params; - const updateData = req.body; + const updateData = req.body.input; // Check if transaction exists const existingTransaction = await prisma.transaction.findUnique({ @@ -46,7 +46,7 @@ export const updateTransaction = async (req: Request, res: Response) => { if (updateData.wallet_id) { const wallet = await prisma.wallet.findUnique({ - where: { id: updateData.wallet_id }, + where: { id: existingTransaction.wallet_id }, }); if (!wallet) { return res.status(400).json({ message: "Wallet not found" }); @@ -140,7 +140,10 @@ export const getTransactionsByUser = async (req: Request, res: Response) => { }, }); - res.status(200).json(transactions); + res.status(200).json({ + transactions: transactions, + message: "Transactions retrieved successfully", + }); } catch (e) { generateError(res, e); } diff --git a/src/v1/transaction.validation.ts b/src/v1/transaction.validation.ts index 83878f9..49ec807 100644 --- a/src/v1/transaction.validation.ts +++ b/src/v1/transaction.validation.ts @@ -1,42 +1,33 @@ -import * as yup from "yup"; +import { object, string, number, InferType, date } from "yup"; -// Define the transaction validation schema -export const transactionSchema = yup.object({ - transaction_type: yup - .string() +export const createTransactionSchema = object({ + transaction_type: string() .required("Transaction type is required") .oneOf(["credit", "debit"], "Transaction type must be either credit or debit"), - user_id: yup - .number() + user_id: number() .required("User ID is required") .positive("User ID must be a positive integer") .integer("User ID must be an integer"), - wallet_id: yup - .number() + wallet_id: number() .required("Wallet ID is required") .positive("Wallet ID must be a positive integer") .integer("Wallet ID must be an integer"), - amount: yup - .number() + amount: number() .required("Amount is required") .positive("Amount must be a positive integer") .integer("Amount must be an integer"), - created_at: yup - .date() + created_at: date() .default(() => new Date()) .required("Creation date is required"), - updated_at: yup - .date() + updated_at: date() .default(() => new Date()) .required("Update date is required"), }); +export type CreateTransactionSchema = InferType; -// Define the type for the expected shape of the transaction data -export interface TransactionData { - transaction_type: "credit" | "debit"; - user_id: number; - wallet_id: number; - amount: number; - created_at: Date; - updated_at: Date; -} +export const updateTransactionSchema = object({ + transaction_type: string().optional().oneOf(["credit", "debit"], "Transaction type must be either credit or debit"), + user_id: number().optional().positive("User ID must be a positive integer").integer("User ID must be an integer"), + amount: number().optional().positive("Amount must be a positive integer").integer("Amount must be an integer"), +}); +export type UpdateTransactionSchema = InferType; diff --git a/src/v1/user.validation.ts b/src/v1/user.validation.ts index a853490..c53a751 100644 --- a/src/v1/user.validation.ts +++ b/src/v1/user.validation.ts @@ -1,4 +1,4 @@ -import { object, string, number, date, InferType } from "yup"; +import { object, string, number, InferType } from "yup"; export const createUserSchema = object({ username: string().required("Username is required"), From 507603ec45e44779e935bd8381a818795521f850 Mon Sep 17 00:00:00 2001 From: Ilyas Karim Date: Wed, 3 Jan 2024 03:20:31 +0500 Subject: [PATCH 3/5] docs: updated readme.md --- README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/README.md b/README.md index e09ce8a..dd10abe 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,22 @@ # CoinFlowSystem A flexible and secure API-driven coin management system for integrating virtual currency functionality in games and applications. + + +## Few rules we follow internally + +- **Always take input from req.body.input**, Make sure to take and validate input from `req.body.input` and not from `req.body` directly. + + + +## Code Commit Guidelines + +When committing code, We follow the following guidelines for commit messages. + +``` +feat: feature xyz +fix: fix xyz +refactor: refactor xyz +docs: update docs +optimize: optimize xyz +``` \ No newline at end of file From 60907a8238c6a42012cca3f1990527056079ccba Mon Sep 17 00:00:00 2001 From: Ilyas Karim Date: Wed, 3 Jan 2024 03:21:55 +0500 Subject: [PATCH 4/5] doc: added changelog.md --- README.md | 5 +---- changelog.md | 3 +++ 2 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 changelog.md diff --git a/README.md b/README.md index dd10abe..76bc2c8 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,9 @@ A flexible and secure API-driven coin management system for integrating virtual currency functionality in games and applications. - ## Few rules we follow internally - **Always take input from req.body.input**, Make sure to take and validate input from `req.body.input` and not from `req.body` directly. - - ## Code Commit Guidelines @@ -19,4 +16,4 @@ fix: fix xyz refactor: refactor xyz docs: update docs optimize: optimize xyz -``` \ No newline at end of file +``` diff --git a/changelog.md b/changelog.md new file mode 100644 index 0000000..0666736 --- /dev/null +++ b/changelog.md @@ -0,0 +1,3 @@ +### 1.0.0 +- Initial project structure and repo setup +- Initial API's for User, Wallet, and Transaction management \ No newline at end of file From 4e234ea0adf744ab7b8d0d211b7db30e918f6a55 Mon Sep 17 00:00:00 2001 From: Ilyas Karim Date: Wed, 3 Jan 2024 03:24:10 +0500 Subject: [PATCH 5/5] refactor: refactor the stuff, update database --- changelog.md | 3 +- prisma/schema.prisma | 20 ++++---- src/v1/routes.ts | 46 +++++++++++-------- src/v1/{ => transactions}/transaction.ts | 11 ++--- .../transaction.validation.ts | 6 +-- src/v1/wallet.ts | 1 - src/v1/{user.ts => wallet/wallet.ts} | 18 +++----- .../wallet.validation.ts} | 8 ++-- 8 files changed, 54 insertions(+), 59 deletions(-) rename src/v1/{ => transactions}/transaction.ts (92%) rename src/v1/{ => transactions}/transaction.validation.ts (81%) delete mode 100644 src/v1/wallet.ts rename src/v1/{user.ts => wallet/wallet.ts} (57%) rename src/v1/{user.validation.ts => wallet/wallet.validation.ts} (68%) diff --git a/changelog.md b/changelog.md index 0666736..d85bcc1 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,4 @@ ### 1.0.0 + - Initial project structure and repo setup -- Initial API's for User, Wallet, and Transaction management \ No newline at end of file +- Initial API's for User, Wallet, and Transaction management diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 904bb12..cfbbb23 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -7,35 +7,33 @@ datasource db { url = env("DATABASE_URL") } -model User { +model Wallet { id Int @id @default(autoincrement()) username String @unique email String @unique application_user_id String @unique - Wallet Wallet[] - Transaction Transaction[] created_at DateTime @default(now()) updated_at DateTime @updatedAt + Transaction Transaction[] } -model Wallet { +model Coin { id Int @id @default(autoincrement()) - user_id Int - user User @relation(fields: [user_id], references: [id]) - balance Int - Transaction Transaction[] + name String + symbol String created_at DateTime @default(now()) updated_at DateTime @updatedAt + Transaction Transaction[] } model Transaction { id Int @id @default(autoincrement()) transaction_type String - user_id Int - user User @relation(fields: [user_id], references: [id]) wallet_id Int - wallet Wallet @relation(fields: [wallet_id], references: [id]) + coin_id Int amount Int created_at DateTime @default(now()) updated_at DateTime @updatedAt + wallet Wallet @relation(fields: [wallet_id], references: [id]) + coin Coin @relation(fields: [coin_id], references: [id]) } diff --git a/src/v1/routes.ts b/src/v1/routes.ts index 9cb43bf..73c2fe7 100644 --- a/src/v1/routes.ts +++ b/src/v1/routes.ts @@ -1,6 +1,6 @@ import { middlewareValidateYupSchemaAgainstReqBody, validateUserExistsSentThroughReqBody } from "../utils/middlewares"; -import { createUserSchema, updateUserSchema } from "./user.validation"; -import { createUser, getUserBalance, updateUser } from "./user"; +import { createWalletSchema, updateWalletSchema } from "./wallet/wallet.validation"; +import { createWallet, updateWallet, getWalletBalance } from "./wallet/wallet"; import express from "express"; import { @@ -10,11 +10,32 @@ import { getTransactions, getTransactionsByUser, updateTransaction, -} from "./transaction"; -import { createTransactionSchema, updateTransactionSchema } from "./transaction.validation"; +} from "./transactions/transaction"; +import { createTransactionSchema, updateTransactionSchema } from "./transactions/transaction.validation"; const v1Routes = express.Router(); +/** + * Wallet Apis Start + */ + +v1Routes.post("/createWallet", middlewareValidateYupSchemaAgainstReqBody(createWalletSchema), createWallet); +v1Routes.put( + "/updateWallet", + validateUserExistsSentThroughReqBody("body.id"), + middlewareValidateYupSchemaAgainstReqBody(updateWalletSchema), + updateWallet, +); +v1Routes.get("/getWalletBalance", validateUserExistsSentThroughReqBody("body.input.id"), getWalletBalance); + +/** + * Wallet Apis End + */ + +/** + * Transaction Apis Start + * */ + v1Routes.post( "/createTransaction", validateUserExistsSentThroughReqBody("body.user_id"), @@ -40,19 +61,8 @@ v1Routes.get( validateUserExistsSentThroughReqBody("params.userId"), getTransactionsByUser, ); +/** + * Transaction Apis End + */ -v1Routes.post("/createWallet", function (req, res) { - res.status(200).json({ - message: "createWallet", - }); -}); - -v1Routes.post("/createUser", middlewareValidateYupSchemaAgainstReqBody(createUserSchema), createUser); -v1Routes.put( - "/updateUser", - validateUserExistsSentThroughReqBody("body.id"), - middlewareValidateYupSchemaAgainstReqBody(updateUserSchema), - updateUser, -); -v1Routes.get("/getUserBalance", validateUserExistsSentThroughReqBody("body.input.id"), getUserBalance); export default v1Routes; diff --git a/src/v1/transaction.ts b/src/v1/transactions/transaction.ts similarity index 92% rename from src/v1/transaction.ts rename to src/v1/transactions/transaction.ts index a17371b..f941d34 100644 --- a/src/v1/transaction.ts +++ b/src/v1/transactions/transaction.ts @@ -1,6 +1,6 @@ -import prisma from "./../database/prisma"; +import prisma from "../../database/prisma"; import { Response, Request } from "express"; -import { generateError } from "../utils/errors"; +import { generateError } from "../../utils/errors"; export const createTransaction = async (req: Request, res: Response) => { try { @@ -14,12 +14,7 @@ export const createTransaction = async (req: Request, res: Response) => { // Create transaction let response = await prisma.transaction.create({ - data: { - transaction_type: req.body.input.transaction_type, - user_id: req.body.input.user_id, - wallet_id: req.body.input.wallet_id, - amount: req.body.input.amount, - }, + data: req.body.input, }); res.status(200).json({ diff --git a/src/v1/transaction.validation.ts b/src/v1/transactions/transaction.validation.ts similarity index 81% rename from src/v1/transaction.validation.ts rename to src/v1/transactions/transaction.validation.ts index 49ec807..f22fbaa 100644 --- a/src/v1/transaction.validation.ts +++ b/src/v1/transactions/transaction.validation.ts @@ -4,10 +4,6 @@ export const createTransactionSchema = object({ transaction_type: string() .required("Transaction type is required") .oneOf(["credit", "debit"], "Transaction type must be either credit or debit"), - user_id: number() - .required("User ID is required") - .positive("User ID must be a positive integer") - .integer("User ID must be an integer"), wallet_id: number() .required("Wallet ID is required") .positive("Wallet ID must be a positive integer") @@ -26,8 +22,8 @@ export const createTransactionSchema = object({ export type CreateTransactionSchema = InferType; export const updateTransactionSchema = object({ + id: number().required("ID is required"), transaction_type: string().optional().oneOf(["credit", "debit"], "Transaction type must be either credit or debit"), - user_id: number().optional().positive("User ID must be a positive integer").integer("User ID must be an integer"), amount: number().optional().positive("Amount must be a positive integer").integer("Amount must be an integer"), }); export type UpdateTransactionSchema = InferType; diff --git a/src/v1/wallet.ts b/src/v1/wallet.ts deleted file mode 100644 index 56eae8a..0000000 --- a/src/v1/wallet.ts +++ /dev/null @@ -1 +0,0 @@ -export const createWallet = () => {}; diff --git a/src/v1/user.ts b/src/v1/wallet/wallet.ts similarity index 57% rename from src/v1/user.ts rename to src/v1/wallet/wallet.ts index be6195f..21e5dfb 100644 --- a/src/v1/user.ts +++ b/src/v1/wallet/wallet.ts @@ -1,15 +1,11 @@ -import prisma from "./../database/prisma"; +import prisma from "../../database/prisma"; import { Response, Request } from "express"; -import { generateError } from "../utils/errors"; +import { generateError } from "../../utils/errors"; -export const createUser = async (req: Request, res: Response) => { +export const createWallet = async (req: Request, res: Response) => { try { let response = await prisma.user.create({ - data: { - email: req.body.email, - username: req.body.username, - application_user_id: req.body.application_user_id, - }, + data: req.body.input, }); res.status(200).json({ message: "User created successfully", @@ -20,7 +16,7 @@ export const createUser = async (req: Request, res: Response) => { } }; -export const updateUser = async (req: Request, res: Response) => { +export const updateWallet = async (req: Request, res: Response) => { try { const user = req.CurrentRequestUser; const update = await prisma.user.update({ @@ -38,8 +34,8 @@ export const updateUser = async (req: Request, res: Response) => { } }; -export const getUserBalance = (req: Request, res: Response) => { +export const getWalletBalance = (req: Request, res: Response) => { res.status(200).json({ - message: "getUserBalance", + message: "getWalletBalance", }); }; diff --git a/src/v1/user.validation.ts b/src/v1/wallet/wallet.validation.ts similarity index 68% rename from src/v1/user.validation.ts rename to src/v1/wallet/wallet.validation.ts index c53a751..3a08f92 100644 --- a/src/v1/user.validation.ts +++ b/src/v1/wallet/wallet.validation.ts @@ -1,16 +1,16 @@ import { object, string, number, InferType } from "yup"; -export const createUserSchema = object({ +export const createWalletSchema = object({ username: string().required("Username is required"), application_user_id: string().required("Application User ID is required"), email: string().email().required("Email is required"), }); -export type CreateUserSchema = InferType; +export type CreateWalletSchema = InferType; -export const updateUserSchema = object({ +export const updateWalletSchema = object({ id: number().required("ID is required"), username: string().required("Username is required"), application_user_id: string().required("Application User ID is required"), email: string().email().required("Email is required"), }); -export type UpdateUserSchema = InferType; +export type UpdateWalletSchema = InferType;