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
.envfile 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
.envfile.CREATE DATABASE IF NOT EXISTS MYSQL_DB_NAME;
You don't need to create the tables explicitly,
sailsdoes 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 }
-
requestis 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 -
bodyaccepts only raw format for now with json data,application/jsonheader is added implicitly. -
periodis 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']
-
startis an optional boolean field, false by default. Represents whether or not a request should be made at the time of registering the schedule. -
storeResponseBodyis 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:
startis not accepted.- In case you want to edit a
request,storeResponseBodyorperiodfield, 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.