Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ describe('CaseResourceService', () => {
it('should deleteCase', (done) => {
inject([HttpTestingController],
(httpMock: HttpTestingController) => {
service.deleteCase('id').subscribe(res => {
service.deleteCase('id', false, new HttpParams()).subscribe(res => {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Test the omitted-parameter behavior.

Every changed test supplies new HttpParams(). That bypasses the new default projection branch. Add no-parameter tests that assert the expected fields parameter.

  • projects/netgrif-components-core/src/lib/resources/engine-endpoint/case-resource.service.spec.ts#L78-L78: call deleteCase without HttpParams and assert its default projection.
  • projects/netgrif-components-core/src/lib/resources/engine-endpoint/case-resource.service.spec.ts#L116-L116: call createCase without HttpParams and assert its default projection.
  • projects/netgrif-components-core/src/lib/resources/engine-endpoint/task-resource.service.spec.ts#L61-L61: call assignTask without HttpParams and assert its default projection.
  • projects/netgrif-components-core/src/lib/resources/engine-endpoint/task-resource.service.spec.ts#L77-L77: call cancelTask without HttpParams and assert its default projection.
  • projects/netgrif-components-core/src/lib/resources/engine-endpoint/task-resource.service.spec.ts#L93-L93: call delegateTask without HttpParams and assert its default projection.
  • projects/netgrif-components-core/src/lib/resources/engine-endpoint/task-resource.service.spec.ts#L109-L109: call finishTask without HttpParams and assert its default projection.
  • projects/netgrif-components-core/src/lib/resources/engine-endpoint/task-resource.service.spec.ts#L221-L221: call getData without HttpParams and assert its default projection.
  • projects/netgrif-components-core/src/lib/resources/engine-endpoint/task-resource.service.spec.ts#L246-L246: call setData without HttpParams and assert its default projection.
📍 Affects 2 files
  • projects/netgrif-components-core/src/lib/resources/engine-endpoint/case-resource.service.spec.ts#L78-L78 (this comment)
  • projects/netgrif-components-core/src/lib/resources/engine-endpoint/case-resource.service.spec.ts#L116-L116
  • projects/netgrif-components-core/src/lib/resources/engine-endpoint/task-resource.service.spec.ts#L61-L61
  • projects/netgrif-components-core/src/lib/resources/engine-endpoint/task-resource.service.spec.ts#L77-L77
  • projects/netgrif-components-core/src/lib/resources/engine-endpoint/task-resource.service.spec.ts#L93-L93
  • projects/netgrif-components-core/src/lib/resources/engine-endpoint/task-resource.service.spec.ts#L109-L109
  • projects/netgrif-components-core/src/lib/resources/engine-endpoint/task-resource.service.spec.ts#L221-L221
  • projects/netgrif-components-core/src/lib/resources/engine-endpoint/task-resource.service.spec.ts#L246-L246
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@projects/netgrif-components-core/src/lib/resources/engine-endpoint/case-resource.service.spec.ts`
at line 78, Update the service tests to omit HttpParams and verify each method’s
default fields projection: deleteCase and createCase in
projects/netgrif-components-core/src/lib/resources/engine-endpoint/case-resource.service.spec.ts
(lines 78-78 and 116-116), and assignTask, cancelTask, delegateTask, finishTask,
getData, and setData in
projects/netgrif-components-core/src/lib/resources/engine-endpoint/task-resource.service.spec.ts
(lines 61-61, 77-77, 93-93, 109-109, 221-221, and 246-246). Assert that each
request includes its expected default fields parameter.

expect(res.success).toEqual('Done');
done();
});
Expand Down Expand Up @@ -113,7 +113,7 @@ describe('CaseResourceService', () => {
service.createCase({
title: '',
netId: ''
}).subscribe(res => {
}, new HttpParams()).subscribe(res => {
expect((res.outcome as CreateCaseEventOutcome).aCase.stringId).toEqual('string');
done();
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,10 +69,15 @@ export class CaseResourceService extends AbstractResourceService implements Coun
* DELETE
* {{baseUrl}}/api/workflow/case/:id
*/
public deleteCase(caseID: string, deleteSubtree = false): Observable<EventOutcomeMessageResource> {
return this._resourceProvider.delete$('workflow/case/' + caseID,
this.SERVER_URL,
deleteSubtree ? {deleteSubtree: deleteSubtree.toString()} : {})
public deleteCase(caseID: string, deleteSubtree = false, params?: HttpParams): Observable<EventOutcomeMessageResource> {
if (!params) {
params = new HttpParams();
params = params.set('fields', 'outcomes,case(stringId)');
}
if (deleteSubtree) {
params = params.set('deleteSubtree', deleteSubtree.toString());
}
return this._resourceProvider.delete$('workflow/case/' + caseID, this.SERVER_URL, params)
.pipe(map(r => this.changeType(r, undefined)));
}

Expand All @@ -94,8 +99,12 @@ export class CaseResourceService extends AbstractResourceService implements Coun
* POST
* {{baseUrl}}/api/workflow/case
*/
public createCase(body: CreateCaseRequestBody): Observable<EventOutcomeMessageResource> {
return this._resourceProvider.post$('workflow/case/', this.SERVER_URL, body).pipe(map(r => this.changeType(r, undefined)));
public createCase(body: CreateCaseRequestBody, params?: Params): Observable<EventOutcomeMessageResource> {
if (!params) {
params = new HttpParams();
params = params.set('fields', 'outcomes,case');
}
return this._resourceProvider.post$('workflow/case/', this.SERVER_URL, body, params).pipe(map(r => this.changeType(r, undefined)));
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,12 @@ export class PublicTaskResourceService extends TaskResourceService {
* GET
*/
// {{baseUrl}}/api/public/task/assign/:id
public assignTask(taskId: string): Observable<EventOutcomeMessageResource> {
return this._provider.get$('public/task/assign/' + taskId, this.SERVER_URL)
public assignTask(taskId: string, params?: Params): Observable<EventOutcomeMessageResource> {
if (!params) {
params = new HttpParams();
params = params.set('fields', 'outcomes,outcome,task(stringId),data');
}
return this._provider.get$('public/task/assign/' + taskId, this.SERVER_URL, params)
.pipe(map(r => this.changeType(r, undefined)));
}

Expand All @@ -43,8 +47,12 @@ export class PublicTaskResourceService extends TaskResourceService {
* GET
*/
// {{baseUrl}}/api/public/task/cancel/:id
public cancelTask(taskId: string): Observable<EventOutcomeMessageResource> {
return this._provider.get$('public/task/cancel/' + taskId, this.SERVER_URL)
public cancelTask(taskId: string, params?: Params): Observable<EventOutcomeMessageResource> {
if (!params) {
params = new HttpParams();
params = params.set('fields', 'outcomes,outcome,task(stringId),data');
}
return this._provider.get$('public/task/cancel/' + taskId, this.SERVER_URL, params)
.pipe(map(r => this.changeType(r, undefined)));
}

Expand All @@ -53,8 +61,12 @@ export class PublicTaskResourceService extends TaskResourceService {
* GET
*/
// {{baseUrl}}/api/public/task/finish/:id
public finishTask(taskId: string): Observable<EventOutcomeMessageResource> {
return this._provider.get$('public/task/finish/' + taskId, this.SERVER_URL)
public finishTask(taskId: string, params?: Params): Observable<EventOutcomeMessageResource> {
if (!params) {
params = new HttpParams();
params = params.set('fields', 'outcomes,outcome,task(stringId),data');
}
return this._provider.get$('public/task/finish/' + taskId, this.SERVER_URL, params)
.pipe(map(r => this.changeType(r, undefined)));
}

Expand All @@ -78,8 +90,12 @@ export class PublicTaskResourceService extends TaskResourceService {
* @returns the raw backend response without any additional processing
*/
// {{baseUrl}}/api/public/task/:id/data
public rawGetData(taskId: string): Observable<EventOutcomeMessageResource> {
return this._provider.get$('public/task/' + taskId + '/data', this.SERVER_URL)
public rawGetData(taskId: string, params?: Params): Observable<EventOutcomeMessageResource> {
if (!params) {
params = new HttpParams();
params = params.set('fields', 'outcomes,outcome,task(stringId),data,data');
}
return this._provider.get$('public/task/' + taskId + '/data', this.SERVER_URL, params)
.pipe(map(r => this.changeType(r, 'dataGroups')));
}

Expand All @@ -88,8 +104,12 @@ export class PublicTaskResourceService extends TaskResourceService {
* POST
*/
// {{baseUrl}}/api/public/task/:id/data
public setData(taskId: string, body: TaskSetDataRequestBody): Observable<EventOutcomeMessageResource> {
return this._provider.post$('public/task/' + taskId + '/data', this.SERVER_URL, body)
public setData(taskId: string, body: TaskSetDataRequestBody, params?: Params): Observable<EventOutcomeMessageResource> {
if (!params) {
params = new HttpParams();
params = params.set('fields', 'outcomes,outcome,task(stringId),data,data');
}
return this._provider.post$('public/task/' + taskId + '/data', this.SERVER_URL, body, params)
.pipe(map(r => this.changeType(r, undefined)));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {SimpleFilter} from '../../filter/models/simple-filter';
import {FilterType} from '../../filter/models/filter-type';
import {TaskResourceService} from './task-resource.service';
import {NoopAnimationsModule} from '@angular/platform-browser/animations';
import {HttpParams} from "@angular/common/http";

describe('TaskResourceService', () => {
let service: TaskResourceService;
Expand Down Expand Up @@ -57,7 +58,7 @@ describe('TaskResourceService', () => {
it('should assignTask', (done) => {
inject([HttpTestingController],
(httpMock: HttpTestingController) => {
service.assignTask('id').subscribe(res => {
service.assignTask('id', new HttpParams()).subscribe(res => {
expect(res.success).toEqual('Success');
done();
});
Expand All @@ -73,7 +74,7 @@ describe('TaskResourceService', () => {
it('should cancelTask', (done) => {
inject([HttpTestingController],
(httpMock: HttpTestingController) => {
service.cancelTask('id').subscribe(res => {
service.cancelTask('id', new HttpParams()).subscribe(res => {
expect(res.success).toEqual('Success');
done();
});
Expand All @@ -89,7 +90,7 @@ describe('TaskResourceService', () => {
it('should delegateTask', (done) => {
inject([HttpTestingController],
(httpMock: HttpTestingController) => {
service.delegateTask('id', {userId: 5}).subscribe(res => {
service.delegateTask('id', {userId: 5}, new HttpParams()).subscribe(res => {
expect(res.success).toEqual('Success');
done();
});
Expand All @@ -105,7 +106,7 @@ describe('TaskResourceService', () => {
it('should finishTask', (done) => {
inject([HttpTestingController],
(httpMock: HttpTestingController) => {
service.finishTask('id').subscribe(res => {
service.finishTask('id', new HttpParams()).subscribe(res => {
expect(res.success).toEqual('Success');
done();
});
Expand Down Expand Up @@ -217,7 +218,7 @@ describe('TaskResourceService', () => {
it('should getData', (done) => {
inject([HttpTestingController],
(httpMock: HttpTestingController) => {
service.getData('id').subscribe(res => {
service.getData('id', new HttpParams()).subscribe(res => {
expect(res.length).toEqual(0);
done();
});
Expand All @@ -242,7 +243,7 @@ describe('TaskResourceService', () => {
it('should setData', (done) => {
inject([HttpTestingController],
(httpMock: HttpTestingController) => {
service.setData('id', {}).subscribe(res => {
service.setData('id', {}, new HttpParams()).subscribe(res => {
expect(res.outcome).toBeTruthy();
done();
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,12 @@ export class TaskResourceService extends AbstractResourceService implements Coun
* GET
*/
// {{baseUrl}}/api/task/assign/:id
public assignTask(taskId: string): Observable<EventOutcomeMessageResource> {
return this._resourceProvider.get$('task/assign/' + taskId, this.SERVER_URL)
public assignTask(taskId: string, params?: HttpParams): Observable<EventOutcomeMessageResource> {
if (!params) {
params = new HttpParams();
params = params.set('fields', 'outcomes,outcome,task(stringId)');
}
return this._resourceProvider.get$('task/assign/' + taskId, this.SERVER_URL, params)
.pipe(map(r => this.changeType(r, undefined)));
}

Expand All @@ -71,8 +75,12 @@ export class TaskResourceService extends AbstractResourceService implements Coun
* GET
*/
// {{baseUrl}}/api/task/cancel/:id
public cancelTask(taskId: string): Observable<EventOutcomeMessageResource> {
return this._resourceProvider.get$('task/cancel/' + taskId, this.SERVER_URL)
public cancelTask(taskId: string, params?: Params): Observable<EventOutcomeMessageResource> {
if (!params) {
params = new HttpParams();
params = params.set('fields', 'outcomes,outcome,task(stringId)');
}
return this._resourceProvider.get$('task/cancel/' + taskId, this.SERVER_URL, params)
.pipe(map(r => this.changeType(r, undefined)));
}

Expand All @@ -81,8 +89,12 @@ export class TaskResourceService extends AbstractResourceService implements Coun
* POST
*/
// {{baseUrl}}/api/task/delegate/:id
public delegateTask(taskId: string, body: object): Observable<EventOutcomeMessageResource> {
return this._resourceProvider.post$('task/delegate/' + taskId, this.SERVER_URL, body, undefined, {'Content-Type': 'text/plain'})
public delegateTask(taskId: string, body: object, params?: HttpParams): Observable<EventOutcomeMessageResource> {
if (!params) {
params = new HttpParams();
params = params.set('fields', 'outcomes,outcome,task(stringId)');
}
return this._resourceProvider.post$('task/delegate/' + taskId, this.SERVER_URL, body, params, {'Content-Type': 'text/plain'})
.pipe(map(r => this.changeType(r, undefined)));
}

Expand All @@ -91,8 +103,12 @@ export class TaskResourceService extends AbstractResourceService implements Coun
* GET
*/
// {{baseUrl}}/api/task/finish/:id
public finishTask(taskId: string): Observable<EventOutcomeMessageResource> {
return this._resourceProvider.get$('task/finish/' + taskId, this.SERVER_URL)
public finishTask(taskId: string, params?: Params): Observable<EventOutcomeMessageResource> {
if (!params) {
params = new HttpParams();
params = params.set('fields', 'outcomes,outcome,task(stringId)');
}
return this._resourceProvider.get$('task/finish/' + taskId, this.SERVER_URL, params)
.pipe(map(r => this.changeType(r, undefined)));
}

Expand Down Expand Up @@ -187,8 +203,12 @@ export class TaskResourceService extends AbstractResourceService implements Coun
* @returns the raw backend response without any additional processing
*/
// {{baseUrl}}/api/task/:id/data
public rawGetData(taskId: string): Observable<EventOutcomeMessageResource> {
return this._resourceProvider.get$('task/' + taskId + '/data', this.SERVER_URL)
public rawGetData(taskId: string, params?: Params): Observable<EventOutcomeMessageResource> {
if (!params) {
params = new HttpParams();
params = params.set('fields', 'outcomes,task(stringId),data');
}
return this._resourceProvider.get$('task/' + taskId + "/data", this.SERVER_URL, params)
Comment on lines +206 to +211

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Request outcome in the default projection.

When getData(taskId) omits params, this request does not select outcome. Line 233 then dereferences responseOutcome.outcome.data. Add outcome to the default fields to preserve the response required by getData.

Proposed fix
-            params = params.set('fields', 'outcomes,task(stringId),data');
+            params = params.set('fields', 'outcomes,outcome,task(stringId),data');
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
public rawGetData(taskId: string, params?: Params): Observable<EventOutcomeMessageResource> {
if (!params) {
params = new HttpParams();
params = params.set('fields', 'outcomes,task(stringId),data');
}
return this._resourceProvider.get$('task/' + taskId + "/data", this.SERVER_URL, params)
public rawGetData(taskId: string, params?: Params): Observable<EventOutcomeMessageResource> {
if (!params) {
params = new HttpParams();
params = params.set('fields', 'outcomes,outcome,task(stringId),data');
}
return this._resourceProvider.get$('task/' + taskId + "/data", this.SERVER_URL, params)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@projects/netgrif-components-core/src/lib/resources/engine-endpoint/task-resource.service.ts`
around lines 206 - 211, Update the default fields in rawGetData to include
outcome alongside outcomes, task(stringId), and data, so getData receives the
response required by its responseOutcome.outcome.data access. Preserve
caller-provided params unchanged.

.pipe(map(r => this.changeType(r, undefined)));
}

Expand All @@ -200,10 +220,11 @@ export class TaskResourceService extends AbstractResourceService implements Coun
* If you want to process the raw backend response use [rawGetData]{@link TaskResourceService#rawGetData} instead.
*
* @param taskId ID of the task who's data should be retrieved from the server
* @param params HTTP params
* @returns processed data groups of the given task. If the task has no data an empty array will be returned.
*/
public getData(taskId: string): Observable<Array<DataGroup>> {
return this.rawGetData(taskId).pipe(
public getData(taskId: string, params?: Params): Observable<Array<DataGroup>> {
return this.rawGetData(taskId, params).pipe(
map((responseOutcome: EventOutcomeMessageResource) => {
if (responseOutcome.error) {
throw new Error(responseOutcome.error);
Expand Down Expand Up @@ -253,8 +274,12 @@ export class TaskResourceService extends AbstractResourceService implements Coun
* POST
*/
// {{baseUrl}}/api/task/:id/data
public setData(taskId: string, body: TaskSetDataRequestBody): Observable<EventOutcomeMessageResource> {
return this._resourceProvider.post$('task/' + taskId + '/data', this.SERVER_URL, body)
public setData(taskId: string, body: TaskSetDataRequestBody, params?: Params): Observable<EventOutcomeMessageResource> {
if (!params) {
params = new HttpParams();
params = params.set('fields', 'outcomes,outcome,case(stringId),task(stringId),changedFields');
}
return this._resourceProvider.post$('task/' + taskId + "/data", this.SERVER_URL, body, params)
.pipe(map(r => this.changeType(r, undefined)));
}

Expand Down
Loading