Skip to content

Commit 9679c20

Browse files
committed
fix CAP status return
1 parent 1ef99b6 commit 9679c20

File tree

4 files changed

+126
-18
lines changed

4 files changed

+126
-18
lines changed

src/EventQueueProcessorBase.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,7 @@ class EventQueueProcessorBase {
409409
if (typeof entry === "number") {
410410
result.status = entry;
411411
} else if (typeof entry === "object") {
412-
for (const fieldName of ALLOWED_FIELDS_FOR_UPDATE) {
412+
for (const fieldName of this.allowedFieldsEventHandler) {
413413
if (fieldName in entry) {
414414
result[fieldName] = entry[fieldName];
415415
}
@@ -444,7 +444,8 @@ class EventQueueProcessorBase {
444444
});
445445
const ts = new Date().toISOString();
446446
const updateData = Object.entries(statusMap).reduce((result, [id, data]) => {
447-
const key = ALLOWED_FIELDS_FOR_UPDATE.map((name) => [name, data[name]])
447+
const key = this.allowedFieldsEventHandler
448+
.map((name) => [name, data[name]])
448449
.flat()
449450
.join("##");
450451

@@ -1360,6 +1361,10 @@ class EventQueueProcessorBase {
13601361
get namespace() {
13611362
return this.#namespace;
13621363
}
1364+
1365+
get allowedFieldsEventHandler() {
1366+
return ALLOWED_FIELDS_FOR_UPDATE;
1367+
}
13631368
}
13641369

13651370
module.exports = EventQueueProcessorBase;

src/outbox/EventQueueGenericOutboxHandler.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,11 @@ class EventQueueGenericOutboxHandler extends EventQueueBaseClass {
366366
}
367367

368368
if (result instanceof Object && !Array.isArray(result)) {
369-
return queueEntries.map((queueEntry) => [queueEntry.ID, result]);
369+
const allAllowed = !Object.keys(result).some((name) => !this.allowedFieldsEventHandler.includes(name));
370+
return queueEntries.map((queueEntry) => [
371+
queueEntry.ID,
372+
allAllowed ? result : { status: EventProcessingStatus.Done },
373+
]);
370374
}
371375

372376
if (!Array.isArray(result)) {
@@ -377,7 +381,11 @@ class EventQueueGenericOutboxHandler extends EventQueueBaseClass {
377381
if (Array.isArray(firstEntry)) {
378382
const [, innerResult] = firstEntry;
379383
if (innerResult instanceof Object) {
380-
return result;
384+
const allAllowed = !Object.keys(innerResult).some((name) => !this.allowedFieldsEventHandler.includes(name));
385+
if (allAllowed) {
386+
return result;
387+
}
388+
return queueEntries.map((queueEntry) => [queueEntry.ID, { status: EventProcessingStatus.Done }]);
381389
} else {
382390
return result.map(([id, status]) => {
383391
return [id, { status }];
@@ -398,6 +406,12 @@ class EventQueueGenericOutboxHandler extends EventQueueBaseClass {
398406
}
399407

400408
delete entry.ID;
409+
const allAllowed = !Object.keys(entry).some((name) => !this.allowedFieldsEventHandler.includes(name));
410+
411+
if (!allAllowed) {
412+
result.push([ID, { status: EventProcessingStatus.Done }]);
413+
}
414+
401415
if (!("status" in entry)) {
402416
entry.status = EventProcessingStatus.Done;
403417
}

test/asset/outboxProject/srv/service/standard-service.js

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,13 @@ class StandardService extends cds.Service {
7676
req.data.startAfter = new Date(req.data.startAfter);
7777
}
7878

79-
return {
80-
status: req.data.status ?? 3,
81-
startAfter: req.data.startAfter,
82-
...(req.data.errorMessage && { error: new Error(req.data.errorMessage) }),
83-
};
79+
return req.data.returnData
80+
? req.data
81+
: {
82+
status: req.data.status ?? 3,
83+
startAfter: req.data.startAfter,
84+
...(req.data.errorMessage && { error: new Error(req.data.errorMessage) }),
85+
};
8486
});
8587

8688
this.on("asArrayTuple", (req) => {
@@ -92,11 +94,13 @@ class StandardService extends cds.Service {
9294

9395
return req.eventQueue.queueEntries.map(({ ID }) => [
9496
ID,
95-
{
96-
startAfter: req.data.startAfter,
97-
status: 3 ?? req.data.status,
98-
...(req.data.errorMessage && { error: new Error(req.data.errorMessage) }),
99-
},
97+
req.data.returnData
98+
? req.data
99+
: {
100+
startAfter: req.data.startAfter,
101+
status: 3 ?? req.data.status,
102+
...(req.data.errorMessage && { error: new Error(req.data.errorMessage) }),
103+
},
100104
]);
101105
});
102106

@@ -109,9 +113,13 @@ class StandardService extends cds.Service {
109113

110114
return req.eventQueue.queueEntries.map(({ ID }) => ({
111115
ID,
112-
...((req.data.status || req.data.status === 0) && { status: req.data.status }),
113-
startAfter: req.data.startAfter,
114-
...(req.data.errorMessage && { error: new Error(req.data.errorMessage) }),
116+
...(req.data.returnData
117+
? req.data
118+
: {
119+
...((req.data.status || req.data.status === 0) && { status: req.data.status }),
120+
startAfter: req.data.startAfter,
121+
...(req.data.errorMessage && { error: new Error(req.data.errorMessage) }),
122+
}),
115123
}));
116124
});
117125
}

test/eventQueueOutbox.test.js

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,22 @@ cds.env.requires.Namespace = {
137137
},
138138
};
139139

140+
cds.env.requires["sapafcsdk.scheduling.ProviderService"] = {
141+
impl: path.join(basePath, "srv/service/standard-service.js"),
142+
outbox: {
143+
kind: "persistent-outbox",
144+
namespace: "namespaceA",
145+
events: {
146+
main: {
147+
priority: "high",
148+
},
149+
timeBucketAction: {
150+
cron: "*/5 * * * *",
151+
},
152+
},
153+
},
154+
};
155+
140156
const project = __dirname + "/asset/outboxProject"; // The project's root folder
141157
cds.test(project);
142158

@@ -971,7 +987,7 @@ describe("event-queue outbox", () => {
971987
it("insert periodic event for CAP service", async () => {
972988
await checkAndInsertPeriodicEvents(context);
973989
const [periodicEvent] = await testHelper.selectEventQueueAndReturn(tx, {
974-
expectedLength: 3,
990+
expectedLength: 4,
975991
additionalColumns: ["type", "subType"],
976992
});
977993
expect(periodicEvent.startAfter).toBeDefined();
@@ -2037,6 +2053,19 @@ describe("event-queue outbox", () => {
20372053
await testHelper.selectEventQueueAndExpectDone(tx, { expectedLength: 1 });
20382054
expect(loggerMock.callsLengths().error).toEqual(2);
20392055
});
2056+
2057+
it("return null", async () => {
2058+
const service = await cds.connect.to("StandardService");
2059+
await service.send("returnStatusAsArray", {
2060+
status: null,
2061+
});
2062+
await commitAndOpenNew();
2063+
await testHelper.selectEventQueueAndExpectOpen(tx, { expectedLength: 1 });
2064+
await processEventQueue(tx.context, "CAP_OUTBOX", service.name);
2065+
await commitAndOpenNew();
2066+
await testHelper.selectEventQueueAndExpectDone(tx, { expectedLength: 1 });
2067+
expect(loggerMock.callsLengths().error).toEqual(2);
2068+
});
20402069
});
20412070

20422071
describe("as object", () => {
@@ -2138,6 +2167,24 @@ describe("event-queue outbox", () => {
21382167
expect(scheduleEventSpy).toHaveBeenCalledTimes(0);
21392168
expect(loggerMock.callsLengths().error).toEqual(0);
21402169
});
2170+
2171+
it("object without any valid field; just random properties", async () => {
2172+
const service = (await cds.connect.to("StandardService")).tx(context);
2173+
await service.send("asObject", {
2174+
returnData: true,
2175+
abc: 123,
2176+
status: 3,
2177+
});
2178+
await commitAndOpenNew();
2179+
await processEventQueue(tx.context, "CAP_OUTBOX", service.name);
2180+
const [event] = await testHelper.selectEventQueueAndReturn(tx, {
2181+
expectedLength: 1,
2182+
});
2183+
expect(event.startAfter).toBeNull();
2184+
expect(event.status).toEqual(EventProcessingStatus.Done);
2185+
expect(scheduleEventSpy).toHaveBeenCalledTimes(0);
2186+
expect(loggerMock.callsLengths().error).toEqual(0);
2187+
});
21412188
});
21422189

21432190
describe("as Array Tuple", () => {
@@ -2194,6 +2241,22 @@ describe("event-queue outbox", () => {
21942241
expect(scheduleEventSpy).toHaveBeenCalledTimes(1);
21952242
expect(loggerMock.callsLengths().error).toEqual(0);
21962243
});
2244+
2245+
it("object without any valid field; just random properties", async () => {
2246+
const service = (await cds.connect.to("StandardService")).tx(context);
2247+
await service.send("asArrayTuple", {
2248+
returnData: true,
2249+
abc: 123,
2250+
});
2251+
await commitAndOpenNew();
2252+
await processEventQueue(tx.context, "CAP_OUTBOX", service.name);
2253+
const [event] = await testHelper.selectEventQueueAndReturn(tx, {
2254+
expectedLength: 1,
2255+
});
2256+
expect(event.startAfter).toBeNull();
2257+
expect(scheduleEventSpy).toHaveBeenCalledTimes(0);
2258+
expect(loggerMock.callsLengths().error).toEqual(0);
2259+
});
21972260
});
21982261

21992262
describe("as Array Object (ID)", () => {
@@ -2304,6 +2367,24 @@ describe("event-queue outbox", () => {
23042367
expect(scheduleEventSpy).toHaveBeenCalledTimes(1);
23052368
expect(loggerMock.callsLengths().error).toEqual(0);
23062369
});
2370+
2371+
it("object without any valid field; just random properties", async () => {
2372+
const service = (await cds.connect.to("StandardService")).tx(context);
2373+
await service.send("asArrayWithId", {
2374+
returnData: true,
2375+
abc: 123,
2376+
status: EventProcessingStatus.Error,
2377+
});
2378+
await commitAndOpenNew();
2379+
await processEventQueue(tx.context, "CAP_OUTBOX", service.name);
2380+
const [event] = await testHelper.selectEventQueueAndReturn(tx, {
2381+
expectedLength: 1,
2382+
});
2383+
expect(event.startAfter).toBeDefined();
2384+
expect(event.status).toEqual(EventProcessingStatus.Done); // because unknown props in return value
2385+
expect(scheduleEventSpy).toHaveBeenCalledTimes(0);
2386+
expect(loggerMock.callsLengths().error).toEqual(0);
2387+
});
23072388
});
23082389
});
23092390
});

0 commit comments

Comments
 (0)