fix(adminAPI): localize event type (#5059)

* fix(adminAPI): localisation of event types, aggregate types
* fix(adminAPI): validations of ListEvent request
* implement caching of editor user information
This commit is contained in:
Silvan
2023-01-19 16:50:05 +01:00
committed by GitHub
parent a3f5885823
commit 7b5135e637
16 changed files with 679 additions and 115 deletions

View File

@@ -3,15 +3,13 @@ package admin
import (
"context"
"google.golang.org/protobuf/types/known/structpb"
"google.golang.org/protobuf/types/known/timestamppb"
"github.com/zitadel/zitadel/internal/api/authz"
"github.com/zitadel/zitadel/internal/errors"
"github.com/zitadel/zitadel/internal/eventstore"
"github.com/zitadel/zitadel/internal/query"
admin_pb "github.com/zitadel/zitadel/pkg/grpc/admin"
event_pb "github.com/zitadel/zitadel/pkg/grpc/event"
)
const (
maxLimit = 1000
)
func (s *Server) ListEvents(ctx context.Context, in *admin_pb.ListEventsRequest) (*admin_pb.ListEventsResponse, error) {
@@ -23,19 +21,18 @@ func (s *Server) ListEvents(ctx context.Context, in *admin_pb.ListEventsRequest)
if err != nil {
return nil, err
}
return convertEventsToResponse(events)
return admin_pb.EventsToPb(ctx, events)
}
func (s *Server) ListEventTypes(ctx context.Context, in *admin_pb.ListEventTypesRequest) (*admin_pb.ListEventTypesResponse, error) {
return &admin_pb.ListEventTypesResponse{
EventTypes: s.query.SearchEventTypes(ctx),
}, nil
eventTypes := s.query.SearchEventTypes(ctx)
return admin_pb.EventTypesToPb(eventTypes), nil
}
func (s *Server) ListAggregateTypes(ctx context.Context, in *admin_pb.ListAggregateTypesRequest) (*admin_pb.ListAggregateTypesResponse, error) {
return &admin_pb.ListAggregateTypesResponse{
AggregateTypes: s.query.SearchAggregateTypes(ctx),
}, nil
aggregateTypes := s.query.SearchAggregateTypes(ctx)
return admin_pb.AggregateTypesToPb(aggregateTypes), nil
}
func eventRequestToFilter(ctx context.Context, req *admin_pb.ListEventsRequest) (*eventstore.SearchQueryBuilder, error) {
@@ -43,16 +40,28 @@ func eventRequestToFilter(ctx context.Context, req *admin_pb.ListEventsRequest)
for i, eventType := range req.EventTypes {
eventTypes[i] = eventstore.EventType(eventType)
}
aggregateIDs := make([]string, 0, 1)
if req.AggregateId != "" {
aggregateIDs = append(aggregateIDs, req.AggregateId)
}
aggregateTypes := make([]eventstore.AggregateType, len(req.AggregateTypes))
for i, aggregateType := range req.AggregateTypes {
aggregateTypes[i] = eventstore.AggregateType(aggregateType)
}
limit := uint64(req.Limit)
if limit == 0 || limit > maxLimit {
limit = maxLimit
}
builder := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
OrderDesc().
InstanceID(authz.GetInstance(ctx).InstanceID()).
Limit(uint64(req.Limit)).
Limit(limit).
ResourceOwner(req.ResourceOwner).
EditorUser(req.EditorUserId).
AddQuery().
AggregateIDs(req.AggregateId).
AggregateTypes(eventstore.AggregateType(req.AggregateType)).
AggregateIDs(aggregateIDs...).
AggregateTypes(aggregateTypes...).
EventTypes(eventTypes...).
CreationDateAfter(req.CreationDate.AsTime()).
SequenceGreater(req.Sequence).
@@ -64,44 +73,3 @@ func eventRequestToFilter(ctx context.Context, req *admin_pb.ListEventsRequest)
return builder, nil
}
func convertEventsToResponse(events []*query.Event) (response *admin_pb.ListEventsResponse, err error) {
response = &admin_pb.ListEventsResponse{
Events: make([]*event_pb.Event, len(events)),
}
for i, event := range events {
response.Events[i], err = convertEvent(event)
if err != nil {
return nil, err
}
}
return response, nil
}
func convertEvent(event *query.Event) (*event_pb.Event, error) {
var payload *structpb.Struct
if len(event.Payload) > 0 {
payload = new(structpb.Struct)
if err := payload.UnmarshalJSON(event.Payload); err != nil {
return nil, errors.ThrowInternal(err, "ADMIN-eaimD", "Errors.Internal")
}
}
return &event_pb.Event{
Editor: &event_pb.Editor{
UserId: event.Editor.ID,
DisplayName: event.Editor.DisplayName,
Service: event.Editor.Service,
},
Aggregate: &event_pb.Aggregate{
Id: event.Aggregate.ID,
Type: string(event.Aggregate.Type),
ResourceOwner: event.Aggregate.ResourceOwner,
},
Sequence: event.Sequence,
CreationDate: timestamppb.New(event.CreationDate),
Payload: payload,
Type: event.Type,
}, nil
}