1import * as DynamoDB from "@distilled.cloud/aws/dynamodb";
2import * as Effect from "effect/Effect";
3import * as Binding from "../../Binding.ts";
4import * as Layer from "effect/Layer";
5import { isBindingHost } from "../Lambda/Function.ts";
6import {
7 ExecuteTransaction,
8 type ExecuteTransactionRequest,
9 type ExecuteTransactionTables,
10} from "./ExecuteTransaction.ts";
11
12export const ExecuteTransactionHttp = Layer.effect(
13 ExecuteTransaction,
14 Effect.gen(function* () {
15 const executeTransaction = yield* DynamoDB.executeTransaction;
16
17 return Effect.fn(function* (...tables: ExecuteTransactionTables) {
18 if (!globalThis.__ALCHEMY_RUNTIME__) {
19 const sortedTables = [...tables].sort((a, b) =>
20 a.LogicalId.localeCompare(b.LogicalId),
21 );
22 const host = yield* Binding.Host;
23 if (isBindingHost(host)) {
24 yield* host.bind`Allow(${host}, AWS.DynamoDB.ExecuteTransaction(${sortedTables}))`(
25 {
26 policyStatements: [
27 {
28 Effect: "Allow",
29 Action: [
30 "dynamodb:PartiQLSelect",
31 "dynamodb:PartiQLInsert",
32 "dynamodb:PartiQLUpdate",
33 "dynamodb:PartiQLDelete",
34 ],
35 Resource: sortedTables.map((table) => table.tableArn),
36 },
37 ],
38 },
39 );
40 }
41 }
42 return Effect.fn(`AWS.DynamoDB.ExecuteTransaction(${tables})`)(function* (
43 request: ExecuteTransactionRequest,
44 ) {
45 return yield* executeTransaction(request);
46 });
47 });
48 }),
49);