Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .DS_Store
Binary file not shown.
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
"scripts": {
"start": "node dist/index.js",
"build": "tsc",
"sync-prisma": "npx prisma migrate dev && npm run prisma-generate",
"prisma-generate": "npx prisma generate",
"prisma-studio": "npx prisma studio",
"dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/index.ts",
Expand Down Expand Up @@ -50,6 +51,7 @@
"cors": "^2.8.5",
"express": "^4.18.2",
"lodash.get": "^4.4.2",
"uuid": "^11.0.3",
"yup": "^1.3.2"
}
}
41 changes: 0 additions & 41 deletions prisma/migrations/20231121101343_init/migration.sql

This file was deleted.

76 changes: 76 additions & 0 deletions prisma/migrations/20241113013717_/migration.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
-- CreateEnum
CREATE TYPE "TransactionType" AS ENUM ('DEPOSIT', 'WITHDRAWAL');

-- CreateTable
CREATE TABLE "User" (
"id" TEXT NOT NULL,
"username" TEXT NOT NULL,
"email" TEXT NOT NULL,
"application_user_id" TEXT NOT NULL,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,

CONSTRAINT "User_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "Transaction" (
"id" TEXT NOT NULL,
"transaction_type" "TransactionType" NOT NULL,
"user_id" TEXT NOT NULL,
"amount" INTEGER NOT NULL,
"coin_id" TEXT NOT NULL,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,

CONSTRAINT "Transaction_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "Coin" (
"id" TEXT NOT NULL,
"name" TEXT NOT NULL,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,

CONSTRAINT "Coin_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "CoinRate" (
"id" TEXT NOT NULL,
"coin_one_id" TEXT NOT NULL,
"coin_two_id" TEXT NOT NULL,
"rate" DOUBLE PRECISION NOT NULL,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,

CONSTRAINT "CoinRate_pkey" PRIMARY KEY ("id")
);

-- CreateIndex
CREATE UNIQUE INDEX "User_username_key" ON "User"("username");

-- CreateIndex
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");

-- CreateIndex
CREATE UNIQUE INDEX "User_application_user_id_key" ON "User"("application_user_id");

-- CreateIndex
CREATE INDEX "Transaction_user_id_coin_id_idx" ON "Transaction"("user_id", "coin_id");

-- CreateIndex
CREATE UNIQUE INDEX "Coin_name_key" ON "Coin"("name");

-- AddForeignKey
ALTER TABLE "Transaction" ADD CONSTRAINT "Transaction_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "Transaction" ADD CONSTRAINT "Transaction_coin_id_fkey" FOREIGN KEY ("coin_id") REFERENCES "Coin"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "CoinRate" ADD CONSTRAINT "CoinRate_coin_one_id_fkey" FOREIGN KEY ("coin_one_id") REFERENCES "Coin"("name") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "CoinRate" ADD CONSTRAINT "CoinRate_coin_two_id_fkey" FOREIGN KEY ("coin_two_id") REFERENCES "Coin"("name") ON DELETE RESTRICT ON UPDATE CASCADE;
53 changes: 53 additions & 0 deletions prisma/migrations/20241224233404_/migration.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/*
Warnings:

- A unique constraint covering the columns `[username,email]` on the table `User` will be added. If there are existing duplicate values, this will fail.

*/
-- CreateTable
CREATE TABLE "League" (
"id" TEXT NOT NULL,
"name" TEXT NOT NULL,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
"demotion_rate" DOUBLE PRECISION NOT NULL,
"promotion_rate" DOUBLE PRECISION NOT NULL,
"league_start_date" TIMESTAMP(3) NOT NULL,
"league_end_date" TIMESTAMP(3) NOT NULL,

CONSTRAINT "League_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "LeagueUser" (
"id" TEXT NOT NULL,
"user_id" TEXT NOT NULL,
"league_id" TEXT NOT NULL,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,

CONSTRAINT "LeagueUser_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "UserExperience" (
"id" TEXT NOT NULL,
"user_id" TEXT NOT NULL,
"amount" DOUBLE PRECISION NOT NULL,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,

CONSTRAINT "UserExperience_pkey" PRIMARY KEY ("id")
);

-- CreateIndex
CREATE UNIQUE INDEX "User_username_email_key" ON "User"("username", "email");

-- AddForeignKey
ALTER TABLE "LeagueUser" ADD CONSTRAINT "LeagueUser_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "LeagueUser" ADD CONSTRAINT "LeagueUser_league_id_fkey" FOREIGN KEY ("league_id") REFERENCES "League"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "UserExperience" ADD CONSTRAINT "UserExperience_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
2 changes: 1 addition & 1 deletion prisma/migrations/migration_lock.toml
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
# Please do not edit this file manually
# It should be added in your version-control system (i.e. Git)
provider = "sqlite"
provider = "postgresql"
95 changes: 75 additions & 20 deletions prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -3,39 +3,94 @@ generator client {
}

datasource db {
provider = "sqlite"
provider = "postgresql"
url = env("DATABASE_URL")
}

enum TransactionType {
DEPOSIT
WITHDRAWAL
}

model User {
id Int @id @default(autoincrement())
id String @id @default(uuid())
username String @unique
email String @unique
application_user_id String @unique
Wallet Wallet[]
Transaction Transaction[]
created_at DateTime @default(now())
updated_at DateTime @updatedAt
}

model Wallet {
id Int @id @default(autoincrement())
user_id Int
user User @relation(fields: [user_id], references: [id])
balance Int
Transaction Transaction[]
created_at DateTime @default(now())
updated_at DateTime @updatedAt
LeagueUser LeagueUser[]
UserExperience UserExperience[]

@@unique([username, email])
}

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])
id String @id @default(uuid())
transaction_type TransactionType
user_id String
user User @relation(fields: [user_id], references: [id])
amount Int
created_at DateTime @default(now())
updated_at DateTime @updatedAt
coin_id String
coin Coin @relation(fields: [coin_id], references: [id])
created_at DateTime @default(now())
updated_at DateTime @updatedAt

@@index([user_id, coin_id])
}

model Coin {
id String @id @default(uuid())
name String
created_at DateTime @default(now())
updated_at DateTime @updatedAt
Transactions Transaction[]
CoinRatesOne CoinRate[] @relation("coin_one")
CoinRatesTwo CoinRate[] @relation("coin_two")

@@unique([name])
}

model CoinRate {
id String @id @default(uuid())
coin_one_id String
coin_one Coin @relation("coin_one", fields: [coin_one_id], references: [name])
coin_two_id String
coin_two Coin @relation("coin_two", fields: [coin_two_id], references: [name])
rate Float
created_at DateTime @default(now())
updated_at DateTime @updatedAt
}

model League {
id String @id @default(uuid())
name String
created_at DateTime @default(now())
updated_at DateTime @updatedAt
demotion_rate Float
promotion_rate Float
league_start_date DateTime
league_end_date DateTime
Users LeagueUser[]
}

model LeagueUser {
id String @id @default(uuid())
user_id String
user User @relation(fields: [user_id], references: [id])
league_id String
league League @relation(fields: [league_id], references: [id])
created_at DateTime @default(now())
updated_at DateTime @updatedAt
}

model UserExperience {
id String @id @default(uuid())
user_id String
amount Float
user User @relation(fields: [user_id], references: [id])
created_at DateTime @default(now())
updated_at DateTime @updatedAt
}
14 changes: 13 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@ import express, { Request, Response } from "express";
import cors from "cors";
import packageJSON from "./../package.json";
import v1Routes from "./v1/routes";
import { User } from "@prisma/client";
import { Prisma, User } from "@prisma/client";
import { requestLogger } from "./utils/middlewares";
import prisma from "./database/prisma";

declare global {
namespace Express {
Expand All @@ -29,6 +30,17 @@ app.get("/", (req, res) => {
});
});

app.get("/clean", async (req, res) => {
const tables = ["User", "Transaction", "Coin", "CoinRate"];
for (const table of tables) {
console.log(`Truncating table ${table}`);
await prisma.$executeRawUnsafe(`TRUNCATE TABLE "${table}" CASCADE;`);
}
res.status(200).json({
message: "Database cleaned",
});
});

app.use("/api/v1", v1Routes);

app.use((err: any, req: Request, res: Response, next: Function) => {
Expand Down
1 change: 1 addition & 0 deletions src/utils/middlewares.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +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) {
console.log("validation middleware", req.body);
let validate = await validateYupSchemaAgainstAnObject(schema, req.body.input);
if (validate.length > 0) {
return res.status(400).json({
Expand Down
25 changes: 25 additions & 0 deletions src/v1/coin.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { Response, Request } from "express";
import prisma from "../database/prisma";

export const createCoin = async (req: Request, res: Response) => {
const { input } = req.body;
const coin = await prisma.coin.create({
data: input,
});
res.status(200).json({
message: "Coin created successfully",
coin,
});
};


export const createCoinRate = async (req: Request, res: Response) => {
const { input } = req.body;
const coinRate = await prisma.coinRate.create({
data: input,
});
res.status(200).json({
message: "Coin rate created successfully",
coinRate,
});
};
Loading