mirror of
https://github.com/GMWalletApp/epusdt.git
synced 2026-07-07 18:26:16 +00:00
feat: add admin panel with multi-chain support and notification system
- Add full admin REST API: auth, API keys, chains, chain tokens, wallets, orders, RPC nodes, settings, dashboard stats, notifications - Add JWT-based admin authentication and API key auth middleware - Add multi-chain listeners: BSC, ETH, Polygon, Plasma, EVM WebSocket - Add RPC node health check job with automatic failover - Add Telegram notification channel for order events - Add installer for first-run database initialization - Add new DB models: admin_user, api_key, chain, chain_token, rpc_node, settings, notification_channel - Add order statistics aggregation (daily/monthly/by-chain) - Serve built admin SPA from embedded www/ assets - Add comprehensive test coverage for all new features
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
package admin
|
||||
|
||||
import (
|
||||
"github.com/assimon/luuu/model/data"
|
||||
"github.com/labstack/echo/v4"
|
||||
)
|
||||
|
||||
// UpdateChainRequest is the payload for updating chain settings.
|
||||
type UpdateChainRequest struct {
|
||||
Enabled *bool `json:"enabled" example:"true"`
|
||||
MinConfirmations *int `json:"min_confirmations" example:"20"`
|
||||
ScanIntervalSec *int `json:"scan_interval_sec" example:"5"`
|
||||
DisplayName *string `json:"display_name" example:"Tron"`
|
||||
}
|
||||
|
||||
// ListChains returns the chains table (tron/ethereum/solana seeded; new
|
||||
// networks like bsc/polygon inserted manually once supported).
|
||||
// @Summary List chains
|
||||
// @Description Returns all supported blockchain networks
|
||||
// @Tags Admin Chains
|
||||
// @Security AdminJWT
|
||||
// @Produce json
|
||||
// @Success 200 {object} response.ApiResponse{data=[]mdb.Chain}
|
||||
// @Failure 400 {object} response.ApiResponse
|
||||
// @Router /admin/api/v1/chains [get]
|
||||
func (c *BaseAdminController) ListChains(ctx echo.Context) error {
|
||||
rows, err := data.ListChains()
|
||||
if err != nil {
|
||||
return c.FailJson(ctx, err)
|
||||
}
|
||||
return c.SucJson(ctx, rows)
|
||||
}
|
||||
|
||||
// UpdateChain toggles enabled / tweaks scan params. Scanners re-read the
|
||||
// chains table on every poll tick, so changes take effect within one
|
||||
// cycle without a restart.
|
||||
// @Summary Update chain
|
||||
// @Description Toggle enabled / tweak scan params for a chain
|
||||
// @Tags Admin Chains
|
||||
// @Security AdminJWT
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param network path string true "Network name (e.g. tron, ethereum, solana)"
|
||||
// @Param request body admin.UpdateChainRequest true "Chain settings"
|
||||
// @Success 200 {object} response.ApiResponse
|
||||
// @Failure 400 {object} response.ApiResponse
|
||||
// @Router /admin/api/v1/chains/{network} [patch]
|
||||
func (c *BaseAdminController) UpdateChain(ctx echo.Context) error {
|
||||
network := ctx.Param("network")
|
||||
req := new(UpdateChainRequest)
|
||||
if err := ctx.Bind(req); err != nil {
|
||||
return c.FailJson(ctx, err)
|
||||
}
|
||||
fields := map[string]interface{}{}
|
||||
if req.Enabled != nil {
|
||||
fields["enabled"] = *req.Enabled
|
||||
}
|
||||
if req.MinConfirmations != nil {
|
||||
fields["min_confirmations"] = *req.MinConfirmations
|
||||
}
|
||||
if req.ScanIntervalSec != nil {
|
||||
fields["scan_interval_sec"] = *req.ScanIntervalSec
|
||||
}
|
||||
if req.DisplayName != nil {
|
||||
fields["display_name"] = *req.DisplayName
|
||||
}
|
||||
if err := data.UpdateChainFields(network, fields); err != nil {
|
||||
return c.FailJson(ctx, err)
|
||||
}
|
||||
return c.SucJson(ctx, nil)
|
||||
}
|
||||
Reference in New Issue
Block a user