From ca24a9c1f2d9998fb90811567708d0ace209d05f Mon Sep 17 00:00:00 2001 From: Pasha Date: Mon, 21 Jul 2025 17:31:44 +0300 Subject: [PATCH] start logic webhook and added model for webhook payload --- internal/models/alchemy/webhook.go | 39 +++++++++++++++++++ internal/payment_provider/alchemy/provider.go | 16 +++++++- 2 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 internal/models/alchemy/webhook.go diff --git a/internal/models/alchemy/webhook.go b/internal/models/alchemy/webhook.go new file mode 100644 index 0000000..f819fd9 --- /dev/null +++ b/internal/models/alchemy/webhook.go @@ -0,0 +1,39 @@ +package alchemy + +type AlchemyAddressActivityWebhook struct { + CreatedAt string `json:"createdAt"` + Event struct { + Activity []struct { + Asset string `json:"asset"` + BlockNum string `json:"blockNum"` + Category string `json:"category"` + //Erc1155Metadata interface{} `json:"erc1155Metadata"` + //Erc721TokenId interface{} `json:"erc721TokenId"` + FromAddress string `json:"fromAddress"` + Hash string `json:"hash"` + Log struct { + Address string `json:"address"` + BlockHash string `json:"blockHash"` + BlockNumber string `json:"blockNumber"` + Data string `json:"data"` + LogIndex string `json:"logIndex"` + Removed bool `json:"removed"` + Topics []string `json:"topics"` + TransactionHash string `json:"transactionHash"` + TransactionIndex string `json:"transactionIndex"` + } `json:"log"` + RawContract struct { + Address string `json:"address"` + Decimals int `json:"decimals"` + RawValue string `json:"rawValue"` + } `json:"rawContract"` + ToAddress string `json:"toAddress"` + //TypeTraceAddress interface{} `json:"typeTraceAddress"` + Value float64 `json:"value"` + } `json:"activity"` + Network string `json:"network"` + } `json:"event"` + ID string `json:"id"` + Type string `json:"type"` + WebhookId string `json:"webhookId"` +} diff --git a/internal/payment_provider/alchemy/provider.go b/internal/payment_provider/alchemy/provider.go index 65fe985..a0791a4 100644 --- a/internal/payment_provider/alchemy/provider.go +++ b/internal/payment_provider/alchemy/provider.go @@ -2,8 +2,10 @@ package alchemy import ( "context" + "fmt" "gitea.pena/PenaSide/treasurer/internal/errors" "gitea.pena/PenaSide/treasurer/internal/models" + "gitea.pena/PenaSide/treasurer/internal/models/alchemy" "github.com/gofiber/fiber/v2" "go.uber.org/zap" ) @@ -11,6 +13,7 @@ import ( const ProviderName = "alchemy" type Config struct { + WalletAddress string `json:"walletAddress"` } type Provider struct { @@ -47,5 +50,16 @@ func (p *Provider) RegisterWebhookHandlers(router fiber.Router) { } func (p *Provider) handleWebhook(ctx *fiber.Ctx) error { - return nil + var payload alchemy.AlchemyAddressActivityWebhook + if err := ctx.BodyParser(&payload); err != nil { + return ctx.Status(fiber.StatusBadRequest).SendString(fmt.Sprintf("failed to parse Alchemy webhook: %s", err.Error())) + } + + for _, act := range payload.Event.Activity { + if act.ToAddress != p.config.WalletAddress { + continue + } + //TODO: найти инвойс по act.Value и act.FromAddress + } + return ctx.SendStatus(fiber.StatusOK) }