Skip to content
Open
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
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
.env
/node_modules
/node_modules
/dist
6 changes: 3 additions & 3 deletions controllers/battles-controller.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const crypto = require("crypto");
const jwt = require("jsonwebtoken");

const database = require("../database/db");
const database = require("../database/db").default;
const dayjs = require("dayjs");
const {
battleFormatting,
Expand All @@ -11,8 +11,8 @@ const {
upcomingBattleFormattingLimited,
completedBattleFormatting,
formatOneBattle,
} = require("../utils/ArrayMethods");
const { getTokenProfile } = require("../utils/Auth");
} = require("../utils/ArrayMethods").default;
const { getTokenProfile } = require("../utils/Auth").default;

const pool = database.client.pool;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,51 +1,9 @@
const database = require("../database/db");
const dayjs = require("dayjs");
const crypto = require("crypto");
const { completedArmiesBattleFormatting } = require("../utils/ArrayMethods");

// const pool = database.client.pool;

// database.on("query", (builder) => {
// console.log("Army Controller to be executed", builder.sql);
// console.log("Army Controller Pool Used on Start", pool.numUsed());
// console.log("Army Controller Pool Used on Start", pool.numPendingAcquires());

// console.log("Army Controller Pool Free on Start", pool.numFree());
// });

// database.on("query-response", (response, builder) => {
// console.log("Army Controller Query executed successfully:", builder.sql);
// console.log("Army Controller Pool Used on response", pool.numUsed());
// console.log("Army Controller Pool Free on response", pool.numFree());
// });

// database.on("query-error", (error, builder) => {
// console.error("Error executing query:", builder.sql, error);
// console.log("Army Controller Error Pool Used on error", pool.numUsed());
// console.log("Army Controller Error Pool Free on error", pool.numFree());
// });

const armyCountFn = (array) => {
const returnArray = [];
array.forEach((army) => {
let armyBool = false;
for (let i = 0; i < returnArray.length; i++) {
if (
returnArray[i].id === army.id &&
returnArray[i].name === army.name &&
returnArray[i].known_as === army.known_as
) {
armyBool = true;
returnArray[i].count++;
}
}
if (armyBool !== true) {
returnArray.push({ count: 1, ...army });
}
});

return returnArray;
};
import database from "../../../database/db";
import dayjs from "dayjs";
import crypto from "crypto";
import { completedArmiesBattleFormatting } from "../../../utils/ArrayMethods";
import { armyCountFn, getRankAndPosition } from "./helpers";
import { Army, ArmyRank, CountedArmy } from "../../../types/armies";

const updateArmyField = async (armyID, fieldName, newValue) => {
try {
Expand All @@ -64,15 +22,15 @@ const fetchOneArmy = async (req, res) => {
const id = req.params.id;

try {
const armyObj = await database("armies").where({ id: id }).first();
const army: Army = await database("armies").where({ id: id }).first();

if (!armyObj) {
if (!army) {
return res
.status(400)
.send("We cannot find the army you are looking for");
}

res.status(200).send(armyObj);
res.status(200).send(army);
} catch (error) {
console.error(error);
res.status(400).send("We cannot process your request right now");
Expand All @@ -81,47 +39,34 @@ const fetchOneArmy = async (req, res) => {

const addNewArmyRanking = async (req, res) => {
const armyID = req.params.id;
const { newRank } = req.body;
const { newRank: newRankScore } = req.body;

if (!newRank) {
if (!newRankScore) {
return res.status(400).send("Please add the new rank to the request body");
}

const armyObj = await database("armies").where({ id: armyID }).first();
const army = await database("armies").where({ id: armyID }).first();

if (!armyObj) {
if (!army) {
return res.status(400).send(`Can't find the army with ID: ${armyID}`);
}

try {
const subquery = database("rank")
.join("armies", "rank.army_id", "=", "armies.id")
.select("army_id", "date", "ranking")
.rowNumber("rn", { column: "date", order: "desc" }, "army_id")
.where({ "armies.type": armyObj.type })
.as("ranks");

const query = database(subquery)
.select("army_id", "date", "ranking", "rn")
.where("rn", 1)
.orderBy("ranking", "desc");

const currentRankPosition =
(await query).findIndex((ranking) => ranking.army_id === armyID) + 1;
const currentRankPosition = await getRankAndPosition(army.type, armyID);

const date = Date.now();

const newRankObj = {
const newRank: ArmyRank = {
date: dayjs(date).format("YYYY-MM-DD HH:mm:ss"),
id: crypto.randomUUID(),
army_id: armyID,
ranking: newRank,
ranking: newRankScore,
prev_ranking: currentRankPosition,
};

await database("rank").insert(newRankObj);
await database("rank").insert(newRank);

res.status(200).send(newRankObj);
res.status(200).send(newRank);
} catch (error) {
console.error(error);
res.status(400).send("Unable to update the rank");
Expand All @@ -130,8 +75,8 @@ const addNewArmyRanking = async (req, res) => {

const getAllArmies = async (req, res) => {
try {
const armyArray = await database("armies").select("*");
res.status(200).send(armyArray);
const armies: Army[] = await database("armies").select("*");
res.status(200).send(armies);
} catch (error) {
console.error(error);
res.status(400).send(error);
Expand All @@ -152,24 +97,26 @@ const getAllUserArmies = async (req, res) => {
.select("army_id", "armies.name", "armies.type", "armies.emblem")
.as("battleArray");

const maxCountArray = [];
console.log(battleArray);

const userArmies = [];

battleArray.forEach((army) => {
const targetObj = maxCountArray.find(
(targetArmy) => targetArmy.army_id === army.army_id
const target = userArmies.find(
(targetArmy: Army) => targetArmy.army_id === army.army_id
);
if (!targetObj) {
maxCountArray.push(army);
} else if (targetObj) {
const targetIndex = maxCountArray.findIndex(
if (!target) {
userArmies.push(army);
} else if (target) {
const targetIndex = userArmies.findIndex(
(targetArmy) => targetArmy.army_id === army.army_id
);

maxCountArray[targetIndex].count = army.count;
userArmies[targetIndex].count = army.count;
}
});

res.status(200).send(maxCountArray);
res.status(200).send(userArmies);
} catch (error) {
console.error(error);
res.status(400).send(error);
Expand Down
43 changes: 43 additions & 0 deletions controllers/modules/armies/helpers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import { Army, ArmyId, ArmyType, CountedArmy } from "../../../types/armies";
import database from "../../../database/db";

export const armyCountFn = (array: Army[]) => {
const returnArray: CountedArmy[] = [];
array.forEach((army) => {
let armyBool = false;
for (let i = 0; i < returnArray.length; i++) {
if (
returnArray[i].id === army.id &&
returnArray[i].name === army.name &&
returnArray[i].known_as === army.known_as
) {
armyBool = true;
returnArray[i].count++;
}
}
if (armyBool !== true) {
returnArray.push({ count: 1, ...army });
}
});

return returnArray;
};

export const getRankAndPosition = async (type: ArmyType, armyID: ArmyId) => {
const subquery = database("rank")
.join("armies", "rank.army_id", "=", "armies.id")
.select("army_id", "date", "ranking")
.rowNumber("rn", { column: "date", order: "desc" }, "army_id")
.where({ "armies.type": type })
.as("ranks");

const query = database(subquery)
.select("army_id", "date", "ranking", "rn")
.where("rn", 1)
.orderBy("ranking", "desc");

const currentRankPosition =
(await query).findIndex((ranking) => ranking.army_id === armyID) + 1;

return currentRankPosition;
};
2 changes: 1 addition & 1 deletion controllers/rankings-controllers.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const database = require("../database/db");
const database = require("../database/db").default;

// const pool = database.client.pool;

Expand Down
10 changes: 4 additions & 6 deletions controllers/users-controllers.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
const database = require("../database/db");
const database = require("../database/db").default;
const bcrypt = require("bcryptjs");
const jwt = require("jsonwebtoken");
const {
completedBattleFormatting,
userCompletedBattleFormatting,
} = require("../utils/ArrayMethods");
const { verifyToken, getTokenProfile } = require("../utils/Auth");
const { completedBattleFormatting, userCompletedBattleFormatting } =
require("../utils/ArrayMethods").default;
const { verifyToken, getTokenProfile } = require("../utils/Auth").default;
const { armyCountFn } = require("./armies-controller");

// const pool = database.client.pool;
Expand Down
4 changes: 2 additions & 2 deletions database/db.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
const config = require("../knexfile");
import config from "../knexfile.js";

module.exports = require("knex")(config);
export default require("knex")(config);
30 changes: 11 additions & 19 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,35 +1,27 @@
const express = require("express");
import express, { json } from "express";
import { cors } from "cors";
const app = express();
const cors = require("cors");
const knex = require("knex")(require("./knexfile"));

require("dotenv").config();

app.use(express.json());
app.use(json());
app.use(cors());
const PORT = process.env.PORT || 8080;

const userRoutes = require("./routes/users-routes");
const battlesRoutes = require("./routes/battles-routes");
const rankingsRoutes = require("./routes/rankings-routes");
const armiesRoutes = require("./routes/armies-routes");

const pool = knex.client.pool;

// app.use("/", (req, res, next) => {
// console.log("Index File Pool in Use", pool.numUsed());
// console.log("Index File Pool free", pool.numFree());
// next();
// });
import battleRouter from "./routes/battles-routes.js";
import rankingRouter from "./routes/rankings-routes.js";
import userRouter from "./routes/users-routes.js";
import armyRouter from "./routes/armies-routes.js";

app.get("/", (req, res) => {
res.send("Hello World");
});

app.use("/users", userRoutes);
app.use("/battles", battlesRoutes);
app.use("/rankings", rankingsRoutes);
app.use("/armies", armiesRoutes);
app.use("/users", userRouter);
app.use("/battles", battleRouter);
app.use("/rankings", rankingRouter);
app.use("/armies", armyRouter);
app.listen(PORT, () => {
console.log(`running at ${process.env.BASE_URL}${PORT}`);
});
27 changes: 12 additions & 15 deletions knexfile.js
Original file line number Diff line number Diff line change
@@ -1,18 +1,15 @@
require("dotenv").config();

module.exports = {
client: "mysql2",
connection: {
host: process.env.DB_HOST,
database: process.env.DB_NAME,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
charset: "utf8",
},
pool: {
min: 2, // Minimum number of connections in the pool
max: 10, // Maximum number of connections in the pool
idleTimeoutMillis: 1000,
},
debugger: true,
export const client = "mysql2";
export const connection = {
host: process.env.DB_HOST,
database: process.env.DB_NAME,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
charset: "utf8",
};
export const pool = {
min: 2, // Minimum number of connections in the pool
max: 10, // Maximum number of connections in the pool
idleTimeoutMillis: 1000,
};
10 changes: 5 additions & 5 deletions middleware/auth.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const jwt = require("jsonwebtoken");
const knex = require("knex")(require("../knexfile"));
import { verify } from "jsonwebtoken";
import knex from "knex";

const headerAuth = async (req, res, next) => {
if (!req.headers.authorization) {
Expand All @@ -9,7 +9,7 @@ const headerAuth = async (req, res, next) => {
const authToken = req.headers.authorization.split(" ")[1];

try {
const decodedToken = jwt.verify(authToken, process.env.JWT_KEY);
const decodedToken = verify(authToken, process.env.JWT_KEY);
const userID = decodedToken.id;

const profile = await knex("users").where({ id: userID }).first();
Expand All @@ -30,7 +30,7 @@ const adminAuth = async (req, res, next) => {
const authToken = req.headers.authorization.split(" ")[1];

try {
const decodedToken = jwt.verify(authToken, process.env.JWT_KEY);
const decodedToken = verify(authToken, process.env.JWT_KEY);
const userID = decodedToken.id;

const profile = await knex("users").where({ id: userID }).first();
Expand All @@ -47,4 +47,4 @@ const adminAuth = async (req, res, next) => {
}
};

module.exports = { headerAuth, adminAuth };
export default { headerAuth, adminAuth };
Loading