Skip to content

Latest commit

 

History

49 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

OmniCalc & Time Service Suite

header_github

Important

Данный проект представляет собой экосистему из двух независимых микросервисов, объединенных через Nginx Reverse Proxy. Система демонстрирует продвинутые принципы ООП на C++, работу с асинхронными HTTP-запросами, контейнеризацию и персистентное хранение данных в PostgreSQL.

Архитектура

laba_10/
├── services/
│   ├── math-service/            # Микросервис математических вычислений
│   │   ├── domain/              # Модели (Rational, Complex, Pair)
│   │   ├── service/             # Бизнес-логика
│   │   ├── controller/          # REST API (httplib)
│   │   ├── repository/          # Логирование операций в БД
│   │   ├── CMakeLists.txt
│   │   └── Dockerfile
│   ├── time-service/            # Микросервис управления временем
│   │   ├── domain/              # Модель Time (нормализация, валидация)
│   │   ├── service/             # Логика работы с репозиторием
│   │   ├── repository/          # Слой доступа к PostgreSQL (libpqxx)
│   │   ├── controller/          # API эндпоинты
│   │   └── Dockerfile
│   └── web-ui/                  # Frontend (Vue 3 + Nginx)
├── docker-compose.yml           # Оркестрация всей системы
└── nginx/                       # Конфигурация Reverse Proxy

architecture

Схема базы данных

erDiagram
    TIME_RECORDS {
        serial id PK
        int hours "0-23"
        int minutes "0-59"
        int seconds "0-59"
        varchar formatted_time "HH:MM:SS"
        timestamp created_at
    }

    MATH_OPERATIONS {
        serial id PK
        varchar operation_name "e.g. Rational Add"
        jsonb input_data "Args in JSON"
        varchar result "Final value"
        timestamp created_at
    }
Loading

Какие бывают запросы

Tip

Работа с числами (math_service)

Площадь кольца GET

200 OK <- сервер принял данные и произвел расчет

curl "http://localhost:8080/api/math/ring?outer=10&inner=5"

ответ:

{
"area" : 235.619449
}

img_router_1

Калькулятор комплексных чисел GET

200 OK <- сервер принял данные и произвел расчет

Сложение(add)

curl "http://localhost:8080/api/math/complex/calc?re1=2.5&im1=1.0&re2=3.0&im2=2.0&op=add"

Вычитание(sub)

curl "http://localhost:8080/api/math/complex/calc?re1=2.5&im1=1.0&re2=3.0&im2=2.0&op=add"

Умножение(mul)

curl "http://localhost:8080/api/math/complex/calc?re1=2.5&im1=1.0&re2=3.0&im2=2.0&op=add"

Деление(div)

curl "http://localhost:8080/api/math/complex/calc?re1=2.5&im1=1.0&re2=3.0&im2=2.0&op=add"

Сравнение на равенство(eq)

curl "http://localhost:8080/api/math/complex/calc?re1=2.5&im1=1.0&re2=3.0&im2=2.0&op=add"

Сравнение на неравенство(neq)

curl "http://localhost:8080/api/math/complex/calc?re1=2.5&im1=1.0&re2=3.0&im2=2.0&op=add"

img_router_2

Калькулятор рациональных чисел GET

200 OK <- сервер принял две дроби и произвел расчеты

Сложение(add)

curl "http://localhost:8080/api/math/rational/calc?num1=1&den1=2&num2=1&den2=3&op=add"

Сложение(add)

curl "http://localhost:8080/api/math/rational/calc?num1=1&den1=2&num2=1&den2=3&op=add"

Вычитание(sub)

curl "http://localhost:8080/api/math/rational/calc?num1=1&den1=2&num2=1&den2=3&op=sub"

Деление(div)

curl "http://localhost:8080/api/math/rational/calc?num1=1&den1=2&num2=1&den2=3&op=div"

img_router_3

Площадь треугольника GET

200 OK <- сервер принял данные и произвел расчет площади

curl "http://localhost:8080/api/math/triangle/area?a=3.0&b=4.0&c=5.0"

ответ:

{
"area" : "2.9047038"
}

img_router_4

История мат операций GET

curl "http://localhost:8080/api/math/history"

Полярные координаты комплексного числа GET

curl "http://localhost:8080/api/math/complex/polar?re=3.0&im=4.0"

Работа со временем (time_service)

Получение записи по ID GET

curl -X GET "http://localhost:8080/api/time/1"

Создать запись времени POST

curl -X POST -d "time_str=14:30:00" "http://localhost:8080/api/time"

Теперь как не надо

Caution

400 (Bad Request) <- какое-то из полей пустое img_err_1

img_err_4

img_err_4

400 (Bad Request) <- неправильный формат ввода img_err_2

400 (Bad Request) <- деление на ноль img_err_3

500 (Internal Server Error) <- мне было лень обрабатывать это img_err_4

400 (Bad Request) <- радиус не может быть отрицательным img_err_4

Настйрока окружения

Important

В корне проекта у нас есть .env.example

#Settings database(Postgres)
DB_HOST=postgres
DB_PORT=5432
DB_USER=default_user
DB_PASSWORD=default_password
DB_NAME=default_db

#Service settings
TIME_SERVICE_PORT=8081
MATH_SERVICE_PORT=8082
WEB_UI_PORT=8080

просто замените заглушки на реальные значения и переведите в формат .env

Запуск

Important

Запуск через докер

cd infrastructure
docker compose up -d --build

Вот так можно посмотреть БДшку

export PGPASSWORD="your pass in .env for pass_pg"                                                 
psql -h localhost -p 5432 -U admin -d postgres

потом

\c laba_db

для проверки там ли вы, можно сделать так

\dt

вы увидите

pg_db

Получаем все данные из time_service

SELECT * FROM time_service;

img_time_service_pg_db

Получаем все данные из math_service

SELECT * FROM math_service;

img_math_service_pg_db

footer


by finnik

About

C++ OOP Lab 10. A Time management system demonstrating Clean Architecture (Controller-Service-Repository), SOLID principles, and custom exception handling.

Topics

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages