diff --git a/deploy/internal-auth/.env b/deploy/internal-auth/.env new file mode 100644 index 00000000..718338bd --- /dev/null +++ b/deploy/internal-auth/.env @@ -0,0 +1,8 @@ +# In this setting it is assumed there is no apapche/nginx in front of the application +RECORD_SET_NAME=iauth-example +PORT=1235 +RECORD_MANAGER_SERVER_URL=http://localhost:1235/record-manager/record-manager-server +FORMGEN_SERVICE_URL=http://s-pipes-engine:8080/s-pipes/service?_pId=clone-form +RECORD_MANAGER_APP_TITLE=Record manager +RECORD_MANAGER_BASENAME=/record-manager +LANGUAGE=en diff --git a/deploy/internal-auth/db-server/Dockerfile b/deploy/internal-auth/db-server/Dockerfile new file mode 100644 index 00000000..98242c09 --- /dev/null +++ b/deploy/internal-auth/db-server/Dockerfile @@ -0,0 +1,22 @@ +FROM ontotext/graphdb:10.2.0 + +# Override parent entrypoint +ENTRYPOINT [] + +ENV GRAPHDB_HOME=/opt/graphdb/home +ENV GRAPHDB_INSTALL_DIR=/opt/graphdb/dist + +WORKDIR ${GRAPHDB_HOME} + +# Install libs related to RDF processing +RUN apk add py3-rdflib +RUN apk add perl-uri + +# Copy initialization data and repository config +COPY init-data /root/graphdb-import +COPY init-config /repo-config +COPY bin/* ${GRAPHDB_INSTALL_DIR}/bin/ + +EXPOSE 7200 + +CMD ${GRAPHDB_INSTALL_DIR}/bin/repo-init.sh /repo-config ${GRAPHDB_HOME} & ${GRAPHDB_INSTALL_DIR}/bin/graphdb -Dgraphdb.home=${GRAPHDB_HOME} -Dgraphdb.logback=${GRAPHDB_INSTALL_DIR}/conf/logback.xml diff --git a/deploy/internal-auth/db-server/bin/get-rdf-subject-by-type.py b/deploy/internal-auth/db-server/bin/get-rdf-subject-by-type.py new file mode 100755 index 00000000..d8675b77 --- /dev/null +++ b/deploy/internal-auth/db-server/bin/get-rdf-subject-by-type.py @@ -0,0 +1,75 @@ +#!/usr/bin/python3 + +import sys +from rdflib import Graph, URIRef + +def log(message): + print("ERROR: " + message, file=sys.stderr) + +def check_params(): + if len(sys.argv) != 3: + log(f"""Illegal number of parameters. + +Script returns single subject of triple matching the pattern '?result a ' +from the file specified by . + +Usage: {sys.argv[0]} + +Example: {sys.argv[0]} "./init-data/forms/example-1.ttl" "http://onto.fel.cvut.cz/ontologies/form/form-template" +""") + sys.exit(1) + +def check_only_one_instance(results, rdf_type): + if len(results) == 0: + log(f"No instance found for the specified {rdf_type}.") + sys.exit(2) + elif len(results) > 1: + error_message = f"Multiple instances found for the type {rdf_type}. Triple that match pattern '?s a <{rdf_type}>' are:\n" + for row in results: + subject = row[0] + error_message += f" {subject.n3()} a <{rdf_type}> .\n" + log(error_message) + sys.exit(3) + + +def load_rdf_graph(file_path): + # Load RDF file into an RDFLib graph + g = Graph() + + # Explicitly specify the format based on the file extension + if file_path.endswith(".ttl"): + g.parse(file_path, format="turtle") + elif file_path.endswith(".rdf"): + g.parse(file_path, format="xml") + else: + log(f"Unsupported RDF file format of {file_path}.") + sys.exit(1) + + return g + +def main(): + check_params() + + file_path = sys.argv[1] + rdf_type = URIRef(sys.argv[2]) + + g = load_rdf_graph(file_path) + + # Query for subjects with the specified RDF type + query = f""" + SELECT ?subject + WHERE {{ + ?subject a <{rdf_type}>. + }} + """ + + results = g.query(query) + + check_only_one_instance(results, rdf_type) + + for row in results: + subject = row[0] + print(subject.n3()) + +if __name__ == "__main__": + main() diff --git a/deploy/internal-auth/db-server/bin/get-value-of-rdf-property.py b/deploy/internal-auth/db-server/bin/get-value-of-rdf-property.py new file mode 100755 index 00000000..0d69a7bd --- /dev/null +++ b/deploy/internal-auth/db-server/bin/get-value-of-rdf-property.py @@ -0,0 +1,73 @@ +#!/usr/bin/python3 + +import sys +from rdflib import Graph, URIRef + +def log(message): + print("ERROR: " + message, file=sys.stderr) + +def check_params(): + if len(sys.argv) != 3: + log(f"""Illegal number of parameters. + +Script returns single value of from file specified by . + +Usage: {sys.argv[0]} + +Example: {sys.argv[0]} "./init-config/repo-config.ttl" "http://www.openrdf.org/config/repository#repositoryID" +""") + sys.exit(1) + + +def check_property_has_single_value(results, rdf_property): + if len(results) == 0: + log(f"No values found for the specified property {rdf_property}.") + sys.exit(2) + elif len(results) > 1: + error_message = f"Multiple values found for the property {rdf_property}. Triple that match pattern '?s <{rdf_property}> ?o' are:\n" + for row in results: + subject, value = row + error_message += f" {subject} {rdf_property} {value} .\n" + log(error_message) + sys.exit(3) + +def load_rdf_graph(file_path): + # Load RDF file into an RDFLib graph + g = Graph() + + # Explicitly specify the format based on the file extension + if file_path.endswith(".ttl"): + g.parse(file_path, format="turtle") + elif file_path.endswith(".rdf"): + g.parse(file_path, format="xml") + else: + log(f"Unsupported RDF file format of {file_path}.") + sys.exit(1) + return g + +def main(): + check_params() + + file_path = sys.argv[1] + rdf_property = URIRef(sys.argv[2]) + + g = load_rdf_graph(file_path) + + # Query for subjects with the specified property + query = f""" + SELECT ?subject ?value + WHERE {{ + ?subject <{rdf_property}> ?value. + }} + """ + results = g.query(query) + + check_property_has_single_value(results, rdf_property) + + for row in results: + subject, value = row + print(f"{value}") + +if __name__ == "__main__": + main() + diff --git a/deploy/internal-auth/db-server/bin/rdf4j-deploy-context.sh b/deploy/internal-auth/db-server/bin/rdf4j-deploy-context.sh new file mode 100755 index 00000000..97e9849f --- /dev/null +++ b/deploy/internal-auth/db-server/bin/rdf4j-deploy-context.sh @@ -0,0 +1,99 @@ +#!/bin/bash + + +### DEFAULTS ### +APPEND=true +CONTENT_TYPE='text/turtle' +#CONTENT_TYPE='application/trig' +#CONTENT_TYPE='application/rdf+xml' +#CONTENT_TYPE='text/x-nquads' +#CONTENT_TYPE='application/ld+json' + +function print_usage() { + echo "Rdf4j server deploy script." + echo "Parameters: " + echo -e "\t-R -- replace content of GRAPH_IRI (appends by default)" + echo -e "\t-C CONTENT_TYPE -- content type of input FILES, i.e. text/turtle (default), application/rdf+xml ..." + echo "Usage: " + echo -e "\t$0 -R -C -s -r -c " + echo -e "\t$0 -R -C -u -c " + echo "Examples: " + echo -e "\tEXAMPLE-1 (append context): $0 -s http://onto.mondis.cz/openrdf-RDF4J -r ontomind_owlim -c http://onto.mondis.cz/resource/mdr-1.0-SNAPSHOT-temporary mdr.owl" + echo -e "\tEXAMPLE-2 (replace context): $0 -R -C 'text/turtle' -s http://onto.fel.cvut.cz/rdf4j-server -r test -c http://vfn.cz/ontologies/fertility-saving-study study-model.ttl" + echo -e "\tEXAMPLE-3 (replace repository): $0 -R -C 'text/x-nquads' -s http://onto.fel.cvut.cz/rdf4j-server -r test fss-study-formgen.ng" + echo -e "\tEXAMPLE-4 (use of repository url): $0 -R -C 'text/turtle' -u http://onto.fel.cvut.cz/rdf4j-server/repositories/test -c http://vfn.cz/ontologies/fertility-saving-study study-model.ttl" +} + +if [ "$#" -eq 0 ]; then + print_usage + exit +fi + + +while getopts "h:s:r:u:c:RC:" arg; do + case $arg in + h) + print_usage + exit 0 + ;; + s) + RDF4J_SERVER=$OPTARG + ;; + r) + REPOSITORY=$OPTARG + ;; + u) + REPOSITORY_URL=$OPTARG + ;; + c) + GRAPH=$(perl -MURI::Escape -e 'print uri_escape($ARGV[0]);' "<$OPTARG>") + ;; + R) + APPEND=false + ;; + C) + CONTENT_TYPE=$OPTARG + ;; + esac +done + +shift $(($OPTIND-1)) +FILES=$@ + +REPOSITORY_URL=${REPOSITORY_URL:-$RDF4J_SERVER/repositories/$REPOSITORY} + +echo "INFO: *** DEPLOYING ***" +[ ! -z "$REPOSITORY_URL" ] && echo "INFO: - repository url: $REPOSITORY_URL" +[ ! -z "$RDF4J_SERVER" ] && echo "INFO: destination server: $RDF4J_SERVER" +[ ! -z "$REPOSITORY" ] && echo "INFO: - repository $REPOSITORY" +echo "INFO: - graph $GRAPH" +echo "INFO: - files $FILES" + +if [ "$APPEND" = false ] ; then + echo "INFO: *** CLEARING THE GRAPH ***" + TEMP_FILE=`mktemp` + QUERY_PARAMS="context=$GRAPH" + if [ ! "$GRAPH" ]; then QUERY_PARAMS= ; fi + curl $REPOSITORY_URL/statements?$QUERY_PARAMS -v -X DELETE &> $TEMP_FILE + cat $TEMP_FILE | grep "HTTP/1.1 204" &>/dev/null && echo 'INFO: clearing graph was sucessfull' + cat $TEMP_FILE | grep "HTTP/1.1 204" &>/dev/null || ( echo 'ERROR: clearing graph failed. Output of the process : '; cat $TEMP_FILE ) +fi + +echo "INFO: *** SENDING DATA ***" +for FILE in $FILES +do + echo INFO: " -- sending $FILE"; + TEMP_FILE=`mktemp` + QUERY_PARAMS="context=$GRAPH" + if [ ! "$GRAPH" ]; then QUERY_PARAMS= ; fi + + curl -X POST -H "Content-Type: $CONTENT_TYPE" --data-binary "@$FILE" -o - -v "$REPOSITORY_URL/statements?$QUERY_PARAMS" 2> $TEMP_FILE + cat $TEMP_FILE | grep "HTTP/1.1 204" &>/dev/null && echo 'INFO: sending data was sucessfull' + cat $TEMP_FILE | grep "HTTP/1.1 204" &>/dev/null || ( echo 'ERROR: sending data failed. Output of the process : '; cat $TEMP_FILE ) +done; + +echo "INFO: *** CHECKING ***" +TEMP_FILE=`mktemp` +GRAPH_SIZE=`curl $REPOSITORY_URL/size 2> $TEMP_FILE` +echo "INFO: size of the new graph is $GRAPH_SIZE" + diff --git a/deploy/internal-auth/db-server/bin/repo-init.sh b/deploy/internal-auth/db-server/bin/repo-init.sh new file mode 100755 index 00000000..94c36571 --- /dev/null +++ b/deploy/internal-auth/db-server/bin/repo-init.sh @@ -0,0 +1,48 @@ +#!/bin/sh + +# +# Initializes Record Manager GraphDB repositories if it does not already exist +# + +SOURCE_DIR=$1 +GRAPHDB_HOME=$2 + +SCRIPT_DIR="`dirname $0`" + +echo "INFO: Running initializer for Record Manager repositories ..." + +# Wait for GraphDB to start up +echo "INFO: Waiting for GraphDB to start up..." +sleep 15s + +ls ${SOURCE_DIR}/*-config.ttl | while read REPO_CONFIG_FILE; do + + REPO_NAME=`$SCRIPT_DIR/get-value-of-rdf-property.py $REPO_CONFIG_FILE 'http://www.openrdf.org/config/repository#repositoryID'` + + if [ -z "$REPO_NAME" ]; then + echo "ERROR: Could not parse repository name from file $REPO_CONFIG_FILE" + exit 1 + fi + + if [ ! -d ${GRAPHDB_HOME}/data/repositories/${REPO_NAME} ] || [ -z "$(ls -A ${GRAPHDB_HOME})/data/repositories/${REPO_NAME}" ]; then + echo "INFO: Initializing repository $REPO_NAME..." + + # Create repository based on configuration + echo "INFO: Creating repository $REPO_NAME..." + curl -X POST --header "Content-Type: multipart/form-data" -F "config=@${REPO_CONFIG_FILE}" "http://localhost:7200/rest/repositories" + echo "INFO: Repository $REPO_NAME successfully initialized." + else + echo "INFO: Repository $REPO_NAME already exists. Skipping initialization..." + fi +done + + +DATA_DIR=/root/graphdb-import + +ls ${DATA_DIR}/forms/*.ttl | while read DATA_FILE; do + REPO_NAME="record-manager-formgen" + CONTEXT=`$SCRIPT_DIR/get-rdf-subject-by-type.py $DATA_FILE 'http://onto.fel.cvut.cz/ontologies/form/form-template' | sed 's/[<>]//g'` + + echo "INFO: Deploying form templates ${DATA_FILE} into ${CONTEXT}." + $SCRIPT_DIR/rdf4j-deploy-context.sh -R -C 'text/turtle' -s http://localhost:7200 -r ${REPO_NAME} -c ${CONTEXT} ${DATA_FILE} +done diff --git a/deploy/internal-auth/db-server/conf/logback.xml b/deploy/internal-auth/db-server/conf/logback.xml new file mode 100644 index 00000000..2b55f0da --- /dev/null +++ b/deploy/internal-auth/db-server/conf/logback.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${logDestinationDirectory}/audit-log-%d{yyyy-MM-dd}.log + + + ${defaultPattern} + ${encoding} + + + + + + ${logDestinationDirectory}/main-%d{yyyy-MM-dd}.log + + + ${defaultPattern} + ${encoding} + + + + + + ${logDestinationDirectory}/error-%d{yyyy-MM-dd}.log + + + ${defaultPattern} + ${encoding} + + + ERROR + + + + + + ${logDestinationDirectory}/query-log-%d{yyyy-MM-dd}.log + + + ${defaultPattern} + ${encoding} + + + + + + ${logDestinationDirectory}/slow-query-log-%d{yyyy-MM-dd}.log + + + ${defaultPattern} + ${encoding} + + + + + + + + ${defaultPattern} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deploy/internal-auth/db-server/init-config/record-manager-app-config.ttl b/deploy/internal-auth/db-server/init-config/record-manager-app-config.ttl new file mode 100644 index 00000000..5c389efe --- /dev/null +++ b/deploy/internal-auth/db-server/init-config/record-manager-app-config.ttl @@ -0,0 +1,33 @@ +@prefix rdfs: . +@prefix rep: . +@prefix sail: . +@prefix xsd: . +@prefix graphdb: . + +<#record-manager-app> a rep:Repository; + rep:repositoryID "record-manager-app"; + rep:repositoryImpl [ + rep:repositoryType "graphdb:SailRepository"; + [ + graphdb:base-URL "http://example.org/owlim#"; + graphdb:check-for-inconsistencies "false"; + graphdb:defaultNS ""; + graphdb:disable-sameAs "true"; + graphdb:enable-context-index "true"; + graphdb:enable-literal-index "true"; + graphdb:enablePredicateList "true"; + graphdb:entity-id-size "32"; + graphdb:entity-index-size "10000000"; + graphdb:imports ""; + graphdb:in-memory-literal-properties "true"; + graphdb:owlim-license ""; + graphdb:query-limit-results "0"; + graphdb:query-timeout "0"; + graphdb:read-only "false"; + graphdb:repository-type "file-repository"; + graphdb:storage-folder "storage"; + graphdb:throw-QueryEvaluationException-on-timeout "false"; + sail:sailType "graphdb:Sail" + ] + ]; + rdfs:label "Record manager application repository" . diff --git a/deploy/internal-auth/db-server/init-config/record-manager-formgen-config.ttl b/deploy/internal-auth/db-server/init-config/record-manager-formgen-config.ttl new file mode 100644 index 00000000..fb671019 --- /dev/null +++ b/deploy/internal-auth/db-server/init-config/record-manager-formgen-config.ttl @@ -0,0 +1,33 @@ +@prefix rdfs: . +@prefix rep: . +@prefix sail: . +@prefix xsd: . +@prefix graphdb: . + +<#record-manager-formgen> a rep:Repository; + rep:repositoryID "record-manager-formgen"; + rep:repositoryImpl [ + rep:repositoryType "graphdb:SailRepository"; + [ + graphdb:base-URL "http://example.org/owlim#"; + graphdb:check-for-inconsistencies "false"; + graphdb:defaultNS ""; + graphdb:disable-sameAs "true"; + graphdb:enable-context-index "true"; + graphdb:enable-literal-index "true"; + graphdb:enablePredicateList "true"; + graphdb:entity-id-size "32"; + graphdb:entity-index-size "10000000"; + graphdb:imports ""; + graphdb:in-memory-literal-properties "true"; + graphdb:owlim-license ""; + graphdb:query-limit-results "0"; + graphdb:query-timeout "0"; + graphdb:read-only "false"; + graphdb:repository-type "file-repository"; + graphdb:storage-folder "storage"; + graphdb:throw-QueryEvaluationException-on-timeout "false"; + sail:sailType "graphdb:Sail" + ] + ]; + rdfs:label "Record manager form generation repository" . diff --git a/deploy/internal-auth/db-server/init-data/forms/example-1.ttl b/deploy/internal-auth/db-server/init-data/forms/example-1.ttl new file mode 100644 index 00000000..a065fb82 --- /dev/null +++ b/deploy/internal-auth/db-server/init-data/forms/example-1.ttl @@ -0,0 +1,378 @@ +@prefix dc: . +@prefix doc: . +@prefix ex1: . +@prefix form: . +@prefix form-lt: . +@prefix form-t: . +@prefix owl: . +@prefix rdfs: . +@prefix skos: . +@prefix xsd: . + +ex1:as-show-advanced-888 a doc:question ; + rdfs:label "show advanced" ; + form-lt:has-layout-class "checkbox" ; + form:has-question-origin ex1:as-show-advanced-888-qo ; + form:show-advanced-question true . + +ex1:form-root a doc:question ; + a form:form-template ; + rdfs:label "Form example 1" ; + rdfs:comment "First example of a form" ; + doc:has_related_question ex1:age-1063, + ex1:answerable-section-with-advanced-switch, + ex1:cena-6557, + ex1:ma-vlastnika-section-777, + ex1:mena-8088, + ex1:non-answerable-section-with-advanced-switch, + ex1:parent-section-1590, + ex1:provozovatel-section-666, + ex1:test-section-666 ; + form-lt:has-layout-class "form" ; + form:has-question-origin ex1:form-root-qo . + +ex1:jeste-specifickejsi-podtrida-fyzicka-osoby-s-velice-dlouhym-nazvem rdfs:label "Ještě specifickejší podtřída fyzické osoby s velice dlouhým názvem" ; + owl:disjointWith ex1:pravnicka-osoba ; + skos:broader ex1:podtrida-fyzicka-osoby-s-velice-dlouhym-nazvem . + +ex1:mena-cz rdfs:label "Kč" ; + rdfs:comment "Česká koruna" . + +ex1:mena-sr rdfs:label "Sk" ; + rdfs:comment "Slovenská koruna" . + +ex1:answerable-section-with-advanced-switch a doc:question ; + rdfs:label "Answerable section with advanced switch" ; + doc:has_related_question ex1:show-advanced-question-test-advanced-switch, + ex1:test-5279, + ex1:test-field-3888 ; + form-lt:has-layout-class "answerable", + "checkbox", + "collapsed", + "section" ; + form:has-identifying-question "test-5279" ; + form:has-preceding-question ex1:non-answerable-section-with-advanced-switch ; + form:has-question-origin ex1:answerable-section-with-advanced-switch-qo ; + dc:source . + +ex1:first-name-9402 a doc:question ; + rdfs:label "Jméno" ; + form-lt:has-layout-class "text" ; + form:has-datatype ; + form:has-pattern "([A-Za-z]+)" ; + form:has-preceding-question ex1:title-7183 ; + form:has-question-origin ex1:first-name-9402-qo . + +ex1:form-condition-test-advanced-switch a form:condition ; + form-t:has-importance ; + form:accepts-answer-value true ; + form:has-tested-question ex1:show-advanced-question-test-advanced-switch . + +ex1:form-condition-test-advanced-switch-na a form:condition ; + form-t:has-importance ; + form:accepts-answer-value true ; + form:has-tested-question ex1:show-advanced-question-test-advanced-switch-na . + +ex1:last-name-6610 a doc:question ; + rdfs:label "Příjmení" ; + form-lt:has-layout-class "text" ; + form:has-datatype ; + form:has-pattern "([A-Za-z]+)" ; + form:has-question-origin ex1:last-name-6610-qo . + +ex1:ma-vlastnika-section-777 a doc:question ; + rdfs:label "Má vlastníka" ; + form-lt:has-layout-class "type-ahead" ; + form:has-non-selectable-value "fyzicka-osoba" ; + form:has-possible-value "fyzicka-osoba", + "fyzicka-osoba--chytra", + "fyzicka-osoba--hloupa", + "fyzicka-osoba--nezletila", + "jeste-specifickejsi-podtrida-fyzicka-osoby-s-velice-dlouhym-nazvem", + "podtrida-fyzicka-osoby-s-velice-dlouhym-nazvem", + "pravnicka-osoba" ; + form:has-question-origin ex1:ma-vlastnika-section-777-qo . + +ex1:mena-8088 a doc:question ; + rdfs:label "Měna" ; + form-lt:has-layout-class "type-ahead" ; + form:has-possible-value "mena-cz", + "mena-sr" ; + form:has-question-origin ex1:mena-8088-qo . + +ex1:podtrida-fyzicka-osoby-s-velice-dlouhym-nazvem rdfs:label "Podtřída fyzické osoby s velice dlouhým názvem" ; + owl:disjointWith ex1:pravnicka-osoba ; + skos:broader ex1:fyzicka-osoba . + +ex1:provozovatel-fyzicka-osoba-condition a form:condition, + form:or-condition ; + form:accepts-answer-value ex1:fyzicka-osoba ; + form:has-sub-condition ex1:provozovatel-fyzicka-osoba-condition-1, + ex1:provozovatel-fyzicka-osoba-condition-2 ; + form:has-tested-question ex1:provozovatel-section-666 . + +ex1:provozovatel-fyzicka-osoba-condition-1 a form:condition ; + form:accepts-answer-value ex1:fyzicka-osoba, + ex1:fyzicka-osoba--chytra, + ex1:fyzicka-osoba--hloupa, + ex1:fyzicka-osoba--nezletila ; + form:has-tested-question ex1:ps-type-1 . + +ex1:provozovatel-fyzicka-osoba-condition-2 a form:condition ; + form:accepts-answer-value ex1:fyzicka-osoba, + ex1:fyzicka-osoba--chytra, + ex1:fyzicka-osoba--hloupa, + ex1:fyzicka-osoba--nezletila ; + form:has-tested-question ex1:ps-type-2 . + +ex1:provozovatel-fyzicka-osoba-s-iq-condition a form:or-condition ; + form:has-sub-condition ex1:provozovatel-fyzicka-osoba-s-iq-condition-1, + ex1:provozovatel-fyzicka-osoba-s-iq-condition-2 . + +ex1:provozovatel-fyzicka-osoba-s-iq-condition-1 a form:condition ; + form:accepts-answer-value ex1:fyzicka-osoba--chytra, + ex1:fyzicka-osoba--hloupa ; + form:has-tested-question ex1:ps-type-1 . + +ex1:provozovatel-fyzicka-osoba-s-iq-condition-2 a form:condition ; + form:accepts-answer-value ex1:fyzicka-osoba--chytra, + ex1:fyzicka-osoba--hloupa ; + form:has-tested-question ex1:ps-type-2 . + +ex1:provozovatel-fyzicka-osoba-s-vekom-condition a form:or-condition ; + form:has-sub-condition ex1:provozovatel-fyzicka-osoba-s-vekom-condition-1, + ex1:provozovatel-fyzicka-osoba-s-vekom-condition-2 . + +ex1:provozovatel-fyzicka-osoba-s-vekom-condition-1 a form:condition ; + form:accepts-answer-value ex1:fyzicka-osoba--nezletila ; + form:has-tested-question ex1:ps-type-1 . + +ex1:provozovatel-fyzicka-osoba-s-vekom-condition-2 a form:condition ; + form:accepts-answer-value ex1:fyzicka-osoba--nezletila ; + form:has-tested-question ex1:ps-type-2 . + +ex1:provozovatel-pravnicka-osoba-condition a form:or-condition ; + form:has-sub-condition ex1:provozovatel-pravnicka-osoba-condition-1, + ex1:provozovatel-pravnicka-osoba-condition-2 . + +ex1:provozovatel-pravnicka-osoba-condition-1 a form:condition ; + form:accepts-answer-value ex1:pravnicka-osoba ; + form:has-tested-question ex1:ps-type-1 . + +ex1:provozovatel-pravnicka-osoba-condition-2 a form:condition ; + form:accepts-answer-value ex1:pravnicka-osoba ; + form:has-tested-question ex1:ps-type-2 . + +ex1:ps-age-452 a doc:question ; + rdfs:label "Age" ; + form-lt:has-layout-class "text" ; + form:has-question-origin ex1:ps-age-452-qo ; + form:is-relevant-if ex1:provozovatel-fyzicka-osoba-s-vekom-condition . + +ex1:ps-cin-452 a doc:question ; + rdfs:label "CIN" ; + form-lt:has-layout-class "text" ; + form:has-question-origin ex1:ps-cin-452-qo ; + form:is-relevant-if ex1:provozovatel-pravnicka-osoba-condition ; + dc:description "Company identification number" . + +ex1:ps-iq-452 a doc:question ; + rdfs:label "IQ" ; + form-lt:has-layout-class "text" ; + form:has-question-origin ex1:ps-iq-452-qo ; + form:is-relevant-if ex1:provozovatel-fyzicka-osoba-s-iq-condition . + +ex1:ps-name-452 a doc:question ; + rdfs:label "Jméno" ; + form-lt:has-layout-class "text" ; + form:has-question-origin ex1:ps-name-452-qo ; + form:is-relevant-if ex1:provozovatel-fyzicka-osoba-condition . + +ex1:sectionfoo-1592 a doc:question ; + rdfs:label "Celé jméno" ; + doc:has_related_question ex1:first-name-9402, + ex1:last-name-6610, + ex1:title-7183 ; + form-lt:has-layout-class "name" ; + form:has-composite-pattern "?1 ?2 ?3" ; + form:has-composite-variables "first-name-9402", + "last-name-6610", + "title-7183" ; + form:has-datatype ; + form:has-pattern "^(?:([A-Za-z]{1,4}\\.) )?(.+) (.+)$" ; + form:has-preceding-question ex1:test-field-3887 ; + form:has-question-origin ex1:sectionfoo-1592-qo ; + form:requires-answer true . + +ex1:test-5278 a doc:question ; + rdfs:label "Identifikátor" ; + form-lt:has-layout-class "text" ; + form:has-question-origin ex1:test-5278-qo . + +ex1:test-5279 a doc:question ; + rdfs:label "Identifier" ; + form-lt:has-layout-class "emphasise-on-relevant", + "text" ; + form-t:has-importance ; + form:has-question-origin ex1:test-5279-qo ; + form:is-relevant-if ex1:form-condition-test-advanced-switch . + +ex1:test-5279-na a doc:question ; + rdfs:label "Identifier" ; + form-lt:has-layout-class "emphasise-on-relevant", + "text" ; + form-t:has-importance ; + form:has-question-origin ex1:test-5279-na-qo ; + form:is-relevant-if ex1:form-condition-test-advanced-switch-na . + +ex1:test-field-3888 a doc:question ; + rdfs:label "Field test" ; + form-lt:has-layout-class "text" ; + form:has-question-origin ex1:test-field-3888-qo ; + dc:source . + +ex1:test-field-3888-na a doc:question ; + rdfs:label "Field test" ; + form-lt:has-layout-class "text" ; + form:has-question-origin ex1:test-field-3888-na-qo ; + dc:source . + +ex1:age-1063 a doc:question ; + rdfs:label "Age" ; + form-lt:has-layout-class "text" ; + form-lt:initial-input-length 5 ; + form:has-datatype xsd:int ; + form:has-question-origin ex1:age-1063-qo ; + form:has-unit "years" . + +ex1:cena-6557 a doc:question ; + rdfs:label "Cena" ; + form-lt:has-layout-class "text" ; + form:has-datatype xsd:int ; + form:has-preceding-question ex1:age-1063 ; + form:has-question-origin ex1:cena-6557-qo ; + form:has-unit-of-measure-question "mena-8088" ; + dc:description "Tohle je cena s měnou" . + +ex1:non-answerable-section-with-advanced-switch a doc:question ; + rdfs:label "Simple section with advanced switch" ; + doc:has_related_question ex1:show-advanced-question-test-advanced-switch-na, + ex1:test-5279-na, + ex1:test-field-3888-na ; + form-lt:has-layout-class "checkbox", + "collapsed", + "section" ; + form:has-identifying-question "test-5279-na" ; + form:has-preceding-question ex1:test-section-666 ; + form:has-question-origin ex1:non-answerable-section-with-advanced-switch-qo ; + dc:source . + +ex1:parent-section-1590 a doc:question ; + rdfs:label "Vlastník" ; + doc:has_related_question ex1:sectionfoo-1592, + ex1:test-field-3887 ; + form-lt:has-layout-class "section" ; + form:has-identifying-question "test-field-3887" ; + form:has-preceding-question ex1:cena-6557 ; + form:has-question-origin ex1:parent-section-1590-qo . + +ex1:provozovatel-section-666 a doc:question ; + rdfs:label "Má provozovatele" ; + doc:has_related_question ex1:ps-age-452, + ex1:ps-cin-452, + ex1:ps-iq-452, + ex1:ps-name-452, + ex1:ps-type-1, + ex1:ps-type-2 ; + form-lt:has-layout-class "answerable", + "section", + "type-question" ; + form:has-non-selectable-value "fyzicka-osoba" ; + form:has-possible-value "fyzicka-osoba", + "fyzicka-osoba--chytra", + "fyzicka-osoba--hloupa", + "fyzicka-osoba--nezletila", + "jeste-specifickejsi-podtrida-fyzicka-osoby-s-velice-dlouhym-nazvem", + "podtrida-fyzicka-osoby-s-velice-dlouhym-nazvem", + "pravnicka-osoba" ; + form:has-question-origin ex1:provozovatel-section-666-qo ; + form:has-type-question "ps-type-1", + "ps-type-2" . + +ex1:show-advanced-question-test-advanced-switch a doc:question ; + rdfs:label "Advanced switch test" ; + form-lt:has-layout-class "checkbox" ; + form:has-comment [ a form:comment ; + form:has-author ; + form:has-comment-value "Another comment" ; + form:has-timestamp "1636065441831" ], + [ a form:comment ; + form:has-author ; + form:has-comment-value "Some comment" ; + form:has-timestamp "1636061441831" ] ; + form:has-question-origin ex1:form-show-advanced-question ; + form:show-advanced-question true ; + dc:description "Advanced switch test" . + +ex1:show-advanced-question-test-advanced-switch-na a doc:question ; + rdfs:label "Advanced switch test" ; + form-lt:has-layout-class "checkbox" ; + form:has-comment [ a form:comment ; + form:has-author ; + form:has-comment-value "Some comment" ; + form:has-timestamp "1636061441831" ], + [ a form:comment ; + form:has-author ; + form:has-comment-value "Another comment" ; + form:has-timestamp "1636065441831" ] ; + form:has-question-origin ex1:form-show-advanced-question ; + form:show-advanced-question true ; + dc:description "Advanced switch test" . + +ex1:test-field-3887 a doc:question ; + rdfs:label "Popis vlastníka" ; + form-lt:has-layout-class "text" ; + form:has-question-origin ex1:test-field-3887-qo . + +ex1:test-section-666 a doc:question ; + rdfs:label "Sekce s identifikátorem" ; + doc:has_related_question ex1:test-5278 ; + form-lt:has-layout-class "answerable", + "checkbox", + "section" ; + form:has-identifying-question "test-5278" ; + form:has-preceding-question ex1:parent-section-1590 ; + form:has-question-origin ex1:test-section-666-qo ; + dc:description "test" . + +ex1:title-7183 a doc:question ; + rdfs:label "Titul" ; + form-lt:has-layout-class "text" ; + form:has-question-origin ex1:title-7183-qo . + +ex1:fyzicka-osoba--hloupa rdfs:label "Fyzická osoba hloupá" ; + owl:disjointWith ex1:fyzicka-osoba--chytra, + ex1:pravnicka-osoba ; + skos:broader ex1:fyzicka-osoba . + +ex1:fyzicka-osoba--nezletila rdfs:label "Fyzická osoba nezletilá" ; + owl:disjointWith ex1:pravnicka-osoba ; + skos:broader ex1:fyzicka-osoba . + +ex1:fyzicka-osoba--chytra rdfs:label "Fyzická osoba chytrá" ; + owl:disjointWith ex1:pravnicka-osoba ; + skos:broader ex1:fyzicka-osoba . + +ex1:ps-type-1 a doc:question ; + rdfs:label "PS type 1" ; + form:has-question-origin ex1:ps-type-1-qo . + +ex1:ps-type-2 a doc:question ; + rdfs:label "PS type 2" ; + form:has-question-origin ex1:ps-type-2-qo . + +ex1:fyzicka-osoba rdfs:label "Fyzická osoba" ; + owl:disjointWith ex1:pravnicka-osoba . + +ex1:pravnicka-osoba rdfs:label "Právnická osoba" . + diff --git a/deploy/internal-auth/db-server/init-data/forms/example-2.ttl b/deploy/internal-auth/db-server/init-data/forms/example-2.ttl new file mode 100644 index 00000000..f83b801c --- /dev/null +++ b/deploy/internal-auth/db-server/init-data/forms/example-2.ttl @@ -0,0 +1,378 @@ +@prefix dc: . +@prefix doc: . +@prefix ex2: . +@prefix form: . +@prefix form-lt: . +@prefix form-t: . +@prefix owl: . +@prefix rdfs: . +@prefix skos: . +@prefix xsd: . + +ex2:as-show-advanced-888 a doc:question ; + rdfs:label "show advanced" ; + form-lt:has-layout-class "checkbox" ; + form:has-question-origin ex2:as-show-advanced-888-qo ; + form:show-advanced-question true . + +ex2:form-root a doc:question ; + a form:form-template ; + rdfs:label "Form example 2" ; + rdfs:comment "Second example of a form" ; + doc:has_related_question ex2:age-1063, + ex2:answerable-section-with-advanced-switch, + ex2:cena-6557, + ex2:ma-vlastnika-section-777, + ex2:mena-8088, + ex2:non-answerable-section-with-advanced-switch, + ex2:parent-section-1590, + ex2:provozovatel-section-666, + ex2:test-section-666 ; + form-lt:has-layout-class "form" ; + form:has-question-origin ex2:form-root-qo . + +ex2:jeste-specifickejsi-podtrida-fyzicka-osoby-s-velice-dlouhym-nazvem rdfs:label "Ještě specifickejší podtřída fyzické osoby s velice dlouhým názvem" ; + owl:disjointWith ex2:pravnicka-osoba ; + skos:broader ex2:podtrida-fyzicka-osoby-s-velice-dlouhym-nazvem . + +ex2:mena-cz rdfs:label "Kč" ; + rdfs:comment "Česká koruna" . + +ex2:mena-sr rdfs:label "Sk" ; + rdfs:comment "Slovenská koruna" . + +ex2:answerable-section-with-advanced-switch a doc:question ; + rdfs:label "Answerable section with advanced switch" ; + doc:has_related_question ex2:show-advanced-question-test-advanced-switch, + ex2:test-5279, + ex2:test-field-3888 ; + form-lt:has-layout-class "answerable", + "checkbox", + "collapsed", + "section" ; + form:has-identifying-question "test-5279" ; + form:has-preceding-question ex2:non-answerable-section-with-advanced-switch ; + form:has-question-origin ex2:answerable-section-with-advanced-switch-qo ; + dc:source . + +ex2:first-name-9402 a doc:question ; + rdfs:label "Jméno" ; + form-lt:has-layout-class "text" ; + form:has-datatype ; + form:has-pattern "([A-Za-z]+)" ; + form:has-preceding-question ex2:title-7183 ; + form:has-question-origin ex2:first-name-9402-qo . + +ex2:form-condition-test-advanced-switch a form:condition ; + form-t:has-importance ; + form:accepts-answer-value true ; + form:has-tested-question ex2:show-advanced-question-test-advanced-switch . + +ex2:form-condition-test-advanced-switch-na a form:condition ; + form-t:has-importance ; + form:accepts-answer-value true ; + form:has-tested-question ex2:show-advanced-question-test-advanced-switch-na . + +ex2:last-name-6610 a doc:question ; + rdfs:label "Příjmení" ; + form-lt:has-layout-class "text" ; + form:has-datatype ; + form:has-pattern "([A-Za-z]+)" ; + form:has-question-origin ex2:last-name-6610-qo . + +ex2:ma-vlastnika-section-777 a doc:question ; + rdfs:label "Má vlastníka" ; + form-lt:has-layout-class "type-ahead" ; + form:has-non-selectable-value "fyzicka-osoba" ; + form:has-possible-value "fyzicka-osoba", + "fyzicka-osoba--chytra", + "fyzicka-osoba--hloupa", + "fyzicka-osoba--nezletila", + "jeste-specifickejsi-podtrida-fyzicka-osoby-s-velice-dlouhym-nazvem", + "podtrida-fyzicka-osoby-s-velice-dlouhym-nazvem", + "pravnicka-osoba" ; + form:has-question-origin ex2:ma-vlastnika-section-777-qo . + +ex2:mena-8088 a doc:question ; + rdfs:label "Měna" ; + form-lt:has-layout-class "type-ahead" ; + form:has-possible-value "mena-cz", + "mena-sr" ; + form:has-question-origin ex2:mena-8088-qo . + +ex2:podtrida-fyzicka-osoby-s-velice-dlouhym-nazvem rdfs:label "Podtřída fyzické osoby s velice dlouhým názvem" ; + owl:disjointWith ex2:pravnicka-osoba ; + skos:broader ex2:fyzicka-osoba . + +ex2:provozovatel-fyzicka-osoba-condition a form:condition, + form:or-condition ; + form:accepts-answer-value ex2:fyzicka-osoba ; + form:has-sub-condition ex2:provozovatel-fyzicka-osoba-condition-1, + ex2:provozovatel-fyzicka-osoba-condition-2 ; + form:has-tested-question ex2:provozovatel-section-666 . + +ex2:provozovatel-fyzicka-osoba-condition-1 a form:condition ; + form:accepts-answer-value ex2:fyzicka-osoba, + ex2:fyzicka-osoba--chytra, + ex2:fyzicka-osoba--hloupa, + ex2:fyzicka-osoba--nezletila ; + form:has-tested-question ex2:ps-type-1 . + +ex2:provozovatel-fyzicka-osoba-condition-2 a form:condition ; + form:accepts-answer-value ex2:fyzicka-osoba, + ex2:fyzicka-osoba--chytra, + ex2:fyzicka-osoba--hloupa, + ex2:fyzicka-osoba--nezletila ; + form:has-tested-question ex2:ps-type-2 . + +ex2:provozovatel-fyzicka-osoba-s-iq-condition a form:or-condition ; + form:has-sub-condition ex2:provozovatel-fyzicka-osoba-s-iq-condition-1, + ex2:provozovatel-fyzicka-osoba-s-iq-condition-2 . + +ex2:provozovatel-fyzicka-osoba-s-iq-condition-1 a form:condition ; + form:accepts-answer-value ex2:fyzicka-osoba--chytra, + ex2:fyzicka-osoba--hloupa ; + form:has-tested-question ex2:ps-type-1 . + +ex2:provozovatel-fyzicka-osoba-s-iq-condition-2 a form:condition ; + form:accepts-answer-value ex2:fyzicka-osoba--chytra, + ex2:fyzicka-osoba--hloupa ; + form:has-tested-question ex2:ps-type-2 . + +ex2:provozovatel-fyzicka-osoba-s-vekom-condition a form:or-condition ; + form:has-sub-condition ex2:provozovatel-fyzicka-osoba-s-vekom-condition-1, + ex2:provozovatel-fyzicka-osoba-s-vekom-condition-2 . + +ex2:provozovatel-fyzicka-osoba-s-vekom-condition-1 a form:condition ; + form:accepts-answer-value ex2:fyzicka-osoba--nezletila ; + form:has-tested-question ex2:ps-type-1 . + +ex2:provozovatel-fyzicka-osoba-s-vekom-condition-2 a form:condition ; + form:accepts-answer-value ex2:fyzicka-osoba--nezletila ; + form:has-tested-question ex2:ps-type-2 . + +ex2:provozovatel-pravnicka-osoba-condition a form:or-condition ; + form:has-sub-condition ex2:provozovatel-pravnicka-osoba-condition-1, + ex2:provozovatel-pravnicka-osoba-condition-2 . + +ex2:provozovatel-pravnicka-osoba-condition-1 a form:condition ; + form:accepts-answer-value ex2:pravnicka-osoba ; + form:has-tested-question ex2:ps-type-1 . + +ex2:provozovatel-pravnicka-osoba-condition-2 a form:condition ; + form:accepts-answer-value ex2:pravnicka-osoba ; + form:has-tested-question ex2:ps-type-2 . + +ex2:ps-age-452 a doc:question ; + rdfs:label "Age" ; + form-lt:has-layout-class "text" ; + form:has-question-origin ex2:ps-age-452-qo ; + form:is-relevant-if ex2:provozovatel-fyzicka-osoba-s-vekom-condition . + +ex2:ps-cin-452 a doc:question ; + rdfs:label "CIN" ; + form-lt:has-layout-class "text" ; + form:has-question-origin ex2:ps-cin-452-qo ; + form:is-relevant-if ex2:provozovatel-pravnicka-osoba-condition ; + dc:description "Company identification number" . + +ex2:ps-iq-452 a doc:question ; + rdfs:label "IQ" ; + form-lt:has-layout-class "text" ; + form:has-question-origin ex2:ps-iq-452-qo ; + form:is-relevant-if ex2:provozovatel-fyzicka-osoba-s-iq-condition . + +ex2:ps-name-452 a doc:question ; + rdfs:label "Jméno" ; + form-lt:has-layout-class "text" ; + form:has-question-origin ex2:ps-name-452-qo ; + form:is-relevant-if ex2:provozovatel-fyzicka-osoba-condition . + +ex2:sectionfoo-1592 a doc:question ; + rdfs:label "Celé jméno" ; + doc:has_related_question ex2:first-name-9402, + ex2:last-name-6610, + ex2:title-7183 ; + form-lt:has-layout-class "name" ; + form:has-composite-pattern "?1 ?2 ?3" ; + form:has-composite-variables "first-name-9402", + "last-name-6610", + "title-7183" ; + form:has-datatype ; + form:has-pattern "^(?:([A-Za-z]{1,4}\\.) )?(.+) (.+)$" ; + form:has-preceding-question ex2:test-field-3887 ; + form:has-question-origin ex2:sectionfoo-1592-qo ; + form:requires-answer true . + +ex2:test-5278 a doc:question ; + rdfs:label "Identifikátor" ; + form-lt:has-layout-class "text" ; + form:has-question-origin ex2:test-5278-qo . + +ex2:test-5279 a doc:question ; + rdfs:label "Identifier" ; + form-lt:has-layout-class "emphasise-on-relevant", + "text" ; + form-t:has-importance ; + form:has-question-origin ex2:test-5279-qo ; + form:is-relevant-if ex2:form-condition-test-advanced-switch . + +ex2:test-5279-na a doc:question ; + rdfs:label "Identifier" ; + form-lt:has-layout-class "emphasise-on-relevant", + "text" ; + form-t:has-importance ; + form:has-question-origin ex2:test-5279-na-qo ; + form:is-relevant-if ex2:form-condition-test-advanced-switch-na . + +ex2:test-field-3888 a doc:question ; + rdfs:label "Field test" ; + form-lt:has-layout-class "text" ; + form:has-question-origin ex2:test-field-3888-qo ; + dc:source . + +ex2:test-field-3888-na a doc:question ; + rdfs:label "Field test" ; + form-lt:has-layout-class "text" ; + form:has-question-origin ex2:test-field-3888-na-qo ; + dc:source . + +ex2:age-1063 a doc:question ; + rdfs:label "Age" ; + form-lt:has-layout-class "text" ; + form-lt:initial-input-length 5 ; + form:has-datatype xsd:int ; + form:has-question-origin ex2:age-1063-qo ; + form:has-unit "years" . + +ex2:cena-6557 a doc:question ; + rdfs:label "Cena" ; + form-lt:has-layout-class "text" ; + form:has-datatype xsd:int ; + form:has-preceding-question ex2:age-1063 ; + form:has-question-origin ex2:cena-6557-qo ; + form:has-unit-of-measure-question "mena-8088" ; + dc:description "Tohle je cena s měnou" . + +ex2:non-answerable-section-with-advanced-switch a doc:question ; + rdfs:label "Simple section with advanced switch" ; + doc:has_related_question ex2:show-advanced-question-test-advanced-switch-na, + ex2:test-5279-na, + ex2:test-field-3888-na ; + form-lt:has-layout-class "checkbox", + "collapsed", + "section" ; + form:has-identifying-question "test-5279-na" ; + form:has-preceding-question ex2:test-section-666 ; + form:has-question-origin ex2:non-answerable-section-with-advanced-switch-qo ; + dc:source . + +ex2:parent-section-1590 a doc:question ; + rdfs:label "Vlastník" ; + doc:has_related_question ex2:sectionfoo-1592, + ex2:test-field-3887 ; + form-lt:has-layout-class "section" ; + form:has-identifying-question "test-field-3887" ; + form:has-preceding-question ex2:cena-6557 ; + form:has-question-origin ex2:parent-section-1590-qo . + +ex2:provozovatel-section-666 a doc:question ; + rdfs:label "Má provozovatele" ; + doc:has_related_question ex2:ps-age-452, + ex2:ps-cin-452, + ex2:ps-iq-452, + ex2:ps-name-452, + ex2:ps-type-1, + ex2:ps-type-2 ; + form-lt:has-layout-class "answerable", + "section", + "type-question" ; + form:has-non-selectable-value "fyzicka-osoba" ; + form:has-possible-value "fyzicka-osoba", + "fyzicka-osoba--chytra", + "fyzicka-osoba--hloupa", + "fyzicka-osoba--nezletila", + "jeste-specifickejsi-podtrida-fyzicka-osoby-s-velice-dlouhym-nazvem", + "podtrida-fyzicka-osoby-s-velice-dlouhym-nazvem", + "pravnicka-osoba" ; + form:has-question-origin ex2:provozovatel-section-666-qo ; + form:has-type-question "ps-type-1", + "ps-type-2" . + +ex2:show-advanced-question-test-advanced-switch a doc:question ; + rdfs:label "Advanced switch test" ; + form-lt:has-layout-class "checkbox" ; + form:has-comment [ a form:comment ; + form:has-author ; + form:has-comment-value "Some comment" ; + form:has-timestamp "1636061441831" ], + [ a form:comment ; + form:has-author ; + form:has-comment-value "Another comment" ; + form:has-timestamp "1636065441831" ] ; + form:has-question-origin ex2:form-show-advanced-question ; + form:show-advanced-question true ; + dc:description "Advanced switch test" . + +ex2:show-advanced-question-test-advanced-switch-na a doc:question ; + rdfs:label "Advanced switch test" ; + form-lt:has-layout-class "checkbox" ; + form:has-comment [ a form:comment ; + form:has-author ; + form:has-comment-value "Another comment" ; + form:has-timestamp "1636065441831" ], + [ a form:comment ; + form:has-author ; + form:has-comment-value "Some comment" ; + form:has-timestamp "1636061441831" ] ; + form:has-question-origin ex2:form-show-advanced-question ; + form:show-advanced-question true ; + dc:description "Advanced switch test" . + +ex2:test-field-3887 a doc:question ; + rdfs:label "Popis vlastníka" ; + form-lt:has-layout-class "text" ; + form:has-question-origin ex2:test-field-3887-qo . + +ex2:test-section-666 a doc:question ; + rdfs:label "Sekce s identifikátorem" ; + doc:has_related_question ex2:test-5278 ; + form-lt:has-layout-class "answerable", + "checkbox", + "section" ; + form:has-identifying-question "test-5278" ; + form:has-preceding-question ex2:parent-section-1590 ; + form:has-question-origin ex2:test-section-666-qo ; + dc:description "test" . + +ex2:title-7183 a doc:question ; + rdfs:label "Titul" ; + form-lt:has-layout-class "text" ; + form:has-question-origin ex2:title-7183-qo . + +ex2:fyzicka-osoba--hloupa rdfs:label "Fyzická osoba hloupá" ; + owl:disjointWith ex2:fyzicka-osoba--chytra, + ex2:pravnicka-osoba ; + skos:broader ex2:fyzicka-osoba . + +ex2:fyzicka-osoba--nezletila rdfs:label "Fyzická osoba nezletilá" ; + owl:disjointWith ex2:pravnicka-osoba ; + skos:broader ex2:fyzicka-osoba . + +ex2:fyzicka-osoba--chytra rdfs:label "Fyzická osoba chytrá" ; + owl:disjointWith ex2:pravnicka-osoba ; + skos:broader ex2:fyzicka-osoba . + +ex2:ps-type-1 a doc:question ; + rdfs:label "PS type 1" ; + form:has-question-origin ex2:ps-type-1-qo . + +ex2:ps-type-2 a doc:question ; + rdfs:label "PS type 2" ; + form:has-question-origin ex2:ps-type-2-qo . + +ex2:fyzicka-osoba rdfs:label "Fyzická osoba" ; + owl:disjointWith ex2:pravnicka-osoba . + +ex2:pravnicka-osoba rdfs:label "Právnická osoba" . + diff --git a/deploy/internal-auth/docker-compose.yml b/deploy/internal-auth/docker-compose.yml new file mode 100644 index 00000000..3d9e6be8 --- /dev/null +++ b/deploy/internal-auth/docker-compose.yml @@ -0,0 +1,75 @@ +version: '3' + +services: + nginx: + image: nginx:latest + container_name: ${RECORD_SET_NAME:-rm}-nginx + volumes: + - ./nginx/nginx.conf:/etc/nginx/nginx.conf + - ./nginx/error.html:/usr/share/nginx/html/error.html + ports: + - "${PORT:-1235}:80" + restart: always + depends_on: + - record-manager + - record-manager-server + - s-pipes-engine + - db-server + record-manager: + image: ghcr.io/kbss-cvut/kbss-cvut/record-manager-ui:latest + container_name: ${RECORD_SET_NAME:-rm}-record-manager + ports: + - "4000:80" + restart: always + depends_on: + - record-manager-server + environment: + API_URL: "${RECORD_MANAGER_SERVER_URL}" + APP_INFO: "${RECORD_MANAGER_APP_INFO:-}" + APP_TITLE: "${RECORD_MANAGER_APP_TITLE:-Record manager}" + LANGUAGE: "${LANGUAGE:-en}" + NAVIGATOR_LANGUAGE: "false" + BASENAME: "${RECORD_MANAGER_BASENAME:-/record-manager}" + + record-manager-server: + image: ghcr.io/kbss-cvut/kbss-cvut/record-manager:latest + container_name: ${RECORD_SET_NAME:-rm}-record-manager-server + ports: + - "3000:8080" + restart: always + depends_on: + - s-pipes-engine + - db-server + environment: + appContext: "http://localhost:${PORT:-1235}/record-manager/" + repositoryUrl: "http://db-server:7200/repositories/record-manager-app" + formGenRepositoryUrl: "http://db-server:7200/repositories/record-manager-formgen" + formGenServiceUrl: "${FORMGEN_SERVICE_URL}" + + s-pipes-engine: + image: ghcr.io/kbss-cvut/s-pipes/s-pipes-engine:latest + container_name: ${RECORD_SET_NAME:-rm}-s-pipes-engine + ports: + - "8889:8080" + restart: always + depends_on: + - db-server + environment: + FORMGEN_REPOSITORY_URL: "http://db-server:7200/repositories/record-manager-formgen" + volumes: + - ./s-pipes-engine/scripts:/scripts/root + + db-server: + build: + context: ./db-server + container_name: ${RECORD_SET_NAME:-rm}-db-server + environment: + GDB_JAVA_OPTS: -Dgraphdb.external-url=http://localhost:$PORT$RECORD_MANAGER_BASENAME/db-server + ports: + - "7200:7200" + restart: always + volumes: + - db-server:/opt/graphdb/home + +volumes: + db-server: diff --git a/deploy/internal-auth/nginx/error.html b/deploy/internal-auth/nginx/error.html new file mode 100644 index 00000000..3c7fce07 --- /dev/null +++ b/deploy/internal-auth/nginx/error.html @@ -0,0 +1,38 @@ + + + + + + + <!--# echo var="status" default="" --> + | Record manager + + + + + + + + + +

The application is currently being updated

+

You will be redirected to the new version in a few seconds.

+

If you see this message for more than a minute, something has gone wrong.

+ +

Sorry, something went wrong.

+

+ + + diff --git a/deploy/internal-auth/nginx/nginx.conf b/deploy/internal-auth/nginx/nginx.conf new file mode 100644 index 00000000..7151de7f --- /dev/null +++ b/deploy/internal-auth/nginx/nginx.conf @@ -0,0 +1,72 @@ +worker_processes 1; + +events { + worker_connections 1024; +} + +http { + + client_max_body_size 100M; + + include mime.types; + default_type application/octet-stream; + + map $status $status_text { + 400 'Bad Request'; + 401 'Unauthorized'; + 403 'Forbidden'; + 404 'Not Found'; + 405 'Method Not Allowed'; + 406 'Not Acceptable'; + 413 'Payload Too Large'; + 414 'URI Too Long'; + 431 'Request Header Fields Too Large'; + 500 'Internal Server Error'; + 501 'Not Implemented'; + 502 'Bad Gateway'; + 503 'Service Unavailable'; + 504 'Gateway Timeout'; + } + + server { + listen 80; + server_name localhost; + + error_page 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 + 415 416 417 418 421 422 423 424 426 428 429 431 451 500 501 502 503 + 504 505 506 507 508 510 511 /error.html; + + location = /error.html { + ssi on; + internal; + root /usr/share/nginx/html; + } + + location = /record-manager { + return 302 /record-manager/; + } + + location /record-manager/ { + proxy_pass http://record-manager/; # keep the trailing slash to cut off matched prefix + } + + + location /record-manager/record-manager-server/ { + proxy_pass http://record-manager-server:8080/record-manager/; # keep the trailing slash to cut off matched prefix + proxy_cookie_path /record-manager /record-manager; + } + + location /record-manager/db-server/ { + proxy_pass http://db-server:7200/; # keep the trailing slash to cut off matched prefix + } + + location /record-manager/s-pipes/ { + proxy_pass http://s-pipes-engine:8080/; # keep the trailing slash to cut off matched prefix + } + + location /health-check { + return 200; + access_log off; + } + } +} diff --git a/deploy/internal-auth/s-pipes-engine/scripts/form-generation.sms.ttl b/deploy/internal-auth/s-pipes-engine/scripts/form-generation.sms.ttl new file mode 100644 index 00000000..de997af3 --- /dev/null +++ b/deploy/internal-auth/s-pipes-engine/scripts/form-generation.sms.ttl @@ -0,0 +1,436 @@ +# baseURI: http://onto.fel.cvut.cz/ontologies/record-manager/form-generation + +@prefix : . +@prefix doc: . +@prefix form: . +@prefix form-lt: . +@prefix kbss-module: . +@prefix km-rdf4j: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix sm: . +@prefix sml: . +@prefix sp: . +@prefix spif: . +@prefix spin: . +@prefix spl: . +@prefix form-lib: . +@prefix form-mod: . +@prefix rm-gen: . +@prefix xsd: . + + + + a owl:Ontology ; + owl:imports ; + owl:imports ; +. + + +rm-gen:bind-form-endpoint-url + a sml:BindWithConstant ; + sm:next form-mod:bind-sample-form-service-url ; + sm:outputVariable "formEndpointUrl" ; + sml:value [ + sp:varName "formGenRepositoryUrl" ; + ] ; +. + + +form-mod:bind-sample-form-service-url + a sml:BindWithConstant ; + sm:next form-mod:retrieve-sample-form ; + sm:outputVariable "sampleFormServiceUrl" ; + sml:value [ + a sp:iri ; + sp:arg1 [ + a sp:concat ; + sp:arg1 [ + a sp:str ; + sp:arg1 [ + sp:varName "formEndpointUrl" ; + ] ; + ] ; + sp:arg2 "?default-graph-uri=" ; + sp:arg3 [ + a sp:encode_for_uri ; + sp:arg1 [ + a sp:str ; + sp:arg1 [ + sp:varName "formTemplate" ; + ] ; + ] ; + ] ; + ] ; + ] ; +. + + +form-mod:bind-default-record-graphId + a sml:BindWithConstant ; + sm:next form-mod:bind-record-service-url ; + sm:outputVariable "boundRecordGraphId" ; + sml:value [ + a sp:coalesce ; + sp:arg1 [ + sp:varName "recordGraphId" ; + ] ; + sp:arg2 "http://not-existing-record-graph" ; + ] ; +. + +form-mod:bind-record-service-url + a sml:BindWithConstant ; + sm:next form-mod:retrieve-saved-record-data ; + sm:outputVariable "recordServiceUrl" ; + sml:value [ + a sp:iri ; + sp:arg1 [ + a sp:concat ; + sp:arg1 [ + a sp:str ; + sp:arg1 [ + sp:varName "formGenRepositoryUrl" ; + ] ; + ] ; + sp:arg2 "?default-graph-uri=" ; + sp:arg3 [ + a sp:encode_for_uri ; + sp:arg1 [ + a sp:str ; + sp:arg1 [ + sp:varName "boundRecordGraphId" ; + ] ; + ] ; + ] ; + ] ; + ] ; +. + + +form-mod:retrieve-sample-form + a sml:ApplyConstruct ; + kbss-module:has-output-graph-constraint [ + a sp:Ask ; + sp:text """# 0 - there is a question without origin +ASK WHERE { + ?q a doc:question . + FILTER NOT EXISTS { + ?q form:has-question-origin ?o . + } +}""" ; + ] ; + kbss-module:has-output-graph-constraint [ + a sp:Ask ; + sp:text """# 1 - there is an answer without origin +ASK WHERE { + ?q a doc:answer . + FILTER NOT EXISTS { + ?q form:has-answer-origin ?o . + } +}""" ; + ] ; + sm:next form-mod:annotate-sample-questions ; + sm:next form-mod:rename-form-entities ; + sml:constructQuery [ + a sp:Construct ; + sp:text """CONSTRUCT { + ?s ?p ?o . +} +WHERE { + SERVICE ?sampleFormServiceUrl { + ?s ?p ?o . + } . +}""" ; + ] ; + sml:replace false ; +. + + +form-mod:bind-form-key + a sml:BindWithConstant ; + sm:next form-mod:attach-answer-origins ; + sm:outputVariable "formKey" ; + sml:value [ + a sp:struuid ; + ] ; +. + + +form-mod:retrieve-saved-record-data + a sml:ApplyConstruct ; + sm:next form-mod:attach-answer-origins ; + sm:next :bind-form-template ; + kbss-module:has-output-graph-constraint [ + a sp:Ask ; + sp:text """# there is a question without origin +ASK WHERE { + ?q a doc:question . + FILTER NOT EXISTS { + ?q form:has-question-origin ?o . + } +}""" ; + ] ; + sml:constructQuery [ + a sp:Construct ; + sp:text """CONSTRUCT { + ?s ?p ?o . +} +WHERE { + FILTER(bound(?recordServiceUrl)) + OPTIONAL { + SERVICE ?recordServiceUrl { + ?s ?p ?o . + } + } +}""" ; + ] ; + sml:replace true ; +. + + +:bind-form-template + a sml:BindBySelect ; + sm:next form-mod:bind-sample-form-service-url ; + sml:selectQuery [ + a sp:Select ; + sp:text """SELECT ?formTemplate +WHERE { + OPTIONAL { + ?r ?formTemplateStr . + } + BIND (COALESCE(?_DformTemplate, str(?formTemplateStr)) AS ?formTemplate) . +}""" ; + ] ; +. + + + +form-mod:annotate-sample-questions + a sml:ApplyConstruct ; + sm:next form-mod:attach-origin-metadata ; + sml:constructQuery [ + a sp:Construct ; + sp:text """CONSTRUCT { + ?q form:has-context \"sample-question\" . +} +WHERE { + ?q a doc:question . +}""" ; + ] ; +. + + +form-mod:attach-answer-origins + a sml:ApplyConstruct ; + kbss-module:has-output-graph-constraint [ + a sp:Ask ; + sp:text """# there is an answer without origin +ASK WHERE { + ?a a doc:answer . + FILTER NOT EXISTS { + ?a form:has-answer-origin ?o . + } +}""" ; + ] ; + sm:next form-mod:attach-origin-metadata ; + sml:constructQuery [ + a sp:Construct ; + sp:text """CONSTRUCT { + ?a form:has-answer-origin ?aOrigin . +} +WHERE { + ?a a doc:answer . + FILTER NOT EXISTS { + ?a form:has-answer-origin ?aOriginNotBound . + } + BIND (URI(CONCAT(str(doc:answer), \"/\", ?formKey, \"/\", MD5(str(?a)), \"-ao\")) AS ?aOrigin) . +}""" ; + ] ; +. + + +form-mod:attach-origin-metadata + a kbss-module:construct-form-metadata ; + kbss-module:has-output-graph-constraint [ + a sp:Ask ; + sp:text """# there are two question from sample form that have same origin path +# TODO remove: same constraint is checked in generate-abrax function +ASK WHERE { + ?q1 form:has-context \"sample-question\" . + ?q1 form:has-origin-path-id ?originPath . + ?q2 form:has-context \"sample-question\" . + ?q2 form:has-origin-path-id ?originPath . + FILTER (?q1 != ?q2) +}""" ; + ] ; + kbss-module:has-output-graph-constraint [ + a sp:Ask ; + sp:text """# there is no clone of data question within sample form +ASK WHERE { + ?dataQ a doc:question . + ?dataQ form:has-origin-path-id ?originPath . + FILTER NOT EXISTS { + ?dataQ form:has-context \"sample-question\" . + } . + FILTER NOT EXISTS { + ?sampleNotBoundQ form:has-origin-path-id ?originPath . + FILTER (?sampleNotBoundQ != ?dataQ) . + } +}""" ; + ] ; + sm:next form-mod:attach-cross-form-clones ; + sml:replace false ; +. + + +form-mod:attach-cross-form-clones + a sml:ApplyConstruct ; + kbss-module:has-output-graph-constraint [ + a sp:Ask ; + sp:text """# there is no clone of data question within sample form +ASK WHERE { + ?dataQ form:has-origin-path-id ?originPath . + ?dataQ a doc:question . + FILTER NOT EXISTS { + ?dataQ form:has-context \"sample-question\" . + } . + FILTER NOT EXISTS { + ?dataQ form:is-cross-form-clone-of-question ?sampleQ . + } +}""" ; + ] ; + sm:next form-mod:construct-answers ; + sm:next form-mod:filter-origin-path-id ; + sml:constructQuery [ + a sp:Construct ; + sp:text """CONSTRUCT { + ?dataQ form:is-cross-form-clone-of-question ?sampleQ . +} +WHERE { + ?dataQ form:has-origin-path-id ?originPath . + ?sampleQ form:has-origin-path-id ?originPath . + ?sampleQ form:has-context \"sample-question\" . + FILTER NOT EXISTS { + ?dataQ form:has-context \"sample-question\" . + } +}""" ; + ] ; +. + + +form-mod:filter-origin-path-id + a sml:ApplyConstruct ; + sm:next form-mod:rename-form-entities ; + sml:constructQuery [ + a sp:Construct ; + sp:text """CONSTRUCT { + ?sampleQ form:has-origin-path-id ?pathId . +} +WHERE { + ?sampleQ form:has-context \"sample-question\" . + ?sampleQ form:has-origin-path-id ?pathId . +}""" ; + ] ; + sml:replace true ; +. + + +form-mod:construct-answers + a sml:ApplyConstruct ; + sm:next form-mod:rename-form-entities ; + sml:constructQuery [ + a sp:Construct ; + sp:text """CONSTRUCT { + ?sampleQ doc:has_answer ?a . + ?a ?p ?o . +} +WHERE { + ?dataQ form:is-cross-form-clone-of-question ?sampleQ . + ?dataQ doc:has_answer ?a . + OPTIONAL { + ?a ?p ?o . + } . +}""" ; + ] ; + sml:replace true ; +. + + +form-mod:rename-form-entities + a sml:ApplyConstruct ; + sm:next form-mod:clone-form_Return ; + kbss-module:has-output-graph-constraint [ + a sp:Ask ; + sp:text """# there are 2 questions that point to same answer +ASK WHERE { + ?q1 a doc:question . + ?q1 doc:has_answer ?a . + ?q2 a doc:question . + ?q2 doc:has_answer ?a . + FILTER (?q1 != ?q2) . +}""" ; + ] ; + kbss-module:has-output-graph-constraint [ + a sp:Ask ; + sp:text """# there is a question with two answers +ASK WHERE { + ?q a doc:question . + ?q doc:has_answer ?a1 . + ?q doc:has_answer ?a2 . + FILTER (?a1 != ?a2) . +}""" ; + ] ; + sml:constructQuery [ + a sp:Construct ; + sp:text """# 0 - duplicate form entity related data +CONSTRUCT { + ?newS ?p ?newO . +} +WHERE { + ?s ?p ?o . + OPTIONAL { + ?s a ?sEntityType . + FILTER ((?sEntityType = doc:question) || (?sEntityType = doc:answer)) . + } . + OPTIONAL { + ?o a ?oEntityType . + FILTER ((?oEntityType = doc:question) || (?oEntityType = doc:answer)) . + } . + BIND (IF((?sEntityType = doc:question), \"-q\", \"-a\") AS ?sSufix) . + BIND (IF((?oEntityType = doc:question), \"-q\", \"-a\") AS ?oSufix) . + BIND (COALESCE(URI(CONCAT(str(?sEntityType), \"/\", ?formKey, \"/\", MD5(str(?s)), ?sSufix)), ?s) AS ?newS) . + BIND (COALESCE(URI(CONCAT(str(?oEntityType), \"/\", ?formKey, \"/\", MD5(str(?o)), ?oSufix)), ?o) AS ?newO) +}""" ; + ] ; + sml:replace true ; +. + + +form-mod:clone-form_Return + a sml:ReturnRDF ; + sml:serialization sml:JSONLD ; + rdfs:label "clone-form" ; +. + + +rm-gen:clone-form + a sm:Function ; + sm:returnModule form-mod:clone-form_Return ; + rdfs:subClassOf sm:Functions ; +. + + +form:has-context + a rdf:Property ; + rdfs:label "has context" ; +. + + +form:is-cross-form-clone-of-question + a owl:ObjectProperty ; + rdfs:comment "Question within subject of this relation is clone of question within object of this relation accross multiple forms." ; + rdfs:domain doc:question ; + rdfs:range doc:question ; +.