@missioncontrolio/client 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/.env.local.example +9 -0
  2. package/README.md +226 -0
  3. package/package.json +25 -0
  4. package/src/client/autoCancelOrderHandler.ts +135 -0
  5. package/src/client/clientBuilder.ts +139 -0
  6. package/src/client/generated/client.ts +130 -0
  7. package/src/client/generated/kiota-lock.json +34 -0
  8. package/src/client/generated/models/index.ts +1723 -0
  9. package/src/client/generated/order/cancelOrder/index.ts +53 -0
  10. package/src/client/generated/order/claimReservation/index.ts +34 -0
  11. package/src/client/generated/order/claimReservation/item/index.ts +53 -0
  12. package/src/client/generated/order/createOrder/index.ts +53 -0
  13. package/src/client/generated/order/index.ts +112 -0
  14. package/src/client/generated/order/reportOrder/index.ts +53 -0
  15. package/src/client/generated/partner/index.ts +55 -0
  16. package/src/client/generated/priceList/index.ts +55 -0
  17. package/src/client/generated/product/hasStock/index.ts +53 -0
  18. package/src/client/generated/product/index.ts +119 -0
  19. package/src/client/generated/publisher/index.ts +55 -0
  20. package/src/client/generated/region/index.ts +63 -0
  21. package/src/client/generated/reservation/index.ts +71 -0
  22. package/src/client/generated/reservation/item/cancel/index.ts +48 -0
  23. package/src/client/generated/reservation/item/index.ts +62 -0
  24. package/src/client/missionControlEnvironment.ts +32 -0
  25. package/src/client/missionControlHandlers.ts +61 -0
  26. package/src/client/missionControlHeaders.ts +10 -0
  27. package/src/client/nonIdempotentPaths.ts +9 -0
  28. package/src/client/partnerIdHandler.ts +33 -0
  29. package/tests/autoCancelOrderHandler.test.ts +263 -0
  30. package/tests/clientBuilder.test.ts +154 -0
  31. package/tests/integration/fixture.ts +50 -0
  32. package/tests/integration/partner.test.ts +32 -0
  33. package/tests/integration/priceList.test.ts +28 -0
  34. package/tests/integration/product.test.ts +30 -0
  35. package/tests/integration/publisher.test.ts +30 -0
  36. package/tests/integration/region.test.ts +36 -0
  37. package/tests/integration/setup.ts +22 -0
  38. package/tests/missionControlEnvironment.test.ts +66 -0
  39. package/tests/missionControlHeaders.test.ts +20 -0
  40. package/tsconfig.json +18 -0
  41. package/vitest.config.ts +8 -0
  42. package/vitest.integration.config.ts +9 -0
@@ -0,0 +1,55 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+ // Generated by Microsoft Kiota
4
+ // @ts-ignore
5
+ import { createProblemDetailsFromDiscriminatorValue, createPublisherListResultFromDiscriminatorValue, type ProblemDetails, type PublisherListResult } from '../models/index.js';
6
+ // @ts-ignore
7
+ import { type BaseRequestBuilder, type Parsable, type ParsableFactory, type RequestConfiguration, type RequestInformation, type RequestsMetadata } from '@microsoft/kiota-abstractions';
8
+
9
+ /**
10
+ * Builds and executes requests for operations under /Publisher
11
+ */
12
+ export interface PublisherRequestBuilder extends BaseRequestBuilder<PublisherRequestBuilder> {
13
+ /**
14
+ * Note: This endpoint uses pagination by default, meaning it may not return all publishers in a single response if the partner has many publishers assigned. Please refer to pagination details for handling large result sets.
15
+ * @param requestConfiguration Configuration for the request such as headers, query parameters, and middleware options.
16
+ * @returns {Promise<PublisherListResult>}
17
+ * @throws {ProblemDetails} error when the service returns a 400 status code
18
+ * @throws {ProblemDetails} error when the service returns a 500 status code
19
+ */
20
+ get(requestConfiguration?: RequestConfiguration<PublisherRequestBuilderGetQueryParameters> | undefined) : Promise<PublisherListResult | undefined>;
21
+ /**
22
+ * Note: This endpoint uses pagination by default, meaning it may not return all publishers in a single response if the partner has many publishers assigned. Please refer to pagination details for handling large result sets.
23
+ * @param requestConfiguration Configuration for the request such as headers, query parameters, and middleware options.
24
+ * @returns {RequestInformation}
25
+ */
26
+ toGetRequestInformation(requestConfiguration?: RequestConfiguration<PublisherRequestBuilderGetQueryParameters> | undefined) : RequestInformation;
27
+ }
28
+ /**
29
+ * Note: This endpoint uses pagination by default, meaning it may not return all publishers in a single response if the partner has many publishers assigned. Please refer to pagination details for handling large result sets.
30
+ */
31
+ export interface PublisherRequestBuilderGetQueryParameters {
32
+ pageIndex?: number;
33
+ pageSize?: number;
34
+ }
35
+ /**
36
+ * Uri template for the request builder.
37
+ */
38
+ export const PublisherRequestBuilderUriTemplate = "{+baseurl}/Publisher{?pageIndex*,pageSize*}";
39
+ /**
40
+ * Metadata for all the requests in the request builder.
41
+ */
42
+ export const PublisherRequestBuilderRequestsMetadata: RequestsMetadata = {
43
+ get: {
44
+ uriTemplate: PublisherRequestBuilderUriTemplate,
45
+ responseBodyContentType: "application/json, text/plain;q=0.9",
46
+ errorMappings: {
47
+ 400: createProblemDetailsFromDiscriminatorValue as ParsableFactory<Parsable>,
48
+ 500: createProblemDetailsFromDiscriminatorValue as ParsableFactory<Parsable>,
49
+ },
50
+ adapterMethodName: "send",
51
+ responseBodyFactory: createPublisherListResultFromDiscriminatorValue,
52
+ },
53
+ };
54
+ /* tslint:enable */
55
+ /* eslint-enable */
@@ -0,0 +1,63 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+ // Generated by Microsoft Kiota
4
+ // @ts-ignore
5
+ import { createProblemDetailsFromDiscriminatorValue, createRegionListResultFromDiscriminatorValue, type ProblemDetails, type RegionListResult } from '../models/index.js';
6
+ // @ts-ignore
7
+ import { type BaseRequestBuilder, type Guid, type Parsable, type ParsableFactory, type RequestConfiguration, type RequestInformation, type RequestsMetadata } from '@microsoft/kiota-abstractions';
8
+
9
+ /**
10
+ * Builds and executes requests for operations under /Region
11
+ */
12
+ export interface RegionRequestBuilder extends BaseRequestBuilder<RegionRequestBuilder> {
13
+ /**
14
+ * Note: This endpoint uses pagination by default, so not all regions may be returned in a single response. Please refer to pagination details for managing large result sets.
15
+ * @param requestConfiguration Configuration for the request such as headers, query parameters, and middleware options.
16
+ * @returns {Promise<RegionListResult>}
17
+ * @throws {ProblemDetails} error when the service returns a 400 status code
18
+ * @throws {ProblemDetails} error when the service returns a 500 status code
19
+ */
20
+ get(requestConfiguration?: RequestConfiguration<RegionRequestBuilderGetQueryParameters> | undefined) : Promise<RegionListResult | undefined>;
21
+ /**
22
+ * Note: This endpoint uses pagination by default, so not all regions may be returned in a single response. Please refer to pagination details for managing large result sets.
23
+ * @param requestConfiguration Configuration for the request such as headers, query parameters, and middleware options.
24
+ * @returns {RequestInformation}
25
+ */
26
+ toGetRequestInformation(requestConfiguration?: RequestConfiguration<RegionRequestBuilderGetQueryParameters> | undefined) : RequestInformation;
27
+ }
28
+ /**
29
+ * Note: This endpoint uses pagination by default, so not all regions may be returned in a single response. Please refer to pagination details for managing large result sets.
30
+ */
31
+ export interface RegionRequestBuilderGetQueryParameters {
32
+ /**
33
+ * Specifies whether to include archived records in the result set. If set to `true`, both archived and non-archived records will be included. If set to `false` (default), only non-archived records will be returned.
34
+ */
35
+ includeArchived?: boolean;
36
+ pageIndex?: number;
37
+ pageSize?: number;
38
+ /**
39
+ * The ID of the publisher for which to retrieve the regions. A list of available publishers can be retrieved using the GET Publisher endpoint.
40
+ */
41
+ publisherId?: Guid;
42
+ }
43
+ /**
44
+ * Uri template for the request builder.
45
+ */
46
+ export const RegionRequestBuilderUriTemplate = "{+baseurl}/Region?publisherId={publisherId}{&includeArchived*,pageIndex*,pageSize*}";
47
+ /**
48
+ * Metadata for all the requests in the request builder.
49
+ */
50
+ export const RegionRequestBuilderRequestsMetadata: RequestsMetadata = {
51
+ get: {
52
+ uriTemplate: RegionRequestBuilderUriTemplate,
53
+ responseBodyContentType: "application/json, text/plain;q=0.9",
54
+ errorMappings: {
55
+ 400: createProblemDetailsFromDiscriminatorValue as ParsableFactory<Parsable>,
56
+ 500: createProblemDetailsFromDiscriminatorValue as ParsableFactory<Parsable>,
57
+ },
58
+ adapterMethodName: "send",
59
+ responseBodyFactory: createRegionListResultFromDiscriminatorValue,
60
+ },
61
+ };
62
+ /* tslint:enable */
63
+ /* eslint-enable */
@@ -0,0 +1,71 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+ // Generated by Microsoft Kiota
4
+ // @ts-ignore
5
+ import { createProblemDetailsFromDiscriminatorValue, createReservationFromDiscriminatorValue, serializeCreateReservationRequest, serializeReservation, type CreateReservationRequest, type ProblemDetails, type Reservation } from '../models/index.js';
6
+ // @ts-ignore
7
+ import { type WithReservationItemRequestBuilder, WithReservationItemRequestBuilderNavigationMetadata, WithReservationItemRequestBuilderRequestsMetadata } from './item/index.js';
8
+ // @ts-ignore
9
+ import { type BaseRequestBuilder, type Guid, type KeysToExcludeForNavigationMetadata, type NavigationMetadata, type Parsable, type ParsableFactory, type RequestConfiguration, type RequestInformation, type RequestsMetadata } from '@microsoft/kiota-abstractions';
10
+
11
+ /**
12
+ * Builds and executes requests for operations under /Reservation
13
+ */
14
+ export interface ReservationRequestBuilder extends BaseRequestBuilder<ReservationRequestBuilder> {
15
+ /**
16
+ * Gets an item from the missioncontrol.client.Reservation.item collection
17
+ * @param reservationId Unique identifier of the item
18
+ * @returns {WithReservationItemRequestBuilder}
19
+ */
20
+ byReservationId(reservationId: Guid) : WithReservationItemRequestBuilder;
21
+ /**
22
+ * Creates a reservation that later can be redeemed to create an order.Use this endpoint to temporarily reserve items before confirming them as an order. The returned reservation can be redeemed using `POST /Order/claimReservation/{reservationId}`.
23
+ * @param body Request to send to create a reservation.
24
+ * @param requestConfiguration Configuration for the request such as headers, query parameters, and middleware options.
25
+ * @returns {Promise<Reservation>}
26
+ * @throws {ProblemDetails} error when the service returns a 400 status code
27
+ * @throws {ProblemDetails} error when the service returns a 500 status code
28
+ */
29
+ post(body: CreateReservationRequest, requestConfiguration?: RequestConfiguration<object> | undefined) : Promise<Reservation | undefined>;
30
+ /**
31
+ * Creates a reservation that later can be redeemed to create an order.Use this endpoint to temporarily reserve items before confirming them as an order. The returned reservation can be redeemed using `POST /Order/claimReservation/{reservationId}`.
32
+ * @param body Request to send to create a reservation.
33
+ * @param requestConfiguration Configuration for the request such as headers, query parameters, and middleware options.
34
+ * @returns {RequestInformation}
35
+ */
36
+ toPostRequestInformation(body: CreateReservationRequest, requestConfiguration?: RequestConfiguration<object> | undefined) : RequestInformation;
37
+ }
38
+ /**
39
+ * Uri template for the request builder.
40
+ */
41
+ export const ReservationRequestBuilderUriTemplate = "{+baseurl}/Reservation";
42
+ /**
43
+ * Metadata for all the navigation properties in the request builder.
44
+ */
45
+ export const ReservationRequestBuilderNavigationMetadata: Record<Exclude<keyof ReservationRequestBuilder, KeysToExcludeForNavigationMetadata>, NavigationMetadata> = {
46
+ byReservationId: {
47
+ requestsMetadata: WithReservationItemRequestBuilderRequestsMetadata,
48
+ navigationMetadata: WithReservationItemRequestBuilderNavigationMetadata,
49
+ pathParametersMappings: ["reservationId"],
50
+ },
51
+ };
52
+ /**
53
+ * Metadata for all the requests in the request builder.
54
+ */
55
+ export const ReservationRequestBuilderRequestsMetadata: RequestsMetadata = {
56
+ post: {
57
+ uriTemplate: ReservationRequestBuilderUriTemplate,
58
+ responseBodyContentType: "application/json, text/plain;q=0.9",
59
+ errorMappings: {
60
+ 400: createProblemDetailsFromDiscriminatorValue as ParsableFactory<Parsable>,
61
+ 500: createProblemDetailsFromDiscriminatorValue as ParsableFactory<Parsable>,
62
+ },
63
+ adapterMethodName: "send",
64
+ responseBodyFactory: createReservationFromDiscriminatorValue,
65
+ requestBodyContentType: "application/json",
66
+ requestBodySerializer: serializeCreateReservationRequest,
67
+ requestInformationContentSetMethod: "setContentFromParsable",
68
+ },
69
+ };
70
+ /* tslint:enable */
71
+ /* eslint-enable */
@@ -0,0 +1,48 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+ // Generated by Microsoft Kiota
4
+ // @ts-ignore
5
+ import { createProblemDetailsFromDiscriminatorValue, createReservationFromDiscriminatorValue, type ProblemDetails, type Reservation } from '../../../models/index.js';
6
+ // @ts-ignore
7
+ import { type BaseRequestBuilder, type Parsable, type ParsableFactory, type RequestConfiguration, type RequestInformation, type RequestsMetadata } from '@microsoft/kiota-abstractions';
8
+
9
+ /**
10
+ * Builds and executes requests for operations under /Reservation/{reservationId}/cancel
11
+ */
12
+ export interface CancelRequestBuilder extends BaseRequestBuilder<CancelRequestBuilder> {
13
+ /**
14
+ * Once canceled, the reservation can no longer be redeemed to create an order. This is useful if the customer does not complete the purchase or abandons the checkout process.
15
+ * @param requestConfiguration Configuration for the request such as headers, query parameters, and middleware options.
16
+ * @returns {Promise<Reservation>}
17
+ * @throws {ProblemDetails} error when the service returns a 400 status code
18
+ * @throws {ProblemDetails} error when the service returns a 500 status code
19
+ */
20
+ post(requestConfiguration?: RequestConfiguration<object> | undefined) : Promise<Reservation | undefined>;
21
+ /**
22
+ * Once canceled, the reservation can no longer be redeemed to create an order. This is useful if the customer does not complete the purchase or abandons the checkout process.
23
+ * @param requestConfiguration Configuration for the request such as headers, query parameters, and middleware options.
24
+ * @returns {RequestInformation}
25
+ */
26
+ toPostRequestInformation(requestConfiguration?: RequestConfiguration<object> | undefined) : RequestInformation;
27
+ }
28
+ /**
29
+ * Uri template for the request builder.
30
+ */
31
+ export const CancelRequestBuilderUriTemplate = "{+baseurl}/Reservation/{reservationId}/cancel";
32
+ /**
33
+ * Metadata for all the requests in the request builder.
34
+ */
35
+ export const CancelRequestBuilderRequestsMetadata: RequestsMetadata = {
36
+ post: {
37
+ uriTemplate: CancelRequestBuilderUriTemplate,
38
+ responseBodyContentType: "application/json, text/plain;q=0.9",
39
+ errorMappings: {
40
+ 400: createProblemDetailsFromDiscriminatorValue as ParsableFactory<Parsable>,
41
+ 500: createProblemDetailsFromDiscriminatorValue as ParsableFactory<Parsable>,
42
+ },
43
+ adapterMethodName: "send",
44
+ responseBodyFactory: createReservationFromDiscriminatorValue,
45
+ },
46
+ };
47
+ /* tslint:enable */
48
+ /* eslint-enable */
@@ -0,0 +1,62 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+ // Generated by Microsoft Kiota
4
+ // @ts-ignore
5
+ import { createProblemDetailsFromDiscriminatorValue, createReservationFromDiscriminatorValue, type ProblemDetails, type Reservation } from '../../models/index.js';
6
+ // @ts-ignore
7
+ import { CancelRequestBuilderRequestsMetadata, type CancelRequestBuilder } from './cancel/index.js';
8
+ // @ts-ignore
9
+ import { type BaseRequestBuilder, type KeysToExcludeForNavigationMetadata, type NavigationMetadata, type Parsable, type ParsableFactory, type RequestConfiguration, type RequestInformation, type RequestsMetadata } from '@microsoft/kiota-abstractions';
10
+
11
+ /**
12
+ * Builds and executes requests for operations under /Reservation/{reservationId}
13
+ */
14
+ export interface WithReservationItemRequestBuilder extends BaseRequestBuilder<WithReservationItemRequestBuilder> {
15
+ /**
16
+ * The cancel property
17
+ */
18
+ get cancel(): CancelRequestBuilder;
19
+ /**
20
+ * Gets a reservation by id
21
+ * @param requestConfiguration Configuration for the request such as headers, query parameters, and middleware options.
22
+ * @returns {Promise<Reservation>}
23
+ * @throws {ProblemDetails} error when the service returns a 400 status code
24
+ * @throws {ProblemDetails} error when the service returns a 500 status code
25
+ */
26
+ get(requestConfiguration?: RequestConfiguration<object> | undefined) : Promise<Reservation | undefined>;
27
+ /**
28
+ * Gets a reservation by id
29
+ * @param requestConfiguration Configuration for the request such as headers, query parameters, and middleware options.
30
+ * @returns {RequestInformation}
31
+ */
32
+ toGetRequestInformation(requestConfiguration?: RequestConfiguration<object> | undefined) : RequestInformation;
33
+ }
34
+ /**
35
+ * Uri template for the request builder.
36
+ */
37
+ export const WithReservationItemRequestBuilderUriTemplate = "{+baseurl}/Reservation/{reservationId}";
38
+ /**
39
+ * Metadata for all the navigation properties in the request builder.
40
+ */
41
+ export const WithReservationItemRequestBuilderNavigationMetadata: Record<Exclude<keyof WithReservationItemRequestBuilder, KeysToExcludeForNavigationMetadata>, NavigationMetadata> = {
42
+ cancel: {
43
+ requestsMetadata: CancelRequestBuilderRequestsMetadata,
44
+ },
45
+ };
46
+ /**
47
+ * Metadata for all the requests in the request builder.
48
+ */
49
+ export const WithReservationItemRequestBuilderRequestsMetadata: RequestsMetadata = {
50
+ get: {
51
+ uriTemplate: WithReservationItemRequestBuilderUriTemplate,
52
+ responseBodyContentType: "application/json, text/plain;q=0.9",
53
+ errorMappings: {
54
+ 400: createProblemDetailsFromDiscriminatorValue as ParsableFactory<Parsable>,
55
+ 500: createProblemDetailsFromDiscriminatorValue as ParsableFactory<Parsable>,
56
+ },
57
+ adapterMethodName: "send",
58
+ responseBodyFactory: createReservationFromDiscriminatorValue,
59
+ },
60
+ };
61
+ /* tslint:enable */
62
+ /* eslint-enable */
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Represents a MissionControl API environment, encapsulating its base URL and OAuth scope.
3
+ */
4
+ export enum MissionControlEnvironment {
5
+ /** https://api.sandbox.missioncontrol.io */
6
+ Sandbox = "Sandbox",
7
+
8
+ /** https://api.missioncontrol.io */
9
+ Production = "Production",
10
+ }
11
+
12
+ const settings: Record<
13
+ MissionControlEnvironment,
14
+ { baseUrl: string; scope: string }
15
+ > = {
16
+ [MissionControlEnvironment.Sandbox]: {
17
+ baseUrl: "https://api.sandbox.missioncontrol.io",
18
+ scope: "api://38fbfaea-5648-4b51-ac09-d5d90117beff/.default",
19
+ },
20
+ [MissionControlEnvironment.Production]: {
21
+ baseUrl: "https://api.missioncontrol.io",
22
+ scope: "api://1b6f40bc-e051-4b7e-987f-47a4a19fa5ef/.default",
23
+ },
24
+ };
25
+
26
+ export function getBaseUrl(env: MissionControlEnvironment): string {
27
+ return settings[env].baseUrl;
28
+ }
29
+
30
+ export function getScope(env: MissionControlEnvironment): string {
31
+ return settings[env].scope;
32
+ }
@@ -0,0 +1,61 @@
1
+ import {
2
+ type Middleware,
3
+ MiddlewareFactory,
4
+ RetryHandler,
5
+ RetryHandlerOptions,
6
+ } from "@microsoft/kiota-http-fetchlibrary";
7
+ import { nonIdempotentPaths } from "./nonIdempotentPaths";
8
+ import { AutoCancelOrderHandler } from "./autoCancelOrderHandler";
9
+ import { PartnerIdHandler } from "./partnerIdHandler";
10
+
11
+ function isNoRetryEndpoint(url: string): boolean {
12
+ try {
13
+ const { pathname } = new URL(url);
14
+ // Prefix match handles both fixed paths and parameterised ones.
15
+ return nonIdempotentPaths.some((prefix) =>
16
+ pathname.toLowerCase().startsWith(prefix.toLowerCase()),
17
+ );
18
+ } catch {
19
+ return false;
20
+ }
21
+ }
22
+
23
+ /**
24
+ * Builds the middleware stack for a MissionControl HTTP client.
25
+ *
26
+ * The default Kiota retry handler is replaced with a custom one that:
27
+ * - Never retries non-idempotent endpoints (createOrder, claimReservation, reportOrder),
28
+ * since a retry could cause duplicate orders or reservations.
29
+ * - Retries on 429 Too Many Requests, 503 Service Unavailable, and 504 Gateway Timeout.
30
+ *
31
+ * The {@link AutoCancelOrderHandler} sits at the outermost position so it sees the final
32
+ * response after all retries are exhausted. Its compensating cancel request flows through
33
+ * the inner handlers and therefore picks up partner-id injection and retry behaviour.
34
+ */
35
+ export function createHandlers(defaultPartnerId?: string): Middleware[] {
36
+ const retryOptions = new RetryHandlerOptions({
37
+ shouldRetry: (_delay, _attempt, request, _options, response) => {
38
+ if (isNoRetryEndpoint(request)) return false;
39
+ return (
40
+ response.status === 429 ||
41
+ response.status === 503 ||
42
+ response.status === 504
43
+ );
44
+ },
45
+ });
46
+
47
+ const middlewares = MiddlewareFactory.getDefaultMiddlewares();
48
+
49
+ // Replace the default RetryHandler with our custom-configured one.
50
+ const retryIndex = middlewares.findIndex((m) => m instanceof RetryHandler);
51
+ if (retryIndex !== -1) {
52
+ middlewares[retryIndex] = new RetryHandler(retryOptions);
53
+ }
54
+
55
+ if (defaultPartnerId) {
56
+ middlewares.unshift(new PartnerIdHandler(defaultPartnerId));
57
+ }
58
+ middlewares.unshift(new AutoCancelOrderHandler());
59
+
60
+ return middlewares;
61
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Header names used by the MissionControl Partner API.
3
+ */
4
+ export const MissionControlHeaders = {
5
+ /**
6
+ * Identifies the partner on whose behalf the request is made.
7
+ * This value is provided via the portal on the client credentials page.
8
+ */
9
+ PartnerId: "X-Partner-Id",
10
+ } as const;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Path prefixes for non-idempotent order-mutation endpoints.
3
+ * Used both to suppress retries and to trigger auto-cancel on failure.
4
+ */
5
+ export const nonIdempotentPaths = [
6
+ "/Order/createOrder",
7
+ "/Order/claimReservation",
8
+ "/Order/reportOrder",
9
+ ] as const;
@@ -0,0 +1,33 @@
1
+ import type { RequestOption } from "@microsoft/kiota-abstractions";
2
+ import type { Middleware } from "@microsoft/kiota-http-fetchlibrary";
3
+ import { MissionControlHeaders } from "./missionControlHeaders";
4
+
5
+ /**
6
+ * A Kiota middleware that injects a default {@link MissionControlHeaders.PartnerId} header into
7
+ * every outgoing request. The header is only added when no value has already been set on the
8
+ * request, so a per-request override always takes precedence.
9
+ */
10
+ export class PartnerIdHandler implements Middleware {
11
+ private readonly defaultPartnerId: string;
12
+ next: Middleware | undefined;
13
+
14
+ /**
15
+ * @param defaultPartnerId The partner ID to add to requests that do not already carry the header.
16
+ */
17
+ constructor(defaultPartnerId: string) {
18
+ this.defaultPartnerId = defaultPartnerId;
19
+ }
20
+
21
+ async execute(
22
+ url: string,
23
+ requestInit: RequestInit,
24
+ requestOptions?: Record<string, RequestOption>,
25
+ ): Promise<Response> {
26
+ const headers = new Headers(requestInit.headers);
27
+ if (!headers.has(MissionControlHeaders.PartnerId)) {
28
+ headers.set(MissionControlHeaders.PartnerId, this.defaultPartnerId);
29
+ requestInit = { ...requestInit, headers };
30
+ }
31
+ return this.next!.execute(url, requestInit, requestOptions);
32
+ }
33
+ }