Create a community of like minded authors to foster inspiration and innovation by leveraging the modern web.
- Clone this repository
- Create and activate your virtual environment
- Install the project requirements:
pip install -r requirements.txt
from the project directory
The API can be accessed at the /api/{version}
endpoint and is versioned as implied by the endpoint. The current version in development is v1
.
The API version in development
, mirroring the develop
branch is currently hosted at here.
The live API docs are hosted here.
The preferred JSON object to be returned by the API should be structured as follows:
{
"user": {
"email": "[email protected]",
"token": "jwt.token.here",
"username": "jake",
"first_name": "Jake",
"last_name": "Doe",
"bio": "I work at statefarm",
"image": null
}
}
{
"profile": {
"username": "jake",
"first_name": "Jake",
"last_name": "Doe",
"bio": "I work at statefarm",
"image": "image-link",
"following": false
}
}
{
"article": {
"slug": "how-to-train-your-dragon",
"title": "How to train your dragon",
"description": "Ever wonder how?",
"body": "It takes a Jacobian",
"tagList": ["dragons", "training"],
"created_at": "2016-02-18T03:22:56.637Z",
"updated_at": "2016-02-18T03:48:35.824Z",
"favorited": false,
"favorites_count": 0,
"author": {
"username": "jake",
"bio": "I work at statefarm",
"image": "https://i.stack.imgur.com/xHWG8.jpg",
"following": false
}
}
}
{
"articles":[{
"slug": "how-to-train-your-dragon",
"title": "How to train your dragon",
"description": "Ever wonder how?",
"body": "It takes a Jacobian",
"tag_list": ["dragons", "training"],
"created_at": "2016-02-18T03:22:56.637Z",
"updated_at": "2016-02-18T03:48:35.824Z",
"favorited": false,
"favorites_count": 0,
"author": {
"username": "jake",
"bio": "I work at statefarm",
"image": "https://i.stack.imgur.com/xHWG8.jpg",
"following": false
}
}, {
"slug": "how-to-train-your-dragon-2",
"title": "How to train your dragon 2",
"description": "So toothless",
"body": "It a dragon",
"tag_list": ["dragons", "training"],
"created_at": "2016-02-18T03:22:56.637Z",
"updated_at": "2016-02-18T03:48:35.824Z",
"favorited": false,
"favorites_count": 0,
"author": {
"username": "jake",
"bio": "I work at statefarm",
"image": "https://i.stack.imgur.com/xHWG8.jpg",
"following": false
}
}],
"articles_count": 2
}
{
"comment": {
"id": 1,
"created_at": "2016-02-18T03:22:56.637Z",
"updated_at": "2016-02-18T03:22:56.637Z",
"body": "It takes a Jacobian",
"author": {
"username": "jake",
"bio": "I work at statefarm",
"image": "https://i.stack.imgur.com/xHWG8.jpg",
"following": false
},
"commenting_on": "lorem ipsum"
}
}
{
"comments": [{
"id": 1,
"created_at": "2016-02-18T03:22:56.637Z",
"updated_at": "2016-02-18T03:22:56.637Z",
"body": "It takes a Jacobian",
"author": {
"username": "jake",
"bio": "I work at statefarm",
"image": "https://i.stack.imgur.com/xHWG8.jpg",
"following": false
},
"commenting_on": "lorem ipsum"
}],
"comments_count": 1
}
{
"tags": [
"reactjs",
"angularjs"
]
}
{
"allow_in_app_notifications": true,
"allow_email_notifications": false,
}
If a request fails any validations, expect errors in the following format:
{
"errors":{
"field_with_error": [
"can't be empty"
]
}
}
401 for Unauthorized requests, when a request requires authentication but it isn't provided
403 for Forbidden requests, when a request may be valid but the user does't have permissions to perform the action
404 for Not found requests, when a resource can't be found to fulfill the request
Prefix /api/{version}
is implied.
POST /users/login
Example request body:
{
"user":{
"email": "[email protected]",
"password": "jakejake"
}
}
No authentication required, returns a User
Required fields: email
, password
POST /users
Example request body:
{
"user":{
"username": "Jacob",
"email": "[email protected]",
"password": "jakejake"
}
}
No authentication required, returns a User
Required fields: email
, username
, password
GET /user
Authentication required, returns a User that's the current user
PATCH /user
Example request body:
{
"user":{
"email": "[email protected]",
"username": "jake",
"password": "jakejake"
}
}
Authentication required, returns the User
Accepted fields: email
, username
, password
GET /profiles/:username
Authentication optional, returns a Profile
PUT /profile
{
"profile": {
"username": "jake",
"first_name": "Jake",
"last_name": "Doe",
"bio": "I work at statefarm",
"image": "image-link",
"date_of_birth": "12/09/1998"
}
}
Accepted fields: username
, first_name
, last_name
, bio
, image
Authentication required, returns the updated Profile
POST /profiles/:username/follow
Authentication required, returns a Profile
No additional parameters required
DELETE /profiles/:username/follow
Authentication required, returns a Profile
No additional parameters required
GET /articles
Returns most recent articles globally by default, provide tag
, author
or favorited
query parameter to filter results
Query Parameters:
Filter by tag:
?tag=AngularJS
Filter by author:
?author=jake
Favorited by user:
?favorited=jake
Limit number of articles (default is 20):
?limit=20
Offset/skip number of articles (default is 0):
?offset=0
Authentication optional, will return multiple articles, ordered by most recent first
GET /articles/feed
Can also take limit
and offset
query parameters like List Articles
Authentication required, will return multiple articles created by followed users, ordered by most recent first.
GET /articles/:slug
No authentication required, will return single article
POST /articles
Example request body:
{
"article": {
"title": "How to train your dragon",
"description": "Ever wonder how?",
"body": "You have to believe",
"tag_list": ["reactjs", "angularjs", "dragons"]
}
}
Authentication required, will return an Article
Required fields: title
, description
, body
Optional fields: tag_list
as an array of Strings
PUT /articles/:slug
Example request body:
{
"article": {
"title": "Did you train your dragon?"
}
}
Authentication required, returns the updated Article
Optional fields: title
, description
, body
The slug
also gets updated when the title
is changed
DELETE /articles/:slug
Authentication required
POST /articles/:slug/comments
Example request body:
{
"comment": {
"body": "His name was my name too.",
"commenting_on": "lorem ipsum"
}
}
Authentication required, returns the created Comment
Required field: body
GET /articles/:slug/comments
Authentication optional, returns multiple comments
DELETE /articles/:slug/comments/:id
Authentication required
POST /articles/:slug/favorite
Authentication required, returns the Article No additional parameters required
DELETE /articles/:slug/favorite
Authentication required, returns the Article
No additional parameters required
POST /articles/:slug/like
Authentication required
DELETE /articles/:slug/like
Authentication required
POST /articles/:slug/dislike
Authentication required
DELETE /articles/:slug/dislike
GET /articles/:slug/is-liked
Authentication required
Returns the like status
{
"is_liked": true
}
GET /articles/:slug/is-disliked
Authentication required
Returns the dislike status
{
"is_disliked": true
}
GET /tags
No additional parameters required
GET /notifications
POST /notifications/read
Authentication required
GET /notifications/settings
Authentication required
PATCH /notifications/settings
Authentication required
Allows fields displayed in the notification settings json
, both optional