diff --git a/docs/api.xml b/docs/api.xml new file mode 100644 index 000000000..df6731f4b --- /dev/null +++ b/docs/api.xml @@ -0,0 +1,241 @@ + + + + + + + + + + + Submits a post. + + + + + + The posts title. :emojis: will be parsed as well. Plaintext. No markdown. + + + + + Post URL. Be wary of duplicates. + + + + + The post in markdown. + + + + + + + + The post you were looking for. + + + + + + + { + "our": "example, here", + "our": "example, here" + } + + + + + + + Not found + + + + + + + + + + + + Sends a user a message + + + + + + User URL + + + + + Message data to the user. + + + + + + + + + + + + + + + + + + { + } + + + + + + + + + + + + + + + + + + Creates a comment on a post, or replies to a comment + + + + + + ID of the parent post. Starts with p_ for a parent submission, and c_ for a comment submission. Anything else will emit a 400. + + + + + Parent submission (the id, right?) + + + + + Your messages content + + + + + Parent submission (the id, right?) + + + + + If this post is marked as sensitive. + + + + + + + + + + + + + + + + { + } + + + + + + + + + + + + User is exiled from the hole, or needs extra permissions. + User is banned and needs to do better. + + + + + + + + + + + + diff --git a/files/assets/css/main.css b/files/assets/css/main.css index d9ccf085d..6786dd3f8 100644 --- a/files/assets/css/main.css +++ b/files/assets/css/main.css @@ -6406,3 +6406,43 @@ div.markdown { .modlog-action:not(:first-of-type) { border-top: 1px solid var(--gray-400) !important; } + +/* Documentation elements */ +#docs-page .docs-path { + font-size: 1.7rem; +} + +#docs-page .docs-request { + background-color: var(--primary); + padding: 3px 8px; + border-radius: 4px; +} + +#docs-page .docs-response { + background-color: var(--secondary); + padding: 3px 8px; + border-radius: 4px; +} + +#docs-page .doc-snippet { + padding: 4px; +} + +#docs-page .doc-snippet table { + border: 1px solid var(--secondary); +} + +#docs-page .doc-snippet table p { + margin: 0; +} + +#docs-page .doc-snippet table tr th { + color: #aaa; + border-bottom: 1px solid var(--secondary); +} + +#docs-page .doc-snippet table tr td, +#docs-page .doc-snippet table tr th { + padding: 4px 8px; + border-right: 1px solid var(--secondary); +} diff --git a/files/routes/__init__.py b/files/routes/__init__.py index 5649270be..32c0313b1 100644 --- a/files/routes/__init__.py +++ b/files/routes/__init__.py @@ -20,6 +20,7 @@ from files.routes.jinja2 import * from .admin import * from .comments import * from .errors import * +from .docs import * from .reporting import * from .front import * from .login import * diff --git a/files/routes/comments.py b/files/routes/comments.py index 334455f16..108fed507 100644 --- a/files/routes/comments.py +++ b/files/routes/comments.py @@ -79,6 +79,7 @@ def post_pid_comment_cid(cid, pid=None, anything=None, v=None, sub=None): else: template = "submission.html" return render_template(template, v=v, p=post, sort=sort, comment_info=comment_info, render_replies=True, sub=post.subr) +#- API @app.post("/comment") @limiter.limit("1/second;20/minute;200/hour;1000/day") @auth_required @@ -91,7 +92,7 @@ def comment(v): id = parent_fullname[2:] parent_comment_id = None rts = False - + if parent_fullname.startswith("p_"): parent = get_post(id, v=v) parent_post = parent diff --git a/files/routes/docs.py b/files/routes/docs.py new file mode 100644 index 000000000..e8d3e7971 --- /dev/null +++ b/files/routes/docs.py @@ -0,0 +1,13 @@ +import xml +import xml.etree.ElementTree as ET +from files.__main__ import app, cache, limiter + +tree = ET.parse('docs/api.xml') + +@app.get("/dev/api") +@auth_desired +def get_docs_page(): + # TODO cache + root = tree.getroot() + + return render_template("docs.html", root=tree.getroot()) diff --git a/files/templates/docs.html b/files/templates/docs.html new file mode 100644 index 000000000..272859049 --- /dev/null +++ b/files/templates/docs.html @@ -0,0 +1,81 @@ +{% extends "default.html" %} + +{#% Some macros %#} +{% macro docbook_read(info) -%} + {% for p in info -%} + {#% Lazy hack, not """conforming""" to docbook %#} +

+ {{- p.text -}} +

+ {%- endfor %} +{%- endmacro %} + +{%- macro param_table(info) -%} + + + + + + + + + {% for param in info %} + + + + + + + + + {% endfor %} +
ParamDescriptionTypeFormatRequired
{{ param.attrib.name }}{{- docbook_read(param[0]) -}}{{ param.attrib.type }}{{ param.attrib.style }}{{ param.attrib.required }}
+{%- endmacro -%} + +{% block pagetitle %}Documentation{% endblock %} +{% block content %} +
+

rDrama REST Api Documentaion

+ +

Warning: This documentation is SHIT, so get + used to it

+ +

You're probably here because you want to create your own application + which calls our REST api. Some of the stuff you see here might seem + ugly (it is), but it's mainly inherited from the old Ruqqus API.

+ +

This documentation is generated from an XML WADL file.

+ +
+ + {% for res in root[0] %} +
+ {#% There's usually only one method, but this is more correct %#} + {% for method in res %} +

+ + {{- method.attrib.name -}} + + {{ res.attrib.path }} +

+ {% for info in method %} + {% if info.tag == "{http://wadl.dev.java.net/2009/02}doc" %} + {{ docbook_read(info) }} + {% elif info.tag == "{http://wadl.dev.java.net/2009/02}request" %} + {{ param_table(info) }} + {% elif info.tag == "{http://wadl.dev.java.net/2009/02}response" %} +

Response {{ info.attrib.status }}

+ {% for response_child in info %} + {% if response_child.tag == "{http://wadl.dev.java.net/2009/02}param" %} + {{ param_table(info) }} + {% elif response_child.tag == "{http://wadl.dev.java.net/2009/02}doc" %} + {{ docbook_read(response_child) }} + {% endif %} + {% endfor %} + {% endif %} + {% endfor %} + {% endfor %} +
+ {% endfor %} +
+{% endblock %}