diff --git a/.env.example b/.env.example index d8250bd..f8a0914 100644 --- a/.env.example +++ b/.env.example @@ -1,76 +1,35 @@ -# N8 (optional): allowlist โฮสต์ลิงก์ไฟล์รีโมต — ไม่ตั้ง = admincourt.go.th -# EXTERNAL_FILE_HOSTS=admincourt.go.th -# N10 (optional): API key ของ /api/external/* (backend e-Court เรียก server-to-server) - +########### สำหรับ npm run dev และ แอปบน container # Sign/Hash ที่ใช้ฝังในเอกสาร(docx) -SECRET="" -PRIVATE_KEY_HEX="" +SECRET="" # HmacSHA256 +PRIVATE_KEY_HEX="" PUBLIC_KEY_HEX="" ## ไม่ตั้ง/ว่าง = ปฏิเสธทุก request (fail closed) — ตั้งค่ายาวและสุ่ม เช่น 32+ ตัวอักษร EXTERNAL_API_KEY="" -# docver token (2026-10-22): API key ของ POST /api/documents/token (header x-api-key) -# และ POST /api/note/auth/token (เส้น mint login-token ของแอป note — PLAN-SSO.md) -# ไม่ตั้ง/ว่าง = ปฏิเสธทุก request (fail closed) — ตั้งค่ายาวและสุ่ม เช่น 32+ ตัวอักษร -# (ห้าม log ค่า key ดิบ — เทียบแบบ timing-safe ทุกครั้ง) -# GET /api/documents/latest (2026-10-31) รับ DOCVER_API_KEY นี้ หรือ EXTERNAL_API_KEY -# (ด้านบน) ตัวใดตัวหนึ่งตรง = ผ่าน — ทั้งคู่ไม่ตั้ง = 401 fail closed เช่นกัน -DOCVER_API_KEY= +DOCVER_API_KEY="" # secret เซ็น/ตรวจ JWT HS256 ของทุก endpoint /api/documents/* (Authorization: Bearer) -# + login-token ของ SSO (แยกสิทธิ์ด้วย claim purpose — PLAN-SSO.md D4) -# ไม่ตั้ง/ว่าง = ออก token ไม่ได้ (500) และทุก endpoint ตอบ 401 รวมถึงเข้า annotate -# ไม่ได้ (ทางเข้า session เดียวคือลิงก์ SSO) — dev ต้องมีค่านี้ใน .env เสมอ -# ⚠️ ก่อน production: rotate ค่าจริง (ค่า hex เดิมเคยถูก commit ไว้ใน comment — ถือว่าหลุด) DOCVER_TOKEN_SECRET= -# ใช้ตอน migrate และ การใช้งาน +# ใช้ตอน migrate และ การใช้งาน ใน development DATABASE_URL=postgresql://postgres:postgres@127.0.0.1:54322/ecourt-note -### สำหรับโค้ดตัวอย่างระบบนอกเรียกเข้ามาไม่ได้ใช้ในระบบนี้ ห้ามเอาไช้ -DOCEDIT_BASE_URL=http://127.0.0.1:3000/docedit -# Optional เวลาหมดอายุที่ฝังไว้ในข้อมูล (ticket_data), worker ควรเท่ากับจำนวน CPU core -1 -TMPL_PATH='./public/tmpl' -TICKET_SEC=300 -DOCX_WORKERS=3 +# Optional ไม่ใส่ก็ได้มีค่า default +TMPL_PATH='./public/tmpl' +TICKET_SEC=300 # อายุของ ticket ยิ่งน้อยยิ่งดี +DOCX_WORKERS=3 # cpu core หักออก 1 + +########### สำหรับโค้ดตัวอย่างให้ระบบนอกเรียกเข้ามาไม่ได้ใช้ในระบบนี้ ห้ามเอาไช้ในส่วนอื่น +DOCEDIT_BASE_URL=http://127.0.0.1:3000/docedit + +########### สำหรับ แอป และ service ต่างๆใน container +APP_DOMAIN=docedit.example.com -## สำหรับ docker-compose.yaml POSTGRES_USER=postgres POSTGRES_PASSWORD=postgres POSTGRES_DB=note - +# ใช้สำหรับ local dev ถ้า minio อยู่คนละเครื่องให้ดูค่าให้เหมาะสม MINIO_ENDPOINT=127.0.0.1 MINIO_PORT=19000 MINIO_USE_SSL=false MINIO_ACCESS_KEY=minioadmin MINIO_SECRET_KEY=minioadmin # MINIO_BUCKET=docver - # DOCVER_LINK_TTL_SECONDS=900 - # DOCVER_TOKEN_TTL_SECONDS=3600 - -# (ถอดแล้ว 2026-10-30) NOTE_SESSION_SECRET ของรอบ cookie oacCaseSig — แอป note -# เปลี่ยน session เป็น token แบบ add-in แล้ว (access_token purpose=login จาก -# POST /api/note/auth/session เก็บใน localStorage "note-auth") จึงใช้ -# DOCVER_TOKEN_SECRET ตัวเดียวทั้งระบบ: เซ็น login-token ของลิงก์ + เซ็น/ตรวจ -# session token ฝั่ง Server Actions และ API ของแอป (lib/note-token.ts) - -# dev-only (ทางเลือก): เปิดฟอร์ม "สร้างลิงก์ทดสอบ" บนหน้า /note + route -# POST /api/note/auth/dev-link — mint ลิงก์ SSO จากหน้าเว็บเพื่อทดสอบ flow จริง -# ⚠️ ตัวช่วยทดสอบเท่านั้น ไม่ใช่ทางเข้าจริง: ปิด = route ตอบ 404 + ฟอร์มหายจากหน้า -# และไม่ทำงานใน production build เด็ดขาด (NODE_ENV=production) — dev server ที่แชร์ -# บน LAN เปิดไว้ = คนในวงแชร์เครือข่าย mint ลิงก์เข้าระบบได้ จึงควรเปิดเฉพาะตอนทดสอบ -# NOTE_SSO_DEV_MINT=1 - -# add-in ticket auth (2026-10-27, docs/PLAN-ADDIN-AUTH.md): add-in ใน Word ขอ token -# ที่ POST /api/documents/token ด้วย body {ticket_data, HmacSha256} ที่ e-Court stamp -# มากับไฟล์ — secret ต้องตรงกับตัว stamp ของ e-Court ทั้งสองฝั่ง -# ฝั่ง server ตรวจ HMAC ของ ticket: ADDIN_TICKET_SECRET (ไม่ตั้ง = ใช้ env SECRET -# ของกลุ่ม template → ยังไม่ตั้งอีก = "super_secret" ตาม requirement) -# ⚠️ production ต้องตั้งค่าจริง — ค่า default รู้กันหมด = ใครก็ปลอม ticket ได้ -# (ใช้ร่วมกับทาง ticket ของ SSO POST /api/note/auth/session ด้วย — PLAN-SSO.md D12) -# 2026-10-30: ทาง ticket ของ SSO (POST /api/note/auth/session) ปฏิเสธค่า default -# นี้เฉพาะใน production — dev ใช้ default ทดสอบโหมด ticket ได้เลย (เครื่องมือ dev -# อย่าง make-login-link/make-ticket-docx ก็ default ค่าเดียวกัน) -# ADDIN_TICKET_SECRET=super_secret -# ฝั่ง add-in (inline ลง bundle ตอน build — ใช้เป็นแค่ UX gate ตัดเคสไฟล์ถูกแก้ก่อนยิง -# network ส่วนความมั่นคงจริงอยู่ที่ฝั่ง server ข้างบน · ตามคำขอผู้ใช้ 2026-10-29 -# แก้ add-in เป็นงานแยก — ยังคงไว้ตาม PLAN-ADDIN-AUTH.md D3) -# NEXT_PUBLIC_ADDIN_TICKET_SECRET=super_secret diff --git a/app/tmpl/page.tsx b/app/tmpl/page.tsx index 2798a00..81ac506 100644 --- a/app/tmpl/page.tsx +++ b/app/tmpl/page.tsx @@ -4,16 +4,13 @@ import Link from "next/link"; import type { ChangeEvent } from 'react'; import DependentDropdown, { DropdownData } from '@/components/utils/DependentDropdown'; import { - Bookmark,ToyBrick,FilePenLine,BicepsFlexed,Rocket,Workflow, Files,Blocks,FileQuestionMark, + Bookmark, ToyBrick, FilePenLine, BicepsFlexed, Rocket, Workflow, Files, Blocks, FileQuestionMark, ExternalLink, FileText, Highlighter, MessagesSquare, } from "lucide-react"; - - - export default function HomePage() { const templateData: DropdownData = { T_X: ['T_no_warning', 'TF_no_warning_P2', 'TS_P2_IN'], @@ -30,10 +27,10 @@ export default function HomePage() {

- eCourt Template + DOCEDIT Template & Add-ins

- ระบบสร้างเทมเพลตเอกสารแบบใหม่ MS Word จากไฟล์ JSON และ Template docx + ระบบเทมเพลตเพื่อสร้างเอกสาร MS Word และจัดการรุ่นของเอกสารผ่าน Word Add-ins ยุคใหม่ แบบอิสระ ที่สามารถ Integrate กับระบบความปลอดภัยของระบบอื่นๆได้

@@ -49,40 +46,56 @@ export default function HomePage() { title: "DOCX Template", detail: "ออกแบบหน้าของเอกสารจาก Microsoft Word โดยไม่ต้องใช้เครื่องมือพิเศษ " + - "สามารถนำเอกสารตัวเดิมมาใช้ออกแบบได้เลย " + - "ไม่จำเป็นต้องมีความรู้ด้านการเขียนโปรแกรมหรือ XML ก็สามารถสร้างเทมเพลตได้", + "สามารถนำเอกสารตัวเดิมมาใช้ออกแบบได้ทันที " + + "ไม่จำเป็นต้องมีทักษะการเขียนโปรแกรมก็สามารถสร้างเทมเพลตได้ด้วยตัวเอง", }, { icon: FilePenLine, title: "Fill Form", detail: "รอรับ Rich และ Plain Text Content Control " + - "สามารถสร้างฟอร์มสำหรับกรอกข้อมูลพร้อมข้อมูลตั้งต้น " + - "ผู้ใช้สามารถนำไปกรอกข้อมูลใน Word ได้เลย และสามารถเใช้โปรแกรมดึงข้อมูลกับมาเก็บในฐานข้อมูลได้", + "สามารถสร้างฟอร์มสำหรับกรอกข้อมูลจากไฟล์ docx " + + "สามารถใช้ API ดึงข้อมูลในฟอร์มกลับมาเพื่อนำไปใช้งานต่อ เช่นเก็บในฐานข้อมูลได้", }, { icon: ToyBrick, - title: "Integrate with Other System", + title: "Integration", detail: - "มี Web API สำหรับสร้างเอกสารจากเทมเพลต(DOCX) กับข้อมูล(JSON) " + - "มี API Key เพื่อจำกัดการใช้งาน สามารถออกบัตรผ่านที่ลงลายเซ็นต์ด้วย HmacSha256" + + "ระบบทำงานเป็นอิสระแบบ Microservice ใช้ API Key เพื่อจำกัดการใช้งาน สามารถออกบัตรผ่านที่ลงลายเซ็นต์ด้วย HmacSha256" + + "เพื่อให้ผสาน(Integrate)กับระบบงานที่มีอยู่เดิม ได้อย่างปลอดภัย" + "เพื่อให้ผสานกับระบบงานอื่นๆ ได้อย่างปลอดภัย", }, { icon: FileText, - title: "Dynamic Document", + title: "Dynamic Template", detail: - "รองรับเทมเพลตที่ซับซ้อน ข้อมูลที่มีไม่แน่นอนอย่างอาเรย์ การแสดงผลตามเงื่อนไขแบบต่างๆ " + + "รองรับเทมเพลตที่ซับซ้อน ข้อมูลที่มีจำนวนไม่แน่นอน การแสดงผลตามเงื่อนไขแบบต่างๆ " + "สามารถเขียนโปรแกรมเพิ่มลงในเทมเพลตได้ รองรับ FOR , IF แทรกโค้ด " + - "ฟังก์ชั่นในตัวเพื่อรองรับการสร้าง Content Control Bookmark ฯลฯ", + "ฟังก์ชั่นเพื่อสร้าง Content Control Bookmark ฯลฯ" + + "มี API ช่วยนักพัฒนาสร้างเอกสารจากเทมเพลต(DOCX)และข้อมูล(JSON) " }, { icon: Rocket, - title: " High Performance", + title: "Versioning", detail: - "containerization ขยายระบบได้ง่าย, ระบบเทมเพลตใช้การ XML โดยตรง " + - "การสร้าง template เป็นแบบ Multi-Thread รองรับ CPU หลายแกน " + - "", + "จัดการ Veresion(รุ่น)ของเอกสารร่วมกันได้ผ่าน Microsoft Word Add-ins " + + "สามารถดึง Veresion ที่ต้องการกลับมาแก้ไขได้ ", + }, + { + icon: Rocket, + title: "High Performance", + detail: + "containerization ขยายระบบได้ง่าย " + + "การสร้าง template ทำงานแบบ Multi-Thread รองรับ CPU หลายแกน " + + "เก็บไฟล์ใน Object Storage มีความทนทานและรับโหลดได้หนัก", + }, + { + icon: Rocket, + title: "PDF Export", + detail: + "ทุกครั้งที่ Save Veresion จะสร้าง PDF อัตโนมัติในด้วย MS Word ทำให้ได้เค้าโครงของหน้าตรงกับเอกสารที่แก้ไข " + + "โดยไม่เกิดปัญหาความผิดเพี้ยนของ PDF ที่ใช้ MS Office ต่างเวอร์ชั่นในการแปลง ประมวลผลที่ไคลเอนต์ลดการใช้ทรัพยากรที่เซิร์ฟเวอร์", + }, ].map(({ icon: Icon, title, detail }) => (

Template & Data

- Template: T_X.docx,   + Template: T_X.docx,   T12_X.docx
- Data: TF_no_warning_P2.json,   + Data: TF_no_warning_P2.json,   T_no_warning.json,   TS_P2_IN.json
T12_b2_IN.json,   T12_FD155_3s-long.json +
+ นำไฟล์ไปทดสอบกับ API

@@ -221,10 +236,12 @@ export default function HomePage() {

วิธีการใช้งาน

- - แนะนำเทมเพลตของ Docedit เบื้องต้น
- - Sideload Office add-ins + + แนะนำเทมเพลตของ Docedit เบื้องต้น
+ + ติดตั้ง MS Word Add-ins + + ใช้งาน DOCEDIT Add-ins

@@ -246,18 +263,38 @@ export default function HomePage() { Word Add-ins

- ดาวน์โหลด  - - manifest.xml   - ไว้ที่ SharePoint แชร์เน็ตเวิร์ก หรือดาวน์โหลดสคริปต์ PowerShell(Dev Install)   - - install-word-addins.ps1   - แล้วใช้คำสั่ง PowerShell ด้านล่างเพื่อติดตั้ง Add-ins ใน Word
+ การติดตั้งสามารถติดตั้งได้หลายวิธี +

    +
  1. 1. ติดตั้งผ่าน Office Store (วิธีทั่วไปสำหรับผู้ใช้ทั่วไป)
  2. +
  3. 2. Sideloading ด้วยไฟล์ + manifest.xml (Office 365) Insert>Add-ins>My Add-ins คลิ้ก "Upload My Add-in"
  4. +
  5. 3. Shared Folder Sideloading(Office 2019+) นำไฟล์ + manifest.xml  ไปทำตามวีดีโอ + ติดตั้ง MS Word Add-ins
  6. +
  7. 4. ใช้คำสั่ง reg.exe ร่วมกับ + manifest.xml  ไปทำตามวีดีโอ + ติดตั้ง MS Word Add-ins
  8. +
  9. 5. สคริปต์ PowerShell(Dev Install) + + install-word-addins.ps1  + แล้วเรียกคำสั่งด้านล่างเพื่อติดตั้ง
    +
    + Unblock-File .\install-word-addins.ps1
    + Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned -Force
    + .\install-word-addins.ps1 -Install
  10. +

- Unblock-File .\install-word-addins.ps1 - Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned -Force - .\install-word-addins.ps1 -Install - + หมายเหตุ: + + Add-ins เป็นรุ่นใหม่(Office.js) มีความเป็นไปได้ที่จะรองรับรุ่น Desktop(Windows/Mac), Web และ iPad + ด้วยข้อกำหนดของ TOR ให้รองรับ Word 2019(Desktop) บนวินโดว์ 10 เป็นขั้นต่ำ ทำให้ถูกจำกัดที่ WordApi 1.3 เท่านั้น + ฟึเจอร์บางอย่างบน Add-ins จะถูกจำกัดตามความสามารถตามรุ่นของ WordApi การทดสอบต่างๆตามที่กำหนดใน TOR +
+ สำหรับ Microsoft Office เวอร์ชันขายขาดแบบเก่า (เช่น Office 2016, 2019 หรือ 2021) จะไม่มีปุ่มอัปโหลดไฟล์ XML + บนหน้าต่างเมนูโดยตรงเหมือน Microsoft 365 หากต้องการติดตั้งไฟล์ manifest.xml ในรุ่นดังกล่าว + จำเป็นต้องใช้วิธีแชร์โฟลเดอร์เครือข่าย (Shared Folder Sideloading) +
+

diff --git a/docker-compose.yml b/docker-compose.yml index c2f1cd5..8b365bf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,10 +1,11 @@ -# Dev dependencies ของ judes-note — รันด้วย `docker compose up -d` (ทั้งคู่) -# หรือ `docker compose up -d minio` (ถ้าจะรัน DB แบบเดิมด้วย docker run) -# -# service `db` ใช้ชื่อ container/วอลุ่มเดียวกับคำสั่ง docker run เดิมใน README -# (วอลุ่ม pin ชื่อไม่มี prefix ของ compose ผ่าน `name:` ด้านล่าง) — ถ้ามี container -# judes-note-db เก่ารันอยู่ (สร้างด้วย docker run) ให้ `docker rm -f judes-note-db` -# ก่อน แล้ว compose จะต่อวอลุ่ม judes-note-db-data เดิมได้เลย ข้อมูลไม่หาย +# สำหรับตอนพัฒนาแอป (npm run dev) เรียกใช้แค่ db minio +# docker compose up -d db minio +# สำหรับทดสอบ แอปบน container +# docker compose build +# docker compose up -d +# ลบ container และ volume +# docker compose down -v + services: docedit: build: @@ -12,6 +13,7 @@ services: dockerfile: docker/web.Dockerfile restart: unless-stopped environment: + - TZ=Asia/Bangkok - SECRET=${SECRET} - PRIVATE_KEY_HEX=${PRIVATE_KEY_HEX} - PUBLIC_KEY_HEX=${PUBLIC_KEY_HEX} @@ -21,9 +23,10 @@ services: - DATABASE_URL=postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@db:5432/note ### สำหรับโค้ดตัวอย่างระบบนอกเรียกเข้ามาไม่ได้ใช้ในระบบนี้ ห้ามเอาไช้ - DOCEDIT_BASE_URL=http://docedit:3000/docedit + ## Optional - TICKET_SEC=300 - DOCX_WORKERS=4 - + - NOTE_SSO_DEV_MINT=1 ## dev ports: - "3000:3000" @@ -33,7 +36,6 @@ services: minio: condition: service_healthy - db: image: postgres:18-alpine restart: unless-stopped