2023-02-15 01:52:11 +00:00
|
|
|
package command
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
|
2023-03-28 22:09:06 +00:00
|
|
|
"github.com/zitadel/zitadel/internal/eventstore"
|
2023-02-15 01:52:11 +00:00
|
|
|
"github.com/zitadel/zitadel/internal/repository/quota"
|
2023-09-15 14:58:45 +00:00
|
|
|
"github.com/zitadel/zitadel/internal/telemetry/tracing"
|
2023-02-15 01:52:11 +00:00
|
|
|
)
|
|
|
|
|
2023-07-06 06:38:13 +00:00
|
|
|
// ReportQuotaUsage writes a slice of *quota.NotificationDueEvent directly to the eventstore
|
2023-09-15 14:58:45 +00:00
|
|
|
func (c *Commands) ReportQuotaUsage(ctx context.Context, dueNotifications []*quota.NotificationDueEvent) (err error) {
|
|
|
|
ctx, span := tracing.NewSpan(ctx)
|
|
|
|
defer func() { span.EndWithError(err) }()
|
|
|
|
|
|
|
|
cmds := make([]eventstore.Command, 0, len(dueNotifications))
|
|
|
|
for _, notification := range dueNotifications {
|
|
|
|
ctxFilter, spanFilter := tracing.NewNamedSpan(ctx, "filterNotificationDueEvents")
|
|
|
|
events, errFilter := c.eventstore.Filter(
|
|
|
|
ctxFilter,
|
|
|
|
eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
|
|
|
InstanceID(notification.Aggregate().InstanceID).
|
|
|
|
AddQuery().
|
|
|
|
AggregateTypes(quota.AggregateType).
|
|
|
|
AggregateIDs(notification.Aggregate().ID).
|
|
|
|
EventTypes(quota.NotificationDueEventType).
|
|
|
|
EventData(map[string]interface{}{
|
|
|
|
"id": notification.ID,
|
|
|
|
"periodStart": notification.PeriodStart,
|
|
|
|
"threshold": notification.Threshold,
|
|
|
|
}).Builder(),
|
|
|
|
)
|
|
|
|
spanFilter.EndWithError(errFilter)
|
|
|
|
if errFilter != nil {
|
|
|
|
return errFilter
|
|
|
|
}
|
|
|
|
if len(events) > 0 {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
cmds = append(cmds, notification)
|
2023-02-15 01:52:11 +00:00
|
|
|
}
|
2023-09-15 14:58:45 +00:00
|
|
|
if len(cmds) == 0 {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
ctxPush, spanPush := tracing.NewNamedSpan(ctx, "pushNotificationDueEvents")
|
|
|
|
_, errPush := c.eventstore.Push(ctxPush, cmds...)
|
|
|
|
spanPush.EndWithError(errPush)
|
|
|
|
return errPush
|
2023-02-15 01:52:11 +00:00
|
|
|
}
|
|
|
|
|
2023-03-28 22:09:06 +00:00
|
|
|
func (c *Commands) UsageNotificationSent(ctx context.Context, dueEvent *quota.NotificationDueEvent) error {
|
|
|
|
id, err := c.idGenerator.Next()
|
2023-02-15 01:52:11 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2023-03-28 22:09:06 +00:00
|
|
|
_, err = c.eventstore.Push(
|
|
|
|
ctx,
|
|
|
|
quota.NewNotifiedEvent(ctx, id, dueEvent),
|
|
|
|
)
|
|
|
|
return err
|
2023-02-15 01:52:11 +00:00
|
|
|
}
|