m!service

Uptime Robot ratio (30 days) Build Status Code Coverage Dependency Status devDependency Status node license

RESTful JSON API für das Man!ac Forum.

Inhalt

Betrieb

Es wird Node.js in Version 10.11.0 vorausgesetzt. Für die Datenhaltung wird eine MongoDB Instanz ab Version 3+ und für das Caching Redis 5.x benötigt.

Command Line Options

$ ./mservice.js --help
m!service

Examples:
  node ./mservice.js                                                                         Starts server
  node ./mservice.js -k=/etc/ssl/localcerts/my.key -c=/etc/ssl/localcerts/my.crt             Starts server in SSL mode
  node ./mservice.js -l=/var/log/mservice/mservice.log                                       Starts server with log file
  node ./mservice.js --verbose-logging | mservice/node_modules/bunyan/bin/bunyan -o short    Starts server for development

Options:
  -h, --help               Displays this help message
  -p, --port               TCP port                                                     [default: 8080]
  -u, --maniac-url         URL to maniac-forum                                          [default: "https://maniac-forum.de/forum/pxmboard.php"]
  -k, --key                Path to ssl key
  -c, --certificate        Path to ssl certificate
  --authority-certificate  Path to ssl authority certificate
  -l, --log-file           Output file for log (If false, output goes to stdout)        [default: false]
  --disable-logging        Disables logging                                             [default: false]
  --verbose-logging        If enabled all requests are logged (useful for development)  [default: false]

Docker

mkdir -p /var/mservice/db/
docker run -itd -v /var/mservice/db/:/data/db --name mservicedb -d mongo
docker run -it --name mservicecache -d redis
docker run -it --name mservice --link mservicecache:mservicecache --link mservicedb:mservicedb -p 8080:8080 stitch/mservice

API

Allgemeines

Parameter

Spezifische Ressourcen werden über Parameter angesprochen. Falls vorhanden, sind die Parameter zur Spezifizierung einer Ressource Teil der dazugehörigen URI welche in der Beschreibung Platzhalter in Form von :ParameterName enthält, die in der Tabelle URI Params beschrieben sind. Parameter zur Manipulation einer Ressource werden im Request Body mitgesendet und sind falls vorhanden in der Tabelle Data Params beschrieben.

Authentifizierung

Einige Ressourcen benötigen Authentifizierung, dazu muss beim Request eine für das Man!ac-Forum gültige Username / Passwort Kombination im HTTP-Header in Form von Basic Authentication nach RFC 2617 mitgesendet werden. Wenn eine Ressource eine gültige Authentifizierung benötigt ist dies mit NEEDS AUTHENTICATION unterhalb der URI markiert.

Responses

Bei der Verwendung der API ist der HTTP Status Code der Server Response zu beachten. Alle gültigen Requests erhalten eine Response mit Code 200, im Fehlerfall wird der entsprechende Code laut RFC 7231 und eine Beschreibung des Fehlers im Feld error zurückgegeben. Alle spezifischen Error Responses der einzelnen Ressourcen werden als Example Error Response zu der jeweiligen Ressource beschrieben.

Allgemeine Error Responses:

HTTP Status Code Beschreibung
404 - Not Found Die angeforderte Ressource existiert nicht
405 - Method Not Allowed Die verwendete HTTP Methode für die angeforderte Ressource ist nicht erlaubt
500 - Internal Server Error Unbekannter Fehler ist aufgetreten
504 - Gateway Timeout Es konnte keine Verbindung zum Forumsserver hergestellt werden, tritt zB in den Downzeiten während der Nacht auf

Test Login

Überprüft Login Daten.

HTTP Method: GET

mservice/test-login

NEEDS AUTHENTICATION

Example Success Response

HTTP/1.1 200 OK

Example Error Response

HTTP/1.1 401 Unauthorized
{
    "error": "Authentication failed"
}

Boards

Daten der Startseite / Boardübersicht.

HTTP Method: GET

mservice/boards

Response Data

Feld Typ Beschreibung
board Object Board
board.closed Boolean Board - Closed Status
board.id Number Board - ID (null wenn closed)
board.name String Board - Name
board.topic String Board - Thema
board.lastMessage Date Board - Datum der letzten Nachricht
board.mods Array Board - Liste der Moderatoren Namen

Example Success Response

HTTP/1.1 200 OK
{
    [
        {
            "closed": false,
            "id": 1,
            "name": "Smalltalk",
            "topic": "Diskussionen rund um die Welt der Videospiele.",
            "lastMessage": "2014-10-31T05:44:00+01:00",
            "mods": [
                "Andi",
                "Rocco",
                "Leviathan",
                "Slapshot"
            ]
        },
        {
            "closed": false,
            "id": 2,
            "name": "For Sale",
            "topic": "Private Kleinanzeigen: An- und Verkauf gebrauchter Spiele",
            "lastMessage": "2014-10-31T01:09:00+01:00",
            "mods": [
                "Andi",
                "Rocco",
                "Leviathan",
                "pzykoskinhead",
                "Slapshot"
            ]
        },
        {
            "closed": false,
            "id": 4,
            "name": "Retro'n'Tech",
            "topic": "Retro-Themen, Umbau-Lösungen, Anschluss-Probleme, Computerprobleme, Spielehilfen",
            "lastMessage": "2014-10-31T05:39:00+01:00",
            "mods": [
                "Slapshot",
                "Leviathan",
                "Rocco",
                "Andi"
            ]
        },
        {
            "closed": false,
            "id": 6,
            "name": "OT",
            "topic": "Ohne Tiefgang - der tägliche Schwachsinn",
            "lastMessage": "2014-10-31T05:45:00+01:00",
            "mods": [
                "Andi",
                "Rocco",
                "Leviathan",
                "Slapshot"
            ]
        },
        {
            "closed": false,
            "id": 26,
            "name": "Filme & Serien",
            "topic": "Alles wofür 24 fps reichen",
            "lastMessage": "2014-10-31T02:30:00+01:00",
            "mods": [
                "Andi",
                "Rocco",
                "Leviathan",
                "Slapshot"
            ]
        },
        {
            "closed": false,
            "id": 8,
            "name": "Online-Gaming",
            "topic": "Alles rund um Onlinespiele",
            "lastMessage": "2014-10-30T13:55:00+01:00",
            "mods": [
                "Andi",
                "Rocco",
                "Leviathan",
                "Slapshot"
            ]
        },
        {
            "closed": true,
            "id": null,
            "name": "E3",
            "topic": "14.-16. Juni",
            "lastMessage": "2016-06-23T14:40:00+02:00",
            "mods": [
                "Leviathan",
                "Slapshot"
            ]
        }
    ]
}

Threads

Liste der Threads (Daten des oberen Frames) eines Boards.

HTTP Method: GET

mservice/board/:boardId/threads

OPTIONAL AUTHENTICATION

URI Params

Parameter Beschreibung
boardId Board ID

Response Data

Feld Typ Beschreibung
thread Object Thread
thread.id Number Thread - ID
thread.messageId Number Thread - Message ID des Eingangspostings
thread.isRead Boolean Thread - Eingangsposting ist gelesen [1]
thread.sticky Boolean Thread - Thread ist sticky
thread.closed Boolean Thread - Thread ist geschlossen [2]
thread.author String Thread - Benutzername des Threadersteller
thread.mod String Thread - Threadersteller ist ein Moderator
thread.subject String Thread - Betreff
thread.date Date Thread - Erstellungsdatum
thread.messagesCount Number Thread - Anzahl der Postings
thread.messagesRead Number Thread - Anzahl der gelesenen Postings [1]
thread.lastMessageId Number Thread - messageId des letzten Postings
thread.lastMessageIsRead Boolean Thread - letzte Posting ist gelesen [1]
thread.lastMessageDate Date Thread - Datum des letzten Postings

Hinweise:
[1]: Ohne Authentifizierung ist dieses Feld null [2]: Wenn sticky = TRUE, ist closed immer FALSE.
Ob ein Sticky Thread geschlossen ist kann nicht aus dem HTML des Man!ac Forums entnommen werden.

Example Success Response

HTTP/1.1 200 OK
{
    [
        {
            "id": 151906,
            "messageId": 3567281,
            "isRead": true,
            "sticky": false,
            "closed": false,
            "author": "Stitch",
            "mod": false,
            "subject": "Der Apple Thread Nr 44 - Bigger than Bigger",
            "date": "2014-09-09T21:08:00+02:00",
            "messagesCount": 925,
            "messagesRead": 925,
            "lastMessageId": 3567282,
            "lastMessageIsRead": true,
            "lastMessageDate": "2014-10-10T14:19:00+02:00"
        },
        {
            "id": 152011,
            "messageId": 3571292,
            "isRead": true,
            "sticky": false,
            "closed": false,
            "author": "Andi",
            "mod": true,
            "subject": "Was ich noch sagen wollte... Thread Nr. 201b",
            "date": "2014-09-15T21:29:00+02:00",
            "messagesCount": 670,
            "messagesRead": 207,
            "lastMessageId": 3571293,
            "lastMessageIsRead": false,
            "lastMessageDate": "2014-10-10T22:32:00+02:00"
        },
        {
            "id": 150258,
            "messageId": 3497478,
            "isRead": false,
            "sticky": false,
            "closed": false,
            "author": "TOM",
            "mod": false,
            "subject": "Die besten Filmchen aller Zeiten - Teil 25",
            "date": "2014-05-24T23:24:00+02:00",
            "messagesCount": 416,
            "messagesRead": 0,
            "lastMessageId": 3497479,
            "lastMessageIsRead": false,
            "lastMessageDate": "2014-10-10T22:29:00+02:00"
        },
        ...
    ]
}

Example Error Response

Ungültige Board ID referenziert:
HTTP/1.1 404 Not Found
{
    "error": "boardId not found"
}

Thread

Liste der Messages (Daten des mittleren Frames) eines Threads.

HTTP Method: GET

mservice/board/:boardId/thread/:threadId

URI Params

Parameter Beschreibung
boardId Board ID
threadId Thread ID

Response Data

Feld Typ Beschreibung
message Object Message
message.id Number Message - ID
message.isRead Boolean Message - Posting ist gelesen [1]
message.level Number Message - Grad der Einrückung in der Baumstruktur
message.subject String Message - Betreff
message.mod String Message - Messageersteller ist ein Moderator
message.username String Message - Benutzername
message.date Date Message - Erstellungsdatum

Hinweise:
[1]: Ohne Authentifizierung ist dieses Feld null

Example Success Response

HTTP/1.1 200 OK
{
    [
        {
            "messageId": 3567281,
            "isRead": true,
            "level": 0,
            "subject": "Der Apple Thread Nr 44 - Bigger than Bigger",
            "mod": false,
            "username": "Stitch",
            "date": "2014-09-09T21:08:00+02:00"
        },
        {
            "messageId": 3585057,
            "isRead": false,
            "level": 1,
            "subject": "2 Wochen mit dem iPhone 6",
            "mod": false,
            "username": "Wurzelgnom",
            "date": "2014-10-08T10:18:00+02:00"
        },
        {
            "messageId": 3585192,
            "isRead": true,
            "level": 2,
            "subject": "Re:2 Wochen mit dem iPhone 6",
            "mod": false,
            "username": "Stitch",
            "date": "2014-10-08T12:24:00+02:00"
        },
        {
            "messageId": 3585540,
            "isRead": true,
            "level": 3,
            "subject": "Re:2 Wochen mit dem iPhone 6",
            "mod": false,
            "username": "Wurzelgnom",
            "date": "2014-10-08T17:30:00+02:00"
        },
        {
            "messageId": 3585158,
            "isRead": false,
            "level": 2,
            "subject": "Mir ist in 15 Jahren mein Handy fast nie...",
            "mod": false,
            "username": "PoP",
            "date": "2014-10-08T11:55:00+02:00"
        },
        {
            "messageId": 3586454,
            "isRead": false,
            "level": 3,
            "subject": "Re:Mir ist in 15 Jahren mein Handy fast nie...",
            "mod": false,
            "username": "Lizardking",
            "date": "2014-10-09T21:09:00+02:00"
        },
        ...
    ]
}

Example Error Response

Ungültige Board ID referenziert:
HTTP/1.1 404 Not Found
{
    "error": "boardId not found"
}
Ungültige Thread ID referenziert:
HTTP/1.1 404 Not Found
{
    "error": "threadId not found"
}

Message

Daten des unteren Frames, eine Message.

HTTP Method: GET

mservice/board/:boardId/thread/:threadId/message/:messageId

OPTIONAL AUTHENTICATION

URI Params

Parameter Beschreibung
boardId Board ID
threadId Thread ID
messageId Message ID

Response Data

Feld Typ Beschreibung
messageId Number Message ID
userId Number Account-Nr.
username String Benutzername
subject String Betreff
date Date Erstellungsdatum
text String Message Body als Plain Text
textHtml String Message Body als HTML
textHtmlWithImages String Message Body als HTML Images in IMG-Tags
isRead Boolean | Null Posting ist gelesen [1]
notification Boolean | Null Status der Mailbenachrichtigung [1]
userBlockedByYou Boolean | Null Der Benutzer wurde von dir blockiert [1]
userBlockedYou Boolean | Null Du wurdest von dem Benutzer blockiert [1]

Hinweise:
[1]: Ohne Authentifizierung ist dieses Feld null

Example Success Response

HTTP/1.1 200 OK
{
    "messageId": 3567281,
    "userId": 2615,
    "username": "Stitch",
    "subject": "Der Apple Thread Nr 44 - Bigger than Bigger",
    "date": "2014-09-09T21:08:00+02:00",
    "text": "[https://i.imgur.com/ETtsCml.jpg]\n\nLink zum Vorgänger:\n[https://www.maniac-forum.de/forum/pxmboard.php?mode=message&brdid=6&msgid=3502734]",
    "textHtml": "<a href=\"https://i.imgur.com/ETtsCml.jpg\" target=\"_blank\">https://i.imgur.com/ETtsCml.jpg</a><br>\n<br>\nLink zum Vorgänger:<br>\n<a href=\"https://www.maniac-forum.de/forum/pxmboard.php?mode=message&brdid=6&msgid=3502734\" target=\"_blank\">https://www.maniac-forum.de/forum/pxmboard.php?mode=message&brdid=6&msgid=3502734</a>",
    "textHtmlWithImages": "<a href=\"https://i.imgur.com/ETtsCml.jpg\"><img src=\"https://i.imgur.com/ETtsCml.jpg\"></a><br>\n<br>\nLink zum Vorgänger:<br>\n<a href=\"https://www.maniac-forum.de/forum/pxmboard.php?mode=message&brdid=6&msgid=3502734\">https://www.maniac-forum.de/forum/pxmboard.php?mode=message&brdid=6&msgid=3502734</a>"
}

Example Error Response

Ungültige Board ID referenziert:
HTTP/1.1 404 Not Found
{
    "error": "boardId not found"
}
Ungültige Message ID referenziert:
HTTP/1.1 404 Not Found
{
    error: "messageId not found"
}

Notification Status

Alternative Möglichkeit den Status der Mailbenachrichtigung einer Message abzufragen.

HTTP Method: GET

mservice/board/:boardId/notification-status/:messageId

NEEDS AUTHENTICATION

URI Params

Parameter Beschreibung
boardId Board ID
messageId Message ID

Response Data

Feld Typ Beschreibung
notification Boolean Status der Mailbenachrichtigung

Example Success Response

HTTP/1.1 200 OK
{
    "notification": true
}

Example Error Response

Benutzername / Passwort ungültig:
HTTP/1.1 401 Unauthorized
{
    "error": "Authentication failed"
}
Ungültige Board ID referenziert:
HTTP/1.1 404 Not Found
{
    "error": "boardId not found"
}
Ungültige Message ID referenziert:
HTTP/1.1 404 Not Found
{
    error: "messageId not found"
}

Notification

Schaltet die Mailbenachrichtigung für die übergebene Message ID an oder aus. Die Original API des Maniac Forums bietet leider keine Möglichkeit die Mailbenachrichtigung explizit an oder auszuschalten und gibt auch keine Rückmeldung in welche Richtung der Status geändert wurde. Ist die Mailbenachrichtigung also bereits aktiv schaltet dieser Request sie aus, ist sie nicht aktiv wird sie entsprechend aktiviert.

HTTP Method: GET

mservice/board/:boardId/notification/:messageId

NEEDS AUTHENTICATION

URI Params

Parameter Beschreibung
boardId Board ID
messageId Message ID

Example Success Response

HTTP/1.1 200 OK

Example Error Response

Benutzername / Passwort ungültig:
HTTP/1.1 401 Unauthorized
{
    "error": "Authentication failed"
}
Ungültige Board ID referenziert:
HTTP/1.1 404 Not Found
{
    "error": "boardId not found"
}
Ungültige Message ID referenziert:
HTTP/1.1 404 Not Found
{
    error: "messageId not found"
}

Quote Message

Zitierter Text einer Message.

HTTP Method: GET

mservice/board/:boardId/quote/:messageId

URI Params

Parameter Beschreibung
boardId Board ID
messageId Message ID

Response Data

Feld Typ Beschreibung
quote String Zitat (Plain Text)

Example Success Response

HTTP/1.1 200 OK
{
    "quote": ">[img:https://i.imgur.com/ETtsCml.jpg]\n>\n>Link zum Vorgänger:\n>[https://www.maniac-forum.de/forum/pxmboard.php?mode=message&brdid=6&msgid=3502734]"
}

Example Error Response

Ungültige Board ID referenziert:
HTTP/1.1 404 Not Found
{
    "error": "boardId not found"
}
Ungültige Message ID referenziert:
HTTP/1.1 404 Not Found
{
    error: "messageId not found"
}

Message Preview

Erzeugt das Vorschau-HTML für ein Posting.

HTTP Method: POST

mservice/board/:boardId/message/preview

URI Params

Parameter Beschreibung
boardId Board ID

Data Params

Parameter Beschreibung
text Message Body

Response Data

Feld Typ Beschreibung
text String Message Body als Plain Text
textHtml String Message Body als HTML
textHtmlWithImages String Message Body als HTML Images in IMG-Tags

Example Success Response

HTTP/1.1 200 OK
{
    "previewText": "Ein zu previewender Text mit Bild [http://www.example.com/image.png] und fettem Wort",
    "previewTextHtml": "Ein zu previewender Text mit Bild <a href=\"http://www.example.com/image.png\" target=\"_blank\">http://www.example.com/image.png</a> und <b>fettem Wort</b>",
    "previewTextHtmlWithImages": "Ein zu previewender Text mit Bild <a href=\"http://www.example.com/image.png\"><img src=\"http://www.example.com/image.png\"></a> und <b>fettem Wort</b>"
}

Example Error Response

Ungültige Board ID referenziert:
HTTP/1.1 404 Not Found
{
    "error": "boardId not found"
}

Create Thread

Erstellt einen neuen Thread.

HTTP Method: POST

mservice/board/:boardId/message

NEEDS AUTHENTICATION

URI Params

Parameter Beschreibung
boardId Board ID

Data Params

Parameter Beschreibung
subject Thema (Betreff)
text Inhalt / Text
notification Flag für Mailbenachrichtigung (1/0)

Example Success Response

HTTP/1.1 200 OK

Example Error Response

Thema / Betreff Feld nicht gefüllt:
HTTP/1.1 400 Bad Request
{
    "error": "Subject not filled"
}
Benutzername / Passwort ungültig:
HTTP/1.1 401 Unauthorized
{
    "error": "Authentication failed"
}
Ungültige Board ID referenziert:
HTTP/1.1 404 Not Found
{
    "error": "boardId not found"
}

Create Reply

Erzeugt eine Antwort zur übergebenen Message ID.

HTTP Method: POST

mservice/board/:boardId/message/:messageId

NEEDS AUTHENTICATION

URI Params

Parameter Beschreibung
boardId Board ID
threadId Thread ID
messageId Message ID

Data Params

Parameter Beschreibung
subject Thema (Betreff)
text Inhalt / Text
notification Flag für Mailbenachrichtigung (1/0)

Example Success Response

HTTP/1.1 200 OK

Example Error Response

Benutzername / Passwort ungültig:
HTTP/1.1 401 Unauthorized
{
    "error": "Authentication failed"
}
Ungültige Board ID referenziert:
HTTP/1.1 404 Not Found
{
    "error": "boardId not found"
}
Ungültige Message ID referenziert:
HTTP/1.1 404 Not Found
{
    error: "messageId not found"
}
Zugehöriger Thread ist geschlossen:
HTTP/1.1 423 Locked
{
    "error": "Thread is closed"
}

Edit Message

Editiert die Message mit der übergebenen Message ID. Dies ist nur möglich sofern die Message von den mitgegeben Login Daten erzeugt wurde und noch keine Antwort erstellt wurde.

HTTP Method: PUT

mservice/board/:boardId/message/:messageId

NEEDS AUTHENTICATION

URI Params

Parameter Beschreibung
boardId Board ID
threadId Thread ID
messageId Message ID

Data Params

Parameter Beschreibung
subject Thema (Betreff)
text Inhalt / Text

Example Success Response

HTTP/1.1 200 OK

Example Error Response

Benutzername / Passwort ungültig:
HTTP/1.1 401 Unauthorized
{
    "error": "Authentication failed"
}
Message wurde nicht vom in den Authentifizierung-Daten enthaltenen Benutzer erstellt:
HTTP/1.1 403 Forbidden
{
    "error": "Permission denied"
}
Ungültige Board ID referenziert:
HTTP/1.1 404 Not Found
{
    "error": "boardId not found"
}
Ungültige Message ID referenziert:
HTTP/1.1 404 Not Found
{
    error: "messageId not found"
}
Message wurde unverändert abgesendet:
HTTP/1.1 406 Not Acceptable
{
    "error": "Data was not changed"
}
Message hat bereits Antworten erhalten und kann deshalb nicht mehr editiert werden:
HTTP/1.1 409 Conflict
{
    "error": "This message was already answered"
}
Zugehöriger Thread ist geschlossen:
HTTP/1.1 423 Locked
{
    "error": "Thread is closed"
}

Suche nach Postings.

HTTP Method: POST

mservice/search

Data Params

Parameter Beschreibung
phrase Suchbegriff
searchInBody Suche in Nachrichtentext: 0 oder 1 (default: 0)
username Postings von Benutzer
board BoardID (-1 für alle, default: -1)

Example Success Response

HTTP/1.1 200 OK
{
    [
        {
            "boardId": 6,
            "date": "2014-03-13T10:52:00+01:00",
            "messageId": 3197031,
            "subject": "Re:Wo bleibt das neue Ipad?",
            "threadId": 142880,
            "username": "futzi"
        },
        {
            "boardId": 6,
            "date": "2014-03-13T08:06:00+01:00",
            "messageId": 3196947,
            "subject": "Siehe Antwort unten an DS-Nadine n/t",
            "threadId": 142880,
            "username": "parademic"
        },
        {
            "boardId": 6,
            "date": "2014-03-13T08:04:00+01:00",
            "messageId": 3196943,
            "subject": "Re:Wann kann man mit einem neuen iPhone rechnen?",
            "threadId": 142880,
            "username": "parademic"
        },
        {
            "boardId": 6,
            "date": "2014-03-13T08:02:00+01:00",
            "messageId": 3196940,
            "subject": "Re:Wann kann man mit einem neuen iPhone rechnen?",
            "threadId": 142880,
            "username": "Wurzelgnom"
        },
        {
            "boardId": 6,
            "date": "2014-03-13T08:00:00+01:00",
            "messageId": 3196938,
            "subject": "was soll das bringen?",
            "threadId": 142880,
            "username": "Wurzelgnom"
        },
        ...
    ]
}

Search Threads

Schnelle Suche nach dem Thema eines Threads. Entspricht der neuen Schnellsuche im oberen Frame. Die Original API des Maniac Forums nimmt hier keine Fehlerbehandlung vor, M!Service schaltet diese aus Gründen der Performance ebenfalls nicht vor. Wird also eine ungültige Board ID referenziert wird in jedem Fall ein leeres Suchergebnis zurückgegeben.

HTTP Method: POST

mservice/board/:boardId/search-threads

URI Params

Parameter Beschreibung
boardId Board ID

Data Params

Parameter Beschreibung
phrase Suchbegriff

Example Success Response

HTTP/1.1 200 OK
{
    [
        {
            "id":152541,
            "messageId":3591301,
            "sticky":false,
            "closed":false,
            "username":"Bozbar!",
            "mod":false,
            "subject":"Der Apple Thread Nr. 45 - Welcome to Yosemite Park!",
            "date":"2014-10-17T12:35:00+02:00",
            "answerCount":266,
            "answerDate":"2014-10-28T15:55:00+01:00"
        },
        {
            "id":151906,
            "messageId":3567281,
            "sticky":false,
            "closed":false,
            "username":"Stitch",
            "mod":false,
            "subject":"Der Apple Thread Nr 44 - Bigger than Bigger",
            "date":"2014-09-09T21:08:00+02:00",
            "answerCount":1004,
            "answerDate":"2014-10-18T11:58:00+02:00"
        },
        {
            "id":150402,
            "messageId":3502734,
            "sticky":false,
            "closed":false,
            "username":"Stitch",
            "mod":false,
            "subject":"Der Apple Thread Nr 43 - WWDC 2014",
            "date":"2014-06-02T13:12:00+02:00",
            "answerCount":1039,
            "answerDate":"2014-09-10T03:10:00+02:00"
        },
        {
            "id":148175,
            "messageId":3415700,
            "sticky":false,
            "closed":false,
            "username":"Stitch",
            "mod":false,
            "subject":"Der Apple Thread Nr 42 - life, universe and everything",
            "date":"2014-01-16T19:19:00+01:00",
            "answerCount":971,
            "answerDate":"2014-06-03T10:23:00+02:00"
        },
        {
            "id":146386,
            "messageId":3342618,
            "sticky":false,
            "closed":false,
            "username":"Stitch",
            "mod":false,
            "subject":"Der Apple Thread Nummer 41 - OS X 10.9 Sea Lion",
            "date":"2013-10-11T20:29:00+02:00",
            "answerCount":1001,
            "answerDate":"2014-01-17T18:12:00+01:00"
        },
        {
            "id":145964,
            "messageId":3320238,
            "sticky":false,
            "closed":false,
            "username":"Stitch",
            "mod":false,
            "subject":"Der Apple Thread Nummer 40 - Das Champagner Phone",
            "date":"2013-09-10T16:10:00+02:00",
            "answerCount":1008,
            "answerDate":"2013-10-12T16:55:00+02:00"
        },
        ...
    ]
}

User

Daten eines User-Profils.

HTTP Method: GET

mservice/user/:userId

URI Params

Parameter Beschreibung
userId Account-Nr.

Response Data

Feld Typ Beschreibung
userId Number Account-Nr.
username String Benutzername
picture String URL zum Profilbild
firstname String Vorname
lastname String Nachname
domicile String Wohnort
registrationDate Date Mitglied seit
email String E-Mail
icq String ICQ
homepage String Homepage
firstGame String Erstes Spiel
allTimeClassics String All-Time-Classics
favoriteGenres String Lieblingsgenres
currentSystems String Aktuelle Systeme
hobbies String Hobbys
xboxLiveGamertag String Xbox Live Gamertag
psnId String PS Network ID
nintendoFriendcode String Nintendo Friendcode
lastUpdate Date Letztes Update

Example Success Response

HTTP/1.1 200 OK
{
    "userId": 2615,
    "username": "Stitch",
    "picture": "http://maniac-forum.de/forum/images/profile/2600/2615.jpg",
    "firstname": "-",
    "lastname": "-",
    "domicile": "Gießen",
    "accountNo": "2615",
    "registrationDate": "",
    "email": "",
    "icq": "48592251",
    "homepage": "",
    "firstGame": "Summer Games",
    "allTimeClassics": "Turrican, Super Mario World, Zelda3, ShenMue I+II, Garou MOTW, GTA4",
    "favoriteGenres": "Jump 'n' Runs, Racer, Shen Mue artiges",
    "currentSystems": "Current:PS3, Xbox360, WindoofPast:Wii, NES, PS2, Gamecube, Dreamcast, GBA, NeoGeoPocket, PSX, SNES, MegaDrive, MasterSystem, GameBoy, C64",
    "hobbies": "",
    "xboxLiveGamertag": "",
    "psnId": "seeteufelfilet",
    "nintendoFriendcode": "",
    "lastUpdate": "2014-07-23T22:48:00+02:00"
}

Example Error Response

Ungültige Account-Nr. referenziert:
HTTP/1.1 404 Not Found
{
    "error": "userId not found"
}

Latest User

Das neuste Mitglied des Forums.

HTTP Method: GET

mservice/latest-user

Response Data

Feld Typ Beschreibung
userId Number Account-Nr.
username String Benutzername

Example Success Response

HTTP/1.1 200 OK
{
    "userId": 52917,
    "username": "Marty"
}

Responses

Liste aller Antworten, die ein Benutzer auf seine Beiträge erhalten hat. Die Liste wird aus dem Cache berechnet und erfolgt ohne Zugriff auf das Maniac Forum.

HTTP Method: GET

mservice/user/:username/responses

URI Params

Parameter Beschreibung
username Benutzername

Response Data

Feld Typ Beschreibung
response Object Antwort
response.boardId Number Board-Id [1]
response.threadId Number Thread-Id
response.messageId Number Antwort Message-Id
response.subject String Betreff der Antwort
response.username String Antwortender
response.date Date Datum der Antwort

Hinweise:
[1]: Falls das entsprechende Board nicht mehr im Cache ist und dadurch nicht mehr ermittelt werden kann, ist dieser Wert -1.

Example Success Response

HTTP/1.1 200 OK
{
  "boardId": 1,
  "threadId": 164473,
  "messageId": 4072381,
  "subject": "Re:Süß",
  "username": "bubbabenali",
  "date": "2017-02-12T10:17:00+01:00"
},
{
  "boardId": 1,
  "threadId": 164473,
  "messageId": 4072501,
  "subject": "Re:Süß",
  "username": "Signor Rossi",
  "date": "2017-02-12T16:24:00+01:00"
},
{
  "boardId": 1,
  "threadId": 164473,
  "messageId": 4068621,
  "subject": "Re:Ich hab schon eine ... aus Papier",
  "username": "PaulBearer",
  "date": "2017-02-05T10:45:00+01:00"
},
{
  "boardId": 1,
  "threadId": 164473,
  "messageId": 4068493,
  "subject": "Re:Ich hab schon eine ... aus Papier",
  "username": "JPS",
  "date": "2017-02-04T20:11:00+01:00"
},
{
  "boardId": 1,
  "threadId": 164473,
  "messageId": 4068278,
  "subject": "Re:Wo ist denn das Problem mit den Richtungstasten?",
  "username": "Deadly Engineer",
  "date": "2017-02-04T09:28:00+01:00"
},
{
  "boardId": 1,
  "threadId": 162067,
  "messageId": 4055840,
  "subject": "Re:Kommt das wohl auch als Standalone?",
  "username": "Proebbel",
  "date": "2017-01-15T12:34:00+01:00"
},
{
  "boardId": 1,
  "threadId": 162067,
  "messageId": 4050642,
  "subject": "Re:Season 4 / Event 3: Finnland - Ergebnisse",
  "username": "McDee",
  "date": "2017-01-08T17:32:00+01:00"
},
{
  "boardId": 1,
  "threadId": 162067,
  "messageId": 4050669,
  "subject": "Re:Season 4 / Event 3: Finnland - Ergebnisse",
  "username": "KikjaR",
  "date": "2017-01-08T18:08:00+01:00"
},
{
  "boardId": 1,
  "threadId": 162067,
  "messageId": 4046916,
  "subject": "Ja, auf jeden Fall!",
  "username": "musashi",
  "date": "2017-01-01T16:03:00+01:00"
}

Who's online

Übersicht über die aktuell eingeloggten User.

HTTP Method: GET

mservice/users/online

Example Success Response

HTTP/1.1 200 OK
{
    "count":  {
        "hidden": 24,
        "total": 26,
        "visible": 2
    },
    "users": {
        "userId": 2615,
        "username": "Stitch"
    },
    {
        "userId": 29472,
        "username": "K!M"
    }
}

Favorites

Liste der Favoriten.

HTTP Method: GET

mservice/favorites

NEEDS AUTHENTICATION

Example Success Response

HTTP/1.1 200 OK
[
    {
        "boardId": "6",
        "closed": false,
        "date": "2018-09-20T10:13:00+02:00",
        "id": 171650,
        "isFavorite": true,
        "isRead": true,
        "lastMessageDate": "2018-11-16T16:45:00+01:00",
        "lastMessageId": 4410032,
        "lastMessageIsRead": true,
        "messageId": 4378443,
        "messagesCount": 765,
        "messagesRead": 2,
        "mod": false,
        "sticky": false,
        "subject": "Apple Thread #56 - Die Max Edition",
        "username": "Steppenwolf"
    },
    {
        "boardId": "6",
        "closed": false,
        "date": "2016-12-11T08:07:00+01:00",
        "id": 163732,
        "isFavorite": true,
        "isRead": true,
        "lastMessageDate": "2018-11-15T07:42:00+01:00",
        "lastMessageId": 4409112,
        "lastMessageIsRead": true,
        "messageId": 4034674,
        "messagesCount": 576,
        "messagesRead": 2,
        "mod": false,
        "sticky": false,
        "subject": "Die M!client App für iOS - Eine Bitte",
        "username": "Steppenwolf"
    }
]

Add to Favorites

Fügt Thread den Favoriten hinzu.

HTTP Method: post

mservice/favorites/:threadId

NEEDS AUTHENTICATION

Example Success Response

HTTP/1.1 200 OK

Delete from Favorites

Entfernt Thread aus den Favoriten.

HTTP Method: delete

mservice/favorites/:threadId

NEEDS AUTHENTICATION

Example Success Response

HTTP/1.1 200 OK

Lizenz

M!service ist freie Software und steht unter der MIT-Lizenz.