Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: use authorization header for access token #192

Merged
merged 1 commit into from
Oct 1, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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);
});