Noah is a scheduling service that allows you to register tasks for making an outbound request after a recurring interval.
- It allows you to configure the request to accept query params, headers and request body and accepts a human-readable interval to invoke the request.
- It exposes a REST API for CRUD on schedules backed with a MySQL database for persistence. Refer to API section below for details.
Noah is supposed to be used as a self-hosted service for your scheduling needs. Here's how you can set it up.
-
After cloning, install the dependencies.
npm i
-
Create a
.env
file in the root directory and add the following environment variables.MYSQL_HOST MYSQL_USER MYSQL_PASSWORD MYSQL_DB_NAME MYSQL_TEST_DB_NAME
-
Create the databases you have specified in the
.env
file.CREATE DATABASE IF NOT EXISTS MYSQL_DB_NAME;
You don't need to create the tables explicitly,
sails
does that for you based on the models when you lift the server. -
Lift the server.
node app.js
-
Test whether the server was lifted properly by making a call to the health check endpoint :
{{url}}/knockknock
Noah exposes the following APIs to interact with the system.
-
Create Schedule - Allows you to register a schedule with the system.
- Endpoint -
/v1/schedules
- Method -
POST
- Request Body:
{ "request": { "url": "{{targetUrl}}", "method": "{{method}}", "data": { "params": { "key": "value" }, "headers": {}, "body": {} } }, "period": { "every": 2, "interval": "{{interval}}" }, "start": true, "storeResponseBody": true }
-
request
is a required field. It includes the following required fields:url
(string)- specifies the target URL to be called.method
(string)- specifies the request method for calling the URL, eg.GET
. Accepts one of the following values['GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'DELETE']
data
(object) - specifies the request data to be sent with the request. Send{}
in case of no data. Each data item is an object that accepts key-value pairs.
Note -
body
accepts only raw format for now with json data,application/json
header is added implicitly. -
period
is a required field. It includes the following required fields:every
(integer) - represents the frequency of invocation, for eg. every 2 hours.interval
(string) - represents the time interval between invocations. Accepts one of the following values['hours', 'days', 'weeks', 'months']
-
start
is an optional boolean field, false by default. Represents whether or not a request should be made at the time of registering the schedule. -
storeResponseBody
is an optional boolean field, false by default. Represents whether or not the response body should be stored while making request.
-
- Returns - unique identfier for the created schedule.
{ "data": { "id": "88b6ba474b76df6ab866111fc3284ab0" }, "meta": {} }
- Endpoint -
-
Update Schedule - Allows updating the existing schedules based on their unique identifiers.
- Endpoint -
/v1/schedules/{{identifier}}
- Method -
PUT
- Request body is similar to create schedule with the following exceptions:
start
is not accepted.- In case you want to edit a
request
,storeResponseBody
orperiod
field, entire object needs to be sent. For example, for updating period from every 2 hours, to every 3 hours, request body would be:Note Period changes would start reflecting from next cycle onwards.{ "period": { "every": 3, "interval": "hours" } }
- Get all schedules - Fetches all active schedules.
- Endpoint -
/v1/schedules
- Method -
GET
- Returns - An array of all active schedules.
{ "data": [ { "identifier": "64a623fd6b35f435dfb5fde03df2d4ed", "nextRunningTime": 1570435680068, "request": { "url": "http://localhost:3000/v1/blogs/29", "method": "GET", "data": { "params": {}, "headers": {}, "body": {} } }, "period": { "every": 2, "interval": "hours" }, "storeResponseBody": true } ], "meta": { "filter": "active" } }
- Get run history of schedule - Fetches all the run histories for the specified schedule.
- Endpoint -
/v1/schedules/{{identifier}}
- Method -
GET
- Returns - An array of run history for the schedule.
{ "data": [ { "id": 1, "runTime": 1570428480068, "responseStatusCode": 200, "responseBody": "hello i am a response body." } ], "meta": {} }
- Delete a schedule - Marks a schedule as inactive.
- Endpoint -
/v1/schedules/{{identifier}}
- Method -
DELETE
Please refer to the issue tracker in case you'd like to contribute. Also, feel free to open feature requests/bug reports in case you face any.