profoundjs
Version:
Profound.js Framework and Server
470 lines • 16.9 kB
JSON
{
"text": "",
"logic": {
"start": {
"steps": [
{
"text": "init",
"answers": {
"plugin": "Custom:code",
"custom-code": "try {\r\n // In case the oa data was missing, the page will go to the redirect.\r\n const oautils = require(\"./oautils.js\");\r\n var oauthurl = oautils.startURI;\r\n\r\n pjs.session.provider = oautils.provider;\r\n}\r\ncatch(err){\r\n var message = String(err);\r\n}",
"comment": "and set oa_state"
}
},
{
"text": "Set screen field(s)",
"answers": {
"plugin": "Program Data:set-screen-fields",
"screen": "validating",
"source": "Specify each value individually",
"screen-values": {
"oauth_url": "oauthurl",
"message": "message"
},
"comment": "Pass on server-side data to where client-side can reach it."
}
}
]
},
"Exit": {
"steps": [
{
"text": "Exit",
"answers": {
"plugin": "Client-side:client-side-code",
"code": "pui.confirmOnClose = false;\r\nwindow.location = \"/run/oauth2sample/authpage\";",
"comment": ""
}
}
]
},
"make api request button click": {
"steps": [
{
"text": "httpRequest to API",
"answers": {
"plugin": "Custom:code",
"custom-code": "var oautils = require(\"./oautils.js\");\r\n\r\ntry {\r\n let respData = await pjs.httpRequest({\r\n method: \"POST\",\r\n uri: oautils.PROTOCOL_HOST_PORT +\"/run/oauth2sample/wsapi/postTestService\",\r\n headers: {\r\n \"Authorization\": \"Bearer \" + pjs.session.tokens.access_token\r\n },\r\n alwaysReadBody: true\r\n });\r\n\r\n let ajaxresponseObj = respData;\r\n usefulapp.apiresponse = JSON.stringify(ajaxresponseObj, null, 2);\r\n}\r\ncatch (err){\r\n usefulapp.apiresponse = String(err);\r\n}",
"comment": ""
}
}
]
},
"app screen load": {
"steps": [
{
"text": "Set screen field(s)",
"answers": {
"plugin": "Program Data:set-screen-fields",
"screen": "usefulapp",
"source": "Specify each value individually",
"screen-values": {
"userfld": "pjs.session.user",
"emailfld": "pjs.session.email",
"fldOAProvider": "pjs.session.provider"
},
"comment": "Set the User and Email fields"
}
}
]
},
"validation screen load": {
"code": "// Validation screen load.\r\nconst oautils = require(\"./oautils.js\");\r\n\r\n// Read Fields and Check Code\r\n// \"oa_data\" should be set if the app was started from a redirect from our sample authpage.js.\r\nconst oa_code = validating.oa_data;\r\nconst oa_codver = validating.oa_codver;\r\n\r\n// code valid?\r\nif (typeof oa_code === \"string\" && oa_code.length > 0) {\r\n try {\r\n // Exchange the code for a token.\r\n const tokens = await oautils.fetchTokensAsync(oa_code, oa_codver);\r\n \r\n if (typeof tokens.access_token !== \"string\" || tokens.access_token.length < 1) {\r\n // Token was not valid.\r\n throw new Error(\"Authentication token could not be fetched.\");\r\n }\r\n pjs.session.tokens = tokens;\r\n\r\n // Ask the OAuth2 server for user ID of the user associated with the token.\r\n pjs.session.user = await oautils.getUserIdAsync(tokens.access_token);\r\n\r\n // Show different screen\r\n screenHistory.push(\"usefulapp\");\r\n activeScreen = screens[\"usefulapp\"];\r\n }\r\n catch (err) {\r\n showErrorScreen(err);\r\n }\r\n}\r\n// Else: the code may not be set in a field, because this server side code runs before the\r\n// client-side code can run.\r\n\r\nfunction showErrorScreen(msg) {\r\n const cause = typeof msg.cause === \"object\" && msg.cause !== null ? \" \" + JSON.stringify(msg.cause) : \"\";\r\n Object.assign(error, { \"message\": msg.message + cause });\r\n screenHistory.push(\"error\");\r\n activeScreen = screens[\"error\"];\r\n}\r\n"
}
},
"start routine": "start",
"formats": [
{
"screen": {
"record format name": "validating",
"initial routine": {
"routine": "validation screen load",
"designValue": "validation screen load"
},
"onload": "// Pass on the OAuth2 data to the server, or send the user to the auth page.\nconst oa_data = localStorage.getItem(\"pjs_oadata\");\nconst oa_url = get(\"ofAuthURL\");\n\nif (typeof oa_data === \"string\" && oa_data.length > 0){\n pui.set(\"tb_oa_data\", oa_data);\n pui.set(\"tb_oa_codver\", localStorage.getItem(\"pjs_codver\"));\n localStorage.setItem(\"pjs_oadata\",\"\");\n localStorage.setItem(\"pjs_codver\",\"\");\n pui.click();\n}\nelse if(typeof oa_url === \"string\" && oa_url.length > 0) {\n localStorage.setItem(\"pjs_oadata\",\"\");\n window.location = oa_url + \"?error=Redirected+from+validation+page\";\n}\nelse {\n pui.set(\"message\", \"The required OAuth2 data was missing, and the sample application's start URI was not set in oautils.js\");\n}"
},
"items": [
{
"id": "OutputField1",
"field type": "output field",
"css class": "heading",
"value": "Validating...",
"left": "15px",
"top": "20px",
"css class 2": "blueprint-defaults",
"css class 3": "blueprint-text-header"
},
{
"id": "btnCancel",
"field type": "graphic button",
"css class": "pui-solid-button-no",
"value": "Exit",
"left": "15px",
"top": "170px",
"width": "100px",
"css class 2": "blueprint-defaults",
"height": "25px",
"onclick": {
"routine": "Exit",
"designValue": "Exit"
}
},
{
"id": "ofAuthURL",
"field type": "html container",
"css class": "outputField",
"left": "30px",
"top": "435px",
"css class 2": "blueprint-defaults",
"css class 3": "blueprint-output-field",
"visibility": "hidden",
"width": "610px",
"html": {
"fieldName": "oauth_url",
"trimLeading": "false",
"trimTrailing": "true",
"blankFill": "false",
"rjZeroFill": "false",
"dataType": "string",
"formatting": "Text",
"textTransform": "none",
"designValue": "[oauth_url]"
},
"white space": "pre-wrap",
"height": "95px"
},
{
"id": "tb_oa_data",
"field type": "textbox",
"css class": "blueprint-defaults",
"value": {
"fieldName": "oa_data",
"trimLeading": "false",
"trimTrailing": "true",
"blankFill": "false",
"rjZeroFill": "false",
"dataType": "string",
"formatting": "Text",
"textTransform": "none",
"designValue": "[oa_data]"
},
"left": "170px",
"top": "330px",
"width": "150px",
"height": "25px",
"css class 2": "blueprint-textbox",
"visibility": "hidden",
"read only": "true"
},
{
"id": "OutputField4",
"field type": "output field",
"css class": "label",
"value": "Code:",
"left": "30px",
"top": "330px",
"css class 2": "blueprint-defaults",
"css class 3": "blueprint-label",
"visibility": "hidden"
},
{
"id": "OutputField6",
"field type": "output field",
"css class": "label",
"value": "Auth URL in case of error",
"left": "20px",
"top": "410px",
"css class 2": "blueprint-defaults",
"css class 3": "blueprint-label",
"visibility": "hidden",
"width": "195px",
"height": "25px"
},
{
"id": "HtmlContainer1",
"field type": "html container",
"left": "15px",
"top": "45px",
"html": "Checking your user token with the OAuth2 provider configured in the openapi.json config file.",
"white space": "normal",
"width": "685px",
"height": "35px"
},
{
"id": "HtmlContainer2",
"field type": "html container",
"left": "15px",
"top": "85px",
"html": {
"fieldName": "message",
"trimLeading": "false",
"trimTrailing": "true",
"blankFill": "false",
"rjZeroFill": "false",
"dataType": "string",
"formatting": "Text",
"textTransform": "none",
"designValue": "[message]"
},
"white space": "normal",
"width": "520px",
"height": "75px"
},
{
"id": "Label1",
"field type": "output field",
"css class": "label",
"value": "Hidden Fields Used to relay OAuth2 data:",
"left": "25px",
"top": "290px",
"width": "150px",
"visibility": "hidden",
"text align": "left"
},
{
"id": "OutputField2",
"field type": "output field",
"css class": "label",
"value": "Code Verifier:",
"left": "30px",
"top": "360px",
"css class 2": "blueprint-defaults",
"css class 3": "blueprint-label",
"visibility": "hidden"
},
{
"id": "tb_oa_codver",
"field type": "textbox",
"css class": "blueprint-defaults",
"value": {
"fieldName": "oa_codver",
"trimLeading": "false",
"trimTrailing": "true",
"blankFill": "false",
"rjZeroFill": "false",
"dataType": "string",
"formatting": "Text",
"textTransform": "none",
"designValue": "[oa_codver]"
},
"left": "170px",
"top": "360px",
"width": "150px",
"height": "25px",
"css class 2": "blueprint-textbox",
"visibility": "hidden"
}
]
},
{
"screen": {
"record format name": "usefulapp",
"initial routine": {
"routine": "app screen load",
"designValue": "app screen load"
}
},
"items": [
{
"id": "OutputField1",
"field type": "output field",
"css class": "heading",
"value": "I am Some Useful App that Requires Authentication",
"left": "25px",
"top": "25px",
"css class 2": "blueprint-defaults",
"css class 3": "blueprint-text-header"
},
{
"id": "HtmlContainer1",
"field type": "html container",
"css class": "blueprint-defaults",
"left": "25px",
"top": "55px",
"html": "You signed onto this app via:",
"white space": "normal",
"width": "190px",
"height": "25px",
"css class 2": "blueprint-wrapping-text"
},
{
"id": "btnMakeAPIReq",
"field type": "graphic button",
"css class": "blueprint-button",
"value": "Make API Request",
"icon position": "left",
"left": "10px",
"top": "220px",
"height": "25px",
"width": "155px",
"css class 2": "blueprint-alt-defaults",
"css class 3": "no-icon",
"onclick": {
"routine": "make api request button click",
"designValue": "make api request button click"
}
},
{
"id": "btnExit",
"field type": "graphic button",
"css class": "pui-solid-button-no",
"value": "Exit",
"icon position": "left",
"left": "210px",
"top": "220px",
"height": "25px",
"width": "100px",
"css class 2": "blueprint-defaults",
"onclick": {
"routine": "Exit",
"designValue": "Exit"
}
},
{
"id": "Layout1",
"field type": "layout",
"left": "10px",
"top": "260px",
"template": "fieldset",
"width": "625px",
"height": "320px",
"legend": "API Response"
},
{
"id": "OutputField2",
"field type": "output field",
"css class": "label",
"value": "User:",
"left": "30px",
"top": "95px",
"css class 2": "blueprint-defaults",
"css class 3": "blueprint-label"
},
{
"id": "OutputField3",
"field type": "output field",
"css class": "outputField",
"value": {
"fieldName": "userfld",
"trimLeading": "false",
"trimTrailing": "true",
"blankFill": "false",
"rjZeroFill": "false",
"dataType": "string",
"formatting": "Text",
"textTransform": "none",
"designValue": "[userfld]"
},
"left": "85px",
"top": "95px",
"css class 2": "blueprint-defaults",
"css class 3": "blueprint-output-field"
},
{
"id": "HtmlContainer3",
"field type": "html container",
"left": "10px",
"top": "130px",
"html": "Clicking \"Make API Request\" will call a sample API using an OAuth2 token associated with your username. The API Security Store must permit your username to access the API, or else a 403 error will be returned.",
"white space": "normal",
"width": "620px",
"height": "75px"
},
{
"id": "OutputField6",
"field type": "output field",
"css class": "outputField",
"value": {
"fieldName": "fldOAProvider",
"trimLeading": "false",
"trimTrailing": "true",
"blankFill": "false",
"rjZeroFill": "false",
"dataType": "string",
"formatting": "Text",
"textTransform": "none",
"designValue": "[fldOAProvider]"
},
"left": "215px",
"top": "60px"
},
{
"id": "ajaxresponse",
"field type": "html container",
"white space": "pre-wrap",
"html": {
"fieldName": "apiresponse",
"trimLeading": "false",
"trimTrailing": "true",
"blankFill": "false",
"rjZeroFill": "false",
"dataType": "string",
"formatting": "Text",
"textTransform": "none",
"designValue": "[apiresponse]"
},
"left": "5px",
"top": "5px",
"height": "calc(100% - 10px)",
"width": "calc(100% - 10px)",
"layout": "Layout1",
"container": "1"
}
]
},
{
"screen": {
"record format name": "error"
},
"items": [
{
"id": "OutputField1",
"field type": "output field",
"css class": "heading",
"value": "Error",
"left": "10px",
"top": "10px",
"css class 2": "blueprint-defaults",
"css class 3": "blueprint-text-header"
},
{
"id": "HtmlContainer2",
"field type": "html container",
"white space": "normal",
"html": {
"fieldName": "message",
"trimLeading": "false",
"trimTrailing": "true",
"blankFill": "false",
"rjZeroFill": "false",
"dataType": "string",
"formatting": "Text",
"textTransform": "none",
"designValue": "[message]"
},
"left": "15px",
"top": "70px",
"height": "270px",
"width": "520px"
},
{
"id": "btnCancel",
"field type": "graphic button",
"css class": "pui-solid-button-no",
"value": "Exit",
"left": "15px",
"top": "40px",
"height": "25px",
"width": "100px",
"css class 2": "blueprint-defaults",
"onclick": {
"routine": "Exit",
"designValue": "Exit"
}
}
]
}
],
"keywords": [],
"long name aliases": true
}