Skip to content

This project provides a simple RESTful API for managing sleep records using Node.js, Express, and MongoDB. The API supports creating, retrieving, and deleting sleep records for users.

Notifications You must be signed in to change notification settings

vishalpathakcodes/sleep-data-api

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Sleep Data API

Overview

The Sleep Data API is a RESTful service built with Node.js, Express, and MongoDB. It allows users to manage sleep records, supporting operations to create, retrieve, and delete records.

Prerequisites

  • Node.js (version 14 or later)
  • MongoDB (either local instance or MongoDB Atlas)

Project Setup

1. Clone the Repository

git clone https://github.com/vishalpathakcodes/sleep-data-api.git
cd sleep-data-api

2. Install Dependencies

npm install

3. Set Up MongoDB

Ensure you have MongoDB running locally at mongodb://localhost:27017/sleep-data. If you are using MongoDB Atlas or a different URI, update the connection string in index.js:

mongoose.connect("your_mongodb_connection_string")
    .then(() => {
        console.log("MongoDB Connected");
    })
    .catch((err) => {
        console.log(err);
    });

4. Run the Server

node index.js

The server will start on port 8000. You should see the message "Server started" in your terminal.

API Endpoints

1. GET /

Description: Returns a welcome message.

Response:

  • 200 OK
    Welcome to sleep Data
    

2. POST /sleep

Description: Creates a new sleep record.

Request Body:

{
  "userId": Number,
  "hours": Number
}

Responses:

  • 201 Created
    { "message": "User created successfully" }
  • 400 Bad Request
    { "error": "All fields are required" }

3. GET /sleep/:id

Description: Retrieves all sleep records for a given user ID, sorted by creation date.

Response:

  • 200 OK
    [
      { "userId": 1, "hours": 8, "createdAt": "...", "updatedAt": "..." },
      ...
    ]
  • 404 Not Found
    { "message": "No sleep records found for this user" }

4. DELETE /sleep/:recordId

Description: Deletes a specific sleep record by its ID.

Response:

  • 200 OK
    { "message": "Sleep record deleted successfully" }
  • 404 Not Found
    { "message": "Sleep record not found" }

Testing

1. Install Development Dependencies

Ensure you have installed jest and supertest:

npm install --save-dev jest supertest mongodb-memory-server

2. Update package.json

Add the test script in your package.json:

"scripts": {
  "test": "jest"
}

3. Create Test File

Create app.test.js with the following content:

const request = require('supertest');
const express = require('express');
const mongoose = require('mongoose');
const { MongoMemoryServer } = require('mongodb-memory-server');
const app = express();

// Middleware setup
app.use(express.urlencoded({ extended: false }));
app.use(express.json());

// Model and routes definitions
const sleepData = new mongoose.Schema({
    userId: { type: Number, required: true },
    hours: { type: Number, required: true }
}, { timestamps: true });

const Sleep = mongoose.model("Sleep", sleepData);

app.get("/", (req, res) => {
    res.end("Welcome to sleep Data");
});

app.post("/sleep", async (req, res) => {
    const body = req.body;
    if (!body || !body.userId || !body.hours) {
        return res.status(400).json({ error: "All fields are required" });
    }
    const userSleepData = await Sleep.create({ userId: body.userId, hours: body.hours });
    return res.status(201).json({ message: "User created successfully" });
});

app.get("/sleep/:id", async (req, res) => {
    try {
        const userIdData = await Sleep.find({ userId: req.params.id }).sort({ createdAt: 1 });
        if (!userIdData || userIdData.length === 0) {
            return res.status(404).send({ message: "No sleep records found for this user" });
        }
        res.send(userIdData);
    } catch (error) {
        res.status(500).send({ message: "An error occurred while fetching sleep records" });
    }
});

app.delete("/sleep/:recordId", async (req, res) => {
    try {
        const result = await Sleep.findByIdAndDelete(req.params.recordId);
        if (!result) {
            return res.status(404).send({ message: "Sleep record not found" });
        }
        res.send({ message: "Sleep record deleted successfully" });
    } catch (error) {
        res.status(500).send({ message: "An error occurred while deleting the sleep record" });
    }
});

let mongoServer;

beforeAll(async () => {
    mongoServer = await MongoMemoryServer.create();
    const uri = mongoServer.getUri();
    await mongoose.connect(uri, { useNewUrlParser: true, useUnifiedTopology: true });
});

afterAll(async () => {
    await mongoose.disconnect();
    await mongoServer.stop();
});

describe("Test the sleep data API", () => {
    it("should return welcome message", async () => {
        const response = await request(app).get("/");
        expect(response.status).toBe(200);
        expect(response.text).toBe("Welcome to sleep Data");
    });

    it("should create a new sleep record", async () => {
        const response = await request(app).post("/sleep").send({
            userId: 1,
            hours: 8
        });
        expect(response.status).toBe(201);
        expect(response.body.message).toBe("User created successfully");
    });

    it("should return 400 for missing fields", async () => {
        const response = await request(app).post("/sleep").send({});
        expect(response.status).toBe(400);
        expect(response.body.error).toBe("All fields are required");
    });

    it("should get sleep records for a user", async () => {
        await request(app).post("/sleep").send({ userId: 1, hours: 8 });
        const response = await request(app).get("/sleep/1");
        expect(response.status).toBe(200);
        expect(response.body.length).toBeGreaterThan(0);
    });

    it("should return 404 if no sleep records found", async () => {
        const response = await request(app).get("/sleep/999");
        expect(response.status).toBe(404);
        expect(response.body.message).toBe("No sleep records found for this user");
    });

    it("should delete a sleep record", async () => {
        const record = await Sleep.create({ userId: 1, hours: 8 });
        const response = await request(app).delete(`/sleep/${record._id}`);
        expect(response.status).toBe(200);
        expect(response.body.message).toBe("Sleep record deleted successfully");
    });

    it("should return 404 if sleep record not found for deletion", async () => {
        const response = await request(app).delete("/sleep/507f1f77bcf86cd799439011");
        expect(response.status).toBe(404);
        expect(response.body.message).toBe("Sleep record not found");
    });
});

4. Run the Tests

npm test

This will execute all test cases and provide feedback on the functionality and edge cases of your API endpoints.

Additional Notes

  • The API uses MongoDB to store sleep records. Ensure MongoDB is properly set up and running before starting the server.
  • The tests use an in-memory MongoDB server provided by mongodb-memory-server for isolation and speed.

About

This project provides a simple RESTful API for managing sleep records using Node.js, Express, and MongoDB. The API supports creating, retrieving, and deleting sleep records for users.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published