An open API service indexing awesome lists of open source software.

https://github.com/afek-sakaju/cooking-recipes-server

A server-side project offering RESTful APIs with secure, encrypted password authentication. Users can log in, register, and manage recipe data via CRUD operations. The project includes comprehensive Swagger documentation for all APIs and full test coverage.
https://github.com/afek-sakaju/cooking-recipes-server

aggregations bcrypt cooking-recipes dotenv express jest mongo-migrate mongodb mongodb-memory-server mongoose nodejs nodemon pagination passport recipes swagger winston-logger

Last synced: 5 months ago
JSON representation

A server-side project offering RESTful APIs with secure, encrypted password authentication. Users can log in, register, and manage recipe data via CRUD operations. The project includes comprehensive Swagger documentation for all APIs and full test coverage.

Awesome Lists containing this project

README

          

# Cooking Recipes Server

### This server-side project embodies my extensive knowledge of backend development, as it has been executed with adherence to best practices, standards, and strict guidelines.

---

This server side project stores data in the database and makes it accessible with **REST APIs**, that are written in _NodeJS and typescript_ language, with _express ts_ for the server.


The project includes the following APIs :

| For authentication and users | For recipes data |
| ----------------------------------- | ----------------------------------------------------- |
| + Register user | + Get recipe by name |
| + Login user | + Get list of all the recipes |
| + Logout user | + Get recipes list by query filters and sortable data |
| + Update user's data |   - Authentication is required |
|   - Authentication is required |   - Pagination included in the response |
| | + Create a new recipe |
| |   - Authentication is required |
| | + Update existing recipe data |
| |   - Authentication is required |
| | + Delete existing recipe |
| |   - Authentication is required |

### In addition, the project boasts extensive Swagger API documentation, covering all the REST APIs mentioned above, accessible at:
`http://localhost:3000/swagger`

**NOTE:**
Certain APIs necessitate authentication, requiring users to log in before executing them. These authenticated APIs are denoted by a lock symbol.

![APIs that require authentication](readme-resources/swagger-auth.png)

---

**Requirements**

- _NodeJS_ version 16.4+
- _MongoDB service_ version 6.0.1+

**Command lines**

- **The command to init and install project**
- `npm install`
- **The command to run the project**
- `npm run start`
(executing migrations, building the TypeScript code, and running the compiled JavaScript project)
- Additional commands that are optional
- `npm run migrationDB`

(runs only migration)
- `npm run dev`
(runs _typescript_ code for development with _nodemon_)
- `npm run test`
(runs only tests with _jest_ + _supertest_ for APIs tests)

---

### Test Coverage:

## ![coverage](readme-resources/coverage.png)

### The technologies used in this project include:

- [x] _**Nodejs**_ : the project is _javascript_ based.
- [x] _**TypeScript**_ : the project has been implemented using _**typescript**_ interfaces, `.d.ts` declarations files, etc..
- [x] _**Express**_ : used for the server side routers, middlewares, controllers, and services.
- [x] _**MongoDB**_ : utilized with the _**mongoose**_ library for defining schemas and models, which are then utilized in the controllers and services.
- [x] _**Passport**_ : authentication with _**passport-local**_ strategy `{username, password}` for request body.
- [x] _**Bcrypt**_ : user passwords are securely **encrypted** in accordance with **best practices** to ensure **data security**.
- [x] _**Migrate-Mongo**_ : the **migrations** ensure that the MongoDB database has the latest updates of the data before running the project, they also handle important database initializations, including user creation and mocked recipes.
- [x] _**Swagger**_ : the `/swagger` URL provides comprehensive **API documentation** and instructions for testing and debugging APIs,this functionality is available in non-production environments (for development), the project also utilizes _**mongoose-to-swagger**_ to transform mongoose models into Swagger schema docs.
- [x] _**Logger**_ : utilizes colorized _**Winston**_ logs with request ID (UUID) for recording server activities stored in daily rotating files (_**winston-daily-rotate-file**_).
- [x] _**DotEnv**_ : utilizes _**dotenv**_ files to manage environment variables, and incorporates _**dotenv-expand**_ to enhance flexibility in the env files.

### Additional technologies used as development tools include:

- [x] _**ESLINT**_ : the project adheres to the _**ESLint**_ guidelines and follows the best practices recommended by **airbnb**.
- [x] _**Jest**_ : Comprehensive _**typescript**_ tests for thorough validation of all services and functions with **full tests coverage**, including password encryption, models, services, and router APIs, have been implemented using the _**supertest**_ package.
- [x] _**Mongodb-Memory-Server**_ : running tests on an in-memory database, allowing for efficient and isolated testing.
- [x] _**Nodemon**_ : watches for _**typescript**_ file changes and compiles them in real-time.

### In addition, the project incorporates the following features:

- [x] **RESTful APIs** : this server-side project includes _**RESTful APIs**_ that follows **best practices** in API design , facilitate efficient data retrieval and manipulation through well-designed endpoints, promoting effective server communication.
- [x] **Aggregations** : a fully featured aggregate request filters recipes based on **query parameters**, populates the recipe by its creator, and supports **data limiting, offsetting, and sorting options**.
- [x] **Server Side Pagination** : the project implements **pagination** for the aggregation result data, enabling fetching a limited number of items based on the provided page number and items per page parameters.

```json
{
"pagination": {
"totalItems": 487,
"page": 5,
"itemsPerPage": 20,
"totalPages": 25
},
"data": [...]
}
```

- [x] **_Mongoose_ schema hooks** : incorporates a pre-save hook that encrypts the user's password before creating a new user.
- [x] **HTTP Status Codes** : HTTP request responses return the appropriate and correct status codes.
- [x] **Override toJSON data** : exclude the password from the user object when it is returned as JSON.
- [x] **_Postman collection_** : _postman_ collection for simplified testing and interaction with the project's APIs :
`cooking-recipes-server-rest-api.postman_collection.json`

## Author

:octocat: **Afek Sakaju**

- LinkedIn: [@afeksa](https://www.linkedin.com/in/afeksa/)
- GitHub: [@Afek-Sakaju](https://github.com/Afek-Sakaju)