fix(eventstore): use decimal, correct mirror (#9914)

# Eventstore fixes

- `event.Position` used float64 before which can lead to [precision
loss](https://github.com/golang/go/issues/47300). The type got replaced
by [a type without precision
loss](https://github.com/jackc/pgx-shopspring-decimal)
- the handler reported the wrong error if the current state was updated
and therefore took longer to retry failed events.

# Mirror fixes

- max age of auth requests can be configured to speed up copying data
from `auth.auth_requests` table. Auth requests last updated before the
set age will be ignored. Default is 1 month
- notification projections are skipped because notifications should be
sent by the source system. The projections are set to the latest
position
- ensure that mirror can be executed multiple times

---------

Co-authored-by: Livio Spring <livio.a@gmail.com>
This commit is contained in:
Silvan
2025-05-28 23:54:18 +02:00
committed by GitHub
parent 046b165db8
commit 131f70db34
51 changed files with 436 additions and 236 deletions

View File

@@ -6,6 +6,8 @@ import (
"testing"
"time"
"github.com/shopspring/decimal"
"github.com/zitadel/zitadel/internal/v2/database"
)
@@ -74,13 +76,13 @@ func TestPaginationOpt(t *testing.T) {
name: "global position greater",
args: args{
opts: []paginationOpt{
GlobalPositionGreater(&GlobalPosition{Position: 10}),
GlobalPositionGreater(&GlobalPosition{Position: decimal.NewFromInt(10)}),
},
},
want: &Pagination{
position: &PositionCondition{
min: &GlobalPosition{
Position: 10,
Position: decimal.NewFromInt(10),
InPositionOrder: 0,
},
},
@@ -90,13 +92,13 @@ func TestPaginationOpt(t *testing.T) {
name: "position greater",
args: args{
opts: []paginationOpt{
PositionGreater(10, 0),
PositionGreater(decimal.NewFromInt(10), 0),
},
},
want: &Pagination{
position: &PositionCondition{
min: &GlobalPosition{
Position: 10,
Position: decimal.NewFromInt(10),
InPositionOrder: 0,
},
},
@@ -107,13 +109,13 @@ func TestPaginationOpt(t *testing.T) {
name: "position less",
args: args{
opts: []paginationOpt{
PositionLess(10, 12),
PositionLess(decimal.NewFromInt(10), 12),
},
},
want: &Pagination{
position: &PositionCondition{
max: &GlobalPosition{
Position: 10,
Position: decimal.NewFromInt(10),
InPositionOrder: 12,
},
},
@@ -123,13 +125,13 @@ func TestPaginationOpt(t *testing.T) {
name: "global position less",
args: args{
opts: []paginationOpt{
GlobalPositionLess(&GlobalPosition{Position: 12, InPositionOrder: 24}),
GlobalPositionLess(&GlobalPosition{Position: decimal.NewFromInt(12), InPositionOrder: 24}),
},
},
want: &Pagination{
position: &PositionCondition{
max: &GlobalPosition{
Position: 12,
Position: decimal.NewFromInt(12),
InPositionOrder: 24,
},
},
@@ -140,19 +142,19 @@ func TestPaginationOpt(t *testing.T) {
args: args{
opts: []paginationOpt{
PositionBetween(
&GlobalPosition{10, 12},
&GlobalPosition{20, 0},
&GlobalPosition{decimal.NewFromInt(10), 12},
&GlobalPosition{decimal.NewFromInt(20), 0},
),
},
},
want: &Pagination{
position: &PositionCondition{
min: &GlobalPosition{
Position: 10,
Position: decimal.NewFromInt(10),
InPositionOrder: 12,
},
max: &GlobalPosition{
Position: 20,
Position: decimal.NewFromInt(20),
InPositionOrder: 0,
},
},