1import { GetAccountPerson } from "@distilled.cloud/stripe/stripe";
2import * as Effect from "effect/Effect";
3import * as Layer from "effect/Layer";
4import * as Binding from "../Binding.ts";
5import type { ResourceLike } from "../Resource.ts";
6import type { AccountPerson } from "./AccountPerson.ts";
7import { RetrieveAccountPerson } from "./RetrieveAccountPerson.ts";
8import {
9 asStringEffect,
10 attachStripeToken,
11 authorizeWith,
12 resolveStripeAuth,
13} from "./StripeHttp.ts";
14
15/**
16 * HTTP implementation of {@link RetrieveAccountPerson}. Retrieve takes
17 * both `account` and `person`.
18 *
19 * @layer
20 * @product Account
21 * @provides Stripe.RetrieveAccountPerson
22 */
23export const RetrieveAccountPersonHttp = Layer.effect(
24 RetrieveAccountPerson,
25 Effect.gen(function* () {
26 const ambient = yield* resolveStripeAuth;
27
28 return Effect.fn(function* (person: AccountPerson) {
29 const host = yield* Binding.Host;
30 const bound = yield* attachStripeToken(
31 person as unknown as ResourceLike,
32 ["accounts_read"],
33 "Stripe.RetrieveAccountPerson",
34 );
35 const id = yield* asStringEffect(person.id);
36 const account = yield* asStringEffect(person.account);
37 const auth =
38 host !== undefined ? authorizeWith(bound) : ambient.authorize;
39
40 return Effect.fn(`Stripe.RetrieveAccountPerson(${person.LogicalId})`)(
41 function* (request?: { expand?: string[] }) {
42 return yield* auth(
43 GetAccountPerson({
44 ...(request ?? {}),
45 person: yield* id,
46 account: yield* account,
47 }),
48 );
49 },
50 );
51 });
52 }),
53);