From 9012d03515bbed8c859da3a6001516a9c674d380 Mon Sep 17 00:00:00 2001
From: schooltechx
Date: Sat, 8 Apr 2023 11:27:09 +0700
Subject: [PATCH] Clean data and update mockup api spec
---
cms/README.md | 44 ++++++++++-----
cms/src/lib/data/CMSDataType.ts | 16 +++---
cms/src/lib/data/competitive-exam.json | 38 ++++++++-----
cms/src/lib/data/qualify-exam.json | 62 +++++++++++++++-------
cms/src/routes/+layout.svelte | 1 -
cms/src/routes/+page.server.ts | 7 ++-
cms/src/routes/+page.svelte | 12 ++---
cms/src/routes/api/competitive/+server.ts | 19 +++++--
cms/src/routes/api/dev/+server.ts | 8 +++
cms/src/routes/api/info/+server.ts | 5 +-
cms/src/routes/api/qualifying/+server.ts | 19 +++++--
cms/src/routes/competitive/+page.server.ts | 8 +--
cms/src/routes/qualifying/+page.server.ts | 9 ++--
13 files changed, 171 insertions(+), 77 deletions(-)
create mode 100644 cms/src/routes/api/dev/+server.ts
diff --git a/cms/README.md b/cms/README.md
index 4314ce4..82ac946 100644
--- a/cms/README.md
+++ b/cms/README.md
@@ -1,9 +1,7 @@
# เวปประกาศข่าว (CMS TOR 6.6.4)
การพัฒนาแบบที่เป็นอยู่ Vue(SPA)+dotnet(Web API) ของบริษัทไม่ได้รองรับ SEO เท่าใดนัก จำเป็นต้องใช้ Meta Framework ที่รองรับ SSR เช่น Nuxt.js เนื่องจากไม่ขึ้นกับส่วนอื่นมากนัก จะทดลองใช้เทคโนโลยีแบบใหม่ๆในการพัฒนา ที่ง่ายในการพัฒนากว่าเดิมจะ SvelteKit เป็นฐาน Daisy UI และ Daisy UI สำหรับการทำ Frontend และจะนำเครื่องมือในการ Automate ต่างๆมาร่วมด้วย
-- [Sveltekit](https://www.youtube.com/watch?v=uEJ-Rnm2yOE) Meta JS Framework รองรับ SSR เขียนง่าย
+- [Sveltekit](https://www.youtube.com/watch?v=uEJ-Rnm2yOE) Meta JS Framework รองรับ SSR เขียนง่าย ทำ Frontend และ Backend (API) ได้ในตัวเดียว
- [TailWindCSS](https://tailwindcss.com/) ติดตั้งด้วย [svelte-add](https://github.com/svelte-add/tailwindcss)
-- [marked](https://marked.js.org/) รองรับ Markdown สำหรับเนื้อหาที่ซับซ้อน
--
- [Daisy UI ](https://daisyui.com/) UI Component ที่ใช้ TailWindCSS ใช้ได้ไม่จำกัด Framework มีวิธีการใช้ดูใน[ลิงค์นี้](https://github.com/schooltechx/youtube/blob/main/svelte/component/DaisyUI.md)
- [PWA](https://web.dev/progressive-web-apps/) ทำให้ Web App เหมือนแอปมือถือ
- [Playwright](https://playwright.dev/) เขียนโค้ดทำการทดสอบเวปแอปบน Browser
@@ -11,7 +9,8 @@
- [GitHub Actions](https://github.com/features/actions) ทำ CI/CD ในระบบทดสอบ
- [nektos/act](https://github.com/nektos/act) ใช้ GitHub Actions บนเครื่องของเราเอง
- [Argo CD](https://argo-cd.readthedocs.io/en/stable/) deploy ขึ้นระบบ Production (K8s)
-- [FullCalendar](https://github.com/schooltechx/youtube/blob/main/svelte/component/FullCalendar.md) รองรับพ.ศ. ใช้แค่ฟีเจอร์[ฟรีก็น่าจะพอ](https://fullcalendar.io/license#:~:text=or%20FullCalendar%20Premium.-,FullCalendar%20Standard,all%20copyright%20headers%20are%20preserved.)
+- [FullCalendar](https://github.com/schooltechx/youtube/blob/main/svelte/component/FullCalendar.md) รองรับพ.ศ. ใช้แค่ฟีเจอร์[ฟรีก็น่าจะพอ](https://fullcalendar.io/license#:~:text=or%20FullCalendar%20Premium.-,FullCalendar%20Standard,all%20copyright%20headers%20are%20preserved.)
+- [Day.js](https://day.js.org/) ในฟอร์แม็ตวันในรูปแบบ local ไทยรองรับ พ.ศ.
## วีดีโอแสดงการทำงานทั้งหมด
[](https://youtu.be/7CER67WVWec "Automate Development")
@@ -21,26 +20,27 @@
## Install
คำสั่งสำหรับเริ่มต้นสร้างโปรเจ็กเปล่าๆ จนใช้งาน
``` bash
-# เลือก Skeleton project,Typescript แล้ว ติดตั้งทั้งหมด
+# สร้างโปรเจ็ก SvelteKit เลือก Skeleton project,Typescript แล้ว ติดตั้งทั้งหมด
npm create svelte@latest cms-recruit
cd cms-recruit
npm install
-# ติดตั้ง Mdsvex
-npm i --save-dev mdsvex
# ติดตั้ง Tailwindcss พร้อมเซ็ตค่าให้เรียบร้อย
npx svelte-add@latest tailwindcss
# เมื่อติดตั้ง daisyui ให้ดูวิธีการตั้งค่าเพิ่มจากในเวป
npm i daisyui
# ใช้สำหรับทำเป็น Node.js ทำ Docker Image
npm i -D @sveltejs/adapter-node
-# Keycloak สำหรับ frontend และ backend
-npm i -D keycloak-js keycloak-backend
+# Day.js
+npm i dayjs
+# FullCalendar
+npm i @fullcalendar/core
+npm i @fullcalendar/daygrid
+npm i @fullcalendar/interaction
# ช่วยทำ seo ให้ง่ายขึ้น
npm install -D svelte-seo
```
-
## Sveltekit
-คำสั่งที่ใช้
+คำสั่งที่ใช้รันโปรเจ็ก
``` bash
npm run dev -- --port=4000 --host=0.0.0.0
npm run build
@@ -53,9 +53,25 @@ npx vite preview --port=4000 --host=0.0.0.0
โครงสร้างโค้ด
- หน้าเวปอยู่ใน [src/routes/](src/routes/) โครงหน้าหลัก +layout.svelte,หน้าต่างๆ +page.svelte
- library/component ที่ใช้ร่วมกัน [src/lib/](src/lib/)
-ตัวอย่างการใช้ API โค้ดอยู่ใน [src/routes/api/users](./src/routes/api/users/)
-- http://localhost:4000/api/users
-- http://localhost:4000/api/users/1
+สร้าง Mockup API โค้ดอยู่ใน [src/routes/api/](./src/routes/api/)
+เพื่อความเรียบง่ายสไตล์ CMS การดึงค่าจะเรียงจากใหม่ไปเก่าเสมอ มี limit เพื่อลดปริมาณข้อมูล ถ้าไม่มี limit ดึงข้อมูลล่าสุดไปจนถึง Today+12month
+
+ตัวอย่าง endpoint มีดังนี้
+- http://localhost:4000/api/dev
+- http://localhost:4000/api/info
+- http://localhost:4000/api/content?page=home
+- http://localhost:4000/api/content?page=about
+- http://localhost:4000/api/competitive
+- http://localhost:4000/api/competitive?limit=3
+- http://localhost:4000/api/competitive/19
+- http://localhost:4000/api/qualifying
+- http://localhost:4000/api/qualifying?limit=3
+- http://localhost:4000/api/qualifying/21
+
+ถ้าไม่ build เอง ตอนนี้มี demo อยู่ที่ [https://bma-qualifying.frappet.synology.me/](https://bma-qualifying.frappet.synology.me/) ให้เปลี่ยน base url ให้เหมาะสม
+
+Data Type ที่ใช้ดูในไฟล์ [CMSDataType.ts](./src/lib/data/CMSDataType.ts)
+
## Browser Testing
ใช้ Playwright มีคอนฟิกไฟล์ [playwright.config.ts](./playwright.config.ts) โค้ดสำหรับการทดสอบจะอยู่ใน โฟลเดอร์ [tests](./tests/) ใน VS Code จะติดตั้ง Playwright Extension รูปเป็นเหมือนโหลรูปชมพู่สำหรับทดลองวิทยาศาสตร์ ให้กดปุ่มเล่นเพื่อทำการทดสอบ
diff --git a/cms/src/lib/data/CMSDataType.ts b/cms/src/lib/data/CMSDataType.ts
index 2ae720b..e52861f 100644
--- a/cms/src/lib/data/CMSDataType.ts
+++ b/cms/src/lib/data/CMSDataType.ts
@@ -1,14 +1,18 @@
export interface Exam {
id:string;
title:string;
- date:string;
- start?:Date|string;
- end?:Date|string;
- exam_date?:Date|string;
- announcement_date?:Date|string;
+ detail?:string;
+ date?:string;
+ start?:string;
+ end?:string;
+ exam_date?:string;
+ announcement_date?:string;
category_id?:string
category?:string
- img?:string;
+ image?:string;
+ images?:{title:string,url:string}[];
+ files?:{title:string,url:string}[];
+
}
export interface CalendarEvent {
id:string;
diff --git a/cms/src/lib/data/competitive-exam.json b/cms/src/lib/data/competitive-exam.json
index bea42db..ec15d74 100644
--- a/cms/src/lib/data/competitive-exam.json
+++ b/cms/src/lib/data/competitive-exam.json
@@ -1,15 +1,13 @@
[
{
"id":"20",
- "date":"24 เม.ย. 2566 ",
"start":"2023-04-24",
"detail":"ประกาศรายชื่อผู้ผ่านภาค ข. และมีสิทธิสอบภาค ค. ในการคัดเลือกคนพิการ ครั้งที่ 1/2565
",
"title":"ประกาศรายชื่อผู้ผ่านภาค ข. และมีสิทธิสอบภาค ค. ในการคัดเลือกคนพิการ ครั้งที่ 1/2565",
- "img":"/images/c1.jpg",
"images":[
{
- "title":"ภาพ1",
- "url":"https://bma-qualifying.frappet.synology.me/images/c1.jpg"
+ "title":"topic",
+ "url":"/images/c1.jpg"
}
],
"files":[
@@ -49,34 +47,50 @@
},
{
"id":"19",
- "date":"13 เม.ย. 2566",
"start":"2023-04-20T09:00:00",
"detail":"ใครลืมส่งเอกสาร !! สำหรับการคัดเลือกคนพิการฯ ครั้งที่ 1/2565 ส่งเอกสารเพิ่มได้",
"title":"ใครลืมส่งเอกสาร !! สำหรับการคัดเลือกคนพิการฯ ครั้งที่ 1/2565 ส่งเอกสารเพิ่มได้",
- "img":"/images/c2.jpg"
+ "images":[
+ {
+ "title":"topic",
+ "url":"/images/c2.jpg"
+ }
+ ]
},
{
"id":"18",
- "date":"9 เม.ย. 2566",
"start":"2023-03-28T09:00:00",
"detail":"แผนที่การเดินทางมาสนามสอบคนพิการฯ ครั้งที่ 1/2565",
"title":"แผนที่การเดินทางมาสนามสอบคนพิการฯ ครั้งที่ 1/2565",
- "img":"/images/c3.jpg"
+ "images":[
+ {
+ "title":"topic",
+ "url":"/images/c3.jpg"
+ }
+ ]
},
{
"id":"17",
- "date":"28 มี.ย. 2566",
"start":"2023-03-28T09:00:00",
"detail":"การสอบแข่งขันเพื่อรรจุและแต่งตั้งบุคคลเข้ารับราชการเป็นข้าราชการกรุงเทพมหานครสามัญ ครั้งที่ 2/2566",
"title":"การสอบแข่งขันเพื่อรรจุและแต่งตั้งบุคคลเข้ารับราชการเป็นข้าราชการกรุงเทพมหานครสามัญ ครั้งที่ 2/2566",
- "img":"/images/c1.jpg"
+ "images":[
+ {
+ "title":"topic",
+ "url":"/images/c1.jpg"
+ }
+ ]
},
{
"id":"16",
- "date":"10 มี.ค. 2556",
"start":"2023-03-10T09:00:00",
"detail":"การสอบแข่งขันเพื่อรรจุและแต่งตั้งบุคคลเข้ารับราชการเป็นข้าราชการกรุงเทพมหานครสามัญ ครั้งที่ 1/2565",
"title":"การสอบแข่งขันเพื่อรรจุและแต่งตั้งบุคคลเข้ารับราชการเป็นข้าราชการกรุงเทพมหานครสามัญ ครั้งที่ 1/2565",
- "img":"/images/c2.jpg"
+ "images":[
+ {
+ "title":"topic",
+ "url":"/images/c2.jpg"
+ }
+ ]
}
]
\ No newline at end of file
diff --git a/cms/src/lib/data/qualify-exam.json b/cms/src/lib/data/qualify-exam.json
index 7637f93..416c495 100644
--- a/cms/src/lib/data/qualify-exam.json
+++ b/cms/src/lib/data/qualify-exam.json
@@ -1,14 +1,23 @@
[
{
"id":"21",
- "date":"24 เม.ย. 2566","institute":"สำนักงาน ก.ก.","institute_id":1,
+ "catetory":"สำนักงาน ก.ก.","catetory_id":1,
"start":"2023-04-24",
"title":"ด่วน !! ประกาศวัน เวลา สถานที่ และระเบียบการคัดเลือกลูกจ้างกทม.",
"detail":"
สำนักงานคณะกรรมการข้าราชการกรุงเทพมหานคร ประกาศกำหนดวัน เวลา สถานที่คัดเลือก และระเบียบ เกี่ยวกับการคัดเลือกบุคลากรกรุงเทพมหานครหรือผู้ปฏิบัติงานอื่นในกรุงเทพมหานครเพื่อบรรจุและแต่งตั้ง เป็นข้าราชการกรุงเทพมหานครสามัญ ครั้งที่ 1 / 2565
",
- "img":"/images/sel1.png",
+ "images":[
+ {
+ "title":"topic",
+ "url":"/images/sel1.png"
+ },
+ {
+ "title":"การแต่งกาย",
+ "url":"https://webportal.bangkok.go.th/public/user_files_editor/305/bkkgovjob202303_12.jpg"
+ }
+ ],
"files":[
{
- "title":"รายละเอียดประกาศฯ",
+ "title":"รายละเอียดประกาศ",
"url":"https://webportal.bangkok.go.th/public/user_files_editor/305/%E0%B8%9B%E0%B8%A3%E0%B8%B0%E0%B8%81%E0%B8%B2%E0%B8%A8%E0%B8%A7%E0%B8%B1%E0%B8%99%20%E0%B9%80%E0%B8%A7%E0%B8%A5%E0%B8%B2%20%E0%B8%AA%E0%B8%96%E0%B8%B2%E0%B8%99%E0%B8%97%E0%B8%B5%E0%B9%88%E0%B8%84%E0%B8%B1%E0%B8%94%E0%B9%80%E0%B8%A5%E0%B8%B7%E0%B8%AD%E0%B8%81%E0%B8%A5%E0%B8%B9%E0%B8%81%E0%B8%88%E0%B9%89%E0%B8%B2%E0%B8%87%E0%B8%AF.pdf"
},
{
@@ -26,50 +35,63 @@
{
"title":"แผนผังสนามสอบ",
"url":"https://file.thaijobjob.com/prakad/bkkgovjob202303/bkkgovjob202303_14"
- },
- {
- "title":"การแต่งกาย",
- "url":"https://webportal.bangkok.go.th/public/user_files_editor/305/bkkgovjob202303_12.jpg"
}
-
]
},
{
"id":"20",
- "date":"3 เม.ย. 2566","institute":"สำนักงาน ก.ก.","institute_id":1,
+ "catetory":"สำนักงาน ก.ก.","catetory_id":1,
"start":"2023-04-03",
"title":"วัน เวลา สถานที่ และระเบียบการคัดเลือกลูกจ้างกทม.",
"detail":"ด่วน !! ประกาศวัน เวลา สถานที่ และระเบียบการคัดเลือกลูกจ้างกทม.",
- "img":"/images/sel2.png",
- "docUrl":"https://webportal.bangkok.go.th/public/user_files_editor/305/%E0%B8%9B%E0%B8%A3%E0%B8%B0%E0%B8%81%E0%B8%B2%E0%B8%A8%E0%B8%A7%E0%B8%B1%E0%B8%99%20%E0%B9%80%E0%B8%A7%E0%B8%A5%E0%B8%B2%20%E0%B8%AA%E0%B8%96%E0%B8%B2%E0%B8%99%E0%B8%97%E0%B8%B5%E0%B9%88%E0%B8%84%E0%B8%B1%E0%B8%94%E0%B9%80%E0%B8%A5%E0%B8%B7%E0%B8%AD%E0%B8%81%E0%B8%A5%E0%B8%B9%E0%B8%81%E0%B8%88%E0%B9%89%E0%B8%B2%E0%B8%87%E0%B8%AF.pdf"
+ "images":[
+ {
+ "title":"topic",
+ "url":"/images/sel2.png"
+ }
+ ]
},
{
"id":"19",
- "date":"20 ธันวาคม 2566","institute":"สำนักการแพทย์","institute_id":3,
+ "catetory":"สำนักการแพทย์","catetory_id":3,
"start":"2003-12-20",
"title":"ประกาศรับสมัครคัดเลือกบุคลากรกทม. !!",
- "img":"/images/sel3.png",
- "detail":"ประกาศรับสมัครคัดเลือกบุคลากรกทม. !!"
+ "detail":"ประกาศรับสมัครคัดเลือกบุคลากรกทม. !!",
+ "images":[
+ {
+ "title":"topic",
+ "url":"/images/sel3.png"
+ }
+ ]
+
},
{
"id":"18",
- "date":"50 พ.ย. 2566","institute":"สำนักอนามัย","institute_id":2,
+ "catetory":"สำนักอนามัย","catetory_id":2,
"start":"2023-11-05T09:00:00",
"title":"สอบครั้งที่ 1/2565",
"detail":"สอบเป็นลูกจ้างและผู้ปฎิบัติงานในกรุงเทพมหานคร เป็นข้าราชการกรุงเทพมหานคร",
- "img":"/images/sel1.png",
- "docUrl":"https://webportal.bangkok.go.th/public/user_files_editor/305/%E0%B8%9B%E0%B8%A3%E0%B8%B0%E0%B8%81%E0%B8%B2%E0%B8%A8%E0%B8%84%E0%B8%B1%E0%B8%94%E0%B9%80%E0%B8%A5%E0%B8%B7%E0%B8%AD%E0%B8%81%E0%B8%A5%E0%B8%B9%E0%B8%81%E0%B8%88%E0%B9%89%E0%B8%B2%E0%B8%87.pdf"
+ "images":[
+ {
+ "title":"topic",
+ "url":"/images/sel1.png"
+ }
+ ]
},
{
"id":"17",
- "date":"1 พ.ย. 2566","institute":"สำนักงาน ก.ก.","institute_id":1,
+ "catetory":"สำนักงาน ก.ก.","catetory_id":1,
"start":"2023-11-01",
"title":"รับสมัครสอบตำแหน่งลูกจ้างและผู้ปฎิบัติงาน 1/2565",
"detail":"รับสมัครสอบตำแหน่ง ลูกจ้างและผู้ปฎิบัติงานในกรุงเทพมหานคร เป็นข้าราชการกรุงเทพมหานคร",
- "img":"/images/sel2.png",
- "docUrl":"https://webportal.bangkok.go.th/public/user_files_editor/305/%E0%B8%9B%E0%B8%A3%E0%B8%B0%E0%B8%81%E0%B8%B2%E0%B8%A8%E0%B8%84%E0%B8%B1%E0%B8%94%E0%B9%80%E0%B8%A5%E0%B8%B7%E0%B8%AD%E0%B8%81%E0%B8%A5%E0%B8%B9%E0%B8%81%E0%B8%88%E0%B9%89%E0%B8%B2%E0%B8%87.pdf"
+ "images":[
+ {
+ "title":"topic",
+ "url":"/images/sel2.png"
+ }
+ ]
}
]
\ No newline at end of file
diff --git a/cms/src/routes/+layout.svelte b/cms/src/routes/+layout.svelte
index 8e1bb5f..4eb6a7c 100644
--- a/cms/src/routes/+layout.svelte
+++ b/cms/src/routes/+layout.svelte
@@ -9,7 +9,6 @@
dayjs.extend(buddhistEra)
import type { LayoutData } from './$types';
export let data: LayoutData;
- console.log(data)
let {logo_url,supervised,divisions,institutes,address,organization} = data
diff --git a/cms/src/routes/+page.server.ts b/cms/src/routes/+page.server.ts
index f5232b9..66574fe 100644
--- a/cms/src/routes/+page.server.ts
+++ b/cms/src/routes/+page.server.ts
@@ -18,14 +18,17 @@ export const load: PageServerLoad = async ({fetch}) => {
if(res.ok){
qualify_exams = await res.json()
qualify_exams.forEach((e)=>{
- e.start? dayjs(e.start).format("DD MMM BBBB"):""
+ e.date = e.start? dayjs(e.start).format("DD MMM BBBB"):""
})
+ for(let i=qualify_exams.length;i<3;i++){
+ qualify_exams.push({id:"0",title:"",date:"",image:""})
+ }
}
res = await fetch("/api/competitive")
if(res.ok){
competitive_exams = await res.json()
competitive_exams.forEach((e)=>{
- e.start? dayjs(e.start).format("DD MMM BBBB"):""
+ e.date = e.start? dayjs(e.start).format("DD MMM BBBB"):""
})
}
return { content,image, qualify_exams,competitive_exams };
diff --git a/cms/src/routes/+page.svelte b/cms/src/routes/+page.svelte
index 1d7bf15..76a00fb 100644
--- a/cms/src/routes/+page.svelte
+++ b/cms/src/routes/+page.svelte
@@ -82,7 +82,7 @@
>
-
+
@@ -120,7 +120,7 @@
-
+
@@ -155,7 +155,7 @@
-
+
@@ -212,7 +212,7 @@
-
+
@@ -251,7 +251,7 @@
-
+
@@ -286,7 +286,7 @@
-
+
diff --git a/cms/src/routes/api/competitive/+server.ts b/cms/src/routes/api/competitive/+server.ts
index 2a667a9..24f3248 100644
--- a/cms/src/routes/api/competitive/+server.ts
+++ b/cms/src/routes/api/competitive/+server.ts
@@ -1,6 +1,19 @@
-import type {RequestHandler } from './$types'
import {json} from '@sveltejs/kit'
+import type {Exam} from '$lib/data/CMSDataType'
import exams from "$lib/data/competitive-exam.json"
-export const GET: RequestHandler = async () => {
- return json(exams)
+import type { RequestEvent,RequestHandler } from './$types'
+export const GET: RequestHandler = async ({url}: RequestEvent) => {
+ const limit= Number(url.searchParams.get("limit"))
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ let ex:Exam[] = exams.map(({files,images,detail,...minimal})=>{
+ if(images && images[0]){
+ const image = images[0].url
+ return {...minimal,image}
+ }
+ return minimal
+ })
+ if(limit>0){
+ ex = exams.slice(0,limit)
+ }
+ return json(ex)
}
\ No newline at end of file
diff --git a/cms/src/routes/api/dev/+server.ts b/cms/src/routes/api/dev/+server.ts
new file mode 100644
index 0000000..5787096
--- /dev/null
+++ b/cms/src/routes/api/dev/+server.ts
@@ -0,0 +1,8 @@
+import ver from "$lib/ver.json"
+import {json} from '@sveltejs/kit'
+import type { RequestHandler } from './$types'
+export const GET: RequestHandler = async () => {
+ const version = ver.version
+ const builddate = ver.builddate
+ return json({version,builddate})
+}
\ No newline at end of file
diff --git a/cms/src/routes/api/info/+server.ts b/cms/src/routes/api/info/+server.ts
index cdaf637..d8998b1 100644
--- a/cms/src/routes/api/info/+server.ts
+++ b/cms/src/routes/api/info/+server.ts
@@ -1,9 +1,6 @@
-import ver from "$lib/ver.json"
import {json} from '@sveltejs/kit'
import info from "$lib/data/info.json"
import type { RequestHandler } from './$types'
export const GET: RequestHandler = async () => {
- const version = ver.version
- const builddate = ver.builddate
- return json({...info,version,builddate})
+ return json(info)
}
\ No newline at end of file
diff --git a/cms/src/routes/api/qualifying/+server.ts b/cms/src/routes/api/qualifying/+server.ts
index 9d6bc00..527b1dd 100644
--- a/cms/src/routes/api/qualifying/+server.ts
+++ b/cms/src/routes/api/qualifying/+server.ts
@@ -1,6 +1,19 @@
-import type { RequestHandler } from './$types'
import {json} from '@sveltejs/kit'
+import type {Exam} from '$lib/data/CMSDataType'
import exams from "$lib/data/qualify-exam.json"
-export const GET: RequestHandler = async () => {
- return json(exams)
+import type { RequestEvent,RequestHandler } from './$types'
+export const GET: RequestHandler = async ({url}: RequestEvent) => {
+ const limit= Number(url.searchParams.get("limit"))
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ let ex:Exam[] = exams.map(({files,images,detail,...minimal})=>{
+ if(images && images[0]){
+ const image = images[0].url
+ return {...minimal,image}
+ }
+ return minimal
+ })
+ if(limit>0){
+ ex = exams.slice(0,limit)
+ }
+ return json(ex)
}
\ No newline at end of file
diff --git a/cms/src/routes/competitive/+page.server.ts b/cms/src/routes/competitive/+page.server.ts
index d7c2c60..14263de 100644
--- a/cms/src/routes/competitive/+page.server.ts
+++ b/cms/src/routes/competitive/+page.server.ts
@@ -1,6 +1,7 @@
-import type { PageServerLoad } from './$types'
+import { error } from '@sveltejs/kit';
import type {CalendarEvent,Exam} from '$lib/data/CMSDataType'
import dayjs from 'dayjs'
+import type { PageServerLoad } from './$types'
export const load: PageServerLoad = async ({fetch}) => {
let content = ""
let exams:Exam[] = []
@@ -10,9 +11,10 @@ export const load: PageServerLoad = async ({fetch}) => {
}
res = await fetch("/api/competitive")
- if(res.ok){
- exams = await res.json()
+ if(!res.ok){
+ throw error(res.status, 'ไม่สามารถอ่านข้อมูลการสอบได้');
}
+ exams = await res.json()
const events:CalendarEvent[]=[]
exams.forEach((e)=>{
diff --git a/cms/src/routes/qualifying/+page.server.ts b/cms/src/routes/qualifying/+page.server.ts
index 010c191..ed0f363 100644
--- a/cms/src/routes/qualifying/+page.server.ts
+++ b/cms/src/routes/qualifying/+page.server.ts
@@ -1,4 +1,5 @@
+import { error } from '@sveltejs/kit';
import type {CalendarEvent,Exam} from '$lib/data/CMSDataType'
import dayjs from 'dayjs'
import type { PageServerLoad } from './$types'
@@ -10,16 +11,18 @@ export const load: PageServerLoad = async ({fetch}) => {
content = (await res.json()).content
}
res = await fetch("/api/qualifying")
- if(res.ok){
- exams = await res.json()
+ if(!res.ok){
+ throw error(res.status, 'ไม่สามารถอ่านข้อมูลการสอบได้');
}
+ exams = await res.json()
+
const events:CalendarEvent[]=[]
exams.forEach((e)=>{
if(!e.start){
e.date=""
return
}
- e.date= dayjs(e.start).format("DD MMM BBBB")
+ e.date = e.start? dayjs(e.start).format("DD MMM BBBB"):""
const {id,title,start,end,category_id} = e
let backgroundColor =""
switch (category_id) {