Перейти к содержанию

День 2 — API и архитектура мини-информационной системы InvestCalc

(вторая неделя проектной работы — создание каркаса сервиса)

Цели занятия

К концу занятия команда должна:

  • сформировать первичную структуру проекта (папки, файлы, модели, сервисы, контроллеры, точка входа);
  • разработать архитектуру системы, включающую:
  • API-контроллеры,
  • сервисный слой,
  • модели запросов и ответов,
  • базовую расчётную логику,
  • структуру эндпоинтов /calc/local, /calc/cloud, /calc/sensitivity, /compare;
  • реализовать первый рабочий API-метод (/calc/local, выполняющий базовый расчёт TCO, ROI и Payback Period);
  • загрузить результаты в GitHub:
  • ветку feature/api,
  • набор коммитов,
  • Pull Request в develop,
  • обновлённый README с описанием API и архитектуры;
  • подготовить архитектурную диаграмму в Mermaid или PlantUML.

Минимальная структура проекта

Структура отражает уровни приложения: API → сервисы → модели → расчётная логика.

Вариант для C# / ASP.NET Core

src/
│
├── api/
│   └── CalcController.cs
│
├── services/
│   ├── LocalCalcService.cs
│   ├── CloudCalcService.cs
│   ├── SensitivityService.cs
│   └── CompareService.cs
│
├── models/
│   ├── CalcRequest.cs
│   └── CalcResponse.cs
│
└── Program.cs

Python

src/
├── api.py
├── services/
├── models/
└── utils/

Node.js

src/
├── controllers/
├── services/
├── models/
└── index.js

Структура должна быть загружена в репозиторий до реализации сложной логики.


Архитектура InvestCalc

Общий поток работы сервиса

Архитектура основана на разделении ответственности:

Клиент → REST API → Контроллер → Сервис → Модели → Ответ

Архитектурная диаграмма (Mermaid)

flowchart LR
    A[Клиент / Браузер / Postman] --> B[REST API InvestCalc]

    subgraph API
        B --> C[CalcController]
    end

    subgraph Services
        C --> D[LocalCalcService]
        C --> E[CloudCalcService]
        C --> F[SensitivityService]
        C --> G[CompareService]
    end

    subgraph Models
        D --> H[CalcRequest]
        E --> H
        F --> H
        G --> H
        D --> I[CalcResponse]
        E --> I
        F --> I
        G --> I
    end

    API --> J[(Docker Container)]

Реализация минимального API-эндпоинта

Внимвание, делим 4 эдпоинда на количество членов команда = полученное число, это столько сколько должен сделать каждый члек команды!

Первый метод — /calc/local, выполняющий расчёты TCO, ROI и Payback Period.

Пример реализации (C#)

Модель запроса

public class CalcRequest
{
    public string ProjectName { get; set; }
    public double Capex { get; set; }
    public double Opex { get; set; }
    public double TrainingCosts { get; set; }
    public int PeriodYears { get; set; }
    public double ExpectedSavingsPerYear { get; set; }
    public double ExpectedRevenueGrowthPerYear { get; set; }
}

Сервис

public class LocalCalcService
{
    public CalcResponse Calculate(CalcRequest req)
    {
        double tco = req.Capex + req.Opex * req.PeriodYears + req.TrainingCosts;
        double benefits = (req.ExpectedSavingsPerYear + req.ExpectedRevenueGrowthPerYear) * req.PeriodYears;
        double roi = ((benefits - tco) / tco) * 100;
        double payback = tco / (req.ExpectedSavingsPerYear + req.ExpectedRevenueGrowthPerYear);

        return new CalcResponse(req.ProjectName, tco, roi, payback);
    }
}

Контроллер

[ApiController]
[Route("calc")]
public class CalcController : ControllerBase
{
    private readonly LocalCalcService _local;

    public CalcController(LocalCalcService local)
    {
        _local = local;
    }

    [HttpPost("local")]
    public IActionResult Local(CalcRequest req)
    {
        var result = _local.Calculate(req);
        return Ok(result);
    }
}

Проверка API

Инструменты:

  • Postman
  • Thunder Client (VS Code)
  • curl
  • Swagger UI

Пример JSON-запроса

{
  "projectName": "CRM для отдела продаж",
  "capex": 500000,
  "opex": 120000,
  "trainingCosts": 80000,
  "periodYears": 3,
  "expectedSavingsPerYear": 300000,
  "expectedRevenueGrowthPerYear": 200000
}

Ожидаемый ответ

{
  "projectName": "CRM для отдела продаж",
  "tco": 960000,
  "roi": 156.25,
  "paybackPeriodYears": 1.5
}

Работа с GitHub

Создание ветки для API

git checkout -b feature/api

Загрузка каркаса проекта

git add .
git commit -m "feat: added API structure and LocalCalc endpoint"
git push origin feature/api

Pull Request

PR должен содержать:

  • описание изменений,
  • ссылку на issue,
  • скриншоты проверки в Postman/Swagger,
  • пример запроса и ответа.

Обновление README

README должен включать:

API эндпоинты

POST /calc/local 
POST /calc/cloud
POST /calc/sensitivity
POST /compare

Также необходимо добавить:

  • примеры запросов/ответов,
  • архитектурную диаграмму Mermaid,
  • назначение каждого эндпоинта,
  • при необходимости — вынести примеры в docs/examples/.

Демонстрация работы команды

Команда должна показать:

  • архитектурную диаграмму (Mermaid/PlantUML);
  • структуру проекта в GitHub;
  • первый рабочий метод API /calc/local;
  • ветки, коммиты, PR;
  • обновлённый README с архитектурой и API.

Итог занятия (результат)

Команда предоставляет:

Результат Файл
Архитектура docs/architecture.md
Структура проекта src/
Первый API src/api/CalcController.cs
Расчётный сервис src/services/LocalCalcService.cs
Пример запроса/ответа docs/examples/local.json
Диаграмма docs/architecture.mmd
GitHub PR ссылка