Веб-приложение для обработки CSV файлов с метриками, построенное на ASP.NET Core с использованием TimescaleDB для хранения временных рядов данных.
- Загрузка и обработка CSV файлов формата: `Date;ExecutionTime;Value`
- Валидация данных и обработка ошибок
- Хранение временных рядов в TimescaleDB (гипертаблицы)
- Агрегация данных и вычисление статистики
- Гибкая фильтрация результатов через API
- Полная документация API через Swagger
csv Date;ExecutionTime;Value 2024-01-15T10:30:00;1500;123.45 2024-01-15T11:00:00;1200;678.90
- ASP.NET Core 9.0 - веб-фреймворк
- Entity Framework Core 9.0 - ORM с поддержкой TimescaleDB
- TimescaleDB (PostgreSQL 15+) - база данных для временных рядов
- Npgsql - драйвер PostgreSQL для .NET
- Swashbuckle.AspNetCore - генерация OpenAPI документации
Presentation Layer (Controllers)
↓
Business Logic Layer (Services)
↓
Data Access Layer (DataAccess)
↓
Database (TimescaleDB)
InfotecsTestTask/
│
├── src/
│ ├── Abstract/ # Интерфейсы
│ │ ├── IFileProcessingConfiguration.cs
│ │ ├── IFileProcessingService.cs
│ │ └── IFileProcessorFactory.cs
│ │
│ ├── Controllers/ # API контроллеры
│ │ └── FilesController.cs # Основной контроллер для работы с файлами
│ │
│ ├── DataAccess/ # Доступ к данным
│ │ └── AppDbContext.cs # Контекст Entity Framework
│ │
│ ├── DTOs/ # Data Transfer Objects
│ │ ├── FileProcessingResult.cs # Результат обработки файла
│ │ ├── ProcessedData.cs # Обработанные данные
│ │ └── ResultFilterDto.cs # DTO для фильтрации результатов
│ │
│ ├── Entities/ # Сущности базы данных
│ │ ├── Result.cs # Агрегированные результаты
│ │ └── Values.cs # Исходные значения (гипертаблица)
│ │
│ ├── Exceptions/ # Кастомные исключения
│ │ └── CsvValidationException.cs # Исключение валидации CSV
│ │
│ ├── Migrations/ # Миграции Entity Framework
│ │
│ ├── Services/ # Бизнес-логика
│ │ ├── ConcreteServices/
│ │ │ └── CsvProcessingService.cs # Реализация обработки CSV
│ │ │
│ │ ├── Configuration/
│ │ │ └── FileProcessingConfigurationService.cs # Сервис конфигурации
│ │ │
│ │ ├── Factories/
│ │ │ └── FileProcessorFactory.cs # Фабрика для обработчиков файлов
│ │ │
│ │ └── UniversalFileProcessingService.cs # Основной сервис обработки
│ │
│ ├── appsettings.json # Основная конфигурация
│ ├── appsettings.Development.json # Конфигурация для разработки
│ └── Program.cs # Точка входа приложения
│
├── tests/
│ ├── IntegrationTests/ # Тесты эндпоинтов
│ │ └── Controllers/ # Контроллеры
│ │ │
│ │ └── FilesControllerDockerTests.cs # Тест контроллера для работы с файлами (подключение к PG в docker контейнере)
│ │
│ └── UnitTests/ # Юнит-тесты для тестирования основных сервисов
│ └── Services/ # Сервисы
│ └── ConcreteServices/
│ │ │
│ │ ├── CsvProcessingServiceTests.cs # Тесты сервиса для обработки CSV файлов
│ │ └── TestFormFile.cs # форм-файл для теста csv сервиса
│ │
│ ├── Configuration/ # Конфигурации для процессоров
│ │ └── FileProcessingConfigurationServiceTests.cs # Тест для проверки поддерживаемых форматов
│ │
│ └── Factories/ # Фабрики
│ └── FakeProcessors/ # Процессоры для тестов
│ │ └── FakeProcessorCsv.cs # Процессор для тестирования csv (поддерживается системой)
│ │ └── FakeProcessorTxt.cs # Процессор для тестирования txt (не поддерживается системой)
│ │
│ └── FileProcessorFactoryTests.cs # Тестирование фабрики для выбора процессора
│
└── docker-compose.yml # Конфигурация Docker Compose
└── README.md # Описание системы
1. FilesController - обрабатывает все HTTP запросы:
- UploadFile() - загрузка и обработка CSV файлов
- GetResults() - получение агрегированных данных с фильтрацией
- GetLatestValues() - получение последних значений по файлу
2. UniversalFileProcessingService - основной сервис обработки:
- Координирует весь процесс обработки файла
- Управляет удалением старых данных и сохранением новых
- Вызывает вычисление статистики
AppDbContext - контекст базы данных:
- Настроен для работы с TimescaleDB
- Values настроена как гипертаблица для эффективного хранения временных рядов
- Results содержит агрегированные данные
Доступ к документации API: Swagger UI: https://localhost:7141/swagger
Основные endpoint'ы: 1. Загрузка CSV файла http POST /api/Files/upload Content-Type: multipart/form-data
Параметры:
- file: CSV файл в формате Date;ExecutionTime;Value
-
Получение агрегированных результатов http GET /api/Files/results Параметры: - fileName: фильтр по имени файла (частичное совпадение) - minDateFrom, minDateTo: диапазон дат начала измерений - averageValueFrom, averageValueTo: диапазон средних значений - averageExecutionTimeFrom, averageExecutionTimeTo: диапазон среднего времени выполнения
-
Получение последних значений http GET /api/Files/{fileName}/values/latest/{n?} Параметры: - fileName: имя файла - n: количество записей (необязательный, по умолчанию 10, максимум 100) Примеры использования: Загрузка файла через curl: bash curl -X POST "https://localhost:7141/api/Files/upload"
-H "Content-Type: multipart/form-data"
-F "file=@test.csv" Получение результатов с фильтрацией: bash curl "https://localhost:7141/api/Files/results?fileName=test.csv&averageValueFrom=100&averageValueTo=500" Получение последних 10 значений: bash curl "https://localhost:7141/api/Files/test.csv/values/latest/10"