
Оглавление
Sokhavuth TIN ・ Aug 11 ・ 2 min read
GitHub: https://github.com/Sokhavuth/opine-job
Deno Deploy: https://khmerweb-job.deno.dev/users/post
Мы уже знаем, что мы можем использовать различные HTTP методы с различными обработчиками для одного маршрута, чтобы получить различный результат в соответствии с нашими потребностями. Например, мы можем использовать метод HTTP GET с маршрутом «/users/post» для отображения страницы постинга в приборной панели, и мы собираемся использовать метод HTTP POST с тем же маршрутом «/users/post» для создания и вставки элемента поста в базу данных MongoDB.
Поскольку задача создания и вставки поста в базу данных зарезервирована только для зарегистрированного пользователя, нам нужно защитить этот маршрут «/users/post», проверяя, кто пытается использовать этот маршрут, чтобы увидеть, аутентифицирован он/она или нет.
// routes/users/post.js
import { Router } from "../../deps.ts";
const router = new Router();
import post from "../../controllers/users/post.js"
router.get("/", async (req, res) => {
if(await req.mysession.get("user")){
post.getPage(req, res);
}else{
res.redirect("/users");
}
});
router.post("/", async (req, res) => {
if(await req.mysession.get("user")){
post.createPost(req, res);
}else{
res.redirect("/users");
}
})
export default router;
// controllers/users/post.js
import post from "../../views/users/post.jsx";
import postdb from "../../models/post.ts";
class Post{
async getPage(req, res){
const config = req.mysetting();
config.page_title = "Post Page";
config.route = "/users/post";
config.username = (await req.mysession.get("user")).title;
const html = await post(config);
res.send(html);
}
async createPost(req, res){
if((await req.mysession.get("user")).role in {'Admin':1,'Editor':1,'Author':1}){
await postdb.createPost(req);
}
res.redirect("/users/post");
}
}
export default new Post();
// models/post.ts
interface PostSchema {
_id: ObjectId;
id: string;
title: string;
content: string;
categories: string[];
thumb: string;
date: string;
userid: string;
}
class Post{
async count(req, query={}){
const posts = req.mydb.collection<PostSchema>("posts");
return await posts.countDocuments(query);
}
async createPost(req){
const id = crypto.randomUUID();
let categories: string[];
if(req.body.categories.includes(',')){
categories = req.body.categories.split(',');
}else{
categories = [req.body.categories]
}
const new_post = {
id: id,
title: req.body.title,
content: req.body.content,
categories: categories,
thumb: req.body.thumb,
date: req.body.datetime,
userid: (await req.mysession.get("user")).id,
}
const posts = req.mydb.collection<PostSchema>("posts")
await posts.insertOne(new_post)
}
}
export default new Post();