Compare commits
No commits in common. '8613180c873c9bd84f8124149f6d5ec260b83c67' and '1f90fb794bb2684dfa09dbdd88f7bf399777c348' have entirely different histories.
8613180c87
...
1f90fb794b
13 changed files with 75 additions and 277 deletions
@ -1,151 +1,99 @@ |
|||||||
# CRUD |
<p align="center"> |
||||||
|
<a href="http://nestjs.com/" target="blank"><img src="https://nestjs.com/img/logo-small.svg" width="120" alt="Nest Logo" /></a> |
||||||
|
</p> |
||||||
|
|
||||||
|
[circleci-image]: https://img.shields.io/circleci/build/github/nestjs/nest/master?token=abc123def456 |
||||||
|
[circleci-url]: https://circleci.com/gh/nestjs/nest |
||||||
|
|
||||||
|
<p align="center">A progressive <a href="http://nodejs.org" target="_blank">Node.js</a> framework for building efficient and scalable server-side applications.</p> |
||||||
|
<p align="center"> |
||||||
|
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/v/@nestjs/core.svg" alt="NPM Version" /></a> |
||||||
|
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/l/@nestjs/core.svg" alt="Package License" /></a> |
||||||
|
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/dm/@nestjs/common.svg" alt="NPM Downloads" /></a> |
||||||
|
<a href="https://circleci.com/gh/nestjs/nest" target="_blank"><img src="https://img.shields.io/circleci/build/github/nestjs/nest/master" alt="CircleCI" /></a> |
||||||
|
<a href="https://coveralls.io/github/nestjs/nest?branch=master" target="_blank"><img src="https://coveralls.io/repos/github/nestjs/nest/badge.svg?branch=master#9" alt="Coverage" /></a> |
||||||
|
<a href="https://discord.gg/G7Qnnhy" target="_blank"><img src="https://img.shields.io/badge/discord-online-brightgreen.svg" alt="Discord"/></a> |
||||||
|
<a href="https://opencollective.com/nest#backer" target="_blank"><img src="https://opencollective.com/nest/backers/badge.svg" alt="Backers on Open Collective" /></a> |
||||||
|
<a href="https://opencollective.com/nest#sponsor" target="_blank"><img src="https://opencollective.com/nest/sponsors/badge.svg" alt="Sponsors on Open Collective" /></a> |
||||||
|
<a href="https://paypal.me/kamilmysliwiec" target="_blank"><img src="https://img.shields.io/badge/Donate-PayPal-ff3f59.svg" alt="Donate us"/></a> |
||||||
|
<a href="https://opencollective.com/nest#sponsor" target="_blank"><img src="https://img.shields.io/badge/Support%20us-Open%20Collective-41B883.svg" alt="Support us"></a> |
||||||
|
<a href="https://twitter.com/nestframework" target="_blank"><img src="https://img.shields.io/twitter/follow/nestframework.svg?style=social&label=Follow" alt="Follow us on Twitter"></a> |
||||||
|
</p> |
||||||
|
<!--[![Backers on Open Collective](https://opencollective.com/nest/backers/badge.svg)](https://opencollective.com/nest#backer) |
||||||
|
[![Sponsors on Open Collective](https://opencollective.com/nest/sponsors/badge.svg)](https://opencollective.com/nest#sponsor)--> |
||||||
|
|
||||||
|
## Description |
||||||
|
|
||||||
|
[Nest](https://github.com/nestjs/nest) framework TypeScript starter repository. |
||||||
|
|
||||||
|
## Project setup |
||||||
|
|
||||||
# Backend API for E-commerce Application |
```bash |
||||||
|
$ npm install |
||||||
This is a simple **Backend Service API** for a **E-commerce Application** with various endpoints built using **Nest.js**, **PostgreSQL** & **Sequelize**. |
``` |
||||||
|
|
||||||
--- |
|
||||||
|
|
||||||
## Features |
|
||||||
|
|
||||||
- Built with **Nest.js**. |
|
||||||
- **PostgreSQL** and **Sequelize** for database management. |
|
||||||
- Implements **JWT Authentication**. |
|
||||||
- RESTful APIs for user management: |
|
||||||
- Create, Read, Update, and Delete (CRUD) operations. |
|
||||||
|
|
||||||
--- |
|
||||||
|
|
||||||
## Technologies Used |
|
||||||
|
|
||||||
- **Nest.js** |
|
||||||
- **PostgreSQL** with **Sequelize** |
|
||||||
- **JWT** for authentication |
|
||||||
- **ARGON2** for password hashing |
|
||||||
|
|
||||||
--- |
|
||||||
|
|
||||||
## Installation and Setup |
|
||||||
|
|
||||||
### Prerequisites |
## Compile and run the project |
||||||
|
|
||||||
- Node.js and npm installed on your system. |
```bash |
||||||
- postgreSQL connection (local or cloud). |
# development |
||||||
|
$ npm run start |
||||||
|
|
||||||
### 1. Clone the Repository |
# watch mode |
||||||
|
$ npm run start:dev |
||||||
|
|
||||||
```bash |
# production mode |
||||||
git clone https://github.com/MahdiTajikKazemi/e-commerce-api-nestjs-postgres-sequelize |
$ npm run start:prod |
||||||
``` |
``` |
||||||
|
|
||||||
### 2. Setup Backend |
## Run tests |
||||||
|
|
||||||
1. Install dependencies: |
|
||||||
```bash |
|
||||||
npm install |
|
||||||
``` |
|
||||||
2. Create a `.env` file in the `backend` directory and configure it: |
|
||||||
```env |
|
||||||
Set your environment variables in .env.sample file. |
|
||||||
``` |
|
||||||
3. Start the server: |
|
||||||
```bash |
```bash |
||||||
npm run start:dev |
# unit tests |
||||||
``` |
$ npm run test |
||||||
|
|
||||||
## Usage |
# e2e tests |
||||||
|
$ npm run test:e2e |
||||||
|
|
||||||
1. Start the backend server. |
# test coverage |
||||||
2. Open your 'Postman' | 'insomnia' or whatever testing api app you are comfortable using and then begin hitting enpoints listed below. |
$ npm run test:cov |
||||||
|
``` |
||||||
|
|
||||||
--- |
## Deployment |
||||||
|
|
||||||
## API Endpoints |
When you're ready to deploy your NestJS application to production, there are some key steps you can take to ensure it runs as efficiently as possible. Check out the [deployment documentation](https://docs.nestjs.com/deployment) for more information. |
||||||
|
|
||||||
### Authentication |
If you are looking for a cloud-based platform to deploy your NestJS application, check out [Mau](https://mau.nestjs.com), our official platform for deploying NestJS applications on AWS. Mau makes deployment straightforward and fast, requiring just a few simple steps: |
||||||
|
|
||||||
- `POST /api/v1/auth/signup`: Register a new user and get a JWT token. |
```bash |
||||||
- `POST /api/v1/auth/login`: Login and get a JWT token. |
$ npm install -g mau |
||||||
|
$ mau deploy |
||||||
|
``` |
||||||
|
|
||||||
### User Management |
With Mau, you can deploy your application in just a few clicks, allowing you to focus on building features rather than managing infrastructure. |
||||||
|
|
||||||
- `GET /api/v1/users/`: Get a list of all users (admin only). |
## Resources |
||||||
- `POST /api/v1/users/`: Create a user (admin only). |
|
||||||
- `PATCH /api/v1/users/:id`: Update a specific user (admin only). |
|
||||||
- `DELETE /api/v1/users/:id`: Remove a specific user (admin only). |
|
||||||
- `GET /api/v1/users/:id`: Get a specific user (admin only). |
|
||||||
|
|
||||||
--- |
Check out a few resources that may come in handy when working with NestJS: |
||||||
|
|
||||||
## Folder Structure |
- Visit the [NestJS Documentation](https://docs.nestjs.com) to learn more about the framework. |
||||||
|
- For questions and support, please visit our [Discord channel](https://discord.gg/G7Qnnhy). |
||||||
|
- To dive deeper and get more hands-on experience, check out our official video [courses](https://courses.nestjs.com/). |
||||||
|
- Deploy your application to AWS with the help of [NestJS Mau](https://mau.nestjs.com) in just a few clicks. |
||||||
|
- Visualize your application graph and interact with the NestJS application in real-time using [NestJS Devtools](https://devtools.nestjs.com). |
||||||
|
- Need help with your project (part-time to full-time)? Check out our official [enterprise support](https://enterprise.nestjs.com). |
||||||
|
- To stay in the loop and get updates, follow us on [X](https://x.com/nestframework) and [LinkedIn](https://linkedin.com/company/nestjs). |
||||||
|
- Looking for a job, or have a job to offer? Check out our official [Jobs board](https://jobs.nestjs.com). |
||||||
|
|
||||||
``` |
## Support |
||||||
└── 📁src |
|
||||||
└── 📁core |
|
||||||
└── 📁constants |
|
||||||
└── index.ts |
|
||||||
└── 📁database |
|
||||||
└── database.config.ts |
|
||||||
└── database.module.ts |
|
||||||
└── database.providers.ts |
|
||||||
└── 📁interfaces |
|
||||||
└── dbConfig.interface.ts |
|
||||||
└── 📁modules |
|
||||||
└── 📁auth |
|
||||||
└── auth.controller.ts |
|
||||||
└── auth.module.ts |
|
||||||
└── auth.service.ts |
|
||||||
└── jwt.strategy.ts |
|
||||||
└── local.strategy.ts |
|
||||||
└── 📁orders |
|
||||||
└── 📁dto |
|
||||||
└── create-order.dto.ts |
|
||||||
└── index.ts |
|
||||||
└── update-order.dto.ts |
|
||||||
└── 📁entities |
|
||||||
└── order-status.entity.ts |
|
||||||
└── order.entity.ts |
|
||||||
└── order-statuses.providers.ts |
|
||||||
└── orders.controller.ts |
|
||||||
└── orders.module.ts |
|
||||||
└── orders.providers.ts |
|
||||||
└── orders.service.ts |
|
||||||
└── 📁products |
|
||||||
└── 📁dto |
|
||||||
└── create-product.dto.ts |
|
||||||
└── index.ts |
|
||||||
└── update-product.dto.ts |
|
||||||
└── 📁entities |
|
||||||
└── product.entity.ts |
|
||||||
└── products.controller.ts |
|
||||||
└── products.module.ts |
|
||||||
└── products.providers.ts |
|
||||||
└── products.service.ts |
|
||||||
└── 📁users |
|
||||||
└── 📁dto |
|
||||||
└── create-user.dto.ts |
|
||||||
└── index.ts |
|
||||||
└── update-user.dto.ts |
|
||||||
└── 📁entities |
|
||||||
└── user.entity.ts |
|
||||||
└── users.controller.ts |
|
||||||
└── users.module.ts |
|
||||||
└── users.providers.ts |
|
||||||
└── users.service.ts |
|
||||||
└── app.controller.ts |
|
||||||
└── app.module.ts |
|
||||||
└── app.service.ts |
|
||||||
└── main.ts |
|
||||||
``` |
|
||||||
|
|
||||||
## Future Enhancements |
Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please [read more here](https://docs.nestjs.com/support). |
||||||
|
|
||||||
- Integrate redis for cashing |
## Stay in touch |
||||||
|
|
||||||
--- |
- Author - [Kamil Myśliwiec](https://twitter.com/kammysliwiec) |
||||||
|
- Website - [https://nestjs.com](https://nestjs.com/) |
||||||
|
- Twitter - [@nestframework](https://twitter.com/nestframework) |
||||||
|
|
||||||
## License |
## License |
||||||
|
|
||||||
This project is licensed under the MIT License. |
Nest is [MIT licensed](https://github.com/nestjs/nest/blob/master/LICENSE). |
||||||
|
|
||||||
Mahdi Tajik Kazemi |
|
||||||
|
@ -1,3 +0,0 @@ |
|||||||
export class UpdateWalletDto { |
|
||||||
amount: number; |
|
||||||
} |
|
@ -1,26 +0,0 @@ |
|||||||
import { |
|
||||||
Table, |
|
||||||
Column, |
|
||||||
Model, |
|
||||||
DataType, |
|
||||||
ForeignKey, |
|
||||||
BelongsTo, |
|
||||||
} from 'sequelize-typescript'; |
|
||||||
import { User } from 'src/modules/users/entities/user.entity'; |
|
||||||
|
|
||||||
@Table({ tableName: 'wallets', createdAt: false }) |
|
||||||
export class Wallet extends Model<Wallet> { |
|
||||||
@Column({ |
|
||||||
type: DataType.FLOAT, |
|
||||||
allowNull: false, |
|
||||||
defaultValue: 0, |
|
||||||
}) |
|
||||||
balance: number; |
|
||||||
|
|
||||||
@ForeignKey(() => User) |
|
||||||
@Column |
|
||||||
userId: number; |
|
||||||
|
|
||||||
@BelongsTo(() => User) |
|
||||||
user: User; |
|
||||||
} |
|
@ -1,24 +0,0 @@ |
|||||||
import { Body, Controller, Get, Param, Patch } from '@nestjs/common'; |
|
||||||
import { WalletsService } from './wallets.service'; |
|
||||||
import { UUID } from 'crypto'; |
|
||||||
import { UpdateWalletDto } from './dto/update-wallet.dto'; |
|
||||||
|
|
||||||
@Controller('wallets') |
|
||||||
export class WalletsController { |
|
||||||
constructor(private readonly walletsService: WalletsService) {} |
|
||||||
|
|
||||||
@Get('balance/:id') |
|
||||||
getWallet(@Param('id') id: UUID) { |
|
||||||
return this.walletsService.getWallet(id); |
|
||||||
} |
|
||||||
|
|
||||||
@Patch('deposit/:id') |
|
||||||
deposit(@Param('id') id: UUID, @Body() updateWalletDto: UpdateWalletDto) { |
|
||||||
return this.walletsService.deposit(id, updateWalletDto); |
|
||||||
} |
|
||||||
|
|
||||||
@Patch('withdraw/:id') |
|
||||||
withdraw(@Param('id') id: UUID, @Body() updateWalletDto: UpdateWalletDto) { |
|
||||||
return this.walletsService.withdraw(id, updateWalletDto); |
|
||||||
} |
|
||||||
} |
|
@ -1,11 +0,0 @@ |
|||||||
import { Module } from '@nestjs/common'; |
|
||||||
import { WalletsService } from './wallets.service'; |
|
||||||
import { WalletsController } from './wallets.controller'; |
|
||||||
import { walletsProviders } from './wallets.providers'; |
|
||||||
|
|
||||||
@Module({ |
|
||||||
controllers: [WalletsController], |
|
||||||
providers: [WalletsService, ...walletsProviders], |
|
||||||
exports: [WalletsService], |
|
||||||
}) |
|
||||||
export class WalletsModule {} |
|
@ -1,9 +0,0 @@ |
|||||||
import { Wallet } from './entities/wallet.entity'; |
|
||||||
import { WALLET_REPOSITORY } from '../../core/constants'; |
|
||||||
|
|
||||||
export const walletsProviders = [ |
|
||||||
{ |
|
||||||
provide: WALLET_REPOSITORY, |
|
||||||
useValue: Wallet, |
|
||||||
}, |
|
||||||
]; |
|
@ -1,45 +0,0 @@ |
|||||||
import { BadRequestException, Inject, Injectable } from '@nestjs/common'; |
|
||||||
import { UUID } from 'crypto'; |
|
||||||
import { WALLET_REPOSITORY } from 'src/core/constants'; |
|
||||||
import { Wallet } from './entities/wallet.entity'; |
|
||||||
import { User } from '../users/entities/user.entity'; |
|
||||||
import { UpdateWalletDto } from './dto/update-wallet.dto'; |
|
||||||
|
|
||||||
@Injectable() |
|
||||||
export class WalletsService { |
|
||||||
constructor( |
|
||||||
@Inject(WALLET_REPOSITORY) private readonly walletRepository: typeof Wallet, |
|
||||||
) {} |
|
||||||
|
|
||||||
async getWallet(id: UUID) { |
|
||||||
return await this.walletRepository.findAll({ |
|
||||||
include: { |
|
||||||
model: User, |
|
||||||
where: { uuid: id }, |
|
||||||
attributes: ['firstName'], |
|
||||||
}, |
|
||||||
}); |
|
||||||
} |
|
||||||
|
|
||||||
async deposit(id: UUID, updateWalletDto: UpdateWalletDto) { |
|
||||||
const { amount } = updateWalletDto; |
|
||||||
|
|
||||||
if (amount < 0) throw new BadRequestException(); |
|
||||||
|
|
||||||
const [wallet] = await this.getWallet(id); |
|
||||||
|
|
||||||
wallet.balance += amount; |
|
||||||
return wallet.save(); |
|
||||||
} |
|
||||||
|
|
||||||
async withdraw(id: UUID, updateWalletDto: UpdateWalletDto) { |
|
||||||
const { amount } = updateWalletDto; |
|
||||||
|
|
||||||
if (amount < 0) throw new BadRequestException(); |
|
||||||
|
|
||||||
const [wallet] = await this.getWallet(id); |
|
||||||
|
|
||||||
wallet.balance -= amount; |
|
||||||
return wallet.save(); |
|
||||||
} |
|
||||||
} |
|
Loading…
Reference in new issue