Implementation of CitySDK-Smart-Participation-API for Klarschiff
This project got superseeded by the new Klarschiff-Backoffice. All known API features are implemented within the new application. The maintenance and support for this repository was stopped. Please migrate to the new Klarschiff-Backoffice.
JSON, XML
http://[API endpoint]/services.[format]
HTTP Method: GET
Parameters:
Name | Required | Type | Notes |
---|---|---|---|
api_key | - | String | API-Key |
Sample Response:
<services type="array">
<service>
<service_code>category.id</service_code>
<service_name>category.name</service_name>
<description/>
<metadata>false</metadata>
<type>realtime</type>
<keywords>category.parent.typ [problem|idee|tipp]</keywords>
<group>category.parent.name</group>
</service>
</services>
http://[API endpoint]/services/[service_id].[format]
HTTP Method: GET
Parameters:
Name | Required | Type | Notes |
---|---|---|---|
api_key | - | String | API-Key |
service_id | X | Integer |
Sample Response:
<service_definition type="array">
<service>
<service_code>category.id</service_code>
<service_name>category.name</service_name>
<keywords>category.parent.typ [problem|idee|tipp]</keywords>
<group>category.parent.name</group>
</service>
</service_definition>
http://[API endpoint]/requests.[format]
HTTP Method: GET
Parameters:
Name | Required | Type | Notes |
---|---|---|---|
api_key | - | String | API-Key |
service_request_id | - | Integer | List of multiple Request-IDs, comma delimited |
service_code | - | Integer | |
status | - | String | Options: default=open, closed |
detailed_status | - | String | Options: PENDING, RECEIVED, IN_PROCESS, PROCESSED, REJECTED |
start_date | - | Date | e.g 2011-01-01T00:00:00Z |
end_date | - | Date | e.g 2011-01-01T00:00:00Z |
updated_after | - | Date | e.g 2011-01-01T00:00:00Z |
updated_before | - | Date | e.g 2011-01-01T00:00:00Z |
agency_responsible | - | String | |
extensions | - | Boolean | |
lat | - | Double | restriction area (lat, long and radius required) |
long | - | Double | restriction area (lat, long and radius required) |
radius | - | Double | meter - restriction area (lat, long and radius required) |
keyword | - | String | Options: problem, idea, tip |
with_foto | - | Boolean | Filter: Meldungen mit freigegebenen Fotos |
also_archived | - | Boolean | Filter: Auch archivierte Meldungen berücksichtigen |
just_count | - | Boolean | Es soll nur die Anzahl der Meldungen zurückgegeben werden |
max_requests | - | Integer | Maximum number of requests |
observation_key | - | String | MD5-Hash of observed Area |
area_code | - | Integer | Area-ID |
Sample Response:
<service_requests type="array">
<request>
<service_request_id>request.id</service_request_id>
<status_notes/>
<status>request.status</status>
<service_code>request.service.code</service_code>
<service_name>request.service.name</service_name>
<description>request.description</description>
<agency_responsible>request.agency_responsible</agency_responsible>
<service_notice/>
<requested_datetime>request.requested_datetime</requested_datetime>
<updated_datetime>request.updated_datetime</updated_datetime>
<expected_datetime/>
<address>request.address</address>
<adress_id/>
<lat>request.position.lat</lat>
<long>request.position.lat</long>
<media_url/>
<zipcode/>
</request>
</service_requests>
http://[API endpoint]/requests/[service_request_id].[format]
HTTP Method: GET
Parameters:
Name | Required | Type | Notes |
---|---|---|---|
service_request_id | X | Integer | |
api_key | - | String | API-Key |
extensions | - | Boolean |
Sample Response:
<service_requests type="array">
<request>
<service_request_id>request.id</service_request_id>
<status_notes/>
<status>request.status</status>
<service_code>request.service.code</service_code>
<service_name>request.service.name</service_name>
<description>request.description</description>
<agency_responsible>request.agency_responsible</agency_responsible>
<service_notice/>
<requested_datetime>request.requested_datetime</requested_datetime>
<updated_datetime>request.updated_datetime</updated_datetime>
<expected_datetime/>
<address>request.address</address>
<adress_id/>
<lat>request.position.lat</lat>
<long>request.position.lat</long>
<media_url/>
<zipcode/>
<extended_attributes>
<detailed_status>request.detailed_status</detailed_status>
<media_urls>
<media_url>request.media.url</media_url>
</media_urls>
<photo_required>request.photo_required</photo_required>
<trust>request.trust</trust>
<votes>request.votes</votes>
</extended_attributes>
</request>
</service_requests>
http://[API endpoint]/requests.[format]
HTTP Method: POST
Parameters:
Name | Required | Type | Notes |
---|---|---|---|
api_key | X | String | API-Key |
X | String | Author-Email | |
service_code | X | Integer | Category-ID |
description | X | String | Description |
lat | - | Float | either lat & long or address_string |
long | - | Float | either lat & long or address_string |
address_string | - | String | either address_string or lat & long |
photo_required | - | Boolean | Photo required |
media | - | String | Photo (Base64-Encoded-String) |
privacy_policy_accepted | - | Boolean |
Sample Response:
<service_requests>
<request>
<service_request_id>request.id</service_request_id>
</request>
</service_requests>
http://[API endpoint]/requests/[service_request_id].[format]
HTTP Method: PUT / PATCH
Parameters:
Name | Required | Type | Notes |
---|---|---|---|
api_key | X | String | API-Key |
X | String | Author-Email | |
service_code | - | Integer | Category-ID |
description | - | String | Description |
lat | - | Float | either lat & long or address_string |
long | - | Float | either lat & long or address_string |
address_string | - | String | either address_string or lat & long |
photo_required | - | Boolean | Photo required |
detailed_status | - | String | Status (RECEIVED, IN_PROCESS, PROCESSED, REJECTED) |
status_notes | - | String | Status note |
priority | - | Integer | Priority |
delegation | - | String | Delegation to external role |
job_status | - | Integer | Job status |
job_priority | - | Integer | Job priority |
media | - | String | Photo (Base64-Encoded-String) |
Sample Response:
<service_requests type="array">
<request>
<service_request_id>request.id</service_request_id>
<status_notes/>
<status>request.status</status>
<service_code>request.service.code</service_code>
<service_name>request.service.name</service_name>
<description>request.description</description>
<agency_responsible>request.agency_responsible</agency_responsible>
<service_notice/>
<requested_datetime>request.requested_datetime</requested_datetime>
<updated_datetime>request.updated_datetime</updated_datetime>
<expected_datetime/>
<address>request.address</address>
<adress_id/>
<lat>request.position.lat</lat>
<long>request.position.lat</long>
<media_url/>
<zipcode/>
</request>
</service_requests>
http://[API endpoint]/requests/comments/[service_request_id].[format]
HTTP Method: GET
Parameters:
Name | Required | Type | Notes |
---|---|---|---|
service_request_id | X | Integer | |
api_key | X | String | API-Key |
Sample Response:
<comments type="array">
<comment>
<id>comment.id</id>
<jurisdiction_id></jurisdiction_id>
<comment>comment.text</comment>
<datetime>comment.datetime</datetime>
<service_request_id>comment.service_request_id</service_request_id>
</comment>
</comments>
http://[API endpoint]/requests/comments/[service_request_id].[format]
HTTP Method: POST
Parameters:
Name | Required | Type | Notes |
---|---|---|---|
service_request_id | X | Integer | |
api_key | X | String | API-Key |
author | X | String | |
comment | X | String | |
privacy_policy_accepted | - | Boolean |
Sample Response:
<comments>
<comment>
<id>comment.id</id>
<jurisdiction_id></jurisdiction_id>
<comment>comment.text</comment>
<datetime>comment.datetime</datetime>
<service_request_id>comment.service_request_id</service_request_id>
</comment>
</comments>
http://[API endpoint]/requests/notes/[service_request_id].[format]
HTTP Method: GET
Parameters:
Name | Required | Type | Notes |
---|---|---|---|
service_request_id | X | Integer | |
api_key | X | String | API-Key |
Sample Response:
<notes type="array">
<note>
<jurisdiction_id></jurisdiction_id>
<comment>note.text</comment>
<datetime>note.datetime</datetime>
<service_request_id>note.service_request_id</service_request_id>
<author>note.author</author>
</note>
</notes>
http://[API endpoint]/requests/notes/[service_request_id].[format]
HTTP Method: POST
Parameters:
Name | Required | Type | Notes |
---|---|---|---|
service_request_id | X | Integer | |
api_key | X | String | API-Key |
author | X | String | |
comment | X | String |
Sample Response:
<notes>
<note>
<jurisdiction_id></jurisdiction_id>
<comment>note.text</comment>
<datetime>note.datetime</datetime>
<service_request_id>note.service_request_id</service_request_id>
<author>note.author</author>
</note>
</notes>
http://[API endpoint]/requests/abuses/[service_request_id].[format]
HTTP Method: POST
Parameters:
Name | Required | Type | Notes |
---|---|---|---|
service_request_id | X | Integer | |
author | X | String | |
comment | X | String | |
privacy_policy_accepted | - | Boolean |
Sample Response:
<abuses>
<abuse>
<id>abuse.id</id>
</abuse>
</abuses>
http://[API endpoint]/requests/votes/[service_request_id].[format]
HTTP Method: POST
Parameters:
Name | Required | Type | Notes |
---|---|---|---|
service_request_id | X | Integer | |
author | X | String | Author-Email |
privacy_policy_accepted | - | Boolean | |
status_updates_for_customer | - | Boolean | Über Statusänderungen informieren |
Sample Response:
<votes>
<vote>
<id>vote.id</id>
</vote>
</votes>
http://[API endpoint]/requests/photos/[service_request_id].[format]
HTTP Method: POST
Parameters:
Name | Required | Type | Notes |
---|---|---|---|
service_request_id | X | Integer | |
author | X | String | Author-Email |
media | X | String | Photo (Base64-Encoded-String) |
Sample Response:
<photos>
<photo>
<id>photo.id</id>
</photo>
</photos>
http://[API endpoint]/coverage.[format]
HTTP Method: GET
Parameters:
Name | Required | Type | Notes |
---|---|---|---|
api_key | X | String | API-Key |
lat | X | Float | latitude value |
long | X | Float | longitude value |
Sample Response:
<hash>
<result type="boolean">false</result>
</hash>
http://[API endpoint]/areas.[format]
HTTP Method: GET
Parameters:
Name | Required | Type | Notes |
---|---|---|---|
api_key | X | String | API-Key |
ids | - | String | |
with_districts | - | Boolean |
Sample Response:
<areas>
<area>
<id>30</id>
<name>Biestow</name>
<grenze>MULTIPOLYGON (((...)))</grenze>
</area>
...
</areas>
http://[API endpoint]/observations.[format]
HTTP Method: POST
Parameters:
Name | Required | Type | Notes |
---|---|---|---|
api_key | X | String | API-Key |
geometry | * | String | |
area_code | * | String | |
problems | - | Boolean | |
problem_service | - | String | |
problem_service_sub | - | String | |
ideas | - | Boolean | |
idea_service | String | ||
idea_service_sub | String |
*: Either geometry or area_code is required
Sample Response:
<observation>
<rss-id>39a855f0a4924af3217a217c8dc78ece</rss-id>
</observatio>
http://[API endpoint]/jobs.[format]
HTTP Method: GET
Parameters:
Name | Required | Type | Notes |
---|---|---|---|
api_key | X | String | API-Key |
date | X | Date | Jobs that are the equal or lower than the given date |
status | - | String | Status (CHECKED, UNCHECKED, NOT_CHECKABLE) |
Sample Response:
<jobs>
<job>
<id>job.id</id>
<service-request-id>job.service_request_id</service-request-id>
<date>job.date</date>
<agency-responsible>job.agency_responsible</agency-responsible>
<status>job.status</status>
</job>
...
</jobs>
http://[API endpoint]/jobs.[format]
HTTP Method: POST
Parameters:
Name | Required | Type | Notes |
---|---|---|---|
api_key | X | String | API-Key |
service_request_id | X | Integer | |
agency_responsible | X | String | |
date | X | Date |
Sample Response:
<jobs>
<job>
<id>job.id</id>
<service-request-id>job.service_request_id</service-request-id>
<date>job.date</date>
<agency-responsible>job.agency_responsible</agency-responsible>
<status>job.status</status>
</job>
</jobs>
http://[API endpoint]/jobs/[service_request_id].[format]
HTTP Method: PUT / PATCH
Parameters:
Name | Required | Type | Notes |
---|---|---|---|
api_key | X | String | API-Key |
status | X | String | Status (CHECKED, UNCHECKED, NOT_CHECKABLE) |
date | X | Date |
Sample Response:
<jobs>
<job>
<id>job.id</id>
<service-request-id>job.service_request_id</service-request-id>
<date>job.date</date>
<agency-responsible>job.agency_responsible</agency-responsible>
<status>job.status</status>
</job>
</jobs>
- RVM / oder andere Rubyversionsverwaltung
-
Installation von RVM (kann übersprungen werden wenn diese bereits erfolgt ist):
\curl -L https://get.rvm.io | sudo bash -s stable --ruby
-
Aktualisierung von RVM (falls es bereits systemweit installiert ist)
rvmsudo rvm get stable
-
- Passenger-Apache-Modul installieren: Hierzu am besten der offiziellen Anleitung unter https://www.phusionpassenger.com/documentation/Users%20guide%20Apache.html#installation folgen.
-
checkout / clone des Repositories in ein lokales Verzeichnis. Z.B.:
sudo mkdir -p /var/rails cd /var/rails git clone https://github.com/bfpi/klarschiff-citysdk.git
-
Installation der notwendigen Rubyversion und des Gemsets
-
Bei Wechsel in das Repository-Verzeichnis hilft RVM mit der Einrichtung
-
Gegebenenfalls muss das entsprechende Ruby installiert werden:
rvm install ruby-2.3.2
-
Ein erneuter Wechsel in das Verzeichnis legt anschließend die notwendigen Wrapper und das Gemset an
ruby-2.3.2 - #gemset created /usr/local/rvm/gems/ruby-2.3.2@klarschiff-citysdk_r01 ruby-2.3.2 - #generating klarschiff-citysdk_r01 wrappers................
-
Falls
bundler
nicht (mehr) als Default-Gem durch RVM installiert wird, kann dies wie folgt nachgeholt werden:gem install bundler --no-ri --no-rdoc
-
Zur Installation der Gems für die Anwendung ist im Verzeichnis nun folgender Aufruf notwendig:
bundle install
-
Precompilieren der Assets (Bilder)
rake assets:precompile
-
Für die Konfigurationsdateien mit vertraulichem Inhalt gibt es versionierbare Vorlagen mit dem Namen xyz.sample.yml
. Diese müssen kopiert und entsprechend ohne das sample
als xyz.yml
benannt werden. Die für die Umgebung gültigen Werte werden dann in der xyz.yml
konfiguriert.
- Interne Vorgabewerte werden als Konstanten in dem Block
constants
konfiguriert. - Weitere Blöcke sind bisher nicht implementiert.
In dieser Datei erfolgt die Berechtigungsdefinition für die zu unterstützenden API-Clients.
- Jeder neue Client wird mit einem eigenene API-Key als Schlüssel in dieser Datei eingefügt.
- Unterhalb dieses Schlüssels können folgende Werte konfiguriert werden:
-
name
, ist optional, soll aber für die Verständlichkeit einen Bezeichner des API-Clients tragen können (z.B. Prüf- und Protokoll-Client). -
backend_auth_code
, konfiguriert den Authorisierungsschlüssel für die erweiterte Kommunikation mit dem Backend. Dieser muss mit dem Property-Wertauth.kod_code
in dersettings.properties
im Backend der jeweiligen Zielumgebung übereinstimmen. -
permissions
, definiert die für diesen Client erlaubten Berechtigungen. Die Definition erfolgt als YAML-Array, also ein Eintrag pro Zeile. Die Werte werden als Ruby-Symbol geschrieben. Beispiel:permissions: - :create_comments - :create_notes
-
Die Datei dient der Konfiguration zur Verschlüsselung der internen Nutzerdaten (Cookies, usw.).
- Die Konfiguration erfolgt hier nach Rails-Konvention pro Umgebung. Es muss aber nur die Variante mit der entsprechenden Umgebung konfiguriert werden. Also
production
in der Produktivumgebung und der Demo-Umgebung. Die RAILS_ENVtest
ist für automatisierte Tests im Framework vorbehalten.