feat: integrate Grafana dashboards into BOC DashboardPage
- Add Infrastructure Health section with CPU/Memory/Disk panels - Add Service Status section with PM2/Docker panels - Create GrafanaPanel component for iframe embedding - Build passes successfully
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
package handlers
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"os"
|
||||
|
||||
"boc/ledger"
|
||||
)
|
||||
|
||||
// FinanceHandlerV2 uses RobustClient for ledger integration
|
||||
type FinanceHandlerV2 struct {
|
||||
ledgerClient *ledger.RobustClient
|
||||
}
|
||||
|
||||
// NewFinanceHandlerV2 creates a new finance handler with ledger integration
|
||||
func NewFinanceHandlerV2() *FinanceHandlerV2 {
|
||||
ledgerDBURL := os.Getenv("LEDGER_DB_URL")
|
||||
if ledgerDBURL == "" {
|
||||
ledgerDBURL = "postgres://postgres:postgres@localhost:5432/aamos_ledger?sslmode=disable"
|
||||
}
|
||||
|
||||
client, err := ledger.NewRobustClient(ledgerDBURL)
|
||||
if err != nil {
|
||||
// Fallback: create handler without ledger
|
||||
return &FinanceHandlerV2{}
|
||||
}
|
||||
|
||||
return &FinanceHandlerV2{ledgerClient: client}
|
||||
}
|
||||
|
||||
func (h *FinanceHandlerV2) GetBalanceSheet(w http.ResponseWriter, r *http.Request) {
|
||||
if h.ledgerClient == nil {
|
||||
writeError(w, http.StatusServiceUnavailable, "ledger not available")
|
||||
return
|
||||
}
|
||||
|
||||
period := r.URL.Query().Get("period")
|
||||
bs, err := h.ledgerClient.GetBalanceSheet(r.Context(), period)
|
||||
if err != nil {
|
||||
writeError(w, http.StatusInternalServerError, "failed to get balance sheet")
|
||||
return
|
||||
}
|
||||
|
||||
writeJSON(w, http.StatusOK, map[string]interface{}{
|
||||
"ok": true,
|
||||
"report": bs,
|
||||
})
|
||||
}
|
||||
|
||||
func (h *FinanceHandlerV2) GetIncomeStatement(w http.ResponseWriter, r *http.Request) {
|
||||
if h.ledgerClient == nil {
|
||||
writeError(w, http.StatusServiceUnavailable, "ledger not available")
|
||||
return
|
||||
}
|
||||
|
||||
period := r.URL.Query().Get("period")
|
||||
is, err := h.ledgerClient.GetIncomeStatement(r.Context(), period)
|
||||
if err != nil {
|
||||
writeError(w, http.StatusInternalServerError, "failed to get income statement")
|
||||
return
|
||||
}
|
||||
|
||||
writeJSON(w, http.StatusOK, map[string]interface{}{
|
||||
"ok": true,
|
||||
"report": is,
|
||||
})
|
||||
}
|
||||
|
||||
func (h *FinanceHandlerV2) GetMomsReport(w http.ResponseWriter, r *http.Request) {
|
||||
if h.ledgerClient == nil {
|
||||
writeError(w, http.StatusServiceUnavailable, "ledger not available")
|
||||
return
|
||||
}
|
||||
|
||||
period := r.URL.Query().Get("period")
|
||||
report, err := h.ledgerClient.GetMomsReport(r.Context(), period)
|
||||
if err != nil {
|
||||
writeError(w, http.StatusInternalServerError, "failed to get moms report")
|
||||
return
|
||||
}
|
||||
|
||||
writeJSON(w, http.StatusOK, map[string]interface{}{
|
||||
"ok": true,
|
||||
"report": report,
|
||||
})
|
||||
}
|
||||
|
||||
func (h *FinanceHandlerV2) GetAccounts(w http.ResponseWriter, r *http.Request) {
|
||||
if h.ledgerClient == nil {
|
||||
writeError(w, http.StatusServiceUnavailable, "ledger not available")
|
||||
return
|
||||
}
|
||||
|
||||
accounts, err := h.ledgerClient.GetAccounts(r.Context())
|
||||
if err != nil {
|
||||
writeError(w, http.StatusInternalServerError, "failed to get accounts")
|
||||
return
|
||||
}
|
||||
|
||||
writeJSON(w, http.StatusOK, map[string]interface{}{
|
||||
"ok": true,
|
||||
"accounts": accounts,
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user