mirror of
https://github.com/zitadel/zitadel.git
synced 2025-08-11 20:57:31 +00:00
feat: add time range events filter (#7005)
* feat(console): add time range events filter * deprecate creation_date, use oneof filter * use range or from * implement api * fix timestamp format * translate * styles * lint * integration tests * fix until date * rearrange sorting control * sort creation date * fix events e2e test * Update console/src/app/modules/filter-events/filter-events.component.html Co-authored-by: Max Peintner <max@caos.ch> * Update console/src/app/modules/filter-events/filter-events.component.html Co-authored-by: Max Peintner <max@caos.ch> * Update console/src/app/modules/filter-events/filter-events.component.html Co-authored-by: Max Peintner <max@caos.ch> * lint * lint * don't use utc call time --------- Co-authored-by: Max Peintner <max@caos.ch> Co-authored-by: Silvan <silvan.reusser@gmail.com>
This commit is contained in:
@@ -2,6 +2,7 @@ package admin
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"github.com/zitadel/zitadel/internal/api/authz"
|
||||
"github.com/zitadel/zitadel/internal/eventstore"
|
||||
@@ -36,6 +37,25 @@ func (s *Server) ListAggregateTypes(ctx context.Context, in *admin_pb.ListAggreg
|
||||
}
|
||||
|
||||
func eventRequestToFilter(ctx context.Context, req *admin_pb.ListEventsRequest) (*eventstore.SearchQueryBuilder, error) {
|
||||
var fromTime, sinceTime, untilTime time.Time
|
||||
// We ignore the deprecation warning here because we still need to support the deprecated field.
|
||||
//nolint:staticcheck
|
||||
if creationDatePb := req.GetCreationDate(); creationDatePb != nil {
|
||||
fromTime = creationDatePb.AsTime()
|
||||
}
|
||||
if fromTimePb := req.GetFrom(); fromTimePb != nil {
|
||||
fromTime = fromTimePb.AsTime()
|
||||
}
|
||||
if timeRange := req.GetRange(); timeRange != nil {
|
||||
// If range is set, we ignore the from and the deprecated creation_date fields
|
||||
fromTime = time.Time{}
|
||||
if timeSincePb := timeRange.GetSince(); timeSincePb != nil {
|
||||
sinceTime = timeSincePb.AsTime()
|
||||
}
|
||||
if timeUntilPb := timeRange.GetUntil(); timeUntilPb != nil {
|
||||
untilTime = timeUntilPb.AsTime()
|
||||
}
|
||||
}
|
||||
eventTypes := make([]eventstore.EventType, len(req.EventTypes))
|
||||
for i, eventType := range req.EventTypes {
|
||||
eventTypes[i] = eventstore.EventType(eventType)
|
||||
@@ -60,7 +80,9 @@ func eventRequestToFilter(ctx context.Context, req *admin_pb.ListEventsRequest)
|
||||
AwaitOpenTransactions().
|
||||
ResourceOwner(req.ResourceOwner).
|
||||
EditorUser(req.EditorUserId).
|
||||
SequenceGreater(req.Sequence)
|
||||
SequenceGreater(req.Sequence).
|
||||
CreationDateAfter(sinceTime).
|
||||
CreationDateBefore(untilTime)
|
||||
|
||||
if len(aggregateIDs) > 0 || len(aggregateTypes) > 0 || len(eventTypes) > 0 {
|
||||
builder.AddQuery().
|
||||
@@ -72,10 +94,9 @@ func eventRequestToFilter(ctx context.Context, req *admin_pb.ListEventsRequest)
|
||||
|
||||
if req.GetAsc() {
|
||||
builder.OrderAsc()
|
||||
builder.CreationDateAfter(req.CreationDate.AsTime())
|
||||
builder.CreationDateAfter(fromTime)
|
||||
} else {
|
||||
builder.CreationDateBefore(req.CreationDate.AsTime())
|
||||
builder.CreationDateBefore(fromTime)
|
||||
}
|
||||
|
||||
return builder, nil
|
||||
}
|
||||
|
@@ -4,6 +4,7 @@ package system_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"google.golang.org/protobuf/types/known/timestamppb"
|
||||
"math/rand"
|
||||
"sync"
|
||||
"testing"
|
||||
@@ -23,6 +24,7 @@ func TestServer_Limits_AuditLogRetention(t *testing.T) {
|
||||
_, instanceID, iamOwnerCtx := Tester.UseIsolatedInstance(t, CTX, SystemCTX)
|
||||
userID, projectID, appID, projectGrantID := seedObjects(iamOwnerCtx, t)
|
||||
beforeTime := time.Now()
|
||||
farPast := timestamppb.New(beforeTime.Add(-10 * time.Hour).UTC())
|
||||
zeroCounts := &eventCounts{}
|
||||
seededCount := requireEventually(t, iamOwnerCtx, userID, projectID, appID, projectGrantID, func(c assert.TestingT, counts *eventCounts) {
|
||||
counts.assertAll(t, c, "seeded events are > 0", assert.Greater, zeroCounts)
|
||||
@@ -36,10 +38,22 @@ func TestServer_Limits_AuditLogRetention(t *testing.T) {
|
||||
AuditLogRetention: durationpb.New(time.Now().Sub(beforeTime)),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
var limitedCounts *eventCounts
|
||||
requireEventually(t, iamOwnerCtx, userID, projectID, appID, projectGrantID, func(c assert.TestingT, counts *eventCounts) {
|
||||
counts.assertAll(t, c, "limited events < added events", assert.Less, addedCount)
|
||||
counts.assertAll(t, c, "limited events > 0", assert.Greater, zeroCounts)
|
||||
limitedCounts = counts
|
||||
}, "wait for limited event assertions to pass")
|
||||
listedEvents, err := Tester.Client.Admin.ListEvents(iamOwnerCtx, &admin.ListEventsRequest{CreationDateFilter: &admin.ListEventsRequest_From{
|
||||
From: farPast,
|
||||
}})
|
||||
require.NoError(t, err)
|
||||
assert.LessOrEqual(t, len(listedEvents.GetEvents()), limitedCounts.all, "ListEvents with from query older than retention doesn't return more events")
|
||||
listedEvents, err = Tester.Client.Admin.ListEvents(iamOwnerCtx, &admin.ListEventsRequest{CreationDateFilter: &admin.ListEventsRequest_Range{Range: &admin.ListEventsRequestCreationDateRange{
|
||||
Since: farPast,
|
||||
}}})
|
||||
require.NoError(t, err)
|
||||
assert.LessOrEqual(t, len(listedEvents.GetEvents()), limitedCounts.all, "ListEvents with since query older than retention doesn't return more events")
|
||||
_, err = Tester.Client.System.ResetLimits(SystemCTX, &system.ResetLimitsRequest{
|
||||
InstanceId: instanceID,
|
||||
})
|
||||
|
Reference in New Issue
Block a user