X Enterprises
fastify-ximagepipeline

deleteMedia

Delete a Media record from the database and all associated R2 objects (variants and originals).

deleteMedia

Delete a Media record from the database and remove all associated R2/S3 objects — both the variant WebP files under mediaPath/<sourceType>/<sourceId>/<mediaId>/ and the original file under originalsPath/ (if stored).

Signature

fastify.xImagePipeline.deleteMedia(mediaId: string): Promise<DeleteResult>

interface DeleteResult {
  deleted: boolean   // always true on success
  r2Deleted: number  // count of R2 objects removed
}

Params

NameTypeRequiredDescription
mediaIdstringYesMedia.id from the database

Returns

{ deleted: true, r2Deleted: N } where N is the total count of R2 objects removed (variants + original).

Throws

ErrorWhen
[xImagePipeline] Media not found: {id}No Media record exists with that ID

Also throws on R2 delete failures or database errors.

Examples

Delete a user's avatar

fastify.delete("/users/:userId/avatar/:mediaId", async (request, reply) => {
  const result = await fastify.xImagePipeline.deleteMedia(request.params.mediaId);

  await fastify.prisma.user.update({
    where: { id: request.params.userId },
    data: { avatarMediaId: null },
  });

  return { success: true, r2ObjectsDeleted: result.r2Deleted };
});

Clean up rejected or failed jobs

async function pruneFailedMedia(sourceType, sourceId) {
  // Find all media for this source
  const items = await fastify.xImagePipeline.listMedia(sourceType, sourceId);

  // Find their associated queue jobs
  const failedJobs = await prisma.mediaQueue.findMany({
    where: { sourceType, sourceId, status: "FAILED" },
    include: { media: true },
  });

  for (const job of failedJobs) {
    if (job.media) {
      await fastify.xImagePipeline.deleteMedia(job.media.id);
    }
  }

  return { pruned: failedJobs.length };
}

See Also

AI Context

package: "@xenterprises/fastify-ximagepipeline"
method: fastify.xImagePipeline.deleteMedia(mediaId)
use-when: Delete a Media record from the database and remove all associated R2 objects (variants, originals)
returns: void
Copyright © 2026