Browse Source

Respect activity type and date range filter

pull/7492/head
Thomas Kaul 1 month ago
parent
commit
aaf3a38bb6
  1. 28
      apps/api/src/app/activities/activities.controller.ts
  2. 6
      apps/client/src/app/pages/portfolio/activities/activities-page.component.ts
  3. 18
      libs/common/src/lib/calculation-helper.ts

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

@ -83,7 +83,7 @@ export class ActivitiesController {
filterByTags filterByTags
}); });
const types = (filterByTypes?.split(',') as ActivityType[]) ?? []; const types = this.parseActivityTypes(filterByTypes);
return this.activitiesService.deleteActivities({ return this.activitiesService.deleteActivities({
endDate, endDate,
@ -152,7 +152,7 @@ export class ActivitiesController {
const impersonationUserId = const impersonationUserId =
await this.impersonationService.validateImpersonationId(impersonationId); await this.impersonationService.validateImpersonationId(impersonationId);
const types = (filterByTypes?.split(',') as ActivityType[]) ?? []; const types = this.parseActivityTypes(filterByTypes);
const userCurrency = this.request.user.settings.settings.baseCurrency; const userCurrency = this.request.user.settings.settings.baseCurrency;
@ -360,4 +360,28 @@ export class ActivitiesController {
} }
}); });
} }
private parseActivityTypes(filterByTypes?: string): ActivityType[] {
if (!filterByTypes) {
return [];
}
const types = filterByTypes.split(',');
const invalidTypes = types.filter((type) => {
return !Object.values(ActivityType).includes(type as ActivityType);
});
if (invalidTypes.length > 0) {
throw new HttpException(
{
error: getReasonPhrase(StatusCodes.BAD_REQUEST),
message: [`Invalid activity type: ${invalidTypes.join(', ')}`]
},
StatusCodes.BAD_REQUEST
);
}
return types as ActivityType[];
}
} }

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

@ -120,11 +120,11 @@ export class GfActivitiesPageComponent implements OnInit {
protected onDeleteActivities() { protected onDeleteActivities() {
this.dataService this.dataService
.deleteActivities({ .deleteActivities({
range: this.getCalendarYearRange(),
activityTypes: this.activityTypesFilter.length activityTypes: this.activityTypesFilter.length
? this.activityTypesFilter ? this.activityTypesFilter
: undefined, : undefined,
filters: this.userService.getFilters() filters: this.userService.getFilters(),
range: this.getCalendarYearRange()
}) })
.pipe(takeUntilDestroyed(this.destroyRef)) .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => { .subscribe(() => {
@ -283,11 +283,11 @@ export class GfActivitiesPageComponent implements OnInit {
this.dataService this.dataService
.fetchActivities({ .fetchActivities({
range: this.getCalendarYearRange(),
activityTypes: this.activityTypesFilter.length activityTypes: this.activityTypesFilter.length
? this.activityTypesFilter ? this.activityTypesFilter
: undefined, : undefined,
filters: this.userService.getFilters(), filters: this.userService.getFilters(),
range: this.getCalendarYearRange(),
skip: this.pageIndex * this.pageSize, skip: this.pageIndex * this.pageSize,
sortColumn: this.sortColumn, sortColumn: this.sortColumn,
sortDirection: this.sortDirection, sortDirection: this.sortDirection,

18
libs/common/src/lib/calculation-helper.ts

@ -1,3 +1,4 @@
import { UTCDate } from '@date-fns/utc';
import { Big } from 'big.js'; import { Big } from 'big.js';
import { import {
endOfDay, endOfDay,
@ -7,6 +8,7 @@ import {
startOfWeek, startOfWeek,
startOfYear, startOfYear,
subDays, subDays,
subMilliseconds,
subYears subYears
} from 'date-fns'; } from 'date-fns';
import { isFinite, isNumber } from 'lodash'; import { isFinite, isNumber } from 'lodash';
@ -75,10 +77,20 @@ export function getIntervalFromDateRange(params: {
break; break;
case 'max': case 'max':
break; break;
default: default: {
// '2024', '2023', '2022', etc. // '2024', '2023', '2022', etc.
endDate = endOfYear(new Date(dateRange)); const yearStartDate = new UTCDate(`${dateRange}-01-01`);
startDate = max([startDate, new Date(dateRange)]);
// Derive the boundaries of the calendar year in UTC to be independent of
// the server's time zone, but hand out plain dates as the consumers apply
// local time zone semantics. As the start date is exclusive, the last
// millisecond of the preceding year is used.
endDate = new Date(endOfYear(yearStartDate).getTime());
startDate = max([
startDate,
new Date(subMilliseconds(yearStartDate, 1).getTime())
]);
}
} }
return { endDate, startDate }; return { endDate, startDate };

Loading…
Cancel
Save