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
1 change: 1 addition & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@
PORT= # PORT to use locally. For example: 5005
ORIGIN= # URL of Client for CORS. For example: "http://localhost:5173"
MONGODB_URI= # Location of MongoDB Database. For example: "mongodb://127.0.0.1:27017/my-database"
TOKEN_SECRET= # Secret key to sign JWTs. For example: "my-super-secret-key"
15 changes: 1 addition & 14 deletions config/index.js
Original file line number Diff line number Diff line change
@@ -1,31 +1,18 @@
const express = require("express");

// ℹ️ Logs incoming requests and responses to the terminal (useful for debugging)
const logger = require("morgan");

// ℹ️ Allows the server to accept requests from different origins (e.g., frontend apps)
// CORS (Cross-Origin Resource Sharing) enables secure cross-origin requests.
const cors = require("cors");

// Middleware configuration
function config(app) {
// ℹ️ Enables Express to trust reverse proxies (e.g., when deployed behind services like Heroku or Vercel)
app.set("trust proxy", 1);

// ℹ️ Configures CORS to allow requests only from the specified origin
app.use(
cors({
origin: [process.env.ORIGIN]
origin: [process.env.ORIGIN, "http://localhost:5173"],
})
);

// ℹ️ Logs requests in the development environment
app.use(logger("dev"));

// ℹ️ Parses incoming JSON requests
app.use(express.json());

// ℹ️ Parses incoming request bodies with URL-encoded data (form submissions)
app.use(express.urlencoded({ extended: false }));
};

Expand Down
11 changes: 11 additions & 0 deletions middlewares/admin.middleware.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
function verifyAdmin(req, res, next) {
const adminSecret = req.headers["x-admin-secret"];

if (!adminSecret || adminSecret !== process.env.ADMIN_SECRET) {
return res.status(403).json({ errorMessage: "Access denied" });
}

next();
}

module.exports = verifyAdmin;
22 changes: 22 additions & 0 deletions middlewares/auth.middlewares.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
const jwt = require("jsonwebtoken")

function verifyToken(req, res, next){
try {
const authHeader = req.headers.authorization;
if (!authHeader) {
return res.status(401).json({ errorMessage: "No token provided" });
}

const token = req.headers.authorization.split(" ")[1]; // 👈 space here, inside the function

const payload = jwt.verify(token, process.env.TOKEN_SECRET);

req.payload = payload;

next()
} catch (error) {
res.status(401).json({ errorMessage: "Token problem" });
}
}

module.exports = verifyToken
73 changes: 73 additions & 0 deletions models/Card.model.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const cardSchema = new Schema(
{
id: {
type: Number,
required: true,
unique: true,

},
set: {
type: String,
required: true,
trim: true,
},
name: {
type: String,
required: true,

trim: true,
},
faction: {
type: String,
required: true,
trim: true,
},
type: {
type: String,
required: true,
trim: true,
},
rarity: {
type: String,
required: true,
trim: true,
},
buildCost: {
type: Number,
required: true,
},
buildSpeed: {
type: Number,
required: true,
},
fragmentRate: {
type: Number,
required: true,
},
integrity: {
type: Number,
required: true,
},
processingSpeed: {
type: Number,
required: true,
},
text: {
type: String,
required: true,
},
image: {type: String,
default:""
}
},
{
timestamps: true,
},
);

const Card = mongoose.model("Card", cardSchema);

module.exports = Card;
47 changes: 47 additions & 0 deletions models/Deck.model.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
const mongoose = require("mongoose");
const Schema = mongoose.Schema;



//Schema:

const deckSchema = new Schema (
{

name:{
type:String,
required: true,
trim: true
},
archetype: {
type: String,

default: "Unknown",
trim: true

},
cards: { type: [Number], default: [] },

owner: {
type: Schema.Types.ObjectId,
ref: "User",
required: true,
},

valid: {
type: Boolean,
default: false,
},

likes: {
type: Number,
default: 0,
},
},
{
timestamps: true,
},
);

const Deck = mongoose.model("Deck", deckSchema);
module.exports = Deck;
56 changes: 43 additions & 13 deletions models/User.model.js
Original file line number Diff line number Diff line change
@@ -1,28 +1,58 @@
// ❗This is an example of a User Model.
// TODO: Please make sure you edit the User model to whatever makes sense in your project.
const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const { Schema, model } = require("mongoose");

const userSchema = new Schema(
const userSchema = new Schema (
{
name: {
type: String,
required: [true, "User name is required."],
trim: true,
unique:true
},

email: {
type: String,
required: [true, 'Email is required.'],
required: [true, "Email is required."],
unique: true,
lowercase: true,
trim: true
trim: true,
},

password: {
type: String,
required: [true, 'Password is required.']
}
required: [true, "Password is required."],
},

// relation fields for collections
cardCollection: {
type: [Number],
default: [],
},

favouriteDeckCollection: [
{
type: Schema.Types.ObjectId,
ref: "Deck"
}
]
},
{
// this second object adds extra properties: `createdAt` and `updatedAt`
timestamps: true
}
timestamps: true,
},

/*aftermvp/bonus!!!!:

{ coins: {
type: Number,
default: 0
},
lp: {
type: Number,
default: 0
}
} */
);

const User = model("User", userSchema);
const User = mongoose.model("User", userSchema);

module.exports = User;
Loading