สมอง SML

คลังความรู้ / หลังบ้าน Go

#backend#tenant#config#json#security

ทะเบียน Provider แบบไฟล์ JSON

ข้อมูลการเชื่อมต่อฐานข้อมูลของแต่ละ Tenant ไม่ได้อยู่ใน DB แต่เก็บเป็นไฟล์ในโฟลเดอร์ CONFIG_DIR (default configs): ดัชนี providerlist.json หนึ่งไฟล์ + SMLConfig<CODE>.json หนึ่งไฟล์ต่อ Provider. ตัดสินใจไว้ใน ADR-0001 เก็บ config ของผู้เช่า (Provider) เป็นไฟล์ JSON ไม่ใช่ตาราง DB; รหัสผ่านใช้ base64 ไม่ใช่การเข้ารหัสจริง (ADR-0002 รหัสผ่าน DB ของผู้เช่าเก็บเป็น base64 ไม่ได้เข้ารหัส). ห้ามคัดลอกเนื้อหาไฟล์เหล่านี้ลงเอกสาร/แชท/git (มีรหัสผ่านฐานข้อมูลจริง).

ทำงานอย่างไร (สร้าง Provider)

  1. POST /admin/providers (ต้อง AdminAuth) → tenantHandler.Create → Service.CreateProvider (application/tenant/service.go:28).
  2. ทดสอบเชื่อมต่อจริงก่อน: ConnectionTester.TestConnection เปิด pgx.Connect แล้ว Ping (adapter/outbound/tenant/connection_tester.go:26-34); ล้มเหลว → KindValidation ("could not connect to the database with the given connection details").
  3. เข้ารหัสรหัสผ่านด้วย codec.Encode = base64 มาตรฐาน (outbound/crypto Encode, ไฟล์ base64_codec.go:19-21).
  4. NewProvider ตรวจ code ^[A-Z0-9]{2,20}$, ชื่อไม่ว่าง, connection ครบ (host, port>0, database, user, password) แล้วตั้ง Status = active (domain/tenant/provider.go:70-92).
  5. repo.Save (jsonfile_repository.go:64): ล็อก mutex → อ่านดัชนี → ถ้า code ซ้ำคืน ErrProviderCodeExists (แปลงเป็น 409) → เขียนไฟล์ connection ก่อน แล้วค่อยต่อท้ายดัชนี (ถ้าพังกลางคัน ได้ไฟล์กำพร้า ไม่ใช่ดัชนีชี้ไปที่ไม่มี).
  6. ตอนใช้งาน GetProviderConnection (service.go:66) อ่านแล้ว codec.Decode คืน connection รหัสผ่านจริงให้ resolver ของ identity/query/blob (โมเดลผู้เช่าหลายราย: Tenant, Provider, Main DB, Company (Multi-tenant model)).

รูปแบบไฟล์

  • providerlist.json (ดัชนี): แต่ละแถว code, name, status, createdAt (jsonfile_repository.go:22-28) — List คืนเฉพาะข้อมูลนี้ ไม่แตะไฟล์ connection (:134).
  • SMLConfig<CODE>.json: host, port, database, user, password (base64), sslmode (:30-37); ชื่อไฟล์มาจาก Provider.ConfigFileName() (provider.go:96).
  • เขียนแบบ atomic: เขียน *.tmp ด้วยสิทธิ์ 0o600 แล้ว os.Rename ทับ (writeJSONAtomic, :205-215). โฟลเดอร์สร้างด้วย 0o755 (:54-59).
  • Get เทียบ code แบบไม่สนตัวพิมพ์ (strings.EqualFold, :94-108); ไม่พบ → ErrProviderNotFound → 404.

ข้อจำกัด / ข้อควรระวัง

ที่มาในโค้ด

  • backend/internal/adapter/outbound/tenant/jsonfile_repository.go:20-60 — ชื่อไฟล์ รูปแบบ และ constructor.
  • backend/internal/adapter/outbound/tenant/jsonfile_repository.go:64-92 — Save.
  • backend/internal/adapter/outbound/tenant/jsonfile_repository.go:205-215 — เขียนแบบ atomic.
  • backend/internal/application/tenant/service.go:28-80 — CreateProvider, ListProviders, GetProviderConnection.
  • backend/internal/adapter/outbound/tenant/connection_tester.go:26-34 — ทดสอบเชื่อมต่อ.
  • backend/internal/domain/tenant/provider.go:70-97 — NewProvider, ConfigFileName.

ดูเพิ่ม

ภาพรวม Backend Go ของ SML Ai Account (Backend overview) · โมเดลผู้เช่าหลายราย: Tenant, Provider, Main DB, Company (Multi-tenant model) · ตัวแปรสภาพแวดล้อมและการโหลด config ของ backend (Environment config) · ADR-0001 เก็บ config ของผู้เช่า (Provider) เป็นไฟล์ JSON ไม่ใช่ตาราง DB · ADR-0002 รหัสผ่าน DB ของผู้เช่าเก็บเป็น base64 ไม่ได้เข้ารหัส · สารบัญ ADR ของ backend (Architecture Decision Records)