ifgi-webteam/Campusplan

View on GitHub
app/api/functions.php

Summary

Maintainability
A
3 hrs
Test Coverage
<?php
// Implement a cache mechanism for file_get_contents()
// Set a default cache expiry time of 7 days (604800 seconds)
function file_get_contents_cached($url, $expiry=604800, $opts=array()) {
    try {
        $urlMd5 = md5($url);
        $cachedFile = "cache/".$urlMd5;
        $now = time();
        // check if a cached version exists AND if it's not older than $epiry
        if(is_file($cachedFile) && ($now-filemtime($cachedFile)) < $expiry) {
            $cached = file_get_contents($cachedFile, true);
            return $cached;
        } else {
            if(empty($opts)) {
                $opts = array(
                    'http'=>array(
                        'header' => "Accept: application/json\r\n",
                        'timeout' => 10
                        )
                );
            }
            $context = stream_context_create($opts);

            // mute file_get_contents because it doesn't behave within try/catch block when exception happens
            if($response = @file_get_contents($url, false, $context)) {
                if($http_response_header[0] != "HTTP/1.1 200 OK") return false;
                //print_r($http_response_header);

                file_put_contents($cachedFile, $response);
                return $response;
            }
            return false;
        }
    } catch(Exception $e) {

    }
}

// Query database and return JSON string
function sparql_get($query) {
    $url = 'http://giv-lodumdata.uni-muenster.de:8080/openrdf-sesame/repositories/lodumhbz?format=json&limit=10000&query='.rawurlencode($query).'';
    $opts = array(
            'http'=>array(
                'header' => "Accept: application/sparql-results+json\r\n",
                'timeout' => 10
                )
        );
    $response = file_get_contents_cached($url, 604800, $opts);
    if(json_decode($response)) { // check for validity
        return $response;
    }
    return false;
}

/*
    Query database for organizations by starting letter
*/
function searchByLetter($letter) {

    $orgs = sparql_get("

prefix foaf: <http://xmlns.com/foaf/0.1/>
prefix aiiso: <http://purl.org/vocab/aiiso/schema#>
prefix lodum: <http://vocab.lodum.de/helper/>

SELECT DISTINCT ?orga ?name WHERE {

    Graph <http://data.uni-muenster.de/context/uniaz/> {
          ?orga a ?type ;
                foaf:name ?name .
      BIND(lcase(?name) as ?lname) .
      FILTER langMatches(lang(?name),'DE') .
      FILTER (STRSTARTS(?name, '".$letter."')) .
      FILTER (STRLEN(?name) > 0) .
      FILTER regex(str(?orga),'uniaz') .
    }

} ORDER BY ?lname
");

    return $orgs;
}

/*
    Query database for organizations by whole word
*/
function searchByWord($searchterm) {

    $orgs = sparql_get("

prefix foaf: <http://xmlns.com/foaf/0.1/>
prefix aiiso: <http://purl.org/vocab/aiiso/schema#>
prefix lodum: <http://vocab.lodum.de/helper/>

SELECT DISTINCT ?orga ?name WHERE {

    Graph <http://data.uni-muenster.de/context/uniaz/> {
          ?orga a ?type ;
                foaf:name ?name .

      BIND(lcase(?name) as ?lname) .
      FILTER langMatches(lang(?name),'DE') .
      FILTER regex(?name, '".$searchterm."', 'i' ) .
      FILTER (STRLEN(?name) > 0) .
      FILTER regex(str(?orga),'uniaz') .
    }

} ORDER BY ?lname
");

    return $orgs;
}

/*
    Query single organization's details
*/
function getOrgDetails($identifier, $lang = "de") {
    $org = "http://data.uni-muenster.de/context/".$identifier;
    $orga = sparql_get("

prefix foaf: <http://xmlns.com/foaf/0.1/>
prefix wgs84: <http://www.w3.org/2003/01/geo/wgs84_pos#>
prefix vcard: <http://www.w3.org/2006/vcard/ns#>
prefix lodum: <http://vocab.lodum.de/helper/>
PREFIX geo:<http://www.opengis.net/ont/geosparql#>
prefix xsd: <http://www.w3.org/2001/XMLSchema#>

SELECT DISTINCT ?subject ?name ?homepage ?address ?street ?zip ?city ?buildingaddress ?lat ?long ?wkt WHERE {
  <".$org."> foaf:name ?name.
  OPTIONAL { <".$org."> foaf:homepage ?homepage . }
  OPTIONAL { <".$org."> vcard:adr ?address .
      FILTER ( datatype(?address) = xsd:string )
  }
  OPTIONAL { <".$org."> lodum:building ?building .
     OPTIONAL { ?building wgs84:lat ?lat ;
                              wgs84:long ?long . }
     OPTIONAL { ?building vcard:adr ?buildingAddress .
                 ?buildingAddress vcard:street-address ?street ;
                     vcard:postal-code ?zip ;
                     vcard:region ?city .
     }
     OPTIONAL { ?building geo:hasGeometry ?geometry .
                          ?geometry geo:asWKT ?wkt . }
  }
  BIND(<".$org."> as ?subject)
  FILTER langMatches(lang(?name),'".$lang."') .
}
    ");

    return $orga;
}

function listSubSorganizations($identifier) {
    $org = "http://data.uni-muenster.de/context/".$identifier;
    $orgs = sparql_get("
prefix foaf: <http://xmlns.com/foaf/0.1/>
prefix aiiso: <http://purl.org/vocab/aiiso/schema#>
prefix lodum: <http://vocab.lodum.de/helper/>
SELECT DISTINCT ?orga ?name WHERE {
    Graph <http://data.uni-muenster.de/context/uniaz/> {
        ?orga a ?type ;
        foaf:name ?name ;

        aiiso:part_of <".$org."> .
        BIND(lcase(?name) as ?lname) .
        FILTER langMatches(lang(?name),'DE') .
        FILTER (STRLEN(?name) > 0) .
        FILTER regex(str(?orga),'uniaz') .
    }
} 
    ");
    return $orgs;
}

/*
    Query all buildings for display on map
    Includes point location data
*/
function getMapGeometriesPts() {
    $lang = "de";
    $query = "
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX aiiso: <http://purl.org/vocab/aiiso/schema#>
PREFIX lodum: <http://vocab.lodum.de/helper/>
PREFIX geo:<http://www.opengis.net/ont/geosparql#>
PREFIX vcard: <http://www.w3.org/2006/vcard/ns#>
PREFIX wgs84: <http://www.w3.org/2003/01/geo/wgs84_pos#>

SELECT DISTINCT ?name ?lat ?lon ?address ?organization ?buildingname ?building WHERE {
    ?organization a foaf:Organization ;
      foaf:name ?name ;
      vcard:adr ?adr ;
      lodum:building ?building .
      
    ?building 
      wgs84:lat ?lat ;
      wgs84:long ?lon ;
      foaf:name ?buildingname .

    OPTIONAL { ?organization vcard:adr ?address .
       FILTER ( datatype(?address) = xsd:string )
      }

      FILTER langMatches(lang(?name),'".$lang."') .
} ORDER BY ?name
";
    $mapData = sparql_get($query);
    return $mapData;
}

/*
    Query all buildings for display on map
    Includes polygon data
*/
function getMapGeometriesPoly() {
    $query = "
prefix foaf: <http://xmlns.com/foaf/0.1/>
prefix aiiso: <http://purl.org/vocab/aiiso/schema#>
prefix lodum: <http://vocab.lodum.de/helper/>
PREFIX geo:<http://www.opengis.net/ont/geosparql#>

SELECT DISTINCT ?building ?name ?wkt WHERE {
    ?building a <http://dbpedia.org/ontology/building> ;
    <http://xmlns.com/foaf/0.1/name> ?name .
    ?building geo:hasGeometry ?geom.
        ?geom geo:asWKT ?wkt 
} ORDER BY ?name
";
    $mapData = sparql_get($query);
    return $mapData;
}

/*
    Query all Fachbereiche
*/
function getFachbereiche() {
    $lang="de";
    $query = "
prefix foaf: <http://xmlns.com/foaf/0.1/>
prefix lodum: <http://vocab.lodum.de/helper/>
prefix owl: <http://www.w3.org/2002/07/owl#>

SELECT DISTINCT * WHERE {
  ?fb a lodum:Department ;
     foaf:name ?name;
     lodum:departmentNo ?no.
  FILTER langMatches(lang(?name),'".$lang."') .
  FILTER regex(?name,' - ') .
  FILTER regex(str(?fb), '/fb') .
} ORDER BY ?no
";
    $fbs = sparql_get($query);
    return $fbs;
}

/*
    Query all Hörsäle
*/
function getHoersaele() {
    $lang="de";
    $query = "
prefix foaf: <http://xmlns.com/foaf/0.1/>
prefix lodum: <http://vocab.lodum.de/helper/>
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix vcard: <http://www.w3.org/2006/vcard/ns#>

SELECT DISTINCT ?hs (MAX(?name) AS ?name) (MAX(?building) AS ?building) (MAX(?floor) AS ?floor) (MAX(?buildingname) AS ?buildingname) (MAX(?addr) AS ?addr) (MAX(?address) AS ?address) WHERE {

  ?hs a lodum:LectureHall ;
     foaf:name ?name ;
     lodum:building ?building ;
     lodum:floor ?floor .

  ?building foaf:name ?buildingname ;
            vcard:adr ?addr .

  ?addr vcard:street-address ?address .

  FILTER langMatches(lang(?name),'de') .

}  GROUP BY ?hs ORDER BY ?name
";
    $fbs = sparql_get($query);
    return $fbs;
}

/*
    Query all Wohnheime
*/
function getWohnheime() {
    $lang="de";
    $query = "
prefix foaf: <http://xmlns.com/foaf/0.1/>
prefix lodum: <http://vocab.lodum.de/helper/>

SELECT DISTINCT * WHERE {
  ?fb a lodum:StudentHousing ;
     foaf:name ?name;
  FILTER langMatches(lang(?name),'".$lang."') .
} ORDER BY ?name
";
    $fbs = sparql_get($query);
    return $fbs;
}