Merge pull request #5038 from erikxiv/fix/todo-forward-auth

fix: forward auth on todo backend requests
This commit is contained in:
Patrik Oldsberg
2021-03-24 23:55:29 +01:00
committed by GitHub
6 changed files with 84 additions and 30 deletions
@@ -89,7 +89,9 @@ describe('TodoReaderService', () => {
offset: 0,
limit: 10,
});
expect(catalogClient.getEntityByName).toHaveBeenCalledWith(entityName);
expect(catalogClient.getEntityByName).toHaveBeenCalledWith(entityName, {
token: undefined,
});
});
it('should list, order, and filter todos', async () => {
@@ -298,7 +300,9 @@ describe('TodoReaderService', () => {
message: 'Entity not found, Component:default/my-component',
}),
);
expect(catalogClient.getEntityByName).toHaveBeenCalledWith(entityName);
expect(catalogClient.getEntityByName).toHaveBeenCalledWith(entityName, {
token: undefined,
});
});
it('should throw if entity does not have a location', async () => {
@@ -56,11 +56,17 @@ export class TodoReaderService implements TodoService {
this.defaultPageSize = options.defaultPageSize ?? DEFAULT_DEFAULT_PAGE_SIZE;
}
async listTodos(req: ListTodosRequest): Promise<ListTodosResponse> {
async listTodos(
req: ListTodosRequest,
options?: { token?: string },
): Promise<ListTodosResponse> {
if (!req.entity) {
throw new InputError('Entity filter is required to list TODOs');
}
const entity = await this.catalogClient.getEntityByName(req.entity);
const token = options?.token;
const entity = await this.catalogClient.getEntityByName(req.entity, {
token,
});
if (!entity) {
throw new NotFoundError(
`Entity not found, ${serializeEntityRef(req.entity)}`,
+45 -18
View File
@@ -69,11 +69,32 @@ describe('createRouter', () => {
const response = await request(app).get('/v1/todos');
expect(response.status).toEqual(200);
expect(response.body).toEqual(mockListBody);
expect(mockService.listTodos).toHaveBeenCalledWith({
entity: undefined,
offset: undefined,
limit: undefined,
});
expect(mockService.listTodos).toHaveBeenCalledWith(
{
entity: undefined,
offset: undefined,
limit: undefined,
},
{ token: undefined },
);
});
it('forwards auth token', async () => {
mockService.listTodos.mockResolvedValueOnce(mockListBody);
const response = await request(app)
.get('/v1/todos')
.set('Authorization', 'Bearer secret');
expect(response.status).toEqual(200);
expect(response.body).toEqual(mockListBody);
expect(mockService.listTodos).toHaveBeenCalledWith(
{
entity: undefined,
offset: undefined,
limit: undefined,
},
{ token: 'secret' },
);
});
it('forwards pagination query', async () => {
@@ -82,11 +103,14 @@ describe('createRouter', () => {
const response = await request(app).get('/v1/todos?offset=5&limit=3');
expect(response.status).toEqual(200);
expect(response.body).toEqual(mockListBody);
expect(mockService.listTodos).toHaveBeenCalledWith({
entity: undefined,
offset: 5,
limit: 3,
});
expect(mockService.listTodos).toHaveBeenCalledWith(
{
entity: undefined,
offset: 5,
limit: 3,
},
{ token: undefined },
);
});
it('forwards entity query', async () => {
@@ -97,15 +121,18 @@ describe('createRouter', () => {
);
expect(response.status).toEqual(200);
expect(response.body).toEqual(mockListBody);
expect(mockService.listTodos).toHaveBeenCalledWith({
entity: {
name: 'my-component',
kind: 'component',
namespace: 'default',
expect(mockService.listTodos).toHaveBeenCalledWith(
{
entity: {
name: 'my-component',
kind: 'component',
namespace: 'default',
},
offset: undefined,
limit: undefined,
},
offset: undefined,
limit: undefined,
});
{ token: undefined },
);
});
it('rejects invalid queries', async () => {
+16 -7
View File
@@ -59,13 +59,18 @@ export async function createRouter(
}
}
const todos = await todoService.listTodos({
entity,
offset,
limit,
orderBy,
filters,
});
const todos = await todoService.listTodos(
{
entity,
offset,
limit,
orderBy,
filters,
},
{
token: getBearerToken(req.headers.authorization),
},
);
res.json(todos);
});
@@ -157,3 +162,7 @@ export function parseFilterParam<T extends readonly string[]>(
return filters;
}
function getBearerToken(header?: string): string | undefined {
return header?.match(/Bearer\s+(\S+)/i)?.[1];
}
+4 -1
View File
@@ -42,5 +42,8 @@ export type ListTodosResponse = {
};
export interface TodoService {
listTodos(req: ListTodosRequest): Promise<ListTodosResponse>;
listTodos(
req: ListTodosRequest,
options?: { token?: string },
): Promise<ListTodosResponse>;
}