Skip to content

Commit 70acfc3

Browse files
authored
Merge pull request #50 from oracle-samples/49-add-gettechniciansroute
49 add gettechniciansroute
2 parents 8128f2d + ff5bb27 commit 70acfc3

File tree

5 files changed

+231
-3
lines changed

5 files changed

+231
-3
lines changed

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.2",
8+
"version": "1.18.0",
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: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
OFSBulkUpdateRequest,
2020
OFSGetResourcesParams,
2121
OFSResourceResponse,
22+
OFSResourceRoutesResponse,
2223
} from "./model";
2324

2425
export * from "./model";
@@ -683,6 +684,21 @@ export class OFS {
683684
return allResults;
684685
}
685686

687+
async getResourceRoutes(
688+
resourceId: string,
689+
date: string,
690+
activityFields?: string[]
691+
): Promise<OFSResourceRoutesResponse> {
692+
const partialURL = `/rest/ofscCore/v1/resources/${resourceId}/routes/${date}`;
693+
const queryParams: any = {};
694+
695+
if (activityFields && activityFields.length > 0) {
696+
queryParams.activityFields = activityFields.join(',');
697+
}
698+
699+
return this._get(partialURL, queryParams);
700+
}
701+
686702
// Core: Activities Management
687703
async getActivities(
688704
params: OFSGetActivitiesParams,

src/model.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,3 +284,37 @@ export class OFSResourceResponse extends OFSResponse {
284284
links: undefined,
285285
};
286286
}
287+
288+
export interface OFSGetResourceRoutesParams {
289+
resourceId: string;
290+
date: string;
291+
activityFields?: string[];
292+
}
293+
294+
export interface OFSRouteActivity {
295+
activityId: number;
296+
latitude?: number;
297+
longitude?: number;
298+
status?: string;
299+
[key: string]: any;
300+
}
301+
302+
export interface OFSResourceRoutesData {
303+
routeStartTime?: string;
304+
totalResults: number;
305+
limit: number;
306+
offset: number;
307+
items: OFSRouteActivity[];
308+
links?: any[];
309+
[key: string]: any;
310+
}
311+
312+
export class OFSResourceRoutesResponse extends OFSResponse {
313+
data: OFSResourceRoutesData = {
314+
totalResults: 0,
315+
limit: 100,
316+
offset: 0,
317+
items: [],
318+
};
319+
}
320+
1
Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
/*
2+
* Copyright © 2022, 2023, Oracle and/or its affiliates.
3+
* Licensed under the Universal Permissive License (UPL), Version 1.0 as shown at https://oss.oracle.com/licenses/upl/
4+
*/
5+
6+
import { OFSCredentials } from "../../src/model";
7+
import { OFS } from "../../src/OFS";
8+
import myCredentials from "../credentials_test.json";
9+
10+
var myProxy: OFS;
11+
12+
// Setup info
13+
beforeAll(() => {
14+
myProxy = new OFS(myCredentials);
15+
if ("instance" in myCredentials) {
16+
expect(myProxy.instance).toBe(myCredentials.instance);
17+
} else {
18+
expect(myProxy.baseURL).toBe(myProxy.baseURL);
19+
}
20+
});
21+
22+
test("Get Resource Routes with default activity fields", async () => {
23+
var resourceId = "100000471803411";
24+
var date = "2025-06-23";
25+
var result = await myProxy.getResourceRoutes(resourceId, date);
26+
27+
28+
// Test the method call itself works (doesn't throw)
29+
expect(result).toBeDefined();
30+
expect(result.status).toBeDefined();
31+
expect(result.data).toBeDefined();
32+
33+
// If successful, check the response structure
34+
if (result.status === 200 && result.data) {
35+
// The actual structure may vary, so we test what we can
36+
if (result.data.resourceId) {
37+
expect(result.data.resourceId).toBe(resourceId);
38+
}
39+
if (result.data.date) {
40+
expect(result.data.date).toBe(date);
41+
}
42+
if (result.data.activities) {
43+
expect(Array.isArray(result.data.activities)).toBe(true);
44+
}
45+
}
46+
});
47+
48+
test("Get Resource Routes with specific activity fields", async () => {
49+
var resourceId = "100000471803411";
50+
var date = "2025-06-23";
51+
var activityFields = ["latitude", "longitude", "status"];
52+
var result = await myProxy.getResourceRoutes(resourceId, date, activityFields);
53+
54+
// Test the method call works with parameters
55+
expect(result).toBeDefined();
56+
expect(result.status).toBeDefined();
57+
expect(result.data).toBeDefined();
58+
59+
// If successful, check the response structure
60+
if (result.status === 200 && result.data) {
61+
if (result.data.resourceId) {
62+
expect(result.data.resourceId).toBe(resourceId);
63+
}
64+
if (result.data.date) {
65+
expect(result.data.date).toBe(date);
66+
}
67+
if (result.data.activities) {
68+
expect(Array.isArray(result.data.activities)).toBe(true);
69+
70+
// Check if activities contain the requested fields
71+
if (result.data.activities.length > 0) {
72+
var activity = result.data.activities[0];
73+
expect(activity.activityId).toBeDefined();
74+
// Note: latitude, longitude, status might not be present if not available for the activity
75+
}
76+
}
77+
}
78+
});
79+
80+
test("Get Resource Routes with multiple activity fields", async () => {
81+
var resourceId = "100000471803411";
82+
var date = "2025-06-23";
83+
var activityFields = ["latitude", "longitude", "status", "activityType", "customerName"];
84+
var result = await myProxy.getResourceRoutes(resourceId, date, activityFields);
85+
86+
if (result.status !== 200) {
87+
console.log("Get Resource Routes with multiple fields ERROR:", result);
88+
}
89+
90+
expect(result.status).toBe(200);
91+
expect(result.data).toBeDefined();
92+
});
93+
94+
test("Get Resource Routes with invalid resource ID", async () => {
95+
var resourceId = "INVALID_RESOURCE_ID";
96+
var date = "2025-06-23";
97+
var result = await myProxy.getResourceRoutes(resourceId, date);
98+
99+
// Expecting 404 or similar error status for invalid resource ID
100+
expect(result.status).toBeGreaterThanOrEqual(400);
101+
expect(result.status).toBeLessThan(500);
102+
});
103+
104+
test("Get Resource Routes with invalid date format", async () => {
105+
var resourceId = "100000471803411";
106+
var date = "invalid-date";
107+
var result = await myProxy.getResourceRoutes(resourceId, date);
108+
109+
// Expecting 400 or similar error status for invalid date format
110+
expect(result.status).toBeGreaterThanOrEqual(400);
111+
expect(result.status).toBeLessThan(500);
112+
});
113+
114+
test("Get Resource Routes with future date", async () => {
115+
var resourceId = "100000471803411";
116+
var date = "2025-12-31";
117+
var result = await myProxy.getResourceRoutes(resourceId, date);
118+
119+
// Future dates might return 200 with empty data or an error
120+
expect(result.status).toBeLessThan(500);
121+
expect(result.data).toBeDefined();
122+
});
123+
124+
test("Get Resource Routes with past date", async () => {
125+
var resourceId = "100000471803411";
126+
var date = "2024-01-01";
127+
var result = await myProxy.getResourceRoutes(resourceId, date);
128+
129+
// Past dates should work if data exists
130+
expect(result.status).toBeLessThan(500);
131+
expect(result.data).toBeDefined();
132+
});
133+
134+
test("Get Resource Routes with empty activity fields array", async () => {
135+
var resourceId = "100000471803411";
136+
var date = "2025-06-23";
137+
var activityFields: string[] = [];
138+
var result = await myProxy.getResourceRoutes(resourceId, date, activityFields);
139+
140+
if (result.status !== 200) {
141+
console.log("Get Resource Routes with empty fields ERROR:", result);
142+
}
143+
144+
expect(result.status).toBe(200);
145+
expect(result.data).toBeDefined();
146+
});
147+
148+
test("Get Resource Routes response structure validation", async () => {
149+
var resourceId = "100000471803411";
150+
var date = "2025-06-23";
151+
var result = await myProxy.getResourceRoutes(resourceId, date);
152+
153+
// Basic validation - method should return a proper response object
154+
expect(result).toBeDefined();
155+
expect(result.status).toBeDefined();
156+
expect(typeof result.status).toBe('number');
157+
expect(result.data).toBeDefined();
158+
159+
if (result.status === 200) {
160+
// Validate response structure if successful
161+
if (result.data.resourceId) {
162+
expect(result.data.resourceId).toBeDefined();
163+
}
164+
if (result.data.date) {
165+
expect(result.data.date).toBeDefined();
166+
}
167+
if (result.data.activities) {
168+
expect(Array.isArray(result.data.activities)).toBe(true);
169+
170+
// If there are activities, validate their structure
171+
if (result.data.activities.length > 0) {
172+
var activity = result.data.activities[0];
173+
expect(activity.activityId).toBeDefined();
174+
expect(typeof activity.activityId).toBe('number');
175+
}
176+
}
177+
}
178+
});

0 commit comments

Comments
 (0)