Skip to content

Commit

Permalink
chore: refactor identity state code
Browse files Browse the repository at this point in the history
  • Loading branch information
martinsaporiti committed Jul 30, 2024
1 parent 5627fa1 commit 47d36c4
Show file tree
Hide file tree
Showing 4 changed files with 349 additions and 118 deletions.
118 changes: 0 additions & 118 deletions internal/api/identity.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,8 @@ import (
"github.com/iden3/go-schema-processor/v2/verifiable"

"github.com/polygonid/sh-id-platform/internal/common"
"github.com/polygonid/sh-id-platform/internal/core/domain"
"github.com/polygonid/sh-id-platform/internal/core/ports"
"github.com/polygonid/sh-id-platform/internal/core/services"
"github.com/polygonid/sh-id-platform/internal/gateways"
"github.com/polygonid/sh-id-platform/internal/kms"
"github.com/polygonid/sh-id-platform/internal/log"
)
Expand Down Expand Up @@ -192,119 +190,3 @@ func (s *Server) GetIdentityDetails(ctx context.Context, request GetIdentityDeta

return response, nil
}

// PublishIdentityState - publish identity state on chain
func (s *Server) PublishIdentityState(ctx context.Context, request PublishIdentityStateRequestObject) (PublishIdentityStateResponseObject, error) {
did, err := w3c.ParseDID(request.Identifier)
if err != nil {
return PublishIdentityState400JSONResponse{N400JSONResponse{"invalid did"}}, nil
}

publishedState, err := s.publisherGateway.PublishState(ctx, did)
if err != nil {
if errors.Is(err, gateways.ErrNoStatesToProcess) || errors.Is(err, gateways.ErrStateIsBeingProcessed) {
return PublishIdentityState200JSONResponse{Message: err.Error()}, nil
}
return PublishIdentityState500JSONResponse{N500JSONResponse{err.Error()}}, nil
}

return PublishIdentityState202JSONResponse{
ClaimsTreeRoot: publishedState.ClaimsTreeRoot,
RevocationTreeRoot: publishedState.RevocationTreeRoot,
RootOfRoots: publishedState.RootOfRoots,
State: publishedState.State,
TxID: publishedState.TxID,
}, nil
}

// RetryPublishState - retry to publish the current state if it failed previously.
func (s *Server) RetryPublishState(ctx context.Context, request RetryPublishStateRequestObject) (RetryPublishStateResponseObject, error) {
did, err := w3c.ParseDID(request.Identifier)
if err != nil {
return RetryPublishState400JSONResponse{N400JSONResponse{"invalid did"}}, nil
}

publishedState, err := s.publisherGateway.RetryPublishState(ctx, did)
if err != nil {
log.Error(ctx, "error retrying the publishing the state", "err", err)
if errors.Is(err, gateways.ErrStateIsBeingProcessed) || errors.Is(err, gateways.ErrNoFailedStatesToProcess) {
return RetryPublishState400JSONResponse{N400JSONResponse{Message: err.Error()}}, nil
}
return RetryPublishState500JSONResponse{N500JSONResponse{Message: err.Error()}}, nil
}
return RetryPublishState202JSONResponse{
ClaimsTreeRoot: publishedState.ClaimsTreeRoot,
RevocationTreeRoot: publishedState.RevocationTreeRoot,
RootOfRoots: publishedState.RootOfRoots,
State: publishedState.State,
TxID: publishedState.TxID,
}, nil
}

// GetStateTransactions - get state transactions
func (s *Server) GetStateTransactions(ctx context.Context, request GetStateTransactionsRequestObject) (GetStateTransactionsResponseObject, error) {
did, err := w3c.ParseDID(request.Identifier)
if err != nil {
return GetStateTransactions400JSONResponse{N400JSONResponse{"invalid did"}}, nil
}
states, err := s.identityService.GetStates(ctx, *did)
if err != nil {
log.Error(ctx, "get state transactions", "err", err)
return GetStateTransactions500JSONResponse{N500JSONResponse{Message: err.Error()}}, nil
}

return GetStateTransactions200JSONResponse(stateTransactionsResponse(states)), nil
}

// GetStateStatus - get state status
func (s *Server) GetStateStatus(ctx context.Context, request GetStateStatusRequestObject) (GetStateStatusResponseObject, error) {
did, err := w3c.ParseDID(request.Identifier)
if err != nil {
return GetStateStatus400JSONResponse{N400JSONResponse{"invalid did"}}, nil
}
pendingActions, err := s.identityService.HasUnprocessedAndFailedStatesByID(ctx, *did)
if err != nil {
log.Error(ctx, "get state status", "err", err)
return GetStateStatus500JSONResponse{N500JSONResponse{Message: err.Error()}}, nil
}

return GetStateStatus200JSONResponse{PendingActions: pendingActions}, nil
}

func stateTransactionsResponse(states []domain.IdentityState) StateTransactionsResponse {
stateTransactions := make([]StateTransaction, len(states))
for i := range states {
stateTransactions[i] = toStateTransaction(states[i])
}
return stateTransactions
}

func toStateTransaction(state domain.IdentityState) StateTransaction {
var stateTran, txID string
if state.State != nil {
stateTran = *state.State
}
if state.TxID != nil {
txID = *state.TxID
}
return StateTransaction{
Id: state.StateID,
PublishDate: TimeUTC(state.ModifiedAt),
State: stateTran,
Status: getTransactionStatus(state.Status),
TxID: txID,
}
}

func getTransactionStatus(status domain.IdentityStatus) StateTransactionStatus {
switch status {
case domain.StatusCreated:
return "pending"
case domain.StatusTransacted:
return "transacted"
case domain.StatusConfirmed:
return "published"
default:
return "failed"
}
}
38 changes: 38 additions & 0 deletions internal/api/responses.go
Original file line number Diff line number Diff line change
Expand Up @@ -286,3 +286,41 @@ func deleteConnection500Response(deleteCredentials bool, revokeCredentials bool)
}
return msg
}

func stateTransactionsResponse(states []domain.IdentityState) StateTransactionsResponse {
stateTransactions := make([]StateTransaction, len(states))
for i := range states {
stateTransactions[i] = toStateTransaction(states[i])
}
return stateTransactions
}

func toStateTransaction(state domain.IdentityState) StateTransaction {
var stateTran, txID string
if state.State != nil {
stateTran = *state.State
}
if state.TxID != nil {
txID = *state.TxID
}
return StateTransaction{
Id: state.StateID,
PublishDate: TimeUTC(state.ModifiedAt),
State: stateTran,
Status: getTransactionStatus(state.Status),
TxID: txID,
}
}

func getTransactionStatus(status domain.IdentityStatus) StateTransactionStatus {
switch status {
case domain.StatusCreated:
return "pending"
case domain.StatusTransacted:
return "transacted"
case domain.StatusConfirmed:
return "published"
default:
return "failed"
}
}
89 changes: 89 additions & 0 deletions internal/api/state.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package api

import (
"context"
"errors"

"github.com/iden3/go-iden3-core/v2/w3c"

"github.com/polygonid/sh-id-platform/internal/gateways"
"github.com/polygonid/sh-id-platform/internal/log"
)

// PublishIdentityState - publish identity state on chain
func (s *Server) PublishIdentityState(ctx context.Context, request PublishIdentityStateRequestObject) (PublishIdentityStateResponseObject, error) {
did, err := w3c.ParseDID(request.Identifier)
if err != nil {
return PublishIdentityState400JSONResponse{N400JSONResponse{"invalid did"}}, nil
}

publishedState, err := s.publisherGateway.PublishState(ctx, did)
if err != nil {
if errors.Is(err, gateways.ErrNoStatesToProcess) || errors.Is(err, gateways.ErrStateIsBeingProcessed) {
return PublishIdentityState200JSONResponse{Message: err.Error()}, nil
}
return PublishIdentityState500JSONResponse{N500JSONResponse{err.Error()}}, nil
}

return PublishIdentityState202JSONResponse{
ClaimsTreeRoot: publishedState.ClaimsTreeRoot,
RevocationTreeRoot: publishedState.RevocationTreeRoot,
RootOfRoots: publishedState.RootOfRoots,
State: publishedState.State,
TxID: publishedState.TxID,
}, nil
}

// RetryPublishState - retry to publish the current state if it failed previously.
func (s *Server) RetryPublishState(ctx context.Context, request RetryPublishStateRequestObject) (RetryPublishStateResponseObject, error) {
did, err := w3c.ParseDID(request.Identifier)
if err != nil {
return RetryPublishState400JSONResponse{N400JSONResponse{"invalid did"}}, nil
}

publishedState, err := s.publisherGateway.RetryPublishState(ctx, did)
if err != nil {
log.Error(ctx, "error retrying the publishing the state", "err", err)
if errors.Is(err, gateways.ErrStateIsBeingProcessed) || errors.Is(err, gateways.ErrNoFailedStatesToProcess) {
return RetryPublishState400JSONResponse{N400JSONResponse{Message: err.Error()}}, nil
}
return RetryPublishState500JSONResponse{N500JSONResponse{Message: err.Error()}}, nil
}
return RetryPublishState202JSONResponse{
ClaimsTreeRoot: publishedState.ClaimsTreeRoot,
RevocationTreeRoot: publishedState.RevocationTreeRoot,
RootOfRoots: publishedState.RootOfRoots,
State: publishedState.State,
TxID: publishedState.TxID,
}, nil
}

// GetStateTransactions - get state transactions
func (s *Server) GetStateTransactions(ctx context.Context, request GetStateTransactionsRequestObject) (GetStateTransactionsResponseObject, error) {
did, err := w3c.ParseDID(request.Identifier)
if err != nil {
return GetStateTransactions400JSONResponse{N400JSONResponse{"invalid did"}}, nil
}
states, err := s.identityService.GetStates(ctx, *did)
if err != nil {
log.Error(ctx, "get state transactions", "err", err)
return GetStateTransactions500JSONResponse{N500JSONResponse{Message: err.Error()}}, nil
}

return GetStateTransactions200JSONResponse(stateTransactionsResponse(states)), nil
}

// GetStateStatus - get state status
func (s *Server) GetStateStatus(ctx context.Context, request GetStateStatusRequestObject) (GetStateStatusResponseObject, error) {
did, err := w3c.ParseDID(request.Identifier)
if err != nil {
return GetStateStatus400JSONResponse{N400JSONResponse{"invalid did"}}, nil
}
pendingActions, err := s.identityService.HasUnprocessedAndFailedStatesByID(ctx, *did)
if err != nil {
log.Error(ctx, "get state status", "err", err)
return GetStateStatus500JSONResponse{N500JSONResponse{Message: err.Error()}}, nil
}

return GetStateStatus200JSONResponse{PendingActions: pendingActions}, nil
}
Loading

0 comments on commit 47d36c4

Please sign in to comment.