Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,5 @@ config/production.env

*.log
*.log.*

.cursor/*
255 changes: 168 additions & 87 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,95 +1,176 @@
It's forked from https://github.com/Giveth/apiGive
# Notification Center
This is a microservice for managing notifications for both https://giveth.io and other Dapps notifications

[Used Technologies](#Used_Technologies)

[Installation](#Installation)

[Test](#Test)

[Logs](#Logs)

[Migrations](#Migrations)

[References](#References)

### Used_Technologies
* Nodejs **v16** (You can use `nvm use` command to load appropriate Node version by `nvm`)
* Typescript **v4.5.2**
* DB: postgres **v14.2**
* DB ORM: TypeORM **v0.3.6**
* Redis **v5.0.9**
* API protocol : REST
* Web application: Express **v4.17.3**
* Deployment: docker-compose **v3.3**
* API Documentation: Swagger
* Test framework: Mocha **v9.2.2**
* CI/CD tools : [GitHub Actions](https://github.com/Giveth/notification-center/blob/staging/.github/workflows/CI-CD.yml)

### Installation and Run

* `git clone git@github.com:Giveth/notification-center.git`
* `cd notification-center`
* `npm ci`
* Bringing up database, you can install that in other way, but I suggest
using docker `docker-compose -f docker-compose-local-postgres-redis.ym up -d`
* Creat a file named `development.env` based on [Env example file](./config/example.env) and put it in `./config`
* Run [Migrations](#Migrations)
* `npm start`
* Now you can browse [Swagger](http:localhost:3040/docs)

### Test
You should have a postgress instance up in order to running tests so you can use [Local DB docker-compose](./docker-compose-local-postgres-redis.ym)
* `npm run test`

### Logs

In localhost and test we put logs in console and file but in production and staging we just use file for writing logs You can see logs beautifully with this command

* `npm i -g bunyan`
* `tail -f logs/notification-center.log | bunyan`

### Migrations

#### Create new Migration file

```
typeorm migration:create ./migrations/createNotificationTable
## 1. Project Overview

### Purpose
The Notification Center is a microservice designed to manage notifications for Giveth.io and other DApps. It provides a centralized system for handling various types of notifications across different platforms.

### Key Features
- Centralized notification management
- Support for multiple DApps
- RESTful API interface
- Real-time notification delivery
- Customizable notification settings
- Integration with various blockchain platforms

### Live Links
- Production: [https://notification-center.giveth.io](https://notification-center.giveth.io)
- Staging: [https://notification-center-staging.giveth.io](https://notification-center-staging.giveth.io)

## 2. Architecture Overview

### System Diagram
```mermaid
graph TD
A[Client Applications] --> B[Notification Center API]
B --> C[PostgreSQL Database]
B --> D[Redis Cache]
B --> E[External Services]
E --> F[Blockchain Networks]
E --> G[Email Services]
E --> H[Push Notification Services]
```


#### Then you need to run the migrations like so

```
npm run db:migrate:run:local
```

#### If you want to revert last migration

```
npm run db:migrate:revert:local
```

#### Create Third party in DB
As we can't put inserting third parties in migration, I put a query sample here, we can use it in prod

```
INSERT INTO public.third_party(
"microService", secret, "isActive")
VALUES ('givethio', 'givethio_secret', true);
### Tech Stack
- **Runtime**: Node.js v16
- **Language**: TypeScript v4.5.2
- **Database**: PostgreSQL v14.2
- **ORM**: TypeORM v0.3.6
- **Caching**: Redis v5.0.9
- **API Framework**: Express v4.17.3
- **Containerization**: Docker Compose v3.3
- **Documentation**: Swagger/OpenAPI
- **Testing**: Mocha v9.2.2
- **CI/CD**: GitHub Actions

### Data Flow
1. Client applications send notification requests to the API
2. Requests are validated and processed through middleware
3. Notifications are stored in PostgreSQL
4. Real-time notifications are cached in Redis
5. Notifications are delivered to appropriate channels (email, push, etc.)

## 3. Getting Started

### Prerequisites
- Node.js v16 (use `nvm use` to load appropriate version)
- Docker and Docker Compose
- PostgreSQL v14.2
- Redis v5.0.9

### Installation Steps
1. Clone the repository:
```bash
git clone git@github.com:Giveth/notification-center.git
cd notification-center
```

2. Install dependencies:
```bash
npm ci
```

3. Set up the development environment:
```bash
docker-compose -f docker-compose-local-postgres-redis.yml up -d
```

4. Configure environment variables:
- Copy `config/example.env` to `config/development.env`
- Update the values in `development.env` as needed

5. Run database migrations:
```bash
npm run db:migrate:run:local
```

6. Start the development server:
```bash
npm start
```

7. Access the API documentation at [http://localhost:3040/docs](http://localhost:3040/docs)

## 4. Usage Instructions

### Running the Application
- Development: `npm start`
- Staging: `npm run start:server:staging`
- Production: `npm run start:server:production`

### Testing
```bash
# Run all tests
npm run test

# Run specific test files
npm run test:notificationRepository
npm run test:notificationSettingRepository
```

#### Local test
If you use mock jwt authentication adapter you can use accessToken
```
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwdWJsaWNBZGRyZXNzIjoiMHgxMUJFNTVGNGVBNDFFOTlBM2ZiMDZBRGRBNTA3ZDk5ZDdiYjBhNTcxIiwiZXhwaXJhdGlvbkRhdGUiOiIyMDIyLTA5LTIzVDA4OjA5OjA2LjQ1N1oiLCJqdGkiOiIxNjYxMzI4NTQ2NDU3LTc1YzNhNGI2YWUiLCJpYXQiOjE2NjEzMjg1NDYsImV4cCI6MTY2MzkyMDU0Nn0.Tdd2f7bCMtg3F1ojX1AQQpJ7smTU7vR7Nixromr0ju4
```
### Database Management
- Create new migration:
```bash
typeorm migration:create ./migrations/createNotificationTable
```
- Run migrations:
```bash
npm run db:migrate:run:local
```
- Revert last migration:
```bash
npm run db:migrate:revert:local
```

## 5. Deployment Process

### Environments
- **Development**: Local development environment
- **Staging**: Pre-production testing environment
- **Production**: Live production environment

### Deployment Steps
1. Build the application:
```bash
npm run build
```

2. Run database migrations:
```bash
npm run db:migrate:run:production
```

3. Start the server:
```bash
npm run start:server:production
```

### CI/CD Integration
The project uses GitHub Actions for continuous integration and deployment. The workflow is defined in `.github/workflows/CI-CD.yml`.

## 6. Troubleshooting

### Common Issues
1. **Database Connection Issues**
- Verify PostgreSQL is running
- Check environment variables
- Ensure migrations are up to date

2. **Redis Connection Issues**
- Verify Redis is running
- Check Redis configuration
- Ensure proper network connectivity

### Logs and Debugging
- Install bunyan for better log visualization:
```bash
npm i -g bunyan
```
- View logs:
```bash
tail -f logs/notification-center.log | bunyan
```

## References

I used these articles for writing project

* https://blog.logrocket.com/linting-typescript-using-eslint-and-prettier

* https://rsbh.dev/blog/rest-api-with-express-typescript
- [Linting TypeScript using ESLint and Prettier](https://blog.logrocket.com/linting-typescript-using-eslint-and-prettier)
- [REST API with Express TypeScript](https://rsbh.dev/blog/rest-api-with-express-typescript)