From f1effcee27e29a0c381f4396c5e6d6959b79d24b Mon Sep 17 00:00:00 2001 From: SevenWaysDP <97111299+SevenWaysDP@users.noreply.github.com> Date: Fri, 27 Oct 2023 06:58:01 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20hpi-schu?= =?UTF-8?q?l-cloud/schulcloud-server@84c44c1bf99f92b16df1c32792b5670dbb2b4?= =?UTF-8?q?d72=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- classes/ErrorMapper.html | 4 +- classes/FileDto.html | 19 +- classes/FileRecordSecurityCheck.html | 19 +- classes/PreviewActionsLoggable.html | 316 + classes/PreviewBuilder.html | 408 ++ classes/PreviewGeneratorBuilder.html | 292 + classes/RpcMessageProducer.html | 559 ++ controllers/FilesStorageController.html | 64 +- coverage.html | 234 +- entities/FileRecord.html | 27 +- graph/dependencies.svg | 6004 ++++++++-------- injectables/FilesStorageConsumer.html | 36 +- injectables/FilesStorageProducer.html | 343 +- injectables/FilesStorageService.html | 58 +- injectables/FilesStorageUC.html | 51 +- injectables/PreviewGeneratorConsumer.html | 357 + injectables/PreviewGeneratorService.html | 584 ++ injectables/PreviewProducer.html | 645 ++ injectables/PreviewService.html | 453 +- interfaces/CopyFiles.html | 1 - interfaces/File.html | 40 - interfaces/GetFile.html | 1 - interfaces/GetFileResponse.html | 7 +- interfaces/IError.html | 6 +- interfaces/IFileRecordProperties.html | 7 + .../IFileRecordSecurityCheckProperties.html | 7 + interfaces/IFileStorageConfig.html | 8 +- interfaces/IParentInfo.html | 7 + interfaces/PreviewConfig.html | 266 + interfaces/PreviewFileOptions.html | 309 + interfaces/PreviewFileParams.html | 98 +- interfaces/PreviewModuleConfig.html | 266 + interfaces/PreviewOptions.html | 276 + interfaces/PreviewResponseMessage.html | 270 + interfaces/RpcMessage.html | 2 +- interfaces/S3Config-1.html | 1 - js/menu-wc.js | 62 +- js/menu-wc_es5.js | 2 +- js/search/search_index.js | 4 +- miscellaneous/enumerations.html | 26 + miscellaneous/functions.html | 167 + miscellaneous/variables.html | 66 +- modules.html | 49 + modules/AccountApiModule.html | 54 +- modules/AccountApiModule/dependencies.svg | 54 +- modules/AccountModule.html | 120 +- modules/AccountModule/dependencies.svg | 120 +- modules/AuthenticationModule.html | 160 +- modules/AuthenticationModule/dependencies.svg | 160 +- modules/AuthorizationReferenceModule.html | 8 +- .../dependencies.svg | 8 +- modules/CacheWrapperModule.html | 8 +- modules/CacheWrapperModule/dependencies.svg | 8 +- modules/ClassModule.html | 8 +- modules/ClassModule/dependencies.svg | 8 +- .../CollaborativeStorageAdapterModule.html | 8 +- .../dependencies.svg | 8 +- modules/CommonToolModule.html | 8 +- modules/CommonToolModule/dependencies.svg | 8 +- modules/ConsoleWriterModule.html | 8 +- modules/ConsoleWriterModule/dependencies.svg | 8 +- modules/ExternalToolModule.html | 152 +- modules/ExternalToolModule/dependencies.svg | 152 +- modules/FileSystemModule.html | 8 +- modules/FileSystemModule/dependencies.svg | 8 +- modules/FilesModule.html | 46 +- modules/FilesModule/dependencies.svg | 46 +- modules/FilesStorageAMQPModule.html | 46 +- .../FilesStorageAMQPModule/dependencies.svg | 46 +- modules/FilesStorageModule.html | 2 + modules/FwuLearningContentsModule.html | 70 +- .../dependencies.svg | 70 +- modules/GroupApiModule.html | 78 +- modules/GroupApiModule/dependencies.svg | 78 +- modules/H5PEditorModule.html | 46 +- modules/H5PEditorModule/dependencies.svg | 46 +- modules/KeycloakConfigurationModule.html | 112 +- .../dependencies.svg | 112 +- modules/KeycloakModule.html | 74 +- modules/KeycloakModule/dependencies.svg | 74 +- modules/LearnroomApiModule.html | 166 +- modules/LearnroomApiModule/dependencies.svg | 166 +- modules/LearnroomModule.html | 178 +- modules/LearnroomModule/dependencies.svg | 178 +- modules/LegacySchoolApiModule.html | 62 +- .../LegacySchoolApiModule/dependencies.svg | 62 +- modules/LegacySchoolModule.html | 8 +- modules/LegacySchoolModule/dependencies.svg | 8 +- modules/LessonApiModule.html | 38 +- modules/LessonApiModule/dependencies.svg | 38 +- modules/LessonModule.html | 8 +- modules/LessonModule/dependencies.svg | 8 +- modules/LoggerModule.html | 8 +- modules/LoggerModule/dependencies.svg | 8 +- modules/OauthApiModule.html | 102 +- modules/OauthApiModule/dependencies.svg | 102 +- modules/OauthModule.html | 136 +- modules/OauthModule/dependencies.svg | 136 +- modules/OauthProviderApiModule.html | 110 +- .../OauthProviderApiModule/dependencies.svg | 110 +- modules/OauthProviderModule.html | 112 +- modules/OauthProviderModule/dependencies.svg | 112 +- modules/PreviewGeneratorAMQPModule.html | 240 + .../dependencies.svg | 50 + modules/PreviewGeneratorConsumerModule.html | 269 + modules/PreviewGeneratorProducerModule.html | 309 + .../dependencies.svg | 94 + modules/ProvisioningModule.html | 128 +- modules/ProvisioningModule/dependencies.svg | 128 +- modules/PseudonymModule.html | 90 +- modules/PseudonymModule/dependencies.svg | 90 +- modules/RabbitMQWrapperModule.html | 6 +- modules/RabbitMQWrapperTestModule.html | 10 +- modules/SchoolExternalToolModule.html | 66 +- .../SchoolExternalToolModule/dependencies.svg | 66 +- modules/SharingApiModule.html | 78 +- modules/SharingApiModule/dependencies.svg | 78 +- modules/SharingModule.html | 98 +- modules/SharingModule/dependencies.svg | 98 +- modules/SystemModule.html | 64 +- modules/SystemModule/dependencies.svg | 64 +- modules/TaskApiModule.html | 86 +- modules/TaskApiModule/dependencies.svg | 86 +- modules/TaskModule.html | 112 +- modules/TaskModule/dependencies.svg | 112 +- modules/TeamsModule.html | 8 +- modules/TeamsModule/dependencies.svg | 8 +- modules/ToolModule.html | 104 +- modules/ToolModule/dependencies.svg | 104 +- modules/UserLoginMigrationModule.html | 144 +- .../UserLoginMigrationModule/dependencies.svg | 144 +- modules/VideoConferenceApiModule.html | 70 +- .../VideoConferenceApiModule/dependencies.svg | 70 +- modules/VideoConferenceModule.html | 140 +- .../VideoConferenceModule/dependencies.svg | 140 +- overview.html | 6012 +++++++++-------- 136 files changed, 15846 insertions(+), 9827 deletions(-) create mode 100644 classes/PreviewActionsLoggable.html create mode 100644 classes/PreviewBuilder.html create mode 100644 classes/PreviewGeneratorBuilder.html create mode 100644 classes/RpcMessageProducer.html create mode 100644 injectables/PreviewGeneratorConsumer.html create mode 100644 injectables/PreviewGeneratorService.html create mode 100644 injectables/PreviewProducer.html create mode 100644 interfaces/PreviewConfig.html create mode 100644 interfaces/PreviewFileOptions.html create mode 100644 interfaces/PreviewModuleConfig.html create mode 100644 interfaces/PreviewOptions.html create mode 100644 interfaces/PreviewResponseMessage.html create mode 100644 modules/PreviewGeneratorAMQPModule.html create mode 100644 modules/PreviewGeneratorAMQPModule/dependencies.svg create mode 100644 modules/PreviewGeneratorConsumerModule.html create mode 100644 modules/PreviewGeneratorProducerModule.html create mode 100644 modules/PreviewGeneratorProducerModule/dependencies.svg diff --git a/classes/ErrorMapper.html b/classes/ErrorMapper.html index b13b89ec808..47588d3ffab 100644 --- a/classes/ErrorMapper.html +++ b/classes/ErrorMapper.html @@ -68,7 +68,7 @@

File

- apps/server/src/modules/files-storage-client/mapper/error.mapper.ts + apps/server/src/shared/infra/rabbitmq/error.mapper.ts

@@ -135,7 +135,7 @@

Defined in apps/server/src/modules/files-storage-client/mapper/error.mapper.ts:6
+ class="link-to-prism">apps/server/src/shared/infra/rabbitmq/error.mapper.ts:6 diff --git a/classes/FileDto.html b/classes/FileDto.html index 829489fb13d..3585bf9f154 100644 --- a/classes/FileDto.html +++ b/classes/FileDto.html @@ -74,6 +74,12 @@

File

+

+

Implements

+

+

+ File +

@@ -121,7 +127,7 @@

Constructor

-
Defined in apps/server/src/modules/files-storage/dto/file.dto.ts:3
+
Defined in apps/server/src/modules/files-storage/dto/file.dto.ts:4
@@ -183,7 +189,7 @@

- + @@ -209,7 +215,7 @@

- + @@ -235,7 +241,7 @@

- + @@ -254,9 +260,10 @@

-
import { Readable } from 'stream';
+        
import { File } from '@shared/infra/s3-client';
+import { Readable } from 'stream';
 
-export class FileDto {
+export class FileDto implements File {
 	constructor(file: FileDto) {
 		this.name = file.name;
 		this.data = file.data;
diff --git a/classes/FileRecordSecurityCheck.html b/classes/FileRecordSecurityCheck.html
index 0c79b365782..2ac46cb99a3 100644
--- a/classes/FileRecordSecurityCheck.html
+++ b/classes/FileRecordSecurityCheck.html
@@ -133,7 +133,7 @@ 

Constructor

- + @@ -204,7 +204,7 @@

- + @@ -245,7 +245,7 @@

- + @@ -287,7 +287,7 @@

- + @@ -328,7 +328,7 @@

- + @@ -363,7 +363,7 @@

- + @@ -386,6 +386,7 @@

import { ObjectId } from '@mikro-orm/mongodb'; import { BadRequestException } from '@nestjs/common'; import { BaseEntityWithTimestamps, EntityId } from '@shared/domain'; +import path from 'path'; import { v4 as uuid } from 'uuid'; import { ErrorType } from '../error'; import { PreviewInputMimeTypes } from '../interface/preview-input-mime-types.enum'; @@ -677,6 +678,12 @@

return PreviewStatus.PREVIEW_NOT_POSSIBLE_SCAN_STATUS_ERROR; } + + public get fileNameWithoutExtension(): string { + const filenameObj = path.parse(this.name); + + return filenameObj.name; + } }

diff --git a/classes/PreviewActionsLoggable.html b/classes/PreviewActionsLoggable.html new file mode 100644 index 00000000000..f6931d2c584 --- /dev/null +++ b/classes/PreviewActionsLoggable.html @@ -0,0 +1,316 @@ + + + + + + schulcloud-server documentation + + + + + + + + + + + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + +
+
+

+

File

+

+

+ apps/server/src/shared/infra/preview-generator/loggable/preview-actions.loggable.ts +

+ + + + +

+

Implements

+

+

+ Loggable +

+ + +
+

Index

+ + + + + + + + + + + + + + + +
+
Methods
+
+ +
+
+ +
+

Constructor

+ + + + + + + + + + + + + +
+constructor(message: string, payload: PreviewFileOptions) +
+ +
+
+ Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeOptional
message + string + + No +
payload + PreviewFileOptions + + No +
+
+
+
+ + +
+ +

+ Methods +

+ + + + + + + + + + + + + + + + + + + +
+ + + getLogMessage + + +
+getLogMessage() +
+ +
+ +
+ Returns : LogMessage + +
+
+
+ + + + + +
+ + +
+
import { LogMessage, Loggable } from '@src/core/logger';
+import { PreviewFileOptions } from '../interface';
+
+export class PreviewActionsLoggable implements Loggable {
+	constructor(private readonly message: string, private readonly payload: PreviewFileOptions) {}
+
+	getLogMessage(): LogMessage {
+		const { originFilePath, previewFilePath, previewOptions } = this.payload;
+		return {
+			message: this.message,
+			data: {
+				originFilePath,
+				previewFilePath,
+				format: previewOptions.format,
+				width: previewOptions.width,
+			},
+		};
+	}
+}
+
+
+
+ + + + + + + + + +
+
+

results matching ""

+
    +
    +
    +

    No results matching ""

    +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/classes/PreviewBuilder.html b/classes/PreviewBuilder.html new file mode 100644 index 00000000000..b9335bd18a8 --- /dev/null +++ b/classes/PreviewBuilder.html @@ -0,0 +1,408 @@ + + + + + + schulcloud-server documentation + + + + + + + + + + + + + +
    +
    + + +
    +
    + + + + + + + + + + + + + + + + +
    +
    +

    +

    File

    +

    +

    + apps/server/src/modules/files-storage/mapper/preview.builder.ts +

    + + + + + + +
    +

    Index

    + + + + + + + + + + + + + + + +
    +
    Methods
    +
    + +
    +
    + + + +
    + +

    + Methods +

    + + + + + + + + + + + + + + + + + + + +
    + + + Static + buildParams + + +
    + + buildParams(fileRecord: FileRecord, previewParams: PreviewParams, bytesRange: string | undefined) +
    + +
    + +
    + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeOptional
    fileRecord + FileRecord + + No +
    previewParams + PreviewParams + + No +
    bytesRange + string | undefined + + No +
    +
    +
    + Returns : PreviewFileParams + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    + + + Static + buildPayload + + +
    + + buildPayload(params: PreviewFileParams) +
    + +
    + +
    + Parameters : + + + + + + + + + + + + + + + + + + + +
    NameTypeOptional
    params + PreviewFileParams + + No +
    +
    +
    + Returns : PreviewFileOptions + +
    +
    + +
    +
    +
    + + + + + +
    + + +
    +
    import { PreviewFileOptions } from '@shared/infra/preview-generator';
    +import { PreviewParams } from '../controller/dto';
    +import { FileRecord } from '../entity';
    +import { createPath, createPreviewFilePath, createPreviewNameHash, getFormat } from '../helper';
    +import { PreviewFileParams } from '../interface';
    +
    +export class PreviewBuilder {
    +	public static buildParams(
    +		fileRecord: FileRecord,
    +		previewParams: PreviewParams,
    +		bytesRange: string | undefined
    +	): PreviewFileParams {
    +		const { schoolId, id, mimeType } = fileRecord;
    +		const originFilePath = createPath(schoolId, id);
    +		const format = getFormat(previewParams.outputFormat ?? mimeType);
    +
    +		const hash = createPreviewNameHash(id, previewParams);
    +		const previewFilePath = createPreviewFilePath(schoolId, hash, id);
    +
    +		const previewFileParams = {
    +			fileRecord,
    +			previewParams,
    +			hash,
    +			previewFilePath,
    +			originFilePath,
    +			format,
    +			bytesRange,
    +		};
    +
    +		return previewFileParams;
    +	}
    +
    +	public static buildPayload(params: PreviewFileParams): PreviewFileOptions {
    +		const { originFilePath, previewFilePath, previewParams, format } = params;
    +
    +		const payload = {
    +			originFilePath,
    +			previewFilePath,
    +			previewOptions: {
    +				format,
    +				width: previewParams.width,
    +			},
    +		};
    +
    +		return payload;
    +	}
    +}
    +
    +
    +
    + + + + + + + + + +
    +
    +

    results matching ""

    +
      +
      +
      +

      No results matching ""

      +
      +
      +
      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/classes/PreviewGeneratorBuilder.html b/classes/PreviewGeneratorBuilder.html new file mode 100644 index 00000000000..aa0e3301c5f --- /dev/null +++ b/classes/PreviewGeneratorBuilder.html @@ -0,0 +1,292 @@ + + + + + + schulcloud-server documentation + + + + + + + + + + + + + +
      +
      + + +
      +
      + + + + + + + + + + + + + + + + +
      +
      +

      +

      File

      +

      +

      + apps/server/src/shared/infra/preview-generator/preview-generator.builder.ts +

      + + + + + + +
      +

      Index

      + + + + + + + + + + + + + + + +
      +
      Methods
      +
      + +
      +
      + + + +
      + +

      + Methods +

      + + + + + + + + + + + + + + + + + + + +
      + + + Static + buildFile + + +
      + + buildFile(preview: PassThrough, previewOptions: PreviewOptions) +
      + +
      + +
      + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameTypeOptional
      preview + PassThrough + + No +
      previewOptions + PreviewOptions + + No +
      +
      +
      + Returns : File + +
      +
      + +
      +
      +
      + + + + + +
      + + +
      +
      import { File } from '@shared/infra/s3-client';
      +import { PassThrough } from 'stream';
      +import { PreviewOptions } from './interface';
      +
      +export class PreviewGeneratorBuilder {
      +	public static buildFile(preview: PassThrough, previewOptions: PreviewOptions): File {
      +		const { format } = previewOptions;
      +
      +		const file = {
      +			data: preview,
      +			mimeType: format,
      +		};
      +
      +		return file;
      +	}
      +}
      +
      +
      +
      + + + + + + + + + +
      +
      +

      results matching ""

      +
        +
        +
        +

        No results matching ""

        +
        +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/classes/RpcMessageProducer.html b/classes/RpcMessageProducer.html new file mode 100644 index 00000000000..ffb16c365a6 --- /dev/null +++ b/classes/RpcMessageProducer.html @@ -0,0 +1,559 @@ + + + + + + schulcloud-server documentation + + + + + + + + + + + + + +
        +
        + + +
        +
        + + + + + + + + + + + + + + + + +
        +
        +

        +

        File

        +

        +

        + apps/server/src/shared/infra/rabbitmq/rpc-message-producer.ts +

        + + + + + + +
        +

        Index

        + + + + + + + + + + + + + + + +
        +
        Methods
        +
        + +
        +
        + +
        +

        Constructor

        + + + + + + + + + + + + + +
        +constructor(amqpConnection: AmqpConnection, exchange: string, timeout: number) +
        + +
        +
        + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        NameTypeOptional
        amqpConnection + AmqpConnection + + No +
        exchange + string + + No +
        timeout + number + + No +
        +
        +
        +
        + + +
        + +

        + Methods +

        + + + + + + + + + + + + + + + + + + + + + + +
        + + + Protected + checkError + + +
        + + checkError(response: RpcMessage<T>) +
        + +
        + Type parameters : +
          +
        • T
        • +
        +
        + +
        + Parameters : + + + + + + + + + + + + + + + + + + + +
        NameTypeOptional
        response + RpcMessage<T> + + No +
        +
        +
        + Returns : void + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + +
        + + + Protected + createRequest + + +
        + + createRequest(event: string, payload) +
        + +
        + +
        + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        NameTypeOptional
        event + string + + No +
        payload + + No +
        +
        +
        + Returns : { exchange: string; routingKey: string; payload: unknown; timeout: number; } + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + +
        + + + Protected + Async + request + + +
        + + request(event: string, payload) +
        + +
        + Type parameters : +
          +
        • T
        • +
        +
        + +
        + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        NameTypeOptional
        event + string + + No +
        payload + + No +
        +
        +
        + Returns : unknown + +
        +
        + +
        +
        +
        + + + + + +
        + + +
        +
        import { AmqpConnection } from '@golevelup/nestjs-rabbitmq';
        +import { ErrorMapper } from './error.mapper';
        +import { RpcMessage } from './rpc-message';
        +
        +export abstract class RpcMessageProducer {
        +	constructor(
        +		protected readonly amqpConnection: AmqpConnection,
        +		protected readonly exchange: string,
        +		protected readonly timeout: number
        +	) {}
        +
        +	protected async request<T>(event: string, payload: unknown) {
        +		const response = await this.amqpConnection.request<RpcMessage<T>>(this.createRequest(event, payload));
        +
        +		this.checkError<T>(response);
        +		return response.message;
        +	}
        +
        +	// need to be fixed with https://ticketsystem.dbildungscloud.de/browse/BC-2984
        +	// mapRpcErrorResponseToDomainError should also removed with this ticket
        +	protected checkError<T>(response: RpcMessage<T>) {
        +		const { error } = response;
        +		if (error) {
        +			const domainError = ErrorMapper.mapRpcErrorResponseToDomainError(error);
        +			throw domainError;
        +		}
        +	}
        +
        +	protected createRequest(event: string, payload: unknown) {
        +		return {
        +			exchange: this.exchange,
        +			routingKey: event,
        +			payload,
        +			timeout: this.timeout,
        +		};
        +	}
        +}
        +
        +
        +
        + + + + + + + + + +
        +
        +

        results matching ""

        +
          +
          +
          +

          No results matching ""

          +
          +
          +
          + +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/controllers/FilesStorageController.html b/controllers/FilesStorageController.html index a706ccdb47b..8836baa5e58 100644 --- a/controllers/FilesStorageController.html +++ b/controllers/FilesStorageController.html @@ -157,6 +157,7 @@
          Methods
          + Async downloadPreview @@ -278,8 +279,8 @@

          - + @@ -385,8 +386,8 @@

          - + @@ -492,8 +493,8 @@

          - + @@ -587,8 +588,8 @@

          - + @@ -685,8 +686,8 @@

          - + @@ -796,6 +797,7 @@

          + Async downloadPreview @@ -813,14 +815,14 @@

          Decorators :
          - @ApiOperation({summary: 'Streamable download of a preview file.'})
          @ApiResponse({status: 200, type: StreamableFile})
          @ApiResponse({status: 206, type: StreamableFile})
          @ApiResponse({status: 400, type: ApiValidationError})
          @ApiResponse({status: 403, type: ForbiddenException})
          @ApiResponse({status: 404, type: NotFoundException})
          @ApiResponse({status: 422, type: UnprocessableEntityException})
          @ApiResponse({status: 500, type: InternalServerErrorException})
          @ApiHeader({name: 'Range', required: false})
          @Get('/preview/:fileRecordId/:fileName')
          + @ApiOperation({summary: 'Streamable download of a preview file.'})
          @ApiResponse({status: 200, type: StreamableFile})
          @ApiResponse({status: 206, type: StreamableFile})
          @ApiResponse({status: 400, type: ApiValidationError})
          @ApiResponse({status: 403, type: ForbiddenException})
          @ApiResponse({status: 404, type: NotFoundException})
          @ApiResponse({status: 422, type: UnprocessableEntityException})
          @ApiResponse({status: 500, type: InternalServerErrorException})
          @ApiHeader({name: 'Range', required: false})
          @Get('/preview/:fileRecordId/:fileName')
          @RequestTimeout(undefined.INCOMING_REQUEST_TIMEOUT)
          - + @@ -960,8 +962,8 @@

          - + @@ -1068,8 +1070,8 @@

          - + @@ -1173,8 +1175,8 @@

          - + @@ -1266,8 +1268,8 @@

          - + @@ -1347,8 +1349,8 @@

          - + @@ -1467,8 +1469,8 @@

          - + @@ -1586,8 +1588,8 @@

          - + @@ -1661,7 +1663,8 @@

          -
          import {
          +        
          import { Authenticate, CurrentUser, ICurrentUser } from '@modules/authentication';
          +import {
           	BadRequestException,
           	Body,
           	ConflictException,
          @@ -1685,10 +1688,10 @@ 

          UseInterceptors, } from '@nestjs/common'; import { ApiConsumes, ApiHeader, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; -import { ApiValidationError, RequestLoggingInterceptor } from '@shared/common'; +import { ApiValidationError, RequestLoggingInterceptor, RequestTimeout } from '@shared/common'; import { PaginationParams } from '@shared/controller'; -import { ICurrentUser, Authenticate, CurrentUser } from '@modules/authentication'; import { Request, Response } from 'express'; +import { config } from '../files-storage.config'; import { GetFileResponse } from '../interface'; import { FilesStorageMapper } from '../mapper'; import { FileRecordMapper } from '../mapper/file-record.mapper'; @@ -1789,6 +1792,7 @@

          @ApiResponse({ status: 500, type: InternalServerErrorException }) @ApiHeader({ name: 'Range', required: false }) @Get('/preview/:fileRecordId/:fileName') + @RequestTimeout(config().INCOMING_REQUEST_TIMEOUT) async downloadPreview( @Param() params: DownloadFileParams, @CurrentUser() currentUser: ICurrentUser, diff --git a/coverage.html b/coverage.html index 33202408308..ad5f6fd1c7a 100644 --- a/coverage.html +++ b/coverage.html @@ -187,6 +187,18 @@ (0/1) + + + + apps/server/src/apps/preview-generator-consumer.app.ts + + function + bootstrap + + 0 % + (0/1) + + @@ -3175,18 +3187,6 @@ (0/2) - - - - apps/server/src/modules/files-storage-client/mapper/error.mapper.ts - - class - ErrorMapper - - 0 % - (0/2) - - @@ -3643,6 +3643,18 @@ (0/1) + + + + apps/server/src/modules/files-storage/files-storage.config.ts + + variable + defaultConfig + + 0 % + (0/1) + + @@ -3787,6 +3799,30 @@ (0/1) + + + + apps/server/src/modules/files-storage/helper/file-record.ts + + function + getFormat + + 0 % + (0/1) + + + + + + apps/server/src/modules/files-storage/helper/file-record.ts + + function + getPreviewName + + 0 % + (0/1) + + @@ -3928,7 +3964,7 @@ PreviewFileParams 0 % - (0/7) + (0/8) @@ -3991,6 +4027,18 @@ (0/7) + + + + apps/server/src/modules/files-storage/mapper/preview.builder.ts + + class + PreviewBuilder + + 0 % + (0/3) + + @@ -4036,7 +4084,7 @@ PreviewService 0 % - (0/11) + (0/8) @@ -15511,6 +15559,150 @@ (0/17) + + + + apps/server/src/shared/infra/preview-generator/interface/preview-consumer-config.ts + + interface + PreviewConfig + + 0 % + (0/3) + + + + + + apps/server/src/shared/infra/preview-generator/interface/preview-consumer-config.ts + + interface + PreviewModuleConfig + + 0 % + (0/3) + + + + + + apps/server/src/shared/infra/preview-generator/interface/preview.ts + + interface + PreviewFileOptions + + 0 % + (0/4) + + + + + + apps/server/src/shared/infra/preview-generator/interface/preview.ts + + interface + PreviewOptions + + 0 % + (0/3) + + + + + + apps/server/src/shared/infra/preview-generator/interface/preview.ts + + interface + PreviewResponseMessage + + 0 % + (0/3) + + + + + + apps/server/src/shared/infra/preview-generator/loggable/preview-actions.loggable.ts + + class + PreviewActionsLoggable + + 0 % + (0/3) + + + + + + apps/server/src/shared/infra/preview-generator/preview-generator.builder.ts + + class + PreviewGeneratorBuilder + + 0 % + (0/2) + + + + + + apps/server/src/shared/infra/preview-generator/preview-generator.consumer.ts + + injectable + PreviewGeneratorConsumer + + 0 % + (0/3) + + + + + + apps/server/src/shared/infra/preview-generator/preview-generator.service.ts + + injectable + PreviewGeneratorService + + 0 % + (0/6) + + + + + + apps/server/src/shared/infra/preview-generator/preview.producer.ts + + injectable + PreviewProducer + + 0 % + (0/6) + + + + + + apps/server/src/shared/infra/rabbitmq/error.mapper.ts + + class + ErrorMapper + + 0 % + (0/2) + + + + + + apps/server/src/shared/infra/rabbitmq/exchange/files-preview.ts + + variable + FilesPreviewExchange + + 0 % + (0/1) + + @@ -15583,6 +15775,18 @@ (1/1) + + + + apps/server/src/shared/infra/rabbitmq/rpc-message-producer.ts + + class + RpcMessageProducer + + 0 % + (0/5) + + @@ -15664,7 +15868,7 @@ File 0 % - (0/4) + (0/3) diff --git a/entities/FileRecord.html b/entities/FileRecord.html index c30c682d630..537fc36ac95 100644 --- a/entities/FileRecord.html +++ b/entities/FileRecord.html @@ -181,7 +181,7 @@

          - + @@ -218,7 +218,7 @@

          - + @@ -255,7 +255,7 @@

          - + @@ -291,7 +291,7 @@

          - + @@ -329,7 +329,7 @@

          - + @@ -365,7 +365,7 @@

          - + @@ -401,7 +401,7 @@

          - + @@ -438,7 +438,7 @@

          - + @@ -474,7 +474,7 @@

          - + @@ -510,7 +510,7 @@

          - + @@ -526,6 +526,7 @@

          import { ObjectId } from '@mikro-orm/mongodb'; import { BadRequestException } from '@nestjs/common'; import { BaseEntityWithTimestamps, EntityId } from '@shared/domain'; +import path from 'path'; import { v4 as uuid } from 'uuid'; import { ErrorType } from '../error'; import { PreviewInputMimeTypes } from '../interface/preview-input-mime-types.enum'; @@ -817,6 +818,12 @@

          return PreviewStatus.PREVIEW_NOT_POSSIBLE_SCAN_STATUS_ERROR; } + + public get fileNameWithoutExtension(): string { + const filenameObj = path.parse(this.name); + + return filenameObj.name; + } }

          diff --git a/graph/dependencies.svg b/graph/dependencies.svg index a7f2e75e2bd..97520d3c74c 100644 --- a/graph/dependencies.svg +++ b/graph/dependencies.svg @@ -4,7789 +4,7869 @@ - + dependencies - -Legend - -  Declarations - -  Module - -  Bootstrap - -  Providers - -  Exports + +Legend + +  Declarations + +  Module + +  Bootstrap + +  Providers + +  Exports cluster_AccountApiModule - + cluster_AccountApiModule_imports - + cluster_AccountApiModule_providers - + cluster_AccountModule - + cluster_AccountModule_imports - + cluster_AccountModule_exports - + cluster_AccountModule_providers - + cluster_AuthenticationApiModule - + cluster_AuthenticationApiModule_imports - + cluster_AuthenticationApiModule_providers - + cluster_AuthenticationModule - + cluster_AuthenticationModule_imports - + cluster_AuthenticationModule_exports - + cluster_AuthenticationModule_providers - + cluster_AuthorizationModule - + cluster_AuthorizationModule_imports - + cluster_AuthorizationModule_exports - + cluster_AuthorizationModule_providers - + cluster_AuthorizationReferenceModule - + cluster_AuthorizationReferenceModule_exports - + cluster_AuthorizationReferenceModule_providers - + cluster_BoardApiModule - + cluster_BoardApiModule_imports - + cluster_BoardApiModule_providers - + cluster_BoardModule - + cluster_BoardModule_imports - + cluster_BoardModule_exports - + cluster_BoardModule_providers - + cluster_CacheWrapperModule - + cluster_CacheWrapperModule_exports - + cluster_CacheWrapperModule_providers - + cluster_CalendarModule - + cluster_CalendarModule_exports - + cluster_CalendarModule_providers - + cluster_ClassModule - + cluster_ClassModule_exports - + cluster_ClassModule_providers - + cluster_CollaborativeStorageAdapterModule - + cluster_CollaborativeStorageAdapterModule_imports - + cluster_CollaborativeStorageAdapterModule_exports - + cluster_CollaborativeStorageAdapterModule_providers - + cluster_CollaborativeStorageModule - + cluster_CollaborativeStorageModule_exports - + cluster_CollaborativeStorageModule_providers - + cluster_CommonToolModule - + cluster_CommonToolModule_imports - + cluster_CommonToolModule_exports - + cluster_CommonToolModule_providers - + cluster_ConsoleWriterModule - + cluster_ConsoleWriterModule_exports - + cluster_ConsoleWriterModule_providers - + cluster_ContextExternalToolModule - + cluster_ContextExternalToolModule_imports - + cluster_ContextExternalToolModule_exports - + cluster_ContextExternalToolModule_providers - + cluster_CopyHelperModule - + cluster_CopyHelperModule_exports - + cluster_CopyHelperModule_providers - + cluster_CoreModule - + cluster_CoreModule_imports - + cluster_CoreModule_exports - + cluster_DatabaseManagementModule - + cluster_DatabaseManagementModule_exports - + cluster_DatabaseManagementModule_providers - + cluster_EncryptionModule - + cluster_ExternalToolModule - + cluster_ExternalToolModule_imports - + cluster_ExternalToolModule_exports - + cluster_ExternalToolModule_providers - + cluster_FeathersModule - + cluster_FeathersModule_exports - + cluster_FeathersModule_providers - + cluster_FilesModule - + cluster_FilesModule_providers - + cluster_FilesStorageAMQPModule - + cluster_FilesStorageAMQPModule_imports - + cluster_FilesStorageAMQPModule_providers - + cluster_FilesStorageApiModule - + cluster_FilesStorageApiModule_providers - + cluster_FilesStorageClientModule - + cluster_FilesStorageClientModule_exports - + cluster_FilesStorageClientModule_providers - + cluster_FilesStorageModule - + cluster_FilesStorageModule_imports - + cluster_FilesStorageModule_exports - + cluster_FilesStorageModule_providers - + cluster_FilesStorageTestModule - + cluster_FilesStorageTestModule_imports - + cluster_FileSystemModule - + cluster_FileSystemModule_exports - + cluster_FileSystemModule_providers - + cluster_FwuLearningContentsModule - + cluster_FwuLearningContentsModule_imports - + cluster_FwuLearningContentsModule_providers - + cluster_FwuLearningContentsTestModule - + cluster_GroupApiModule - + cluster_GroupApiModule_imports - + cluster_GroupApiModule_providers - + cluster_GroupModule - + cluster_GroupModule_exports - + cluster_GroupModule_providers - + cluster_H5PEditorModule - + cluster_H5PEditorModule_providers - + cluster_H5PEditorTestModule - + cluster_IdentityManagementModule - + cluster_IdentityManagementModule_imports - + cluster_IdentityManagementModule_exports - + cluster_ImportUserModule - + cluster_ImportUserModule_providers - + cluster_KeycloakAdministrationModule - + cluster_KeycloakAdministrationModule_exports - + cluster_KeycloakAdministrationModule_providers - + cluster_KeycloakConfigurationModule - + cluster_KeycloakConfigurationModule_exports - + cluster_KeycloakConfigurationModule_providers - + cluster_KeycloakModule - + cluster_KeycloakModule_exports - + cluster_KeycloakModule_providers - + cluster_LearnroomApiModule - + cluster_LearnroomApiModule_imports - + cluster_LearnroomApiModule_providers - + cluster_LearnroomModule - + cluster_LearnroomModule_imports - + cluster_LearnroomModule_exports - + cluster_LearnroomModule_providers - + cluster_LegacySchoolApiModule - + cluster_LegacySchoolApiModule_imports - + cluster_LegacySchoolApiModule_providers - + cluster_LegacySchoolModule - + cluster_LegacySchoolModule_exports - + cluster_LegacySchoolModule_providers - + cluster_LessonApiModule - + cluster_LessonApiModule_providers - + cluster_LessonModule - + cluster_LessonModule_exports - + cluster_LessonModule_providers - + cluster_LoggerModule - + cluster_LoggerModule_exports - + cluster_LoggerModule_providers - + cluster_LtiToolModule - + cluster_LtiToolModule_exports - + cluster_LtiToolModule_providers - + cluster_ManagementModule - + cluster_ManagementModule_providers - + cluster_ManagementServerModule - + cluster_ManagementServerTestModule - + cluster_NewsModule - + cluster_NewsModule_exports - + cluster_NewsModule_providers - + cluster_OauthApiModule - + cluster_OauthApiModule_imports - + cluster_OauthApiModule_providers - + cluster_OauthModule - + cluster_OauthModule_exports - + cluster_OauthModule_providers - + cluster_OauthProviderApiModule - + cluster_OauthProviderApiModule_imports - + cluster_OauthProviderApiModule_providers - + cluster_OauthProviderModule - + cluster_OauthProviderModule_exports - + cluster_OauthProviderModule_providers - + cluster_OauthProviderServiceModule - + cluster_OauthProviderServiceModule_exports - + +cluster_PreviewGeneratorAMQPModule + + + +cluster_PreviewGeneratorAMQPModule_imports + + + +cluster_PreviewGeneratorProducerModule + + + +cluster_PreviewGeneratorProducerModule_exports + + + +cluster_PreviewGeneratorProducerModule_providers + + + cluster_ProvisioningModule - + - + cluster_ProvisioningModule_exports - + - + cluster_ProvisioningModule_providers - + - + cluster_PseudonymApiModule - + - + cluster_PseudonymApiModule_providers - + - + cluster_PseudonymModule - + - + cluster_PseudonymModule_exports - + - + cluster_PseudonymModule_providers - + - + cluster_RedisModule - + - + cluster_RoleModule - + - + cluster_RoleModule_exports - + - + cluster_RoleModule_providers - + - + cluster_SchoolExternalToolModule - + - + cluster_SchoolExternalToolModule_exports - + - + cluster_SchoolExternalToolModule_providers - + - + cluster_ServerConsoleModule - + - + cluster_ServerModule - + - + cluster_ServerModule_imports - + - + cluster_ServerTestModule - + - + cluster_SharingApiModule - + - + cluster_SharingApiModule_imports - + - + cluster_SharingApiModule_providers - + - + cluster_SharingModule - + - + cluster_SharingModule_exports - + - + cluster_SharingModule_providers - + - + cluster_SystemApiModule - + - + cluster_SystemApiModule_providers - + - + cluster_SystemModule - + - + cluster_SystemModule_exports - + - + cluster_SystemModule_providers - + - + cluster_TaskApiModule - + - + cluster_TaskApiModule_providers - + - + cluster_TaskModule - + - + cluster_TaskModule_exports - + - + cluster_TaskModule_providers - + - + cluster_TeamsApiModule - + - + cluster_TeamsApiModule_imports - + - + cluster_TeamsModule - + - + cluster_TeamsModule_exports - + - + cluster_TeamsModule_providers - + - + cluster_ToolApiModule - + - + cluster_ToolApiModule_providers - + - + cluster_ToolLaunchModule - + - + cluster_ToolLaunchModule_exports - + - + cluster_ToolLaunchModule_providers - + - + cluster_ToolModule - + - + cluster_ToolModule_exports - + - + cluster_UserApiModule - + - + cluster_UserApiModule_providers - + - + cluster_UserLoginMigrationApiModule - + - + cluster_UserLoginMigrationApiModule_providers - + - + cluster_UserLoginMigrationModule - + - + cluster_UserLoginMigrationModule_exports - + - + cluster_UserLoginMigrationModule_providers - + - + cluster_UserModule - + - + cluster_UserModule_exports - + - + cluster_UserModule_providers - + - + cluster_VideoConferenceApiModule - + - + cluster_VideoConferenceApiModule_imports - + - + cluster_VideoConferenceApiModule_providers - + - + cluster_VideoConferenceModule - + - + cluster_VideoConferenceModule_exports - + - + cluster_VideoConferenceModule_providers - + AccountModule - -AccountModule + +AccountModule AccountApiModule - -AccountApiModule + +AccountApiModule AccountModule->AccountApiModule - - + + AccountService - -AccountService + +AccountService AccountModule->AccountService - - + + AccountValidationService - -AccountValidationService + +AccountValidationService AccountModule->AccountValidationService - - + + AuthenticationModule - -AuthenticationModule + +AuthenticationModule AccountModule->AuthenticationModule - - + + UserModule - -UserModule + +UserModule - + AccountModule->UserModule - - + + ImportUserModule - -ImportUserModule + +ImportUserModule AccountModule->ImportUserModule - - + + KeycloakConfigurationModule - -KeycloakConfigurationModule + +KeycloakConfigurationModule AccountModule->KeycloakConfigurationModule - - + + UserLoginMigrationModule - -UserLoginMigrationModule + +UserLoginMigrationModule - + AccountModule->UserLoginMigrationModule - - + + ProvisioningModule - -ProvisioningModule + +ProvisioningModule - + AccountModule->ProvisioningModule - - + + LoggerModule - -LoggerModule + +LoggerModule LoggerModule->AccountModule - - + + LoggerModule->AccountApiModule - - + + LoggerModule->AuthenticationModule - - + + OauthModule - -OauthModule + +OauthModule LoggerModule->OauthModule - - + + AuthorizationModule - -AuthorizationModule + +AuthorizationModule LoggerModule->AuthorizationModule - - + + AuthorizationReferenceModule - -AuthorizationReferenceModule + +AuthorizationReferenceModule LoggerModule->AuthorizationReferenceModule - - + + BoardModule - -BoardModule + +BoardModule LoggerModule->BoardModule - - + + BoardApiModule - -BoardApiModule + +BoardApiModule LoggerModule->BoardApiModule - - + + FilesStorageClientModule - -FilesStorageClientModule + +FilesStorageClientModule LoggerModule->FilesStorageClientModule - - + + - + LoggerModule->UserModule - - + + CollaborativeStorageAdapterModule - -CollaborativeStorageAdapterModule + +CollaborativeStorageAdapterModule LoggerModule->CollaborativeStorageAdapterModule - - + + CollaborativeStorageModule - -CollaborativeStorageModule + +CollaborativeStorageModule LoggerModule->CollaborativeStorageModule - - + + LegacySchoolModule - -LegacySchoolModule + +LegacySchoolModule LoggerModule->LegacySchoolModule - - + + CommonToolModule - -CommonToolModule + +CommonToolModule LoggerModule->CommonToolModule - - + + ExternalToolModule - -ExternalToolModule + +ExternalToolModule LoggerModule->ExternalToolModule - - + + ContextExternalToolModule - -ContextExternalToolModule + +ContextExternalToolModule LoggerModule->ContextExternalToolModule - - + + ErrorModule - -ErrorModule + +ErrorModule LoggerModule->ErrorModule - - + + CoreModule - -CoreModule + +CoreModule LoggerModule->CoreModule - - + + EncryptionModule - -EncryptionModule + +EncryptionModule LoggerModule->EncryptionModule - - + + FilesModule - -FilesModule + +FilesModule LoggerModule->FilesModule - - + + FilesStorageModule - -FilesStorageModule + +FilesStorageModule LoggerModule->FilesStorageModule - - + + FilesStorageAMQPModule - -FilesStorageAMQPModule + +FilesStorageAMQPModule LoggerModule->FilesStorageAMQPModule - - + + FilesStorageTestModule - -FilesStorageTestModule + +FilesStorageTestModule LoggerModule->FilesStorageTestModule - - + + FwuLearningContentsModule - -FwuLearningContentsModule + +FwuLearningContentsModule LoggerModule->FwuLearningContentsModule - - + + FwuLearningContentsTestModule - -FwuLearningContentsTestModule + +FwuLearningContentsTestModule LoggerModule->FwuLearningContentsTestModule - - + + H5PEditorTestModule - -H5PEditorTestModule + +H5PEditorTestModule LoggerModule->H5PEditorTestModule - - + + KeycloakModule - -KeycloakModule + +KeycloakModule LoggerModule->KeycloakModule - - + + LoggerModule->ImportUserModule - - + + LoggerModule->KeycloakConfigurationModule - - + + LearnroomModule - -LearnroomModule + +LearnroomModule LoggerModule->LearnroomModule - - + + LessonModule - -LessonModule + +LessonModule LoggerModule->LessonModule - - + + - + LoggerModule->UserLoginMigrationModule - - + + LegacySchoolApiModule - -LegacySchoolApiModule + +LegacySchoolApiModule LoggerModule->LegacySchoolApiModule - - + + ErrorLogger - -ErrorLogger + +ErrorLogger LoggerModule->ErrorLogger - - + + LegacyLogger - -LegacyLogger + +LegacyLogger LoggerModule->LegacyLogger - - + + Logger - -Logger + +Logger LoggerModule->Logger - - + + ManagementModule - -ManagementModule + +ManagementModule LoggerModule->ManagementModule - - + + NewsModule - -NewsModule + +NewsModule LoggerModule->NewsModule - - + + - + LoggerModule->ProvisioningModule - - + + OauthApiModule - -OauthApiModule + +OauthApiModule LoggerModule->OauthApiModule - - + + OauthProviderModule - -OauthProviderModule + +OauthProviderModule LoggerModule->OauthProviderModule - - + + OauthProviderApiModule - -OauthProviderApiModule + +OauthProviderApiModule LoggerModule->OauthProviderApiModule - - + + + + + +PreviewGeneratorProducerModule + +PreviewGeneratorProducerModule + + + +LoggerModule->PreviewGeneratorProducerModule + + - + RedisModule - -RedisModule + +RedisModule - + LoggerModule->RedisModule - - + + - + SharingApiModule - -SharingApiModule + +SharingApiModule - + LoggerModule->SharingApiModule - - + + - + ToolApiModule - -ToolApiModule + +ToolApiModule - + LoggerModule->ToolApiModule - - + + - + UserLoginMigrationApiModule - -UserLoginMigrationApiModule + +UserLoginMigrationApiModule - + LoggerModule->UserLoginMigrationApiModule - - + + - + ServerModule - -ServerModule + +ServerModule - + LoggerModule->ServerModule - - + + - + ServerTestModule - -ServerTestModule + +ServerTestModule - + LoggerModule->ServerTestModule - - + + - + SharingModule - -SharingModule + +SharingModule - + LoggerModule->SharingModule - - + + - + VideoConferenceModule - -VideoConferenceModule + +VideoConferenceModule - + LoggerModule->VideoConferenceModule - - + + - + AccountApiModule->ServerModule - - + + - + AccountApiModule->ServerTestModule - - + + AccountUc - -AccountUc + +AccountUc AccountUc->AccountApiModule - - + + PermissionService - -PermissionService + +PermissionService PermissionService->AccountModule - - + + PermissionService->AccountApiModule - - + + UserRepo - -UserRepo + +UserRepo UserRepo->AccountModule - - + + UserRepo->AccountApiModule - - + + UserRepo->AuthenticationModule - - + + UserRepo->AuthorizationModule - - + + UserRepo->AuthorizationReferenceModule - - + + - + UserRepo->UserModule - - + + UserRepo->ImportUserModule - - + + UserRepo->LearnroomModule - - + + LearnroomApiModule - -LearnroomApiModule + +LearnroomApiModule UserRepo->LearnroomApiModule - - + + IdentityManagementModule - -IdentityManagementModule + +IdentityManagementModule IdentityManagementModule->AccountModule - - + + IdentityManagementModule->AuthenticationModule - - + + SystemModule - -SystemModule + +SystemModule - + IdentityManagementModule->SystemModule - - + + IdentityManagementOauthService - -IdentityManagementOauthService + +IdentityManagementOauthService IdentityManagementModule->IdentityManagementOauthService - - + + IdentityManagementService - -IdentityManagementService + +IdentityManagementService IdentityManagementModule->IdentityManagementService - - + + AccountLookupService - -AccountLookupService + +AccountLookupService AccountLookupService->AccountModule - - + + AccountRepo - -AccountRepo + +AccountRepo AccountRepo->AccountModule - - + + AccountService - -AccountService + +AccountService AccountService->AccountModule - - + + AccountServiceDb - -AccountServiceDb + +AccountServiceDb AccountServiceDb->AccountModule - - + + AccountServiceIdm - -AccountServiceIdm + +AccountServiceIdm AccountServiceIdm->AccountModule - - + + AccountValidationService - -AccountValidationService + +AccountValidationService AccountValidationService->AccountModule - - + + SystemRepo - -SystemRepo + +SystemRepo SystemRepo->AccountModule - - + + SystemRepo->AuthenticationModule - - + + - + SystemRepo->SystemModule - - + + SystemRepo->ImportUserModule - - + + AuthenticationApiModule - -AuthenticationApiModule + +AuthenticationApiModule AuthenticationModule->AuthenticationApiModule - - + + AuthenticationService - -AuthenticationService + +AuthenticationService AuthenticationModule->AuthenticationService - - + + AuthenticationModule->FilesStorageModule - - + + FilesStorageApiModule - -FilesStorageApiModule + +FilesStorageApiModule AuthenticationModule->FilesStorageApiModule - - + + AuthenticationModule->FilesStorageTestModule - - + + AuthenticationModule->FwuLearningContentsModule - - + + AuthenticationModule->FwuLearningContentsTestModule - - + + H5PEditorModule - -H5PEditorModule + +H5PEditorModule AuthenticationModule->H5PEditorModule - - + + AuthenticationModule->H5PEditorTestModule - - + + AuthenticationModule->ManagementModule - - + + AuthenticationModule->OauthApiModule - - + + - + AuthenticationModule->UserLoginMigrationApiModule - - + + AuthenticationApiModule->H5PEditorTestModule - - + + - + AuthenticationApiModule->ServerModule - - + + - + AuthenticationApiModule->ServerTestModule - - + + LoginUc - -LoginUc + +LoginUc LoginUc->AuthenticationApiModule - - + + CacheWrapperModule - -CacheWrapperModule + +CacheWrapperModule CacheWrapperModule->AuthenticationModule - - + + CacheWrapperModule->OauthModule - - + + CacheService - -CacheService + +CacheService CacheWrapperModule->CacheService - - + + OauthModule->AuthenticationModule - - + + OauthModule->OauthApiModule - - + + HydraSsoService - -HydraSsoService + +HydraSsoService OauthModule->HydraSsoService - - + + OAuthService - -OAuthService + +OAuthService OauthModule->OAuthService - - + + - + OauthModule->UserLoginMigrationApiModule - - + + RoleModule - -RoleModule + +RoleModule RoleModule->AuthenticationModule - - + + - + RoleModule->UserModule - - + + RoleModule->CollaborativeStorageModule - - + + GroupApiModule - -GroupApiModule + +GroupApiModule RoleModule->GroupApiModule - - + + - + RoleModule->ProvisioningModule - - + + - + RoleRepo - -RoleRepo + +RoleRepo - + RoleModule->RoleRepo - - + + - + RoleService - -RoleService + +RoleService - + RoleModule->RoleService - - + + - + RoleUc - -RoleUc + +RoleUc - + RoleModule->RoleUc - - + + SystemModule->AuthenticationModule - - + + SystemModule->OauthModule - - + + SystemModule->GroupApiModule - - + + SystemModule->KeycloakConfigurationModule - - + + - + SystemModule->UserLoginMigrationModule - - + + - + SystemModule->ProvisioningModule - - + + SystemModule->OauthApiModule - - + + - + SystemApiModule - -SystemApiModule + +SystemApiModule - + SystemModule->SystemApiModule - - + + - + SystemOidcService - -SystemOidcService + +SystemOidcService - + SystemModule->SystemOidcService - - + + - + SystemService - -SystemService + +SystemService - + SystemModule->SystemService - - + + AuthenticationService - -AuthenticationService + +AuthenticationService AuthenticationService->AuthenticationModule - - + + JwtStrategy - -JwtStrategy + +JwtStrategy JwtStrategy->AuthenticationModule - - + + JwtValidationAdapter - -JwtValidationAdapter + +JwtValidationAdapter JwtValidationAdapter->AuthenticationModule - - + + LdapService - -LdapService + +LdapService LdapService->AuthenticationModule - - + + LdapStrategy - -LdapStrategy + +LdapStrategy LdapStrategy->AuthenticationModule - - + + LegacySchoolRepo - -LegacySchoolRepo + +LegacySchoolRepo LegacySchoolRepo->AuthenticationModule - - + + LegacySchoolRepo->AuthorizationReferenceModule - - + + LegacySchoolRepo->LegacySchoolModule - - + + LegacySchoolRepo->ImportUserModule - - + + LocalStrategy - -LocalStrategy + +LocalStrategy LocalStrategy->AuthenticationModule - - + + Oauth2Strategy - -Oauth2Strategy + +Oauth2Strategy Oauth2Strategy->AuthenticationModule - - + + FeathersModule - -FeathersModule + +FeathersModule FeathersModule->AuthorizationModule - - + + FeathersServiceProvider - -FeathersServiceProvider + +FeathersServiceProvider FeathersModule->FeathersServiceProvider - - + + AuthorizationModule->OauthModule - - + + AuthorizationService - -AuthorizationService + +AuthorizationService AuthorizationModule->AuthorizationService - - + + FeathersAuthorizationService - -FeathersAuthorizationService + +FeathersAuthorizationService AuthorizationModule->FeathersAuthorizationService - - + + AuthorizationModule->AuthorizationReferenceModule - - + + AuthorizationModule->CollaborativeStorageModule - - + + AuthorizationModule->FilesStorageModule - - + + AuthorizationModule->FilesStorageTestModule - - + + AuthorizationModule->FwuLearningContentsModule - - + + AuthorizationModule->FwuLearningContentsTestModule - - + + AuthorizationModule->GroupApiModule - - + + AuthorizationModule->H5PEditorModule - - + + AuthorizationModule->H5PEditorTestModule - - + + AuthorizationModule->ImportUserModule - - + + AuthorizationModule->LearnroomApiModule - - + + AuthorizationModule->LegacySchoolApiModule - - + + LessonApiModule - -LessonApiModule + +LessonApiModule AuthorizationModule->LessonApiModule - - + + AuthorizationModule->ManagementModule - - + + AuthorizationModule->NewsModule - - + + AuthorizationModule->OauthApiModule - - + + AuthorizationModule->OauthProviderApiModule - - + + - + PseudonymApiModule - -PseudonymApiModule + +PseudonymApiModule - + AuthorizationModule->PseudonymApiModule - - + + - + AuthorizationModule->SharingApiModule - - + + - + TaskApiModule - -TaskApiModule + +TaskApiModule - + AuthorizationModule->TaskApiModule - - + + - + AuthorizationModule->ToolApiModule - - + + - + AuthorizationModule->UserLoginMigrationApiModule - - + + - + VideoConferenceApiModule - -VideoConferenceApiModule + +VideoConferenceApiModule - + AuthorizationModule->VideoConferenceApiModule - - + + - + AuthorizationModule->SharingModule - - + + - + AuthorizationModule->VideoConferenceModule - - + + AuthorizationHelper - -AuthorizationHelper + +AuthorizationHelper AuthorizationHelper->AuthorizationModule - - + + AuthorizationHelper->AuthorizationReferenceModule - - + + AuthorizationService - -AuthorizationService + +AuthorizationService AuthorizationService->AuthorizationModule - - + + BoardDoRule - -BoardDoRule + +BoardDoRule BoardDoRule->AuthorizationModule - - + + ContextExternalToolRule - -ContextExternalToolRule + +ContextExternalToolRule ContextExternalToolRule->AuthorizationModule - - + + CourseGroupRule - -CourseGroupRule + +CourseGroupRule CourseGroupRule->AuthorizationModule - - + + CourseRule - -CourseRule + +CourseRule CourseRule->AuthorizationModule - - + + FeathersAuthProvider - -FeathersAuthProvider + +FeathersAuthProvider FeathersAuthProvider->AuthorizationModule - - + + FeathersAuthorizationService - -FeathersAuthorizationService + +FeathersAuthorizationService FeathersAuthorizationService->AuthorizationModule - - + + GroupRule - -GroupRule + +GroupRule GroupRule->AuthorizationModule - - + + LegacySchoolRule - -LegacySchoolRule + +LegacySchoolRule LegacySchoolRule->AuthorizationModule - - + + LessonRule - -LessonRule + +LessonRule LessonRule->AuthorizationModule - - + + RuleManager - -RuleManager + +RuleManager RuleManager->AuthorizationModule - - + + SchoolExternalToolRule - -SchoolExternalToolRule + +SchoolExternalToolRule SchoolExternalToolRule->AuthorizationModule - - + + SubmissionRule - -SubmissionRule + +SubmissionRule SubmissionRule->AuthorizationModule - - + + TaskRule - -TaskRule + +TaskRule TaskRule->AuthorizationModule - - + + TeamRule - -TeamRule + +TeamRule TeamRule->AuthorizationModule - - + + UserLoginMigrationRule - -UserLoginMigrationRule + +UserLoginMigrationRule UserLoginMigrationRule->AuthorizationModule - - + + UserRule - -UserRule + +UserRule UserRule->AuthorizationModule - - + + AuthorizationReferenceService - -AuthorizationReferenceService + +AuthorizationReferenceService AuthorizationReferenceModule->AuthorizationReferenceService - - + + AuthorizationReferenceModule->FilesStorageApiModule - - + + AuthorizationReferenceModule->LearnroomApiModule - - + + - + AuthorizationReferenceModule->SharingApiModule - - + + - + AuthorizationReferenceModule->SharingModule - - + + - + AuthorizationReferenceModule->VideoConferenceModule - - + + AuthorizationReferenceService - -AuthorizationReferenceService + +AuthorizationReferenceService AuthorizationReferenceService->AuthorizationReferenceModule - - + + CourseGroupRepo - -CourseGroupRepo + +CourseGroupRepo CourseGroupRepo->AuthorizationReferenceModule - - + + CourseRepo - -CourseRepo + +CourseRepo CourseRepo->AuthorizationReferenceModule - - + + CourseRepo->BoardModule - - + + CourseRepo->LearnroomModule - - + + CourseRepo->LearnroomApiModule - - + + TaskModule - -TaskModule + +TaskModule - + CourseRepo->TaskModule - - + + - + CourseRepo->TaskApiModule - - + + LessonRepo - -LessonRepo + +LessonRepo LessonRepo->AuthorizationReferenceModule - - + + LessonRepo->LearnroomModule - - + + LessonRepo->LessonModule - - + + LessonRepo->LearnroomApiModule - - + + - + LessonRepo->TaskModule - - + + - + LessonRepo->TaskApiModule - - + + ReferenceLoader - -ReferenceLoader + +ReferenceLoader ReferenceLoader->AuthorizationReferenceModule - - + + SchoolExternalToolRepo - -SchoolExternalToolRepo + +SchoolExternalToolRepo SchoolExternalToolRepo->AuthorizationReferenceModule - - + + SchoolExternalToolRepo->CommonToolModule - - + + SubmissionRepo - -SubmissionRepo + +SubmissionRepo SubmissionRepo->AuthorizationReferenceModule - - + + - + SubmissionRepo->TaskModule - - + + TaskRepo - -TaskRepo + +TaskRepo TaskRepo->AuthorizationReferenceModule - - + + - + TaskRepo->TaskModule - - + + - + TaskRepo->TaskApiModule - - + + TeamsRepo - -TeamsRepo + +TeamsRepo TeamsRepo->AuthorizationReferenceModule - - + + TeamsRepo->CollaborativeStorageModule - - + + TeamsRepo->OauthProviderModule - - + + - + TeamsModule - -TeamsModule + +TeamsModule - + TeamsRepo->TeamsModule - - + + - + TeamsRepo->VideoConferenceModule - - + + BoardModule->BoardApiModule - - + + BoardDoAuthorizableService - -BoardDoAuthorizableService + +BoardDoAuthorizableService BoardModule->BoardDoAuthorizableService - - + + CardService - -CardService + +CardService BoardModule->CardService - - + + ColumnBoardCopyService - -ColumnBoardCopyService + +ColumnBoardCopyService BoardModule->ColumnBoardCopyService - - + + ColumnBoardService - -ColumnBoardService + +ColumnBoardService BoardModule->ColumnBoardService - - + + ColumnService - -ColumnService + +ColumnService BoardModule->ColumnService - - + + ContentElementService - -ContentElementService + +ContentElementService BoardModule->ContentElementService - - + + SubmissionItemService - -SubmissionItemService + +SubmissionItemService BoardModule->SubmissionItemService - - + + BoardModule->LearnroomModule - - + + - + BoardModule->ToolApiModule - - + + - + BoardApiModule->ServerModule - - + + - + BoardApiModule->ServerTestModule - - + + BoardUc - -BoardUc + +BoardUc BoardUc->BoardApiModule - - + + CardUc - -CardUc + +CardUc CardUc->BoardApiModule - - + + ElementUc - -ElementUc + +ElementUc ElementUc->BoardApiModule - - + + SubmissionItemUc - -SubmissionItemUc + +SubmissionItemUc SubmissionItemUc->BoardApiModule - - + + ConsoleWriterModule - -ConsoleWriterModule + +ConsoleWriterModule ConsoleWriterModule->BoardModule - - + + ConsoleWriterService - -ConsoleWriterService + +ConsoleWriterService ConsoleWriterModule->ConsoleWriterService - - + + ConsoleWriterModule->KeycloakConfigurationModule - - + + - + ServerConsoleModule - -ServerConsoleModule + +ServerConsoleModule - + ConsoleWriterModule->ServerConsoleModule - - + + FilesStorageClientModule->BoardModule - - + + CopyFilesService - -CopyFilesService + +CopyFilesService FilesStorageClientModule->CopyFilesService - - + + FilesStorageClientAdapterService - -FilesStorageClientAdapterService + +FilesStorageClientAdapterService FilesStorageClientModule->FilesStorageClientAdapterService - - + + FilesStorageClientModule->LessonModule - - + + - + FilesStorageClientModule->TaskModule - - + + - + FilesStorageClientModule->ServerModule - - + + - + FilesStorageClientModule->ServerTestModule - - + + UserModule->OauthModule - - + + UserModule->BoardModule - - + + PseudonymModule - -PseudonymModule + +PseudonymModule - + UserModule->PseudonymModule - - + + UserModule->CollaborativeStorageAdapterModule - - + + UserModule->GroupApiModule - - + + - + UserModule->UserLoginMigrationModule - - + + - + UserModule->ProvisioningModule - - + + UserModule->OauthApiModule - - + + UserModule->OauthProviderModule - - + + UserModule->OauthProviderApiModule - - + + - + UserModule->ToolApiModule - - + + - + UserApiModule - -UserApiModule + +UserApiModule - + UserModule->UserApiModule - - + + - + UserModule->VideoConferenceApiModule - - + + - + ToolLaunchModule - -ToolLaunchModule + +ToolLaunchModule - + UserModule->ToolLaunchModule - - + + - + UserRepo - -UserRepo + +UserRepo - + UserModule->UserRepo - - + + - + UserService - -UserService + +UserService - + UserModule->UserService - - + + - + UserModule->VideoConferenceModule - - + + - + UserModule->VideoConferenceModule - - + + BoardDoAuthorizableService - -BoardDoAuthorizableService + +BoardDoAuthorizableService BoardDoAuthorizableService->BoardModule - - + + BoardDoCopyService - -BoardDoCopyService + +BoardDoCopyService BoardDoCopyService->BoardModule - - + + BoardDoRepo - -BoardDoRepo + +BoardDoRepo BoardDoRepo->BoardModule - - + + BoardDoService - -BoardDoService + +BoardDoService BoardDoService->BoardModule - - + + BoardNodeRepo - -BoardNodeRepo + +BoardNodeRepo BoardNodeRepo->BoardModule - - + + CardService - -CardService + +CardService CardService->BoardModule - - + + ColumnBoardCopyService - -ColumnBoardCopyService + +ColumnBoardCopyService ColumnBoardCopyService->BoardModule - - + + ColumnBoardService - -ColumnBoardService + +ColumnBoardService ColumnBoardService->BoardModule - - + + ColumnService - -ColumnService + +ColumnService ColumnService->BoardModule - - + + ContentElementFactory - -ContentElementFactory + +ContentElementFactory ContentElementFactory->BoardModule - - + + ContentElementService - -ContentElementService + +ContentElementService ContentElementService->BoardModule - - + + OpenGraphProxyService - -OpenGraphProxyService + +OpenGraphProxyService OpenGraphProxyService->BoardModule - - + + RecursiveDeleteVisitor - -RecursiveDeleteVisitor + +RecursiveDeleteVisitor RecursiveDeleteVisitor->BoardModule - - + + SchoolSpecificFileCopyServiceFactory - -SchoolSpecificFileCopyServiceFactory + +SchoolSpecificFileCopyServiceFactory SchoolSpecificFileCopyServiceFactory->BoardModule - - + + SubmissionItemService - -SubmissionItemService + +SubmissionItemService SubmissionItemService->BoardModule - - + + CacheService - -CacheService + +CacheService CacheService->CacheWrapperModule - - + + CalendarService - -CalendarService + +CalendarService CalendarModule - -CalendarModule + +CalendarModule CalendarModule->CalendarService - - + + - + CalendarModule->VideoConferenceModule - - + + CalendarMapper - -CalendarMapper + +CalendarMapper CalendarMapper->CalendarModule - - + + CalendarService - -CalendarService + +CalendarService CalendarService->CalendarModule - - + + ClassService - -ClassService + +ClassService ClassModule - -ClassModule + +ClassModule ClassModule->ClassService - - + + ClassModule->GroupApiModule - - + + ClassService - -ClassService + +ClassService ClassService->ClassModule - - + + ClassesRepo - -ClassesRepo + +ClassesRepo ClassesRepo->ClassModule - - + + PseudonymModule->CollaborativeStorageAdapterModule - - + + PseudonymModule->OauthProviderModule - - + + PseudonymModule->OauthProviderApiModule - - + + - + PseudonymModule->PseudonymApiModule - - + + - + FeathersRosterService - -FeathersRosterService + +FeathersRosterService - + PseudonymModule->FeathersRosterService - - + + - + PseudonymService - -PseudonymService + +PseudonymService - + PseudonymModule->PseudonymService - - + + ToolModule - -ToolModule + +ToolModule ToolModule->CollaborativeStorageAdapterModule - - + + CommonToolService - -CommonToolService + +CommonToolService - + ToolModule->CommonToolService - - + + ToolModule->OauthProviderModule - - + + - + ToolModule->ToolApiModule - - + + - + ContextExternalToolModule - -ContextExternalToolModule + +ContextExternalToolModule - + ToolModule->ContextExternalToolModule - - + + - + ExternalToolModule - -ExternalToolModule + +ExternalToolModule - + ToolModule->ExternalToolModule - - + + - + SchoolExternalToolModule - -SchoolExternalToolModule + +SchoolExternalToolModule - + ToolModule->SchoolExternalToolModule - - + + - + ToolLaunchModule - -ToolLaunchModule + +ToolLaunchModule - + ToolModule->ToolLaunchModule - - + + CollaborativeStorageAdapter - -CollaborativeStorageAdapter + +CollaborativeStorageAdapter CollaborativeStorageAdapterModule->CollaborativeStorageAdapter - - + + CollaborativeStorageAdapterModule->CollaborativeStorageModule - - + + CollaborativeStorageAdapter - -CollaborativeStorageAdapter + +CollaborativeStorageAdapter CollaborativeStorageAdapter->CollaborativeStorageAdapterModule - - + + CollaborativeStorageAdapterMapper - -CollaborativeStorageAdapterMapper + +CollaborativeStorageAdapterMapper CollaborativeStorageAdapterMapper->CollaborativeStorageAdapterModule - - + + LtiToolRepo - -LtiToolRepo + +LtiToolRepo LtiToolRepo->OauthModule - - + + LtiToolRepo->CollaborativeStorageAdapterModule - - + + LtiToolModule - -LtiToolModule + +LtiToolModule LtiToolRepo->LtiToolModule - - + + - + LtiToolRepo->ToolApiModule - - + + NextcloudClient - -NextcloudClient + +NextcloudClient NextcloudClient->CollaborativeStorageAdapterModule - - + + NextcloudStrategy - -NextcloudStrategy + +NextcloudStrategy NextcloudStrategy->CollaborativeStorageAdapterModule - - + + CollaborativeStorageUc - -CollaborativeStorageUc + +CollaborativeStorageUc CollaborativeStorageModule->CollaborativeStorageUc - - + + - + CollaborativeStorageModule->ServerModule - - + + - + CollaborativeStorageModule->ServerTestModule - - + + CollaborativeStorageService - -CollaborativeStorageService + +CollaborativeStorageService CollaborativeStorageService->CollaborativeStorageModule - - + + CollaborativeStorageUc - -CollaborativeStorageUc + +CollaborativeStorageUc CollaborativeStorageUc->CollaborativeStorageModule - - + + TeamMapper - -TeamMapper + +TeamMapper TeamMapper->CollaborativeStorageModule - - + + TeamPermissionsMapper - -TeamPermissionsMapper + +TeamPermissionsMapper TeamPermissionsMapper->CollaborativeStorageModule - - + + LegacySchoolModule->OauthModule - - + + - + LegacySchoolModule->UserModule - - + + LegacySchoolModule->CommonToolModule - - + + LegacySchoolModule->GroupApiModule - - + + LegacySchoolModule->ImportUserModule - - + + - + LegacySchoolModule->UserLoginMigrationModule - - + + LegacySchoolModule->LegacySchoolApiModule - - + + FederalStateService - -FederalStateService + +FederalStateService LegacySchoolModule->FederalStateService - - + + LegacySchoolService - -LegacySchoolService + +LegacySchoolService LegacySchoolModule->LegacySchoolService - - + + SchoolYearService - -SchoolYearService + +SchoolYearService LegacySchoolModule->SchoolYearService - - + + - + LegacySchoolModule->ProvisioningModule - - + + LegacySchoolModule->OauthApiModule - - + + - + LegacySchoolModule->PseudonymApiModule - - + + - + LegacySchoolModule->ToolApiModule - - + + - + LegacySchoolModule->UserLoginMigrationApiModule - - + + - + LegacySchoolModule->ToolLaunchModule - - + + - + LegacySchoolModule->VideoConferenceModule - - + + CommonToolModule->CommonToolService - - + + CommonToolValidationService - -CommonToolValidationService + +CommonToolValidationService CommonToolModule->CommonToolValidationService - - + + ContextExternalToolRepo - -ContextExternalToolRepo + +ContextExternalToolRepo CommonToolModule->ContextExternalToolRepo - - + + SchoolExternalToolRepo - -SchoolExternalToolRepo + +SchoolExternalToolRepo CommonToolModule->SchoolExternalToolRepo - - + + CommonToolModule->ExternalToolModule - - + + SchoolExternalToolModule - -SchoolExternalToolModule + +SchoolExternalToolModule - + CommonToolModule->SchoolExternalToolModule - - + + CommonToolModule->ContextExternalToolModule - - + + - + CommonToolModule->ToolApiModule - - + + - + CommonToolModule->ToolLaunchModule - - + + CommonToolService - -CommonToolService + +CommonToolService - + CommonToolService->ToolModule - - + + CommonToolService->CommonToolModule - - + + CommonToolValidationService - -CommonToolValidationService + +CommonToolValidationService CommonToolValidationService->CommonToolModule - - + + ContextExternalToolRepo - -ContextExternalToolRepo + +ContextExternalToolRepo ContextExternalToolRepo->CommonToolModule - - + + ConsoleWriterService - -ConsoleWriterService + +ConsoleWriterService ConsoleWriterService->ConsoleWriterModule - - + + ConsoleWriterService->ManagementModule - - + + - + ExternalToolModule->ToolModule - - + + - + ExternalToolModule->SchoolExternalToolModule - - + + ExternalToolModule->ContextExternalToolModule - - + + ExternalToolConfigurationService - -ExternalToolConfigurationService + +ExternalToolConfigurationService ExternalToolModule->ExternalToolConfigurationService - - + + ExternalToolLogoService - -ExternalToolLogoService + +ExternalToolLogoService ExternalToolModule->ExternalToolLogoService - - + + ExternalToolService - -ExternalToolService + +ExternalToolService ExternalToolModule->ExternalToolService - - + + ExternalToolValidationService - -ExternalToolValidationService + +ExternalToolValidationService ExternalToolModule->ExternalToolValidationService - - + + ExternalToolVersionService - -ExternalToolVersionService + +ExternalToolVersionService ExternalToolModule->ExternalToolVersionService - - + + - + ExternalToolModule->ToolLaunchModule - - + + - + SchoolExternalToolModule->ToolModule - - + + SchoolExternalToolModule->ContextExternalToolModule - - + + - + SchoolExternalToolService - -SchoolExternalToolService + +SchoolExternalToolService - + SchoolExternalToolModule->SchoolExternalToolService - - + + - + SchoolExternalToolValidationService - -SchoolExternalToolValidationService + +SchoolExternalToolValidationService - + SchoolExternalToolModule->SchoolExternalToolValidationService - - + + - + SchoolExternalToolModule->ToolLaunchModule - - + + - + ContextExternalToolModule->ToolModule - - + + ContextExternalToolAuthorizableService - -ContextExternalToolAuthorizableService + +ContextExternalToolAuthorizableService ContextExternalToolModule->ContextExternalToolAuthorizableService - - + + ContextExternalToolService - -ContextExternalToolService + +ContextExternalToolService ContextExternalToolModule->ContextExternalToolService - - + + ContextExternalToolValidationService - -ContextExternalToolValidationService + +ContextExternalToolValidationService ContextExternalToolModule->ContextExternalToolValidationService - - + + ToolReferenceService - -ToolReferenceService + +ToolReferenceService ContextExternalToolModule->ToolReferenceService - - + + - + ContextExternalToolModule->ToolLaunchModule - - + + ContextExternalToolAuthorizableService - -ContextExternalToolAuthorizableService + +ContextExternalToolAuthorizableService ContextExternalToolAuthorizableService->ContextExternalToolModule - - + + ContextExternalToolService - -ContextExternalToolService + +ContextExternalToolService ContextExternalToolService->ContextExternalToolModule - - + + ContextExternalToolValidationService - -ContextExternalToolValidationService + +ContextExternalToolValidationService ContextExternalToolValidationService->ContextExternalToolModule - - + + ToolReferenceService - -ToolReferenceService + +ToolReferenceService ToolReferenceService->ContextExternalToolModule - - + + CopyHelperService - -CopyHelperService + +CopyHelperService CopyHelperModule - -CopyHelperModule + +CopyHelperModule CopyHelperModule->FilesStorageClientModule - - + + CopyHelperModule->CopyHelperService - - + + CopyHelperModule->LearnroomModule - - + + CopyHelperModule->LessonModule - - + + CopyHelperModule->LearnroomApiModule - - + + - + CopyHelperModule->TaskModule - - + + - + CopyHelperModule->TaskApiModule - - + + CopyHelperService - -CopyHelperService + +CopyHelperService CopyHelperService->CopyHelperModule - - + + ErrorModule->CoreModule - - + + InterceptorModule - -InterceptorModule + +InterceptorModule InterceptorModule->CoreModule - - + + ValidationModule - -ValidationModule + +ValidationModule ValidationModule->CoreModule - - + + LoggerModule - -LoggerModule + +LoggerModule CoreModule->LoggerModule - - + + CoreModule->FilesStorageModule - - + + CoreModule->FilesStorageAMQPModule - - + + CoreModule->FilesStorageApiModule - - + + CoreModule->FilesStorageTestModule - - + + CoreModule->FwuLearningContentsModule - - + + CoreModule->FwuLearningContentsTestModule - - + + CoreModule->H5PEditorModule - - + + CoreModule->H5PEditorTestModule - - + + CoreModule->ManagementModule - - + + - + CoreModule->ServerModule - - + + - + CoreModule->ServerTestModule - - + + DatabaseManagementService - -DatabaseManagementService + +DatabaseManagementService DatabaseManagementModule - -DatabaseManagementModule + +DatabaseManagementModule DatabaseManagementModule->DatabaseManagementService - - + + DatabaseManagementService - -DatabaseManagementService + +DatabaseManagementService DatabaseManagementService->DatabaseManagementModule - - + + DatabaseManagementService->ManagementModule - - + + EncryptionModule->IdentityManagementModule - - + + EncryptionModule->OauthModule - - + + EncryptionModule->ExternalToolModule - - + + EncryptionModule->KeycloakModule - - + + EncryptionModule->KeycloakConfigurationModule - - + + OauthProviderServiceModule - -OauthProviderServiceModule + +OauthProviderServiceModule OauthProviderServiceModule->ExternalToolModule - - + + OauthProviderServiceModule->OauthProviderModule - - + + OauthProviderServiceModule->OauthProviderApiModule - - + + OauthProviderService - -OauthProviderService + +OauthProviderService OauthProviderServiceModule->OauthProviderService - - + + ToolConfigModule - -ToolConfigModule + +ToolConfigModule - + ToolConfigModule->ToolModule - - + + ToolConfigModule->ExternalToolModule - - + + ToolConfigModule->OauthProviderModule - - + + - + ToolConfigModule->ToolApiModule - - + + ExternalToolConfigurationService - -ExternalToolConfigurationService + +ExternalToolConfigurationService ExternalToolConfigurationService->ExternalToolModule - - + + - + ExternalToolConfigurationService->ToolApiModule - - + + ExternalToolParameterValidationService - -ExternalToolParameterValidationService + +ExternalToolParameterValidationService ExternalToolParameterValidationService->ExternalToolModule - - + + ExternalToolRepo - -ExternalToolRepo + +ExternalToolRepo ExternalToolRepo->ExternalToolModule - - + + ExternalToolService - -ExternalToolService + +ExternalToolService ExternalToolService->ExternalToolModule - - + + ExternalToolServiceMapper - -ExternalToolServiceMapper + +ExternalToolServiceMapper ExternalToolServiceMapper->ExternalToolModule - - + + ExternalToolValidationService - -ExternalToolValidationService + +ExternalToolValidationService ExternalToolValidationService->ExternalToolModule - - + + ExternalToolVersionService - -ExternalToolVersionService + +ExternalToolVersionService ExternalToolVersionService->ExternalToolModule - - + + FeathersServiceProvider - -FeathersServiceProvider + +FeathersServiceProvider FeathersServiceProvider->FeathersModule - - + + FeathersServiceProvider->LessonModule - - + + - + FilesModule->ServerConsoleModule - - + + DeleteFilesUc - -DeleteFilesUc + +DeleteFilesUc DeleteFilesUc->FilesModule - - + + FilesRepo - -FilesRepo + +FilesRepo FilesRepo->FilesModule - - + + StorageProviderRepo - -StorageProviderRepo + +StorageProviderRepo StorageProviderRepo->FilesModule - - + + FilesStorageModule->FilesStorageAMQPModule - - + + FilesStorageModule->FilesStorageApiModule - - + + FilesStorageService - -FilesStorageService + +FilesStorageService FilesStorageModule->FilesStorageService - - + + PreviewService - -PreviewService + +PreviewService FilesStorageModule->PreviewService - - + + FilesStorageConsumer - -FilesStorageConsumer + +FilesStorageConsumer FilesStorageConsumer->FilesStorageAMQPModule - - + + FilesStorageApiModule->FilesStorageModule - - + + FilesStorageApiModule->FilesStorageTestModule - - + + FilesStorageApiModule->ManagementModule - - + + FilesStorageUC - -FilesStorageUC + +FilesStorageUC FilesStorageUC->FilesStorageApiModule - - + + CopyFilesService - -CopyFilesService + +CopyFilesService CopyFilesService->FilesStorageClientModule - - + + FilesStorageClientAdapterService - -FilesStorageClientAdapterService + +FilesStorageClientAdapterService FilesStorageClientAdapterService->FilesStorageClientModule - - + + FilesStorageProducer - -FilesStorageProducer + +FilesStorageProducer FilesStorageProducer->FilesStorageClientModule - - + + RabbitMQWrapperModule - -RabbitMQWrapperModule + +RabbitMQWrapperModule RabbitMQWrapperModule->FilesStorageModule - - + + RabbitMQWrapperModule->FwuLearningContentsModule - - + + + + + +RabbitMQWrapperModule->PreviewGeneratorProducerModule + + - + RabbitMQWrapperModule->ServerModule - - + + RabbitMQWrapperTestModule - -RabbitMQWrapperTestModule + +RabbitMQWrapperTestModule RabbitMQWrapperTestModule->FilesStorageModule - - + + RabbitMQWrapperTestModule->FilesStorageTestModule - - + + RabbitMQWrapperTestModule->FwuLearningContentsTestModule - - + + RabbitMQWrapperTestModule->H5PEditorTestModule - - + + RabbitMQWrapperTestModule->ManagementModule - - + + - + RabbitMQWrapperTestModule->ServerTestModule - - + + FileRecordRepo - -FileRecordRepo + +FileRecordRepo FileRecordRepo->FilesStorageModule - - + + FilesStorageService - -FilesStorageService + +FilesStorageService FilesStorageService->FilesStorageModule - - + + PreviewService - -PreviewService + +PreviewService PreviewService->FilesStorageModule - - + + MongoMemoryDatabaseModule - -MongoMemoryDatabaseModule + +MongoMemoryDatabaseModule MongoMemoryDatabaseModule->FilesStorageTestModule - - + + MongoMemoryDatabaseModule->FwuLearningContentsTestModule - - + + MongoMemoryDatabaseModule->H5PEditorTestModule - - + + ManagementServerTestModule - -ManagementServerTestModule + +ManagementServerTestModule MongoMemoryDatabaseModule->ManagementServerTestModule - - + + - + MongoMemoryDatabaseModule->ServerTestModule - - + + FileSystemAdapter - -FileSystemAdapter + +FileSystemAdapter FileSystemModule - -FileSystemModule + +FileSystemModule FileSystemModule->FileSystemAdapter - - + + FileSystemAdapter - -FileSystemAdapter + +FileSystemAdapter FileSystemAdapter->FileSystemModule - - + + S3ClientModule - -S3ClientModule + +S3ClientModule S3ClientModule->FwuLearningContentsModule - - + + S3ClientModule->FwuLearningContentsTestModule - - + + FwuLearningContentsUc - -FwuLearningContentsUc + +FwuLearningContentsUc FwuLearningContentsUc->FwuLearningContentsModule - - + + FwuLearningContentsUc->FwuLearningContentsTestModule - - + + GroupModule - -GroupModule + +GroupModule GroupModule->GroupApiModule - - + + GroupService - -GroupService + +GroupService GroupModule->GroupService - - + + - + GroupModule->ProvisioningModule - - + + - + GroupApiModule->ServerModule - - + + - + GroupApiModule->ServerTestModule - - + + GroupUc - -GroupUc + +GroupUc GroupUc->GroupApiModule - - + + GroupRepo - -GroupRepo + +GroupRepo GroupRepo->GroupModule - - + + GroupService - -GroupService + +GroupService GroupService->GroupModule - - + + H5PEditorModule->H5PEditorTestModule - - + + Logger - -Logger + +Logger Logger->LoggerModule - - + + Logger->H5PEditorModule - - + + KeycloakAdministrationModule - -KeycloakAdministrationModule + +KeycloakAdministrationModule KeycloakAdministrationModule->IdentityManagementModule - - + + KeycloakAdministrationModule->KeycloakModule - - + + KeycloakAdministrationService - -KeycloakAdministrationService + +KeycloakAdministrationService KeycloakAdministrationModule->KeycloakAdministrationService - - + + KeycloakAdministrationModule->KeycloakConfigurationModule - - + + KeycloakModule->IdentityManagementModule - - + + KeycloakIdentityManagementOauthService - -KeycloakIdentityManagementOauthService + +KeycloakIdentityManagementOauthService KeycloakModule->KeycloakIdentityManagementOauthService - - + + KeycloakIdentityManagementService - -KeycloakIdentityManagementService + +KeycloakIdentityManagementService KeycloakModule->KeycloakIdentityManagementService - - + + - + ImportUserModule->ServerModule - - + + - + ImportUserModule->ServerTestModule - - + + ImportUserRepo - -ImportUserRepo + +ImportUserRepo ImportUserRepo->ImportUserModule - - + + UserImportUc - -UserImportUc + +UserImportUc UserImportUc->ImportUserModule - - + + KeycloakAdministrationService - -KeycloakAdministrationService + +KeycloakAdministrationService KeycloakAdministrationService->KeycloakAdministrationModule - - + + KeycloakConfigurationService - -KeycloakConfigurationService + +KeycloakConfigurationService KeycloakConfigurationModule->KeycloakConfigurationService - - + + KeycloakConsole - -KeycloakConsole + +KeycloakConsole KeycloakConfigurationModule->KeycloakConsole - - + + KeycloakSeedService - -KeycloakSeedService + +KeycloakSeedService KeycloakConfigurationModule->KeycloakSeedService - - + + KeycloakConfigurationService - -KeycloakConfigurationService + +KeycloakConfigurationService KeycloakConfigurationService->KeycloakConfigurationModule - - + + KeycloakConfigurationUc - -KeycloakConfigurationUc + +KeycloakConfigurationUc KeycloakConfigurationUc->KeycloakConfigurationModule - - + + KeycloakMigrationService - -KeycloakMigrationService + +KeycloakMigrationService KeycloakMigrationService->KeycloakConfigurationModule - - + + KeycloakIdentityManagementOauthService - -KeycloakIdentityManagementOauthService + +KeycloakIdentityManagementOauthService KeycloakIdentityManagementOauthService->KeycloakModule - - + + KeycloakIdentityManagementService - -KeycloakIdentityManagementService + +KeycloakIdentityManagementService KeycloakIdentityManagementService->KeycloakModule - - + + - + LearnroomModule->PseudonymModule - - + + LearnroomModule->LearnroomApiModule - - + + CommonCartridgeExportService - -CommonCartridgeExportService + +CommonCartridgeExportService LearnroomModule->CommonCartridgeExportService - - + + CourseCopyService - -CourseCopyService + +CourseCopyService LearnroomModule->CourseCopyService - - + + CourseService - -CourseService + +CourseService LearnroomModule->CourseService - - + + RoomsService - -RoomsService + +RoomsService LearnroomModule->RoomsService - - + + - + LearnroomModule->SharingApiModule - - + + - + LearnroomModule->ToolApiModule - - + + - + LearnroomModule->SharingModule - - + + - + LearnroomModule->ToolLaunchModule - - + + - + LearnroomModule->VideoConferenceModule - - + + LessonModule->LearnroomModule - - + + LessonModule->LearnroomApiModule - - + + LessonModule->LessonApiModule - - + + LessonCopyService - -LessonCopyService + +LessonCopyService LessonModule->LessonCopyService - - + + LessonService - -LessonService + +LessonService LessonModule->LessonService - - + + - + LessonModule->SharingApiModule - - + + - + LessonModule->SharingModule - - + + - + LearnroomApiModule->ServerModule - - + + - + LearnroomApiModule->ServerTestModule - - + + BoardRepo - -BoardRepo + +BoardRepo BoardRepo->LearnroomModule - - + + BoardRepo->LearnroomApiModule - - + + CourseCopyUC - -CourseCopyUC + +CourseCopyUC CourseCopyUC->LearnroomApiModule - - + + CourseExportUc - -CourseExportUc + +CourseExportUc CourseExportUc->LearnroomApiModule - - + + CourseUc - -CourseUc + +CourseUc CourseUc->LearnroomApiModule - - + + DashboardModelMapper - -DashboardModelMapper + +DashboardModelMapper DashboardModelMapper->LearnroomModule - - + + DashboardModelMapper->LearnroomApiModule - - + + DashboardUc - -DashboardUc + +DashboardUc DashboardUc->LearnroomApiModule - - + + LessonCopyUC - -LessonCopyUC + +LessonCopyUC LessonCopyUC->LearnroomApiModule - - + + RoomBoardDTOFactory - -RoomBoardDTOFactory + +RoomBoardDTOFactory RoomBoardDTOFactory->LearnroomApiModule - - + + RoomBoardResponseMapper - -RoomBoardResponseMapper + +RoomBoardResponseMapper RoomBoardResponseMapper->LearnroomApiModule - - + + RoomsAuthorisationService - -RoomsAuthorisationService + +RoomsAuthorisationService RoomsAuthorisationService->LearnroomApiModule - - + + RoomsUc - -RoomsUc + +RoomsUc RoomsUc->LearnroomApiModule - - + + TaskModule->LearnroomModule - - + + TaskModule->LessonModule - - + + - + TaskModule->SharingApiModule - - + + - + TaskModule->TaskApiModule - - + + - + TaskModule->SharingModule - - + + - + SubmissionService - -SubmissionService + +SubmissionService - + TaskModule->SubmissionService - - + + - + TaskCopyService - -TaskCopyService + +TaskCopyService - + TaskModule->TaskCopyService - - + + - + TaskService - -TaskService + +TaskService - + TaskModule->TaskService - - + + BoardCopyService - -BoardCopyService + +BoardCopyService BoardCopyService->LearnroomModule - - + + ColumnBoardTargetService - -ColumnBoardTargetService + +ColumnBoardTargetService ColumnBoardTargetService->LearnroomModule - - + + CommonCartridgeExportService - -CommonCartridgeExportService + +CommonCartridgeExportService CommonCartridgeExportService->LearnroomModule - - + + CourseCopyService - -CourseCopyService + +CourseCopyService CourseCopyService->LearnroomModule - - + + CourseService - -CourseService + +CourseService CourseService->LearnroomModule - - + + RoomsService - -RoomsService + +RoomsService RoomsService->LearnroomModule - - + + UserLoginMigrationModule->OauthModule - - + + UserLoginMigrationModule->LegacySchoolApiModule - - + + UserLoginMigrationModule->OauthApiModule - - + + - + UserLoginMigrationModule->UserLoginMigrationApiModule - - + + - + MigrationCheckService - -MigrationCheckService + +MigrationCheckService - + UserLoginMigrationModule->MigrationCheckService - - + + - + SchoolMigrationService - -SchoolMigrationService + +SchoolMigrationService - + UserLoginMigrationModule->SchoolMigrationService - - + + - + UserLoginMigrationRevertService - -UserLoginMigrationRevertService + +UserLoginMigrationRevertService - + UserLoginMigrationModule->UserLoginMigrationRevertService - - + + - + UserLoginMigrationService - -UserLoginMigrationService + +UserLoginMigrationService - + UserLoginMigrationModule->UserLoginMigrationService - - + + - + UserMigrationService - -UserMigrationService + +UserMigrationService - + UserLoginMigrationModule->UserMigrationService - - + + - + LegacySchoolApiModule->ServerModule - - + + - + LegacySchoolApiModule->ServerTestModule - - + + LegacySchoolUc - -LegacySchoolUc + +LegacySchoolUc LegacySchoolUc->LegacySchoolApiModule - - + + MigrationMapper - -MigrationMapper + +MigrationMapper MigrationMapper->LegacySchoolApiModule - - + + FederalStateRepo - -FederalStateRepo + +FederalStateRepo FederalStateRepo->LegacySchoolModule - - + + FederalStateService - -FederalStateService + +FederalStateService FederalStateService->LegacySchoolModule - - + + LegacySchoolService - -LegacySchoolService + +LegacySchoolService LegacySchoolService->LegacySchoolModule - - + + SchoolValidationService - -SchoolValidationService + +SchoolValidationService SchoolValidationService->LegacySchoolModule - - + + SchoolYearRepo - -SchoolYearRepo + +SchoolYearRepo SchoolYearRepo->LegacySchoolModule - - + + SchoolYearService - -SchoolYearService + +SchoolYearService SchoolYearService->LegacySchoolModule - - + + - + LessonApiModule->ServerModule - - + + - + LessonApiModule->ServerTestModule - - + + LessonUC - -LessonUC + +LessonUC LessonUC->LessonApiModule - - + + EtherpadService - -EtherpadService + +EtherpadService EtherpadService->LessonModule - - + + LessonCopyService - -LessonCopyService + +LessonCopyService LessonCopyService->LessonModule - - + + LessonService - -LessonService + +LessonService LessonService->LessonModule - - + + NexboardService - -NexboardService + +NexboardService NexboardService->LessonModule - - + + ErrorLogger - -ErrorLogger + +ErrorLogger ErrorLogger->LoggerModule - - + + LegacyLogger - -LegacyLogger + +LegacyLogger LegacyLogger->LoggerModule - - + + - + LegacyLogger->PseudonymModule - - + + LegacyLogger->LtiToolModule - - + + LtiToolService - -LtiToolService + +LtiToolService LtiToolModule->LtiToolService - - + + LtiToolModule->OauthProviderModule - - + + LtiToolService - -LtiToolService + +LtiToolService LtiToolService->LtiToolModule - - + + ManagementServerModule - -ManagementServerModule + +ManagementServerModule ManagementModule->ManagementServerModule - - + + ManagementModule->ManagementServerTestModule - - + + - + ManagementModule->ServerConsoleModule - - + + BoardManagementUc - -BoardManagementUc + +BoardManagementUc BoardManagementUc->ManagementModule - - + + BsonConverter - -BsonConverter + +BsonConverter BsonConverter->ManagementModule - - + + DatabaseManagementUc - -DatabaseManagementUc + +DatabaseManagementUc DatabaseManagementUc->ManagementModule - - + + NewsUc - -NewsUc + +NewsUc NewsModule->NewsUc - - + + - + NewsModule->ServerModule - - + + - + NewsModule->ServerTestModule - - + + NewsRepo - -NewsRepo + +NewsRepo NewsRepo->NewsModule - - + + NewsUc - -NewsUc + +NewsUc NewsUc->NewsModule - - + + ProvisioningModule->OauthModule - - + + ProvisioningModule->OauthApiModule - - + + - + ProvisioningService - -ProvisioningService + +ProvisioningService - + ProvisioningModule->ProvisioningService - - + + - + ProvisioningModule->UserLoginMigrationApiModule - - + + - + OauthApiModule->ServerModule - - + + - + OauthApiModule->ServerTestModule - - + + HydraOauthUc - -HydraOauthUc + +HydraOauthUc HydraOauthUc->OauthApiModule - - + + OauthUc - -OauthUc + +OauthUc OauthUc->OauthApiModule - - + + HydraSsoService - -HydraSsoService + +HydraSsoService HydraSsoService->OauthModule - - + + OAuthService - -OAuthService + +OAuthService OAuthService->OauthModule - - + + OauthAdapterService - -OauthAdapterService + +OauthAdapterService OauthAdapterService->OauthModule - - + + OauthProviderModule->OauthProviderApiModule - - + + IdTokenService - -IdTokenService + +IdTokenService OauthProviderModule->IdTokenService - - + + OauthProviderLoginFlowService - -OauthProviderLoginFlowService + +OauthProviderLoginFlowService OauthProviderModule->OauthProviderLoginFlowService - - + + - + OauthProviderApiModule->ServerModule - - + + - + OauthProviderApiModule->ServerTestModule - - + + OauthProviderClientCrudUc - -OauthProviderClientCrudUc + +OauthProviderClientCrudUc OauthProviderClientCrudUc->OauthProviderApiModule - - + + OauthProviderConsentFlowUc - -OauthProviderConsentFlowUc + +OauthProviderConsentFlowUc OauthProviderConsentFlowUc->OauthProviderApiModule - - + + OauthProviderLoginFlowUc - -OauthProviderLoginFlowUc + +OauthProviderLoginFlowUc OauthProviderLoginFlowUc->OauthProviderApiModule - - + + OauthProviderLogoutFlowUc - -OauthProviderLogoutFlowUc + +OauthProviderLogoutFlowUc OauthProviderLogoutFlowUc->OauthProviderApiModule - - + + OauthProviderResponseMapper - -OauthProviderResponseMapper + +OauthProviderResponseMapper OauthProviderResponseMapper->OauthProviderApiModule - - + + OauthProviderUc - -OauthProviderUc + +OauthProviderUc OauthProviderUc->OauthProviderApiModule - - + + IdTokenService - -IdTokenService + +IdTokenService IdTokenService->OauthProviderModule - - + + OauthProviderLoginFlowService - -OauthProviderLoginFlowService + +OauthProviderLoginFlowService OauthProviderLoginFlowService->OauthProviderModule - - + + - + + +PreviewGeneratorConsumerModule + +PreviewGeneratorConsumerModule + + +PreviewGeneratorAMQPModule + +PreviewGeneratorAMQPModule + + + +PreviewGeneratorConsumerModule->PreviewGeneratorAMQPModule + + + + + +PreviewProducer + +PreviewProducer + + + +PreviewGeneratorProducerModule->PreviewProducer + + + + + +PreviewProducer + +PreviewProducer + + + +PreviewProducer->PreviewGeneratorProducerModule + + + + + IservProvisioningStrategy - -IservProvisioningStrategy + +IservProvisioningStrategy - + IservProvisioningStrategy->ProvisioningModule - - + + - + OidcMockProvisioningStrategy - -OidcMockProvisioningStrategy + +OidcMockProvisioningStrategy - + OidcMockProvisioningStrategy->ProvisioningModule - - + + - + OidcProvisioningService - -OidcProvisioningService + +OidcProvisioningService - + OidcProvisioningService->ProvisioningModule - - + + - + ProvisioningService - -ProvisioningService + +ProvisioningService - + ProvisioningService->ProvisioningModule - - + + - + SanisProvisioningStrategy - -SanisProvisioningStrategy + +SanisProvisioningStrategy - + SanisProvisioningStrategy->ProvisioningModule - - + + - + SanisResponseMapper - -SanisResponseMapper + +SanisResponseMapper - + SanisResponseMapper->ProvisioningModule - - + + - + PseudonymApiModule->ServerModule - - + + - + PseudonymApiModule->ServerTestModule - - + + - + PseudonymUc - -PseudonymUc + +PseudonymUc - + PseudonymUc->PseudonymApiModule - - + + - + ExternalToolPseudonymRepo - -ExternalToolPseudonymRepo + +ExternalToolPseudonymRepo - + ExternalToolPseudonymRepo->PseudonymModule - - + + - + FeathersRosterService - -FeathersRosterService + +FeathersRosterService - + FeathersRosterService->PseudonymModule - - + + - + PseudonymService - -PseudonymService + +PseudonymService - + PseudonymService->PseudonymModule - - + + - + PseudonymsRepo - -PseudonymsRepo + +PseudonymsRepo - + PseudonymsRepo->PseudonymModule - - + + - + RedisModule->ServerModule - - + + - + RedisModule->ServerTestModule - - + + - + RoleRepo - -RoleRepo + +RoleRepo - + RoleRepo->RoleModule - - + + - + RoleService - -RoleService + +RoleService - + RoleService->RoleModule - - + + - + RoleUc - -RoleUc + +RoleUc - + RoleUc->RoleModule - - + + - + SchoolExternalToolService - -SchoolExternalToolService + +SchoolExternalToolService - + SchoolExternalToolService->SchoolExternalToolModule - - + + - + SchoolExternalToolValidationService - -SchoolExternalToolValidationService + +SchoolExternalToolValidationService - + SchoolExternalToolValidationService->SchoolExternalToolModule - - + + - + SharingApiModule->ServerModule - - + + - + SharingApiModule->ServerTestModule - - + + - + SystemApiModule->ServerModule - - + + - + SystemApiModule->ServerTestModule - - + + - + TaskApiModule->ServerModule - - + + - + TaskApiModule->ServerTestModule - - + + - + TeamsApiModule - -TeamsApiModule + +TeamsApiModule - + TeamsApiModule->ServerModule - - + + - + TeamsApiModule->ServerTestModule - - + + - + ToolApiModule->ServerModule - - + + - + ToolApiModule->ServerTestModule - - + + - + UserApiModule->ServerModule - - + + - + UserApiModule->ServerTestModule - - + + - + UserLoginMigrationApiModule->ServerModule - - + + - + UserLoginMigrationApiModule->ServerTestModule - - + + - + VideoConferenceApiModule->ServerModule - - + + - + VideoConferenceApiModule->ServerTestModule - - + + - + SharingModule->SharingApiModule - - + + - + ShareTokenService - -ShareTokenService + +ShareTokenService - + SharingModule->ShareTokenService - - + + - + ShareTokenUC - -ShareTokenUC + +ShareTokenUC - + ShareTokenUC->SharingApiModule - - + + - + ShareTokenRepo - -ShareTokenRepo + +ShareTokenRepo - + ShareTokenRepo->SharingModule - - + + - + ShareTokenService - -ShareTokenService + +ShareTokenService - + ShareTokenService->SharingModule - - + + - + TokenGenerator - -TokenGenerator + +TokenGenerator - + TokenGenerator->SharingModule - - + + - + SystemUc - -SystemUc + +SystemUc - + SystemUc->SystemApiModule - - + + - + SystemOidcService - -SystemOidcService + +SystemOidcService - + SystemOidcService->SystemModule - - + + - + SystemService - -SystemService + +SystemService - + SystemService->SystemModule - - + + - + SubmissionUc - -SubmissionUc + +SubmissionUc - + SubmissionUc->TaskApiModule - - + + - + TaskCopyUC - -TaskCopyUC + +TaskCopyUC - + TaskCopyUC->TaskApiModule - - + + - + TaskUC - -TaskUC + +TaskUC - + TaskUC->TaskApiModule - - + + - + SubmissionService - -SubmissionService + +SubmissionService - + SubmissionService->TaskModule - - + + - + TaskCopyService - -TaskCopyService + +TaskCopyService - + TaskCopyService->TaskModule - - + + - + TaskService - -TaskService + +TaskService - + TaskService->TaskModule - - + + - + TeamsModule->TeamsApiModule - - + + - + TeamService - -TeamService + +TeamService - + TeamsModule->TeamService - - + + - + TeamService - -TeamService + +TeamService - + TeamService->TeamsModule - - + + - + ContextExternalToolUc - -ContextExternalToolUc + +ContextExternalToolUc - + ContextExternalToolUc->ToolApiModule - - + + - + ExternalToolConfigurationUc - -ExternalToolConfigurationUc + +ExternalToolConfigurationUc - + ExternalToolConfigurationUc->ToolApiModule - - + + - + ExternalToolRequestMapper - -ExternalToolRequestMapper + +ExternalToolRequestMapper - + ExternalToolRequestMapper->ToolApiModule - - + + - + ExternalToolResponseMapper - -ExternalToolResponseMapper + +ExternalToolResponseMapper - + ExternalToolResponseMapper->ToolApiModule - - + + - + ExternalToolUc - -ExternalToolUc + +ExternalToolUc - + ExternalToolUc->ToolApiModule - - + + - + SchoolExternalToolRequestMapper - -SchoolExternalToolRequestMapper + +SchoolExternalToolRequestMapper - + SchoolExternalToolRequestMapper->ToolApiModule - - + + - + SchoolExternalToolResponseMapper - -SchoolExternalToolResponseMapper + +SchoolExternalToolResponseMapper - + SchoolExternalToolResponseMapper->ToolApiModule - - + + - + SchoolExternalToolUc - -SchoolExternalToolUc + +SchoolExternalToolUc - + SchoolExternalToolUc->ToolApiModule - - + + - + ToolLaunchUc - -ToolLaunchUc + +ToolLaunchUc - + ToolLaunchUc->ToolApiModule - - + + - + ToolPermissionHelper - -ToolPermissionHelper + +ToolPermissionHelper - + ToolPermissionHelper->ToolApiModule - - + + - + ToolReferenceUc - -ToolReferenceUc + +ToolReferenceUc - + ToolReferenceUc->ToolApiModule - - + + - + ToolLaunchModule->ToolModule - - + + - + ToolLaunchService - -ToolLaunchService + +ToolLaunchService - + ToolLaunchModule->ToolLaunchService - - + + - + BasicToolLaunchStrategy - -BasicToolLaunchStrategy + +BasicToolLaunchStrategy - + BasicToolLaunchStrategy->ToolLaunchModule - - + + - + Lti11EncryptionService - -Lti11EncryptionService + +Lti11EncryptionService - + Lti11EncryptionService->ToolLaunchModule - - + + - + Lti11ToolLaunchStrategy - -Lti11ToolLaunchStrategy + +Lti11ToolLaunchStrategy - + Lti11ToolLaunchStrategy->ToolLaunchModule - - + + - + OAuth2ToolLaunchStrategy - -OAuth2ToolLaunchStrategy + +OAuth2ToolLaunchStrategy - + OAuth2ToolLaunchStrategy->ToolLaunchModule - - + + - + ToolLaunchService - -ToolLaunchService + +ToolLaunchService - + ToolLaunchService->ToolLaunchModule - - + + - + UserUc - -UserUc + +UserUc - + UserUc->UserApiModule - - + + - + CloseUserLoginMigrationUc - -CloseUserLoginMigrationUc + +CloseUserLoginMigrationUc - + CloseUserLoginMigrationUc->UserLoginMigrationApiModule - - + + - + PageContentMapper - -PageContentMapper + +PageContentMapper - + PageContentMapper->UserLoginMigrationApiModule - - + + - + RestartUserLoginMigrationUc - -RestartUserLoginMigrationUc + +RestartUserLoginMigrationUc - + RestartUserLoginMigrationUc->UserLoginMigrationApiModule - - + + - + StartUserLoginMigrationUc - -StartUserLoginMigrationUc + +StartUserLoginMigrationUc - + StartUserLoginMigrationUc->UserLoginMigrationApiModule - - + + - + ToggleUserLoginMigrationUc - -ToggleUserLoginMigrationUc + +ToggleUserLoginMigrationUc - + ToggleUserLoginMigrationUc->UserLoginMigrationApiModule - - + + - + UserLoginMigrationUc - -UserLoginMigrationUc + +UserLoginMigrationUc - + UserLoginMigrationUc->UserLoginMigrationApiModule - - + + - + MigrationCheckService - -MigrationCheckService + +MigrationCheckService - + MigrationCheckService->UserLoginMigrationModule - - + + - + SchoolMigrationService - -SchoolMigrationService + +SchoolMigrationService - + SchoolMigrationService->UserLoginMigrationModule - - + + - + UserLoginMigrationRepo - -UserLoginMigrationRepo + +UserLoginMigrationRepo - + UserLoginMigrationRepo->UserLoginMigrationModule - - + + - + UserLoginMigrationRevertService - -UserLoginMigrationRevertService + +UserLoginMigrationRevertService - + UserLoginMigrationRevertService->UserLoginMigrationModule - - + + - + UserLoginMigrationService - -UserLoginMigrationService + +UserLoginMigrationService - + UserLoginMigrationService->UserLoginMigrationModule - - + + - + UserMigrationService - -UserMigrationService + +UserMigrationService - + UserMigrationService->UserLoginMigrationModule - - + + - + UserDORepo - -UserDORepo + +UserDORepo - + UserDORepo->UserModule - - + + - + UserService - -UserService + +UserService - + UserService->UserModule - - + + - + VideoConferenceModule->VideoConferenceApiModule - - + + - + BBBService - -BBBService + +BBBService - + VideoConferenceModule->BBBService - - + + - + VideoConferenceService - -VideoConferenceService + +VideoConferenceService - + VideoConferenceModule->VideoConferenceService - - + + - + VideoConferenceCreateUc - -VideoConferenceCreateUc + +VideoConferenceCreateUc - + VideoConferenceCreateUc->VideoConferenceApiModule - - + + - + VideoConferenceEndUc - -VideoConferenceEndUc + +VideoConferenceEndUc - + VideoConferenceEndUc->VideoConferenceApiModule - - + + - + VideoConferenceInfoUc - -VideoConferenceInfoUc + +VideoConferenceInfoUc - + VideoConferenceInfoUc->VideoConferenceApiModule - - + + - + VideoConferenceJoinUc - -VideoConferenceJoinUc + +VideoConferenceJoinUc - + VideoConferenceJoinUc->VideoConferenceApiModule - - + + - + BBBService - -BBBService + +BBBService - + BBBService->VideoConferenceModule - - + + - + ConverterUtil - -ConverterUtil + +ConverterUtil - + ConverterUtil->VideoConferenceModule - - + + - + VideoConferenceDeprecatedUc - -VideoConferenceDeprecatedUc + +VideoConferenceDeprecatedUc - + VideoConferenceDeprecatedUc->VideoConferenceModule - - + + - + VideoConferenceRepo - -VideoConferenceRepo + +VideoConferenceRepo - + VideoConferenceRepo->VideoConferenceModule - - + + - + VideoConferenceService - -VideoConferenceService + +VideoConferenceService - + VideoConferenceService->VideoConferenceModule - - + + diff --git a/injectables/FilesStorageConsumer.html b/injectables/FilesStorageConsumer.html index 6c7016ec9fe..201c45b0b02 100644 --- a/injectables/FilesStorageConsumer.html +++ b/injectables/FilesStorageConsumer.html @@ -123,12 +123,12 @@

          Constructor

          -constructor(filesStorageService: FilesStorageService, logger: LegacyLogger, orm: MikroORM) +constructor(filesStorageService: FilesStorageService, previewService: PreviewService, logger: LegacyLogger, orm: MikroORM) - + @@ -156,6 +156,18 @@

          Constructor

          No + + + previewService + + + PreviewService + + + + No + + logger @@ -227,8 +239,8 @@

          - + @@ -306,8 +318,8 @@

          - + @@ -385,8 +397,8 @@

          - + @@ -447,12 +459,14 @@

          import { FilesStorageEvents, FilesStorageExchange, ICopyFileDO, IFileDO } from '@src/shared/infra/rabbitmq'; import { FilesStorageMapper } from '../mapper'; import { FilesStorageService } from '../service/files-storage.service'; +import { PreviewService } from '../service/preview.service'; import { CopyFilesOfParentPayload, FileRecordParams } from './dto'; @Injectable() export class FilesStorageConsumer { constructor( private readonly filesStorageService: FilesStorageService, + private readonly previewService: PreviewService, private logger: LegacyLogger, // eslint-disable-next-line @typescript-eslint/no-unused-vars private readonly orm: MikroORM // don't remove it, we need it for @UseRequestContext @@ -501,7 +515,11 @@

          public async deleteFilesOfParent(@RabbitPayload() payload: EntityId): Promise<RpcMessage<IFileDO[]>> { this.logger.debug({ action: 'deleteFilesOfParent', payload }); - const [fileRecords, total] = await this.filesStorageService.deleteFilesOfParent(payload); + const [fileRecords, total] = await this.filesStorageService.getFileRecordsOfParent(payload); + + await this.previewService.deletePreviews(fileRecords); + await this.filesStorageService.deleteFilesOfParent(fileRecords); + const response = FilesStorageMapper.mapToFileRecordListResponse(fileRecords, total); return { message: response.data }; diff --git a/injectables/FilesStorageProducer.html b/injectables/FilesStorageProducer.html index e7a1b3f1b02..69e97cc1948 100644 --- a/injectables/FilesStorageProducer.html +++ b/injectables/FilesStorageProducer.html @@ -69,28 +69,18 @@

          File

          +

          +

          Extends

          +

          +

          + RpcMessageProducer +

          Index

          - - - - - - @@ -138,12 +133,12 @@

          Constructor

          @@ -161,10 +156,10 @@

          Constructor

          - + - + @@ -254,9 +249,9 @@

          - +
          -
          Properties
          -
          -
            -
          • - Private - Readonly - timeout -
          • -
          -
          @@ -100,18 +90,10 @@
          Methods
          -constructor(logger: LegacyLogger, amqpConnection: AmqpConnection, configService: ConfigService) +constructor(amqpConnection: AmqpConnection, logger: LegacyLogger, configService: ConfigService)
          - +
          loggeramqpConnection - LegacyLogger + AmqpConnection @@ -173,10 +168,10 @@

          Constructor

          amqpConnectionlogger - AmqpConnection + LegacyLogger @@ -214,26 +209,26 @@

          - + - Private - checkError - + Async + copyFilesOfParent +
          - checkError(response: RpcMessage<>) + copyFilesOfParent(payload: ICopyFilesOfParentParams)
          - +
          responsepayload - RpcMessage<> + ICopyFilesOfParentParams @@ -269,7 +264,7 @@

          - Returns : void + Returns : Promise<ICopyFileDO[]>
          @@ -283,26 +278,26 @@

          - + Async - copyFilesOfParent - + deleteFilesOfParent + - copyFilesOfParent(payload: ICopyFilesOfParentParams) + deleteFilesOfParent(payload: EntityId) - + @@ -325,7 +320,7 @@

          payload - ICopyFilesOfParentParams + EntityId @@ -338,7 +333,7 @@

          - Returns : Promise<ICopyFileDO[]> + Returns : Promise<IFileDO[]>
          @@ -352,26 +347,26 @@

          - + - Private - createRequest - + Async + listFilesOfParent + - createRequest(event: FilesStorageEvents, payload: IFileRecordParams | ICopyFilesOfParentParams | EntityId) + listFilesOfParent(payload: IFileRecordParams) - + @@ -391,22 +386,10 @@

          - - event - - FilesStorageEvents - - - - No - - - - payload - IFileRecordParams | ICopyFilesOfParentParams | EntityId + IFileRecordParams @@ -419,7 +402,7 @@

          @@ -433,29 +416,43 @@

          - + - Async - deleteFilesOfParent - + Protected + checkError + - deleteFilesOfParent(payload: EntityId) + checkError(response: RpcMessage<T>) - +
          Inherited from RpcMessageProducer +
          + + + + + + + + Type parameters : +
            +
          • T
          • +
          + + @@ -473,9 +470,9 @@

          - payload + response - EntityId + RpcMessage<T> @@ -488,7 +485,7 @@

          - Returns : Promise<IFileDO[]> + Returns : void
          @@ -502,26 +499,32 @@

          - + - Async - listFilesOfParent - + Protected + createRequest + - listFilesOfParent(payload: IFileRecordParams) + createRequest(event: string, payload) - +
          Inherited from RpcMessageProducer +
          + + + + + @@ -541,10 +544,21 @@

          + + event + + string + + + + No + + + + payload - IFileRecordParams @@ -557,7 +571,7 @@

          - Returns : Promise<IFileDO[]> + Returns : { exchange: string; routingKey: string; payload: unknown; timeout: number; }
          @@ -567,43 +581,99 @@

          -

          -
          - -

          - Properties -

          - - + + + + + + + + + + - - - - - + + +
          - + - Private - Readonly - timeout - + Protected + Async + request +
          - Type : number +
          + + request(event: string, payload) +
          +
          Inherited from RpcMessageProducer +
          +
          + +
          - Default value : 0 -
          - + Type parameters : +
            +
          • T
          • +
          +
          + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          NameTypeOptional
          event + string + + No +
          payload + + No +
          +
          +
          + Returns : unknown + +
          +
          + +
          +
          @@ -616,7 +686,6 @@

          import { Injectable } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { EntityId } from '@shared/domain'; -import { RpcMessage } from '@shared/infra/rabbitmq/rpc-message'; import { LegacyLogger } from '@src/core/logger'; import { FilesStorageEvents, @@ -625,76 +694,46 @@

          ICopyFilesOfParentParams, IFileDO, IFileRecordParams, + RpcMessageProducer, } from '@src/shared/infra/rabbitmq'; import { IFilesStorageClientConfig } from '../interfaces'; -import { ErrorMapper } from '../mapper/error.mapper'; @Injectable() -export class FilesStorageProducer { - private readonly timeout = 0; - +export class FilesStorageProducer extends RpcMessageProducer { constructor( + protected readonly amqpConnection: AmqpConnection, private readonly logger: LegacyLogger, - private readonly amqpConnection: AmqpConnection, - private readonly configService: ConfigService<IFilesStorageClientConfig, true> + protected readonly configService: ConfigService<IFilesStorageClientConfig, true> ) { + super(amqpConnection, FilesStorageExchange, configService.get('INCOMING_REQUEST_TIMEOUT_COPY_API')); this.logger.setContext(FilesStorageProducer.name); - this.timeout = this.configService.get('INCOMING_REQUEST_TIMEOUT_COPY_API'); } async copyFilesOfParent(payload: ICopyFilesOfParentParams): Promise<ICopyFileDO[]> { this.logger.debug({ action: 'copyFilesOfParent:started', payload }); - const response = await this.amqpConnection.request<RpcMessage<ICopyFileDO[]>>( - this.createRequest(FilesStorageEvents.COPY_FILES_OF_PARENT, payload) - ); + const response = await this.request<ICopyFileDO[]>(FilesStorageEvents.COPY_FILES_OF_PARENT, payload); this.logger.debug({ action: 'copyFilesOfParent:finished', payload }); - this.checkError(response); - return response.message || []; + return response; } async listFilesOfParent(payload: IFileRecordParams): Promise<IFileDO[]> { this.logger.debug({ action: 'listFilesOfParent:started', payload }); - const response = await this.amqpConnection.request<RpcMessage<IFileDO[]>>( - this.createRequest(FilesStorageEvents.LIST_FILES_OF_PARENT, payload) - ); + const response = await this.request<IFileDO[]>(FilesStorageEvents.LIST_FILES_OF_PARENT, payload); this.logger.debug({ action: 'listFilesOfParent:finished', payload }); - this.checkError(response); - return response.message || []; + return response; } async deleteFilesOfParent(payload: EntityId): Promise<IFileDO[]> { this.logger.debug({ action: 'deleteFilesOfParent:started', payload }); - const response = await this.amqpConnection.request<RpcMessage<IFileDO[]>>( - this.createRequest(FilesStorageEvents.DELETE_FILES_OF_PARENT, payload) - ); + const response = await this.request<IFileDO[]>(FilesStorageEvents.DELETE_FILES_OF_PARENT, payload); this.logger.debug({ action: 'deleteFilesOfParent:finished', payload }); - this.checkError(response); - return response.message || []; - } - - // need to be fixed with https://ticketsystem.dbildungscloud.de/browse/BC-2984 - // mapRpcErrorResponseToDomainError should also removed with this ticket - private checkError(response: RpcMessage<unknown>) { - const { error } = response; - if (error) { - const domainError = ErrorMapper.mapRpcErrorResponseToDomainError(error); - throw domainError; - } - } - - private createRequest(event: FilesStorageEvents, payload: IFileRecordParams | ICopyFilesOfParentParams | EntityId) { - return { - exchange: FilesStorageExchange, - routingKey: event, - payload, - timeout: this.timeout, - }; + return response; } } diff --git a/injectables/FilesStorageService.html b/injectables/FilesStorageService.html index 899ed852804..9ed10562ede 100644 --- a/injectables/FilesStorageService.html +++ b/injectables/FilesStorageService.html @@ -89,7 +89,7 @@

          Methods
          checkDuplicatedNames
        • - Private + Public checkFileName
        • @@ -449,7 +449,7 @@

          - Private + Public checkFileName @@ -616,8 +616,8 @@

          - + @@ -710,8 +710,8 @@

          - + @@ -804,8 +804,8 @@

          - + @@ -898,8 +898,8 @@

          - + @@ -1370,7 +1370,7 @@

          - deleteFilesOfParent(parentId: EntityId) + deleteFilesOfParent(fileRecords: FileRecord[]) @@ -1399,9 +1399,9 @@

          - parentId + fileRecords - EntityId + FileRecord[] @@ -1414,7 +1414,7 @@

          - Returns : Promise<Counted<FileRecord[]>> + Returns : Promise<void>
          @@ -2346,8 +2346,8 @@

          - + @@ -2416,8 +2416,8 @@

          - + @@ -2486,8 +2486,8 @@

          - + @@ -2556,8 +2556,8 @@

          - + @@ -2696,8 +2696,8 @@

          - + @@ -3240,7 +3240,7 @@

          } // download - private checkFileName(fileRecord: FileRecord, params: DownloadFileParams): void | NotFoundException { + public checkFileName(fileRecord: FileRecord, params: DownloadFileParams): void | NotFoundException { if (!fileRecord.hasName(params.fileName)) { this.logger.debug(`could not find file with id: ${fileRecord.id} by filename`); throw new NotFoundException(ErrorType.FILE_NOT_FOUND); @@ -3300,14 +3300,10 @@

          await this.deleteWithRollbackByError(fileRecords); } - public async deleteFilesOfParent(parentId: EntityId): Promise<Counted<FileRecord[]>> { - const [fileRecords, count] = await this.getFileRecordsOfParent(parentId); - - if (count > 0) { + public async deleteFilesOfParent(fileRecords: FileRecord[]): Promise<void> { + if (fileRecords.length > 0) { await this.delete(fileRecords); } - - return [fileRecords, count]; } // restore diff --git a/injectables/FilesStorageUC.html b/injectables/FilesStorageUC.html index ea17af66836..2e3a62ff857 100644 --- a/injectables/FilesStorageUC.html +++ b/injectables/FilesStorageUC.html @@ -412,8 +412,8 @@

          - + @@ -506,8 +506,8 @@

          - + @@ -600,8 +600,8 @@

          - + @@ -682,8 +682,8 @@

          - + @@ -1034,8 +1034,8 @@

          - + @@ -1182,8 +1182,8 @@

          - + @@ -1276,8 +1276,8 @@

          - + @@ -1358,8 +1358,8 @@

          - + @@ -1440,8 +1440,8 @@

          - + @@ -1774,12 +1774,12 @@

          -
          import { HttpService } from '@nestjs/axios';
          +        
          import { AuthorizationContext } from '@modules/authorization';
          +import { AuthorizationReferenceService } from '@modules/authorization/domain';
          +import { HttpService } from '@nestjs/axios';
           import { Injectable, NotFoundException } from '@nestjs/common';
           import { Counted, EntityId } from '@shared/domain';
           import { LegacyLogger } from '@src/core/logger';
          -import { AuthorizationContext } from '@modules/authorization';
          -import { AuthorizationReferenceService } from '@modules/authorization/domain';
           import { AxiosRequestConfig, AxiosResponse } from 'axios';
           import busboy from 'busboy';
           import { Request } from 'express';
          @@ -1930,7 +1930,9 @@ 

          await this.checkPermission(userId, parentType, parentId, FileStorageAuthorizationContext.read); - const result = this.previewService.getPreview(fileRecord, params, previewParams, bytesRange); + this.filesStorageService.checkFileName(fileRecord, params); + + const result = this.previewService.download(fileRecord, previewParams, bytesRange); return result; } @@ -1938,8 +1940,9 @@

          // delete public async deleteFilesOfParent(userId: EntityId, params: FileRecordParams): Promise<Counted<FileRecord[]>> { await this.checkPermission(userId, params.parentType, params.parentId, FileStorageAuthorizationContext.delete); - const [fileRecords, count] = await this.filesStorageService.deleteFilesOfParent(params.parentId); + const [fileRecords, count] = await this.filesStorageService.getFileRecordsOfParent(params.parentId); await this.previewService.deletePreviews(fileRecords); + await this.filesStorageService.deleteFilesOfParent(fileRecords); return [fileRecords, count]; } @@ -1949,8 +1952,8 @@

          const { parentType, parentId } = fileRecord.getParentInfo(); await this.checkPermission(userId, parentType, parentId, FileStorageAuthorizationContext.delete); - await this.filesStorageService.delete([fileRecord]); await this.previewService.deletePreviews([fileRecord]); + await this.filesStorageService.delete([fileRecord]); return fileRecord; } diff --git a/injectables/PreviewGeneratorConsumer.html b/injectables/PreviewGeneratorConsumer.html new file mode 100644 index 00000000000..7c2dfe016bc --- /dev/null +++ b/injectables/PreviewGeneratorConsumer.html @@ -0,0 +1,357 @@ + + + + + + schulcloud-server documentation + + + + + + + + + + + + + +
          +
          + + +
          +
          + + + + + + + + + + + + +
          +
          +

          +

          File

          +

          +

          + apps/server/src/shared/infra/preview-generator/preview-generator.consumer.ts +

          + + + + + +
          +

          Index

          + + + + + + + + + + + + + + + +
          +
          Methods
          +
          + +
          +
          + +
          +

          Constructor

          + + + + + + + + + + + + + +
          +constructor(previewGeneratorService: PreviewGeneratorService, logger: Logger) +
          + +
          +
          + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + +
          NameTypeOptional
          previewGeneratorService + PreviewGeneratorService + + No +
          logger + Logger + + No +
          +
          +
          +
          + +
          + +

          + Methods +

          + + + + + + + + + + + + + + + + + + + + + + +
          + + + + Public + Async + generatePreview + + +
          + + generatePreview(payload: PreviewFileOptions) +
          + Decorators : +
          + @RabbitRPC({exchange: FilesPreviewExchange, routingKey: undefined, queue: undefined})
          +
          + +
          + +
          + Parameters : + + + + + + + + + + + + + + + + + + + +
          NameTypeOptional
          payload + PreviewFileOptions + + No +
          +
          +
          + Returns : unknown + +
          +
          + +
          +
          +
          + +
          + + +
          +
          import { RabbitPayload, RabbitRPC } from '@golevelup/nestjs-rabbitmq';
          +import { Injectable } from '@nestjs/common';
          +import { Logger } from '@src/core/logger';
          +import { FilesPreviewEvents, FilesPreviewExchange } from '@src/shared/infra/rabbitmq';
          +import { PreviewFileOptions } from './interface';
          +import { PreviewActionsLoggable } from './loggable/preview-actions.loggable';
          +import { PreviewGeneratorService } from './preview-generator.service';
          +
          +@Injectable()
          +export class PreviewGeneratorConsumer {
          +	constructor(private readonly previewGeneratorService: PreviewGeneratorService, private logger: Logger) {
          +		this.logger.setContext(PreviewGeneratorConsumer.name);
          +	}
          +
          +	@RabbitRPC({
          +		exchange: FilesPreviewExchange,
          +		routingKey: FilesPreviewEvents.GENERATE_PREVIEW,
          +		queue: FilesPreviewEvents.GENERATE_PREVIEW,
          +	})
          +	public async generatePreview(@RabbitPayload() payload: PreviewFileOptions) {
          +		this.logger.debug(new PreviewActionsLoggable('PreviewGeneratorConsumer.generatePreview', payload));
          +
          +		const response = await this.previewGeneratorService.generatePreview(payload);
          +
          +		return { message: response };
          +	}
          +}
          +
          +
          + +
          + + + + + + + + + + + + + +
          +
          +

          results matching ""

          +
            +
            +
            +

            No results matching ""

            +
            +
            +
            + +
            +
            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/injectables/PreviewGeneratorService.html b/injectables/PreviewGeneratorService.html new file mode 100644 index 00000000000..89267adef92 --- /dev/null +++ b/injectables/PreviewGeneratorService.html @@ -0,0 +1,584 @@ + + + + + + schulcloud-server documentation + + + + + + + + + + + + + +
            +
            + + +
            +
            + + + + + + + + + + + + +
            +
            +

            +

            File

            +

            +

            + apps/server/src/shared/infra/preview-generator/preview-generator.service.ts +

            + + + + + +
            +

            Index

            + + + + + + + + + + + + + + + + + + + + + +
            +
            Properties
            +
            + +
            +
            Methods
            +
            + +
            +
            + +
            +

            Constructor

            + + + + + + + + + + + + + +
            +constructor(storageClient: S3ClientAdapter, logger: Logger) +
            + +
            +
            + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + +
            NameTypeOptional
            storageClient + S3ClientAdapter + + No +
            logger + Logger + + No +
            +
            +
            +
            + +
            + +

            + Methods +

            + + + + + + + + + + + + + + + + + + + +
            + + + Private + Async + downloadOriginFile + + +
            + + downloadOriginFile(pathToFile: string) +
            + +
            + +
            + Parameters : + + + + + + + + + + + + + + + + + + + +
            NameTypeOptional
            pathToFile + string + + No +
            +
            +
            + Returns : Promise<GetFile> + +
            +
            + +
            +
            + + + + + + + + + + + + + + + + + + + +
            + + + Public + Async + generatePreview + + +
            + + generatePreview(params: PreviewFileOptions) +
            + +
            + +
            + Parameters : + + + + + + + + + + + + + + + + + + + +
            NameTypeOptional
            params + PreviewFileOptions + + No +
            +
            + +
            + +
            +
            + + + + + + + + + + + + + + + + + + + +
            + + + Private + resizeAndConvert + + +
            + + resizeAndConvert(original: GetFile, previewParams: PreviewOptions) +
            + +
            + +
            + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            NameTypeOptional
            original + GetFile + + No +
            previewParams + PreviewOptions + + No +
            +
            +
            + Returns : PassThrough + +
            +
            + +
            +
            +
            +
            + +

            + Properties +

            + + + + + + + + + + + + + + +
            + + + Private + imageMagick + + +
            + Default value : subClass({ imageMagick: '7+' }) +
            + +
            +
            + +
            + + +
            +
            import { Injectable } from '@nestjs/common';
            +import { GetFile, S3ClientAdapter } from '@shared/infra/s3-client';
            +import { Logger } from '@src/core/logger';
            +import { subClass } from 'gm';
            +import { PassThrough } from 'stream';
            +import { PreviewFileOptions, PreviewOptions, PreviewResponseMessage } from './interface';
            +import { PreviewActionsLoggable } from './loggable/preview-actions.loggable';
            +import { PreviewGeneratorBuilder } from './preview-generator.builder';
            +
            +@Injectable()
            +export class PreviewGeneratorService {
            +	private imageMagick = subClass({ imageMagick: '7+' });
            +
            +	constructor(private readonly storageClient: S3ClientAdapter, private logger: Logger) {
            +		this.logger.setContext(PreviewGeneratorService.name);
            +	}
            +
            +	public async generatePreview(params: PreviewFileOptions): Promise<PreviewResponseMessage> {
            +		this.logger.debug(new PreviewActionsLoggable('PreviewGeneratorService.generatePreview:start', params));
            +		const { originFilePath, previewFilePath, previewOptions } = params;
            +
            +		const original = await this.downloadOriginFile(originFilePath);
            +		const preview = this.resizeAndConvert(original, previewOptions);
            +
            +		const file = PreviewGeneratorBuilder.buildFile(preview, params.previewOptions);
            +
            +		await this.storageClient.create(previewFilePath, file);
            +
            +		this.logger.debug(new PreviewActionsLoggable('PreviewGeneratorService.generatePreview:end', params));
            +
            +		return {
            +			previewFilePath,
            +			status: true,
            +		};
            +	}
            +
            +	private async downloadOriginFile(pathToFile: string): Promise<GetFile> {
            +		const file = await this.storageClient.get(pathToFile);
            +
            +		return file;
            +	}
            +
            +	private resizeAndConvert(original: GetFile, previewParams: PreviewOptions): PassThrough {
            +		const { format, width } = previewParams;
            +
            +		const preview = this.imageMagick(original.data);
            +
            +		if (width) {
            +			preview.resize(width, undefined, '>');
            +		}
            +
            +		const result = preview.stream(format);
            +
            +		return result;
            +	}
            +}
            +
            +
            + +
            + + + + + + + + + + + + + +
            +
            +

            results matching ""

            +
              +
              +
              +

              No results matching ""

              +
              +
              +
              + +
              +
              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/injectables/PreviewProducer.html b/injectables/PreviewProducer.html new file mode 100644 index 00000000000..fa4ee3cd5f7 --- /dev/null +++ b/injectables/PreviewProducer.html @@ -0,0 +1,645 @@ + + + + + + schulcloud-server documentation + + + + + + + + + + + + + +
              +
              + + +
              +
              + + + + + + + + + + + + +
              +
              +

              +

              File

              +

              +

              + apps/server/src/shared/infra/preview-generator/preview.producer.ts +

              + + + +

              +

              Extends

              +

              +

              + RpcMessageProducer +

              + + +
              +

              Index

              + + + + + + + + + + + + + + + +
              +
              Methods
              +
              + +
              +
              + +
              +

              Constructor

              + + + + + + + + + + + + + +
              +constructor(amqpConnection: AmqpConnection, logger: Logger, configService: ConfigService<PreviewModuleConfig | >) +
              + +
              +
              + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              NameTypeOptional
              amqpConnection + AmqpConnection + + No +
              logger + Logger + + No +
              configService + ConfigService<PreviewModuleConfig | > + + No +
              +
              +
              +
              + +
              + +

              + Methods +

              + + + + + + + + + + + + + + + + + + + +
              + + + Async + generate + + +
              + + generate(payload: PreviewFileOptions) +
              + +
              + +
              + Parameters : + + + + + + + + + + + + + + + + + + + +
              NameTypeOptional
              payload + PreviewFileOptions + + No +
              +
              + +
              + +
              +
              + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + Protected + checkError + + +
              + + checkError(response: RpcMessage<T>) +
              +
              Inherited from RpcMessageProducer +
              +
              + +
              + Type parameters : +
                +
              • T
              • +
              +
              + +
              + Parameters : + + + + + + + + + + + + + + + + + + + +
              NameTypeOptional
              response + RpcMessage<T> + + No +
              +
              +
              + Returns : void + +
              +
              + +
              +
              + + + + + + + + + + + + + + + + + + + + + + +
              + + + Protected + createRequest + + +
              + + createRequest(event: string, payload) +
              +
              Inherited from RpcMessageProducer +
              +
              + +
              + +
              + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              NameTypeOptional
              event + string + + No +
              payload + + No +
              +
              +
              + Returns : { exchange: string; routingKey: string; payload: unknown; timeout: number; } + +
              +
              + +
              +
              + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + Protected + Async + request + + +
              + + request(event: string, payload) +
              +
              Inherited from RpcMessageProducer +
              +
              + +
              + Type parameters : +
                +
              • T
              • +
              +
              + +
              + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              NameTypeOptional
              event + string + + No +
              payload + + No +
              +
              +
              + Returns : unknown + +
              +
              + +
              +
              +
              + +
              + + +
              +
              import { AmqpConnection } from '@golevelup/nestjs-rabbitmq';
              +import { Injectable } from '@nestjs/common';
              +import { ConfigService } from '@nestjs/config';
              +import { FilesPreviewEvents, FilesPreviewExchange, RpcMessageProducer } from '@shared/infra/rabbitmq';
              +import { Logger } from '@src/core/logger';
              +import { PreviewFileOptions, PreviewResponseMessage } from './interface';
              +import { PreviewModuleConfig } from './interface/preview-consumer-config';
              +import { PreviewActionsLoggable } from './loggable/preview-actions.loggable';
              +
              +@Injectable()
              +export class PreviewProducer extends RpcMessageProducer {
              +	constructor(
              +		protected readonly amqpConnection: AmqpConnection,
              +		private readonly logger: Logger,
              +		protected readonly configService: ConfigService<PreviewModuleConfig, true>
              +	) {
              +		const timeout = configService.get<number>('INCOMING_REQUEST_TIMEOUT');
              +
              +		super(amqpConnection, FilesPreviewExchange, timeout);
              +		this.logger.setContext(PreviewProducer.name);
              +	}
              +
              +	async generate(payload: PreviewFileOptions): Promise<PreviewResponseMessage> {
              +		this.logger.debug(new PreviewActionsLoggable('PreviewProducer.generate:started', payload));
              +		const response = await this.request<PreviewResponseMessage>(FilesPreviewEvents.GENERATE_PREVIEW, payload);
              +
              +		this.logger.debug(new PreviewActionsLoggable('PreviewProducer.generate:finished', payload));
              +
              +		return response;
              +	}
              +}
              +
              +
              + +
              + + + + + + + + + + + + + +
              +
              +

              results matching ""

              +
                +
                +
                +

                No results matching ""

                +
                +
                +
                + +
                +
                + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/injectables/PreviewService.html b/injectables/PreviewService.html index a32ed714937..b3e58b13bbd 100644 --- a/injectables/PreviewService.html +++ b/injectables/PreviewService.html @@ -94,32 +94,20 @@

                Methods
                deletePreviews

              • - Private + Public Async - generatePreview + download
              • Private - getFormat -
              • -
              • - Public Async - getPreview + generatePreview
              • Private Async getPreviewFile
              • -
              • - Private - getPreviewName -
              • -
              • - Private - resizeAndConvert -
              • Private Async @@ -143,12 +131,12 @@

                Constructor

                -constructor(storageClient: S3ClientAdapter, fileStorageService: FilesStorageService, logger: LegacyLogger) +constructor(storageClient: S3ClientAdapter, logger: LegacyLogger, previewProducer: PreviewProducer) - + @@ -178,10 +166,10 @@

                Constructor

                - fileStorageService + logger - FilesStorageService + LegacyLogger @@ -190,10 +178,10 @@

                Constructor

                - logger + previewProducer - LegacyLogger + PreviewProducer @@ -237,8 +225,8 @@

                - + @@ -307,8 +295,8 @@

                - + @@ -358,166 +346,27 @@

                - - - Private - Async - generatePreview - - - - - - - - generatePreview(params: PreviewFileParams) - - - - - - - - - - - - - - -
                - Parameters : - - - - - - - - - - - - - - - - - - - -
                NameTypeOptional
                params - PreviewFileParams - - No -
                -
                -
                - Returns : Promise<GetFileResponse> - -
                -
                - -
                - - - - - - - - - - - - - - - - - - - - - - - -
                - - - Private - getFormat - - -
                - - getFormat(mimeType: string) -
                - -
                - -
                - Parameters : - - - - - - - - - - - - - - - - - - - -
                NameTypeOptional
                mimeType - string - - No -
                -
                -
                - Returns : string - -
                -
                - -
                -
                - - - - @@ -548,18 +397,6 @@

                - -

                - - - - - - @@ -603,27 +440,27 @@

                @@ -659,88 +496,7 @@

                - + Public Async - getPreview - + download +
                - getPreview(fileRecord: FileRecord, downloadParams: DownloadFileParams, previewParams: PreviewParams, bytesRange?: string) + download(fileRecord: FileRecord, previewParams: PreviewParams, bytesRange?: string)
                - +
                downloadParams - DownloadFileParams - - No -
                previewParams
                - + Private Async - getPreviewFile - + generatePreview +
                - getPreviewFile(params: PreviewFileParams) + generatePreview(params: PreviewFileParams)
                - +
                - Returns : Promise<GetFileResponse> - -
                -
                - -
                - - - - - - - - - - - - - - - - - - - - - @@ -794,33 +551,9 @@

                - - - - - - - - - - - - - - - - - +
                - - - Private - getPreviewName - - -
                - - getPreviewName(fileRecord: FileRecord, outputFormat?: PreviewOutputMimeTypes) -
                - -
                - -
                - Parameters : - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                NameTypeOptional
                fileRecord - FileRecord - - No -
                outputFormat - PreviewOutputMimeTypes - - Yes -
                -
                -
                - Returns : string + Returns : Promise<void>
                @@ -754,26 +510,27 @@

                - + Private - resizeAndConvert - + Async + getPreviewFile +
                - resizeAndConvert(original: GetFileResponse, fileRecord: FileRecord, previewParams: PreviewParams) + getPreviewFile(params: PreviewFileParams)
                - +
                original - GetFileResponse - - No -
                fileRecord - FileRecord - - No -
                previewParamsparams - PreviewParams + PreviewFileParams @@ -833,7 +566,7 @@

                - Returns : PassThrough + Returns : Promise<GetFileResponse>
                @@ -866,8 +599,8 @@

                - + @@ -920,66 +653,47 @@

                import { Inject, Injectable, NotFoundException, UnprocessableEntityException } from '@nestjs/common';
                +import { PreviewProducer } from '@shared/infra/preview-generator';
                 import { S3ClientAdapter } from '@shared/infra/s3-client';
                 import { LegacyLogger } from '@src/core/logger';
                -import { subClass } from 'gm';
                -import { PassThrough } from 'stream';
                -import { DownloadFileParams, PreviewParams } from '../controller/dto';
                +import { PreviewParams } from '../controller/dto';
                 import { FileRecord, PreviewStatus } from '../entity';
                 import { ErrorType } from '../error';
                 import { FILES_STORAGE_S3_CONNECTION } from '../files-storage.config';
                -import { createPreviewDirectoryPath, createPreviewFilePath, createPreviewNameHash } from '../helper';
                +import { createPreviewDirectoryPath, getPreviewName } from '../helper';
                 import { GetFileResponse, PreviewFileParams } from '../interface';
                -import { PreviewOutputMimeTypes } from '../interface/preview-output-mime-types.enum';
                -import { FileDtoBuilder, FileResponseBuilder } from '../mapper';
                -import { FilesStorageService } from './files-storage.service';
                +import { FileResponseBuilder, PreviewBuilder } from '../mapper';
                 
                 @Injectable()
                 export class PreviewService {
                 	constructor(
                 		@Inject(FILES_STORAGE_S3_CONNECTION) private readonly storageClient: S3ClientAdapter,
                -		private readonly fileStorageService: FilesStorageService,
                -		private logger: LegacyLogger
                +		private logger: LegacyLogger,
                +		private readonly previewProducer: PreviewProducer
                 	) {
                 		this.logger.setContext(PreviewService.name);
                 	}
                 
                -	public async getPreview(
                +	public async download(
                 		fileRecord: FileRecord,
                -		downloadParams: DownloadFileParams,
                 		previewParams: PreviewParams,
                 		bytesRange?: string
                 	): Promise<GetFileResponse> {
                 		this.checkIfPreviewPossible(fileRecord);
                 
                -		const hash = createPreviewNameHash(fileRecord.id, previewParams);
                -		const filePath = createPreviewFilePath(fileRecord.getSchoolId(), hash, fileRecord.id);
                +		const previewFileParams = PreviewBuilder.buildParams(fileRecord, previewParams, bytesRange);
                 
                -		let response: GetFileResponse;
                -
                -		const previewFileParams = { fileRecord, downloadParams, previewParams, hash, filePath, bytesRange };
                -
                -		if (previewParams.forceUpdate) {
                -			response = await this.generatePreview(previewFileParams);
                -		} else {
                -			response = await this.tryGetPreviewOrGenerate(previewFileParams);
                -		}
                +		const response = await this.tryGetPreviewOrGenerate(previewFileParams);
                 
                 		return response;
                 	}
                 
                 	public async deletePreviews(fileRecords: FileRecord[]): Promise<void> {
                -		try {
                -			const paths = fileRecords.map((fileRecord) =>
                -				createPreviewDirectoryPath(fileRecord.getSchoolId(), fileRecord.id)
                -			);
                +		const paths = fileRecords.map((fileRecord) => createPreviewDirectoryPath(fileRecord.getSchoolId(), fileRecord.id));
                 
                -			const promises = paths.map((path) => this.storageClient.deleteDirectory(path));
                +		const promises = paths.map((path) => this.storageClient.deleteDirectory(path));
                 
                -			await Promise.all(promises);
                -		} catch (error) {
                -			this.logger.warn(error);
                -		}
                +		await Promise.all(promises);
                 	}
                 
                 	private checkIfPreviewPossible(fileRecord: FileRecord): void | UnprocessableEntityException {
                @@ -993,80 +707,37 @@ 

                let file: GetFileResponse; try { + if (params.previewParams.forceUpdate) { + await this.generatePreview(params); + } + file = await this.getPreviewFile(params); } catch (error) { if (!(error instanceof NotFoundException)) { throw error; } - file = await this.generatePreview(params); + await this.generatePreview(params); + file = await this.getPreviewFile(params); } return file; } private async getPreviewFile(params: PreviewFileParams): Promise<GetFileResponse> { - const { fileRecord, filePath, bytesRange, previewParams } = params; - const name = this.getPreviewName(fileRecord, previewParams.outputFormat); - const file = await this.storageClient.get(filePath, bytesRange); + const { fileRecord, previewFilePath, bytesRange, previewParams } = params; + const name = getPreviewName(fileRecord, previewParams.outputFormat); + const file = await this.storageClient.get(previewFilePath, bytesRange); const response = FileResponseBuilder.build(file, name); return response; } - private async generatePreview(params: PreviewFileParams): Promise<GetFileResponse> { - const { fileRecord, downloadParams, previewParams, hash, filePath, bytesRange } = params; - - const original = await this.fileStorageService.download(fileRecord, downloadParams, bytesRange); - const preview = this.resizeAndConvert(original, fileRecord, previewParams); - - const format = previewParams.outputFormat ?? fileRecord.mimeType; - const fileDto = FileDtoBuilder.build(hash, preview, format); - await this.storageClient.create(filePath, fileDto); - - const response = await this.getPreviewFile(params); - - return response; - } - - private resizeAndConvert( - original: GetFileResponse, - fileRecord: FileRecord, - previewParams: PreviewParams - ): PassThrough { - const mimeType = previewParams.outputFormat ?? fileRecord.mimeType; - const format = this.getFormat(mimeType); - const im = subClass({ imageMagick: '7+' }); - - const preview = im(original.data, fileRecord.name); - const { width } = previewParams; - - if (width) { - preview.resize(width, undefined, '>'); - } - - const result = preview.stream(format); - - return result; - } - - private getFormat(mimeType: string): string { - const format = mimeType.split('/')[1]; - - return format; - } - - private getPreviewName(fileRecord: FileRecord, outputFormat?: PreviewOutputMimeTypes): string { - if (!outputFormat) { - return fileRecord.name; - } - - const fileNameWithoutExtension = fileRecord.name.split('.')[0]; - const format = this.getFormat(outputFormat); - const name = `${fileNameWithoutExtension}.${format}`; + private async generatePreview(params: PreviewFileParams): Promise<void> { + const payload = PreviewBuilder.buildPayload(params); - return name; + await this.previewProducer.generate(payload); } }

                diff --git a/interfaces/CopyFiles.html b/interfaces/CopyFiles.html index c43273070cf..5679b589e5a 100644 --- a/interfaces/CopyFiles.html +++ b/interfaces/CopyFiles.html @@ -209,7 +209,6 @@

                Properties

                export interface File { data: Readable; - name: string; mimeType: string; }
                diff --git a/interfaces/File.html b/interfaces/File.html index ab79d773e4f..5a01f5008af 100644 --- a/interfaces/File.html +++ b/interfaces/File.html @@ -101,12 +101,6 @@
                Properties
                mimeType

              • -
              • - - name - -
              • @@ -182,39 +176,6 @@

                Properties

                - - - - - - - - - - - - - - - - - - - -
                - - name - - - - -
                - name: string - -
                - Type : string - -

                @@ -248,7 +209,6 @@

                Properties

                export interface File { data: Readable; - name: string; mimeType: string; }
                diff --git a/interfaces/GetFile.html b/interfaces/GetFile.html index d76a2596b81..db4c12463fb 100644 --- a/interfaces/GetFile.html +++ b/interfaces/GetFile.html @@ -350,7 +350,6 @@

                Properties

                export interface File { data: Readable; - name: string; mimeType: string; } diff --git a/interfaces/GetFileResponse.html b/interfaces/GetFileResponse.html index a24c9f9f0f3..447b83ffffe 100644 --- a/interfaces/GetFileResponse.html +++ b/interfaces/GetFileResponse.html @@ -364,7 +364,7 @@

                Properties

                import { Readable } from 'stream';
                -import type { DownloadFileParams, PreviewParams } from '../controller/dto';
                +import type { PreviewParams } from '../controller/dto';
                 import { FileRecord } from '../entity';
                 
                 export interface GetFileResponse {
                @@ -378,10 +378,11 @@ 

                Properties

                export interface PreviewFileParams { fileRecord: FileRecord; - downloadParams: DownloadFileParams; previewParams: PreviewParams; hash: string; - filePath: string; + originFilePath: string; + previewFilePath: string; + format: string; bytesRange?: string; }
                diff --git a/interfaces/IError.html b/interfaces/IError.html index 21cdff3f0b9..04ee8c0b08a 100644 --- a/interfaces/IError.html +++ b/interfaces/IError.html @@ -133,7 +133,7 @@

                Properties

                - message: never + message: string @@ -141,7 +141,7 @@

                Properties

                - Type : never + Type : string @@ -197,7 +197,7 @@

                Properties

                export interface IError extends Error {
                 	status?: number;
                -	message: never;
                +	message: string;
                 }
                 export interface RpcMessage<T> {
                 	message: T;
                diff --git a/interfaces/IFileRecordProperties.html b/interfaces/IFileRecordProperties.html
                index 7522d5c21ec..5fc27beff5c 100644
                --- a/interfaces/IFileRecordProperties.html
                +++ b/interfaces/IFileRecordProperties.html
                @@ -472,6 +472,7 @@ 

                Properties

                import { ObjectId } from '@mikro-orm/mongodb'; import { BadRequestException } from '@nestjs/common'; import { BaseEntityWithTimestamps, EntityId } from '@shared/domain'; +import path from 'path'; import { v4 as uuid } from 'uuid'; import { ErrorType } from '../error'; import { PreviewInputMimeTypes } from '../interface/preview-input-mime-types.enum'; @@ -763,6 +764,12 @@

                Properties

                return PreviewStatus.PREVIEW_NOT_POSSIBLE_SCAN_STATUS_ERROR; } + + public get fileNameWithoutExtension(): string { + const filenameObj = path.parse(this.name); + + return filenameObj.name; + } }
                diff --git a/interfaces/IFileRecordSecurityCheckProperties.html b/interfaces/IFileRecordSecurityCheckProperties.html index d9ebc8ede9f..4963d9de701 100644 --- a/interfaces/IFileRecordSecurityCheckProperties.html +++ b/interfaces/IFileRecordSecurityCheckProperties.html @@ -244,6 +244,7 @@

                Properties

                import { ObjectId } from '@mikro-orm/mongodb'; import { BadRequestException } from '@nestjs/common'; import { BaseEntityWithTimestamps, EntityId } from '@shared/domain'; +import path from 'path'; import { v4 as uuid } from 'uuid'; import { ErrorType } from '../error'; import { PreviewInputMimeTypes } from '../interface/preview-input-mime-types.enum'; @@ -535,6 +536,12 @@

                Properties

                return PreviewStatus.PREVIEW_NOT_POSSIBLE_SCAN_STATUS_ERROR; } + + public get fileNameWithoutExtension(): string { + const filenameObj = path.parse(this.name); + + return filenameObj.name; + } }
                diff --git a/interfaces/IFileStorageConfig.html b/interfaces/IFileStorageConfig.html index 48b6eb9e71f..6d9d9258caf 100644 --- a/interfaces/IFileStorageConfig.html +++ b/interfaces/IFileStorageConfig.html @@ -239,13 +239,17 @@

                Properties

                USE_STREAM_TO_ANTIVIRUS: boolean; } -const fileStorageConfig: IFileStorageConfig = { +export const defaultConfig = { + NEST_LOG_LEVEL: Configuration.get('NEST_LOG_LEVEL') as string, INCOMING_REQUEST_TIMEOUT: Configuration.get('FILES_STORAGE__INCOMING_REQUEST_TIMEOUT') as number, +}; + +const fileStorageConfig: IFileStorageConfig = { INCOMING_REQUEST_TIMEOUT_COPY_API: Configuration.get('INCOMING_REQUEST_TIMEOUT_COPY_API') as number, MAX_FILE_SIZE: Configuration.get('FILES_STORAGE__MAX_FILE_SIZE') as number, MAX_SECURITY_CHECK_FILE_SIZE: Configuration.get('FILES_STORAGE__MAX_FILE_SIZE') as number, - NEST_LOG_LEVEL: Configuration.get('NEST_LOG_LEVEL') as string, USE_STREAM_TO_ANTIVIRUS: Configuration.get('FILES_STORAGE__USE_STREAM_TO_ANTIVIRUS') as boolean, + ...defaultConfig, }; // The configurations lookup diff --git a/interfaces/IParentInfo.html b/interfaces/IParentInfo.html index a6d46452b9f..16746289844 100644 --- a/interfaces/IParentInfo.html +++ b/interfaces/IParentInfo.html @@ -226,6 +226,7 @@

                Properties

                import { ObjectId } from '@mikro-orm/mongodb'; import { BadRequestException } from '@nestjs/common'; import { BaseEntityWithTimestamps, EntityId } from '@shared/domain'; +import path from 'path'; import { v4 as uuid } from 'uuid'; import { ErrorType } from '../error'; import { PreviewInputMimeTypes } from '../interface/preview-input-mime-types.enum'; @@ -517,6 +518,12 @@

                Properties

                return PreviewStatus.PREVIEW_NOT_POSSIBLE_SCAN_STATUS_ERROR; } + + public get fileNameWithoutExtension(): string { + const filenameObj = path.parse(this.name); + + return filenameObj.name; + } } diff --git a/interfaces/PreviewConfig.html b/interfaces/PreviewConfig.html new file mode 100644 index 00000000000..8a06ca09aca --- /dev/null +++ b/interfaces/PreviewConfig.html @@ -0,0 +1,266 @@ + + + + + + schulcloud-server documentation + + + + + + + + + + + + + +
                +
                + + +
                +
                + + + + + + + + + + + + + + + + + +
                +
                +

                +

                File

                +

                +

                + apps/server/src/shared/infra/preview-generator/interface/preview-consumer-config.ts +

                + + + + +
                +

                Index

                + + + + + + + + + +
                +
                Properties
                +
                + +
                +
                + + + +
                +

                Properties

                + + + + + + + + + + + + + + + + + + + +
                + + serverConfig + + + + +
                + serverConfig: PreviewModuleConfig + +
                + Type : PreviewModuleConfig + +
                + + + + + + + + + + + + + + + + + + + +
                + + storageConfig + + + + +
                + storageConfig: S3Config + +
                + Type : S3Config + +
                +
                +
                + + +
                +
                import { S3Config } from '@shared/infra/s3-client';
                +
                +export interface PreviewModuleConfig {
                +	NEST_LOG_LEVEL: string;
                +	INCOMING_REQUEST_TIMEOUT: number;
                +}
                +
                +export interface PreviewConfig {
                +	storageConfig: S3Config;
                +	serverConfig: PreviewModuleConfig;
                +}
                +
                +
                +
                + + + + + + + + +
                +
                +

                results matching ""

                +
                  +
                  +
                  +

                  No results matching ""

                  +
                  +
                  +
                  + +
                  +
                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/interfaces/PreviewFileOptions.html b/interfaces/PreviewFileOptions.html new file mode 100644 index 00000000000..dfc07263e2a --- /dev/null +++ b/interfaces/PreviewFileOptions.html @@ -0,0 +1,309 @@ + + + + + + schulcloud-server documentation + + + + + + + + + + + + + +
                  +
                  + + +
                  +
                  + + + + + + + + + + + + + + + + + +
                  +
                  +

                  +

                  File

                  +

                  +

                  + apps/server/src/shared/infra/preview-generator/interface/preview.ts +

                  + + + + +
                  +

                  Index

                  + + + + + + + + + +
                  +
                  Properties
                  +
                  + +
                  +
                  + + + +
                  +

                  Properties

                  + + + + + + + + + + + + + + + + + + + +
                  + + originFilePath + + + + +
                  + originFilePath: string + +
                  + Type : string + +
                  + + + + + + + + + + + + + + + + + + + +
                  + + previewFilePath + + + + +
                  + previewFilePath: string + +
                  + Type : string + +
                  + + + + + + + + + + + + + + + + + + + +
                  + + previewOptions + + + + +
                  + previewOptions: PreviewOptions + +
                  + Type : PreviewOptions + +
                  +
                  +
                  + + +
                  +
                  export interface PreviewOptions {
                  +	format: string;
                  +	width?: number;
                  +}
                  +
                  +export interface PreviewFileOptions {
                  +	originFilePath: string;
                  +	previewFilePath: string;
                  +	previewOptions: PreviewOptions;
                  +}
                  +
                  +export interface PreviewResponseMessage {
                  +	previewFilePath: string;
                  +	status: boolean;
                  +}
                  +
                  +
                  +
                  + + + + + + + + +
                  +
                  +

                  results matching ""

                  +
                    +
                    +
                    +

                    No results matching ""

                    +
                    +
                    +
                    + +
                    +
                    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/interfaces/PreviewFileParams.html b/interfaces/PreviewFileParams.html index ee720492678..858f7c98fb6 100644 --- a/interfaces/PreviewFileParams.html +++ b/interfaces/PreviewFileParams.html @@ -97,27 +97,33 @@
                    Properties
                  • - - downloadParams + fileRecord
                  • - - filePath + format
                  • - - fileRecord + hash
                  • - - hash + originFilePath + +
                  • +
                  • + + previewFilePath
                  • @@ -179,9 +185,9 @@

                    Properties

                    - - downloadParams - + + fileRecord + @@ -189,7 +195,7 @@

                    Properties

                    - downloadParams: DownloadFileParams + fileRecord: FileRecord @@ -197,7 +203,7 @@

                    Properties

                    - Type : DownloadFileParams + Type : FileRecord @@ -212,9 +218,9 @@

                    Properties

                    - - filePath - + + format + @@ -222,7 +228,7 @@

                    Properties

                    - filePath: string + format: string @@ -245,9 +251,9 @@

                    Properties

                    - - fileRecord - + + hash + @@ -255,7 +261,7 @@

                    Properties

                    - fileRecord: FileRecord + hash: string @@ -263,7 +269,7 @@

                    Properties

                    - Type : FileRecord + Type : string @@ -278,9 +284,9 @@

                    Properties

                    - - hash - + + originFilePath + @@ -288,7 +294,40 @@

                    Properties

                    - hash: string + originFilePath: string + + + + + + + + Type : string + + + + + + + + + + + + + + + + + @@ -346,7 +385,7 @@

                    Properties

                    import { Readable } from 'stream';
                    -import type { DownloadFileParams, PreviewParams } from '../controller/dto';
                    +import type { PreviewParams } from '../controller/dto';
                     import { FileRecord } from '../entity';
                     
                     export interface GetFileResponse {
                    @@ -360,10 +399,11 @@ 

                    Properties

                    export interface PreviewFileParams { fileRecord: FileRecord; - downloadParams: DownloadFileParams; previewParams: PreviewParams; hash: string; - filePath: string; + originFilePath: string; + previewFilePath: string; + format: string; bytesRange?: string; }
                    diff --git a/interfaces/PreviewModuleConfig.html b/interfaces/PreviewModuleConfig.html new file mode 100644 index 00000000000..dd7ca73cbc2 --- /dev/null +++ b/interfaces/PreviewModuleConfig.html @@ -0,0 +1,266 @@ + + + + + + schulcloud-server documentation + + + + + + + + + + + + + +
                    +
                    + + +
                    +
                    + + + + + + + + + + + + + + + + + +
                    +
                    +

                    +

                    File

                    +

                    +

                    + apps/server/src/shared/infra/preview-generator/interface/preview-consumer-config.ts +

                    + + + + +
                    +

                    Index

                    +
                    + + previewFilePath + + + + +
                    + previewFilePath: string
                    + + + + + + + + +
                    +
                    Properties
                    +
                    + +
                    + + + + +
                    +

                    Properties

                    + + + + + + + + + + + + + + + + + + + +
                    + + INCOMING_REQUEST_TIMEOUT + + + + +
                    + INCOMING_REQUEST_TIMEOUT: number + +
                    + Type : number + +
                    + + + + + + + + + + + + + + + + + + + +
                    + + NEST_LOG_LEVEL + + + + +
                    + NEST_LOG_LEVEL: string + +
                    + Type : string + +
                    +
                    + + + +
                    +
                    import { S3Config } from '@shared/infra/s3-client';
                    +
                    +export interface PreviewModuleConfig {
                    +	NEST_LOG_LEVEL: string;
                    +	INCOMING_REQUEST_TIMEOUT: number;
                    +}
                    +
                    +export interface PreviewConfig {
                    +	storageConfig: S3Config;
                    +	serverConfig: PreviewModuleConfig;
                    +}
                    +
                    +
                    + + + + + + + + + +
                    +
                    +

                    results matching ""

                    +
                      +
                      +
                      +

                      No results matching ""

                      +
                      +
                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/interfaces/PreviewOptions.html b/interfaces/PreviewOptions.html new file mode 100644 index 00000000000..3adda1a4203 --- /dev/null +++ b/interfaces/PreviewOptions.html @@ -0,0 +1,276 @@ + + + + + + schulcloud-server documentation + + + + + + + + + + + + + +
                      +
                      + + +
                      +
                      + + + + + + + + + + + + + + + + + +
                      +
                      +

                      +

                      File

                      +

                      +

                      + apps/server/src/shared/infra/preview-generator/interface/preview.ts +

                      + + + + +
                      +

                      Index

                      + + + + + + + + + +
                      +
                      Properties
                      +
                      + +
                      +
                      + + + +
                      +

                      Properties

                      + + + + + + + + + + + + + + + + + + + +
                      + + format + + + + +
                      + format: string + +
                      + Type : string + +
                      + + + + + + + + + + + + + + + + + + + + + + +
                      + + width + + + + +
                      + width: number + +
                      + Type : number + +
                      + Optional +
                      +
                      +
                      + + +
                      +
                      export interface PreviewOptions {
                      +	format: string;
                      +	width?: number;
                      +}
                      +
                      +export interface PreviewFileOptions {
                      +	originFilePath: string;
                      +	previewFilePath: string;
                      +	previewOptions: PreviewOptions;
                      +}
                      +
                      +export interface PreviewResponseMessage {
                      +	previewFilePath: string;
                      +	status: boolean;
                      +}
                      +
                      +
                      +
                      + + + + + + + + +
                      +
                      +

                      results matching ""

                      +
                        +
                        +
                        +

                        No results matching ""

                        +
                        +
                        +
                        + +
                        +
                        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/interfaces/PreviewResponseMessage.html b/interfaces/PreviewResponseMessage.html new file mode 100644 index 00000000000..d143d959bc5 --- /dev/null +++ b/interfaces/PreviewResponseMessage.html @@ -0,0 +1,270 @@ + + + + + + schulcloud-server documentation + + + + + + + + + + + + + +
                        +
                        + + +
                        +
                        + + + + + + + + + + + + + + + + + +
                        +
                        +

                        +

                        File

                        +

                        +

                        + apps/server/src/shared/infra/preview-generator/interface/preview.ts +

                        + + + + +
                        +

                        Index

                        + + + + + + + + + +
                        +
                        Properties
                        +
                        + +
                        +
                        + + + +
                        +

                        Properties

                        + + + + + + + + + + + + + + + + + + + +
                        + + previewFilePath + + + + +
                        + previewFilePath: string + +
                        + Type : string + +
                        + + + + + + + + + + + + + + + + + + + +
                        + + status + + + + +
                        + status: boolean + +
                        + Type : boolean + +
                        +
                        +
                        + + +
                        +
                        export interface PreviewOptions {
                        +	format: string;
                        +	width?: number;
                        +}
                        +
                        +export interface PreviewFileOptions {
                        +	originFilePath: string;
                        +	previewFilePath: string;
                        +	previewOptions: PreviewOptions;
                        +}
                        +
                        +export interface PreviewResponseMessage {
                        +	previewFilePath: string;
                        +	status: boolean;
                        +}
                        +
                        +
                        +
                        + + + + + + + + +
                        +
                        +

                        results matching ""

                        +
                          +
                          +
                          +

                          No results matching ""

                          +
                          +
                          +
                          + +
                          +
                          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/interfaces/RpcMessage.html b/interfaces/RpcMessage.html index 56a749b97af..0358b808971 100644 --- a/interfaces/RpcMessage.html +++ b/interfaces/RpcMessage.html @@ -191,7 +191,7 @@

                          Properties

                          export interface IError extends Error {
                           	status?: number;
                          -	message: never;
                          +	message: string;
                           }
                           export interface RpcMessage<T> {
                           	message: T;
                          diff --git a/interfaces/S3Config-1.html b/interfaces/S3Config-1.html
                          index 5b2e5372a5f..0e526898066 100644
                          --- a/interfaces/S3Config-1.html
                          +++ b/interfaces/S3Config-1.html
                          @@ -365,7 +365,6 @@ 

                          Properties

                          export interface File { data: Readable; - name: string; mimeType: string; }
                          diff --git a/js/menu-wc.js b/js/menu-wc.js index 69e5ef03d43..e38985ab5d7 100644 --- a/js/menu-wc.js +++ b/js/menu-wc.js @@ -916,13 +916,13 @@ customElements.define('compodoc-menu', class extends HTMLElement { FilesStorageModule
                        • -