diff --git a/api/config.go b/api/config.go index f81368a0..f5abff38 100644 --- a/api/config.go +++ b/api/config.go @@ -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, @@ -66,5 +66,6 @@ func NewServices(config APIConfig, repos repository.Repositories) service.Servic Device: device, Card: card, KYC: kyc, + Webhook: webhook, } } diff --git a/pkg/internal/persona/event.go b/pkg/internal/persona/event.go index ae089bc4..05601604 100644 --- a/pkg/internal/persona/event.go +++ b/pkg/internal/persona/event.go @@ -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 @@ -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"` @@ -51,6 +56,7 @@ 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 @@ -58,6 +64,7 @@ func (a EventAttributes) GetPayloadData() (PayloadData, error) { 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 @@ -65,10 +72,12 @@ func (a EventAttributes) GetPayloadData() (PayloadData, error) { 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())) } } diff --git a/pkg/service/persona_webhook.go b/pkg/service/persona_webhook.go index 4b13e116..64e97daa 100644 --- a/pkg/service/persona_webhook.go +++ b/pkg/service/persona_webhook.go @@ -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 { @@ -35,6 +37,7 @@ 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)) } } @@ -42,6 +45,7 @@ func (p personaWebhook) processEvent(ctx context.Context, event persona.Event) e 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") @@ -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") @@ -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")