fix(server): workflow date filter, make end date inclusive (#29876)

Co-authored-by: Raul Plesa <raul.plesa@external.grifols.com>
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
This commit is contained in:
Raul
2026-07-15 12:50:03 +02:00
committed by GitHub
parent a04e2ddeca
commit b4530b0671
2 changed files with 36 additions and 2 deletions

View File

@@ -127,7 +127,7 @@ const methods = wrapper<Manifest>({
assetDateFilter: ({ config, data }) => {
const assetDate = new Date(data.asset.localDateTime);
let startDate = new Date(config.startDate.year, config.startDate.month - 1, config.startDate.day);
let endDate = new Date(config.endDate.year, config.endDate.month - 1, config.endDate.day);
let endDate = new Date(config.endDate.year, config.endDate.month - 1, config.endDate.day + 1);
if (config.recurring) {
startDate.setFullYear(assetDate.getFullYear());
@@ -142,7 +142,7 @@ const methods = wrapper<Manifest>({
}
}
return { workflow: { continue: assetDate >= startDate && assetDate <= endDate } };
return { workflow: { continue: assetDate >= startDate && assetDate < endDate } };
},
assetLock: ({ config, data }) => {

View File

@@ -428,6 +428,40 @@ describe('core plugin', () => {
});
});
describe('assetDateFilter', () => {
it('should favorite assets created during the first 7 days of a specific year and month', async () => {
const { user } = await ctx.newUser();
const [{ asset: asset1 }, { asset: asset2 }] = await Promise.all([
ctx.newAsset({ ownerId: user.id, localDateTime: new Date('2000-04-01') }),
ctx.newAsset({ ownerId: user.id, localDateTime: new Date('2000-04-07T23:59:59Z') }),
]);
const workflow = await createWorkflow({
ownerId: user.id,
trigger: WorkflowTrigger.AssetCreate,
steps: [
{
method: 'immich-plugin-core#assetDateFilter',
config: {
startDate: { day: 1, month: 4, year: 2000 },
endDate: { day: 7, month: 4, year: 2000 },
recurring: false,
},
},
{
method: 'immich-plugin-core#assetFavorite',
},
],
});
await ctx.sut.handleAssetTrigger({ workflowId: workflow.id, assetId: asset1.id });
await expect(ctx.get(AssetRepository).getById(asset1.id)).resolves.toMatchObject({ isFavorite: true });
await ctx.sut.handleAssetTrigger({ workflowId: workflow.id, assetId: asset2.id });
await expect(ctx.get(AssetRepository).getById(asset2.id)).resolves.toMatchObject({ isFavorite: true });
});
});
describe('webhook', () => {
it('should trigger a webhook on asset upload', async () => {
const { user } = await ctx.newUser();