Browse Source

Merge 597c07271d into b3d4297d83

pull/5417/merge
Bernardo Jordão 1 week ago
committed by GitHub
parent
commit
65dd29fb3f
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 7
      apps/api/src/app/import/import-data.dto.ts
  2. 12
      apps/api/src/app/import/import.controller.ts
  3. 25
      apps/api/src/app/import/import.service.ts
  4. 6
      apps/api/src/app/platform/create-platform.dto.ts

7
apps/api/src/app/import/import-data.dto.ts

@ -4,6 +4,7 @@ import { Type } from 'class-transformer';
import { IsArray, IsOptional, ValidateNested } from 'class-validator'; import { IsArray, IsOptional, ValidateNested } from 'class-validator';
import { CreateTagDto } from '../endpoints/tags/create-tag.dto'; import { CreateTagDto } from '../endpoints/tags/create-tag.dto';
import { CreatePlatformDto } from '../platform/create-platform.dto';
import { CreateAccountWithBalancesDto } from './create-account-with-balances.dto'; import { CreateAccountWithBalancesDto } from './create-account-with-balances.dto';
import { CreateAssetProfileWithMarketDataDto } from './create-asset-profile-with-market-data.dto'; import { CreateAssetProfileWithMarketDataDto } from './create-asset-profile-with-market-data.dto';
@ -25,6 +26,12 @@ export class ImportDataDto {
@ValidateNested({ each: true }) @ValidateNested({ each: true })
assetProfiles?: CreateAssetProfileWithMarketDataDto[]; assetProfiles?: CreateAssetProfileWithMarketDataDto[];
@IsArray()
@IsOptional()
@Type(() => CreatePlatformDto)
@ValidateNested({ each: true })
platforms?: CreatePlatformDto[];
@IsArray() @IsArray()
@IsOptional() @IsOptional()
@Type(() => CreateTagDto) @Type(() => CreateTagDto)

12
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,15 +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
);
}
let maxActivitiesToImport = this.configurationService.get( let maxActivitiesToImport = this.configurationService.get(
'MAX_ACTIVITIES_TO_IMPORT' 'MAX_ACTIVITIES_TO_IMPORT'
); );
@ -74,6 +65,7 @@ export class ImportController {
accountsWithBalancesDto: importData.accounts ?? [], accountsWithBalancesDto: importData.accounts ?? [],
activitiesDto: importData.activities, activitiesDto: importData.activities,
assetProfilesWithMarketDataDto: importData.assetProfiles ?? [], assetProfilesWithMarketDataDto: importData.assetProfiles ?? [],
platformsDto: importData.platforms ?? [],
tagsDto: importData.tags ?? [], tagsDto: importData.tags ?? [],
user: this.request.user user: this.request.user
}); });

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

@ -157,6 +157,7 @@ export class ImportService {
assetProfilesWithMarketDataDto, assetProfilesWithMarketDataDto,
isDryRun = false, isDryRun = false,
maxActivitiesToImport, maxActivitiesToImport,
platformsDto,
tagsDto, tagsDto,
user user
}: { }: {
@ -165,6 +166,7 @@ export class ImportService {
assetProfilesWithMarketDataDto: ImportDataDto['assetProfiles']; assetProfilesWithMarketDataDto: ImportDataDto['assetProfiles'];
isDryRun?: boolean; isDryRun?: boolean;
maxActivitiesToImport: number; maxActivitiesToImport: number;
platformsDto: ImportDataDto['platforms'];
tagsDto: ImportDataDto['tags']; tagsDto: ImportDataDto['tags'];
user: UserWithSettings; user: UserWithSettings;
}): Promise<Activity[]> { }): Promise<Activity[]> {
@ -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