123 lines
No EOL
4 KiB
JavaScript
123 lines
No EOL
4 KiB
JavaScript
import express from "express";
|
|
import mustache from "mustache";
|
|
import bodyParse from "body-parser";
|
|
import { readdirSync, readFileSync } from "fs";
|
|
import { MongoClient } from "mongodb";
|
|
import { ObjectId } from "mongodb";
|
|
|
|
const app = express();
|
|
app.use(express.static("./static"));
|
|
app.use(bodyParse.urlencoded({ extended: true }));
|
|
app.use(bodyParse.json());
|
|
const port = 9889;
|
|
|
|
const templates = new Map(readdirSync("./templates").map(fn => [fn, readFileSync(`./templates/${fn}`, "utf-8")]));
|
|
|
|
/** @type {MongoClient} */
|
|
const client = await MongoClient.connect("mongodb://127.0.0.1:27017/weit_db?directConnection=true&serverSelectionTimeoutMS=2000&appName=weit");
|
|
const announcements = client.db().collection("announcements");
|
|
try { await announcements.createIndex({ text: "text" }); } catch (e) { }
|
|
|
|
app.get("/", (req, res) => {
|
|
res.send(mustache.render(templates.get("mainPage.html")));
|
|
});
|
|
|
|
app.get("/createAnnouncement", (req, res) => {
|
|
res.send(mustache.render(templates.get("createAnnouncementPage.html")));
|
|
});
|
|
|
|
app.get("/:announcementID", (req, res) => {
|
|
res.send(mustache.render(templates.get("announcementPage.html"), { anid: req.params.announcementID }));
|
|
});
|
|
|
|
app.get("/api/announcements", async (req, res) => {
|
|
res.send({
|
|
count: await announcements.countDocuments(),
|
|
announcements: await (async () => {
|
|
let out = [];
|
|
await announcements.find().forEach(anmnt => out.push(anmnt));
|
|
return out;
|
|
})()
|
|
});
|
|
});
|
|
|
|
app.get("/api/announcement/:announcementID", async (req, res) => {
|
|
let announcement = { ok: false };
|
|
try {
|
|
announcement = await announcements.findOne({ _id: ObjectId(req.params.announcementID) });
|
|
announcement.ok = true;
|
|
} catch (e) { console.error(e); }
|
|
|
|
res.send(announcement);
|
|
});
|
|
|
|
app.put("/api/announcement", async (req, res) => {
|
|
const { title, text, phone } = req.body;
|
|
let result = { ok: false };
|
|
if (title === undefined || text === undefined || phone === undefined) {
|
|
result["error"] = "Empty input data!";
|
|
} else {
|
|
result["announcementId"] = (await announcements.insertOne({
|
|
title, text, phone
|
|
})).insertedId;
|
|
result.ok = true;
|
|
}
|
|
res.send(result);
|
|
});
|
|
|
|
app.delete("/api/announcements/:announcementID", async (req, res) => {
|
|
let result = { ok: false };
|
|
try {
|
|
result = await announcements.deleteOne({ _id: ObjectId(req.params.announcementID) });
|
|
result.ok = true;
|
|
} catch (e) { console.error(e); result["error"] = `Exception: ${e}`; }
|
|
|
|
res.send(result);
|
|
});
|
|
|
|
app.patch("/api/announcements/:announcementID", async (req, res) => {
|
|
let result = { ok: false };
|
|
const { title, text, phone } = req.body;
|
|
if (title === undefined && text === undefined && phone === undefined) {
|
|
result["error"] = "Empty input data!";
|
|
} else {
|
|
try {
|
|
let mod = {};
|
|
if (title) {
|
|
mod["title"] = title;
|
|
}
|
|
if (text) {
|
|
mod["text"] = text;
|
|
}
|
|
if (phone) {
|
|
mod["phone"] = phone;
|
|
}
|
|
await announcements.updateOne({ _id: ObjectId(req.params.announcementID) }, { $set: mod });
|
|
result.ok = true;
|
|
} catch (e) { console.error(e); result["error"] = `Exception: ${e}`; }
|
|
}
|
|
|
|
res.send(result);
|
|
});
|
|
|
|
app.post("/api/search", async (req, res) => {
|
|
let result = { ok: false };
|
|
const { text } = req.body;
|
|
if (text === undefined) {
|
|
result["error"] = "Empty search!";
|
|
} else {
|
|
try {
|
|
let searchResults = await (async () => {
|
|
let out = [];
|
|
await announcements.find({ $text: { $search: text } }).forEach(anmnt => out.push(anmnt));
|
|
return out;
|
|
})();
|
|
result["result"] = searchResults;
|
|
result.ok = true;
|
|
} catch (e) { console.error(e); result["error"] = `Exception: ${e}`; }
|
|
}
|
|
|
|
res.send(result);
|
|
});
|
|
|
|
app.listen(port, () => console.log(`⚡️ Serving on port ${port}`)); |