Demo

PluginEnv

Configuration အလွှာနှစ်ခု ရှိပါသည် — infrastructure အတွက် process env / base .env (Postgres, Redis) နှင့် @InjectEnv ဖြင့် plugin-scoped Env (env table၊ isPublic / isSecret)။

Configuration အလွှာနှစ်ခု

  • Base process env — DB_*၊ Redis၊ MODE၊ path များ (base/backend/.env သို့မဟုတ် Compose); process.env ဖြင့် ဖတ်ပါသည်
  • Plugin Env (@InjectEnv) — လက်ရှိ plugin နှင့် scoped key/value; boot တွင် Postgres မှ load; ERP env UI / /env API မှ ပြင်နိုင်ပါသည်
  • Secret များကို git ထဲ မထည့်ရပါ — .env (local) သို့မဟုတ် env table (runtime)
  • Base process-env စာရင်း အပြည့် — Environment variables ကို ကြည့်ပါ

Base environment (.env)

Base app နှင့် worker များအတွက် infrastructure connection setting ဖြစ်ပါသည်။ များသောအားဖြင့် base/backend/.env နှင့် Docker Compose မှ လာပါသည်။ သော့ အပြည့်အစုံအတွက် Environment variables ကို ဖွင့်ကြည့်ပါ။

  • DB_HOST, DB_PORT, DB_USERNAME, DB_PASSWORD, DB_SCHEMA — Postgres
  • DB_SYNC — optional TypeORM synchronize (dev သာ)
  • REDIS_HOST, REDIS_PORT, REDIS_PASSWORD — cache၊ queue၊ BullMQ cron
  • Compose တွင် DB_HOST သည် များသောအားဖြင့် service name db
  • Host ပေါ်မှ local psql / module seed အတွက် localhost / 127.0.0.1
TSbase/backend/.env (example)
1DB_HOST=db 2DB_PORT=5432 3DB_USERNAME=postgres 4DB_PASSWORD=postgres 5DB_SCHEMA=quan_erp 6DB_SYNC=false 7REDIS_HOST=redis 8REDIS_PORT=6379 9REDIS_PASSWORD=

@InjectEnv

Module၊ service၊ workflow node စသည်တွင် Env helper ကို inject လုပ်ရပါသည်။ Instance သည် လက်ရှိ plugin နှင့် scoped ဖြစ်ပါသည်။

TSXinject
1import { 2 Env, 3 InjectEnv, 4 Module, 5 OnInit, 6 Service, 7} from "@quan-erp/shared-backend-core"; 8import metadata from "../../module.metadata.json" with { type: "json" }; 9 10@Service() 11export class PaymentConfigService { 12 @InjectEnv() 13 private env: Env; 14 15 getApiKey() { 16 return this.env.get("API_KEY"); 17 } 18} 19 20@Module({ 21 name: metadata.name, 22 providers: [PaymentConfigService], 23 controllers: [], 24 entities: [], 25}) 26export class MyPluginModule { 27 @InjectEnv() 28 env: Env; 29 30 @OnInit() 31 async init() { 32 // seed defaults — see below 33 } 34}

Env API

  • get(key) — plugin-scoped value ဖတ်ပါသည် (secret များကို decrypt)
  • set(key, value, options?) — ရေးပါသည်; InjectEnv default: { isPublic: false, sync: true, isSecret: false }
  • sync() — in-memory registry ကို env table သို့ persist လုပ်ပါသည်
  • onChanged(key, callback) — key ပြောင်းလျှင် react လုပ်ပါသည်
  • clear() — ဤ plugin ၏ env များကို ဖျက်ပါသည်
  • all() — ဤ plugin အတွက် key အားလုံး
TSXget / set / sync
1import { Env, InjectEnv, OnInit, Service } from "@quan-erp/shared-backend-core"; 2 3@Service() 4export class IntegrationSettingsService { 5 @InjectEnv() 6 private env: Env; 7 8 @OnInit() 9 async init() { 10 if (!this.env.get("API_BASE_URL")) { 11 await this.env.set("API_BASE_URL", "https://api.example.com", { 12 isPublic: true, 13 isSecret: false, 14 sync: true, 15 }); 16 } 17 18 if (!this.env.get("API_KEY")) { 19 await this.env.set("API_KEY", "", { 20 isPublic: false, 21 isSecret: true, 22 sync: true, 23 }); 24 } 25 26 this.env.onChanged("API_KEY", () => { 27 // reload clients that cache the key 28 }); 29 } 30 31 async rotateKey(next: string) { 32 await this.env.set("API_KEY", next, { 33 isSecret: true, 34 sync: true, 35 }); 36 } 37}

set() options

  • sync — Postgres သို့ ချက်ချင်း ရေးပါသည်
  • isPublic — GET /env/public တွင် ဖော်ပြပါသည်
  • isSecret — at rest encrypt; listing တွင် mask လုပ်ပါသည်
  • API key / token / password အတွက် isSecret: true
  • UI က owner မလိုဘဲ ဖတ်ရမည့် non-sensitive value အတွက်သာ isPublic: true

Persistence & boot

Startup တွင် core က env table မှ load လုပ်ပါသည်။ set({ sync: true }) သို့မဟုတ် env.sync() ဖြင့် EnvService မှတဆင့် persist လုပ်ပါသည်။

  • Table: env (EnvEntity) — pluginName, key, value, isPublic, isSecret
  • Boot: PluginEnvConfigManager.loadFromDB()
  • Secret များကို encrypt သိမ်းပါသည်; get() က decrypt လုပ်ပါသည်
  • Admin UI / API bulk update ပြီး restart status broadcast နိုင်ပါသည်

HTTP surface (core)

  • GET /env — owner; secret mask
  • GET /env/public — isPublic: true သာ
  • GET /env/db — owner; EnvService raw rows
  • PUT /env — key တစ်ခု set + sync
  • PUT /env/many — bulk set ပြီး syncToDB
  • Plugin code တွင် @InjectEnv() ကို အသုံးပြုရပါသည် — HTTP route မခေါ်ရပါ

မည်သည့်အချိန်တွင် မည်သည်ကို သုံးမည်

  • process.env / .env — host၊ port၊ Redis၊ Compose၊ @Database options
  • @InjectEnv — redeploy မလုပ်ဘဲ ERP UI မှ ပြင်သော per-plugin setting
  • DeveloperConfigService — typed developer config (Env နှင့် မတူပါ)
  • SettingEntity / SettingService — user/system setting UI (Env နှင့် မတူပါ)

Local-only လုပ်ဆောင်ချက်များ

DB_* ကို .env မှ ဖတ်သော module seed စသည်တို့သည် local/dev host (localhost / 127.0.0.1) သို့သာ ဖြစ်ပါသည်။ UAT / production တွင် မလုပ်ရပါ။

  • Local INSERT pattern အတွက် Module seed ကို ကြည့်ပါ
  • DB_HOST က remote UAT/prod ဖြစ်လျှင် ရပ်ရပါသည်

Package version များ

Plugin package.json ရှိ @quan-erp/* version များကို base / shared-backend-core နှင့် ကိုက်အောင် ထားရပါသည်။

Checklist

  • Infrastructure secret များကို base/backend/.env တွင် ထားရပါသည်
  • @InjectEnv() ကို property ပေါ်တွင် သုံးရပါသည် (constructor မရပါ)
  • @OnInit တွင် missing key များကို isPublic / isSecret / sync ဖြင့် seed လုပ်ရပါသည်
  • API key များကို isSecret: true
  • ဘေးကင်းသော UI value အတွက်သာ isPublic
  • Restart ခံနိုင်အောင် sync() သို့မဟုတ် sync: true