dimah-s3v1.5.11

Delete Hooks

Authorize deletion and execute cleanup after S3 removes the object.

Enable object deletion with delete: true or a DeleteConfig object on a named route.

Unlike upload and download, object deletion is executed directly on your server using DeleteObjectCommand after passing guard checks. The client never deletes from S3 directly.

delete: true turns the endpoint on. It does not check who owns the object. The key must still sit under this route's keyPrefix (the route name by default) — that check always runs, with or without db(). Ownership is delete.guard or the db plugin. See Security.

lib/s3.ts
import { S3Client } from "@aws-sdk/client-s3";
import { dimahS3, errors, route } from "@dimah-s3/server";

export const awsS3 = new S3Client({/* env */});

export const s3 = dimahS3({
  client: awsS3,
  bucket: process.env.S3_BUCKET!,
  routes: {
    avatar: route({
      delete: {
        guard: async ({ key, request }) => {
          const session = await getSession(request);
          if (!session) throw errors.unauthorized();

          const isOwner = await checkAvatarOwnership(session.userId, key);
          if (!isOwner) throw errors.forbidden();
        },
        onDeleted: async ({ key, request }) => {
          const session = await getSession(request); 
          await db.user.update({
            where: { id: session.userId }, 
            data: { avatarKey: null }, 
          }); 
        }, 
      },
    }),
  },
});

Delete lifecycle flow

Before delete.guard, the server resolves the named route and rejects keys outside its keyPrefix (INVALID_KEY).

Delete flow
  1. delete.guardhook
  2. DeleteObject in S3S3
  3. onDeletedDatabase cleanup

Type reference

import type {
  DeleteGuardContext,
  DeleteOnDeletedContext,
} from "@dimah-s3/server";

DeleteGuardContext

Prop

Type


DeleteOnDeletedContext

Prop

Type

Frequently asked questions

On this page