Browse Source

Fixe requests

pull/1922/head
Fabio Azevedo (CTW) 2 years ago
parent
commit
6898112b74
  1. 2
      apps/api/src/app/app.module.ts
  2. 6
      apps/api/src/app/platform/create-platform.dto.ts
  3. 4
      apps/api/src/app/platform/platform.controller.ts
  4. 8
      apps/api/src/app/platform/platform.service.ts
  5. 5
      apps/api/src/app/platform/update-platform.dto.ts
  6. 14
      apps/client/src/app/components/platform/create-or-update-platform-dialog/create-or-update-account-platform.component.ts
  7. 4
      apps/client/src/app/components/platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html
  8. 21
      apps/client/src/app/components/platform/create-or-update-platform-dialog/create-or-update-platform-dialog.module.ts
  9. 12
      apps/client/src/app/components/platform/platform.component.html
  10. 42
      apps/client/src/app/components/platform/platform.component.ts
  11. 10
      apps/client/src/app/components/platform/platform.module.ts
  12. 2
      apps/client/src/app/pages/admin/admin-page.module.ts
  13. 23
      apps/client/src/app/services/admin.service.ts
  14. 23
      apps/client/src/app/services/data.service.ts
  15. 16
      libs/common/src/lib/permissions.ts

2
apps/api/src/app/app.module.ts

@ -64,10 +64,10 @@ import { PlatformModule } from './platform/platform.module';
InfoModule,
LogoModule,
OrderModule,
PlatformModule,
PortfolioModule,
PrismaModule,
RedisCacheModule,
PlatformModule,
ScheduleModule.forRoot(),
ServeStaticModule.forRoot({
serveStaticOptions: {

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

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

4
apps/api/src/app/platform/platform.controller.ts

@ -23,7 +23,7 @@ import { UpdatePlatformDto } from './update-platform.dto';
@Controller('platform')
export class PlatformController {
public constructor(
private platformService: PlatformService,
private readonly platformService: PlatformService,
@Inject(REQUEST) private readonly request: RequestWithUser
) {}
@ -96,7 +96,7 @@ export class PlatformController {
StatusCodes.FORBIDDEN
);
}
console.log('id', id);
const originalPlatform = await this.platformService.getPlatform({
id
});

8
apps/api/src/app/platform/platform.service.ts

@ -24,11 +24,13 @@ export class PlatformService {
});
}
public async updatePlatform(params: {
where: Prisma.PlatformWhereUniqueInput;
public async updatePlatform({
data,
where
}: {
data: Prisma.PlatformUpdateInput;
where: Prisma.PlatformWhereUniqueInput;
}): Promise<Platform> {
const { data, where } = params;
return this.prismaService.platform.update({
data,
where

5
apps/api/src/app/platform/update-platform.dto.ts

@ -1,9 +1,8 @@
import { IsOptional, IsString } from 'class-validator';
import { IsString } from 'class-validator';
export class UpdatePlatformDto {
@IsOptional()
@IsString()
id?: string;
id: string;
@IsString()
name: string;

14
apps/client/src/app/components/platform/create-or-update-platform-dialog/create-or-update-account-platform.component.ts

@ -1,9 +1,4 @@
import {
ChangeDetectionStrategy,
Component,
Inject,
OnDestroy
} from '@angular/core';
import { ChangeDetectionStrategy, Component, Inject } from '@angular/core';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { Subject } from 'rxjs';
@ -16,10 +11,7 @@ import { CreateOrUpdatePlatformDialogParams } from './interfaces/interfaces';
styleUrls: ['./create-or-update-platform-dialog.scss'],
templateUrl: 'create-or-update-platform-dialog.html'
})
export class CreateOrUpdatePlatformDialog implements OnDestroy {
public currencies: string[] = [];
public platforms: { id: string; name: string }[];
export class CreateOrUpdatePlatformDialog {
private unsubscribeSubject = new Subject<void>();
public constructor(
@ -27,8 +19,6 @@ export class CreateOrUpdatePlatformDialog implements OnDestroy {
@Inject(MAT_DIALOG_DATA) public data: CreateOrUpdatePlatformDialogParams
) {}
ngOnInit() {}
public onCancel() {
this.dialogRef.close();
}

4
apps/client/src/app/components/platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html

@ -1,4 +1,4 @@
<form #addPlatformtForm="ngForm" class="d-flex flex-column h-100">
<form #addPlatformForm="ngForm" class="d-flex flex-column h-100">
<h1 *ngIf="data.platform.id" i18n mat-dialog-title>Update platform</h1>
<h1 *ngIf="!data.platform.id" i18n mat-dialog-title>Add platform</h1>
<div class="flex-grow-1 py-3" mat-dialog-content>
@ -20,7 +20,7 @@
<button
color="primary"
mat-flat-button
[disabled]="!addPlatformtForm.form.valid"
[disabled]="!addPlatformForm.form.valid"
[mat-dialog-close]="data"
>
<ng-container i18n>Save</ng-container>

21
apps/client/src/app/components/platform/create-or-update-platform-dialog/create-or-update-platform-dialog.module.ts

@ -1,26 +1,9 @@
import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatDialogModule } from '@angular/material/dialog';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { MatSelectModule } from '@angular/material/select';
import { ReactiveFormsModule } from '@angular/forms';
import { CreateOrUpdatePlatformDialog } from './create-or-update-account-platform.component';
@NgModule({
declarations: [CreateOrUpdatePlatformDialog],
imports: [
CommonModule,
FormsModule,
MatButtonModule,
MatCheckboxModule,
MatDialogModule,
MatFormFieldModule,
MatInputModule,
MatSelectModule,
ReactiveFormsModule
]
imports: [ReactiveFormsModule]
})
export class GfCreateOrUpdatePlatformDialogModule {}

12
apps/client/src/app/components/platform/platform.component.html

@ -42,7 +42,7 @@
[tooltip]="element.name"
[url]="element.url"
></gf-symbol-icon>
<span>{{ element.name }} </span>
<span>{{ element.name }}</span>
</td></ng-container
>
@ -87,7 +87,6 @@
</button>
</mat-menu>
</td>
<td *matFooterCellDef class="px-1" mat-footer-cell></td>
</ng-container>
<tr *matHeaderRowDef="displayedColumns" mat-header-row></tr>
@ -96,14 +95,7 @@
</div>
</div>
<div
*ngIf="
!hasImpersonationId &&
hasPermissionToCreatePlatform &&
!user.settings.isRestrictedView
"
class="fab-container"
>
<div *ngIf="hasPermissionToCreatePlatform" class="fab-container">
<a
class="align-items-center d-flex justify-content-center"
color="primary"

42
apps/client/src/app/components/platform/platform.component.ts

@ -11,16 +11,14 @@ import { UpdatePlatformDto } from '@ghostfolio/api/app/platform/update-platform.
import { get } from 'lodash';
import { MatTableDataSource } from '@angular/material/table';
import { ActivatedRoute, Router } from '@angular/router';
import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service';
import { User } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { Platform, Platform as PlatformModel } from '@prisma/client';
import { Subject, takeUntil } from 'rxjs';
import { CreateOrUpdatePlatformDialog } from './create-or-update-platform-dialog/create-or-update-account-platform.component';
import { MatDialog } from '@angular/material/dialog';
import { DeviceDetectorService } from 'ngx-device-detector';
import { DataService } from '@ghostfolio/client/services/data.service';
import { AdminService } from '@ghostfolio/client/services/admin.service';
@Component({
selector: 'gf-platform-overview',
@ -36,22 +34,19 @@ export class AdminPlatformComponent implements OnInit, OnDestroy {
public deviceType: string;
public hasPermissionToCreatePlatform: boolean;
public hasPermissionToDeletePlatform: boolean;
public hasImpersonationId: boolean;
public user: User;
public dataSource: MatTableDataSource<Platform> = new MatTableDataSource();
private unsubscribeSubject = new Subject<void>();
public constructor(
private dataService: DataService,
private changeDetectorRef: ChangeDetectorRef,
private userService: UserService,
private adminService: AdminService,
private deviceService: DeviceDetectorService,
private impersonationStorageService: ImpersonationStorageService,
private dialog: MatDialog,
private route: ActivatedRoute,
private router: Router
private router: Router,
private userService: UserService
) {
this.route.queryParams
.pipe(takeUntil(this.unsubscribeSubject))
@ -75,25 +70,18 @@ export class AdminPlatformComponent implements OnInit, OnDestroy {
public ngOnInit() {
this.deviceType = this.deviceService.getDeviceInfo().deviceType;
this.impersonationStorageService
.onChangeHasImpersonation()
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe((impersonationId) => {
this.hasImpersonationId = !!impersonationId;
});
this.userService.stateChanged
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
const user = state.user;
this.hasPermissionToCreatePlatform = hasPermission(
this.user.permissions,
user.permissions,
permissions.createPlatform
);
this.hasPermissionToCreatePlatform = hasPermission(
this.user.permissions,
this.hasPermissionToDeletePlatform = hasPermission(
user.permissions,
permissions.deletePlatform
);
@ -116,7 +104,7 @@ export class AdminPlatformComponent implements OnInit, OnDestroy {
}
public deletePlatform(aId: string) {
this.dataService
this.adminService
.deletePlatform(aId)
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe({
@ -132,7 +120,7 @@ export class AdminPlatformComponent implements OnInit, OnDestroy {
}
private fetchPlatforms() {
this.dataService
this.adminService
.fetchPlatforms()
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe((platforms) => {
@ -164,7 +152,7 @@ export class AdminPlatformComponent implements OnInit, OnDestroy {
const platform: CreatePlatformDto = data?.platform;
if (platform) {
this.dataService
this.adminService
.postPlatform(platform)
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe({
@ -187,9 +175,9 @@ export class AdminPlatformComponent implements OnInit, OnDestroy {
const dialogRef = this.dialog.open(CreateOrUpdatePlatformDialog, {
data: {
platform: {
id: id,
name: name,
url: url
id,
name,
url
}
},
@ -204,7 +192,7 @@ export class AdminPlatformComponent implements OnInit, OnDestroy {
const platform: UpdatePlatformDto = data?.platform;
if (platform) {
this.dataService
this.adminService
.putPlatform(platform)
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe({

10
apps/client/src/app/components/platform/platform.module.ts

@ -7,19 +7,19 @@ import { MatSortModule } from '@angular/material/sort';
import { MatTableModule } from '@angular/material/table';
import { GfCreateOrUpdatePlatformDialogModule } from './create-or-update-platform-dialog/create-or-update-platform-dialog.module';
import { MatMenuModule } from '@angular/material/menu';
import { GfSymbolIconModule } from '../symbol-icon/symbol-icon.module';
import { GfSymbolIconModule } from '@ghostfolio/client/components/symbol-icon/symbol-icon.module';
@NgModule({
declarations: [AdminPlatformComponent],
imports: [
CommonModule,
RouterModule,
MatButtonModule,
GfSymbolIconModule,
GfCreateOrUpdatePlatformDialogModule,
MatButtonModule,
MatMenuModule,
MatSortModule,
MatTableModule,
MatMenuModule,
GfCreateOrUpdatePlatformDialogModule
RouterModule
],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})

2
apps/client/src/app/pages/admin/admin-page.module.ts

@ -20,8 +20,8 @@ import { AdminPageComponent } from './admin-page.component';
GfAdminJobsModule,
GfAdminMarketDataModule,
GfAdminOverviewModule,
GfAdminUsersModule,
GfAdminPlatformModule,
GfAdminUsersModule,
MatTabsModule
],
providers: [CacheService],

23
apps/client/src/app/services/admin.service.ts

@ -2,6 +2,8 @@ import { HttpClient, HttpParams } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { UpdateAssetProfileDto } from '@ghostfolio/api/app/admin/update-asset-profile.dto';
import { UpdateMarketDataDto } from '@ghostfolio/api/app/admin/update-market-data.dto';
import { CreatePlatformDto } from '@ghostfolio/api/app/platform/create-platform.dto';
import { UpdatePlatformDto } from '@ghostfolio/api/app/platform/update-platform.dto';
import { IDataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces';
import { DATE_FORMAT } from '@ghostfolio/common/helper';
import {
@ -10,7 +12,7 @@ import {
EnhancedSymbolProfile,
UniqueAsset
} from '@ghostfolio/common/interfaces';
import { DataSource, MarketData } from '@prisma/client';
import { DataSource, MarketData, Platform } from '@prisma/client';
import { JobStatus } from 'bull';
import { format, parseISO } from 'date-fns';
import { Observable, map } from 'rxjs';
@ -37,6 +39,10 @@ export class AdminService {
});
}
public deletePlatform(aId: string) {
return this.http.delete<void>(`/api/v1/platform/${aId}`);
}
public deleteProfileData({ dataSource, symbol }: UniqueAsset) {
return this.http.delete<void>(
`/api/v1/admin/profile-data/${dataSource}/${symbol}`
@ -74,6 +80,10 @@ export class AdminService {
});
}
public fetchPlatforms() {
return this.http.get<Platform[]>('/api/v1/platform');
}
public gather7Days() {
return this.http.post<void>('/api/v1/admin/gather', {});
}
@ -138,6 +148,10 @@ export class AdminService {
);
}
public postPlatform(aPlatform: CreatePlatformDto) {
return this.http.post<Platform>(`/api/v1/platform`, aPlatform);
}
public putMarketData({
dataSource,
date,
@ -156,4 +170,11 @@ export class AdminService {
return this.http.put<MarketData>(url, marketData);
}
public putPlatform(aPlatform: UpdatePlatformDto) {
return this.http.put<Platform>(
`/api/v1/platform/${aPlatform.id}`,
aPlatform
);
}
}

23
apps/client/src/app/services/data.service.ts

@ -6,8 +6,6 @@ import { UpdateAccountDto } from '@ghostfolio/api/app/account/update-account.dto
import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto';
import { Activities } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { UpdateOrderDto } from '@ghostfolio/api/app/order/update-order.dto';
import { CreatePlatformDto } from '@ghostfolio/api/app/platform/create-platform.dto';
import { UpdatePlatformDto } from '@ghostfolio/api/app/platform/update-platform.dto';
import { PortfolioPositionDetail } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-position-detail.interface';
import { PortfolioPositions } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-positions.interface';
import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface';
@ -41,7 +39,7 @@ import {
import { filterGlobalPermissions } from '@ghostfolio/common/permissions';
import { AccountWithValue, DateRange, GroupBy } from '@ghostfolio/common/types';
import { translate } from '@ghostfolio/ui/i18n';
import { DataSource, Order as OrderModel, Platform } from '@prisma/client';
import { DataSource, Order as OrderModel } from '@prisma/client';
import { format, parseISO } from 'date-fns';
import { cloneDeep, groupBy, isNumber } from 'lodash';
import { Observable } from 'rxjs';
@ -74,10 +72,6 @@ export class DataService {
return this.http.get<Accounts>('/api/v1/account');
}
public fetchPlatforms() {
return this.http.get<Platform[]>('/api/v1/platform');
}
public fetchActivities({
filters
}: {
@ -152,10 +146,6 @@ export class DataService {
return this.http.delete<any>(`/api/v1/account/${aId}`);
}
public deletePlatform(aId: string) {
return this.http.delete<any>(`/api/v1/platform/${aId}`);
}
public deleteAllOrders() {
return this.http.delete<any>(`/api/v1/order/`);
}
@ -415,10 +405,6 @@ export class DataService {
return this.http.post<OrderModel>(`/api/v1/account`, aAccount);
}
public postPlatform(aPlatform: CreatePlatformDto) {
return this.http.post<OrderModel>(`/api/v1/platform`, aPlatform);
}
public postOrder(aOrder: CreateOrderDto) {
return this.http.post<OrderModel>(`/api/v1/order`, aOrder);
}
@ -431,13 +417,6 @@ export class DataService {
return this.http.put<UserItem>(`/api/v1/account/${aAccount.id}`, aAccount);
}
public putPlatform(aPlatform: UpdatePlatformDto) {
return this.http.put<UserItem>(
`/api/v1/platform/${aPlatform.id}`,
aPlatform
);
}
public putAdminSetting(key: string, aData: PropertyDto) {
return this.http.put<void>(`/api/v1/admin/settings/${key}`, aData);
}

16
libs/common/src/lib/permissions.ts

@ -6,11 +6,13 @@ export const permissions = {
createAccess: 'createAccess',
createAccount: 'createAccount',
createOrder: 'createOrder',
createPlatform: 'createPlatform',
createUserAccount: 'createUserAccount',
deleteAccess: 'deleteAccess',
deleteAccount: 'deleteAcccount',
deleteAuthDevice: 'deleteAuthDevice',
deleteOrder: 'deleteOrder',
deletePlatform: 'deletePlatform',
deleteUser: 'deleteUser',
enableFearAndGreedIndex: 'enableFearAndGreedIndex',
enableImport: 'enableImport',
@ -26,11 +28,9 @@ export const permissions = {
updateAccount: 'updateAccount',
updateAuthDevice: 'updateAuthDevice',
updateOrder: 'updateOrder',
updatePlatform: 'updatePlatform',
updateUserSettings: 'updateUserSettings',
updateViewMode: 'updateViewMode',
createPlatform: 'createPlatform',
deletePlatform: 'deletePlatform',
updatePlatform: 'updatePlatform'
updateViewMode: 'updateViewMode'
};
export function getPermissions(aRole: Role): string[] {
@ -41,19 +41,19 @@ export function getPermissions(aRole: Role): string[] {
permissions.createAccess,
permissions.createAccount,
permissions.createOrder,
permissions.createPlatform,
permissions.deleteAccess,
permissions.deleteAccount,
permissions.deleteAuthDevice,
permissions.deleteOrder,
permissions.deletePlatform,
permissions.deleteUser,
permissions.updateAccount,
permissions.updateAuthDevice,
permissions.updateOrder,
permissions.updatePlatform,
permissions.updateUserSettings,
permissions.updateViewMode,
permissions.createPlatform,
permissions.deletePlatform,
permissions.updatePlatform
permissions.updateViewMode
];
case 'DEMO':

Loading…
Cancel
Save