Feat currency type optimistic cache (#3907)
* feat: currency type in optimisitc cache update * Add test for optimisitc currency cache * Refactor error message for currency filter to be more accurate * Fix --------- Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
@ -0,0 +1,164 @@
|
|||||||
|
import { CurrencyFilter } from '@/object-record/record-filter/types/ObjectRecordQueryFilter';
|
||||||
|
import { isMatchingCurrencyFilter } from '@/object-record/record-filter/utils/isMatchingCurrencyFilter';
|
||||||
|
|
||||||
|
describe('isMatchingCurrencyFilter', () => {
|
||||||
|
describe('eq', () => {
|
||||||
|
it('value equals eq filter', () => {
|
||||||
|
const currencyFilter: CurrencyFilter = {
|
||||||
|
amountMicros: { eq: 10 },
|
||||||
|
};
|
||||||
|
expect(isMatchingCurrencyFilter({ currencyFilter, value: 10 })).toBe(
|
||||||
|
true,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('value does not equal eq filter', () => {
|
||||||
|
const currencyFilter: CurrencyFilter = {
|
||||||
|
amountMicros: { eq: 10 },
|
||||||
|
};
|
||||||
|
expect(isMatchingCurrencyFilter({ currencyFilter, value: 20 })).toBe(
|
||||||
|
false,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('gt', () => {
|
||||||
|
it('value is greater than gt filter', () => {
|
||||||
|
const currencyFilter: CurrencyFilter = {
|
||||||
|
amountMicros: { gt: 10 },
|
||||||
|
};
|
||||||
|
expect(isMatchingCurrencyFilter({ currencyFilter, value: 20 })).toBe(
|
||||||
|
true,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('value is not greater than gt filter', () => {
|
||||||
|
const currencyFilter: CurrencyFilter = {
|
||||||
|
amountMicros: { gt: 20 },
|
||||||
|
};
|
||||||
|
expect(isMatchingCurrencyFilter({ currencyFilter, value: 10 })).toBe(
|
||||||
|
false,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('gte', () => {
|
||||||
|
it('value is greater than or equal to gte filter', () => {
|
||||||
|
const currencyFilter: CurrencyFilter = {
|
||||||
|
amountMicros: { gte: 10 },
|
||||||
|
};
|
||||||
|
expect(isMatchingCurrencyFilter({ currencyFilter, value: 10 })).toBe(
|
||||||
|
true,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('value is not greater than or equal to gte filter', () => {
|
||||||
|
const currencyFilter: CurrencyFilter = {
|
||||||
|
amountMicros: { gte: 20 },
|
||||||
|
};
|
||||||
|
expect(isMatchingCurrencyFilter({ currencyFilter, value: 10 })).toBe(
|
||||||
|
false,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('in', () => {
|
||||||
|
it('value is in the array', () => {
|
||||||
|
const currencyFilter: CurrencyFilter = {
|
||||||
|
amountMicros: { in: [10, 20, 30] },
|
||||||
|
};
|
||||||
|
expect(isMatchingCurrencyFilter({ currencyFilter, value: 20 })).toBe(
|
||||||
|
true,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('value is not in the array', () => {
|
||||||
|
const currencyFilter: CurrencyFilter = {
|
||||||
|
amountMicros: { in: [10, 30, 40] },
|
||||||
|
};
|
||||||
|
expect(isMatchingCurrencyFilter({ currencyFilter, value: 20 })).toBe(
|
||||||
|
false,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('lt', () => {
|
||||||
|
it('value is less than lt filter', () => {
|
||||||
|
const currencyFilter: CurrencyFilter = {
|
||||||
|
amountMicros: { lt: 20 },
|
||||||
|
};
|
||||||
|
expect(isMatchingCurrencyFilter({ currencyFilter, value: 10 })).toBe(
|
||||||
|
true,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('value is not less than lt filter', () => {
|
||||||
|
const currencyFilter: CurrencyFilter = {
|
||||||
|
amountMicros: { lt: 10 },
|
||||||
|
};
|
||||||
|
expect(isMatchingCurrencyFilter({ currencyFilter, value: 20 })).toBe(
|
||||||
|
false,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('lte', () => {
|
||||||
|
it('value is less than or equal to lte filter', () => {
|
||||||
|
const currencyFilter: CurrencyFilter = {
|
||||||
|
amountMicros: { lte: 20 },
|
||||||
|
};
|
||||||
|
expect(isMatchingCurrencyFilter({ currencyFilter, value: 20 })).toBe(
|
||||||
|
true,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('value is not less than or equal to lte filter', () => {
|
||||||
|
const currencyFilter: CurrencyFilter = {
|
||||||
|
amountMicros: { lte: 10 },
|
||||||
|
};
|
||||||
|
expect(isMatchingCurrencyFilter({ currencyFilter, value: 20 })).toBe(
|
||||||
|
false,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('neq', () => {
|
||||||
|
it('value does not equal neq filter', () => {
|
||||||
|
const currencyFilter: CurrencyFilter = {
|
||||||
|
amountMicros: { neq: 10 },
|
||||||
|
};
|
||||||
|
expect(isMatchingCurrencyFilter({ currencyFilter, value: 20 })).toBe(
|
||||||
|
true,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('value equals neq filter', () => {
|
||||||
|
const currencyFilter: CurrencyFilter = {
|
||||||
|
amountMicros: { neq: 10 },
|
||||||
|
};
|
||||||
|
expect(isMatchingCurrencyFilter({ currencyFilter, value: 10 })).toBe(
|
||||||
|
false,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('is', () => {
|
||||||
|
it('value is NULL', () => {
|
||||||
|
const currencyFilter: CurrencyFilter = {
|
||||||
|
amountMicros: { is: 'NULL' },
|
||||||
|
};
|
||||||
|
expect(
|
||||||
|
isMatchingCurrencyFilter({ currencyFilter, value: null as any }),
|
||||||
|
).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('value is NOT_NULL', () => {
|
||||||
|
const currencyFilter: CurrencyFilter = {
|
||||||
|
amountMicros: { is: 'NOT_NULL' },
|
||||||
|
};
|
||||||
|
expect(isMatchingCurrencyFilter({ currencyFilter, value: 10 })).toBe(
|
||||||
|
true,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -0,0 +1,47 @@
|
|||||||
|
import { CurrencyFilter } from '@/object-record/record-filter/types/ObjectRecordQueryFilter';
|
||||||
|
|
||||||
|
export const isMatchingCurrencyFilter = ({
|
||||||
|
currencyFilter,
|
||||||
|
value,
|
||||||
|
}: {
|
||||||
|
currencyFilter: CurrencyFilter;
|
||||||
|
value: number;
|
||||||
|
}) => {
|
||||||
|
switch (true) {
|
||||||
|
case currencyFilter.amountMicros?.eq !== undefined: {
|
||||||
|
return value === currencyFilter.amountMicros.eq;
|
||||||
|
}
|
||||||
|
case currencyFilter.amountMicros?.neq !== undefined: {
|
||||||
|
return value !== currencyFilter.amountMicros.neq;
|
||||||
|
}
|
||||||
|
case currencyFilter.amountMicros?.gt !== undefined: {
|
||||||
|
return value > currencyFilter.amountMicros.gt;
|
||||||
|
}
|
||||||
|
case currencyFilter.amountMicros?.gte !== undefined: {
|
||||||
|
return value >= currencyFilter.amountMicros.gte;
|
||||||
|
}
|
||||||
|
case currencyFilter.amountMicros?.lt !== undefined: {
|
||||||
|
return value < currencyFilter.amountMicros.lt;
|
||||||
|
}
|
||||||
|
case currencyFilter.amountMicros?.lte !== undefined: {
|
||||||
|
return value <= currencyFilter.amountMicros.lte;
|
||||||
|
}
|
||||||
|
case currencyFilter.amountMicros?.in !== undefined: {
|
||||||
|
return currencyFilter.amountMicros.in.includes(value);
|
||||||
|
}
|
||||||
|
case currencyFilter.amountMicros?.is !== undefined: {
|
||||||
|
if (currencyFilter.amountMicros.is === 'NULL') {
|
||||||
|
return value === null;
|
||||||
|
} else {
|
||||||
|
return value !== null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
throw new Error(
|
||||||
|
`Unexpected amountMicros for currency filter : ${JSON.stringify(
|
||||||
|
currencyFilter.amountMicros,
|
||||||
|
)}`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
@ -4,6 +4,7 @@ import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
|||||||
import {
|
import {
|
||||||
AndObjectRecordFilter,
|
AndObjectRecordFilter,
|
||||||
BooleanFilter,
|
BooleanFilter,
|
||||||
|
CurrencyFilter,
|
||||||
DateFilter,
|
DateFilter,
|
||||||
FloatFilter,
|
FloatFilter,
|
||||||
FullNameFilter,
|
FullNameFilter,
|
||||||
@ -15,6 +16,7 @@ import {
|
|||||||
UUIDFilter,
|
UUIDFilter,
|
||||||
} from '@/object-record/record-filter/types/ObjectRecordQueryFilter';
|
} from '@/object-record/record-filter/types/ObjectRecordQueryFilter';
|
||||||
import { isMatchingBooleanFilter } from '@/object-record/record-filter/utils/isMatchingBooleanFilter';
|
import { isMatchingBooleanFilter } from '@/object-record/record-filter/utils/isMatchingBooleanFilter';
|
||||||
|
import { isMatchingCurrencyFilter } from '@/object-record/record-filter/utils/isMatchingCurrencyFilter';
|
||||||
import { isMatchingDateFilter } from '@/object-record/record-filter/utils/isMatchingDateFilter';
|
import { isMatchingDateFilter } from '@/object-record/record-filter/utils/isMatchingDateFilter';
|
||||||
import { isMatchingFloatFilter } from '@/object-record/record-filter/utils/isMatchingFloatFilter';
|
import { isMatchingFloatFilter } from '@/object-record/record-filter/utils/isMatchingFloatFilter';
|
||||||
import { isMatchingStringFilter } from '@/object-record/record-filter/utils/isMatchingStringFilter';
|
import { isMatchingStringFilter } from '@/object-record/record-filter/utils/isMatchingStringFilter';
|
||||||
@ -202,6 +204,12 @@ export const isRecordMatchingFilter = ({
|
|||||||
value: record[filterKey],
|
value: record[filterKey],
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
case FieldMetadataType.Currency: {
|
||||||
|
return isMatchingCurrencyFilter({
|
||||||
|
currencyFilter: filterValue as CurrencyFilter,
|
||||||
|
value: record[filterKey].amountMicros,
|
||||||
|
});
|
||||||
|
}
|
||||||
case FieldMetadataType.Relation: {
|
case FieldMetadataType.Relation: {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Not implemented yet, use UUID filter instead on the corredponding "${filterKey}Id" field`,
|
`Not implemented yet, use UUID filter instead on the corredponding "${filterKey}Id" field`,
|
||||||
|
|||||||
Reference in New Issue
Block a user