dimah-s3v1.5.5

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.

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

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