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

https://github.com/w1z2z/students-grades-api

This application represents a system for managing students and their grades using Nest.js, Prisma, Postgres, NATS, and Swagger. It subscribes to notifications about new student grades via NATS and saves the data in a database. It includes HTTP endpoints for retrieving a log of grades and student success statistics.
https://github.com/w1z2z/students-grades-api

docker nats nestjs postgresql prisma rest-api

Last synced: about 2 months ago
JSON representation

This application represents a system for managing students and their grades using Nest.js, Prisma, Postgres, NATS, and Swagger. It subscribes to notifications about new student grades via NATS and saves the data in a database. It includes HTTP endpoints for retrieving a log of grades and student success statistics.

Awesome Lists containing this project

README

          

# Students and Grades Management System

Стэк проекта: Nest.js, Prisma, Postgres, NATS, Swagger

## Алгоритм работы приложения

1. **Подключение к сервису NATS**: Приложение устанавливает соединение с сервером NATS, используя предоставленный IP-адрес и порт. В случае успешного подключения, приложение подписывается на топик `NatsTopicsEnum.STUDENT_GRADES_UPDATED`, чтобы получать уведомления о новых оценках студентов.

2. **Обработка уведомлений о новых оценках**:
- При получении уведомления о новой оценке, приложение распаковывает данные и извлекает информацию о студенте, предмете и оценке.
- Затем приложение отправляет запрос к сервису студентов через NATS для получения дополнительной информации о студенте.
- Полученные данные сохраняются в базу данных с помощью сервиса `StudentsGradesService`.

3. **HTTP-эндпоинты**:
- `/log`: Предоставляет лог оценок, отсортированный по дате. Поддерживает пагинацию через query-параметры.
- `/statistic/:personalCode`: Возвращает статистику успехов студента по всем предметам.

4. **Интерфейс NATS-топиков**:
- `NatsTopicsEnum.STUDENT_GRADES_UPDATED` (subscribe): Уведомление о новой оценке студента.
- `NatsTopicsEnum.GET_STUDENT_INFO` (request): Запрос на получение дополнительной информации о студенте.

## Установка и запуск

1. Создать файл .env и внести в него следующие данные (пример)
```yaml
PORT=8080

DATABASE_URL="postgresql://:@postgres:5432/students_grades"
NATS_URL=nats://:

POSTGRES_USER=
POSTGRES_PASSWORD=
POSTGRES_DB=students_grades
```
2. Запустить докер контейнеры
```bash
docker-compose up --build
```
3. Докуменация swagger доступна по адресу [http://localhost:8080/](http://localhost:8080/)

## Пример использования:

### 1) Запрос на получение журнала оценок (логов)

```http
GET http://localhost:8080/api/log?page=1&limit=10
```

Пример ответа:
```json
[
{
"date": "2024-02-16T14:39:45.215Z",
"subject": "music",
"grade": 4,
"student": {
"personalCode": "0425AB018373",
"name": "Jackie",
"lastName": "Thompson"
}
},
{
"date": "2024-02-16T14:40:00.220Z",
"subject": "geography",
"grade": 4,
"student": {
"personalCode": "9201CE420779",
"name": "Aaren",
"lastName": "Elliott"
}
},
{
"date": "2024-02-16T14:40:15.252Z",
"subject": "science",
"grade": 4,
"student": {
"personalCode": "9201CE420779",
"name": "Aaren",
"lastName": "Elliott"
}
}
]
```

### 2) Запрос на получение статистики студента по id

```http
GET http://localhost:8080/api/statistic/:personalCode
```

Пример ответа:
```json
{
"student": {
"personalCode": "9201CE420779",
"name": "Aaren",
"lastName": "Elliott"
},
"statistic": [
{
"subject": "geography",
"maxGrade": 4,
"minGrade": 4,
"avgGrade": 4,
"totalGrades": 1
},
{
"subject": "science",
"maxGrade": 4,
"minGrade": 4,
"avgGrade": 4,
"totalGrades": 1
}
]
}
```

## В целях улучшения кода можно выполнить следующие этапы:

1. **Улучшение производительности**:
- Оптимизация запросов к базе данных для сокращения времени ответа.
- Внедрение кэширования данных для ускорения доступа к часто используемой информации.

2. **Расширение функциональности**:
- Добавление возможности фильтрации и сортировки данных в API для повышения удобства использования.
- Введение аутентификации и авторизации для обеспечения безопасности данных и API.

3. **Расширение тестового покрытия**:
- Написание дополнительных юнит-тестов для поддержания стабильности функционала.
- Реализация тестов интеграции для проверки взаимодействия различных компонентов приложения.