Skip to main content
Glama

Controtto

by contre95
pairsHanlders.go4.1 kB
package rest import ( "controtto/src/app/managing" "controtto/src/app/querying" "fmt" "log/slog" "slices" "strconv" "time" "github.com/gofiber/fiber/v2" ) func pairCards(tpq querying.PairsQuerier, pq *managing.PriceProviderManager) func(*fiber.Ctx) error { return func(c *fiber.Ctx) error { priceStr := c.Query("price") var errMsg string var price float64 name := "ERROR" color := "#E0663D" id := c.Params("id") req := querying.GetPairReq{TPID: id} resp, err := tpq.GetPair(req) if err != nil { return c.Render("pairCards", fiber.Map{ "Error": err.Error(), }) } if priceStr != "" { if price, err = strconv.ParseFloat(priceStr, 64); err == nil { name = "Custom" color = "#67697C" } else { name = "BadPrice" color = "#E0668D" } } else if priceResp, err := pq.QueryPrice(managing.QueryPriceReq{ AssetSymbolA: resp.Pair.BaseAsset.Symbol, AssetSymbolB: resp.Pair.QuoteAsset.Symbol, }); err == nil { price = priceResp.Price name = priceResp.ProviderName color = priceResp.ProviderColor } fmt.Println("Price", price) req.BasePrice = price req.WithCalculations = true resp, err = tpq.GetPair(req) if err != nil { return c.Render("pairCards", fiber.Map{ "Error": err.Error(), }) } slices.Reverse(resp.Pair.Trades) return c.Render("pairCards", fiber.Map{ "Today": time.Now().Format("Mon Jan 02 15:04 2006"), "Pair": resp.Pair, "Price": price, "PriceProviderName": name, "PriceProviderColor": color, "Error": errMsg != "", "ErrMsg": errMsg, }) } } func newPairForm(aq querying.AssetsQuerier) func(*fiber.Ctx) error { return func(c *fiber.Ctx) error { req := querying.ListAssetsReq{} resp, err := aq.ListAssets(req) if err != nil { return c.Render("toastErr", fiber.Map{ "Title": "Error", "Msg": err, }) } return c.Render("newPairForm", fiber.Map{ "Title": "New Pair", "Assets": resp.Assets, }) } } func getAssetColor(aq querying.AssetsQuerier) func(*fiber.Ctx) error { return func(c *fiber.Ctx) error { symbol := c.Params("symbol") req := querying.QueryAssetReq{ Symbol: symbol, } resp, err := aq.GetAsset(req) if err != nil { return c.SendString("") } return c.SendString(resp.Asset.Color) } } // Tables handler that renderizer the tables view and returns it to the client func tradesTable(aq querying.PairsQuerier) func(*fiber.Ctx) error { return func(c *fiber.Ctx) error { slog.Info("Trades table requested") req := querying.ListPairsReq{} resp, err := aq.ListPairs(req) if err != nil { return c.Render("toastErr", fiber.Map{ "Title": "Error", "Msg": err, }) } return c.Render("tradesTable", fiber.Map{ "Title": "Trading Pairs", "Pairs": resp.Pairs, }) } } func deletePair(tpm managing.PairsManager) func(*fiber.Ctx) error { return func(c *fiber.Ctx) error { req := managing.DeletePairReq{ ID: c.Params("id"), } slog.Info("Delete", "id", req.ID) resp, err := tpm.DeletePair(req) if err != nil { return c.Render("toastErr", fiber.Map{ "Title": "Error", "Msg": err, }) } slog.Info("Trading pair deleted", "trading-pair", resp.ID) c.Append("HX-Trigger", "newPair") return c.Render("toastOk", fiber.Map{ "Title": "Deleted", "Msg": "Pair deleted", }) } } func newPair(tpc managing.PairsManager) func(*fiber.Ctx) error { return func(c *fiber.Ctx) error { slog.Info("Creating new pair") payload := struct { Quote string `form:"quote"` Base string `form:"base"` }{} if err := c.BodyParser(&payload); err != nil { return err } req := managing.CreatePairReq{ BaseAssetSymbol: payload.Base, QuoteAssetSymbol: payload.Quote, } slog.Info("Creating", "req", req) resp, err := tpc.Create(req) if err != nil { return c.Render("toastErr", fiber.Map{ "Title": "Error", "Msg": err, }) } c.Append("HX-Trigger", "newPair") return c.Render("toastOk", fiber.Map{ "Title": "Created", "Msg": resp.Msg, }) } }

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/contre95/controtto'

If you have feedback or need assistance with the MCP directory API, please join our Discord server