Это API, разработанное для управления показаниями клиентов по различным услугам. Приложение использует Node.js, TypeScript, Prisma, Express.js и другие технологии для обеспечения надежного и масштабируемого бэкенда.
- 📏 Приложение Precision на React - Интерфейс для учета показаний газа и воды
- Node.js: Среда выполнения JavaScript на стороне сервера.
- TypeScript: Суперсет JavaScript, добавляющий статическую типизацию в код.
- Express.js: Минималистичный веб-фреймворк для Node.js.
- Prisma: ORM, который упрощает доступ к базе данных.
- MySQL: Используемая база данных в процессе разработки.
- ESLint: Инструмент для линтинга, помогающий поддерживать код в чистоте и стандарте.
- Jest: Фреймворк для тестирования, используемый для обеспечения качества кода.
- Mocha: Используется для дополнительных тестов.
- Google Generative AI: Интегрирован для анализа изображений счетчиков и извлечения числовых значений показаний.
- Swagger: Интегрирован для генерации документации для маршрутов.
Проект следует модульной структуре для облегчения обслуживания и масштабируемости. Основные папки и файлы:
src/
: Содержит исходный код приложения.controllers/
: Логика управления, где обрабатываются запросы.db/
: Генерирует экземпляр Prisma для подключения к базе данных для всего приложения.exceptions/
: Создает пользовательские исключения для обработки ошибок во время выполнения приложения.interfaces/
: Создает интерфейсы и типы для управления параметрами и возвращаемыми значениями функций.middlewares/
: Промежуточные функции для проверок и обработки.models/
: Логика подключения к базе данных.services/
: Уровень сервисов, взаимодействующий с Prisma и выполняющий бизнес-операции.routes/
: Определение маршрутов API.utils/
: Утилитарные функции, такие как работа с изображениями и взаимодействие с API Google Generative AI.tests/
: Автоматизированные тесты для проверки функциональности.
- Список показаний: Позволяет просматривать все показания конкретного клиента с фильтрацией по типу показания.
- Управление изображениями: Изображения показаний сохраняются и извлекаются через временные URL-адреса, используя Base64.
- Проверка параметров: Промежуточное ПО для проверки входных параметров, обеспечивающее целостность запросов.
- Анализ изображений с помощью Google Generative AI: API анализирует изображения показаний и извлекает значение потребления.
- Node.js
- Docker (опционально для окружения разработки)
-
Клонируйте репозиторий:
git clone https://github.com/SamuelRocha91/apiShopper.git cd apiMeasureWaterAndGas
-
Установите зависимости:
npm install
-
Настройте переменные окружения:
- Создайте файл
.env
с необходимыми конфигурациями. - Пример:
DATABASE_URL="file:./dev.db" GEMINI_API_KEY="ваш_api_ключ_google" HOST="http://localhost:3000"
- Создайте файл
-
Выполните миграции базы данных:
npx prisma migrate dev
-
Запустите сервер:
npm run dev
Вы можете запустить проект с использованием Docker. Для этого выполните:
docker-compose up --build
start
: Запускает приложение.dev
: Запускает приложение в режиме разработки.build
: Компилирует код TypeScript в JavaScript.lint
: Запускает ESLint для проверки соответствия кода.lint:fix
: Запускает ESLint и автоматически исправляет проблемы.prisma:generate
: Генерирует типы Prisma.prisma:migrate
: Выполняет миграции базы данных.prisma:seed
: Заполняет базу данных начальными данными.docker
: Устанавливает зависимости, генерирует типы Prisma, выполняет миграции и запускает сервер с использованием Nodemon.test
: Запускает все тесты с использованием Mocha и Jest.
Утилитарные функции для сохранения и генерации URL-адресов для изображений:
saveBase64Image
: Сохраняет изображение в формате Base64 в файл на сервере.getImageUrl
: Генерирует временный URL для доступа к изображению.extractMimeType
: Извлекает тип MIME из изображения в формате Base64.extractSize
: Вычисляет размер изображения в формате Base64.
Функция checkMeasureValue
использует Google Generative AI для анализа изображений показаний и извлечения значения потребления.
async function checkMeasureValue(mime: string, base64: string): Promise<number> {
const result = await model.generateContent([
{
inlineData: {
mimeType: mime,
data: base64
}
},
]);
return result.content?.[0]?.text ?? 0;
}