Skip to content

fix webhook service registration and data payload #244

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion api/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ func NewServices(config APIConfig, repos repository.Repositories) service.Servic
card := service.NewCard(repos)

kyc := service.NewKYC(repos)

webhook := service.NewWebhook()
return service.Services{
Auth: auth,
Cost: cost,
Expand All @@ -66,5 +66,6 @@ func NewServices(config APIConfig, repos repository.Repositories) service.Servic
Device: device,
Card: card,
KYC: kyc,
Webhook: webhook,
}
}
9 changes: 9 additions & 0 deletions pkg/internal/persona/event.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (

"github.com/String-xyz/go-lib/v2/common"
"github.com/cockroachdb/errors"
"github.com/rs/zerolog/log"
)

type EventType string
Expand All @@ -28,6 +29,10 @@ type EventPayload struct {
Data json.RawMessage `json:"data"`
}

type EventPayloadData struct {
Data Event `json:"data"`
}

type Event struct {
Id string `json:"id"`
Type string `json:"type"`
Expand All @@ -51,24 +56,28 @@ func (a EventAttributes) GetPayloadData() (PayloadData, error) {
var data Account
err := json.Unmarshal(a.Payload.Data, &data)
if err != nil {
log.Error().Err(err).Msg("failed to unmarshal account")
return nil, common.StringError(err)
}
return data, nil
case EventTypeInquiryCreated, EventTypeInquiryStarted, EventTypeInquiryCompleted:
var data Inquiry
err := json.Unmarshal(a.Payload.Data, &data)
if err != nil {
log.Error().Err(err).Msg("failed to unmarshal inquiry")
return nil, common.StringError(err)
}
return data, nil
case EventTypeVerificationCreated, EventTypeVerificationPassed, EventTypeVerificationFailed:
var data Verification
err := json.Unmarshal(a.Payload.Data, &data)
if err != nil {
log.Error().Err(err).Msg("failed to unmarshal verification")
return nil, common.StringError(err)
}
return data, nil
default:
log.Error().Msgf("unknown event type: %s", a.GetType())
return nil, common.StringError(errors.Newf("unknown event type: %s", a.GetType()))
}
}
10 changes: 8 additions & 2 deletions pkg/service/persona_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,19 @@ import (
type personaWebhook struct{}

func (p personaWebhook) Handle(ctx context.Context, data []byte) error {
event := persona.Event{}
event := persona.EventPayloadData{}
err := json.Unmarshal(data, &event)
if err != nil {
log.Error().Err(err).Str("data", string(data)).Msg("error unmarshalling webhook event")
return common.StringError(errors.Newf("error unmarshalling webhook event: %v", err))
}
return p.processEvent(ctx, event)
return p.processEvent(ctx, event.Data)
}

func (p personaWebhook) processEvent(ctx context.Context, event persona.Event) error {
payload, err := event.Attributes.GetPayloadData()
if err != nil {
log.Error().Err(err).Interface("event", event).Msg("error getting payload data")
return common.StringError(errors.Newf("error getting payload data: %v", err))
}
switch event.Attributes.Name {
Expand All @@ -35,13 +37,15 @@ func (p personaWebhook) processEvent(ctx context.Context, event persona.Event) e
case persona.EventTypeVerificationCreated, persona.EventTypeVerificationPassed, persona.EventTypeVerificationFailed:
return p.verification(ctx, payload, event.Attributes.Name)
default:
log.Error().Interface("event", event).Msg("unknown event type")
return common.StringError(errors.Newf("unknown event type: %s", event.Attributes.Name))
}
}

func (p personaWebhook) account(ctx context.Context, payload persona.PayloadData, eventType persona.EventType) error {
account, ok := payload.(persona.Account)
if !ok {
log.Error().Interface("payload", payload).Msg("error casting payload to account")
return common.StringError(errors.New("error casting payload to account"))
}
log.Info().Interface("account", account).Msg("account event")
Expand All @@ -51,6 +55,7 @@ func (p personaWebhook) account(ctx context.Context, payload persona.PayloadData
func (p personaWebhook) inquiry(ctx context.Context, payload persona.PayloadData, eventType persona.EventType) error {
inquiry, ok := payload.(persona.Inquiry)
if !ok {
log.Error().Interface("payload", payload).Msg("error casting payload to inquiry")
return common.StringError(errors.New("error casting payload to inquiry"))
}
log.Info().Interface("inquiry", inquiry).Msg("inquiry event")
Expand All @@ -60,6 +65,7 @@ func (p personaWebhook) inquiry(ctx context.Context, payload persona.PayloadData
func (p personaWebhook) verification(ctx context.Context, payload persona.PayloadData, eventType persona.EventType) error {
verification, ok := payload.(persona.Verification)
if !ok {
log.Error().Interface("payload", payload).Msg("error casting payload to verification")
return common.StringError(errors.New("error casting payload to verification"))
}
log.Info().Interface("verification", verification).Msg("verification event")
Expand Down