ข้ามไปที่เนื้อหา

S8 — RLPD Official Website — Target Schema (Phase 2)

TARGET DESIGN — ไม่ใช่ schema ปัจจุบัน

ออกแบบใหม่เพื่อ implement requirement จาก SRS S8 v2.0.0 (TOR 7.18) · สถานะปัจจุบัน (legacy RLPD_WEB .226) อยู่ที่ ../../s8_website/ · 📋 สิ่งที่ต่างจากเดิม · DDL เต็ม: schema.sql · ERD · Data Dictionary · 🛠️ Backend Implementation

ทำไมต้อง redesign

legacy RLPD_WEB มี 81 ตาราง / 0 FK และมีตารางขยะจำนวนมาก: Content++, Content_copy1, Content_Article_copy1/2/3, Content_bk_250368bb, Menu_copy1, Users_bk111267, Zipcodes_tmp ฯลฯ target design นี้ทำให้:

  • normalize + FK ครบ (referential integrity ที่ legacy ไม่มี)
  • เพิ่ม content workflow (DRAFT→PENDING→APPROVED→PUBLISHED) รองรับ role CONTENT_EDITOR/CONTENT_APPROVER
  • เพิ่มของใหม่ตาม SRS: MediaVariant (auto-resize), EmbedCode/EmbedCodeAudit, ApiClient/ApiAccessLog, SearchLog, AccessibilityIssue
  • ตัด multi-language ให้เป็น *Translation แบบเดียวกันทุกที่

Role Hierarchy (SRS §3.1) — บริหารรวมศูนย์

SUPER_ADMIN · DEPARTMENT_ADMIN · CONTENT_EDITOR · CONTENT_APPROVER · API_CONSUMER · PUBLIC_USER

กำหนดสิทธิ์ที่เดียว (ทุกระบบ)

role เหล่านี้ ลงทะเบียน + มอบสิทธิ์ที่ส่วนกลาง ไม่ได้อยู่ใน S8: role catalog → PORTAL.ModuleRoles (SystemCode=S8) · การมอบสิทธิ์ → PORTAL.UserRole + Keycloak client roles (อ่านจาก JWT) · S8 เก็บแค่ map central role → เมนูในแอป ที่ WEB.RoleMenu · ดู Backend Implementation §5

🔑 Requirement → Table Traceability (spine)

REQ TOR สาระสำคัญ ตารางที่รองรับ
REQ-WEB-001 7.18.2 WCAG 2.2 AA (เน้น Critical) ส่วนใหญ่ frontend — persist เฉพาะ AccessibilityIssue (Known-Issues + Accessibility Statement) · alt text เก็บใน Banner​Translation.Alt, MediaAsset.AltText, Popup.Alt
REQ-WEB-002 7.18.3 Template/UI, Department Selection, Navbar ปรับเองได้ Template, ThemeColor, DepartmentTheme, DepartmentThemeHistory, Department, Menu, MenuTranslation, MenuType
REQ-WEB-003 7.18.4 CMS: WYSIWYG/HTML, upload/embed, Banner+Article auto-resize Content, ContentArticle, ContentRevision, ContentType, Category, CategoryTranslation, MediaAsset, MediaVariant, MediaType, ContentAttachFile, ContentImage, Banner, BannerTranslation, BannerType, BannerLocation, BannerSetting, BannerGroup, Popup, Faq, FaqQuestion, Calendar, CalendarCategory, Footer, FooterItem
REQ-WEB-004 7.18.5 Embed Code (Header/Footer/Section), per-department toggle, Super-Admin guard, audit EmbedCode, EmbedCodeAudit
REQ-WEB-005 7.18.6 Backend perf, Article Search, Login เร็ว SearchLog (ARTICLE) + note: full-text catalog; caching/perf-monitor = app/infra, ไม่มีผลต่อ schema; Login = Keycloak SSO (lockout = realm policy)
REQ-WEB-006 7.18.7 Internal Search (เมนูตั้งค่า + ไฟล์อัปโหลด) + history SearchLog (INTERNAL), AdminMenu, MediaAsset (เป็น target การค้นหา)
REQ-WEB-007 Extra Web API ข่าวสาร/บทความ — API Key/OAuth, rate limit, versioning, audit ApiClient, ApiClientScope, ApiAccessLog

REQ ที่ไม่มีผลต่อ schema (จัดการที่ app/infra layer)

  • WCAG rendering (contrast, keyboard nav, screen-reader) — frontend (เก็บได้แค่ Known-Issues register)
  • Caching / Performance Monitoring (REQ-WEB-005) — reverse-proxy / APM
  • Article Search engine — SQL Server Full-Text Catalog หรือ Elasticsearch (schema เตรียม SearchLog + คอลัมน์ที่ index ได้)
  • XSS filtering ของ Embed Code — sanitizer ที่ app layer (schema เก็บ snippet + audit)

Table Inventory (46 ตาราง, schema WEB)

กลุ่ม ตาราง
Shared/i18n Language
Department Department
Template/Theme Template, ThemeColor, DepartmentTheme, DepartmentThemeHistory
Navigation MenuType, Menu, MenuTranslation
Media MediaType, MediaAsset, MediaVariant
Content/CMS ContentType, Category, CategoryTranslation, Content, ContentArticle, ContentRevision, ContentAttachFile, ContentImage
Banner BannerType, BannerLocation, BannerGroup, Banner, BannerTranslation, BannerSetting
Widgets Popup, Faq, FaqQuestion, CalendarCategory, Calendar, Footer, FooterItem
Embed EmbedCode, EmbedCodeAudit
Users/AuthZ Position, User (SSO profile), AdminMenu, RoleMenu (keyed by central role) — role catalog/grants อยู่ที่ PORTAL+Keycloak
Web API ApiClient, ApiClientScope, ApiAccessLog
Search/Log SearchLog, AuditLog, PublicAccessLog
Accessibility AccessibilityIssue

Legacy → Target migration map (สรุป)

Legacy (RLPD_WEB) Target (WEB) หมายเหตุ
Department Department + ฟิลด์ social, parent self-ref
Theme_Choice / Theme / Theme_Color Template / DepartmentTheme / ThemeColor template เป็น first-class
Content (+ ++,copy1,bk) Content ทิ้ง ตารางซ้ำทั้งหมด, เพิ่ม Status workflow
Content_Article (+ copy1/2/3) ContentArticle + ContentRevision revision/approval แยกออก
AttachFile / Content_IMG MediaAsset + MediaVariant / ContentImage original + resized
Menu (+ Menu_copy1) / Menu_Detail Menu / MenuTranslation
Users (+ _bk) User เลิกเก็บ password → ผูก Keycloak SSO (KeycloakUserId); keep Identity_idCitizenId; lockout/aging = Keycloak realm policy
Role / UserRoles PORTAL.ModuleRoles + PORTAL.UserRole + Keycloak ย้ายไปบริหารกลาง (ไม่อยู่ใน S8)
Role_Menu / Tm_Menu RoleMenu / AdminMenu RoleMenu keyed by central role code
inline Embed_Code column EmbedCode (+ audit) จัดการเป็นรายตำแหน่ง
(ไม่มี) ApiClient*, SearchLog, AccessibilityIssue, MediaVariant ของใหม่ตาม SRS
Survey* (ใช้ Survey ของ S9 ตาม REQ-WPT-009) S9 เป็นเจ้าของแบบประเมินกลาง — S8 ฝัง widget

หมายเหตุ: ตาราง Survey* ของ legacy S8 ไม่ยกมา เพราะ Phase 2 รวมแบบประเมินความพึงพอใจไว้ที่ S9 (REQ-WPT-009) เป็นระบบกลาง — เว็บไซต์ S8 เพียงฝัง icon/popup ที่ชี้ไปยัง Survey ของ Portal

⚠️ ข้อมูลเดิมต้องตัดสินใจแยก: legacy SurveyAnswerDetail มีคำตอบจริง (IP/Device/Browser) — ต้องมี แผน archive/migrate ข้อมูลแบบประเมินเดิม ก่อนเลิกใช้ตาราง legacy (ไม่ใช่แค่ย้ายฟีเจอร์)