Skip to content

Commit

Permalink
feat(directory-service): register cache target for tag resources
Browse files Browse the repository at this point in the history
  • Loading branch information
tzuge committed Jan 23, 2025
1 parent 4950998 commit 09a399e
Show file tree
Hide file tree
Showing 7 changed files with 119 additions and 63 deletions.
17 changes: 8 additions & 9 deletions apps/directory-service/src/directory/events.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
import type { DomainEvent, DomainEventDefinition, User, Stream } from '@abgov/adsp-service-sdk';
import { Resource, Tag } from './types';
import type { mapTag } from './mapper';
import { Resource } from './types';

const ENTRY_UPDATED = 'entry-updated';
const ENTRY_DELETED = 'entry-deleted';
export const TAGGED_RESOURCE = 'tagged-resource';
const UNTAGGED_RESOURCE = 'untagged-resource';
const RESOURCE_RESOLUTION_FAILED = 'resource-resolution-failed';

type Tag = ReturnType<typeof mapTag>;

export const EntryUpdatedDefinition: DomainEventDefinition = {
name: ENTRY_UPDATED,
description: 'Signalled when a directory entry is updated.',
Expand Down Expand Up @@ -85,6 +88,7 @@ export const TaggedResourceDefinition: DomainEventDefinition = {
tag: {
type: 'object',
properties: {
urn: { type: 'string' },
label: { type: 'string' },
value: { type: 'string' },
},
Expand Down Expand Up @@ -117,6 +121,7 @@ export const UntaggedResourceDefinition: DomainEventDefinition = {
tag: {
type: 'object',
properties: {
urn: { type: 'string' },
label: { type: 'string' },
value: { type: 'string' },
},
Expand Down Expand Up @@ -218,10 +223,7 @@ export const taggedResource = (resource: Resource, tag: Tag, updatedBy: User, is
description: resource.description,
isNew: isNewResource,
},
tag: {
label: tag.label,
value: tag.value,
},
tag,
updatedBy: {
id: updatedBy.id,
name: updatedBy.name,
Expand All @@ -244,10 +246,7 @@ export const untaggedResource = (resource: Resource, tag: Tag, updatedBy: User):
name: resource.name,
description: resource.description,
},
tag: {
label: tag.label,
value: tag.value,
},
tag,
updatedBy: {
id: updatedBy.id,
name: updatedBy.name,
Expand Down
2 changes: 2 additions & 0 deletions apps/directory-service/src/directory/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
AdspId,
ServiceDirectory,
TokenProvider,
adspId,
} from '@abgov/adsp-service-sdk';
import { assertAuthenticatedHandler, DomainEvent, WorkQueueService } from '@core-services/core-common';
import { createDirectoryJobs } from './job';
Expand Down Expand Up @@ -59,6 +60,7 @@ export const applyDirectoryMiddleware = (

const resourceRouter = createResourceRouter({
logger,
apiId: adspId`${serviceId}:resource-v1`,
directory,
eventService,
repository: directoryRepository,
Expand Down
34 changes: 34 additions & 0 deletions apps/directory-service/src/directory/mapper.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { AdspId } from '@abgov/adsp-service-sdk';
import { Tag, Resource } from './types';

export function mapTag(apiId: AdspId, tag: Tag) {
return tag
? {
urn: `${apiId}:/tags/${tag.value}`,
label: tag.label,
value: tag.value,
_links: {
resources: {
href: `${apiId}:/tags/${tag.value}/resources`,
},
},
}
: null;
}

export function mapResource(resource: Resource) {
return resource
? {
urn: resource.urn.toString(),
name: resource.name,
description: resource.description,
type: resource.type,
_links: {
represents: { href: resource.urn.toString() },
},
_embedded: resource.data && {
represents: resource.data,
},
}
: null;
}
34 changes: 18 additions & 16 deletions apps/directory-service/src/directory/router/resource.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { createResourceRouter, getTaggedResources, getTags, tagOperation } from

describe('resource', () => {
const tenantId = adspId`urn:ads:platform:tenant-service:v2:/tenants/test`;
const apiId = adspId`urn:ads:platform:directory-service:resource-v1`;

const loggerMock = {
debug: jest.fn(),
Expand Down Expand Up @@ -49,6 +50,7 @@ describe('resource', () => {

it('can create router', () => {
const router = createResourceRouter({
apiId,
logger: loggerMock,
directory: directoryMock,
eventService: eventServiceMock,
Expand All @@ -59,7 +61,7 @@ describe('resource', () => {

describe('getTags', () => {
it('can create handler', () => {
const handler = getTags(repositoryMock);
const handler = getTags(apiId, repositoryMock);
expect(handler).toBeTruthy();
});

Expand All @@ -81,7 +83,7 @@ describe('resource', () => {
];
repositoryMock.getTags.mockResolvedValueOnce({ results, page });

const handler = getTags(repositoryMock);
const handler = getTags(apiId, repositoryMock);
await handler(req as unknown as Request, res as unknown as Response, next);
expect(repositoryMock.getTags).toHaveBeenCalledWith(
10,
Expand Down Expand Up @@ -114,7 +116,7 @@ describe('resource', () => {
];
repositoryMock.getTags.mockResolvedValueOnce({ results, page });

const handler = getTags(repositoryMock);
const handler = getTags(apiId, repositoryMock);
await handler(req as unknown as Request, res as unknown as Response, next);
expect(repositoryMock.getTags).toHaveBeenCalledWith(
42,
Expand All @@ -138,7 +140,7 @@ describe('resource', () => {
const res = { send: jest.fn() };
const next = jest.fn();

const handler = getTags(repositoryMock);
const handler = getTags(apiId, repositoryMock);
await handler(req as unknown as Request, res as unknown as Response, next);
expect(res.send).not.toHaveBeenCalled();
expect(next).toBeCalledWith(expect.any(UnauthorizedUserError));
Expand All @@ -147,7 +149,7 @@ describe('resource', () => {

describe('tagOperation', () => {
it('can create handler', () => {
const handler = tagOperation(loggerMock, directoryMock, eventServiceMock, repositoryMock);
const handler = tagOperation(apiId, loggerMock, directoryMock, eventServiceMock, repositoryMock);
expect(handler).toBeTruthy();
});

Expand Down Expand Up @@ -179,7 +181,7 @@ describe('resource', () => {
};
repositoryMock.applyTag.mockResolvedValueOnce({ tag, resource, tagged: true });

const handler = tagOperation(loggerMock, directoryMock, eventServiceMock, repositoryMock);
const handler = tagOperation(apiId, loggerMock, directoryMock, eventServiceMock, repositoryMock);
await handler(req as unknown as Request, res as unknown as Response, next);
expect(repositoryMock.applyTag).toHaveBeenCalledWith(
expect.objectContaining({ tenantId, ...tag }),
Expand Down Expand Up @@ -227,7 +229,7 @@ describe('resource', () => {
};
repositoryMock.removeTag.mockResolvedValueOnce({ tag, resource, untagged: true });

const handler = tagOperation(loggerMock, directoryMock, eventServiceMock, repositoryMock);
const handler = tagOperation(apiId, loggerMock, directoryMock, eventServiceMock, repositoryMock);
await handler(req as unknown as Request, res as unknown as Response, next);
expect(repositoryMock.removeTag).toHaveBeenCalledWith(
expect.objectContaining({ tenantId, ...tag }),
Expand Down Expand Up @@ -275,7 +277,7 @@ describe('resource', () => {
};
repositoryMock.applyTag.mockResolvedValueOnce({ tag, resource, tagged: true });

const handler = tagOperation(loggerMock, directoryMock, eventServiceMock, repositoryMock);
const handler = tagOperation(apiId, loggerMock, directoryMock, eventServiceMock, repositoryMock);
await handler(req as unknown as Request, res as unknown as Response, next);
expect(repositoryMock.applyTag).toHaveBeenCalledWith(
expect.objectContaining({ tenantId, ...req.body.tag }),
Expand Down Expand Up @@ -312,7 +314,7 @@ describe('resource', () => {
const res = { send: jest.fn() };
const next = jest.fn();

const handler = tagOperation(loggerMock, directoryMock, eventServiceMock, repositoryMock);
const handler = tagOperation(apiId, loggerMock, directoryMock, eventServiceMock, repositoryMock);
await handler(req as unknown as Request, res as unknown as Response, next);

expect(res.send).not.toHaveBeenCalled();
Expand All @@ -337,7 +339,7 @@ describe('resource', () => {
const res = { send: jest.fn() };
const next = jest.fn();

const handler = tagOperation(loggerMock, directoryMock, eventServiceMock, repositoryMock);
const handler = tagOperation(apiId, loggerMock, directoryMock, eventServiceMock, repositoryMock);
await handler(req as unknown as Request, res as unknown as Response, next);

expect(res.send).not.toHaveBeenCalled();
Expand All @@ -359,7 +361,7 @@ describe('resource', () => {
const res = { send: jest.fn() };
const next = jest.fn();

const handler = tagOperation(loggerMock, directoryMock, eventServiceMock, repositoryMock);
const handler = tagOperation(apiId, loggerMock, directoryMock, eventServiceMock, repositoryMock);
await handler(req as unknown as Request, res as unknown as Response, next);

expect(res.send).not.toHaveBeenCalled();
Expand All @@ -382,7 +384,7 @@ describe('resource', () => {
const res = { send: jest.fn() };
const next = jest.fn();

const handler = tagOperation(loggerMock, directoryMock, eventServiceMock, repositoryMock);
const handler = tagOperation(apiId, loggerMock, directoryMock, eventServiceMock, repositoryMock);
await handler(req as unknown as Request, res as unknown as Response, next);

expect(res.send).not.toHaveBeenCalled();
Expand All @@ -404,7 +406,7 @@ describe('resource', () => {
const res = { send: jest.fn() };
const next = jest.fn();

const handler = tagOperation(loggerMock, directoryMock, eventServiceMock, repositoryMock);
const handler = tagOperation(apiId, loggerMock, directoryMock, eventServiceMock, repositoryMock);
await handler(req as unknown as Request, res as unknown as Response, next);

expect(res.send).not.toHaveBeenCalled();
Expand All @@ -429,7 +431,7 @@ describe('resource', () => {
const res = { send: jest.fn() };
const next = jest.fn();

const handler = tagOperation(loggerMock, directoryMock, eventServiceMock, repositoryMock);
const handler = tagOperation(apiId, loggerMock, directoryMock, eventServiceMock, repositoryMock);
await handler(req as unknown as Request, res as unknown as Response, next);

expect(res.send).not.toHaveBeenCalled();
Expand All @@ -454,7 +456,7 @@ describe('resource', () => {
const res = { send: jest.fn() };
const next = jest.fn();

const handler = tagOperation(loggerMock, directoryMock, eventServiceMock, repositoryMock);
const handler = tagOperation(apiId, loggerMock, directoryMock, eventServiceMock, repositoryMock);
await handler(req as unknown as Request, res as unknown as Response, next);

expect(res.send).not.toHaveBeenCalled();
Expand All @@ -481,7 +483,7 @@ describe('resource', () => {

directoryMock.getResourceUrl.mockResolvedValueOnce(null);

const handler = tagOperation(loggerMock, directoryMock, eventServiceMock, repositoryMock);
const handler = tagOperation(apiId, loggerMock, directoryMock, eventServiceMock, repositoryMock);
await handler(req as unknown as Request, res as unknown as Response, next);

expect(res.send).not.toHaveBeenCalled();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,19 @@ components:
Tag:
type: object
properties:
urn:
type: string
label:
type: string
value:
type: string
_links:
type: object
additionalProperties:
type: object
properties:
href:
type: string
Resource:
type: object
properties:
Expand Down
Loading

0 comments on commit 09a399e

Please sign in to comment.