Skip to content

Commit db8fe14

Browse files
committed
Merge pull request #1 from aclavio/ember-impl
Ember impl
2 parents 0ae3751 + 57f3af6 commit db8fe14

30 files changed

+55544
-383
lines changed

README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,18 @@
33
## Overview
44
MarkLogic Script Runner is a web application designed to allow users to quickly run server-side MarkLogic scripts without needing to use the qconsole, or have any xquery background.
55

6+
## Scripts
7+
Scripts are defined via xml configuration files. These script definition files must be located within a database on the MarkLogic Server where the scripts are to be executed. Each script definition should have the following form:
8+
9+
```xml
10+
<scripts xmlns="http://marklogic.com/script-runner/scripts">
11+
<script name="Example" category="Samples">
12+
<description>This is a sample script description.</description>
13+
<path>/test/sample-script.xqy</path>
14+
<content-db>content-db-name</content-db>
15+
<modules-db>modules-db-name</modules-db>
16+
</script>
17+
</scripts>
18+
```
19+
620

data/more-scripts.xml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<scripts xmlns="http://marklogic.com/script-runner/scripts">
2+
<script name="Connection Service" category="Samples">
3+
<description>Lets you know if you're connected</description>
4+
<path>/support/scripts/connected.xqy</path>
5+
<content-db>sof-sdl-content</content-db>
6+
<modules-db>sof-sdl-modules</modules-db>
7+
</script>
8+
<script name="Data Source Status" category="Samples">
9+
<description>Status of Data Sources</description>
10+
<path>/support/scripts/data-sources-status.xqy</path>
11+
<content-db>sof-sdl-content</content-db>
12+
<modules-db>sof-sdl-modules</modules-db>
13+
</script>
14+
<script name="Headers Exposed" category="Samples">
15+
<description>Examine HTTP headers</description>
16+
<path>/support/scripts/headers-exposed.xqy</path>
17+
<content-db>sof-sdl-content</content-db>
18+
<modules-db>sof-sdl-modules</modules-db>
19+
</script>
20+
</scripts>

data/scripts.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<scripts xmlns="http://marklogic.com/script-runner/scripts">
2+
<script name="Example" category="Samples">
3+
<description>This is a sample script description.</description>
4+
<path>/test/sample-script.xqy</path>
5+
<content-db>content-db-name</content-db>
6+
<modules-db>modules-db-name</modules-db>
7+
<parameters>
8+
<param name="name" namespace="http://test" type="xs:string" default="John Doe" />
9+
<param name="age" namespace="http://test" type="xs:int" default="20" />
10+
</parameters>
11+
</script>
12+
</scripts>

deploy/build.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ config.file=${basedir}/deploy/ml-config.xml
6060
#
6161
# The ports used by your application
6262
#
63-
app-port=8060
63+
app-port=8062
6464
xcc-port=8061
6565
# odbc-port=8043
6666

deploy/ml-config.xml

Lines changed: 1 addition & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -1,87 +1,5 @@
11
<configuration>
2-
<!--
3-
Only enable the task server section if you need to.
4-
<task-server group="Default" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://marklogic.com/xdmp/group" xsi:schemaLocation="http://marklogic.com/xdmp/group group.xsd">
5-
<threads>16</threads>
6-
<debug-threads>16</debug-threads>
7-
<max-time-limit>3600</max-time-limit>
8-
<default-time-limit>600</default-time-limit>
9-
<queue-size>100000</queue-size>
10-
<pre-commit-trigger-depth>1000</pre-commit-trigger-depth>
11-
<post-commit-trigger-depth>1000</post-commit-trigger-depth>
12-
<pre-commit-trigger-limit>10000</pre-commit-trigger-limit>
13-
<log-errors>true</log-errors>
14-
<debug-allow>true</debug-allow>
15-
<profile-allow>true</profile-allow>
16-
<scheduled-tasks>
17-
<scheduled-task>
18-
<task-path>/some/daily-task.xqy</task-path>
19-
<task-root>/</task-root>
20-
<task-type>daily</task-type>
21-
<task-period>2</task-period>
22-
<task-start-time>13:00:00-05:00</task-start-time>
23-
<task-database name="@ml.content-db"/>
24-
<task-modules name="@ml.app-modules-db"/>
25-
<task-user name="@ml.app-name-user"/>
26-
</scheduled-task>
27-
<scheduled-task>
28-
<task-path>/some/hourly-task.xqy</task-path>
29-
<task-root>/</task-root>
30-
<task-type>hourly</task-type>
31-
<task-period>2</task-period>
32-
<task-minute>15</task-minute>
33-
<task-database name="@ml.content-db"/>
34-
<task-modules name="@ml.app-modules-db"/>
35-
<task-user name="@ml.app-name-user"/>
36-
</scheduled-task>
37-
<scheduled-task>
38-
<task-path>/some/minutely-task.xqy</task-path>
39-
<task-root>/</task-root>
40-
<task-type>minutely</task-type>
41-
<task-period>3</task-period>
42-
<task-database name="@ml.content-db"/>
43-
<task-modules name="@ml.app-modules-db"/>
44-
<task-user name="@ml.app-name-user"/>
45-
</scheduled-task>
46-
<scheduled-task>
47-
<task-path>/some/monthly-task.xqy</task-path>
48-
<task-root>/</task-root>
49-
<task-type>monthly</task-type>
50-
<task-period>1</task-period>
51-
<task-month-day>15</task-month-day>
52-
<task-start-time>13:00:00-05:00</task-start-time>
53-
<task-database name="@ml.content-db"/>
54-
<task-modules name="@ml.app-modules-db"/>
55-
<task-user name="@ml.app-name-user"/>
56-
</scheduled-task>
57-
<scheduled-task>
58-
<task-path>/some/once-task.xqy</task-path>
59-
<task-root>/</task-root>
60-
<task-type>once</task-type>
61-
<task-period>1</task-period>
62-
<task-start>2019-01-01T13:00:00-05:00</task-start>
63-
<task-database name="@ml.content-db"/>
64-
<task-modules name="@ml.app-modules-db"/>
65-
<task-user name="@ml.app-name-user"/>
66-
</scheduled-task>
67-
<scheduled-task>
68-
<task-path>/some/weekly-task.xqy</task-path>
69-
<task-root>/</task-root>
70-
<task-type>weekly</task-type>
71-
<task-period>1</task-period>
72-
<task-days>
73-
<task-day>monday</task-day>
74-
<task-day>wednesday</task-day>
75-
<task-day>friday</task-day>
76-
</task-days>
77-
<task-start-time>13:00:00-05:00</task-start-time>
78-
<task-database name="@ml.content-db"/>
79-
<task-modules name="@ml.app-modules-db"/>
80-
<task-user name="@ml.app-name-user"/>
81-
</scheduled-task>
82-
</scheduled-tasks>
83-
</task-server>
84-
-->
2+
853
<http-servers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://marklogic.com/xdmp/group" xsi:schemaLocation="http://marklogic.com/xdmp/group group.xsd">
864
<!--Default Application Server-->
875
<http-server group="Default">

src/app/config/config.xqy

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,70 @@ declare variable $c:ROXY-OPTIONS :=
5252
:)
5353
declare variable $c:ROXY-ROUTES :=
5454
<routes xmlns="http://marklogic.com/appservices/rest">
55+
56+
<!--
5557
<request uri="^/scripts/main(/)?$" endpoint="/roxy/query-router.xqy">
5658
<uri-param name="controller">scripts</uri-param>
5759
<uri-param name="func">main</uri-param>
5860
<uri-param name="format">html</uri-param>
5961
<http method="GET"/>
6062
</request>
63+
-->
64+
65+
<request uri="^/api/database(/)?$" endpoint="/roxy/query-router.xqy">
66+
<http method="GET"/>
67+
<uri-param name="controller">scripts</uri-param>
68+
<uri-param name="func">get-databases</uri-param>
69+
<uri-param name="format">json</uri-param>
70+
</request>
71+
72+
<request uri="^/api/database/([%25\-\w\._!'\*\(\)]+)/script[/]?$" endpoint="/roxy/query-router.xqy">
73+
<http method="GET"/>
74+
<uri-param name="controller">scripts</uri-param>
75+
<uri-param name="func">find-scripts</uri-param>
76+
<uri-param name="format">json</uri-param>
77+
<uri-param name="db-name">$1</uri-param>
78+
</request>
79+
80+
<request uri="^/api/database/([%25\-\w\._!'\*\(\)]+)/script/([%25\-\w\._!'\*\(\)]+)[/]?$" endpoint="/roxy/query-router.xqy">
81+
<http method="GET"/>
82+
<uri-param name="controller">scripts</uri-param>
83+
<uri-param name="func">find-script</uri-param>
84+
<uri-param name="format">json</uri-param>
85+
<uri-param name="db-name">$1</uri-param>
86+
<uri-param name="script-name">$2</uri-param>
87+
</request>
88+
89+
<request uri="^/api/database/([%25\-\w\._!'\*\(\)]+)/script/([%25\-\w\._!'\*\(\)]+)[/]?$" endpoint="/roxy/query-router.xqy">
90+
<http method="POST"/>
91+
<uri-param name="controller">scripts</uri-param>
92+
<uri-param name="func">run-script</uri-param>
93+
<uri-param name="format">html</uri-param>
94+
<uri-param name="db-name">$1</uri-param>
95+
<uri-param name="script-name">$2</uri-param>
96+
</request>
97+
98+
<!--
99+
samples
100+
<request uri="^/api/workspace/(\d+)/user/(\d+)[/]?$" endpoint="/roxy/update-router.xqy">
101+
<http method="POST" />
102+
<uri-param name="func">transfer-workspace-ownership-to-user</uri-param>
103+
<uri-param name="controller">workspace</uri-param>
104+
<uri-param name="format">json</uri-param>
105+
<uri-param name="workspace-id">$1</uri-param>
106+
<uri-param name="user-id">$2</uri-param>
107+
</request>
108+
<request uri="^/api/workspace[/]?$" endpoint="/roxy/update-router.xqy">
109+
<http method="GET" />
110+
<uri-param name="func">get-all-workspaces</uri-param>
111+
<uri-param name="controller">workspace</uri-param>
112+
<uri-param name="format">json</uri-param>
113+
</request>
114+
-->
115+
116+
<!-- UI Code passthru -->
117+
<request uri="^/ui(/|.*)?" endpoint="/app/views/main.xqy" />
118+
<request uri="^/unauthorized[/]?$" endpoint="/app/views/401.xqy" />
61119
{
62120
$def:ROXY-ROUTES/rest:request
63121
}

src/app/controllers/scripts.xqy

Lines changed: 57 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,13 @@ xquery version "1.0-ml";
22

33
module namespace c = "http://marklogic.com/roxy/controller/scripts";
44

5-
(: the controller helper library provides methods to control which view and template get rendered :)
6-
import module namespace ch = "http://marklogic.com/roxy/controller-helper" at "/roxy/lib/controller-helper.xqy";
7-
8-
(: The request library provides awesome helper methods to abstract get-request-field :)
5+
import module namespace ch = "http://marklogic.com/roxy/controller-helper" at "/roxy/lib/controller-helper.xqy";
96
import module namespace req = "http://marklogic.com/roxy/request" at "/roxy/lib/request.xqy";
10-
11-
import module namespace m = "http://marklogic.com/roxy/models/scripts" at "/app/models/scripts-lib.xqy";
7+
import module namespace m = "http://marklogic.com/roxy/models/scripts" at "/app/models/scripts-lib.xqy";
128

139
declare option xdmp:mapping "false";
1410

11+
(:
1512
declare function c:main() as item()*
1613
{
1714
let $dbs := m:get-databases()
@@ -24,14 +21,46 @@ declare function c:main() as item()*
2421
ch:add-value("scripts", $scripts)
2522
)
2623
};
24+
:)
25+
26+
declare function c:get-databases() {
27+
let $dbs := json:to-array(m:get-databases())
28+
return (
29+
xdmp:set-response-code(200, "success"),
30+
xdmp:to-json($dbs)
31+
)
32+
};
33+
34+
declare function c:find-script()
35+
{
36+
let $db-name := req:required("db-name", "type=xs:string")
37+
let $script-name := req:required("script-name", "type=xs:string")
38+
let $script := m:find-script($db-name, $script-name)
39+
40+
return (
41+
xdmp:set-response-code(200, "success"),
42+
xdmp:to-json($script)
43+
)
44+
};
45+
46+
declare function c:find-scripts()
47+
{
48+
let $db-name := req:required("db-name", "type=xs:string")
49+
let $scripts := m:find-scripts($db-name)
50+
51+
return (
52+
xdmp:set-response-code(200, "success"),
53+
xdmp:to-json($scripts)
54+
)
55+
};
2756

28-
declare function c:find()
57+
declare function c:find-scripts-legacy()
2958
{
3059
(: query params :)
3160
let $modules-db := req:required("modules-db", "type=xs:string")
3261
let $scripts-dir := req:get("scripts-dir", "/", "type=xs:string")
3362

34-
let $scripts := m:find-scripts($modules-db, $scripts-dir)
63+
let $scripts := m:find-scripts-legacy($modules-db, $scripts-dir)
3564
let $scripts-maps :=
3665
for $s in $scripts
3766
let $m := map:map()
@@ -42,7 +71,7 @@ declare function c:find()
4271
return $m
4372

4473
return (
45-
ch:set-format("text"),
74+
xdmp:set-response-code(200, "success"),
4675
if (fn:exists($scripts-maps)) then
4776
if (fn:count($scripts-maps) gt 1) then
4877
xdmp:to-json($scripts-maps)
@@ -55,9 +84,25 @@ declare function c:find()
5584
)
5685
};
5786

58-
declare function c:run()
87+
declare function c:run-script() {
88+
let $db-name := req:required("db-name", "type=xs:string")
89+
let $script-name := req:required("script-name", "type=xs:string")
90+
let $script := m:find-script($db-name, $script-name)
91+
92+
return (
93+
if ($script) then (
94+
xdmp:set-response-code(200, "success"),
95+
m:run-script($script)
96+
) else (
97+
xdmp:set-response-code(404, "script not found"),
98+
"script not found"
99+
)
100+
)
101+
};
102+
103+
(:
104+
declare function c:run-legacy()
59105
{
60-
(: query params :)
61106
let $content-db := req:required("content-db", "type=xs:string")
62107
let $modules-db := req:required("modules-db", "type=xs:string")
63108
let $script := req:required("script", "type=xs:string")
@@ -70,4 +115,4 @@ declare function c:run()
70115
xdmp:quote($result)
71116
)
72117
};
73-
118+
:)

0 commit comments

Comments
 (0)