Browse Source

Fix update of asset profiles not owned by user

pull/8071/head
Thomas Kaul 3 days ago
parent
commit
1fe7994170
  1. 27
      apps/api/src/app/activities/activities.service.spec.ts
  2. 5
      apps/api/src/app/activities/activities.service.ts

27
apps/api/src/app/activities/activities.service.spec.ts

@ -546,9 +546,26 @@ describe('ActivitiesService', () => {
expect(data).not.toHaveProperty('SymbolProfile'); expect(data).not.toHaveProperty('SymbolProfile');
}); });
it('does not update the asset profile of a data provider', async () => {
const data = await getUpdatedActivityData({
dataSource: DataSource.YAHOO,
symbol: 'AAPL',
type: ActivityType.FEE,
userId: null
});
expect(data).not.toHaveProperty('SymbolProfile');
});
async function getUpdatedActivityData({ async function getUpdatedActivityData({
dataSource = DataSource.MANUAL,
symbol = 'GF_GOLD',
type = ActivityType.BUY,
userId userId
}: { }: {
dataSource?: DataSource;
symbol?: string;
type?: ActivityType;
userId: string | null; userId: string | null;
}) { }) {
const update = jest.fn().mockResolvedValue({ userId: 'user-id' }); const update = jest.fn().mockResolvedValue({ userId: 'user-id' });
@ -577,23 +594,23 @@ describe('ActivitiesService', () => {
await service.updateActivity({ await service.updateActivity({
data: { data: {
type,
assetClass: AssetClass.COMMODITY, assetClass: AssetClass.COMMODITY,
assetSubClass: AssetSubClass.PRECIOUS_METAL, assetSubClass: AssetSubClass.PRECIOUS_METAL,
date: parseDate('2024-01-01'), date: parseDate('2024-01-01'),
SymbolProfile: { SymbolProfile: {
connect: { connect: {
dataSource_symbol: { dataSource_symbol: {
dataSource: DataSource.MANUAL, dataSource,
symbol: 'GF_GOLD' symbol
} }
}, },
update: { update: {
assetClass: AssetClass.COMMODITY, assetClass: AssetClass.COMMODITY,
assetSubClass: AssetSubClass.PRECIOUS_METAL, assetSubClass: AssetSubClass.PRECIOUS_METAL,
name: 'GF_GOLD' name: symbol
} }
}, }
type: 'BUY'
}, },
originalDate: parseDate('2024-01-01'), originalDate: parseDate('2024-01-01'),
userId: 'user-id', userId: 'user-id',

5
apps/api/src/app/activities/activities.service.ts

@ -939,17 +939,12 @@ export class ActivitiesService {
where where
}); });
// Update the asset profile only if it is a custom asset profile of the
// user, but not one of the admin, of a data provider or of another user
if (activityToUpdate?.SymbolProfile.userId === userId) { if (activityToUpdate?.SymbolProfile.userId === userId) {
data.SymbolProfile.update = { data.SymbolProfile.update = {
data: { data: {
assetClass: data.assetClass, assetClass: data.assetClass,
assetSubClass: data.assetSubClass assetSubClass: data.assetSubClass
}, },
// Filter by the user again, so that a concurrent request which
// links the activity to a different asset profile cannot bypass
// the check
where: { userId } where: { userId }
}; };
} else { } else {

Loading…
Cancel
Save