ការកែប្រែ​ទិន្នន័យ​នៃ​ការផ្សាយ​ត្រូវ​ធ្វើ​ឡើង​ជា​ពីរ​ដំណាក់កាល​។ ដំណាក់កាល​ទី​មួយ​គឺ​ការស្រង់​​យក​ទិន្នន័យ​ដែល​ត្រូវ​កែប្រែមក​ដាក់​បង្ហាញ​នៅ​លើ​​ទំព័រ​ការផ្សាយ​។ ដំណាក់កាល​ទី​ពីរ​គឺ​ការកែប្រែ​ទិន្នន័យ​និង​បញ្ជូន​ទិន្នន័យ​នេះ​ទៅ​ជំនួស​ទិន្នន័យ​ចាស់​នៅ​ក្នុង​មូលដ្ខាន​ទិន្នន័យ​ 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()

 

Netlify: https://khmerweb-dynamic-blog.netlify.app/admin

GitHub: https://github.com/Sokhavuth/dynamic-blog