Allow shards to be soft-deleted (and thus replaced in an artifact)

  1. Add Marten's ISoftDeleted to ShardInfoBase.
  2. Add a *Deleted event to each shard kind.
  3. Reimplement each shard kind's projection using an explicit aggregation and soft-delete the shard when a *Deleted event is encountered.
  4. Take the *Deleted events into account in the ArtifactDetail projection.
  5. Implement Upsert in ArtifactService that issues the *Delete events when a shard is removed from an existing artifact.
  6. Add an ArtifactEdit endpoint (patch like all the others) that calls ArtifactService.Upsert.
  7. Add buttons to the UI.
Edited by Adam Štěpánek