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
8 changes: 0 additions & 8 deletions mailing-list-api/mailing-lists.js

This file was deleted.

9 changes: 8 additions & 1 deletion mailing-list-api/package.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
{
"name": "@module-node/mailing-list-api",
"type": "module",
"version": "1.0.0",
"license": "CC-BY-SA-4.0",
"description": "You must update this package",
"scripts": {
"start": "nodemon src/server.js",
"test": "jest"
},
"repository": {
Expand All @@ -15,6 +17,11 @@
},
"homepage": "https://github.com/CodeYourFuture/CYF-Coursework-Template#readme",
"devDependencies": {
"jest": "^26.6.3"
"jest": "^26.6.3",
"nodemon": "^3.1.0"
},
"dependencies": {
"dotenv": "^16.4.5",
"express": "^4.19.2"
}
}
19 changes: 19 additions & 0 deletions mailing-list-api/src/app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import express from "express";
import cors from "cors";
import readFileMiddleware from "./middlewares/readFileMiddleware.js";
import { resolveFilePath } from "./utils/resolveFilePath.js";
import allListRouter from "./routers/allListRoute.js";

const app = express();

app.use(express.json());
app.use(cors());

app.get("/", (req, res) => {
res.send(
'please go to \n/list ---> for all group names \n/list/:name ---> for mail list of a group of members\nyou can delete or update a group as well \n(please provide group name and members for update method as below)\n ---> {"name": "group-name","members": ["me@me.com", ...]}'
);
});
app.use("/lists", readFileMiddleware(resolveFilePath()), allListRouter);

export { app };
17 changes: 17 additions & 0 deletions mailing-list-api/src/data/mailing-lists.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"staff": [
"talea@techtonica.org",
"michelle@techtonica.org"
],
"cohort-h1-2020": [
"ali@techtonica.org",
"humail@techtonica.org",
"khadar@techtonica.org"
],
"my-new-list": [
"me@me.com.uk"
],
"test1": [
"me@me.com"
]
}
14 changes: 14 additions & 0 deletions mailing-list-api/src/middlewares/readFileMiddleware.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import fs from "fs";

const readFileMiddleware = (absoluteFilePath) => (req, res, next) => {
fs.readFile(absoluteFilePath, "utf8", (err, data) => {
if (err) {
return next(err);
}
const lists = new Map(Object.entries(JSON.parse(data)));
req.fileContent = lists;
next();
});
};

export default readFileMiddleware;
62 changes: 62 additions & 0 deletions mailing-list-api/src/routers/allListRoute.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import { Router } from "express";
import { resolveFilePath } from "../utils/resolveFilePath.js";
import writeFile from "../utils/writeFile.js";

const router = Router();

router.get("/", (req, res) => {
const lists = req.fileContent;
const keys = Array.from(lists.keys());

if (lists.size === 0) {
res.status(200).json([]);
}

res.status(200).json(keys);
});

router.get("/:name", (req, res) => {
const lists = req.fileContent;
const requestedName = req.params.name;
const requestedValue = lists.get(requestedName);

if (!requestedValue) {
res.status(404).send("no such member");
}

res.status(200).json({ [requestedName]: requestedValue });
});

router.delete("/:name", (req, res) => {
const lists = req.fileContent;
const deletingName = req.params.name;
const isDeleted = lists.delete(deletingName);

if (!isDeleted) {
res.status(404).send("no such member");
}

const newObjectForWriting = Object.fromEntries(lists);
writeFile(newObjectForWriting, resolveFilePath());

res.status(200).send("member deleted");
});

router.put("/:name", (req, res) => {
const lists = req.fileContent;
const newName = req.body.name;
const newMembers = req.body.members;
lists.set(newName, newMembers);

if (!newName.trim() || !newMembers || !Array.isArray(newMembers) || !(newMembers.length > 0)) {
res.status(404).send("can not add member");
}

const newObjectForWriting = Object.fromEntries(lists);

writeFile(newObjectForWriting, resolveFilePath());

res.status(200).send("new member added");
});

export default router;
9 changes: 9 additions & 0 deletions mailing-list-api/src/server.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { app } from "./app.js";
import dotenv from "dotenv";

dotenv.config();
const PORT = parseInt(process.env.PORT || "3000");

app.listen(PORT, () => {
console.log(`app is listening on port ${PORT}`);
});
8 changes: 8 additions & 0 deletions mailing-list-api/src/utils/resolveFilePath.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import path from "path";
import { fileURLToPath } from "url";

export const resolveFilePath = () => {
const relativeFilePath = "./data/mailing-lists.json";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
return path.resolve(__dirname, "..", relativeFilePath);
};
8 changes: 8 additions & 0 deletions mailing-list-api/src/utils/writeFile.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import fs from "fs";

const writeFile = (data, path) => {
const jsonData = JSON.stringify(data, null, 2);
fs.writeFileSync(path, jsonData);
};

export default writeFile;
Loading