Browse Source

Limit type filter in activities table component to used types

pull/7602/head
Thomas Kaul 3 weeks ago
parent
commit
d2c5f7690a
  1. 31
      apps/api/src/app/user/user.service.ts
  2. 1
      libs/common/src/lib/types/user-with-settings.type.ts
  3. 5
      prisma/migrations/20260820000000_updated_indexes_of_order/migration.sql
  4. 2
      prisma/schema.prisma

31
apps/api/src/app/user/user.service.ts

@ -62,7 +62,7 @@ import { EventEmitter2 } from '@nestjs/event-emitter';
import { InjectThrottlerStorage, ThrottlerStorage } from '@nestjs/throttler'; import { InjectThrottlerStorage, ThrottlerStorage } from '@nestjs/throttler';
import { Prisma, Role, User } from '@prisma/client'; import { Prisma, Role, User } from '@prisma/client';
import { differenceInDays, subDays } from 'date-fns'; import { differenceInDays, subDays } from 'date-fns';
import { isNil, without } from 'lodash'; import { isNil, min, without } from 'lodash';
import { createHmac } from 'node:crypto'; import { createHmac } from 'node:crypto';
@Injectable() @Injectable()
@ -130,7 +130,6 @@ export class UserService {
access, access,
accounts, accounts,
activitiesGroupedByType, activitiesGroupedByType,
firstActivity,
impersonationUser, impersonationUser,
tagsForUser tagsForUser
] = await Promise.all([ ] = await Promise.all([
@ -151,15 +150,8 @@ export class UserService {
} }
}), }),
this.prismaService.order.groupBy({ this.prismaService.order.groupBy({
_count: { _all: true }, _min: { date: true },
by: ['type'], by: ['type'],
orderBy: { type: 'asc' },
where: { userId: impersonationUserId || user.id }
}),
this.prismaService.order.findFirst({
orderBy: {
date: 'asc'
},
where: { userId: impersonationUserId || user.id } where: { userId: impersonationUserId || user.id }
}), }),
impersonationUserId impersonationUserId
@ -168,17 +160,21 @@ export class UserService {
this.tagService.getTagsForUser(impersonationUserId || user.id) this.tagService.getTagsForUser(impersonationUserId || user.id)
]); ]);
const activitiesCount = activitiesGroupedByType.reduce( const activitiesCount = impersonationUser
(count, { _count }) => { ? impersonationUser.activitiesCount
return count + _count._all; : user.activitiesCount;
},
0
);
const activityTypes = activitiesGroupedByType.map(({ type }) => { const activityTypes = activitiesGroupedByType.map(({ type }) => {
return type; return type;
}); });
const dateOfFirstActivity =
min(
activitiesGroupedByType.map(({ _min }) => {
return _min.date;
})
) ?? new Date();
const resolvedUserSettings = resolveUserSettings({ const resolvedUserSettings = resolveUserSettings({
impersonationUserSettings: impersonationUser?.settings impersonationUserSettings: impersonationUser?.settings
?.settings as UserSettings, ?.settings as UserSettings,
@ -224,6 +220,7 @@ export class UserService {
return { return {
activitiesCount, activitiesCount,
activityTypes, activityTypes,
dateOfFirstActivity,
id, id,
permissions, permissions,
referralPartners, referralPartners,
@ -242,7 +239,6 @@ export class UserService {
accounts: accounts.sort((a, b) => { accounts: accounts.sort((a, b) => {
return a.name.toLowerCase().localeCompare(b.name.toLowerCase()); return a.name.toLowerCase().localeCompare(b.name.toLowerCase());
}), }),
dateOfFirstActivity: firstActivity?.date ?? new Date(),
settings: { settings: {
...resolvedUserSettings, ...resolvedUserSettings,
baseCurrency: resolvedUserSettings.baseCurrency ?? DEFAULT_CURRENCY, baseCurrency: resolvedUserSettings.baseCurrency ?? DEFAULT_CURRENCY,
@ -340,6 +336,7 @@ export class UserService {
const user: UserWithSettings = { const user: UserWithSettings = {
accessToken, accessToken,
accounts, accounts,
activitiesCount,
authChallenge, authChallenge,
createdAt, createdAt,
id, id,

1
libs/common/src/lib/types/user-with-settings.type.ts

@ -6,6 +6,7 @@ import { Account, Settings, User } from '@prisma/client';
// TODO: Compare with User interface // TODO: Compare with User interface
export type UserWithSettings = User & { export type UserWithSettings = User & {
accounts: Account[]; accounts: Account[];
activitiesCount: number;
activityCount: number; activityCount: number;
dataProviderGhostfolioDailyRequests: number; dataProviderGhostfolioDailyRequests: number;
permissions?: string[]; permissions?: string[];

5
prisma/migrations/20260820000000_updated_indexes_of_order/migration.sql

@ -8,4 +8,7 @@ DROP INDEX "Order_type_idx";
DROP INDEX "Order_userId_idx"; DROP INDEX "Order_userId_idx";
-- CreateIndex -- CreateIndex
CREATE INDEX "Order_userId_type_idx" ON "Order"("userId", "type"); CREATE INDEX "Order_symbolProfileId_idx" ON "Order"("symbolProfileId");
-- CreateIndex
CREATE INDEX "Order_userId_date_type_idx" ON "Order"("userId", "date", "type");

2
prisma/schema.prisma

@ -198,7 +198,7 @@ model Order {
@@index([accountId]) @@index([accountId])
@@index([date]) @@index([date])
@@index([symbolProfileId]) @@index([symbolProfileId])
@@index([userId, type]) @@index([userId, date, type])
} }
model Platform { model Platform {

Loading…
Cancel
Save