1.0.2 • Published 1 year ago

endframe-functions v1.0.2

Weekly downloads
-
License
MIT
Repository
github
Last release
1 year ago

EndFrame

Creating a rest API with for create CloudFunctions and CronJobs never was easy.

Thanks to EndFrame you can create a REST API to manage Mail

How to use

Import endframe-functions basic project

const endFrame = require("endframe-functions");

Set up the library

let mongoDBURI = 'mongodb://localhost/files'  // the mongo db uri where file data and properties will be  saved
let port = 3010 // port to run your app 
let options = {
    api_base_uri: '/functions/',
    activeLogRequest: true,
    active_cors: true,
    collection_name: "functions",
    collection_log: "executions",
    collection_cron: "cron",
    timezone: "America/Mexico_City",
    secure: { // if use basic auth  to consume endpoints
        user: "endframe",
        password: "piedpipper"
    }
}
let cf = new endFrame(mongoDBURI, port, options)

Initialize and run the app

cf.initialize()
cf.start()

Full example code

let endFrame = require('endframe-functions')


let options = {
    api_base_uri: '/functions/',
    activeLogRequest: true,
    active_cors: true,
    collection_name: "functions",
    collection_log: "executions",
    collection_cron: "cron",
    timezone: "America/Mexico_City",
    secure: { // if use basic auth  to consume endpoints
        user: "endframe",
        password: "piedpipper"
    }
}

let functions = new endFrame('mongodb://localhost/functions', 3011, options)
functions.publishServerStats()
functions.initialize()
functions.start()

endpoints

*POST:function

This endpoint allows you to create a new cloud function

Fetch request example

var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");

var raw = JSON.stringify({
    "name": "newDatafunction",
    "func": "function ({body,query,headers}) {  return body.a + body.b }",
    "method": "POST",
    "active": true,
    "bodyParams": [
        {
            "name": "a",
            "kind": "number",
            "mandatory": true
        },
        {
            "name": "b",
            "kind": "number",
            "mandatory": true
        }
    ],
    "queryParams": [
        {
            "name": "token",
            "kind": "string",
            "mandatory": true
        }
    ],
    "headers": []
});

var requestOptions = {
    method: 'POST',
    headers: myHeaders,
    body: raw,
    redirect: 'follow'
};

fetch("http://localhost:3011/functions/function", requestOptions)
    .then(response => response.text())
    .then(result => console.log(result))
    .catch(error => console.log('error', error));

Example fetch response

{
  "success": true,
  "code": 200,
  "error": false,
  "message": "OK",
  "container_id": false,
  "data": {
    "name": "newdatafunction",
    "uri": "/functions/exec/newdatafunction?token=4f5f9bfa",
    "token": "4f5f9bfa",
    "function": "function ({body,query,headers}) {  return body.a + body.b }",
    "method": "POST",
    "active": true,
    "bodyParams": [
      {
        "name": "a",
        "kind": "number",
        "mandatory": true,
        "_id": "6430a1c0c6acec026dd07baa"
      },
      {
        "name": "b",
        "kind": "number",
        "mandatory": true,
        "_id": "6430a1c0c6acec026dd07bab"
      }
    ],
    "queryParams": [
      {
        "name": "token",
        "kind": "string",
        "mandatory": true,
        "_id": "6430a1c0c6acec026dd07bac"
      }
    ],
    "headers": [],
    "_id": "6430a1c0c6acec026dd07ba9",
    "createdAt": "2023-04-07T23:05:36.269Z",
    "updatedAt": "2023-04-07T23:05:36.269Z",
    "__v": 0
  }
}

*POST,PUT,DELETE,GET,PATCH:exec

This endpoint allows you to exec cloud function as an endpoint

Fetch request example

var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");

var raw = JSON.stringify({
    "a": 1233,
    "b": 1212
});

var requestOptions = {
    method: 'POST',
    headers: myHeaders,
    body: raw,
    redirect: 'follow'
};

fetch("http://localhost:3011/functions/exec/default?token=f7a6af7c", requestOptions)
    .then(response => response.text())
    .then(result => console.log(result))
    .catch(error => console.log('error', error));

Example fetch response

{
  "success": true,
  "code": 200,
  "error": false,
  "message": "OK",
  "container_id": false,
  "data": 2445,
  "log": {
    "name": "default",
    "method": "POST",
    "execID": "3a6deae4",
    "function": "\nlet moment = require('moment');\nlet axios = require('axios'); \n module.exports= async function ({body,query,headers}) {  return body.a + body.b }",
    "type": "CloudFunction",
    "response": 2445,
    "body": {
      "a": 1233,
      "b": 1212
    },
    "_id": "6430a270c6acec026dd07bb1",
    "createdAt": "2023-04-07T23:08:32.144Z",
    "updatedAt": "2023-04-07T23:08:32.144Z",
    "__v": 0
  }
}

*POST:cron

This endpoint allows you to create a new CronJob on the fly

Fetch request example

var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");

var raw = JSON.stringify({
    "name": "newDatafunction",
    "func": "function () {  console.log('This is a cron every minute ') ; return true }",
    "active": true,
    "schedule": "* * * * *"
});

var requestOptions = {
    method: 'POST',
    headers: myHeaders,
    body: raw,
    redirect: 'follow'
};

fetch("http://localhost:3011/functions/cron", requestOptions)
    .then(response => response.text())
    .then(result => console.log(result))
    .catch(error => console.log('error', error));

Example fetch response

{
  "success": true,
  "code": 200,
  "error": false,
  "message": "OK",
  "container_id": false,
  "data": {
    "name": "newdatafunction",
    "schedule": "* * * * *",
    "token": "33fd6963",
    "function": "function () {  console.log('This is a cron every minute ') ; return true }",
    "active": true,
    "_id": "6430a349c6acec026dd07bb3",
    "createdAt": "2023-04-07T23:12:09.001Z",
    "updatedAt": "2023-04-07T23:12:09.001Z",
    "__v": 0
  }
}
  • Important: The cron jobs are created on the fly, You must check cron folder to depure it every certain time

*GET:log

Allows you to list all ejecutions of functions

  • query(url): Could contain the next elements
    • sort(Object):Object that defines the fields will be used for order results 'DESC' for descending or 'ASC' ascending
    • paginate(Object):Object with 2 properties 'page' and limit, defines the number of results to return and page
    • where(Object):Object filter to exactly match in find query for values
    • like(Object):Object filter to regex match in find query for values %LIKE% equivalent

Fetch request example

var requestOptions = {
    method: 'GET',
    redirect: 'follow'
};

fetch("http://localhost:3011/functions/log", requestOptions)
    .then(response => response.text())
    .then(result => console.log(result))
    .catch(error => console.log('error', error));

Example fetch response

{
  "error": {},
  "success": true,
  "message": "ok",
  "code": 200,
  "data": [
    {
      "_id": "642e04e5a1178181eb2de627",
      "name": "default",
      "method": "POST",
      "execID": "157f18a1",
      "function": "module.exports= async function ({body,query,headers}) {  return body.a + body.b }",
      "type": "CloudFunction",
      "response": 1133,
      "body": {
        "a": 1233,
        "b": -100
      },
      "createdAt": "2023-04-05T23:31:49.017Z",
      "updatedAt": "2023-04-05T23:31:49.017Z",
      "__v": 0
    },
    {
      "_id": "642e060af7a34a4c9fb2d09a",
      "name": "default",
      "method": "POST",
      "execID": "3b24dba2",
      "function": "module.exports= async function ({body,query,headers}) {  return body.a + body.b }",
      "type": "CloudFunction",
      "response": 2445,
      "body": {
        "a": 1233,
        "b": 1212
      },
      "createdAt": "2023-04-05T23:36:42.679Z",
      "updatedAt": "2023-04-05T23:36:42.679Z",
      "__v": 0
    },
    {
      "_id": "642e07073cf199b83092ef78",
      "name": "default",
      "method": "POST",
      "execID": "4f981011",
      "function": "module.exports= async function ({body,query,headers}) {  return body.a + body.b }",
      "type": "CloudFunction",
      "response": 2445,
      "body": {
        "a": 1233,
        "b": 1212
      },
      "createdAt": "2023-04-05T23:40:55.291Z",
      "updatedAt": "2023-04-05T23:40:55.291Z",
      "__v": 0
    },
    {
      "_id": "642e07210727d38e170f671e",
      "name": "default",
      "method": "POST",
      "execID": "82b0e29a",
      "function": "module.exports= async function ({body,query,headers}) {  return body.a + body.b }",
      "type": "CloudFunction",
      "response": 2445,
      "body": {
        "a": 1233,
        "b": 1212
      },
      "createdAt": "2023-04-05T23:41:21.890Z",
      "updatedAt": "2023-04-05T23:41:21.890Z",
      "__v": 0
    },
    {
      "_id": "6430a270c6acec026dd07bb1",
      "name": "default",
      "method": "POST",
      "execID": "3a6deae4",
      "function": "\nlet moment = require('moment');\nlet axios = require('axios'); \n module.exports= async function ({body,query,headers}) {  return body.a + body.b }",
      "type": "CloudFunction",
      "response": 2445,
      "body": {
        "a": 1233,
        "b": 1212
      },
      "createdAt": "2023-04-07T23:08:32.144Z",
      "updatedAt": "2023-04-07T23:08:32.144Z",
      "__v": 0
    }
  ]
}

OTHER endpoints

now there are another endpoints can be executed, Powered by APIATA ( https://www.npmjs.com/package/apiato )

Function

  • GET function/one = get a function detail for search and filters
  • GET function/:id = get a function detail for id
  • GET function/ = get a list of functions with detail for search and filters
  • PUT function/:id = updates a function by ID
  • DELETE function/:id = deletes a function by ID
  • POST function/dt_agr = Caller for datatable

Cron

  • GET cron/one = get a cron detail for search and filters
  • GET cron/:id = get a cron detail for id
  • GET cron/ = get a list of cron with detail for search and filters
  • PUT cron/:id = updates a cron by ID ***(You can active or deactive Crons on the fly using this method)
  • DELETE cron/:id = deletes a cron by ID
  • POST cron/dt_agr = Caller for datatable

log

  • GET log/one = get a log detail for search and filters
  • GET log/:id = get a log detail for id
  • GET log/ = get a list of log with detail for search and filters
  • PUT log/:id = updates a log by ID
  • DELETE log/:id = deletes a log by ID
  • POST log/dt_agr = Caller for datatable

Object request query URL example (more in APITO Docs)

where

?where[name]=erick&where[age]=30

equal to

let where = {
    name: 'erick',
    age: 30
}

like

?like[name]=eri

equal to

let like = {
    name: {$regex: 'eri', $options: 'i'},
}

paginate

?paginate[page]=1&paginate[limit]=10

equal to

let paginate = {
    page: 1,
    limit: 10
}

sort

?sort[name]=DESC&sort[age]=ASC

equal to

let sort = {
    name: "DESC",
    age: "ASC"
}