1import { GetCustomerTaxIdsById } 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 { CustomerTaxId } from "./CustomerTaxId.ts";
7import { RetrieveCustomerTaxId } from "./RetrieveCustomerTaxId.ts";
8import {
9 asStringEffect,
10 attachStripeToken,
11 authorizeWith,
12 resolveStripeAuth,
13} from "./StripeHttp.ts";
14
15/**
16 * HTTP implementation of {@link RetrieveCustomerTaxId}. The nested
17 * retrieve takes both `customer` and `id`.
18 *
19 * @layer
20 * @product Customer
21 * @provides Stripe.RetrieveCustomerTaxId
22 */
23export const RetrieveCustomerTaxIdHttp = Layer.effect(
24 RetrieveCustomerTaxId,
25 Effect.gen(function* () {
26 const ambient = yield* resolveStripeAuth;
27
28 return Effect.fn(function* (taxId: CustomerTaxId) {
29 const host = yield* Binding.Host;
30 const bound = yield* attachStripeToken(
31 taxId as unknown as ResourceLike,
32 ["customers_read"],
33 "Stripe.RetrieveCustomerTaxId",
34 );
35 const id = yield* asStringEffect(taxId.id);
36 const customer = yield* asStringEffect(taxId.customer);
37 const auth =
38 host !== undefined ? authorizeWith(bound) : ambient.authorize;
39
40 return Effect.fn(`Stripe.RetrieveCustomerTaxId(${taxId.LogicalId})`)(
41 function* (request?: { expand?: string[] }) {
42 return yield* auth(
43 GetCustomerTaxIdsById({
44 ...(request ?? {}),
45 id: yield* id,
46 customer: yield* customer,
47 }),
48 );
49 },
50 );
51 });
52 }),
53);