diff --git a/README.md b/README.md index f8d50a3..cb27249 100644 --- a/README.md +++ b/README.md @@ -55,10 +55,11 @@ Akf-forum has got an API for AJAX (fetch), other clients etc. And, you can learn - delete admin??? - change category name - _id -- add support for transition aroun gravatar +- add support for transition around gravatar +- forum setup page++ ### theme to do: -- theme change +- add bootstrap for navbar - routes/api/routes/users.js check, themes/default/extra/footer.ejs check, themes/default/extra/meta.ejs check diff --git a/index.js b/index.js index bc80f87..a870cb0 100644 --- a/index.js +++ b/index.js @@ -9,6 +9,7 @@ const app = express(), { mw: IP } = require('request-ip'), { RL } = require('./lib'), + { themes } = require("./config.json"), SES = require('express-session'), MS = require("connect-mongo"), DB = mongoose.connect(process.env.MONGO_DB_URL) @@ -33,10 +34,14 @@ app.use(express.static("public"), express.json(), express.urlencoded({ extended: res.reply = (page, options = {}, status = 200) => res.status(status).render(page, { + dataset: { + themes, + theme: req.user?.theme || def_theme, + forum_name, + description + }, user: req.user, - theme: req.user?.theme || def_theme, - lang: req.user?.theme?.language || def_theme.language, - forum_name, description, ...options + ...options }); diff --git a/routes/api/routes/users.js b/routes/api/routes/users.js index 820b5e8..ba80aba 100644 --- a/routes/api/routes/users.js +++ b/routes/api/routes/users.js @@ -1,7 +1,7 @@ const { UserModel, BanModel } = require("../../../models"); const { Router } = require("express"); const multer = require("multer"); - +const { themes } = require("../../../config.json") const app = Router(); app.param("id", async (req, res, next, id) => { @@ -37,7 +37,7 @@ app.patch("/:id", async (req, res) => { if (req.user.id !== member.id && !user.admin) return res.error(403, "You have not got permission for this."); if (!Object.keys(req.body).some(Boolean)) return res.error(400, "Missing member informations in request body."); - const { name, about, admin, deleted, hideLastSeen } = req.body; + const { name, about, admin, deleted, hideLastSeen, theme } = req.body; if ((admin?.length || "deleted" in req.body) && !req.user.admin) return res.error(403, "You have not got permission for edit 'admin' and 'deleted' information, or bad request."); const { names, desp } = req.app.get("limits"); @@ -51,7 +51,8 @@ app.patch("/:id", async (req, res) => { if (about.length > desp) return res.error(400, `About must be under ${desp} characters`); member.about = about; } - // if (theme || themes.includes(theme)) member.theme = theme; + if (theme || themes.some(t => t.name === theme.name).includes(theme)) + member.theme = theme; if (typeof admin === "boolean" || ["false", "true"].includes(admin)) member.admin = admin; if (deleted === false) member.deleted = false; @@ -78,7 +79,6 @@ app.post("/:id/ban", async (req, res) => { res.complate(member); }); - const storage = multer.diskStorage({ destination: function (_req, _file, cb) { cb(null, './public/images/avatars') @@ -90,7 +90,7 @@ const storage = multer.diskStorage({ const upload = multer({ storage }) -app.put("/:id/", upload.single('avatar'), async (req, res) => { +app.post("/:id/avatar", upload.single('avatar'), async (req, res) => { const { member } = req; if (req.user.id !== member.id && !req.user.admin) return res.error(403, "You have not got permission for this."); diff --git a/routes/register.js b/routes/register.js index 1fc393b..1640c0e 100644 --- a/routes/register.js +++ b/routes/register.js @@ -10,31 +10,32 @@ app.post("/", RL(24 * 60 * 60_000, 5), async (req, res) => { req.session.userID = null; - let { name, password, about } = req.body; + let { name, password, about, email } = req.body; - if (!name || !password) return res.error(400, "You forgot entering some values"); + if (!name || !password || !email) return res.error(400, "You forgot entering some values"); + if (!email || !emailRegEx.test(email)) return res.error(400, "E-mail is not valid"); const { names } = req.app.get("limits"); if (name.length < 3 || name.length > names) return res.error(400, "Name must be between 3 - 25 characters"); if (password.length < 3 || password.length > names) return res.error(400, "Password must be between 3 - 25 characters"); if (await UserModel.exists({ name })) return res.error(400, `We have got an user named ${name}!`) - const user = new UserModel({ name }); + if (await UserModel.exists({ email })) return res.error(400, "E-mail is already in use"); - user.avatar = getGravatar(name, 128); + const user = new UserModel({ name, email }); + user.avatar = getGravatar(email, 128); + if (about) { if (about.length > 256) return res.error(400, "about must be under 256 characters"); user.about = about; } - await user.takeId() + await user.takeId(); + if (user.id === "0") user.admin = true; else if (email_auth) { - const email = req.body.email; - if (!email || !emailRegEx.test(email)) return res.error(400, "E-mail is not valid"); - if (await UserModel.exists({ email })) return res.error(400, "E-mail is already in use"); - user.email = email; + user.email_code = await bcrypt.hash(`${Date.now()}-${Math.floor(Math.random() * 1e20)}`, 10) transporter.sendMail({ diff --git a/views/avatar_upload.ejs b/views/avatar_upload.ejs index e23deac..6ba598c 100644 --- a/views/avatar_upload.ejs +++ b/views/avatar_upload.ejs @@ -16,8 +16,8 @@ form.addEventListener('submit', async e => { e.preventDefault(); - const res = await fetch('/api/users/<%= member.id %>/', { - method: 'PUT', + const res = await fetch('/api/users/<%= member.id %>/avatar', { + method: 'POST', body: new FormData(form) }) if (res.error) return alert(res.error); diff --git a/views/extra/footer.ejs b/views/extra/footer.ejs index b363a4c..54afb4a 100644 --- a/views/extra/footer.ejs +++ b/views/extra/footer.ejs @@ -1,29 +1,33 @@ \ No newline at end of file diff --git a/views/extra/meta.ejs b/views/extra/meta.ejs index eae50be..148c497 100644 --- a/views/extra/meta.ejs +++ b/views/extra/meta.ejs @@ -1,9 +1,9 @@ - <%= title || forum_name +"-forum" %> - + <%= title || dataset.forum_name +"-forum" %> + - + \ No newline at end of file diff --git a/views/extra/navbar.ejs b/views/extra/navbar.ejs index 7b93e5a..b5f8dc5 100644 --- a/views/extra/navbar.ejs +++ b/views/extra/navbar.ejs @@ -1,13 +1,12 @@ <% if (user?.admin){ %>
- You are admin, and you can go your page! + Click here to reach admin panel
- <% } %>
- +
<% if (user){ %> diff --git a/views/index.ejs b/views/index.ejs index de069fc..e6b285f 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -1,7 +1,7 @@ -<%- include("extra/meta", {title: "Welcome to the "+forum_name+"-forum!" }) %> +<%- include("extra/meta", {title: "Welcome to the "+dataset.forum_name+"-forum!" }) %> diff --git a/views/register.ejs b/views/register.ejs index 78ffc84..cb0016d 100644 --- a/views/register.ejs +++ b/views/register.ejs @@ -15,9 +15,7 @@
- <% if (mail) { %> - <% } %>