package repository import ( "context" "time" "github.com/geo-platform/tenant-api/internal/tenant/repository/generated" ) type QuotaLedgerInput struct { TenantID int64 OperatorID int64 QuotaType string Delta int BalanceAfter int Reason *string ReferenceType *string ReferenceID *int64 } type QuotaReservationInput struct { TenantID int64 OperatorID int64 QuotaType string ResourceType string ResourceID *int64 ReservedAmount int ExpireAt time.Time } type QuotaRepository interface { GetCurrentBalance(ctx context.Context, tenantID int64, quotaType string) (int, error) InsertQuotaLedger(ctx context.Context, input QuotaLedgerInput) (int64, error) CreateQuotaReservation(ctx context.Context, input QuotaReservationInput) (int64, error) UpdateQuotaReservationResource(ctx context.Context, reservationID, tenantID, resourceID int64) error ConfirmReservation(ctx context.Context, reservationID, tenantID int64) error RefundReservation(ctx context.Context, reservationID, tenantID int64) error } type quotaRepository struct { q generated.Querier } func NewQuotaRepository(db generated.DBTX) QuotaRepository { return "aRepository{q: newQuerier(db)} } func (r *quotaRepository) GetCurrentBalance(ctx context.Context, tenantID int64, quotaType string) (int, error) { balance, err := r.q.GetCurrentBalance(ctx, generated.GetCurrentBalanceParams{ TenantID: tenantID, QuotaType: quotaType, }) if err != nil { return 0, err } return int(balance), nil } func (r *quotaRepository) InsertQuotaLedger(ctx context.Context, input QuotaLedgerInput) (int64, error) { operatorID := input.OperatorID return r.q.InsertQuotaLedger(ctx, generated.InsertQuotaLedgerParams{ TenantID: input.TenantID, OperatorID: pgInt8(&operatorID), QuotaType: input.QuotaType, Delta: int32(input.Delta), BalanceAfter: int32(input.BalanceAfter), Reason: pgText(input.Reason), ReferenceType: pgText(input.ReferenceType), ReferenceID: pgInt8(input.ReferenceID), }) } func (r *quotaRepository) CreateQuotaReservation(ctx context.Context, input QuotaReservationInput) (int64, error) { expireAt := input.ExpireAt operatorID := input.OperatorID return r.q.CreateQuotaReservation(ctx, generated.CreateQuotaReservationParams{ TenantID: input.TenantID, OperatorID: pgInt8(&operatorID), QuotaType: input.QuotaType, ResourceType: input.ResourceType, ResourceID: pgInt8(input.ResourceID), ReservedAmount: int32(input.ReservedAmount), ExpireAt: pgTimestamp(&expireAt), }) } func (r *quotaRepository) UpdateQuotaReservationResource(ctx context.Context, reservationID, tenantID, resourceID int64) error { resourceIDValue := resourceID return r.q.UpdateQuotaReservationResource(ctx, generated.UpdateQuotaReservationResourceParams{ ResourceID: pgInt8(&resourceIDValue), ID: reservationID, TenantID: tenantID, }) } func (r *quotaRepository) ConfirmReservation(ctx context.Context, reservationID, tenantID int64) error { return r.q.ConfirmReservation(ctx, generated.ConfirmReservationParams{ ID: reservationID, TenantID: tenantID, }) } func (r *quotaRepository) RefundReservation(ctx context.Context, reservationID, tenantID int64) error { return r.q.RefundReservation(ctx, generated.RefundReservationParams{ ID: reservationID, TenantID: tenantID, }) }