Учебный проект по дисциплине «Конструирование программного обеспечения».
Решение построено в виде трёх микросервисов:
- Gateway.Api — шлюз, через который к системе обращается клиент (преподаватель / студент).
- FileService.Api — сервис хранения файлов студенческих работ.
- AnalysisService.Api — сервис анализа работ и фиксации фактов плагиата (упрощённый мок).
Все проекты написаны на .NET 8 / ASP.NET Core Web API и используют SQLite через Entity Framework Core.
- Студент отправляет файл своей работы через Gateway.Api.
- Gateway:
- сохраняет информацию о сдаче в своей БД;
- в архитектурной модели предполагается взаимодействие с FileService.Api (хранение файла) и AnalysisService.Api (проверка текста на плагиат);
- возвращает клиенту результат: статус проверки, флаг плагиата, ссылку на оригинальную работу (если найден плагиат).
- Преподаватель запрашивает отчёт по конкретному заданию в Gateway.Api и получает список всех работ и отметку, какие из них считаются плагиатом.
В учебной реализации логика проверки плагиата упрощена: плагиатом считается повторная сдача того же задания тем же студентом (связь по
StudentId+AssignmentId). Это демонстрирует архитектуру и базовую бизнес-логику.
Gateway.sln
├─ Gateway.Api/ # API-шлюз: загрузка работ и получение отчётов
│ ├─ Controllers/
│ │ └─ WorksController.cs
│ ├─ Data/
│ │ └─ GatewayDbContext.cs
│ ├─ Models/
│ │ ├─ Submission.cs
│ │ ├─ SubmissionUploadRequest.cs
│ │ ├─ SubmissionResponseDto.cs
│ │ └─ ReportItemDto.cs
│ └─ Program.cs
│
├─ FileService.Api/ # сервис хранения файлов
│ ├─ Controllers/
│ │ └─ FileController.cs
│ ├─ Data/
│ │ └─ FileServiceDbContext.cs
│ ├─ Models/
│ │ └─ FileRecord.cs
│ └─ Program.cs
│
└─ AnalysisService.Api/ # сервис анализа/плагиата (упрощённый мок)
├─ Controllers/
│ └─ AnalysisController.cs
├─ Models/
│ ├─ AnalysisRequestDto.cs
│ └─ AnalysisResponseDto.cs
├─ Services/
│ └─ TextAnalysisService.cs
└─ Program.cs
Каждый сервис — отдельный ASP.NET Core Web API-проект c собственным Program.cs, (где нужно) DbContext и Swagger-документацией.
- .NET 8.0
- ASP.NET Core Web API
- Entity Framework Core 8 + SQLite
- Swagger (Swashbuckle) для интерактивного тестирования API
- Паттерн API Gateway + микросервисы
Хранит информацию о сдачах работ:
Id— int, первичный ключAssignmentId— int, ID заданияStudentName— string, имя студентаStudentId— string, идентификатор студентаFileId— string, идентификатор файла (GUID, который вернул FileService)Status— string, статус проверки (DONEи т.п.)IsPlagiarism— bool?, флаг плагиатаPlagiarizedFromSubmissionId— int?, ID работы-оригиналаCreatedAt,UpdatedAt— дата создания и обновления записи
Хранит метаданные по загруженным файлам:
Id— GUID файла (используется как внешний ключ в Gateway)FileName— исходное имя файлаContentType— MIME-типStoragePath— путь к файлу на дискеCreatedAt— дата загрузки
В учебной реализации AnalysisService не работает с БД — это мок.
Логика анализа инкапсулирована в TextAnalysisService и может быть заменена на настоящую проверку в будущем (например, сравнение текстов, поиск совпадений и т.п.).
- Visual Studio 2022 (Community)
с рабочей нагрузкой «ASP.NET и веб-разработка» - .NET SDK 8.0+
git clone https://github.com/Shkundin/Gateway.git
cd GatewayОткройте файл решения Gateway.sln в Visual Studio:
- Файл → Открыть → Проект/Решение
В обозревателе решений должны быть три проекта:
Gateway.ApiFileService.ApiAnalysisService.Api
- В обозревателе решений ПКМ по решению → Свойства.
- В разделе Запускаемый проект (Startup Project) выбрать:
- «Несколько запускаемых проектов (Multiple startup projects)».
- Для всех трёх проектов (
Gateway.Api,FileService.Api,AnalysisService.Api) установить действие «Запустить (Start)». - Нажать ОК.
- Нажмите F5 или «Запуск без отладки».
- Должны открыться три окна браузера со Swagger UI, по одному на каждый сервис.
Ниже приведены ключевые эндпоинты. Порты (7xxx, 6xxx, 5xxx) могут отличаться.
Базовый адрес (пример):
https://localhost:7xxx/swagger/index.html
POST /api/works/{assignmentId}/submissionsПараметр пути:
assignmentId— ID задания (целое)
Тело запроса (multipart/form-data):
File— файл работы (обязателен)StudentName— имя студентаStudentId— идентификатор студента
Пример успешного ответа (200 OK):
{
"submissionId": 1,
"status": "DONE",
"isPlagiarism": false,
"plagiarizedFromSubmissionId": null
}Если тот же студент повторно сдаёт то же задание:
{
"submissionId": 2,
"status": "DONE",
"isPlagiarism": true,
"plagiarizedFromSubmissionId": 1
}GET /api/works/{assignmentId}/reportsПример ответа:
{
"assignmentId": 1,
"reports": [
{
"submissionId": 1,
"studentName": "Иван Иванов",
"studentId": "st_001",
"status": "DONE",
"isPlagiarism": false,
"plagiarizedFromSubmissionId": null
},
{
"submissionId": 2,
"studentName": "Иван Иванов",
"studentId": "st_001",
"status": "DONE",
"isPlagiarism": true,
"plagiarizedFromSubmissionId": 1
}
]
}Базовый адрес (пример):
https://localhost:6xxx/swagger/index.html
POST /api/FileПараметры:
file— файл (форматIFormFile)
Пример ответа:
{
"fileId": "d3c61b85-74a0-4c3b-97f1-5bca981e7b3f",
"fileName": "work1.txt"
}GET /api/File/{id}Параметр пути:
id— GUID файла, который вернулся при загрузке.
Возвращает содержимое файла с корректным Content-Type.
Базовый адрес (пример):
https://localhost:5xxx/swagger/index.html
POST /api/AnalysisТело запроса:
{
"text": "какой-то текст работы"
}Пример ответа:
{
"isPlagiarism": false,
"similarityScore": 0.0
}В учебной реализации всегда возвращается «не плагиат», реальная логика могла бы сравнивать хеши или использовать алгоритмы анализа текста.
-
Запустить все три сервиса.
-
Открыть Swagger Gateway.Api.
-
В разделе Works вызвать:
POST /api/works/{assignmentId}/submissions
с
assignmentId = 1и данными студента. -
Ещё раз вызвать тот же метод для того же
StudentIdиassignmentId(можно с тем же файлом). -
Вызвать:
docker compose up --build
```http
GET /api/works/1/reports- первая запись — оригинал (
isPlagiarism: false); - вторая запись — плагиат (
isPlagiarism: true,plagiarizedFromSubmissionId— ID первой работы).
- Реализовать реальное взаимодействие
Gateway → FileService → AnalysisService(через HTTP-клиенты, а не через мок). - Вынести строки подключения в
appsettings.jsonвсех сервисов. - Добавить аутентификацию и авторизацию (роли «преподаватель» / «студент»).
- Заменить примитивную логику анализа на настоящий алгоритм поиска плагиата.
Проект создан в учебных целях в рамках курса по КПО.
Условия повторного использования и копирования зависят от требований преподавателя/вуза.