Skip to content

Commit 8128f2d

Browse files
authored
Merge pull request #48 from oracle-samples/46-implement-getresourcedescendants
46 implement getresourcedescendants
2 parents 16d0ead + be23552 commit 8128f2d

File tree

6 files changed

+200
-3
lines changed

6 files changed

+200
-3
lines changed

README.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,16 @@ In order to use this library you need to have access to an Oracle Field Service
2828

2929
`getAllActivities()`: Get ALL existing activities
3030

31+
`searchForActivities(params)` : Search a list of activities based on some input params
32+
3133
`createActivity(activityData)`: Create activity
3234

3335
`deleteActivity(activityId)`: Delete activity
3436

3537
`updateActivity(activityId, activityData)`: Update activity details
3638

39+
`bulkUpdateActivity(data)`: Update a list of activities
40+
3741
`moveActivity(activityId, activityData)`: Move activity
3842

3943
`delayActivity(activityId, activityData)`: Delay activity
@@ -76,6 +80,19 @@ In order to use this library you need to have access to an Oracle Field Service
7680

7781
`getAllUsers()`: Get all users
7882

83+
### Core: Resource Management
84+
85+
`getResources(params?)`: Get existing resources with optional filtering parameters
86+
87+
- `params.canBeTeamHolder` (boolean): Filter resources that can be team holders
88+
- `params.canParticipateInTeam` (boolean): Filter resources that can participate in teams
89+
- `params.expand` (array): Include sub-entities like inventories, workZones, workSkills
90+
- `params.fields` (array): Specify which resource fields to return
91+
- `params.limit` (number): Number of items to return (1-100, default 100)
92+
- `params.offset` (number): Starting record number (default 0)
93+
94+
`getAllResources(params?)`: Get all resources using pagination (excludes limit/offset from params)
95+
7996
### Core: Plugin Management
8097

8198
`importPlugins(file?, data?)`: Import plugin by path or via an XML string

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
],
66
"name": "@ofs-users/proxy",
77
"type": "module",
8-
"version": "1.17.1",
8+
"version": "1.17.2",
99
"description": "A Javascript proxy to access Oracle Field Service via REST API",
1010
"main": "dist/ofs.es.js",
1111
"module": "dist/ofs.es.js",

src/OFS.ts

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ import {
1717
OFSGetActivitiesParams,
1818
OFSSearchForActivitiesParams,
1919
OFSBulkUpdateRequest,
20+
OFSGetResourcesParams,
21+
OFSResourceResponse,
2022
} from "./model";
2123

2224
export * from "./model";
@@ -604,6 +606,83 @@ export class OFS {
604606
return this._get(partialURL);
605607
}
606608

609+
// Core: Resource Management
610+
async getResources(
611+
params: OFSGetResourcesParams = {}
612+
): Promise<OFSResourceResponse> {
613+
const partialURL = "/rest/ofscCore/v1/resources";
614+
const queryParams: any = {};
615+
616+
if (params.canBeTeamHolder !== undefined) {
617+
queryParams.canBeTeamHolder = params.canBeTeamHolder;
618+
}
619+
if (params.canParticipateInTeam !== undefined) {
620+
queryParams.canParticipateInTeam = params.canParticipateInTeam;
621+
}
622+
if (params.expand && params.expand.length > 0) {
623+
queryParams.expand = params.expand.join(',');
624+
}
625+
if (params.fields && params.fields.length > 0) {
626+
queryParams.fields = params.fields.join(',');
627+
}
628+
if (params.limit !== undefined) {
629+
queryParams.limit = params.limit;
630+
}
631+
if (params.offset !== undefined) {
632+
queryParams.offset = params.offset;
633+
}
634+
635+
return this._get(partialURL, queryParams);
636+
}
637+
638+
/**
639+
* Retrieves all resources from the OFS API.
640+
* @param params Optional parameters for filtering resources
641+
* @returns An object containing all resources.
642+
*/
643+
async getAllResources(params: Omit<OFSGetResourcesParams, 'limit' | 'offset'> = {}) {
644+
const partialURL = "/rest/ofscCore/v1/resources";
645+
var offset = 0;
646+
var limit = 100;
647+
var result: any = undefined;
648+
var allResults: any = { totalResults: 0, items: [] };
649+
650+
const queryParams: any = {};
651+
if (params.canBeTeamHolder !== undefined) {
652+
queryParams.canBeTeamHolder = params.canBeTeamHolder;
653+
}
654+
if (params.canParticipateInTeam !== undefined) {
655+
queryParams.canParticipateInTeam = params.canParticipateInTeam;
656+
}
657+
if (params.expand && params.expand.length > 0) {
658+
queryParams.expand = params.expand.join(',');
659+
}
660+
if (params.fields && params.fields.length > 0) {
661+
queryParams.fields = params.fields.join(',');
662+
}
663+
664+
do {
665+
result = await this._get(partialURL, {
666+
...queryParams,
667+
offset: offset,
668+
limit: limit,
669+
});
670+
if (result.status < 400) {
671+
if (allResults.totalResults == 0) {
672+
allResults = result.data;
673+
} else {
674+
allResults.items = allResults.items.concat(
675+
result.data.items
676+
);
677+
}
678+
offset += limit;
679+
} else {
680+
return result;
681+
}
682+
} while (result.data.items.length == limit);
683+
return allResults;
684+
}
685+
607686
// Core: Activities Management
608687
async getActivities(
609688
params: OFSGetActivitiesParams,

src/model.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,3 +246,41 @@ export class OFSBulkUpdateRequestParams
246246
this.inventoryPropertiesUpdateMode = inventoryPropertiesUpdateMode;
247247
}
248248
}
249+
250+
export interface OFSGetResourcesParams {
251+
canBeTeamHolder?: boolean;
252+
canParticipateInTeam?: boolean;
253+
expand?: string[];
254+
fields?: string[];
255+
limit?: number;
256+
offset?: number;
257+
}
258+
259+
export interface OFSResource {
260+
resourceId: string;
261+
name: string;
262+
status: string;
263+
resourceType: string;
264+
email?: string;
265+
phone?: string;
266+
language?: string;
267+
timeZone?: string;
268+
}
269+
270+
export interface OFSResourceListResponse {
271+
totalResults: number;
272+
limit: number;
273+
offset: number;
274+
items: OFSResource[];
275+
links?: any;
276+
}
277+
278+
export class OFSResourceResponse extends OFSResponse {
279+
data: OFSResourceListResponse = {
280+
totalResults: 0,
281+
limit: 100,
282+
offset: 0,
283+
items: [],
284+
links: undefined,
285+
};
286+
}

test/general/base.test.ts

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,3 +116,66 @@ test("Get all Users", async () => {
116116
expect(result.items.length).toEqual(result.totalResults);
117117
expect(result.items[0].login).toBe("admin");
118118
});
119+
120+
test("Get Resources No offset", async () => {
121+
var result = await myProxy.getResources();
122+
expect(result.status).toBe(200);
123+
expect(result.data.totalResults).toBeGreaterThan(0);
124+
expect(result.data.items.length).toBeGreaterThan(0);
125+
expect(result.data.limit).toBe(100);
126+
expect(result.data.offset).toBe(0);
127+
expect(result.data.items[0]).toHaveProperty("resourceId");
128+
expect(result.data.items[0]).toHaveProperty("name");
129+
expect(result.data.items[0]).toHaveProperty("status");
130+
expect(result.data.items[0]).toHaveProperty("resourceType");
131+
});
132+
133+
test("Get Resources with limit", async () => {
134+
var result = await myProxy.getResources({ limit: 5 });
135+
expect(result.status).toBe(200);
136+
expect(result.data.totalResults).toBeGreaterThan(0);
137+
expect(result.data.items.length).toBeLessThanOrEqual(5);
138+
expect(result.data.limit).toBe(5);
139+
expect(result.data.offset).toBe(0);
140+
});
141+
142+
test("Get Resources with offset and limit", async () => {
143+
var result = await myProxy.getResources({ offset: 2, limit: 3 });
144+
expect(result.status).toBe(200);
145+
expect(result.data.totalResults).toBeGreaterThan(0);
146+
expect(result.data.items.length).toBeLessThanOrEqual(3);
147+
expect(result.data.limit).toBe(3);
148+
expect(result.data.offset).toBe(2);
149+
});
150+
151+
test("Get Resources with canBeTeamHolder filter", async () => {
152+
var result = await myProxy.getResources({ canBeTeamHolder: true });
153+
expect(result.status).toBe(200);
154+
expect(result.data.totalResults).toBeGreaterThanOrEqual(0);
155+
if (result.data.items.length > 0) {
156+
expect(result.data.items[0]).toHaveProperty("resourceId");
157+
expect(result.data.items[0]).toHaveProperty("name");
158+
}
159+
});
160+
161+
test("Get Resources with fields filter", async () => {
162+
var result = await myProxy.getResources({ fields: ["resourceId", "name", "status"] });
163+
expect(result.status).toBe(200);
164+
expect(result.data.totalResults).toBeGreaterThan(0);
165+
expect(result.data.items.length).toBeGreaterThan(0);
166+
expect(result.data.items[0]).toHaveProperty("resourceId");
167+
expect(result.data.items[0]).toHaveProperty("name");
168+
expect(result.data.items[0]).toHaveProperty("status");
169+
});
170+
171+
test("Get all Resources", async () => {
172+
var result = await myProxy.getAllResources();
173+
expect(result.totalResults).toBeGreaterThan(0);
174+
expect(result.items.length).toEqual(result.totalResults);
175+
if (result.items.length > 0) {
176+
expect(result.items[0]).toHaveProperty("resourceId");
177+
expect(result.items[0]).toHaveProperty("name");
178+
expect(result.items[0]).toHaveProperty("status");
179+
expect(result.items[0]).toHaveProperty("resourceType");
180+
}
181+
});

0 commit comments

Comments
 (0)