Browse Source

Task/apply second review

Address PR feedback: alphabetical ordering of query params,
short form usage, reuse splitStringToArray, and add changelog entry
Airthee 1 week ago
parent
commit
0d734afdfa
No known key found for this signature in database GPG Key ID: C7EADC5599E355EC
  1. 1
      CHANGELOG.md
  2. 4
      apps/api/src/app/activities/activities.controller.ts
  3. 8
      apps/api/src/app/export/export.controller.ts
  4. 4
      apps/api/src/app/export/export.service.ts
  5. 14
      apps/client/src/app/pages/portfolio/activities/activities-page.component.ts
  6. 12
      libs/ui/src/lib/services/data.service.ts

1
CHANGELOG.md

@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Extended the holding detail dialog by adding a copy-to-clipboard button for the ISIN number (experimental) - Extended the holding detail dialog by adding a copy-to-clipboard button for the ISIN number (experimental)
- Extended the holding detail dialog by adding a copy-to-clipboard button for the symbol (experimental) - Extended the holding detail dialog by adding a copy-to-clipboard button for the symbol (experimental)
- Extended the user detail dialog of the admin control panel’s users section by adding a copy-to-clipboard button for the user id - Extended the user detail dialog of the admin control panel’s users section by adding a copy-to-clipboard button for the user id
- Added a filter by activity type to the activities page (experimental)
### Changed ### Changed

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

@ -113,6 +113,7 @@ export class ActivitiesController {
public async getAllActivities( public async getAllActivities(
@Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string,
@Query('accounts') filterByAccounts?: string, @Query('accounts') filterByAccounts?: string,
@Query('activityTypes') filterByTypes?: string,
@Query('assetClasses') filterByAssetClasses?: string, @Query('assetClasses') filterByAssetClasses?: string,
@Query('dataSource') filterByDataSource?: string, @Query('dataSource') filterByDataSource?: string,
@Query('range') dateRange?: DateRange, @Query('range') dateRange?: DateRange,
@ -121,8 +122,7 @@ export class ActivitiesController {
@Query('sortDirection') sortDirection?: Prisma.SortOrder, @Query('sortDirection') sortDirection?: Prisma.SortOrder,
@Query('symbol') filterBySymbol?: string, @Query('symbol') filterBySymbol?: string,
@Query('tags') filterByTags?: string, @Query('tags') filterByTags?: string,
@Query('take') take?: number, @Query('take') take?: number
@Query('activityTypes') filterByTypes?: string
): Promise<ActivitiesResponse> { ): Promise<ActivitiesResponse> {
const types = filterByTypes const types = filterByTypes
? (splitStringToArray(filterByTypes) as ActivityType[]) ? (splitStringToArray(filterByTypes) as ActivityType[])

8
apps/api/src/app/export/export.controller.ts

@ -35,13 +35,13 @@ export class ExportController {
public async export( public async export(
@Query('accounts') filterByAccounts?: string, @Query('accounts') filterByAccounts?: string,
@Query('activityIds') filterByActivityIds?: string, @Query('activityIds') filterByActivityIds?: string,
@Query('activityTypes') filterByTypes?: string,
@Query('assetClasses') filterByAssetClasses?: string, @Query('assetClasses') filterByAssetClasses?: string,
@Query('dataSource') filterByDataSource?: string, @Query('dataSource') filterByDataSource?: string,
@Query('symbol') filterBySymbol?: string, @Query('symbol') filterBySymbol?: string,
@Query('tags') filterByTags?: string, @Query('tags') filterByTags?: string
@Query('activityTypes') filterByTypes?: string
): Promise<ExportResponse> { ): Promise<ExportResponse> {
const activityIds = filterByActivityIds?.split(',') ?? []; const activityIds = splitStringToArray(filterByActivityIds);
const activityTypes = filterByTypes const activityTypes = filterByTypes
? (splitStringToArray(filterByTypes) as ActivityType[]) ? (splitStringToArray(filterByTypes) as ActivityType[])
: undefined; : undefined;
@ -55,8 +55,8 @@ export class ExportController {
return this.exportService.export({ return this.exportService.export({
activityIds, activityIds,
activityTypes,
filters, filters,
activityTypes: activityTypes,
userId: this.request.user.id, userId: this.request.user.id,
userSettings: this.request.user.settings.settings userSettings: this.request.user.settings.settings
}); });

4
apps/api/src/app/export/export.service.ts

@ -30,8 +30,8 @@ export class ExportService {
userSettings userSettings
}: { }: {
activityIds?: string[]; activityIds?: string[];
filters?: Filter[];
activityTypes?: ActivityType[]; activityTypes?: ActivityType[];
filters?: Filter[];
userId: string; userId: string;
userSettings: UserSettings; userSettings: UserSettings;
}): Promise<ExportResponse> { }): Promise<ExportResponse> {
@ -42,8 +42,8 @@ export class ExportService {
let { activities } = await this.activitiesService.getActivities({ let { activities } = await this.activitiesService.getActivities({
filters, filters,
types: activityTypes,
userId, userId,
types: activityTypes,
includeDrafts: true, includeDrafts: true,
sortColumn: 'date', sortColumn: 'date',
sortDirection: 'asc', sortDirection: 'asc',

14
apps/client/src/app/pages/portfolio/activities/activities-page.component.ts

@ -141,15 +141,15 @@ export class GfActivitiesPageComponent implements OnInit {
this.dataService this.dataService
.fetchActivities({ .fetchActivities({
range, activityTypes: this.activityTypesFilter.length
? this.activityTypesFilter
: undefined,
filters: this.userService.getFilters(), filters: this.userService.getFilters(),
range,
skip: this.pageIndex * this.pageSize, skip: this.pageIndex * this.pageSize,
sortColumn: this.sortColumn, sortColumn: this.sortColumn,
sortDirection: this.sortDirection, sortDirection: this.sortDirection,
take: this.pageSize, take: this.pageSize
activityTypes: this.activityTypesFilter.length
? this.activityTypesFilter
: undefined
}) })
.pipe(takeUntilDestroyed(this.destroyRef)) .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ activities, count }) => { .subscribe(({ activities, count }) => {
@ -222,10 +222,10 @@ export class GfActivitiesPageComponent implements OnInit {
if (!activityIds) { if (!activityIds) {
fetchExportParams = { fetchExportParams = {
filters: this.userService.getFilters(),
activityTypes: this.activityTypesFilter.length activityTypes: this.activityTypesFilter.length
? this.activityTypesFilter ? this.activityTypesFilter
: undefined : undefined,
filters: this.userService.getFilters()
}; };
} }

12
libs/ui/src/lib/services/data.service.ts

@ -209,13 +209,13 @@ export class DataService {
} }
public fetchActivities({ public fetchActivities({
activityTypes,
filters, filters,
range, range,
skip, skip,
sortColumn, sortColumn,
sortDirection, sortDirection,
take, take
activityTypes
}: { }: {
activityTypes?: string[]; activityTypes?: string[];
filters?: Filter[]; filters?: Filter[];
@ -227,6 +227,10 @@ export class DataService {
}): Observable<ActivitiesResponse> { }): Observable<ActivitiesResponse> {
let params = this.buildFiltersAsQueryParams({ filters }); let params = this.buildFiltersAsQueryParams({ filters });
if (activityTypes?.length) {
params = params.append('activityTypes', activityTypes.join(','));
}
if (range) { if (range) {
params = params.append('range', range); params = params.append('range', range);
} }
@ -247,10 +251,6 @@ export class DataService {
params = params.append('take', take); params = params.append('take', take);
} }
if (activityTypes?.length) {
params = params.append('activityTypes', activityTypes.join(','));
}
return this.http.get<any>('/api/v1/activities', { params }).pipe( return this.http.get<any>('/api/v1/activities', { params }).pipe(
map(({ activities, count }) => { map(({ activities, count }) => {
for (const activity of activities) { for (const activity of activities) {

Loading…
Cancel
Save