# Quoter πŸš€ [![Rust](https://img.shields.io/badge/Rust-1.70+-orange.svg)](https://www.rust-lang.org/) [![Actix Web](https://img.shields.io/badge/Actix%20Web-4.0+-blue.svg)](https://actix.rs/) [![Redis](https://img.shields.io/badge/Redis-6.0+-red.svg)](https://redis.io/) [![S3 Compatible](https://img.shields.io/badge/S3%20Compatible-Storj%20%7C%20AWS-green.svg)](https://aws.amazon.com/s3/) [![Tests](https://img.shields.io/badge/Tests-36%20Passing-brightgreen.svg)](https://dev.discours.io/discours.io/quoter) [![License](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) > ΠœΠΈΠΊΡ€ΠΎΡΠ΅Ρ€Π²ΠΈΡ для управлСния Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ ΠΊΠ²ΠΎΡ‚, ΠΌΠΈΠ½ΠΈΠ°Ρ‚ΡŽΡ€ ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ с S3 Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°ΠΌΠΈ Quoter - это Π²Ρ‹ΡΠΎΠΊΠΎΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ сСрвис для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ управлСния Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, построСнный Π½Π° Rust с использованиСм Actix Web. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ автоматичСскоС созданиС ΠΌΠΈΠ½ΠΈΠ°Ρ‚ΡŽΡ€, ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ²ΠΎΡ‚Π°ΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ S3-совмСстимыми Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°ΠΌΠΈ. ## πŸ“– ДокумСнтация ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π°Ρ докумСнтация доступна Π² ΠΏΠ°ΠΏΠΊΠ΅ [`docs/`](./docs/): ### ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Ρ€Π°Π·Π΄Π΅Π»Ρ‹ - [πŸ“š ОглавлСниС](./docs/README.md) - Полная структура Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ - [πŸ”§ API Reference](./docs/api-reference.md) - ДокумСнтация API - [βš™οΈ ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ](./docs/configuration.md) - Настройка ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния - [πŸš€ Π Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅](./docs/deployment.md) - Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ ΠΏΠΎ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΡŽ - [πŸ“Š ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³](./docs/monitoring.md) - Π›ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ### ВСхничСскиС Π΄Π΅Ρ‚Π°Π»ΠΈ - [πŸ—οΈ АрхитСктура](./docs/architecture.md) - ВСхничСская Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° систСмы - [πŸ” Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚](./docs/how-it-works.md) - ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ описаниС процСссов - [πŸ§ͺ ВСстированиС](./docs/testing.md) - ПолноС ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ тСстами (36 тСстов) - [πŸ’» Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°](./docs/development.md) - Настройка срСды Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ - [🀝 Contributing](./docs/contributing.md) - Руководство для ΠΊΠΎΠ½Ρ‚Ρ€ΠΈΠ±ΡŒΡŽΡ‚ΠΎΡ€ΠΎΠ² ## ✨ ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ возмоТности - πŸ” **АутСнтификация** Ρ‡Π΅Ρ€Π΅Π· JWT Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ - πŸ“ **Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Ρ„Π°ΠΉΠ»ΠΎΠ²** Π² S3/Storj с автоматичСским ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ MIME-Ρ‚ΠΈΠΏΠΎΠ² - πŸ–ΌοΈ **АвтоматичСскиС ΠΌΠΈΠ½ΠΈΠ°Ρ‚ΡŽΡ€Ρ‹** для ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ (10, 40, 110, 300, 600, 800, 1400px) - πŸ’Ύ **Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ²ΠΎΡ‚Π°ΠΌΠΈ** ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ (5 Π“Π‘ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) - 🎨 **ΠžΠ²Π΅Ρ€Π»Π΅ΠΈ для shout** с автоматичСским Π½Π°Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ тСкста - πŸ”„ **CORS ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ°** для Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ - ⚑ **Высокая ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ** благодаря асинхронной Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ - πŸ“Š **ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΈ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅** всСх ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ## πŸ—οΈ АрхитСктура Quoter построСн Π½Π° соврСмСнном стСкС Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ: - **Backend**: Rust + Actix Web - **Π‘Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ…**: Redis для ΠΊΠ²ΠΎΡ‚ ΠΈ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ - **Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅**: S3-совмСстимыС сСрвисы (Storj, AWS S3) - **АутСнтификация**: JWT Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ Ρ‡Π΅Ρ€Π΅Π· GraphQL API - **ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ**: image-rs + imageproc ## πŸ§ͺ ВСстированиС ### Запуск тСстов ```bash # ВсС тСсты cargo test # ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ тСст cargo test test_health_check # ВСсты с ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ΠΌ ./scripts/test-coverage.sh ``` ### Бтатистика тСстов - **basic_test.rs:** 23 тСста (основная Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ) - **handler_tests.rs:** 13 тСстов (HTTP endpoints) - **ΠžΠ±Ρ‰Π΅Π΅ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅:** 100% основных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² - **Бтатус:** ВсС тСсты проходят ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ## πŸ“‹ ВрСбования - **Rust**: 1.70 ΠΈΠ»ΠΈ Π²Ρ‹ΡˆΠ΅ - **Redis**: 6.0 ΠΈΠ»ΠΈ Π²Ρ‹ΡˆΠ΅ - **S3 совмСстимоС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅**: Storj, AWS S3 ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ - **API ядра**: для Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ получСния Π΄Π°Π½Π½Ρ‹Ρ… shout ## πŸš€ CI/CD ΠΈ автоматизация ### Бтатус ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° - βœ… **ВСсты:** 36/36 проходят ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ - βœ… **ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ:** Π±Π΅Π· ошибок - βœ… **ΠŸΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅:** 100% основных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² - πŸš€ **Π”Π΅ΠΏΠ»ΠΎΠΉ:** автоматичСский ΠΏΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ ΠΏΡ€ΠΎΡ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ тСстов ### Автоматизация - АвтоматичСский запуск тСстов ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠΎΠΌΠΌΠΈΡ‚Π΅ - ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° качСства ΠΊΠΎΠ΄Π° ΠΈ покрытия - АвтоматичСский Π΄Π΅ΠΏΠ»ΠΎΠΉ Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ½ - ΠŸΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ "тСсты β†’ Π΄Π΅ΠΏΠ»ΠΎΠΉ" ## πŸ”§ ИспользованиС ### ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π°Ρ информация ΠΎ настройкС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния доступна Π² [Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ](./docs/configuration.md). ### API Endpoints ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ API endpoints: | ΠœΠ΅Ρ‚ΠΎΠ΄ | Endpoint | ОписаниС | |-------|----------|----------| | `GET` | `/` | ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° состояния сСрвСра | | `POST` | `/` | Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Ρ„Π°ΠΉΠ»Π° | | `GET` | `/{filename}` | ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°/ΠΌΠΈΠ½ΠΈΠ°Ρ‚ΡŽΡ€Ρ‹ | | `GET` | `/quota` | Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎ ΠΊΠ²ΠΎΡ‚Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ | | `POST` | `/quota/increase` | Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ²ΠΎΡ‚Ρ‹ | | `POST` | `/quota/set` | Установка ΠΊΠ²ΠΎΡ‚Ρ‹ | ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π°Ρ докумСнтация API доступна Π² [API Reference](./docs/api-reference.md). ### ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования #### Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Ρ„Π°ΠΉΠ»Π° ```bash curl -X POST http://localhost:8080/ \ -H "Authorization: Bearer your-token" \ -F "file=@image.jpg" ``` #### ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΈΠ½ΠΈΠ°Ρ‚ΡŽΡ€Ρ‹ ```bash curl http://localhost:8080/image_300.jpg ``` #### Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ²ΠΎΡ‚Ρ‹ ```bash curl -X POST http://localhost:8080/quota/increase \ -H "Authorization: Bearer your-token" \ -H "Content-Type: application/json" \ -d '{"user_id": "user123", "additional_bytes": 1073741824}' ``` ## πŸ§ͺ Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ```bash cargo build # сборка cargo test # запуск тСстов cargo clippy # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΊΠΎΠ΄Π° cargo fmt # Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ RUST_LOG=debug cargo run # ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ Π»ΠΎΠ³ΠΈ ``` ### ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°: - ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² - ИспользованиС ΠΊΠ²ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ - ВрСмя ΠΎΡ‚Π²Π΅Ρ‚Π° API - Ошибки Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ - Ошибки Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π² S3