public async deleteBlob()

in src/blob/persistence/LokiBlobMetadataStore.ts [1306:1399]


  public async deleteBlob(
    context: Context,
    account: string,
    container: string,
    blob: string,
    options: Models.BlobDeleteMethodOptionalParams
  ): Promise<void> {
    const coll = this.db.getCollection(this.BLOBS_COLLECTION);
    await this.checkContainerExist(context, account, container);

    const doc = await this.getBlobWithLeaseUpdated(
      account,
      container,
      blob,
      options.snapshot,
      context,
      false
    );

    validateWriteConditions(context, options.modifiedAccessConditions, doc);

    if (!doc) {
      throw StorageErrorFactory.getBlobNotFound(context.contextId);
    }

    const againstBaseBlob = doc.snapshot === "";

    // Check bad requests
    if (!againstBaseBlob && options.deleteSnapshots !== undefined) {
      throw StorageErrorFactory.getInvalidOperation(
        context.contextId!,
        "Invalid operation against a blob snapshot."
      );
    }

    new BlobWriteLeaseValidator(options.leaseAccessConditions).validate(
      new BlobLeaseAdapter(doc),
      context
    );

    // Scenario: Delete base blob only
    if (againstBaseBlob && options.deleteSnapshots === undefined) {
      const count = coll.count({
        accountName: account,
        containerName: container,
        name: blob
      });
      if (count > 1) {
        throw StorageErrorFactory.getSnapshotsPresent(context.contextId!);
      } else {
        coll.findAndRemove({
          accountName: account,
          containerName: container,
          name: blob
        });
      }
    }

    // Scenario: Delete one snapshot only
    if (!againstBaseBlob) {
      coll.findAndRemove({
        accountName: account,
        containerName: container,
        name: blob,
        snapshot: doc.snapshot
      });
    }

    // Scenario: Delete base blob and snapshots
    if (
      againstBaseBlob &&
      options.deleteSnapshots === Models.DeleteSnapshotsOptionType.Include
    ) {
      coll.findAndRemove({
        accountName: account,
        containerName: container,
        name: blob
      });
    }

    // Scenario: Delete all snapshots only
    if (
      againstBaseBlob &&
      options.deleteSnapshots === Models.DeleteSnapshotsOptionType.Only
    ) {
      const query = {
        accountName: account,
        containerName: container,
        name: blob,
        snapshot: { $gt: "" }
      };
      coll.findAndRemove(query);
    }
  }