Skip to content

Commit

Permalink
feat: use authorization header for access token (#192)
Browse files Browse the repository at this point in the history
  • Loading branch information
angeloashmore authored Oct 1, 2021
1 parent 99eafea commit 42af240
Show file tree
Hide file tree
Showing 9 changed files with 33 additions and 120 deletions.
64 changes: 15 additions & 49 deletions src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,7 @@ import { appendPredicates } from "./lib/appendPredicates";
import { castThunk } from "./lib/castThunk";
import { getCookie } from "./lib/getCookie";

import {
FetchLike,
HttpRequestLike,
// TODO: Uncomment when the Authorization header can be used
// @see Related issue - {@link https://github.com/prismicio/issue-tracker-wroom/issues/351}
// RequestInitLike
} from "./types";
import { FetchLike, HttpRequestLike, RequestInitLike } from "./types";
import { buildQueryURL, BuildQueryURLArgs } from "./buildQueryURL";
import { ForbiddenError, isForbiddenErrorAPIResponse } from "./ForbiddenError";
import { ParsingError, isParsingErrorAPIResponse } from "./ParsingError";
Expand Down Expand Up @@ -517,10 +511,7 @@ export class Client {
): Promise<prismicT.Query<TDocument>> {
const url = await this.buildQueryURL(params);

// TODO: Uncomment when the Authorization header can be used
// @see Related issue - {@link https://github.com/prismicio/issue-tracker-wroom/issues/351}
// return await this.fetch<Query<TDocument>>(url, params);
return await this.fetch<prismicT.Query<TDocument>>(url);
return await this.fetch<prismicT.Query<TDocument>>(url, params);
}

/**
Expand Down Expand Up @@ -980,17 +971,7 @@ export class Client {
* @returns Repository metadata.
*/
async getRepository(): Promise<prismicT.Repository> {
// TODO: Uncomment when the Authorization header can be used
// @see Related issue - {@link https://github.com/prismicio/issue-tracker-wroom/issues/351}
// return await this.fetch<Repository>(this.endpoint);

const url = new URL(this.endpoint);

if (this.accessToken) {
url.searchParams.set("access_token", this.accessToken);
}

return await this.fetch<prismicT.Repository>(url.toString());
return await this.fetch<prismicT.Repository>(this.endpoint);
}

/**
Expand Down Expand Up @@ -1111,25 +1092,17 @@ export class Client {
async buildQueryURL(
params: Partial<BuildQueryURLArgs> = {},
): Promise<string> {
// TODO: Uncomment when the Authorization header can be used
// @see Related issue - {@link https://github.com/prismicio/issue-tracker-wroom/issues/351}
// const {
// ref = await this.getResolvedRefString(),
// accessToken: _accessToken,
// ...actualParams
// } = params;
const {
ref = await this.getResolvedRefString(),
integrationFieldsRef = await this.getResolvedIntegrationFieldsRef(),
accessToken = this.accessToken,
accessToken: _accessToken,
routes = this.routes,
...actualParams
} = params;

return buildQueryURL(this.endpoint, {
...this.defaultParams,
...actualParams,
accessToken,
ref,
integrationFieldsRef,
routes,
Expand Down Expand Up @@ -1447,17 +1420,15 @@ export class Client {
* @returns Request options that can be used to make a network request to
* query the repository.
*/
// TODO: Uncomment when the Authorization header can be used
// @see Related issue - {@link https://github.com/prismicio/issue-tracker-wroom/issues/351}
// private buildRequestOptions(
// params?: Partial<BuildQueryURLArgs>
// ): RequestInitLike {
// const accessToken = params?.accessToken || this.accessToken;
private buildRequestOptions(
params?: Partial<BuildQueryURLArgs>,
): RequestInitLike {
const accessToken = params?.accessToken || this.accessToken;

// return accessToken
// ? { headers: { Authorization: `Token ${accessToken}` } }
// : {};
// }
return accessToken
? { headers: { Authorization: `Token ${accessToken}` } }
: {};
}

/**
* Performs a network request using the configured `fetch` function. It
Expand All @@ -1472,15 +1443,10 @@ export class Client {
*/
private async fetch<T = unknown>(
url: string,
// TODO: Uncomment when the Authorization header can be used
// @see Related issue - {@link https://github.com/prismicio/issue-tracker-wroom/issues/351}
// params?: Partial<BuildQueryURLArgs>
params?: Partial<BuildQueryURLArgs>,
): Promise<T> {
// TODO: Uncomment when the Authorization header can be used
// @see Related issue - {@link https://github.com/prismicio/issue-tracker-wroom/issues/351}
// const options = this.buildRequestOptions(params);
// const res = await this.fetchFn(url, options);
const res = await this.fetchFn(url);
const options = this.buildRequestOptions(params);
const res = await this.fetchFn(url, options);

// eslint-disable-next-line @typescript-eslint/no-explicit-any
let json: any;
Expand Down
23 changes: 4 additions & 19 deletions test/__testutils__/createMockQueryHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,18 @@ import { SetRequired } from "type-fest";
import * as ava from "ava";
import * as msw from "msw";
import * as crypto from "crypto";

import * as prismic from "../../src";
import * as prismicT from "@prismicio/types";

import { isValidAccessToken } from "./isValidAccessToken";
import { createQueryResponse } from "./createQueryResponse";
import * as prismicT from "@prismicio/types";

const castArray = <A>(a: A | A[]): A[] => (Array.isArray(a) ? a : [a]);

export const createMockQueryHandler = <
TDocument extends prismicT.PrismicDocument = prismicT.PrismicDocument,
>(
t: ava.ExecutionContext,
pagedResponses: Partial<prismic.Query<SetRequired<TDocument, "uid">>>[] = [
pagedResponses: Partial<prismicT.Query<SetRequired<TDocument, "uid">>>[] = [
createQueryResponse(),
],
accessToken?: string,
Expand Down Expand Up @@ -60,29 +58,16 @@ export const createMockQueryHandler = <
requiredSearchParamsInstance.append("page", page.toString());
}

// TODO: Remove when the Authorization header can be used
// @see Related issue - {@link https://github.com/prismicio/issue-tracker-wroom/issues/351}
const searchParamsWithoutAccessToken = new URLSearchParams(
req.url.searchParams,
);
searchParamsWithoutAccessToken.delete("access_token");

if (debug) {
t.is(
requiredSearchParamsInstance.toString(),
// TODO: Uncomment when the Authorization header can be used
// @see Related issue - {@link https://github.com/prismicio/issue-tracker-wroom/issues/351}
// req.url.searchParams.toString()
searchParamsWithoutAccessToken.toString(),
req.url.searchParams.toString(),
);
}

requestMatches =
requiredSearchParamsInstance.toString() ===
// TODO: Uncomment when the Authorization header can be used
// @see Related issue - {@link https://github.com/prismicio/issue-tracker-wroom/issues/351}
// req.url.searchParams.toString()
searchParamsWithoutAccessToken.toString();
req.url.searchParams.toString();
}

if (requestMatches) {
Expand Down
8 changes: 3 additions & 5 deletions test/__testutils__/createQueryResponse.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
import { SetRequired } from "type-fest";
import * as prismicT from "@prismicio/types";

import * as prismic from "../../src";
import { createDocument } from "./createDocument";

import * as prismicT from "@prismicio/types";

export const createQueryResponse = <
TDocument extends prismicT.PrismicDocument = prismicT.PrismicDocument,
>(
docs: SetRequired<TDocument, "uid">[] = [createDocument(), createDocument()],
overrides?: Partial<prismic.Query<TDocument>>,
): prismic.Query<SetRequired<TDocument, "uid">> => ({
overrides?: Partial<prismicT.Query<TDocument>>,
): prismicT.Query<SetRequired<TDocument, "uid">> => ({
page: 1,
results_per_page: docs.length,
results_size: docs.length,
Expand Down
6 changes: 2 additions & 4 deletions test/__testutils__/createQueryResponsePages.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
import { SetRequired } from "type-fest";

import * as prismic from "../../src";
import * as prismicT from "@prismicio/types";

import { createDocument } from "./createDocument";
import { createQueryResponse } from "./createQueryResponse";
import * as prismicT from "@prismicio/types";

type CreateQueryResponsePagesArgs<
TDocument extends prismicT.PrismicDocument = prismicT.PrismicDocument,
Expand All @@ -20,7 +18,7 @@ export const createQueryResponsePages = <
numPages = 3,
numDocsPerPage = 3,
fields,
}: CreateQueryResponsePagesArgs<TDocument>): prismic.Query<
}: CreateQueryResponsePagesArgs<TDocument>): prismicT.Query<
SetRequired<TDocument, "uid">
>[] => {
const documents = Array(numDocsPerPage)
Expand Down
6 changes: 3 additions & 3 deletions test/__testutils__/createRepositoryResponse.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import * as prismic from "../../src";
import * as prismicT from "@prismicio/types";

import { createRef } from "./createRef";

export const createRepositoryResponse = (
overrides?: Partial<prismic.Repository>,
): prismic.Repository => {
overrides?: Partial<prismicT.Repository>,
): prismicT.Repository => {
return {
refs: [createRef(true)],
integrationFieldsRef: null,
Expand Down
13 changes: 3 additions & 10 deletions test/__testutils__/isValidAccessToken.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,13 @@
import * as msw from "msw";

// TODO: Uncomment when the Authorization header can be used
// @see Related issue - {@link https://github.com/prismicio/issue-tracker-wroom/issues/351}
// import { createAuthorizationHeader } from "./createAuthorizationHeader";
import { createAuthorizationHeader } from "./createAuthorizationHeader";

export const isValidAccessToken = (
accessToken: string | undefined,
req: msw.RestRequest,
): boolean => {
// TODO: Uncomment when the Authorization header can be used
// @see Related issue - {@link https://github.com/prismicio/issue-tracker-wroom/issues/351}
// return typeof accessToken === "string"
// ? req.headers.get("Authorization") ===
// createAuthorizationHeader(accessToken)
// : true;
return typeof accessToken === "string"
? req.url.searchParams.get("access_token") === accessToken
? req.headers.get("Authorization") ===
createAuthorizationHeader(accessToken)
: true;
};
6 changes: 3 additions & 3 deletions test/__testutils__/types.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Repository } from "../../src";
import * as prismicT from "@prismicio/types";

export type GetContext = {
repositoryResponse: Repository;
getRef(repository: Repository): string;
repositoryResponse: prismicT.Repository;
getRef(repository: prismicT.Repository): string;
};
9 changes: 0 additions & 9 deletions test/client-buildQueryURL.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,6 @@ test("includes params if provided", async (t) => {
const expectedSearchParams = new URLSearchParams({
ref: params.ref,
lang: params.lang?.toString() ?? "",
// TODO: Remove when the Authorization header can be used
// @see Related issue - {@link https://github.com/prismicio/issue-tracker-wroom/issues/351}
access_token: params.accessToken ?? "",
});

t.is(url.host, new URL(client.endpoint).host);
Expand All @@ -68,9 +65,6 @@ test("includes default params if provided", async (t) => {
const expectedSearchParams = new URLSearchParams({
ref: clientOptions.ref?.toString() ?? "",
lang: clientOptions.defaultParams?.lang?.toString() ?? "",
// TODO: Remove when the Authorization header can be used
// @see Related issue - {@link https://github.com/prismicio/issue-tracker-wroom/issues/351}
access_token: clientOptions.accessToken ?? "",
});

t.is(url.host, new URL(client.endpoint).host);
Expand Down Expand Up @@ -98,9 +92,6 @@ test("merges params and default params if provided", async (t) => {
ref: params.ref,
lang: clientOptions.defaultParams?.lang?.toString() ?? "",
page: clientOptions.defaultParams?.page?.toString() ?? "",
// TODO: Remove when the Authorization header can be used
// @see Related issue - {@link https://github.com/prismicio/issue-tracker-wroom/issues/351}
access_token: clientOptions.accessToken ?? "",
});

t.is(url.host, new URL(client.endpoint).host);
Expand Down
18 changes: 0 additions & 18 deletions test/client-getRepository.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@ import { createMockRepositoryHandler } from "./__testutils__/createMockRepositor
import { createRepositoryResponse } from "./__testutils__/createRepositoryResponse";
import { createTestClient } from "./__testutils__/createClient";

import * as prismic from "../src";

const server = mswNode.setupServer();
test.before(() => server.listen({ onUnhandledRequest: "error" }));
test.after(() => server.close());
Expand All @@ -20,19 +18,3 @@ test("returns repository metadata", async (t) => {

t.deepEqual(res, response);
});

// TODO: Remove when the Authorization header can be used
// @see Related issue - {@link https://github.com/prismicio/issue-tracker-wroom/issues/351}
test("includes access token if configured", async (t) => {
const options: prismic.ClientConfig = {
accessToken: "accessToken",
};

const response = createRepositoryResponse();
server.use(createMockRepositoryHandler(t, response, options.accessToken));

const client = createTestClient(t, options);
const res = await client.getRepository();

t.deepEqual(res, response);
});

0 comments on commit 42af240

Please sign in to comment.