Browse Source

move permission check to import service

pull/5417/head
Bernardo Jordão 3 weeks ago
parent
commit
b310dfc385
  1. 23
      apps/api/src/app/import/import.controller.ts
  2. 25
      apps/api/src/app/import/import.service.ts
  3. 6
      apps/api/src/app/platform/create-platform.dto.ts

23
apps/api/src/app/import/import.controller.ts

@ -4,7 +4,7 @@ import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interce
import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor'; import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor';
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { ImportResponse } from '@ghostfolio/common/interfaces'; import { ImportResponse } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { permissions } from '@ghostfolio/common/permissions';
import type { RequestWithUser } from '@ghostfolio/common/types'; import type { RequestWithUser } from '@ghostfolio/common/types';
import { import {
@ -47,26 +47,6 @@ export class ImportController {
): Promise<ImportResponse> { ): Promise<ImportResponse> {
const isDryRun = isDryRunParam === 'true'; const isDryRun = isDryRunParam === 'true';
if (
!hasPermission(this.request.user.permissions, permissions.createAccount)
) {
throw new HttpException(
getReasonPhrase(StatusCodes.FORBIDDEN),
StatusCodes.FORBIDDEN
);
}
if (
importData.platforms &&
importData.platforms.length > 0 &&
!hasPermission(this.request.user.permissions, permissions.createPlatform)
) {
throw new HttpException(
getReasonPhrase(StatusCodes.FORBIDDEN),
StatusCodes.FORBIDDEN
);
}
let maxActivitiesToImport = this.configurationService.get( let maxActivitiesToImport = this.configurationService.get(
'MAX_ACTIVITIES_TO_IMPORT' 'MAX_ACTIVITIES_TO_IMPORT'
); );
@ -86,6 +66,7 @@ export class ImportController {
activitiesDto: importData.activities, activitiesDto: importData.activities,
assetProfilesWithMarketDataDto: importData.assetProfiles ?? [], assetProfilesWithMarketDataDto: importData.assetProfiles ?? [],
tagsDto: importData.tags ?? [], tagsDto: importData.tags ?? [],
platformsDto: importData.platforms ?? [],
user: this.request.user user: this.request.user
}); });

25
apps/api/src/app/import/import.service.ts

@ -158,6 +158,7 @@ export class ImportService {
isDryRun = false, isDryRun = false,
maxActivitiesToImport, maxActivitiesToImport,
tagsDto, tagsDto,
platformsDto,
user user
}: { }: {
accountsWithBalancesDto: ImportDataDto['accounts']; accountsWithBalancesDto: ImportDataDto['accounts'];
@ -166,6 +167,7 @@ export class ImportService {
isDryRun?: boolean; isDryRun?: boolean;
maxActivitiesToImport: number; maxActivitiesToImport: number;
tagsDto: ImportDataDto['tags']; tagsDto: ImportDataDto['tags'];
platformsDto: ImportDataDto['platforms'];
user: UserWithSettings; user: UserWithSettings;
}): Promise<Activity[]> { }): Promise<Activity[]> {
const accountIdMapping: { [oldAccountId: string]: string } = {}; const accountIdMapping: { [oldAccountId: string]: string } = {};
@ -299,6 +301,29 @@ export class ImportService {
} }
} }
if (platformsDto?.length) {
const canCreatePlatform = hasPermission(
user.permissions,
permissions.createPlatform
);
for (const platform of platformsDto) {
const existingPlatform = await this.platformService.getPlatform({
id: platform.id
});
if (!existingPlatform) {
continue;
}
if (!canCreatePlatform) {
throw new Error(
`Insufficient permissions to create platform ("${platform.name}")`
);
}
}
}
if (tagsDto?.length) { if (tagsDto?.length) {
const existingTagsOfUser = await this.tagService.getTagsForUser(user.id); const existingTagsOfUser = await this.tagService.getTagsForUser(user.id);

6
apps/api/src/app/platform/create-platform.dto.ts

@ -1,6 +1,10 @@
import { IsString, IsUrl } from 'class-validator'; import { IsOptional, IsString, IsUrl } from 'class-validator';
export class CreatePlatformDto { export class CreatePlatformDto {
@IsOptional()
@IsString()
id?: string;
@IsString() @IsString()
name: string; name: string;

Loading…
Cancel
Save