Mini Project Quest 2
โจทย์ข้อที่ 1
สร้าง SvelteKit Project ใหม่ด้วย Typescript พร้อมกับ ESLint และ Prettier
โจทย์ข้อที่ 2
Clear starter template ที่ให้มาแล้วติดตั้ง TailwindCSS
โจทย์ข้อที่ 3
ติดตั้ง Toggle Component ของ shadcn-svelte
โจทย์ข้อที่ 4
ติดตั้ง MeltUI และใช้งาน Tags Input Component
โจทย์ข้อที่ 5
ติดตั้ง tRPC บน project ของตนเอง
โจทย์ข้อที่ 6
ติดตั้ง zod และสร้างฟอร์มขึ้นมา 5 ช่องและปุ่ม Submit
เมื่อกดปุ่ม submit แล้วจะทำการ validate ค่าของ form ดังต่อไปนี้
ช่องที่ 1 จะต้องมีความยาวมากกว่าตัวอักษร 5
ช่องที่ 2 จะต้องเป็นคำว่า "blue" หรือ "green" หรือไม่ก็ "red" เท่านั้น
ช่องที่ 3 เป็น string หรืออาจจะสามารถปล่อยว่างได้
ช่องที่ 4 จะต้องจบ string ด้วยคำว่า sushi เท่านั้น
ช่องที่ 5 จะต้องมีค่าเป็น ip address ใดๆ เท่านั้น
โจทย์ข้อที่ 7
เมื่อกดปุ่มจากข้อที่ 6 แล้วจะทำการเรียก tRPC function เพื่อส่งข้อมูลดังฟอร์มทั้ง 5 ช่องไปในรูปแบบของ object ดังต่อไปนี้
interface FormInput {
A: string
B: string
C: string
D: string
E: string
}โดยหากผ่านเงื่อนไขการ validate จากข้อที่ 6 ทุกประการให้ทำการ console.log("pass") หากไม่ผ่าน console.log("fail") โดยจะต้องขึ้นข้อความแค่ที่ส่วนหลังบ้านเท่านั้น
โจทย์ข้อที่ 8
ให้สร้าง route /create โดยที่มีหน้าตาดังต่อไปนี้ด้วย shadcn หรือ melt ui พร้อมกับติดตั้ง fonts ที่ต้องใช้จาก Google Fonts

โจทย์ข้อที่ 9
Init prisma ในโปรเจคพร้อมกับต่อ db postgres ของตนเองและสร้าง table
Place โดยเก็บข้อมูลดังต่อไปนี้
id เป็น int ให้เป็น PK ที่ auto increment
name เป็น unique non null string
description เป็น non null string
tel เป็น non null string
website_url เป็น nullable string
email เป็น nullable string
โดยมี table level constraint เพิ่มเติมว่าห้ามมี record ใดมี tel และ website_url ซ้ำพร้อมกัน
และ push schema ขึ้น database ให้เรียบร้อย
โจทย์ข้อที่ 10
สร้าง router ใน tRPC ที่ชื่อว่า createPlace โดยจะรับ input เป็น object และมี validation ด้วย zod ตามหลัก business rules ที่ฟอร์มจากข้อที่ 8 แสดงไว้ โดยหากได้รับ Network Request มาแล้วจะให้ทำการ console.log(input) ที่ได้รับออกมาในฝั่ง server
โจทย์ข้อที่ 11
จากข้อที่ 10 แทนที่จะทำการ console.log ให้ทำการสร้าง record ใน table Place แทน
โจทย์ข้อที่ 12
ให้สร้าง route /register โดยจะมีฟอร์มสำหรับ email และ password ใช้ component จาก shadcn หรือ melt ui เท่านั้น โดยเมื่อกดปุ่มยืนยันแล้วให้เรียก route createUser ของ tRPC โดยรับข้อมูลจากฟอร์มและ validate ข้อมูลดังต่อไปนี้
email จะต้องเป็น string ที่มีความยาวขึ้นต่ำ 1 ตัวอักษรและมี format string เป็นแบบ email
password จะต้องมีความยาวไม่ต่ำกว่า 8 ตัวอักษรและน้อยกว่าหรือเท่ากับ 32 ตัวอักษร
เมื่อได้รับข้อมูลแล้วให้ทำการ randomly generate ค่า salt สำหรับการ hash password และทำการ hash password ด้วย bcrypt และ console.log ค่าที่ได้จากการ hash พร้อม salt ออกมา
โจทย์ข้อที่ 13
ให้สร้าง table User และ Session โดยเก็บข้อมูลดังต่อไปนี้
User
id เป็น PK และจะสร้างค่า default เป็น UUID
email เป็น unique non null string
password เป็น non null string
salt เป็น non null string
createdAt เป็น date time ของตอนที่สร้าง
updatedAt เป็น date time ของเวลาที่แก้ไข record ล่าสุด
Session
id เป็น PK และจะสร้างค่า default เป็น CUID
token เป็น string
expiredAt เป็น non null date time
userID เป็น non null string
createdAt เป็น date time ของตอนที่สร้าง
updatedAt เป็น date time ของเวลาที่แก้ไข record ล่าสุด
โดยมี constraint FK ว่า userID เป็น FK ของ User
โจทย์ข้อที่ 14
จากข้อที่ 12 เมื่อทำการ hash รหัสผ่านสำเร็จให้ทำการสร้าง User record ให้ขึ้นมาโดยมั่นใจว่าไม่เคยมีผู้ใช้นี้อยู่ในระบบก่อนหน้านี้แล้ว หากมีให้ตอบกลับ client ด้วย new TRPCError() ว่า "user-already-existed" พร้อมข้อความที่เหมาะสม
เมื่อสร้างผู้ใช้งานเสร็จแล้วให้ทำการสร้าง Session record ของ User ที่พึ่งได้สร้างไปโดยมี expiredAt เป็น 5 นาทีในอนาคต โดยให้ randomly generated string สำหรับค่า token ยาก 32 ตัวอักษรและทำการ set cookie ชื่อว่า session-token เป็น http only สำหรับค่าดังกล่าว
โจทย์ข้อที่ 15
สร้าง route /login โดยรับ input คล้ายกับหน้า /register โดยเมื่อกดปุ่มยืนยันแล้ว ให้เรียก tRPC function ที่ชื่อว่า login โดยรับข้อมูลและมี validation ที่เหมาะสมกับฟอร์ม จากนั้นให้ทำการ validate ว่าข้อมูลดังกล่าวนั้นมี email และรหัสผ่านถูกต้องหรือไม่ (ต้องเอาไป bcrypt ก่อนเหมือนตอน register เพื่อเช็ค) หากไม่เจอหรือผิดให้ตอบกลับด้วย tRPC Error ที่เหมาะสม
เมื่อตรวจสอบเสร็จแล้ว ให้ทำการสร้าง Sesion record ใหม่โดยมี expiredAt เป็นเวลาตอน 5 นาทีข้างหน้าและ set cookie ชื่อ session-token ให้เหมาะสม
โจทย์ข้อที่ 16
ทุกครั้งที่ผู้ใช้เข้าหน้า /create ให้ทำการเช็ค session-token ว่าถูกต้องหรือไม่ และหมดอายุหรือไม่ หากหมดอายุหรือไม่ถูกต้องให้ทำการ clear cookie session-token และ redirect ไปหน้า /login
หากถูกต้องให้ user เข้าสู่หน้า /create ได้ตามปกติ
Last updated
Was this helpful?