ПОДРОБНО О ПРОЕКТЕ
Insurance Management API
Бизнес-правила и предсказуемая запись данных в личном API на .NET.
Задача
Управлять клиентами и жизненным циклом полисов, обрабатывая повторные запросы и конфликтующие изменения.
Моя роль
В этом личном проекте я реализовала backend, бизнес-правила и тесты API.
Решение
API на .NET 8 для управления клиентами и жизненным циклом полисов автострахования, здоровья и жизни. Бизнес-правила, предсказуемые ошибки и надёжная запись данных.
Посмотреть в действии
API управления
страхованием
API на .NET 8 для управления клиентами и жизненным циклом полисов автострахования, здоровья и жизни. Бизнес-правила, предсказуемые ошибки и надёжная запись данных.
Личный проект · Реализация backend, бизнес-правила и тесты API.
Попробовать интерактивный пример Посмотреть репозиторийПовторный запрос возвращает тот же полис. Система сообщает о конфликтующих изменениях и сохраняет историю действий с полисом.
Технические подробности
- 01APIВалидация · аутентификация · HTTP
- 02Домен и сервисыПравила полисов · жизненный цикл · идемпотентность
- 03Хранение данныхEF Core · ограничения SQL · события аудита
409Устаревшие записи и конфликтующие запросы возвращают понятные ошибки.
Технические решения
Безопасные повторы
Эндпоинты выпуска и отмены принимают ключ идемпотентности. Тот же ключ и данные возвращают исходный результат; изменённые данные вызывают конфликт.
Правила на двух уровнях
У клиента может быть не более одного активного автомобильного полиса. Это правило защищают проверки сервисов и фильтрованный уникальный индекс SQL.
Параллельные изменения
Токен версии строки выявляет устаревшие обновления полиса: возвращается конфликт вместо незаметной перезаписи чужого изменения.
Прослеживаемый жизненный цикл
Выпуск, обновление и отмена полисов создают события аудита. При отмене запись сохраняется, а отменённый полис нельзя изменить.
Тесты и контракты
Тесты эндпоинтов на xUnit проверяют конфликтующие ключи идемпотентности, повторные запросы, валидацию, права JWT и ограничения частоты запросов.
Код безопасного повторного запроса
Прежде чем создать ещё один полис, сервис проверяет существующую операцию и ключ. Он сверяет отпечаток запроса и возвращает исходную запись.
var existingIdempotency = await GetIdempotencyAsync(operation, idempotencyKey, cancellationToken);
if (existingIdempotency is not null)
{
// Same operation+key should return the original result unless payload changed.
ValidateFingerprint(existingIdempotency, idempotencyFingerprint);
return await GetByIdAsync(existingIdempotency.ResponseEntityId, cancellationToken);
}Открыть полный код сервисаФрагмент из PolicyService.cs. Полный сервис также обрабатывает изменение данных запроса и одновременные вставки.
НЕБОЛЬШАЯ ИНЖЕНЕРНАЯ ЗАДАЧА
Ты нажимаешь «Сохранить» дважды. Что должно произойти?
Первый запрос выполнен, но ответ потерялся. Ты повторяешь запрос с тем же ключом и теми же данными.
Выбери ответ, затем проверь поведение на практике.
Демонстрационная симуляция с тестовыми данными. Без вызовов реального API.
Посмотреть пример повторного запроса
ИНТЕРАКТИВНЫЙ ТЕХНИЧЕСКИЙ ПРИМЕР
Безопасные повторы.
Без дублирования полисов.
Если ответ потерялся, клиент может отправить тот же запрос снова. В этом примере система возвращает существующий полис, не создавая дубликат.
Иллюстрация правила идемпотентности из проекта. Используются примерные данные, без вызовов настоящего API.
Посмотри, как проходит запрос
Создай полис, повтори запрос или измени взнос, чтобы проследить результат.
Создано полисов 0
POST /api/customers/{id}/policies{
"type": "Health",
"premium": 100
}
Отправьте первый запрос, чтобы создать тестовый полис.
Идентичный повтор должен вернуть исходный полис.
Подтверждения и ограничения
Интерактивный пример — симуляция в браузере. Он не обращается к опубликованному API; полный запуск с SQL Server в этой демонстрации портфолио не проверен.