feat: add assets to eventstore and event (#1674)

* fix: add assets to eventstore and event

* fix: project member, grant member, app changed tests

* fix: asset migrations

* feat: add asset tests

* feat: add asset tests

* Update internal/eventstore/repository/repository.go

Co-authored-by: Livio Amstutz <livio.a@gmail.com>

* feat: add asset tests

Co-authored-by: Livio Amstutz <livio.a@gmail.com>
This commit is contained in:
Fabi
2021-04-27 12:58:18 +02:00
committed by GitHub
parent eaf966e3d2
commit f51f0ede5c
102 changed files with 1079 additions and 34 deletions

View File

@@ -97,9 +97,19 @@ const (
$1,
$2
)`
uniqueDelete = `DELETE FROM eventstore.unique_constraints
WHERE unique_type = $1 and unique_field = $2`
assetInsert = `INSERT INTO eventstore.assets
(
id,
asset
)
VALUES (
$1,
$2
)`
assetDelete = `DELETE FROM eventstore.assets
WHERE id = $1`
)
type CRDB struct {
@@ -114,7 +124,7 @@ func (db *CRDB) Health(ctx context.Context) error { return db.client.Ping() }
// Push adds all events to the eventstreams of the aggregates.
// This call is transaction save. The transaction will be rolled back if one event fails
func (db *CRDB) Push(ctx context.Context, events []*repository.Event, uniqueConstraints ...*repository.UniqueConstraint) error {
func (db *CRDB) Push(ctx context.Context, events []*repository.Event, assets []*repository.Asset, uniqueConstraints ...*repository.UniqueConstraint) error {
err := crdb.ExecuteTx(ctx, db.client, nil, func(tx *sql.Tx) error {
stmt, err := tx.PrepareContext(ctx, crdbInsert)
if err != nil {
@@ -152,6 +162,11 @@ func (db *CRDB) Push(ctx context.Context, events []*repository.Event, uniqueCons
if err != nil {
return err
}
err = db.handleAssets(ctx, tx, assets...)
if err != nil {
return err
}
return nil
})
if err != nil && !errors.Is(err, &caos_errs.CaosError{}) {
@@ -194,6 +209,32 @@ func (db *CRDB) handleUniqueConstraints(ctx context.Context, tx *sql.Tx, uniqueC
return nil
}
// handleAssets adds or removes an asset
func (db *CRDB) handleAssets(ctx context.Context, tx *sql.Tx, assets ...*repository.Asset) (err error) {
if assets == nil || len(assets) == 0 || (len(assets) == 1 && assets[0] == nil) {
return nil
}
for _, asset := range assets {
if asset.Action == repository.AssetAdded {
_, err := tx.ExecContext(ctx, assetInsert, asset.ID, asset.Asset)
if err != nil {
logging.LogWithFields("SQL-M39fs",
"asset-id", asset.ID).WithError(err).Info("insert asset failed")
return caos_errs.ThrowInternal(err, "SQL-4M0gs", "unable to create asset")
}
} else if asset.Action == repository.AssetRemoved {
_, err := tx.ExecContext(ctx, assetDelete, asset.ID)
if err != nil {
logging.LogWithFields("SQL-3M9fs",
"asset-id", asset.ID).WithError(err).Info("delete asset failed")
return caos_errs.ThrowInternal(err, "SQL-Md9ds", "unable to remove unique constraint ")
}
}
}
return nil
}
// Filter returns all events matching the given search query
func (db *CRDB) Filter(ctx context.Context, searchQuery *repository.SearchQuery) (events []*repository.Event, err error) {
events = []*repository.Event{}