Example 1 - Simple “Posts” application

Schema

This is a simple representative schema for a PostgreSQL datasource, which has 4 objects (tables) - links, posts, topics, users - with relationships between these objects.

  • This schema is in the Neurelo Schema Language JSON specification

JSON Schema
{
  "objects": {
    "links": {
      "properties": {
        "id": {
          "type": "integer",
          "default": {
            "function": "autoincrement"
          },
          "identifier": true
        },
        "link": {
          "type": "string",
          "sourceType": [
            "VarChar",
            500
          ],
          "nullable": true
        },
        "title": {
          "type": "string",
          "sourceType": [
            "VarChar",
            500
          ],
          "nullable": true
        },
        "topic_id": {
          "type": "integer",
          "nullable": true
        },
        "topics": {
          "nullable": true,
          "$ref": "#/objects/topics",
          "relation": {
            "attrKey": [
              "topic_id"
            ],
            "foreignAttrKey": [
              "id"
            ],
            "onUpdate": "NoAction",
            "onDelete": "NoAction"
          }
        }
      }
    },
    "posts": {
      "properties": {
        "content": {
          "type": "string",
          "nullable": true
        },
        "id": {
          "type": "integer",
          "default": {
            "function": "autoincrement"
          },
          "identifier": true
        },
        "title": {
          "type": "string",
          "sourceType": [
            "VarChar",
            200
          ],
          "nullable": true
        },
        "user_id": {
          "type": "integer",
          "nullable": true
        },
        "users": {
          "nullable": true,
          "$ref": "#/objects/users",
          "relation": {
            "attrKey": [
              "user_id"
            ],
            "foreignAttrKey": [
              "id"
            ],
            "onUpdate": "NoAction",
            "onDelete": "NoAction"
          }
        }
      }
    },
    "topics": {
      "properties": {
        "description": {
          "type": "string",
          "nullable": true
        },
        "id": {
          "type": "integer",
          "default": {
            "function": "autoincrement"
          },
          "identifier": true
        },
        "links": {
          "type": "array",
          "items": {
            "$ref": "#/objects/links"
          }
        },
        "title": {
          "type": "string",
          "sourceType": [
            "VarChar",
            200
          ],
          "nullable": true
        }
      }
    },
    "users": {
      "properties": {
        "email": {
          "type": "string",
          "sourceType": [
            "VarChar",
            200
          ],
          "nullable": true
        },
        "first_name": {
          "type": "string",
          "sourceType": [
            "VarChar",
            100
          ],
          "nullable": true
        },
        "id": {
          "type": "integer",
          "default": {
            "function": "autoincrement"
          },
          "identifier": true
        },
        "last_name": {
          "type": "string",
          "sourceType": [
            "VarChar",
            100
          ],
          "nullable": true
        },
        "password": {
          "type": "string",
          "sourceType": [
            "VarChar",
            500
          ],
          "nullable": true
        },
        "posts": {
          "type": "array",
          "items": {
            "$ref": "#/objects/posts"
          }
        }
      }
    }
  }
}

GET endpoint examples

  • Retrieve all posts

    GET https://$ENV_API_URL/rest/posts
  • Retrieve a specific post by id

    GET https://$ENV_API_URL/rest/posts/3

    or

    GET https://$ENV_API_URL/rest/posts?filter={"id":3}
  • Retrieve a specific user

    GET https://$ENV_API_URL/rest/users?filter={"first_name":"Jane", "last_name":"Doe"}
  • Retrieve the first 5 posts

    GET https://$ENV_API_URL/rest/posts?take=5
  • Retrieve all users and their posts

    GET https://$ENV_API_URL/rest/users?select={"$scalars": true, "posts": true}
  • Retrieve user with id 3 and all their posts

    GET https://$ENV_API_URL/rest/users/3?select={"$scalars": true, "posts": true}
  • Retrieve specific user and all their posts

    GET https://$ENV_API_URL/rest/users?select={"$scalars": true, "posts": true}&filter={"first_name":"Jane", "last_name":"Doe"}

POST endpoint examples

  • Create a new post

    POST https://$ENV_API_URL/rest/posts
    
    {
            "content": "This is my first blog post",
            "title": "My first blog post"
    }
  • Create a new post, a new user, and link them to each other

    POST https://$ENV_API_URL/rest/posts
    
    {
      "content": "New POST",
      "title": "The new post",
      "users": {
        "create": {
          "email": "new-user@example.com",
          "first_name": "new",
          "last_name": "user",
          "password": "password"
        }
      }
    }
  • Create a new user, 3 posts, link the posts to the user AND return the user scalars + related data (the 3 posts we just created)

    POST https://$ENV_API_URL/rest/users?select={"$scalars": true, "$related": true}
    
    {
      "email": "multi-post@example.com",
      "first_name": "multi",
      "last_name": "post",
      "password": "manymanyposts",
      "posts": {
        "createMany": {
          "data": [
            {
                "content": "this is the first one",
                "title": "first one"
            },
            {
                "content": "this is the second one",
                "title": "second one"
            },
            {
                "content": "this is the third one",
                "title": "third one"
            }
          ]
        }
      }
    }

PATCH endpoint examples

  • Update a post

    PATCH https://$ENV_API_URL/rest/posts/7
    
    {
            "content": "This is my seventh blog post",
            "title": "My seventh blog post"
    }
  • Update a post and its linked user

    PATCH https://$ENV_API_URL/rest/posts/1
    
    {
      "content": "Newest post",
      "title": "The new post (revised)",
      "users": {
        "update": {
          "first_name": "updated",
          "last_name": "name"
        }
      }
    }

DELETE endpoint examples

  • Delete a post

    DELETE https://$ENV_API_URL/rest/posts/4

Last updated