Skip to content

Commit de87271

Browse files
authored
Merge pull request #58 from TraceX-Project/develop
Develop
2 parents 09d407c + 75735a2 commit de87271

12 files changed

Lines changed: 334 additions & 22 deletions

File tree

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
"@nestjs/platform-express": "^11.0.1",
3333
"@nestjs/schedule": "^6.1.0",
3434
"@nestjs/swagger": "^11.2.0",
35+
"@resvg/resvg-js": "^2.6.2",
3536
"axios": "^1.12.1",
3637
"class-transformer": "^0.5.1",
3738
"class-validator": "^0.14.2",

pnpm-lock.yaml

Lines changed: 134 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/modules/device-templates/device-templates.service.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export class DeviceTemplatesService {
2727
frontPanel: Express.Multer.File,
2828
createDeviceTemplateDto: CreateDeviceTemplateDto,
2929
) {
30-
console.log("createDeviceTemplateWithPorts called with DTO:", createDeviceTemplateDto);
30+
console.log('createDeviceTemplateWithPorts called with DTO:', createDeviceTemplateDto);
3131
const modelNameExistsForVendor = await this.deviceTemplatesRepository.findByModelNameAndVendor(
3232
createDeviceTemplateDto.modelName,
3333
createDeviceTemplateDto.vendor,
@@ -79,7 +79,7 @@ export class DeviceTemplatesService {
7979
throw new BadRequestException(`Missing bounding box for port number ${portNumber}`);
8080
}
8181
return {
82-
name: `${portType}${prefix}${prefix&&'/'}${idx + runningNumber}`,
82+
name: `${portType}${prefix}${prefix && '/'}${idx + runningNumber}`,
8383
x: boundingBox.x,
8484
y: boundingBox.y,
8585
width: boundingBox.width,

src/modules/devices/devices.repository.ts

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,6 @@ export class DevicesRepository {
119119
},
120120
})
121121
.prepare('find_device_by_id');
122-
123122
}
124123

125124
async createDeviceStack(newStack: NewDeviceStack): Promise<DeviceStack> {
@@ -137,13 +136,9 @@ export class DevicesRepository {
137136

138137
async findPhysicalDevicesByProjectId(projectId: string, inRack?: boolean) {
139138
const inRackCondition =
140-
inRack === undefined
141-
? undefined
142-
: sql`(${devices.rackId} IS NOT NULL) = ${inRack}`;
139+
inRack === undefined ? undefined : sql`(${devices.rackId} IS NOT NULL) = ${inRack}`;
143140
const inRackServerCondition =
144-
inRack === undefined
145-
? undefined
146-
: sql`(${servers.rackId} IS NOT NULL) = ${inRack}`;
141+
inRack === undefined ? undefined : sql`(${servers.rackId} IS NOT NULL) = ${inRack}`;
147142

148143
const devicesQuery = this.buildBaseDevicesQuery().where(
149144
and(eq(devices.projectId, projectId), inRackCondition),
@@ -152,9 +147,7 @@ export class DevicesRepository {
152147
and(eq(servers.projectId, projectId), inRackServerCondition),
153148
);
154149

155-
return this.db
156-
.select()
157-
.from(unionAll(devicesQuery, serversQuery).as('combined_devices'));
150+
return this.db.select().from(unionAll(devicesQuery, serversQuery).as('combined_devices'));
158151
}
159152

160153
async findPhysicalDevicesByIdsAndProjectId(
@@ -170,7 +163,9 @@ export class DevicesRepository {
170163

171164
return this.db
172165
.select()
173-
.from(unionAll(devicesQuery, serversQuery).as('combined_devices_by_ids')) as unknown as Promise<DeviceWithRelations[]>;
166+
.from(
167+
unionAll(devicesQuery, serversQuery).as('combined_devices_by_ids'),
168+
) as unknown as Promise<DeviceWithRelations[]>;
174169
}
175170

176171
private buildBaseDevicesQuery() {

src/modules/document/document.service.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { DeviceDocumentData, DocumentFormat } from './generators/types';
33
import { PdfGenerator } from './generators/pdf.generator';
44
import { DocxGenerator } from './generators/docx.generate';
55
import { Project } from '@/shared/types/drizzle';
6+
import { TopologyNode } from '@/shared/types/topology';
7+
import { generateTopologyPng } from './generators/topology-image.generator';
68
@Injectable()
79
export class DocumentService {
810
constructor() {}
@@ -18,10 +20,21 @@ export class DocumentService {
1820
}
1921
}
2022

21-
async generateDocument(format: DocumentFormat, project: Project, devices: DeviceDocumentData[]) {
23+
async generateDocument(
24+
format: DocumentFormat,
25+
project: Project,
26+
devices: DeviceDocumentData[],
27+
topology?: { nodes: TopologyNode[]; edges: { source: string; target: string }[] },
28+
) {
2229
const generator = this.getGenerator(format);
2330

24-
const buffer = await generator.generate({ devices });
31+
let topologyImage: string | null = null;
32+
if (topology) {
33+
const pngBuffer = await generateTopologyPng(topology.nodes, topology.edges);
34+
topologyImage = pngBuffer.toString('base64');
35+
}
36+
37+
const buffer = await generator.generate({ devices, topologyImage });
2538

2639
const mimeType =
2740
format === DocumentFormat.PDF

0 commit comments

Comments
 (0)