Skip to content

Commit 342b54e

Browse files
committed
CCM-10422: merge
1 parent 57a485a commit 342b54e

File tree

13 files changed

+30
-251
lines changed

13 files changed

+30
-251
lines changed

lambdas/backend-api/src/__tests__/templates/api/process-proof.test.ts

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -77,46 +77,3 @@ test.each([
7777
);
7878
}
7979
);
80-
81-
test('sets virus scan status for a user-owned template', async () => {
82-
const templateRepository = mockDeep<TemplateRepository>({
83-
getOwner: jest.fn().mockReturnValue('user-template-owner'),
84-
});
85-
const letterFileRepository = mockDeep<LetterFileRepository>();
86-
87-
const handler = createHandler({
88-
templateRepository,
89-
letterFileRepository,
90-
logger: mockDeep<Logger>(),
91-
});
92-
93-
await handler({
94-
detail: {
95-
s3ObjectDetails: {
96-
objectKey: 'proofs/supplier/template-id/proof.pdf',
97-
versionId: 'version-id',
98-
},
99-
scanResultDetails: { scanResultStatus: 'NO_THREATS_FOUND' },
100-
},
101-
});
102-
103-
expect(templateRepository.getOwner).toHaveBeenCalledWith('template-id');
104-
105-
expect(
106-
letterFileRepository.copyFromQuarantineToInternal
107-
).toHaveBeenCalledWith(
108-
'proofs/supplier/template-id/proof.pdf',
109-
'version-id',
110-
'proofs/user-template-owner/template-id/proof.pdf'
111-
);
112-
113-
expect(
114-
templateRepository.setLetterFileVirusScanStatusForProof
115-
).toHaveBeenCalledWith(
116-
'user-template-owner',
117-
'template-id',
118-
'proof.pdf',
119-
'PASSED',
120-
'supplier'
121-
);
122-
});

lambdas/backend-api/src/__tests__/templates/domain/template-pdf.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ test('has the given key attributes', () => {
1111
);
1212

1313
expect(pdf.templateId).toBe('template-id');
14-
expect(pdf.userOrClientId).toBe('template-owner');
14+
expect(pdf.owner).toBe('template-owner');
1515
});
1616

1717
test('parse with no custom personalisation', async () => {

lambdas/backend-api/src/__tests__/templates/infra/letter-upload-repository.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ describe('LetterUploadRepository', () => {
242242
)
243243
).toEqual({
244244
'file-type': 'pdf-template',
245-
'user-or-client-id': 'owner-id',
245+
owner: 'owner-id',
246246
'template-id': 'template-id',
247247
'version-id': 'version-id',
248248
});
@@ -255,7 +255,7 @@ describe('LetterUploadRepository', () => {
255255
)
256256
).toEqual({
257257
'file-type': 'test-data',
258-
'user-or-client-id': 'owner-id',
258+
owner: 'owner-id',
259259
'template-id': 'template-id',
260260
'version-id': 'version-id',
261261
});

lambdas/backend-api/src/__tests__/templates/infra/template-repository.test.ts

Lines changed: 8 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -2089,69 +2089,12 @@ describe('templateRepository', () => {
20892089
it('updates status to WAITING_FOR_PROOF', async () => {
20902090
const { templateRepository, mocks } = setup();
20912091

2092-
mocks.ddbDocClient
2093-
.on(QueryCommand)
2094-
.resolvesOnce({
2095-
Items: [{ id: 'template-id', owner: clientOwner }],
2096-
})
2097-
.on(UpdateCommand)
2098-
.resolvesOnce({
2099-
Attributes: {
2100-
// complete template
2101-
id: 'template-id',
2102-
},
2103-
});
2104-
2105-
const result = await templateRepository.proofRequestUpdate(
2106-
'template-id',
2107-
user
2108-
);
2109-
2110-
expect(result).toEqual({ data: { id: 'template-id' } });
2111-
2112-
expect(mocks.ddbDocClient).toHaveReceivedCommandWith(UpdateCommand, {
2113-
ConditionExpression:
2114-
'#templateStatus = :condition_1_templateStatus AND #templateType = :condition_2_templateType AND #clientId = :condition_3_clientId AND attribute_exists (#id) AND #proofingEnabled = :condition_5_proofingEnabled',
2115-
ExpressionAttributeNames: {
2116-
'#id': 'id',
2117-
'#clientId': 'clientId',
2118-
'#templateStatus': 'templateStatus',
2119-
'#templateType': 'templateType',
2120-
'#updatedAt': 'updatedAt',
2121-
'#proofingEnabled': 'proofingEnabled',
2122-
},
2123-
ExpressionAttributeValues: {
2124-
':condition_1_templateStatus': 'PENDING_PROOF_REQUEST',
2125-
':condition_2_templateType': 'LETTER',
2126-
':condition_3_clientId': clientId,
2127-
':condition_5_proofingEnabled': true,
2128-
':templateStatus': 'WAITING_FOR_PROOF',
2129-
':updatedAt': '2024-12-27T00:00:00.000Z',
2092+
mocks.ddbDocClient.on(UpdateCommand).resolvesOnce({
2093+
Attributes: {
2094+
// complete template
2095+
id: 'template-id',
21302096
},
2131-
Key: { id: 'template-id', owner: ownerWithClientPrefix },
2132-
ReturnValues: 'ALL_NEW',
2133-
ReturnValuesOnConditionCheckFailure: 'ALL_OLD',
2134-
TableName: 'templates',
2135-
UpdateExpression:
2136-
'SET #templateStatus = :templateStatus, #updatedAt = :updatedAt',
21372097
});
2138-
});
2139-
2140-
it('updates status to WAITING_FOR_PROOF when template is user-owned', async () => {
2141-
const { templateRepository, mocks } = setup();
2142-
2143-
mocks.ddbDocClient
2144-
.on(QueryCommand)
2145-
.resolvesOnce({
2146-
Items: [{ id: 'template-id', owner: userId }],
2147-
})
2148-
.on(UpdateCommand)
2149-
.resolvesOnce({
2150-
Attributes: {
2151-
// complete template
2152-
id: 'template-id',
2153-
},
2154-
});
21552098

21562099
const result = await templateRepository.proofRequestUpdate(
21572100
'template-id',
@@ -2179,7 +2122,7 @@ describe('templateRepository', () => {
21792122
':templateStatus': 'WAITING_FOR_PROOF',
21802123
':updatedAt': '2024-12-27T00:00:00.000Z',
21812124
},
2182-
Key: { id: 'template-id', owner: userId },
2125+
Key: { id: 'template-id', owner: ownerWithClientPrefix },
21832126
ReturnValues: 'ALL_NEW',
21842127
ReturnValuesOnConditionCheckFailure: 'ALL_OLD',
21852128
TableName: 'templates',
@@ -2188,28 +2131,6 @@ describe('templateRepository', () => {
21882131
});
21892132
});
21902133

2191-
test('returns 404 response when GSI query cannot find owned template', async () => {
2192-
const { templateRepository, mocks } = setup();
2193-
2194-
mocks.ddbDocClient.on(QueryCommand).resolves({
2195-
Items: [{ id: templateId, owner: 'someone-else' }],
2196-
});
2197-
2198-
const response = await templateRepository.proofRequestUpdate(
2199-
'template-id',
2200-
user
2201-
);
2202-
2203-
expect(response).toEqual({
2204-
error: {
2205-
errorMeta: {
2206-
code: 404,
2207-
description: 'Template not found',
2208-
},
2209-
},
2210-
});
2211-
});
2212-
22132134
it('returns 404 error response when conditional check fails due to template not existing', async () => {
22142135
const { templateRepository, mocks } = setup();
22152136

@@ -2218,13 +2139,7 @@ describe('templateRepository', () => {
22182139
$metadata: {},
22192140
});
22202141

2221-
mocks.ddbDocClient
2222-
.on(QueryCommand)
2223-
.resolvesOnce({
2224-
Items: [{ id: 'template-id', owner: clientOwner }],
2225-
})
2226-
.on(UpdateCommand)
2227-
.rejectsOnce(err);
2142+
mocks.ddbDocClient.on(UpdateCommand).rejectsOnce(err);
22282143

22292144
const result = await templateRepository.proofRequestUpdate(
22302145
'template-id',
@@ -2253,13 +2168,7 @@ describe('templateRepository', () => {
22532168
},
22542169
});
22552170

2256-
mocks.ddbDocClient
2257-
.on(QueryCommand)
2258-
.resolvesOnce({
2259-
Items: [{ id: 'template-id', owner: clientOwner }],
2260-
})
2261-
.on(UpdateCommand)
2262-
.rejectsOnce(err);
2171+
mocks.ddbDocClient.on(UpdateCommand).rejectsOnce(err);
22632172

22642173
const result = await templateRepository.proofRequestUpdate(
22652174
'template-id',
@@ -2282,13 +2191,7 @@ describe('templateRepository', () => {
22822191

22832192
const err = new Error('!');
22842193

2285-
mocks.ddbDocClient
2286-
.on(QueryCommand)
2287-
.resolvesOnce({
2288-
Items: [{ id: 'template-id', owner: clientOwner }],
2289-
})
2290-
.on(UpdateCommand)
2291-
.rejectsOnce(err);
2194+
mocks.ddbDocClient.on(UpdateCommand).rejectsOnce(err);
22922195

22932196
const result = await templateRepository.proofRequestUpdate(
22942197
'template-id',

lambdas/backend-api/src/templates/api/process-proof.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,8 @@ export const createHandler =
2929

3030
const { owner } = await templateRepository.getOwner(templateId);
3131

32-
const ownerS3Segment = owner.startsWith(clientOwnerPrefix)
33-
? owner.slice(clientOwnerPrefix.length)
34-
: owner;
35-
3632
const internalKey = LetterProofRepository.getInternalKey(
37-
ownerS3Segment,
33+
owner,
3834
templateId,
3935
fileName
4036
);
@@ -43,7 +39,7 @@ export const createHandler =
4339

4440
if (virusScanResult === 'PASSED') {
4541
const downloadKey = LetterProofRepository.getDownloadKey(
46-
ownerS3Segment,
42+
owner,
4743
templateId,
4844
fileName
4945
);

lambdas/backend-api/src/templates/api/set-letter-upload-virus-scan-status.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export const createHandler =
2323
'file-type': fileType,
2424
'version-id': versionId,
2525
'template-id': templateId,
26-
'user-or-client-id': userOrClientId,
26+
owner,
2727
} = LetterUploadRepository.parseKey(objectKey);
2828

2929
const virusScanResult =

lambdas/backend-api/src/templates/api/validate-letter-template-files.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export class ValidateLetterTemplateFilesLambda {
5757

5858
const {
5959
'template-id': templateId,
60-
'user-or-client-id': userOrClientId,
60+
owner,
6161
'version-id': versionId,
6262
} = metadata;
6363

@@ -69,8 +69,8 @@ export class ValidateLetterTemplateFilesLambda {
6969
is complete, we will know unambiguously that it's a clientId and this
7070
doubly attempted fetch won't be required
7171
*/
72-
userId: userOrClientId,
73-
clientId: userOrClientId,
72+
userId: owner,
73+
clientId: owner,
7474
});
7575

7676
if (getTemplateError) {

lambdas/backend-api/src/templates/domain/validate-letter-template-files.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ export function validateLetterTemplateFiles(
4848

4949
logger.info('Template file validation complete', {
5050
templateId: pdf.templateId,
51-
userOrClientId: pdf.userOrClientId,
51+
owner: pdf.owner,
5252
valid,
5353
failedTests,
5454
});

lambdas/backend-api/src/templates/infra/letter-upload-repository.ts

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { LetterFileRepository } from './letter-file-repository';
1111

1212
export type LetterUploadMetadata = {
1313
'file-type': FileType;
14-
'user-or-client-id': string;
14+
owner: string;
1515
'template-id': string;
1616
'version-id': string;
1717
};
@@ -24,7 +24,7 @@ const $FileType: z.ZodType<FileType> = z.enum([
2424

2525
const $LetterUploadMetadata: z.ZodType<LetterUploadMetadata> = z.object({
2626
'file-type': $FileType,
27-
'user-or-client-id': z.string(),
27+
owner: z.string(),
2828
'template-id': z.string(),
2929
'version-id': z.string(),
3030
});
@@ -49,7 +49,7 @@ export class LetterUploadRepository extends LetterFileRepository {
4949
Body: await pdf.bytes(),
5050
ChecksumAlgorithm: 'SHA256',
5151
Metadata: LetterUploadRepository.metadata(
52-
userOrClientId,
52+
owner,
5353
templateId,
5454
versionId,
5555
'pdf-template'
@@ -58,12 +58,7 @@ export class LetterUploadRepository extends LetterFileRepository {
5858
];
5959

6060
if (csv) {
61-
const csvKey = this.key(
62-
'test-data',
63-
userOrClientId,
64-
templateId,
65-
versionId
66-
);
61+
const csvKey = this.key('test-data', owner, templateId, versionId);
6762

6863
commands.push(
6964
new PutObjectCommand({
@@ -72,7 +67,7 @@ export class LetterUploadRepository extends LetterFileRepository {
7267
Body: await csv.bytes(),
7368
ChecksumAlgorithm: 'SHA256',
7469
Metadata: LetterUploadRepository.metadata(
75-
userOrClientId,
70+
owner,
7671
templateId,
7772
versionId,
7873
'test-data'
@@ -119,7 +114,7 @@ export class LetterUploadRepository extends LetterFileRepository {
119114

120115
static parseKey(key: string): LetterUploadMetadata {
121116
const keyParts = key.split('/');
122-
const [type, userOrClientId, templateId, filename = ''] = keyParts;
117+
const [type, owner, templateId, filename = ''] = keyParts;
123118
const filenameParts = filename.split('.');
124119
const [versionId, extension] = filenameParts;
125120

@@ -128,7 +123,7 @@ export class LetterUploadRepository extends LetterFileRepository {
128123
}
129124

130125
const parsed = LetterUploadRepository.metadata(
131-
userOrClientId,
126+
owner,
132127
templateId,
133128
versionId,
134129
type
@@ -146,21 +141,21 @@ export class LetterUploadRepository extends LetterFileRepository {
146141

147142
private key(
148143
type: FileType,
149-
userOrClientId: string,
144+
owner: string,
150145
templateId: string,
151146
versionId: string
152147
) {
153-
return `${type}/${userOrClientId}/${templateId}/${versionId}.${type === 'pdf-template' ? 'pdf' : 'csv'}`;
148+
return `${type}/${owner}/${templateId}/${versionId}.${type === 'pdf-template' ? 'pdf' : 'csv'}`;
154149
}
155150

156151
private static metadata(
157-
userOrClientId: string,
152+
owner: string,
158153
templateId: string,
159154
versionId: string,
160155
type: string
161156
): LetterUploadMetadata {
162157
return $LetterUploadMetadata.parse({
163-
'user-or-client-id': userOrClientId,
158+
owner,
164159
'file-type': type,
165160
'template-id': templateId,
166161
'version-id': versionId,

lambdas/sftp-letters/src/__tests__/app/request-proof.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ describe('App', () => {
234234

235235
expect(mocks.templateRepository.acquireLock).toHaveBeenCalledTimes(1);
236236
expect(mocks.templateRepository.acquireLock).toHaveBeenCalledWith(
237-
`CLIENT#${clientId}`,
237+
clientId,
238238
templateId
239239
);
240240

0 commit comments

Comments
 (0)