ระบบ E-commerce แบบกำหนดเองบน Firebase

ผมสร้างเว็บไซต์ E-commerce แบบกำหนดเองขึ้นมาตั้งแต่เริ่มต้น โดยไม่ได้ใช้แพลตฟอร์มสำเร็จรูป แต่เลือกใช้ Firebase Realtime Database และ Netlify แทน

เป้าหมายคือเพื่อให้บริการแก่ตัวแทนจำหน่ายเครื่อง POS พวกเขาต้องการแคตตาล็อก, รูปแบบราคาที่หลากหลาย และแผงควบคุมสำหรับผู้ดูแลระบบ นอกจากนี้ ทีมขายยังจำเป็นต้องสามารถสั่งซื้อสินค้าผ่านเว็บไซต์ได้โดยตรง

นี่คือวิธีการที่ผมสร้างมันขึ้นมาและบทเรียนที่ผมได้รับ

The Stack • Vanilla HTML, CSS, และ JS • Firebase Realtime Database สำหรับข้อมูล • Firebase Storage สำหรับไฟล์ • Netlify สำหรับการโฮสต์และฟังก์ชันต่างๆ

Key Decisions

  1. การแยกฐานข้อมูล ผมแยกฐานข้อมูล E-commerce ออกจากฐานข้อมูลการจัดการภายใน เพื่อป้องกันไม่ให้ข้อมูลทางการค้าไปปะปนกับข้อมูลผู้ดูแลระบบที่สำคัญ เช่น เงินเดือนหรือแผนงบประมาณ

  2. คลังราคาแบบรวมศูนย์ (Global Pricing Archive) แทนที่จะใส่แผนราคาไว้ในสินค้าทุกชิ้น ผมสร้างโฟลเดอร์ tariffs แบบรวมศูนย์ขึ้นมา โดยสินค้าจะเก็บเพียงแค่อาร์เรย์ของ ID เท่านั้น วิธีนี้ช่วยหลีกเลี่ยงการเก็บข้อมูลซ้ำซ้อน หากมีการเปลี่ยนแผนราคา ผมก็แค่แก้ไขเพียงที่เดียว

  3. การสั่งซื้อแบบ Atomic เมื่อมีคนสั่งซื้อพร้อมกันหลายคน คุณอาจเจอปัญหา race conditions หากมีสองคนอ่านเลขที่คำสั่งซื้อเดียวกัน คำสั่งซื้อหนึ่งอาจหายไปได้ ผมใช้ Firebase runTransaction() เพื่อให้แน่ใจว่าทุกคำสั่งซื้อจะได้รับหมายเลขที่เรียงลำดับและไม่ซ้ำกัน

  4. การเข้าถึงแผงควบคุมที่ปลอดภัย ผมไม่ได้เก็บรหัสผ่านไว้ในซอร์สโค้ด แต่ใช้ PBKDF2 ผ่าน Web Crypto API ซึ่งทำให้การโจมตีแบบ brute-force ทำได้ยากมาก โดยในโค้ดจะมีเพียง salt และ hash เท่านั้น

Lessons Learned

• ระวังเรื่องค่า falsy: ใน JavaScript ค่า 0 คือค่า falsy หากราคาสินค้าเป็น 0 การตรวจสอบแบบง่ายๆ อย่าง "price || null" จะทำให้ราคานั้นหายไป ควรใช้ "price != null" เสมอเพื่อให้ครอบคลุมกรณีที่เป็นศูนย์ด้วย

• กำหนดค่า CSP ใน HTTP headers: Meta tags สำหรับ Content Security Policy ไม่รองรับ wildcard สำหรับ subdomain เนื่องจาก Firebase ใช้ dynamic subdomains ผมจึงย้ายการตั้งค่า CSP ไปไว้ใน netlify.toml เพื่อให้ใช้งานได้

• ใช้ Security Rules เพื่อการป้องกันที่แท้จริง: อย่าฝากความหวังไว้เพียงแค่การซ่อนปุ่มใน UI แต่ควรใช้ Firebase rules เพื่อจำกัดสิทธิ์ว่าใครสามารถอ่านหรือเขียนข้อมูลได้บ้าง

การสร้างโซลูชันแบบกำหนดเองจำเป็นต้องมีการเลือกสถาปัตยกรรมอย่างรอบคอบ รายละเอียดเล็กๆ น้อยๆ อย่างการจัดการ transaction และการตั้งค่า header สามารถช่วยป้องกันความล้มเหลวครั้งใหญ่ในระบบ production ได้

Source: https://dev.to/androve2k/custom-e-commerce-on-firebase-catalog-atomic-orders-and-admin-panel-42ec