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

N21-1626 ctl data sheet #4717

Merged
merged 80 commits into from
Feb 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
bf8d376
WIP getDatasheet endpoint
IgorCapCoder Jan 18, 2024
5690f1f
get datasheetData and mapping
IgorCapCoder Jan 22, 2024
b8ac772
adjust to clarified requirements
IgorCapCoder Jan 23, 2024
4ec3119
date format
IgorCapCoder Jan 23, 2024
c741ec4
refactoring
IgorCapCoder Jan 23, 2024
a22eca2
refactoring
IgorCapCoder Jan 23, 2024
f0b8a35
Merge remote-tracking branch 'origin/N21-1626-ctl-data-sheet' into N2…
IgorCapCoder Jan 23, 2024
85ddd38
Merge branch 'main' into N21-1626-ctl-data-sheet
IgorCapCoder Jan 23, 2024
3d03e03
mini temp fix
IgorCapCoder Jan 23, 2024
f4138f5
make properties a string
IgorCapCoder Jan 24, 2024
e1e7584
Merge branch 'main' into N21-1626-ctl-data-sheet
IgorCapCoder Jan 24, 2024
5e74d3f
renaming mustacheTemplate specific files
IgorCapCoder Jan 24, 2024
1aa3af7
add pdfModule
MBergCap Jan 24, 2024
8f43af7
add mustache template
MBergCap Jan 24, 2024
a55af87
add pdfService
MBergCap Jan 24, 2024
f08b45f
N21-1626 make it work
arnegns Jan 24, 2024
d473e22
N21-1626 change to not make it global
arnegns Jan 24, 2024
5046340
unit tests and test factory
IgorCapCoder Jan 24, 2024
5127c1d
adjust template
MBergCap Jan 24, 2024
66456e7
Merge remote-tracking branch 'origin/N21-1626-ctl-data-sheet' into N2…
IgorCapCoder Jan 25, 2024
0db4bb1
unit tests and test factory
IgorCapCoder Jan 25, 2024
1c70d0c
Merge remote-tracking branch 'origin/N21-1626-ctl-data-sheet' into N2…
IgorCapCoder Jan 25, 2024
b97c878
uc and service unit tests
IgorCapCoder Jan 25, 2024
d6c6b9c
adjust template
MBergCap Jan 25, 2024
0b0e4b3
Merge remote-tracking branch 'origin/N21-1626-ctl-data-sheet' into N2…
MBergCap Jan 25, 2024
c1ca657
add location to mapper and factories, fix tests, api test
IgorCapCoder Jan 25, 2024
0afb978
Merge remote-tracking branch 'origin/N21-1626-ctl-data-sheet' into N2…
IgorCapCoder Jan 25, 2024
bfd075c
adjust filename and tests
IgorCapCoder Jan 25, 2024
df29b2f
Merge branch 'main' into N21-1626-ctl-data-sheet
IgorCapCoder Jan 25, 2024
19ecd57
adjust template and text
MBergCap Jan 25, 2024
5f6b51c
fix lint and tests
IgorCapCoder Jan 25, 2024
9bfe211
Merge remote-tracking branch 'origin/N21-1626-ctl-data-sheet' into N2…
IgorCapCoder Jan 25, 2024
baef7f7
fix tests
IgorCapCoder Jan 26, 2024
82316fe
Merge branch 'main' into N21-1626-ctl-data-sheet
IgorCapCoder Jan 26, 2024
544a204
coverage up, requested changes 1
IgorCapCoder Jan 26, 2024
e068f47
requested changes 2
IgorCapCoder Jan 26, 2024
fbaeea7
Merge branch 'main' into N21-1626-ctl-data-sheet
arnegns Jan 26, 2024
5718a82
N21-1626 test
arnegns Jan 26, 2024
2a93b2b
N21-1626 test 2
arnegns Jan 26, 2024
9e38adf
Merge branch 'main' into N21-1626-ctl-data-sheet
arnegns Jan 26, 2024
69de58d
N21-1626 test puppeteer
arnegns Jan 26, 2024
3faf5c8
N21-1626 test puppeteer
arnegns Jan 26, 2024
180b6ff
N21-1626 test puppeteer 2
arnegns Jan 26, 2024
0288d02
coverage up, requested changes 3
IgorCapCoder Jan 26, 2024
811ef80
N21-1626 test puppeteer 3
arnegns Jan 26, 2024
5acca3d
Merge remote-tracking branch 'origin/N21-1626-ctl-data-sheet' into N2…
IgorCapCoder Jan 26, 2024
1cba719
merge
IgorCapCoder Jan 26, 2024
8356360
Merge remote-tracking branch 'origin/N21-1626-ctl-data-sheet' into N2…
IgorCapCoder Jan 26, 2024
3b313d0
N21-1626 test puppeteer 4
arnegns Jan 29, 2024
dd4c981
N21-1626 test puppeteer 5
arnegns Jan 29, 2024
dbbfd2a
N21-1626 fix tests and test puppeteer 5
arnegns Jan 29, 2024
2ab3366
Merge branch 'main' into N21-1626-ctl-data-sheet
arnegns Jan 29, 2024
50bf3fb
N21-1626 puppeteer 6
arnegns Jan 29, 2024
ce5bc6f
N21-1626 puppeteer 7
arnegns Jan 29, 2024
0fe2163
N21-1626 puppeteer 8
arnegns Jan 29, 2024
181df56
use fishery factory
IgorCapCoder Jan 29, 2024
9ada768
N21-1626 removes puppeteer and ands pdfkit
arnegns Jan 29, 2024
bac6fc2
N21-1626 pdf service adjustment
arnegns Jan 29, 2024
ba1da41
fix lint
IgorCapCoder Jan 29, 2024
b2db655
Merge remote-tracking branch 'origin/N21-1626-ctl-data-sheet' into N2…
IgorCapCoder Jan 29, 2024
cd82c26
N21-1626 wip
arnegns Jan 29, 2024
804b4ca
Merge branch 'main' into N21-1626-ctl-data-sheet
arnegns Jan 29, 2024
8ad2140
N21-1626 wip
arnegns Jan 29, 2024
976beaa
Merge branch 'main' into N21-1626-ctl-data-sheet
arnegns Jan 29, 2024
24f97d6
N21-1626 wip
arnegns Jan 29, 2024
bdd9273
N21-1626 wip 2
arnegns Jan 29, 2024
4579a21
add info to pdf
IgorCapCoder Jan 30, 2024
a328d57
style pdf and adjust tests
IgorCapCoder Jan 31, 2024
3afe0dd
Merge branch 'main' into N21-1626-ctl-data-sheet
IgorCapCoder Jan 31, 2024
23653a9
unit test, requested changes
IgorCapCoder Jan 31, 2024
81e3732
fix wip 1
IgorCapCoder Jan 31, 2024
8ef0a03
fix lint
IgorCapCoder Feb 1, 2024
5d1388b
fix test
IgorCapCoder Feb 1, 2024
ad38712
requested changes
IgorCapCoder Feb 1, 2024
a58d25d
Merge branch 'main' into N21-1626-ctl-data-sheet
IgorCapCoder Feb 1, 2024
f9e5023
fix lint and tests
IgorCapCoder Feb 1, 2024
9fa59d3
coverage up wip 1
IgorCapCoder Feb 1, 2024
30da32d
N21-1626 fix test
arnegns Feb 2, 2024
0e6a932
N21-1626 fix test 2
arnegns Feb 2, 2024
02d8e80
Merge branch 'main' into N21-1626-ctl-data-sheet
IgorCapCoder Feb 2, 2024
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
Original file line number Diff line number Diff line change
Expand Up @@ -723,4 +723,81 @@ describe('ToolController (API)', () => {
});
});
});

describe('[GET] tools/external-tools/:externalToolId/datasheet', () => {
describe('when user is not authenticated', () => {
const setup = () => {
const toolId: string = new ObjectId().toHexString();

return { toolId };
};

it('should return unauthorized', async () => {
const { toolId } = setup();

const response: Response = await testApiClient.get(`${toolId}/datasheet`);

expect(response.statusCode).toEqual(HttpStatus.UNAUTHORIZED);
});
});

describe('when externalToolId is given', () => {
const setup = async () => {
const toolId: string = new ObjectId().toHexString();
const externalToolEntity: ExternalToolEntity = externalToolEntityFactory.buildWithId(undefined, toolId);

const { adminUser, adminAccount } = UserAndAccountTestFactory.buildAdmin({}, [Permission.TOOL_ADMIN]);
await em.persistAndFlush([adminAccount, adminUser, externalToolEntity]);
em.clear();

const loggedInClient: TestApiClient = await testApiClient.login(adminAccount);

// this date will only have a daily precision, which should not impact successful tests
const date = new Date();
const year = date.getFullYear();
const month = date.getMonth() + 1;
const day = date.getDate();
const dateString = `${year}-${month}-${day}`;

return { loggedInClient, externalToolEntity, dateString };
};

it('should return the datasheet of the externalTool', async () => {
const { loggedInClient, externalToolEntity, dateString } = await setup();

const response: Response = await loggedInClient.get(`${externalToolEntity.id}/datasheet`);

expect(response.statusCode).toEqual(HttpStatus.OK);
expect(response.header).toEqual(
expect.objectContaining({
'content-type': 'application/pdf',
'content-disposition': `inline; filename=CTL-Datenblatt-${externalToolEntity.name}-${dateString}`,
})
);
expect(response.body).toEqual(expect.any(Buffer));
});
});

describe('when external tool cannot be found', () => {
const setup = async () => {
const toolId: string = new ObjectId().toHexString();

const { adminUser, adminAccount } = UserAndAccountTestFactory.buildAdmin({}, [Permission.TOOL_ADMIN]);
await em.persistAndFlush([adminAccount, adminUser]);
em.clear();

const loggedInClient: TestApiClient = await testApiClient.login(adminAccount);

return { loggedInClient, toolId };
};

it('should return a not found exception', async () => {
const { loggedInClient, toolId } = await setup();

const response: Response = await loggedInClient.get(`${toolId}/datasheet`);

expect(response.statusCode).toEqual(HttpStatus.NOT_FOUND);
});
});
});
});
Original file line number Diff line number Diff line change
@@ -1,9 +1,22 @@
import { Authenticate, CurrentUser, ICurrentUser } from '@modules/authentication';
import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Post, Query, Res } from '@nestjs/common';
import {
Body,
Controller,
Delete,
Get,
HttpCode,
HttpStatus,
Param,
Post,
Query,
Res,
StreamableFile,
} from '@nestjs/common';
import {
ApiCreatedResponse,
ApiForbiddenResponse,
ApiFoundResponse,
ApiNotFoundResponse,
ApiOkResponse,
ApiOperation,
ApiResponse,
Expand Down Expand Up @@ -190,4 +203,24 @@ export class ToolController {

return mapped;
}

@Get(':externalToolId/datasheet')
@ApiOperation({ summary: 'Returns a pdf of the external tool information' })
@ApiUnauthorizedResponse({ description: 'User is not logged in.' })
@ApiNotFoundResponse({ description: 'The external tool has not been found' })
async getDatasheet(
@CurrentUser() currentUser: ICurrentUser,
@Param() params: ExternalToolIdParams,
@Res({ passthrough: true }) res: Response
): Promise<StreamableFile> {
const datasheetBuffer: Buffer = await this.externalToolUc.getDatasheet(currentUser.userId, params.externalToolId);

const myFilename = await this.externalToolUc.createDatasheetFilename(params.externalToolId);

res.setHeader('Content-Type', 'application/pdf');
res.setHeader('Content-Disposition', `inline; filename=${myFilename}`);

const streamableFile: StreamableFile = new StreamableFile(datasheetBuffer);
return streamableFile;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import { ExternalToolParameterDatasheetTemplateData } from './external-tool-parameter-datasheet-template-data';

export class ExternalToolDatasheetTemplateData {
createdAt: string;

creatorName: string;

instance: string;

toolName: string;

toolUrl: string;

isDeactivated?: string;

restrictToContexts?: string;

toolType: string;

skipConsent?: string;

messageType?: string;

privacy?: string;

parameters?: ExternalToolParameterDatasheetTemplateData[];

constructor(externalToolData: ExternalToolDatasheetTemplateData) {
this.createdAt = externalToolData.createdAt;
this.creatorName = externalToolData.creatorName;
this.instance = externalToolData.instance;
this.toolName = externalToolData.toolName;
this.toolUrl = externalToolData.toolUrl;
this.isDeactivated = externalToolData.isDeactivated;
this.restrictToContexts = externalToolData.restrictToContexts;
this.toolType = externalToolData.toolType;
this.skipConsent = externalToolData.skipConsent;
this.messageType = externalToolData.messageType;
this.privacy = externalToolData.privacy;
this.parameters = externalToolData.parameters;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { CustomParameterLocation } from '../../../common/enum';

export class ExternalToolParameterDatasheetTemplateData {
name: string;

properties: string;

scope: string;

type: string;

location: CustomParameterLocation;

constructor(parameterData: ExternalToolParameterDatasheetTemplateData) {
this.name = parameterData.name;
this.properties = parameterData.properties;
this.scope = parameterData.scope;
this.type = parameterData.type;
this.location = parameterData.location;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
export enum ExternalToolParameterDatasheetTemplateProperty {
HIDDEN = 'versteckt',
DEACTIVATED = 'deaktiviert',
OPTIONAL = 'optional',
PROTECTED = 'geschützt',
SKIP_CONSENT = 'Zustimmung überspringen',
MANDATORY = 'Pflicht',
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export { ExternalToolDatasheetTemplateData } from './external-tool-datasheet-template-data';
export { ExternalToolParameterDatasheetTemplateData } from './external-tool-parameter-datasheet-template-data';
export { ExternalToolParameterDatasheetTemplateProperty } from './external-tool-parameter-datasheet-template-property';
5 changes: 5 additions & 0 deletions apps/server/src/modules/tool/external-tool/domain/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
export * from './external-tool.do';
export * from './config';
export * from './external-tool-metadata';
export {
ExternalToolParameterDatasheetTemplateProperty,
ExternalToolDatasheetTemplateData,
ExternalToolParameterDatasheetTemplateData,
} from './datasheet';
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { ToolContextMapper } from '../common/mapper/tool-context.mapper';
import { ToolConfigModule } from '../tool-config.module';
import { ExternalToolMetadataMapper } from './mapper';
import {
DatasheetPdfService,
ExternalToolConfigurationService,
ExternalToolLogoService,
ExternalToolParameterValidationService,
Expand All @@ -31,13 +32,15 @@ import {
ExternalToolRepo,
ExternalToolMetadataMapper,
ToolContextMapper,
DatasheetPdfService,
],
exports: [
ExternalToolService,
ExternalToolValidationService,
ExternalToolVersionIncrementService,
ExternalToolConfigurationService,
ExternalToolLogoService,
DatasheetPdfService,
],
})
export class ExternalToolModule {}
Loading
Loading