Scripted Rest API input from Service Portal Widget.

peti4949
Giga Expert

Hello Guys,

 

i have created a Scripted REST API which i cannot make to take input from the Widget of a Service Portal,

 

Here is the partial code of the script:

 

 

 

 

 

 

(function process( /*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {
var instanceName = gs.getProperty('instance_name');
var userData = [];

var monthFilter = request.getParameter("month");
gs.info("Received Month Parameter: " + monthFilter);
var filterQuery = "";
var comments = [];
switch (monthFilter) {
case "01":
case "02":
case "03":
case "04":
case "05":
case "06":
case "07":
case "08":
case "09":
case "10":
case "11":
case "12":
filterQuery = "resolved_atON" + monthFilter + "@javascript:gs.dateGenerate('" + new Date().getFullYear() + "', '" + monthFilter + "', '01', '00:00:00')@javascript:gs.dateGenerate('" + new Date().getFullYear() + "', '" + (parseInt(monthFilter) + 1) + "', '01', '00:00:00')";
break;
case "thisMonth":
filterQuery = "resolved_atONThis month@javascript:gs.beginningOfThisMonth()@javascript:gs.endOfThisMonth()";
gs.info("Constructed filter for specific month: " + filterQuery);

break;
case "lastMonth":
filterQuery = "resolved_atONLast month@javascript:gs.beginningOfLastMonth()@javascript:gs.endOfLastMonth()";
gs.info("Constructed filter for specific month: " + filterQuery);
break;
case "last3Months":
filterQuery = "resolved_atONLast 3 months@javascript:gs.beginningOfLast3Months()@javascript:gs.endOfLast3Months()";
gs.info("Constructed filter for specific month: " + filterQuery);
break;
}

 

 

 

 

 

 

 

I want to take that input and make it a filter element for this encoded querry:

 

 

 

 

 

 

var inc = new GlideRecord("incident");
        inc.addEncodedQuery("/*other filters*/^" + filterQuery + "^/*other filters*/");

 

 

 

 

 

 

But appears by the logs that the script doesnt take any input whatsoever despite in the url the request is correctly filtered.

 

Here is the Widget code that takes the input and makes a request:

 

Partial Body HTML template of the input:

 

 

 

 

 

 

<label for="monthSelect">Select Filter:</label>
<select ng-model="c.selectedMonth" id="monthSelect">
  	<option value="01">Jan</option>
    <option value="02">Feb</option>
    <option value="03">Mar</option>
    <option value="04">Apr</option>
    <option value="05">May</option>
    <option value="06">Jun</option>
    <option value="07">Jul</option>
    <option value="08">Aug</option>
    <option value="09">Sep</option>
    <option value="10">Oct</option>
    <option value="11">Nov</option>
    <option value="12">Dec</option>
    <option value="thisMonth">This Month</option>
    <option value="lastMonth">Last Month</option>
    <option value="last3Months">Last 3 Months</option>
</select>
<button ng-click="c.getFilteredData()">Get Data</button>

 

 

 

 

 

 

Client controller for the widget:

 

 

 

 

 

api.controller = function($http, spUtil) {
    var c = this;
    c.data.users = []; 
    c.getFilteredData = function() {
        var apiUrl = '*path to the resource*/getReport';
        apiUrl += '?month=' + c.selectedMonth;
        $http.get(apiUrl).then(function(response) {
            c.data.users = response.data.result; 
        }, function(error) {
            spUtil.addErrorMessage('Error fetching data.');
        });
    };
};

 

 

 

 

 

 

Http request on submit:

GET
*path to rest api*/getReport?month=thisMonth

 

What did i miss that it isn't passing the input to the month variable in the script and then the constructor?

 

 

(I deleted some data for privacy.)

 

Here is the comment in the response of what encoded query was used:

 

script:
comments.push("Filter used: ", filterQuery);

response: 
"comments": [ "Filter used: ", "", "Filter used: ", "",
...

 

1 ACCEPTED SOLUTION

peti4949
Giga Expert

I figured out:

var monthFilter = request.queryParams['month'].toString();
 // month paraméter lekérése url paramból
	gs.info("params:" + monthFilter);
	
	var filterQuery = ""; // filter query változó incializálása
	
if (monthFilter === "01" || monthFilter === "02" || monthFilter === "03" || monthFilter === "04" ||
    monthFilter === "05" || monthFilter === "06" || monthFilter === "07" || monthFilter === "08" ||
    monthFilter === "09" || monthFilter === "10" || monthFilter === "11") {
	var nextMonth  = (parseInt(request.queryParams['month'], 10) + 1 ).toString();
    var year = new Date().getFullYear();
    filterQuery = "resolved_atBETWEENjavascript&colon;gs.dateGenerate('" + year + "-" + monthFilter + "-01','00:00:00')@javascript&colon;gs.dateGenerate('" + year + "-" + nextMonth + "-01','00:00:00')";
}
	
else if (monthFilter === "12") {
	nextMonth  = (parseInt(request.queryParams['month'], 10) + 1 ).toString();
    year = new Date().getFullYear();
	var nextyear = new Date().getFullYear();
    if (nextMonth === "13") {
        nextMonth = "01";
        nextyear++;
    }
    filterQuery = "resolved_atBETWEENjavascript&colon;gs.dateGenerate('" + year + "-" + monthFilter + "-01','00:00:00')@javascript&colon;gs.dateGenerate('" + nextyear + "-" + nextMonth + "-01','00:00:00')";
}
	
 else if (monthFilter === "thisMonth") {
    filterQuery = "resolved_atONThis month@javascript&colon;gs.beginningOfThisMonth()@javascript&colon;gs.endOfThisMonth()";
} else if (monthFilter === "lastMonth") {
    filterQuery = "resolved_atONLast month@javascript&colon;gs.beginningOfLastMonth()@javascript&colon;gs.endOfLastMonth()";
} else if (monthFilter === "last3Months") {
    filterQuery = "resolved_atONLast 3 months@javascript&colon;gs.beginningOfLast3Months()@javascript&colon;gs.endOfLast3Months()";
}

View solution in original post

1 REPLY 1

peti4949
Giga Expert

I figured out:

var monthFilter = request.queryParams['month'].toString();
 // month paraméter lekérése url paramból
	gs.info("params:" + monthFilter);
	
	var filterQuery = ""; // filter query változó incializálása
	
if (monthFilter === "01" || monthFilter === "02" || monthFilter === "03" || monthFilter === "04" ||
    monthFilter === "05" || monthFilter === "06" || monthFilter === "07" || monthFilter === "08" ||
    monthFilter === "09" || monthFilter === "10" || monthFilter === "11") {
	var nextMonth  = (parseInt(request.queryParams['month'], 10) + 1 ).toString();
    var year = new Date().getFullYear();
    filterQuery = "resolved_atBETWEENjavascript&colon;gs.dateGenerate('" + year + "-" + monthFilter + "-01','00:00:00')@javascript&colon;gs.dateGenerate('" + year + "-" + nextMonth + "-01','00:00:00')";
}
	
else if (monthFilter === "12") {
	nextMonth  = (parseInt(request.queryParams['month'], 10) + 1 ).toString();
    year = new Date().getFullYear();
	var nextyear = new Date().getFullYear();
    if (nextMonth === "13") {
        nextMonth = "01";
        nextyear++;
    }
    filterQuery = "resolved_atBETWEENjavascript&colon;gs.dateGenerate('" + year + "-" + monthFilter + "-01','00:00:00')@javascript&colon;gs.dateGenerate('" + nextyear + "-" + nextMonth + "-01','00:00:00')";
}
	
 else if (monthFilter === "thisMonth") {
    filterQuery = "resolved_atONThis month@javascript&colon;gs.beginningOfThisMonth()@javascript&colon;gs.endOfThisMonth()";
} else if (monthFilter === "lastMonth") {
    filterQuery = "resolved_atONLast month@javascript&colon;gs.beginningOfLastMonth()@javascript&colon;gs.endOfLastMonth()";
} else if (monthFilter === "last3Months") {
    filterQuery = "resolved_atONLast 3 months@javascript&colon;gs.beginningOfLast3Months()@javascript&colon;gs.endOfLast3Months()";
}