BlueWave Uptime
BlueWave Uptime is an open source server monitoring application. It is used to track the operational status and performance of servers and websites. It regularly checks whether a server/website is accessible and performs optimally, providing real-time alerts and reports on the monitored services' availability, downtime, and response time.
Contributing
You are welcome to provide contributions to the project. It uses React on the FE, and Nodejs and MongoDB on the BE, hence if you are comfortable with working with those technologies, you are encouraged to send your PRs. Please read Contributor's guideline. Once you start contributing, we can also add you to our weekly team calls (every Thursday).
Note that We have a Figma file that includes:
- All the dashboard elements and components
- The design guideline for the app
You can see the designs here. Since it is read-only, we encourage you to copy to your own Figma page, then work on it.
Getting Started
- Clone this repository to your local machine
- Docker Quickstart
- Installation (Client)
- Configuration(Client)
- Getting Started (Server)
- Endpoints
Auth
POST/api/v1/auth/registerPOST/api/v1/auth/loginPOST/api/v1/auth/user/{userId}POST/api/v1/auth/recovery/requestPOST/api/v1/auth/recovery/validatePOST/api/v1/auth/recovery/reset
Monitors
GET/api/v1/monitorsGET/api/v1/monitor/{id}GET/api/v1/monitors/user/{userId}?limitPOST/api/v1/monitorsPOST/api/v1/monitors/delete/{monitorId}POST/api/v1/monitors/edit/{monitorId}
Checks
POST/api/v1/checks/{monitorId}GET/api/v1/checks/{monitorId}POST/api/v1/checks/delete/{monitorId}
Alerts
- Error Handling
- Contributors
Docker Quick Start
Docker Quickstart
The fastest way to start the application is to use our Dockerfiles and Docker Compose.
To get the application up and running you need to:
- In the
Dockerdirectory run the build scriptbuild_images.shto build docker images for the client, server, Redis database, and MongoDB database. - In the
Dockerdirectory, create aserver.envfile with the requried environtmental variables for the server. Sample file:
CLIENT_HOST="http://localhost:5173"
JWT_SECRET="my_secret"
DB_TYPE="MongoDB"
DB_CONNECTION_STRING="mongodb://mongodb:27017/uptime_db"
REDIS_HOST="redis"
REDIS_PORT=6379
SYSTEM_EMAIL_ADDRESS="<email>"
SENDGRID_API_KEY="<api_key>"
LOGIN_PAGE_URL="<login_page"
- In the
Dockerdirectory, create aclient.envfile with the required environtmental variables for the client. Sample file:
VITE_APP_API_BASE_URL="http://localhost:5000/api/v1"
- In the
Dockerdirectory rundocker compose upto run thedocker-compose.yamlfile and start all four images.
That's it, the application is ready to use on port 5173.
Client
Installation
- Change directory to the
Clientdirectory - Install all dependencies by running
npm install
Configuration
Environmental Variables
| ENV Variable Name | Required/Optional | Type | Description | Accepted Values |
|---|---|---|---|---|
| VITE_APP_API_BASE_URL | Required | string |
Base URL of server | {host}/api/v1 |
Starting Development Server
- Run
npm run devto start the development server.
Getting Started (Server)
Manual Install
Install Server
- Change directory to the
Serverdirectory - Install all dependencies by running
npm install
Environmental Variables
Configure the server with the following environmental variables:
| ENV Variable Name | Required/Optional | Type | Description | Accepted Values |
|---|---|---|---|---|
| CLIENT_HOST | Required | string |
Frontend Host | |
| JWT_SECRET | Required | string |
JWT secret | |
| DB_TYPE | Optional | string |
Specify DB to use | MongoDB | FakeDB |
| DB_CONNECTION_STRING | Required | string |
Specifies URL for MongoDB Database | |
| PORT | Optional | integer |
Specifies Port for Server | |
| SENDGRID_API_KEY | Required | string |
Specifies API KEY for SendGrid email service | |
| SYSTEM_EMAIL_ADDRESS | Required | string |
Specifies System email to be used in emailing service, must be a verified email by sendgrid | |
| LOGIN_PAGE_URL | Required | string |
Login url to be used in emailing service | |
| REDIS_HOST | Required | string |
Host address for Redis database | |
| REDIS_PORT | Required | integer |
Port for Redis database | |
| TOKEN_TTL | Optional | string | Time for token to live | In vercel/ms format https://github.com/vercel/ms |
Databases
This project requires a number of databases to run:
- Main database for the application. This project includes an implementation for a MongoDB database as well as a MongoDB Docker image.
- A Redis database is required for the Queue implementation in the PingService. This project includes a Redis docker image.
You may use the included Dockerfiles to spin up databases quickly if you wish.
(Optional) Dockerised Databases
Dockerfiles for the server and databases are located in the Docker directory
MongoDB Image
Location: Docker/mongoDB.Dockerfile
The Docker/mongo/data directory should be mounted to the MongoDB container in order to persist data.
From the Docker directory run
- Build the image:
docker build -f mongoDB.Dockerfile -t uptime_database_mongo . - Run the docker image:
docker run -d -p 27017:27017 -v $(pwd)/mongo/data:/data/db --name uptime_database_mongo uptime_database_mongo
Redis Image
Location Docker/redis.Dockerfile
the Docker/redis/data directory should be mounted to the Redis container in order to persist data.
From the Docker directory run
- Build the image:
docker build -f redis.Dockerfile -t uptime_redis . - Run the image:
docker run -d -p 6379:6379 -v $(pwd)/redis/data:/data --name uptime_redis uptime_redis
Starting the Development Server
- run
npm run devto start the development server
OR
- run
node index.jsto start server
Endpoints
All endpoints return a response in this format:
| Name | Type | Notes |
|---|---|---|
| success | boolean |
Success or failure of request |
| msg | string |
Message describing response |
| data | Object |
Arbitrary Payload |
Example:
{success: true, msg: "Successful Request", data: {test: testData}}
Data Types
User
| Name | Type | Notes |
|---|---|---|
| firstname | string |
First name |
| lastname | string |
Last name |
string |
User's email | |
| profilePicUrl | string |
URL to User's picture |
| isActive | boolean |
Default to true |
| isVerified | boolean |
Default to false |
| updated_at | Date |
Last update time |
| created_at | Date |
Time created at |
Monitor
| Name | Type | Notes |
|---|---|---|
| userId | string |
Unique ID identifying monitor creator |
| name | string |
Name of the monitor |
| description | string |
Description of the monitor |
| url | string |
Url the monitor will ping |
| isActive | boolean |
Whether or not the monitor is active |
| interval | integer |
Interval with which to ping monitor (ms) |
| updatedAt | Date |
Last time the monitor was updated |
| CreatedAt | Date |
When the monitor was updated |
Check
| Name | Type | Notes |
|---|---|---|
| monitorId | string |
Unique ID for the monitor |
| status | boolean |
Indicates the service is Up or Down |
| responseTime | integer |
Indicates the response time of the service (ms) |
| statusCode | integer |
Status Code returned from the service |
| message | string |
Message returned from the service |
| updatedAt | Date |
Last time the check was updated |
| CreatedAt | Date |
When the check was created |
Alert
| Name | Type | Notes |
|---|---|---|
| checkId | string |
Unique ID for the associated check |
| monitorId | string |
Unique ID for the associated monitor |
| userId | string |
Unique ID for the associated user |
| status | boolean |
Indicates the service is Up or Down |
| message | string |
Message for the user about the down service |
| notifiedStatus | boolean |
Indicates whether the user is notified |
| acknowledgeStatus | boolean |
Indicates whether the user acknowledged the alert |
| updatedAt | Date |
Last time the alert was updated |
| CreatedAt | Date |
When the alert was created |
Auth
POST /api/v1/auth/register
Method/Headers
Method/Headers Value Method POST content-type application/json
Body
Name Type Notes firstname stringlastname stringstringValid email address password stringMin 8 chars
Response Payload
Type Notes JWT JSON Web Token containing a User
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/auth/register \
--header 'Content-Type: application/json' \
--data '{
"firstname" : "User First Name",
"lastname": "User Last Name",
"email" : "user@gmail.com",
"password": "user_password"
}'
Sample Response
{
"success": true,
"msg": "User created",
"data": "<encoded_user>"
}
POST /api/v1/auth/login
Method/Headers
Method/Headers Value Method POST content-type application/json
Body
Name Type Notes stringValid email address password stringMin 8 chars
Response Payload
Type Notes JWT JSON Web Token Containing a User
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/auth/login \
--header 'Content-Type: application/json' \
--data '{
"email" : "user@gmail.com",
"password": "user_password"
}'
Sample response
{
"success": true,
"msg": "Found user",
"data": "<encoded_user>"
}
POST/api/v1/auth/user/{userId}
Method/Headers
Method/Headers Value Method POST
Body
Name Type Notes firstname stringlastname stringprofilePicUrl stringpassword stringMin 8 chars
Response Payload
Type Notes UserReturns the updated user
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/auth/user/6654d156634754f789e1f10e \
--header 'Authorization: <bearer_token>' \
--header 'Content-Type: application/json' \
--data '{
"firstname": "First Name",
"lastname: "Last Name"
}'
Sample Response
{
"success": true,
"msg": "User updated",
"data": {
"_id": "6654d156634754f789e1f10e",
"firstname": "First Name",
"lastname": "Last Name",
"email": "me@gmail.com",
"isActive": true,
"isVerified": false,
"createdAt": "2024-05-27T18:30:46.358Z",
"updatedAt": "2024-05-27T19:21:51.747Z",
"__v": 0
}
}
POST/api/v1/auth/recovery/request
Method/Headers
Method/Headers Value Method POST
Body
Name Type Notes stringUser's email
Response Payload
Type Notes RecoveryTokenReturns a recovery token if email found
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/auth/recovery/request \
--header 'Content-Type: application/json' \
--data '{
"email" : "ajhollid@gmail.com"
}'
Sample Response
{
"success": true,
"msg": "Created recovery token",
"data": {
"email": "your_email@gmail.com",
"token": "f519da5e4a9be40cfc3c0fde97e60c0e6d17bdaa613f5ba537a45073f3865193",
"_id": "6668878263587f30748e968e",
"expiry": "2024-06-11T17:21:06.984Z",
"createdAt": "2024-06-11T17:21:06.985Z",
"updatedAt": "2024-06-11T17:21:06.985Z",
"__v": 0
}
}
POST/api/v1/auth/recovery/validate
Method/Headers
Method/Headers Value Method POST
Body
Name Type Notes recoveryToken stringToken issued in /recovery/request
Response Payload
Type Notes RecoveryTokenReturns the recovery token
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/auth/recovery/validate \
--header 'Content-Type: application/json' \
--data '{
"recoveryToken" : "f519da5e4a9be40cfc3c0fde97e60c0e6d17bdaa613f5ba537a45073f3865193"
}'
Sample Response
{
"success": true,
"msg": "Token is valid",
"data": {
"_id": "6668894263587f30748e969a",
"email": "ajhollid@gmail.com",
"token": "457d9926b24dedf613f120eeb524ef00ac45b3f0fc5c70bd25b1cc8aa83a64a0",
"expiry": "2024-06-11T17:28:34.349Z",
"createdAt": "2024-06-11T17:28:34.349Z",
"updatedAt": "2024-06-11T17:28:34.349Z",
"__v": 0
}
}
POST/api/v1/auth/recovery/reset
Method/Headers
Method/Headers Value Method POST
Body
Name Type Notes recoveryToken stringToken issued returned by /recovery/validatepassword stringUser's new password`
Response Payload
Type Notes UserReturns the updated user
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/auth/recovery/reset \
--header 'Content-Type: application/json' \
--data '{
"recoveryToken" : "f519da5e4a9be40cfc3c0fde97e60c0e6d17bdaa613f5ba537a45073f3865193",
"password": "testtest"
}'
Sample Response
{
"success": true,
"msg": "Password reset",
"data": {
"_id": "66675891cb17336d84c25d9f",
"firstname": "User First Name",
"lastname": "User Last Name",
"email": "your_email@gmail.com",
"isActive": true,
"isVerified": false,
"createdAt": "2024-06-10T19:48:33.863Z",
"updatedAt": "2024-06-11T17:21:22.289Z",
"__v": 0
}
}
Monitors
GET /api/v1/monitors
Method/Headers
Method/Headers Value Method GET
Response Payload
Type Notes Array<Monitor>Array of all monitors
Sample cURL Request
curl --request GET \
--url http://localhost:5000/api/v1/monitors \
--header '<bearer_token>' \
Sample Response
{
"success": true,
"msg": "Monitors found",
"data": [
{
"_id": "664d070786e62625ac612ca1",
"userId": "6645079aae0b439371913972",
"name": "Wha3",
"description": "Description",
"url": "https://monitor0.com",
"isActive": true,
"interval": 60000,
"createdAt": "2024-05-21T20:41:43.051Z",
"updatedAt": "2024-05-21T20:45:10.496Z",
"__v": 0
},
{
"_id": "664e5ccf189c864800debc16",
"userId": "6645079aae0b439371913972",
"name": "Inserting a new Monitor",
"description": "Description",
"url": "https://monitor0.com",
"isActive": true,
"interval": 60000,
"createdAt": "2024-05-22T20:59:59.295Z",
"updatedAt": "2024-05-22T20:59:59.295Z",
"__v": 0
}
]
}
GET /api/v1/monitor/{id}
Method/Headers
Method/Headers Value Method GET
Response Payload
Type Notes MonitorSingle monitor with the id in the request parameter
Sample cURL Request
curl --request GET \
--url http://localhost:5000/api/v1/monitors/664d070786e62625ac612ca1 \
--header '<bearer_token>' \
Sample Response
{
"success": true,
"msg": "Got monitor by Id successfully",
"data": {
"_id": "6671eb54f7040ece47892f53",
"userId": "666c9146c9bfa20db790b1df",
"name": "Google Monitor",
"description": "Google",
"type": "http",
"url": "https://www.google.com/404",
"isActive": true,
"interval": 10000,
"createdAt": "2024-06-18T20:17:24.112Z",
"updatedAt": "2024-06-18T20:17:24.112Z",
"__v": 0,
"checks": [
{
"_id": "6671eb5af7040ece47892f61",
"monitorId": "6671eb54f7040ece47892f53",
"status": false,
"responseTime": 145,
"expiry": "2024-06-18T20:17:30.246Z",
"statusCode": 404,
"createdAt": "2024-06-18T20:17:30.246Z",
"updatedAt": "2024-06-18T20:17:30.246Z",
"__v": 0
},
{
"_id": "6671eb64f7040ece47892f6b",
"monitorId": "6671eb54f7040ece47892f53",
"status": false,
"responseTime": 170,
"expiry": "2024-06-18T20:17:40.209Z",
"statusCode": 404,
"createdAt": "2024-06-18T20:17:40.210Z",
"updatedAt": "2024-06-18T20:17:40.210Z",
"__v": 0
}
]
}
}
GET /api/v1/monitors/user/{userId}?limit
Method/Headers
Method/Headers Value Method GET
Response Payload
Type Notes Array<Monitor>Array of monitors created by user with specified UserID
Sample cURL Request
curl --request GET \
--url http://localhost:5000/api/v1/monitors/user/6645079aae0b439371913972?limit=25 \
--header '<bearer_token>' \
Sample Response
{
"success": true,
"msg": "Got monitor for 666c9146c9bfa20db790b1df successfully\"",
"data": [
{
"_id": "6671eb54f7040ece47892f53",
"userId": "666c9146c9bfa20db790b1df",
"name": "Google Monitor",
"description": "Google",
"type": "http",
"url": "https://www.google.com/404",
"isActive": true,
"interval": 10000,
"createdAt": "2024-06-18T20:17:24.112Z",
"updatedAt": "2024-06-18T20:17:24.112Z",
"__v": 0,
"checks": [
{
"_id": "6671eb5af7040ece47892f61",
"monitorId": "6671eb54f7040ece47892f53",
"status": false,
"responseTime": 145,
"expiry": "2024-06-18T20:17:30.246Z",
"statusCode": 404,
"createdAt": "2024-06-18T20:17:30.246Z",
"updatedAt": "2024-06-18T20:17:30.246Z",
"__v": 0
}
]
}
]
}
POST/api/v1/monitors
Method/Headers
Method/Headers Value Method POST
Body
Name Type Notes Accepted Values userId stringUserId of current user name stringMonitor name description stringMonitor Description type stringValid email address "ping"|"http"url stringURL of service or IP isActive booleaninterval numberIn ms
Response Payload
Type Notes MonitorReturns newly created Monitor
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/monitors \
--header <bearer_token> \
--header 'Content-Type: application/json' \
--header 'User-Agent: insomnia/2023.5.8' \
--data '{
"userId": "66675891cb17336d84c25d9f",
"name": "Ping Google",
"description": "Google",
"type": "ping",
"url": "8.8.8.8",
"isActive": true,
"interval": 5000}'
Sample Response
{
"success": true,
"msg": "Monitor created",
"data": {
"userId": "6645079aae0b439371913972",
"name": "Inserting a new Monitor",
"description": "Description",
"url": "https://monitor0.com",
"isActive": true,
"interval": 60000,
"_id": "664e5ccf189c864800debc16",
"createdAt": "2024-05-22T20:59:59.295Z",
"updatedAt": "2024-05-22T20:59:59.295Z",
"__v": 0
}
}
POST/api/v1/monitors/delete/{monitorId}
Method/Headers
Method/Headers Value Method POST
Response Payload
Type Notes None No payload returned
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/monitors/delete/664e632a7a3ee9d620761938 \
--header '<bearer_token>' \
--header 'Content-Type: application/json' \
Sample Response
{
"success": true,
"msg": "Monitor deleted"
}
POST/api/v1/monitors/edit/{monitorId}
Method/Headers
Method/Headers Value Method POST
Response Payload
Type Notes MonitorReturns the updated monitor
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/monitors/edit/664e5ccf189c864800debc16 \
--header '<bearer_token' \
--header 'Content-Type: application/json' \
--data '
{
"_id": "664e5ccf189c864800debc16",
"userId": "6645079aae0b439371913972",
"name": "Edited monitor",
"description": "Description",
"url": "https://monitor0.com",
"isActive": true,
"interval": 60000
}'
Sample Response
{
"success": true,
"msg": "Monitor edited",
"data": {
"_id": "664e5ccf189c864800debc16",
"userId": "6645079aae0b439371913972",
"name": "Edited monitor",
"description": "Description",
"url": "https://monitor0.com",
"isActive": true,
"interval": 60000,
"createdAt": "2024-05-22T20:59:59.295Z",
"updatedAt": "2024-05-22T21:34:33.893Z",
"__v": 0
}
}
Checks
POST/api/v1/checks/{monitorId}
Method/Headers
Method/Headers Value Method POST
Response Payload
Type Notes CheckReturns newly created check
Body
Name Type Notes monitorId stringMonitor associated with Check status booleantruefor up andfalsefor downresponseTime numberHow long it took the server to respond statusCode numberHTTP Status code of response message string
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/checks/66562414035c4ce6a8a610ac \
--header 'Authorization: <bearer_token>' \
--header 'Content-Type: application/json' \
--data '{
"monitorId": "66562414035c4ce6a8a610ac",
"status": true,
"responseTime": 1,
"statusCode": 200,
"message": "good"
}'
Sample Response
{
"success": true,
"msg": "Check created",
"data": {
"monitorId": "66562414035c4ce6a8a610ac",
"status": true,
"responseTime": 1,
"statusCode": 200,
"message": "good",
"_id": "66576decba9f70148ea1f354",
"createdAt": "2024-05-29T18:03:24.445Z",
"updatedAt": "2024-05-29T18:03:24.445Z",
"__v": 0
}
}
GET/api/v1/checks/{monitorId}
Method/Headers
Method/Headers Value Method GET
Response Payload
Type Notes Array<Checks>Array of Checkobjects
Sample CURL request
curl --request GET \
--url http://localhost:5000/api/v1/checks/66562414035c4ce6a8a610ac \
--header 'Authorization: <bearer_token>' \
Sample Response
{
"success": true,
"msg": "Checks retrieved",
"data": [
{
"_id": "66576c0194e11c0d4409d3c1",
"monitorId": "66562414035c4ce6a8a610ac",
"status": true,
"responseTime": 1,
"statusCode": 200,
"message": "good",
"createdAt": "2024-05-29T17:55:13.581Z",
"updatedAt": "2024-05-29T17:55:13.581Z",
"__v": 0
},
{
"_id": "66576c0994e11c0d4409d3c5",
"monitorId": "66562414035c4ce6a8a610ac",
"status": true,
"responseTime": 2,
"statusCode": 200,
"message": "good",
"createdAt": "2024-05-29T17:55:21.127Z",
"updatedAt": "2024-05-29T17:55:21.127Z",
"__v": 0
}
]
}
POST/api/v1/checks/delete/{monitorId}
Method/Headers
Method/Headers Value Method POST
Response Payload
Type Notes Object{deletedCount: n}Returns an object showing how many items deleted
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/checks/delete/66562414035c4ce6a8a610ac \
--header 'Authorization: <bearer_token>' \
Sample Response
{
"success": true,
"msg": "Checks deleted",
"data": {
"deletedCount": 3
}
}
Alerts
POST/api/v1/alerts/{monitorId}
Method/Headers
Method/Headers Value Method POST
Response Payload
Type Notes AlertReturns newly created Alert
Body
"checkId": "66577a3fd16dcf7c1ce35148",
"monitorId": "6657789ebf6766ee8e2d2edb",
"userId": "6654d1a2634754f789e1f115",
"status": false,
"message": "This is a test alert",
"notifiedStatus": "false",
"acknowledgeStatus": false
Name Type Notes checkId stringId of Checkassociated withAlertmonitorId stringId of Monitorassociated withAlertuserId stringId of Userassociated withAlertstatus booleanStatus of Alertmessage stringAlertmessagenotifiedStatus booleanacknowledgeStatus boolean
Sample CURL request
Sample Response
GET/api/v1/alerts/user/{userId}
Method/Headers
Method/Headers Value Method GET
Response Payload
Type Notes Array<Alert>Returns all Alertcreated by aUser
Sample CURL request
curl --request GET \
--url http://localhost:5000/api/v1/alerts/user/6654d1a2634754f789e1f115 \
--header 'Authorization: <bearer_token>'
Sample Response
{
"success": true,
"msg": "Got alerts",
"data": [
{
"_id": "6657813d809adfded891a6b7",
"checkId": "66577a3fd16dcf7c1ce35148",
"monitorId": "6657789ebf6766ee8e2d2edb",
"userId": "6654d1a2634754f789e1f115",
"status": false,
"message": "This is a test alert",
"notifiedStatus": false,
"acknowledgeStatus": false,
"createdAt": "2024-05-29T19:25:49.317Z",
"updatedAt": "2024-05-29T19:25:49.317Z",
"__v": 0
}
]
}
GET/api/v1/alerts/monitor/{monitorId}
Method/Headers
Method/Headers Value Method GET
Response Payload
Type Notes Array<Alert>Returns an array of Alertbelonging to a specifiedMonitor
Sample CURL request
curl --request GET \
--url http://localhost:5000/api/v1/alerts/monitor/6657789ebf6766ee8e2d2edb \
--header 'Authorization: <bearer_token>' \
Sample Response
{
"success": true,
"msg": "Got alerts by Monitor",
"data": [
{
"_id": "6657813d809adfded891a6b7",
"checkId": "66577a3fd16dcf7c1ce35148",
"monitorId": "6657789ebf6766ee8e2d2edb",
"userId": "6654d1a2634754f789e1f115",
"status": false,
"message": "This is a test alert",
"notifiedStatus": false,
"acknowledgeStatus": false,
"createdAt": "2024-05-29T19:25:49.317Z",
"updatedAt": "2024-05-29T19:25:49.317Z",
"__v": 0
}
]
}
GET/api/v1/alerts/{alertId}
Method/Headers
Method/Headers Value Method GET
Response Payload
Type Notes AlertReturns specified Alert
Sample CURL request
curl --request GET \
--url http://localhost:5000/api/v1/alerts/66577ddae5ff3c91437d0887 \
--header 'Authorization: <bearer_token>' \
Sample Response
{
"success": true,
"msg": "Got Alert By alertID",
"data": {
"_id": "66577ddae5ff3c91437d0887",
"checkId": "66577a3fd16dcf7c1ce35148",
"monitorId": "6657789ebf6766ee8e2d2edb",
"userId": "6654d1a2634754f789e1f115",
"status": false,
"message": "This is a test alert",
"notifiedStatus": false,
"acknowledgeStatus": false,
"createdAt": "2024-05-29T19:11:22.205Z",
"updatedAt": "2024-05-29T19:11:22.205Z",
"__v": 0
}
}
POST/api/v1/alerts/edit/{alertId}
Method/Headers
Method/Headers Value Method POST
Response Payload
Type Notes AlertReturns edited Alert
Body
Name Type Notes checkId stringID of Checkassociated withAlertmonitorId stringID of Monitorid associated withAlertuserId stringID of Userassociated withAlertstatus booleanAlert status message stringAlert message notifiedStatus booleanacknowledgeStatus boolean
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/alerts/edit/66577ddae5ff3c91437d0887 \
--header 'Authorization: <bearer_token>' \
--header 'Content-Type: application/json' \
--data '{
"acknowledgeStatus": true
}'
Sample Response
{
"success": true,
"msg": "Edited alert",
"data": {
"_id": "66577ddae5ff3c91437d0887",
"checkId": "66577a3fd16dcf7c1ce35148",
"monitorId": "6657789ebf6766ee8e2d2edb",
"userId": "6654d1a2634754f789e1f115",
"status": false,
"message": "This is a test alert",
"notifiedStatus": false,
"acknowledgeStatus": true,
"createdAt": "2024-05-29T19:11:22.205Z",
"updatedAt": "2024-05-29T19:12:23.951Z",
"__v": 0
}
}
POST/api/v1/alerts/delete/{alertId}
Method/Headers
Method/Headers Value Method POST
Response Payload
Type Notes AlertReturns the deleted Alert
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/alerts/delete/66577ddae5ff3c91437d0887 \
--header 'Authorization: <bearer_token>' \
Sample Response
{
"success": true,
"msg": "Deleted alert",
"data": {
"_id": "66577ddae5ff3c91437d0887",
"checkId": "66577a3fd16dcf7c1ce35148",
"monitorId": "6657789ebf6766ee8e2d2edb",
"userId": "6654d1a2634754f789e1f115",
"status": false,
"message": "This is a test alert",
"notifiedStatus": false,
"acknowledgeStatus": true,
"createdAt": "2024-05-29T19:11:22.205Z",
"updatedAt": "2024-05-29T19:12:23.951Z",
"__v": 0
}
}
Checks
POST/api/v1/checks/{monitorId}
Method/Headers
Method/Headers Value Method POST
Response Payload
Type Notes CheckReturns newly created check
Body
Name Type Notes monitorId stringMonitor associated with Check status booleantruefor up andfalsefor downresponseTime numberHow long it took the server to respond statusCode numberHTTP Status code of response message string
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/checks/66562414035c4ce6a8a610ac \
--header 'Authorization: <bearer_token>' \
--header 'Content-Type: application/json' \
--data '{
"monitorId": "66562414035c4ce6a8a610ac",
"status": true,
"responseTime": 1,
"statusCode": 200,
"message": "good"
}'
Sample Response
{
"success": true,
"msg": "Check created",
"data": {
"monitorId": "66562414035c4ce6a8a610ac",
"status": true,
"responseTime": 1,
"statusCode": 200,
"message": "good",
"_id": "66576decba9f70148ea1f354",
"createdAt": "2024-05-29T18:03:24.445Z",
"updatedAt": "2024-05-29T18:03:24.445Z",
"__v": 0
}
}
GET/api/v1/checks/{monitorId}
Method/Headers
Method/Headers Value Method GET
Response Payload
Type Notes Array<Checks>Array of Checkobjects
Sample CURL request
curl --request GET \
--url http://localhost:5000/api/v1/checks/66562414035c4ce6a8a610ac \
--header 'Authorization: <bearer_token>' \
Sample Response
{
"success": true,
"msg": "Checks retrieved",
"data": [
{
"_id": "66576c0194e11c0d4409d3c1",
"monitorId": "66562414035c4ce6a8a610ac",
"status": true,
"responseTime": 1,
"statusCode": 200,
"message": "good",
"createdAt": "2024-05-29T17:55:13.581Z",
"updatedAt": "2024-05-29T17:55:13.581Z",
"__v": 0
},
{
"_id": "66576c0994e11c0d4409d3c5",
"monitorId": "66562414035c4ce6a8a610ac",
"status": true,
"responseTime": 2,
"statusCode": 200,
"message": "good",
"createdAt": "2024-05-29T17:55:21.127Z",
"updatedAt": "2024-05-29T17:55:21.127Z",
"__v": 0
}
]
}
POST/api/v1/checks/delete/{monitorId}
Method/Headers
Method/Headers Value Method POST
Response Payload
Type Notes Object{deletedCount: n}Returns an object showing how many items deleted
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/checks/delete/66562414035c4ce6a8a610ac \
--header 'Authorization: <bearer_token>' \
Sample Response
{
"success": true,
"msg": "Checks deleted",
"data": {
"deletedCount": 3
}
}
Alerts
POST/api/v1/alerts/{monitorId}
Method/Headers
Method/Headers Value Method POST
Response Payload
Type Notes AlertReturns newly created Alert
Body
"checkId": "66577a3fd16dcf7c1ce35148",
"monitorId": "6657789ebf6766ee8e2d2edb",
"userId": "6654d1a2634754f789e1f115",
"status": false,
"message": "This is a test alert",
"notifiedStatus": "false",
"acknowledgeStatus": false
Name Type Notes checkId stringId of Checkassociated withAlertmonitorId stringId of Monitorassociated withAlertuserId stringId of Userassociated withAlertstatus booleanStatus of Alertmessage stringAlertmessagenotifiedStatus booleanacknowledgeStatus boolean
Sample CURL request
Sample Response
GET/api/v1/alerts/user/{userId}
Method/Headers
Method/Headers Value Method GET
Response Payload
Type Notes Array<Alert>Returns all Alertcreated by aUser
Sample CURL request
curl --request GET \
--url http://localhost:5000/api/v1/alerts/user/6654d1a2634754f789e1f115 \
--header 'Authorization: <bearer_token>'
Sample Response
{
"success": true,
"msg": "Got alerts",
"data": [
{
"_id": "6657813d809adfded891a6b7",
"checkId": "66577a3fd16dcf7c1ce35148",
"monitorId": "6657789ebf6766ee8e2d2edb",
"userId": "6654d1a2634754f789e1f115",
"status": false,
"message": "This is a test alert",
"notifiedStatus": false,
"acknowledgeStatus": false,
"createdAt": "2024-05-29T19:25:49.317Z",
"updatedAt": "2024-05-29T19:25:49.317Z",
"__v": 0
}
]
}
GET/api/v1/alerts/monitor/{monitorId}
Method/Headers
Method/Headers Value Method GET
Response Payload
Type Notes Array<Alert>Returns an array of Alertbelonging to a specifiedMonitor
Sample CURL request
curl --request GET \
--url http://localhost:5000/api/v1/alerts/monitor/6657789ebf6766ee8e2d2edb \
--header 'Authorization: <bearer_token>' \
Sample Response
{
"success": true,
"msg": "Got alerts by Monitor",
"data": [
{
"_id": "6657813d809adfded891a6b7",
"checkId": "66577a3fd16dcf7c1ce35148",
"monitorId": "6657789ebf6766ee8e2d2edb",
"userId": "6654d1a2634754f789e1f115",
"status": false,
"message": "This is a test alert",
"notifiedStatus": false,
"acknowledgeStatus": false,
"createdAt": "2024-05-29T19:25:49.317Z",
"updatedAt": "2024-05-29T19:25:49.317Z",
"__v": 0
}
]
}
GET/api/v1/alerts/{alertId}
Method/Headers
Method/Headers Value Method GET
Response Payload
Type Notes AlertReturns specified Alert
Sample CURL request
curl --request GET \
--url http://localhost:5000/api/v1/alerts/66577ddae5ff3c91437d0887 \
--header 'Authorization: <bearer_token>' \
Sample Response
{
"success": true,
"msg": "Got Alert By alertID",
"data": {
"_id": "66577ddae5ff3c91437d0887",
"checkId": "66577a3fd16dcf7c1ce35148",
"monitorId": "6657789ebf6766ee8e2d2edb",
"userId": "6654d1a2634754f789e1f115",
"status": false,
"message": "This is a test alert",
"notifiedStatus": false,
"acknowledgeStatus": false,
"createdAt": "2024-05-29T19:11:22.205Z",
"updatedAt": "2024-05-29T19:11:22.205Z",
"__v": 0
}
}
POST/api/v1/alerts/edit/{alertId}
Method/Headers
Method/Headers Value Method POST
Response Payload
Type Notes AlertReturns edited Alert
Body
Name Type Notes checkId stringID of Checkassociated withAlertmonitorId stringID of Monitorid associated withAlertuserId stringID of Userassociated withAlertstatus booleanAlert status message stringAlert message notifiedStatus booleanacknowledgeStatus boolean
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/alerts/edit/66577ddae5ff3c91437d0887 \
--header 'Authorization: <bearer_token>' \
--header 'Content-Type: application/json' \
--data '{
"acknowledgeStatus": true
}'
Sample Response
{
"success": true,
"msg": "Edited alert",
"data": {
"_id": "66577ddae5ff3c91437d0887",
"checkId": "66577a3fd16dcf7c1ce35148",
"monitorId": "6657789ebf6766ee8e2d2edb",
"userId": "6654d1a2634754f789e1f115",
"status": false,
"message": "This is a test alert",
"notifiedStatus": false,
"acknowledgeStatus": true,
"createdAt": "2024-05-29T19:11:22.205Z",
"updatedAt": "2024-05-29T19:12:23.951Z",
"__v": 0
}
}
POST/api/v1/alerts/delete/{alertId}
Method/Headers
Method/Headers Value Method POST
Response Payload
Type Notes AlertReturns the deleted Alert
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/alerts/delete/66577ddae5ff3c91437d0887 \
--header 'Authorization: <bearer_token>' \
Sample Response
{
"success": true,
"msg": "Deleted alert",
"data": {
"_id": "66577ddae5ff3c91437d0887",
"checkId": "66577a3fd16dcf7c1ce35148",
"monitorId": "6657789ebf6766ee8e2d2edb",
"userId": "6654d1a2634754f789e1f115",
"status": false,
"message": "This is a test alert",
"notifiedStatus": false,
"acknowledgeStatus": true,
"createdAt": "2024-05-29T19:11:22.205Z",
"updatedAt": "2024-05-29T19:12:23.951Z",
"__v": 0
}
}
Error handling
Errors are returned in a standard format:
{"success": false, "msg": "No token provided"}
Errors are handled by error handling middleware and should be thrown with the following parameters
| Name | Type | Default | Notes |
|---|---|---|---|
| status | integer |
500 | Standard HTTP codes |
| message | string |
"Something went wrong" | An error message |
| service | string |
"Unknown Service" | Name of service that threw the error |
Example:
const myRoute = async(req, res, next) => {
try{
const result = myRiskyOperationHere();
}
catch(error){
error.status = 404
error.message = "Resource not found"
error.service = service name
next(error)
return;
}
}
Errors should not be handled at the controller level and should be left to the middleware to handle.
Contributors
Made with contrib.rocks.