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
102 changes: 102 additions & 0 deletions database/local_backend/controllers/authController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
const {
validateRegisterInput
} = require("../validators/authValidator");

const {
successResponse,
errorResponse
} = require("../utils/responseFormatter");

// Temporary in-memory users array
// Replace with Firebase/SQLite later if needed
const users = [];

const registerUser = async (req, res) => {
try {

const {
name,
email,
password
} = req.body;

// Validation
const validationErrors =
validateRegisterInput({
name,
email,
password
});

if (validationErrors.length > 0) {
return res.status(400).json(
errorResponse(
"Validation failed",
validationErrors
)
);
}

// Duplicate email check
const existingUser = users.find(
user =>
user.email.toLowerCase() ===
email.toLowerCase()
);

if (existingUser) {
return res.status(409).json(
errorResponse(
"Email already exists",
[
"A user with this email is already registered"
]
)
);
}

// Create user
const newUser = {
id: Date.now().toString(),
name: name.trim(),
email: email.toLowerCase().trim(),
password,
createdAt: new Date().toISOString()
};

users.push(newUser);

// Success response
return res.status(201).json(
successResponse(
"User registered successfully",
{
id: newUser.id,
name: newUser.name,
email: newUser.email,
createdAt: newUser.createdAt
}
)
);

} catch (error) {

console.error(
"Register endpoint error:",
error
);

return res.status(500).json(
errorResponse(
"Internal server error",
[
"Something went wrong while registering the user"
]
)
);
}
};

module.exports = {
registerUser
};
44 changes: 44 additions & 0 deletions database/local_backend/middleware/errorLogger.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
const errorLogger = (
err,
req,
res,
next
) => {

console.error(
"========== API ERROR =========="
);

console.error(
"Time:",
new Date().toISOString()
);

console.error(
"Method:",
req.method
);

console.error(
"Endpoint:",
req.originalUrl
);

console.error(
"Error:",
err.message
);

console.error(
"================================"
);

// Send clean response
res.status(500).json({
success: false,
message: "Internal server error"
});

};

module.exports = errorLogger;
22 changes: 22 additions & 0 deletions database/local_backend/middleware/loggerMiddleware.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
const loggerMiddleware = (req, res, next) => {
const timestamp = new Date().toISOString();

const sanitizedBody = {
...req.body
};

if (sanitizedBody.password) {
sanitizedBody.password = "HIDDEN";
}

console.log("========== API REQUEST ==========");
console.log("Time:", timestamp);
console.log("Method:", req.method);
console.log("Endpoint:", req.originalUrl);
console.log("Request Body:", sanitizedBody);
console.log("=================================");

next();
};

module.exports = loggerMiddleware;
24 changes: 24 additions & 0 deletions database/local_backend/routes/authRoutes.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
const express = require("express");

const {
registerUser
} = require("../controllers/authController");

const router = express.Router();

// Register endpoint
router.post("/register", registerUser);

// Test error endpoint for TEST002 logging verification
// This route intentionally throws an error so error logging can be verified.
router.get("/test-error", (req, res, next) => {

const error = new Error(
"Simulated backend failure"
);

next(error);

});

module.exports = router;
4 changes: 3 additions & 1 deletion database/local_backend/scanPipeline.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@ const config = require("./config");
const { addToQueue } = require("./syncQueue");
const { processQueue, resolveConflict } = require("./syncService");


const {
getProductByBarcode,
searchByName
} = require("../pipeline/barcode_mapper");


const PIPELINE_VERSION = config.pipeline.version;

const NUTRITION_LIMITS = {
Expand Down Expand Up @@ -468,4 +470,4 @@ if (require.main === module) {
.catch((error) => {
console.error("Reconnect sync failed:", error.message);
});
}

39 changes: 39 additions & 0 deletions database/local_backend/server.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
const express = require("express");

const authRoutes =
require("./routes/authRoutes");

const loggerMiddleware =
require("./middleware/loggerMiddleware");

const errorLogger =
require("./middleware/errorLogger");

const app = express();

// Middleware
app.use(express.json());
app.use(express.urlencoded({
extended: true
}));

// Request logger
app.use(loggerMiddleware);

// Routes
app.use("/api/auth", authRoutes);

// Error logger middleware
app.use(errorLogger);

// Server Port
const PORT = 3000;

// Start server
app.listen(PORT, () => {

console.log(
`Server running on port ${PORT}`
);

});
20 changes: 20 additions & 0 deletions database/local_backend/utils/responseFormatter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
const successResponse = (message, data = {}) => {
return {
success: true,
message,
data
};
};

const errorResponse = (message, errors = []) => {
return {
success: false,
message,
errors
};
};

module.exports = {
successResponse,
errorResponse
};
36 changes: 36 additions & 0 deletions database/local_backend/validators/authValidator.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
const validateRegisterInput = ({ name, email, password }) => {
const errors = [];

// Name validation
if (!name || name.trim() === "") {
errors.push("Name is required");
}

// Email validation
if (!email || email.trim() === "") {
errors.push("Email is required");
}

// Email format validation
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

if (email && !emailRegex.test(email)) {
errors.push("Invalid email format");
}

// Password validation
if (!password || password.trim() === "") {
errors.push("Password is required");
}

// Password length validation
if (password && password.length < 6) {
errors.push("Password must be at least 6 characters long");
}

return errors;
};

module.exports = {
validateRegisterInput
};
Loading