316 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			316 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
 | |
| # How to BBJ?
 | |
| 
 | |
| ## Input
 | |
| 
 | |
| BBJ is interacted with entirely through POST requests, whose bodies are
 | |
| json objects.
 | |
| 
 | |
| The endpoints, all listed below, can be contacted at the path /api/ relative
 | |
| to the root of where BBJ is hosted. If bbj is hosted on a server on port 80
 | |
| at the root:
 | |
| 
 | |
| `http://server.com/api/endpoint_here`
 | |
| 
 | |
| The body of your request contains all of it's argument fields, instead of
 | |
| using URL parameters. As a demonstration, lets call `thread_create`.
 | |
| It requires two arguments: `title`, and `body`. We put those argument
 | |
| names at the root of the json object, and their values are the info
 | |
| passed into the API for that spot. Your input will look like this:
 | |
| 
 | |
| ```json
 | |
| {
 | |
|     "title": "Hello world!!",
 | |
|     "body": "Hi! I am exploring this cool board thing!!"
 | |
| }
 | |
| ```
 | |
| 
 | |
| And you will POST this body to `http://server.com:PORT/api/thread_create`.
 | |
| 
 | |
| A few endpoints do not require any arguments. These can still be POSTed to,
 | |
| but the body may be completely empty or an empty json object. You can even
 | |
| GET these if you so choose.
 | |
| 
 | |
| For all endpoints, argument keys that are not consumed by the endpoint are
 | |
| ignored. Posting an object with a key/value pair of `"sandwich": True` will
 | |
| not clog up any pipes :) In the same vein, endpoints who dont take arguments
 | |
| don't care if you supply them anyway.
 | |
| 
 | |
| ## Output
 | |
| 
 | |
| BBJ returns data in a consistently formatted json object. The base object
 | |
| has three keys: `data`, `usermap`, and `error`. Visualizied:
 | |
| 
 | |
| ```javascript
 | |
| {
 | |
|   "error":   false, // boolean false or error object
 | |
|   "data":    null,  // null or the requested data from endpoint.
 | |
|   "usermap": {}     // a potentially empty object mapping user_ids to their objects
 | |
| }
 | |
| 
 | |
| // If "error" is true, it looks like this:
 | |
| 
 | |
| {
 | |
|   "error": {
 | |
|       "code": // an integer from 0 to 5,
 | |
|       "description": // a string describing the error in detail.
 | |
|   }
 | |
|   "data": null   // ALWAYS null if error is not false
 | |
|   "usermap": {}  // ALWAYS empty if error is not false
 | |
| }
 | |
| ```
 | |
| 
 | |
| ### data
 | |
| 
 | |
| `data` is what the endpoint actually returns. The type of contents vary
 | |
| by endpoint and are documented below. If an endpoint says it returns a
 | |
| boolean, it will look like `"data": True`. If it says it returns an array,
 | |
| it will look like `"data": ["stuff", "goes", "here"]`
 | |
| 
 | |
| ### usermap
 | |
| 
 | |
| The usermap is a json object mapping user_ids within `data` to full user
 | |
| objects. BBJ handles users entirely by an ID system, meaning any references
 | |
| to them inside of response data will not include vital information like their
 | |
| username, or their profile information. Instead, we fetch those values from
 | |
| this usermap object. All of it's root keys are user_id's and their values
 | |
| are user objects. It should be noted that the anonymous user has it's own
 | |
| ID and profile object as well.
 | |
| 
 | |
| ### error
 | |
| 
 | |
| `error` is typically `null`. If it is __not__ null, then the request failed
 | |
| and the json object that `error` contains should be inspected. (see the above
 | |
| visualation) Errors follow a strict code system, making it easy for your client
 | |
| to map these responses to native exception types or signals in your language of
 | |
| choice. See [the full error page](errors.md) for details.
 | |
| 
 | |
| 
 | |
| # Authorization
 | |
| 
 | |
| ## check_auth
 | |
| 
 | |
| Takes the arguments `target_user` and `target_hash`, and
 | |
| returns boolean true or false whether the hash is valid.
 | |
| 
 | |
| 
 | |
| 
 | |
| --------
 | |
| 
 | |
| # Threads & Messages
 | |
| 
 | |
| ## delete_post
 | |
| 
 | |
| Requires the arguments `thread_id` and `post_id`.
 | |
| 
 | |
| Delete a message from a thread. The same rules apply
 | |
| here as `edit_post` and `edit_query`: the logged in user
 | |
| must either be the one who posted the message within 24hrs,
 | |
| or have admin rights. The same error descriptions and code
 | |
| are returned on falilure. Boolean true is returned on
 | |
| success.
 | |
| 
 | |
| If the post_id is 0, the whole thread is deleted.
 | |
| 
 | |
| ## edit_post
 | |
| 
 | |
| Replace a post with a new body. Requires the arguments
 | |
| `thread_id`, `post_id`, and `body`. This method verifies
 | |
| that the user can edit a post before commiting the change,
 | |
| otherwise an error object is returned whose description
 | |
| should be shown to the user.
 | |
| 
 | |
| To perform sanity checks and retrieve the unformatted body
 | |
| of a post without actually attempting to replace it, use
 | |
| `edit_query` first.
 | |
| 
 | |
| Optionally you may also include the argument `send_raw` to
 | |
| set the message's formatting flag. However, if this is the
 | |
| only change you would like to make, you should use the
 | |
| endpoint `set_post_raw` instead.
 | |
| 
 | |
| Returns the new message object.
 | |
| 
 | |
| ## edit_query
 | |
| 
 | |
| Queries the database to ensure the user can edit a given
 | |
| message. Requires the arguments `thread_id` and `post_id`
 | |
| (does not require a new body)
 | |
| 
 | |
| Returns the original message object without any formatting
 | |
| on success. Returns a descriptive code 4 otherwise.
 | |
| 
 | |
| ## message_feed
 | |
| 
 | |
| Returns a special object representing all activity on the board since
 | |
| the argument `time`, a unix/epoch timestamp.
 | |
| 
 | |
| {
 | |
|     "threads": {
 | |
|         "thread_id": {
 | |
|             ...thread object
 | |
|         },
 | |
|         ...more thread_id/object pairs
 | |
|     },
 | |
|     "messages": [...standard message object array sorted by date]
 | |
| }
 | |
| 
 | |
| The message objects in "messages" are the same objects returned
 | |
| in threads normally. They each have a thread_id parameter, and
 | |
| you can access metadata for these threads by the "threads" object
 | |
| which is also provided.
 | |
| 
 | |
| The "messages" array is already sorted by submission time, newest
 | |
| first. The order in the threads object is undefined and you should
 | |
| instead use their `last_mod` attribute if you intend to list them
 | |
| out visually.
 | |
| 
 | |
| You may optionally provide a `format` argument: this is treated
 | |
| the same way as the `thread_load` endpoint and you should refer
 | |
| to its documentation for more info.
 | |
| 
 | |
| ## set_post_raw
 | |
| 
 | |
| Requires the boolean argument of `value`, string argument
 | |
| `thread_id`, and integer argument `post_id`. `value`, when false,
 | |
| means that the message will be passed through message formatters
 | |
| before being sent to clients. When `value` is true, this means
 | |
| it will never go through formatters, all of its whitespace is
 | |
| sent to clients verbatim and expressions are not processed.
 | |
| 
 | |
| The same rules for editing messages (see `edit_query`) apply here
 | |
| and the same error objects are returned for violations.
 | |
| 
 | |
| You may optionally set this value as well when using `edit_post`,
 | |
| but if this is the only change you want to make to the message,
 | |
| using this endpoint instead is preferable.
 | |
| 
 | |
| ## set_thread_pin
 | |
| 
 | |
| Requires the arguments `thread_id` and `value`. `value`
 | |
| must be a boolean of what the pinned status should be.
 | |
| This method requires that the caller is logged in and
 | |
| has admin status on their account.
 | |
| 
 | |
| Returns the same boolean you supply as `value`
 | |
| 
 | |
| ## thread_create
 | |
| 
 | |
| Creates a new thread and returns it. Requires the non-empty
 | |
| string arguments `body` and `title`.
 | |
| 
 | |
| If the argument `send_raw` is specified and has a non-nil
 | |
| value, the OP message will never recieve special formatting.
 | |
| 
 | |
| ## thread_index
 | |
| 
 | |
| Return an array with all the threads, ordered by most recent activity.
 | |
| Requires no arguments.
 | |
| 
 | |
| Optionally, you may supply the argument `include_op`, which, when
 | |
| non-nil, will include a "messages" key with the object, whose sole
 | |
| content is the original message (post_id 0).
 | |
| 
 | |
| ## thread_load
 | |
| 
 | |
| Returns the thread object with all of its messages loaded.
 | |
| Requires the argument `thread_id`. `format` may also be
 | |
| specified as a formatter to run the messages through.
 | |
| Currently only "sequential" is supported.
 | |
| 
 | |
| You may also supply the parameter `op_only`. When it's value
 | |
| is non-nil, the messages array will only include post_id 0 (the first)
 | |
| 
 | |
| ## thread_reply
 | |
| 
 | |
| Creates a new reply for the given thread and returns it.
 | |
| Requires the string arguments `thread_id` and `body`
 | |
| 
 | |
| If the argument `send_raw` is specified and has a non-nil
 | |
| value, the message will never recieve special formatting.
 | |
| 
 | |
| 
 | |
| 
 | |
| --------
 | |
| 
 | |
| # Tools
 | |
| 
 | |
| ## db_validate
 | |
| 
 | |
| Requires the arguments `key` and `value`. Returns an object
 | |
| with information about the database sanity criteria for
 | |
| key. This can be used to validate user input in the client
 | |
| before trying to send it to the server.
 | |
| 
 | |
| If the argument `error` is supplied with a non-nil value,
 | |
| the server will return a standard error object on failure
 | |
| instead of the special object described below.
 | |
| 
 | |
| The returned object has two keys:
 | |
| 
 | |
| {
 | |
|   "bool": true/false,
 | |
|   "description": null/"why this value is bad"
 | |
| }
 | |
| 
 | |
| If bool == false, description is a string describing the
 | |
| problem. If bool == true, description is null and the
 | |
| provided value is safe to use.
 | |
| 
 | |
| ## format_message
 | |
| 
 | |
| Requires the arguments `body` and `format`. Applies
 | |
| `format` to `body` and returns the new object. See
 | |
| `thread_load` for supported specifications for `format`.
 | |
| 
 | |
| ## user_map
 | |
| 
 | |
| Returns an array with all registered user_ids, with the usermap
 | |
| object populated by their full objects.
 | |
| 
 | |
| 
 | |
| 
 | |
| --------
 | |
| 
 | |
| # Users
 | |
| 
 | |
| ## get_me
 | |
| 
 | |
| Requires no arguments. Returns your internal user object,
 | |
| including your authorization hash.
 | |
| 
 | |
| ## is_admin
 | |
| 
 | |
| Requires the argument `target_user`. Returns a boolean
 | |
| of whether that user is an admin.
 | |
| 
 | |
| ## user_get
 | |
| 
 | |
| Retreive an external user object for the given `user`.
 | |
| Can be a user_id or user_name.
 | |
| 
 | |
| ## user_is_registered
 | |
| 
 | |
| Takes the argument `target_user` and returns true or false
 | |
| whether they are in the system or not.
 | |
| 
 | |
| ## user_register
 | |
| 
 | |
| Register a new user into the system and return the new object.
 | |
| Requires the string arguments `user_name` and `auth_hash`.
 | |
| Do not send User/Auth headers with this method.
 | |
| 
 | |
| ## user_update
 | |
| 
 | |
| Receives new parameters and assigns them to the user_object
 | |
| in the database. The following new parameters can be supplied:
 | |
| `user_name`, `auth_hash`, `quip`, `bio`, and `color`. Any number
 | |
| of them may be supplied.
 | |
| 
 | |
| The newly updated user object is returned on success.
 | |
| 
 | |
| 
 | |
| 
 | |
| --------
 | |
| 
 |