0.4.5 • Published 11 months ago

@biblioteksentralen/media-store-api-client v0.4.5

Weekly downloads
-
License
ISC
Repository
-
Last release
11 months ago

@biblioteksentralen/media-store-api-client

Installation

npm install @biblioteksentralen/media-store-api-client

Note that the package is a pure ESM package and doesn't provide a CommonJS export.

Machine-to-machine usage (backend/NodeJS)

With machine-to-machine (M2M) applications, such as scheduled jobs, where there is no user involved, the application can be authenticated and authorized using the Oauth Client Credentials Flow using the included clientCredentialsMiddleware:

import {
  createMediaStoreApiClient,
  clientCredentialsMiddleware,
} from "@biblioteksentralen/media-store-api-client";

const mediaStore = createMediaStoreApiClient({
  baseUrl: "http://localhost:5000/api/",
  userAgent: "my-little-script",
  auth: clientCredentialsMiddleware({
    tokenUrl: "https://biblioteksentralen-dev.eu.auth0.com/oauth/token",
    clientId: MEDIA_STORE_CLIENT_ID,
    clientSecret: MEDIA_STORE_CLIENT_SECRET,
    audience: "https://media.aja-test.bibsent.dev/",
  }),
});

const { data, error } = await mediaStore.listAssets();

Browser usage

In browsers, an access token for a user can be obtained using Oauth Authorization Code Flow (best) or Implicit Flow (less secure). After logging in the user, obtain an access token and initialize the client with it:

import {
  createMediaStoreApiClient,
  clientCredentialsMiddleware,
} from "@biblioteksentralen/media-store-api-client";

const mediaStore = createMediaStoreApiClient({
  baseUrl: "http://localhost:5000/api/",
  userAgent: "my-little-script",
  auth: accessTokenMiddleware({
    accessToken: MEDIA_STORE_ACCESS_TOKEN,
  }),
});

Error handling

The client returns errors on non-2XX responses. In addition, fetch will throw TypeError on network errors and the clientCredentialsMiddleware will throw FetchAccessTokenError if it cannot obtain an access token. A comprehensive error handling example:

import { FetchAccessTokenError } from "@biblioteksentralen/media-store-api-client";

async function handleApiErrors<Data, Err>(
  request: Promise<
    | {
        data: Data;
        error?: never;
      }
    | {
        data?: never;
        error: Err;
      }
  >,
): Promise<{ data?: Data; error?: { message: string } }> {
  try {
    const { data, error } = await request;
    if (error) {
      return { error: { message: JSON.stringify(error) } };
    }
    return { data };
  } catch (error: unknown) {
    if (error instanceof TypeError) {
      return { error: { message: "Request failed with network error" } };
    } else if (error instanceof FetchAccessTokenError) {
      return { error: { message: "Failed to authenticate" } };
    } else {
      return { error: { message: "Request failed with unknown error" } };
    }
  }
}

const { data, error } = await handleApiErrors(mediaStore.listAssets());
if (error) {
  console.error(error);
} else {
  console.info(data);
}

Example: React hook with SWR

export const useApi = () => {
  const { session } = useSession();
  return useMemo(
    () =>
      session.accessToken
        ? createMediaStoreApiClient({
            baseUrl: "https://media.aja.bs.no/api",
            userAgent: "media-store-manage",
            auth: accessTokenMiddleware({
              accessToken: `Bearer ${session.accessToken}`,
            }),
          })
        : undefined,
    [session.accessToken],
  );
};

export const useListAssets = (query: string) => {
  const api = useApi();
  return useSWR(`listAssets:${query}`, () =>
    api?.listAssets(query ? { ean: query } : undefined),
  );
};
0.3.0

1 year ago

0.4.5

11 months ago

0.4.4

11 months ago

0.3.5

12 months ago

0.4.1

11 months ago

0.3.2

12 months ago

0.4.0

12 months ago

0.3.1

12 months ago

0.4.3

11 months ago

0.3.4

12 months ago

0.4.2

11 months ago

0.3.3

12 months ago

0.2.4

1 year ago

0.2.1

3 years ago

0.2.0

3 years ago

0.2.3

3 years ago

0.2.2

3 years ago

0.1.13

3 years ago

0.1.12

3 years ago

0.1.11

3 years ago

0.1.10

3 years ago

0.1.9

3 years ago

0.1.8

3 years ago

0.1.7

3 years ago

0.1.6

3 years ago

0.1.6-0

3 years ago

0.1.5

3 years ago

0.1.4

3 years ago

0.1.3

3 years ago

0.1.2

3 years ago

0.1.2-0

3 years ago

0.1.1

3 years ago

0.1.0

3 years ago