1import * as Effect from "effect/Effect";
2import * as Layer from "effect/Layer";
3import type { Bucket } from "./Bucket.ts";
4import { grantOnBucket } from "./ObjectHttp.ts";
5import { makeObjectMedia } from "./ObjectMedia.ts";
6import { PutObject, type PutObjectRequest } from "./PutObject.ts";
7
8/**
9 * HTTP implementation of {@link PutObject}.
10 *
11 * @layer
12 * @provides GCP.Storage.PutObject
13 */
14export const PutObjectHttp = Layer.effect(
15 PutObject,
16 Effect.gen(function* () {
17 const media = yield* makeObjectMedia;
18 return Effect.fn(function* (bucket: Bucket) {
19 yield* grantOnBucket(
20 "GCP.Storage.PutObject",
21 bucket,
22 "roles/storage.objectUser",
23 );
24 const bucketName = yield* bucket.bucketName;
25 return Effect.fn(`GCP.Storage.PutObject(${bucket.LogicalId})`)(function* (
26 request: PutObjectRequest,
27 ) {
28 const name = yield* bucketName;
29 return yield* media.upload(name, request);
30 });
31 });
32 }),
33);