1import * as Lambda from "@/AWS/Lambda";
2import * as SecretsManager from "@/AWS/SecretsManager";
3import * as secretsmanager from "@distilled.cloud/aws/secrets-manager";
4import * as Effect from "effect/Effect";
5import * as Redacted from "effect/Redacted";
6import { HttpServerRequest } from "effect/http/HttpServerRequest";
7import * as HttpServerResponse from "effect/http/HttpServerResponse";
8
9export class GetSecretOnlyTestFunction extends Lambda.Function<GetSecretOnlyTestFunction>()(
10 "GetSecretOnlyTestFunction",
11) {}
12
13export default GetSecretOnlyTestFunction.make(
14 { main: import.meta.url, functionUrl: true },
15 Effect.gen(function* () {
16 const secret = yield* SecretsManager.Secret("GetSecretOnlySecret", {
17 secretString: Redacted.make("alchemy-sm-get-only-value"),
18 });
19 const getSecretValue = yield* SecretsManager.GetSecretValue(secret);
20 const describeSecret = yield* secretsmanager.describeSecret;
21 const secretArn = yield* secret.secretArn;
22 const secretName = yield* secret.secretName;
23
24 return {
25 fetch: Effect.gen(function* () {
26 const request = yield* HttpServerRequest;
27 const url = yield* Effect.sync(() => new URL(request.originalUrl));
28
29 if (request.method === "GET" && url.pathname === "/info") {
30 return yield* HttpServerResponse.json({
31 secretArn: yield* secretArn,
32 secretName: yield* secretName,
33 });
34 }
35
36 if (request.method === "GET" && url.pathname === "/get-value") {
37 const result = yield* getSecretValue({
38 VersionId: url.searchParams.get("versionId") ?? undefined,
39 VersionStage: url.searchParams.get("versionStage") ?? undefined,
40 });
41 return yield* HttpServerResponse.json({
42 arn: result.ARN,
43 name: result.Name,
44 versionId: result.VersionId,
45 secretString:
46 typeof result.SecretString === "string" ||
47 result.SecretString === undefined
48 ? result.SecretString
49 : Redacted.value(result.SecretString),
50 });
51 }
52
53 if (request.method === "GET" && url.pathname === "/describe-denied") {
54 const tag = yield* describeSecret({
55 SecretId: yield* secretArn,
56 }).pipe(
57 Effect.as("Allowed"),
58 Effect.catchTag("AccessDeniedException", (error) =>
59 Effect.succeed(error._tag),
60 ),
61 );
62 return yield* HttpServerResponse.json({ tag });
63 }
64
65 return HttpServerResponse.text("Not found", { status: 404 });
66 }).pipe(Effect.orDie),
67 };
68 }).pipe(Effect.provide(SecretsManager.GetSecretValueHttp)),
69);