ការកែប្រែទិន្នន័យនៃការផ្សាយត្រូវធ្វើឡើងជាពីរដំណាក់កាល។ ដំណាក់កាលទីមួយគឺការស្រង់យកទិន្នន័យដែលត្រូវកែប្រែមកដាក់បង្ហាញនៅលើទំព័រការផ្សាយ។ ដំណាក់កាលទីពីរគឺការកែប្រែទិន្នន័យនិងបញ្ជូនទិន្នន័យនេះទៅជំនួសទិន្នន័យចាស់នៅក្នុងមូលដ្ខានទិន្នន័យ MongoDB ។
យើងបានដឹងរួចមកហើយថា ការស្រង់យកទិន្នន័យណាមួយ គឺត្រូវធ្វើឡើងតាមរយៈអត្តសញ្ញាណ id ដែលនឹងត្រូវជាផ្នែកមួយនៃផ្លូវឌីណាមិក។ ដូចនេះ យើងអាចកំណត់ផ្លូវឌីណាមិកមួយដែលមានអត្តសញ្ញាណ id របស់ទិន្នន័យនៃការផ្សាយនិមួយៗដូចខាងក្រោមនេះ៖
<!--src/pages/admin/post/[id].astro-->
---
import Base from "../../../layouts/admin/Base.astro"
import Post from "../../../layouts/admin/Post.astro"
const { userAuth, prisma, setting } = Astro.locals
if(!userAuth?.userId){ return Astro.redirect('/login') }
const params = Astro.params
import post from "../../../data/post.js"
const total = await post.count({prisma})
const items = await post.getItems({prisma}, setting.adminItems)
const items_ = items.map((item)=>{item.date = new Date(item.date).toLocaleDateString('it-IT');
return item })
const item_ = await post.getItem({prisma, params})
---
<Base pageTitle="ទំព័រកែប្រែ" total={total} items={items_} type="post">
<Post item={item_}/>
</Base>
ក្រោយពីត្រូវបានកែប្រែរួចហើយ ទិន្នន័យនៃការផ្សាយអាចត្រូវបញ្ជូនទៅជំនួសទិន្នន័យចាស់នៅក្នុងមូលដ្ឋានទិន្នន័យ MongoDB ដោយប្រើប្រាស់ក្បួនចុងផ្លូវឬ API Endpoint ដែលនៅក្នុងនោះមានការនាំចូលយកក្បួនខ្នាតនៃឯកសារ post.js នៅក្នុងថត src/data មកប្រើប្រាស់។ ក៏ប៉ុន្តែមុននឹងបញ្ជូនទិន្នន័យដែលត្រូវបានកែប្រែនេះទៅកាន់មូលដ្ឋានទិន្នន័យ ចាំបាច់ត្រូវត្រួតពិនិត្យមើលថា តើអ្នកកែប្រែទិន្នន័យនេះមានសិទ្ធិក្នុងការកែប្រែទិន្នន័យដែរឬទេ។ ការត្រួតពិនិត្យត្រូវធ្វើឡើងដោយពិនិត្យមើលតួនាទីរបស់អ្នកកែប្រែ បើអ្នកនោះគ្មានសិទ្ធិទេ ទិន្នន័យនឹងត្រូវចាត់ទុកជាមោឃៈ គឺគ្មានការបញ្ជូនទិន្នន័យនេះទៅមូលដ្ឋានទិន្នន័យឡើយ។
មួយវិញទៀត អ្នកនិពន្ធទាំងឡាយដែលមានតួនាទីត្រឹមតែជា «Author» នឺងមានសិទ្ធិកែប្រែតែការផ្សាយទាំងឡាយដែលត្រូវបានតែងនិពន្ធដោយខ្លួនគេផ្ទាល់តែប៉ុណ្ណោះ ពួកគេនឹងមិនអាចកែប្រែអត្ថបទនៃការផ្សាយរបស់អ្នកដទៃបានឡើយ។ មានតែអ្នកនិពន្ធដែលមានតួនាទីជា « Admin» ប៉ុណ្ណោះ ដែលមានសិទ្ធិកែប្រែអត្ថបទនៃការផ្សាយណាក៏បាន។
ការបញ្ចូលទិន្នន័យកែប្រែថ្មីទៅក្នុងមូលដ្ឋានទិន្នន័យ MongoDB ត្រូវធ្វើឡើងនៅក្នុងក្បួនចុងផ្លូវឬ API Endpoint នៅក្នុងថត src/pages/api/admin/post/update ។
// src/pages/api/admin/post/update/[id].js
import post from "../../../../../data/post.js"
export async function POST({ locals, redirect, params, request}){
const userAuth = locals.userAuth
const prisma = locals.prisma
if(userAuth?.userId){
if(userAuth.userRole !== "Guest"){
const data = await request.formData()
const title = data.get('title')
const content = data.get('content')
const categories = data.get('categories')
const thumb = data.get('thumb')
const datetime = data.get('datetime')
const videos = data.get('videos')
if(title && categories && thumb && datetime){
const body = {title, content, categories, thumb, datetime, videos}
if(userAuth.userRole === "Admin"){
await post.update({ prisma, body, params })
}else if(userAuth.userRole === "Author"){
const item = await post.getItem({prisma, params})
if(userAuth.userId === item.userid){
await post.update({ prisma, body, params })
}
}
}
}
return redirect("/admin", 302)
}
return redirect('/login', 302)
}
// src/data/post.js
class Post{
async count(req, query={}){
return await req.prisma.post.count(query)
}
async create(req){
const categories = req.body.categories
let Categories = []
if(categories.includes(',')){
let str = categories.replace(/\s+/g, "")
Categories = str.split(',')
}else{
Categories = [categories]
}
const new_post = {
title: req.body.title,
content: req.body.content,
categories: Categories,
thumb: req.body.thumb,
date: req.body.datetime,
videos: req.body.videos,
userid: req.userAuth.userId,
}
await req.prisma.post.create({ data: new_post })
}
async getItems(req, amount){
return await req.prisma.post.findMany({
take: amount,
orderBy: [{ date: "desc" }, { id: "desc" }]
})
}
async getItem(req){
return await req.prisma.post.findUnique({ where: {id: req.params.id }})
}
async delete(req){
await req.prisma.post.delete({ where: {id: req.params.id } })
}
async update(req){
const categories = req.body.categories
let Categories = []
if(categories.includes(',')){
let str = categories.replace(/\s+/g, "")
Categories = str.split(',')
}else{
Categories = [categories]
}
let newvalue = {
title: req.body.title,
content: req.body.content,
categories: Categories,
thumb: req.body.thumb,
date: req.body.datetime,
videos: req.body.videos
}
await req.prisma.post.update({ where: {id: req.params.id }, data: newvalue })
}
}
export default new Post()