mirror of
https://github.com/alexgo-io/gaze-indexer.git
synced 2026-01-12 08:34:28 +08:00
* feat: recover nodesale module. * fix: refactored. * fix: fix table type. * fix: add entity * fix: bug UTC time. * ci: try to tidy before testing * ci: touch result file * ci: use echo to create new file * fix: try to skip test in ci * fix: remove os.Exit * fix: handle error * feat: add todo note * fix: Cannot run nodesale test because qtx is not initiated. * fix: 50% chance public key compare incorrectly. * fix: more consistent SQL * fix: sanity refactor. * fix: remove unused code. * fix: move last_block_default to config file. * fix: minor mistakes. * fix: * fix: refactor * fix: refactor * fix: delegate tx hash not record into db. * refactor: prepare for moving integration tests. * refactor: convert to unit tests. * fix: change to using input values since output values deducted fee. * feat: add extra unit test. * fix: wrong timestamp format. * fix: handle block timeout = 0 --------- Co-authored-by: Gaze <gazenw@users.noreply.github.com>
100 lines
3.0 KiB
Go
100 lines
3.0 KiB
Go
package httphandler
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/cockroachdb/errors"
|
|
"github.com/gaze-network/indexer-network/common/errs"
|
|
"github.com/gaze-network/indexer-network/modules/nodesale/datagateway"
|
|
"github.com/gaze-network/indexer-network/modules/nodesale/protobuf"
|
|
"github.com/gofiber/fiber/v2"
|
|
"google.golang.org/protobuf/encoding/protojson"
|
|
)
|
|
|
|
type deployRequest struct {
|
|
DeployID string `params:"deployId"`
|
|
}
|
|
|
|
type tierResponse struct {
|
|
PriceSat uint32 `json:"priceSat"`
|
|
Limit uint32 `json:"limit"`
|
|
MaxPerAddress uint32 `json:"maxPerAddress"`
|
|
Sold int64 `json:"sold"`
|
|
}
|
|
|
|
type deployResponse struct {
|
|
Id string `json:"id"`
|
|
Name string `json:"name"`
|
|
StartsAt int64 `json:"startsAt"`
|
|
EndsAt int64 `json:"endsAt"`
|
|
Tiers []tierResponse `json:"tiers"`
|
|
SellerPublicKey string `json:"sellerPublicKey"`
|
|
MaxPerAddress uint32 `json:"maxPerAddress"`
|
|
DeployTxHash string `json:"deployTxHash"`
|
|
}
|
|
|
|
func (h *handler) deployHandler(ctx *fiber.Ctx) error {
|
|
var request deployRequest
|
|
err := ctx.ParamsParser(&request)
|
|
if err != nil {
|
|
return errors.Wrap(err, "cannot parse param")
|
|
}
|
|
var blockHeight uint64
|
|
var txIndex uint32
|
|
count, err := fmt.Sscanf(request.DeployID, "%d-%d", &blockHeight, &txIndex)
|
|
if count != 2 || err != nil {
|
|
return errs.NewPublicError("Invalid deploy ID")
|
|
}
|
|
deploys, err := h.nodeSaleDg.GetNodeSale(ctx.UserContext(), datagateway.GetNodeSaleParams{
|
|
BlockHeight: blockHeight,
|
|
TxIndex: txIndex,
|
|
})
|
|
if err != nil {
|
|
return errors.Wrap(err, "Cannot get NodeSale from db")
|
|
}
|
|
if len(deploys) < 1 {
|
|
return errs.NewPublicError("NodeSale not found")
|
|
}
|
|
|
|
deploy := deploys[0]
|
|
|
|
nodeCount, err := h.nodeSaleDg.GetNodeCountByTierIndex(ctx.UserContext(), datagateway.GetNodeCountByTierIndexParams{
|
|
SaleBlock: deploy.BlockHeight,
|
|
SaleTxIndex: deploy.TxIndex,
|
|
FromTier: 0,
|
|
ToTier: uint32(len(deploy.Tiers) - 1),
|
|
})
|
|
if err != nil {
|
|
return errors.Wrap(err, "Cannot get node count from db")
|
|
}
|
|
|
|
tiers := make([]protobuf.Tier, len(deploy.Tiers))
|
|
tierResponses := make([]tierResponse, len(deploy.Tiers))
|
|
for i, tierJson := range deploy.Tiers {
|
|
tier := &tiers[i]
|
|
err := protojson.Unmarshal(tierJson, tier)
|
|
if err != nil {
|
|
return errors.Wrap(err, "Failed to decode tiers json")
|
|
}
|
|
tierResponses[i].Limit = tiers[i].Limit
|
|
tierResponses[i].MaxPerAddress = tiers[i].MaxPerAddress
|
|
tierResponses[i].PriceSat = tiers[i].PriceSat
|
|
tierResponses[i].Sold = nodeCount[i].Count
|
|
}
|
|
|
|
err = ctx.JSON(&deployResponse{
|
|
Id: request.DeployID,
|
|
Name: deploy.Name,
|
|
StartsAt: deploy.StartsAt.UTC().Unix(),
|
|
EndsAt: deploy.EndsAt.UTC().Unix(),
|
|
Tiers: tierResponses,
|
|
SellerPublicKey: deploy.SellerPublicKey,
|
|
MaxPerAddress: deploy.MaxPerAddress,
|
|
DeployTxHash: deploy.DeployTxHash,
|
|
})
|
|
if err != nil {
|
|
return errors.Wrap(err, "Go fiber cannot parse JSON")
|
|
}
|
|
return nil
|
|
}
|