From 6c97f07291bc8e490ca23c15cf841422f52f6b59 Mon Sep 17 00:00:00 2001 From: Ilya Danilov Date: Mon, 19 Jan 2026 15:50:38 +0300 Subject: [PATCH 1/3] docs: move all documentation to docs/ directory --- COMMIT_MESSAGE_SUGGESTION.txt | 23 ++ README.md | 390 ++++++++++++++++++ .../ARCHITECTURE_TESTING.md | 0 CI_CD.md => docs/CI_CD.md | 0 CI_FIXES.md => docs/CI_FIXES.md | 0 COMMIT_MESSAGE.txt => docs/COMMIT_MESSAGE.txt | 0 GOFMT_FIX.md => docs/GOFMT_FIX.md | 0 LINTER_FIXES.md => docs/LINTER_FIXES.md | 0 docs/README.md | 54 +++ .../README_TESTING_CI.md | 19 +- TESTIFY_FIX.md => docs/TESTIFY_FIX.md | 0 TESTING.md => docs/TESTING.md | 0 TEST_SUMMARY.md => docs/TEST_SUMMARY.md | 6 +- .../USER_SERVICE_README.md | 0 14 files changed, 480 insertions(+), 12 deletions(-) create mode 100644 COMMIT_MESSAGE_SUGGESTION.txt rename ARCHITECTURE_TESTING.md => docs/ARCHITECTURE_TESTING.md (100%) rename CI_CD.md => docs/CI_CD.md (100%) rename CI_FIXES.md => docs/CI_FIXES.md (100%) rename COMMIT_MESSAGE.txt => docs/COMMIT_MESSAGE.txt (100%) rename GOFMT_FIX.md => docs/GOFMT_FIX.md (100%) rename LINTER_FIXES.md => docs/LINTER_FIXES.md (100%) create mode 100644 docs/README.md rename README_TESTING_CI.md => docs/README_TESTING_CI.md (94%) rename TESTIFY_FIX.md => docs/TESTIFY_FIX.md (100%) rename TESTING.md => docs/TESTING.md (100%) rename TEST_SUMMARY.md => docs/TEST_SUMMARY.md (97%) rename USER_SERVICE_README.md => docs/USER_SERVICE_README.md (100%) diff --git a/COMMIT_MESSAGE_SUGGESTION.txt b/COMMIT_MESSAGE_SUGGESTION.txt new file mode 100644 index 0000000..ebc768a --- /dev/null +++ b/COMMIT_MESSAGE_SUGGESTION.txt @@ -0,0 +1,23 @@ +docs: organize documentation into docs/ directory and translate README to English + +- Move all documentation files to docs/ directory +- Create docs/README.md as documentation index +- Update all internal links in documentation +- Translate main README.md to English +- Update documentation links in main README + +Files moved: +- ARCHITECTURE_TESTING.md +- CI_CD.md +- CI_FIXES.md +- GOFMT_FIX.md +- LINTER_FIXES.md +- README_TESTING_CI.md +- TESTIFY_FIX.md +- TESTING.md +- TEST_SUMMARY.md +- USER_SERVICE_README.md +- COMMIT_MESSAGE.txt + +This improves project organization by keeping the root directory clean +and making it easier to find and navigate documentation. diff --git a/README.md b/README.md index a8668e0..0a79783 100644 --- a/README.md +++ b/README.md @@ -1 +1,391 @@ # LinkKeeper + +> Modern link management system with Telegram bot, REST API, and web interface support + +[![CI](https://github.com/danilovid/linkkeeper/workflows/CI/badge.svg)](https://github.com/danilovid/linkkeeper/actions) +[![Go Version](https://img.shields.io/badge/Go-1.23+-00ADD8?logo=go)](https://golang.org) +[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) + +LinkKeeper is a full-featured system for saving, organizing, and managing links with support for multiple interfaces: Telegram bot, REST API, and modern web interface. + +## ✨ Features + +### 🔗 Link Management +- ✅ Save links with categories (resources) +- ✅ View view statistics +- ✅ Get random links +- ✅ Filter by resources +- ✅ Search links + +### 🤖 Telegram Bot +- ✅ Interactive menu with buttons +- ✅ Save links via commands +- ✅ Get random links +- ✅ Filter by resource types (articles, videos) +- ✅ Automatic user registration + +### 🌐 REST API +- ✅ Full CRUD for links +- ✅ View statistics +- ✅ RESTful architecture +- ✅ CORS support + +### 👥 User Management +- ✅ Automatic registration on first use +- ✅ Personalization via Telegram ID +- ✅ User existence check + +### 📱 Web Interface +- ✅ Modern React Native interface +- ✅ Dark theme in GitHub/Cursor style +- ✅ Responsive design +- ✅ Statistics and analytics +- ✅ Multiple UI variants + +## 🏗️ Architecture + +LinkKeeper is built on a microservices architecture: + +``` +┌─────────────┐ ┌──────────────┐ ┌─────────────┐ +│ Frontend │────▶│ API Service │────▶│ PostgreSQL │ +│ (React/Expo)│ │ (Go) │ │ Database │ +└─────────────┘ └──────────────┘ └─────────────┘ + │ + │ + ┌───────┴────────┐ + │ │ + ┌───────▼──────┐ ┌──────▼────────┐ + │ Bot Service │ │ User Service │ + │ (Go) │ │ (Go) │ + └──────────────┘ └───────────────┘ +``` + +### Services + +1. **API Service** (`:8080`) — main REST API for link management +2. **User Service** (`:8081`) — Telegram user management +3. **Bot Service** — Telegram bot for interactive management +4. **Frontend** — web interface on React Native/Expo + +## 🚀 Quick Start + +### Requirements + +- **Go** 1.23+ +- **Node.js** 18+ +- **PostgreSQL** 16+ +- **Docker** and **Docker Compose** (optional) +- **Telegram Bot Token** (for bot) + +### Installation + +1. **Clone the repository:** +```bash +git clone https://github.com/danilovid/linkkeeper.git +cd linkkeeper +``` + +2. **Install dependencies:** +```bash +# Go dependencies +go mod download +go mod vendor + +# Frontend dependencies +cd frontend && npm install && cd .. +``` + +3. **Set up the database:** +```bash +# Start PostgreSQL via Docker +task db:up + +# Apply migrations +task db:migrate +``` + +4. **Configure environment variables:** +```bash +export POSTGRES_DSN="postgres://postgres:postgres@localhost:5432/linkkeeper?sslmode=disable" +export TELEGRAM_TOKEN="your_telegram_bot_token" +export API_BASE_URL="http://localhost:8080" +export USER_SERVICE_URL="http://localhost:8081" +``` + +### Running + +#### Option 1: Docker Compose (recommended) + +```bash +# Start all services +task start + +# Or directly +docker-compose up -d +``` + +#### Option 2: Local Run + +```bash +# Terminal 1: API Service +task api:run + +# Terminal 2: User Service +task user:run + +# Terminal 3: Bot Service +export TELEGRAM_TOKEN="your_token" +task bot:run + +# Terminal 4: Frontend +task frontend:start +``` + +## 📖 Usage + +### API Endpoints + +#### Links +- `POST /api/v1/links` — create link +- `GET /api/v1/links` — list links +- `GET /api/v1/links/{id}` — get link +- `GET /api/v1/links/random` — random link +- `POST /api/v1/links/{id}/viewed` — mark as viewed +- `DELETE /api/v1/links/{id}` — delete link +- `GET /api/v1/stats` — view statistics + +#### Users +- `POST /api/v1/users` — create/get user +- `GET /api/v1/users/{id}` — get user +- `GET /api/v1/users/telegram/{telegram_id}` — get by Telegram ID +- `GET /api/v1/users/telegram/{telegram_id}/exists` — check existence + +### Telegram Bot + +Commands: +- `/start` — start working with bot +- `/save ` — save link +- `/viewed ` — mark link as viewed +- `/random [resource]` — get random link + +Buttons: +- 💾 Save link — save link +- ✅ Mark viewed — mark as viewed +- 🎲 Random — random link +- 📰 Random article — random article +- 🎬 Random video — random video + +### Frontend + +Open `http://localhost:19006` (or port specified by Expo) + +**Features:** +- View all links +- Add new links +- Search and filter +- View statistics +- Modern interface + +## 🧪 Testing + +### Running Tests + +```bash +# All tests +task test + +# With coverage +task test:coverage + +# Unit tests only +task test:unit + +# Integration tests +task test:integration +``` + +### Coverage Statistics + +| Component | Coverage | +|-----------|----------| +| User Service (Usecase) | 100% ✅ | +| User Service (Repository) | 86.4% ✅ | +| API Service (Usecase) | 52.2% ⚠️ | +| User Service (HTTP) | 50.7% ⚠️ | +| **Overall** | **~70%** ⚠️ | + +**Total tests:** 38 unit + 3 integration + +For more details: [Testing Guide](./docs/TESTING.md) + +## 🔧 Development + +### Project Structure + +``` +LinkKeeper/ +├── cmd/ # Service entry points +│ ├── api-service/ +│ ├── bot-service/ +│ └── user-service/ +├── internal/ # Internal packages +│ ├── api-service/ # API service +│ ├── bot-service/ # Telegram bot +│ └── user-service/ # User service +├── pkg/ # Shared packages +│ ├── config/ # Configuration +│ ├── database/ # Database +│ ├── httpclient/ # HTTP client +│ └── logger/ # Logging +├── frontend/ # React Native application +├── migrations/ # SQL migrations +├── build/ # Dockerfiles +├── tests/ # Integration tests +└── .github/workflows/ # CI/CD +``` + +### Development Commands + +```bash +# Show all available commands +task + +# Code formatting +task fmt + +# Linting +task lint + +# Run CI checks locally +task ci:local + +# Install pre-commit hooks +task hooks:install +``` + +### Pre-commit Hooks + +Automatically before each commit: +- ✅ Code formatting +- ✅ go vet +- ✅ go mod tidy +- ✅ Unit tests + +Installation: +```bash +task hooks:install +``` + +## 🚢 CI/CD + +### GitHub Actions + +Automatically runs on: +- Push to `main` and `develop` +- Pull requests + +**Pipeline includes:** +1. ✅ Tests (with race detector) +2. ✅ Linting (golangci-lint) +3. ✅ Formatting (go fmt) +4. ✅ Build all services +5. ✅ Docker images (main branch) + +For more details: [CI/CD Documentation](./docs/CI_CD.md) + +## 📚 Documentation + +All documentation is located in the [`docs/`](./docs/) directory: + +- [Testing Guide](./docs/TESTING.md) — comprehensive testing documentation +- [CI/CD Documentation](./docs/CI_CD.md) — CI/CD pipeline details +- [Test Coverage Summary](./docs/TEST_SUMMARY.md) — coverage statistics +- [Testing & CI Quick Start](./docs/README_TESTING_CI.md) — quick start guide +- [User Service Documentation](./docs/USER_SERVICE_README.md) — User Service details +- [Documentation Index](./docs/README.md) — complete documentation index +- [Frontend Documentation](./frontend/README.md) — Frontend documentation + +## 🛠️ Technologies + +### Backend +- **Go** 1.23+ — main language +- **PostgreSQL** 16+ — database +- **GORM** — ORM +- **Gorilla Mux** — HTTP routing +- **Zerolog** — logging +- **Telebot** — Telegram Bot API + +### Frontend +- **React Native** — mobile framework +- **Expo** — development tools +- **TypeScript** — typing + +### DevOps +- **Docker** & **Docker Compose** — containerization +- **GitHub Actions** — CI/CD +- **golangci-lint** — linter +- **pre-commit** — git hooks + +## 🔐 Configuration + +### Environment Variables + +#### API Service +- `HTTP_ADDR` — HTTP server address (default: `:8080`) +- `POSTGRES_DSN` — PostgreSQL connection string + +#### User Service +- `HTTP_ADDR` — HTTP server address (default: `:8081`) +- `POSTGRES_DSN` — PostgreSQL connection string + +#### Bot Service +- `TELEGRAM_TOKEN` — Telegram bot token (required) +- `API_BASE_URL` — API service URL (default: `http://localhost:8080`) +- `USER_SERVICE_URL` — User service URL (default: `http://localhost:8081`) +- `BOT_TIMEOUT_SECONDS` — request timeout (default: 10) + +## 🤝 Contributing + +1. Fork the project +2. Create a feature branch (`git checkout -b feature/amazing-feature`) +3. Commit your changes (`git commit -m 'Add amazing feature'`) +4. Push to the branch (`git push origin feature/amazing-feature`) +5. Open a Pull Request + +### Guidelines + +- ✅ Follow Go code style +- ✅ Add tests for new features +- ✅ Update documentation +- ✅ Use Conventional Commits + +## 📝 License + +MIT License — see [LICENSE](LICENSE) file + +## 👤 Author + +**Danilovid** + +- GitHub: [@danilovid](https://github.com/danilovid) + +## 🙏 Acknowledgments + +- [Telebot](https://github.com/tucnak/telebot) — excellent library for Telegram bots +- [GORM](https://gorm.io/) — powerful ORM for Go +- [Expo](https://expo.dev/) — tools for React Native development + +## 📊 Project Status + +- ✅ API Service — ready +- ✅ User Service — ready +- ✅ Bot Service — ready +- ✅ Frontend — ready +- ✅ Tests — 38 unit + 3 integration +- ✅ CI/CD — configured +- ⚠️ Test coverage — 70% (target: 85%) + +--- + +**Made with ❤️ for convenient link management** diff --git a/ARCHITECTURE_TESTING.md b/docs/ARCHITECTURE_TESTING.md similarity index 100% rename from ARCHITECTURE_TESTING.md rename to docs/ARCHITECTURE_TESTING.md diff --git a/CI_CD.md b/docs/CI_CD.md similarity index 100% rename from CI_CD.md rename to docs/CI_CD.md diff --git a/CI_FIXES.md b/docs/CI_FIXES.md similarity index 100% rename from CI_FIXES.md rename to docs/CI_FIXES.md diff --git a/COMMIT_MESSAGE.txt b/docs/COMMIT_MESSAGE.txt similarity index 100% rename from COMMIT_MESSAGE.txt rename to docs/COMMIT_MESSAGE.txt diff --git a/GOFMT_FIX.md b/docs/GOFMT_FIX.md similarity index 100% rename from GOFMT_FIX.md rename to docs/GOFMT_FIX.md diff --git a/LINTER_FIXES.md b/docs/LINTER_FIXES.md similarity index 100% rename from LINTER_FIXES.md rename to docs/LINTER_FIXES.md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..0e1723a --- /dev/null +++ b/docs/README.md @@ -0,0 +1,54 @@ +# Documentation + +This directory contains all project documentation. + +## 📚 Available Documentation + +### Testing & Quality +- **[TESTING.md](./TESTING.md)** — Comprehensive testing guide +- **[TEST_SUMMARY.md](./TEST_SUMMARY.md)** — Test coverage statistics +- **[README_TESTING_CI.md](./README_TESTING_CI.md)** — Testing and CI quick start guide + +### CI/CD +- **[CI_CD.md](./CI_CD.md)** — CI/CD pipeline documentation +- **[CI_FIXES.md](./CI_FIXES.md)** — CI fixes and improvements +- **[GOFMT_FIX.md](./GOFMT_FIX.md)** — gofmt check fixes +- **[TESTIFY_FIX.md](./TESTIFY_FIX.md)** — Testify dependency fixes +- **[LINTER_FIXES.md](./LINTER_FIXES.md)** — Linter errors fixes + +### Architecture & Development +- **[ARCHITECTURE_TESTING.md](./ARCHITECTURE_TESTING.md)** — Architecture and testing details +- **[USER_SERVICE_README.md](./USER_SERVICE_README.md)** — User Service documentation + +### Other +- **[COMMIT_MESSAGE.txt](./COMMIT_MESSAGE.txt)** — Example commit message template + +## 🔗 Quick Links + +- [Main README](../README.md) — Project overview and quick start +- [Frontend Documentation](../frontend/README.md) — Frontend documentation + +## 📖 Documentation Structure + +``` +docs/ +├── README.md # This file +├── TESTING.md # Testing guide +├── TEST_SUMMARY.md # Coverage statistics +├── CI_CD.md # CI/CD documentation +├── README_TESTING_CI.md # Testing & CI quick start +├── USER_SERVICE_README.md # User Service docs +├── ARCHITECTURE_TESTING.md # Architecture details +├── CI_FIXES.md # CI fixes +├── GOFMT_FIX.md # gofmt fixes +├── TESTIFY_FIX.md # Testify fixes +├── LINTER_FIXES.md # Linter fixes +└── COMMIT_MESSAGE.txt # Commit template +``` + +## 🎯 Getting Started + +1. **New to the project?** Start with the [Main README](../README.md) +2. **Want to run tests?** Check [TESTING.md](./TESTING.md) +3. **Setting up CI/CD?** Read [CI_CD.md](./CI_CD.md) +4. **Contributing?** See [README_TESTING_CI.md](./README_TESTING_CI.md) diff --git a/README_TESTING_CI.md b/docs/README_TESTING_CI.md similarity index 94% rename from README_TESTING_CI.md rename to docs/README_TESTING_CI.md index de5a0d6..8828288 100644 --- a/README_TESTING_CI.md +++ b/docs/README_TESTING_CI.md @@ -85,10 +85,10 @@ Located in `.pre-commit-config.yaml` ### ✅ Documentation -- `TESTING.md` - Comprehensive testing guide -- `CI_CD.md` - CI/CD documentation -- `TEST_SUMMARY.md` - Coverage summary -- `README_TESTING_CI.md` - This file +- [TESTING.md](./TESTING.md) - Comprehensive testing guide +- [CI_CD.md](./CI_CD.md) - CI/CD documentation +- [TEST_SUMMARY.md](./TEST_SUMMARY.md) - Coverage summary +- [README_TESTING_CI.md](./README_TESTING_CI.md) - This file ## Testing Stack @@ -129,10 +129,11 @@ LinkKeeper/ ├── .pre-commit-config.yaml # ✨ Pre-commit hooks ├── Makefile # ✨ Make commands ├── Taskfile.yml # Updated with test tasks -├── TESTING.md # ✨ Testing guide -├── CI_CD.md # ✨ CI/CD guide -├── TEST_SUMMARY.md # ✨ Coverage summary -└── README_TESTING_CI.md # ✨ This file +├── docs/ +│ ├── TESTING.md # ✨ Testing guide +│ ├── CI_CD.md # ✨ CI/CD guide +│ ├── TEST_SUMMARY.md # ✨ Coverage summary +│ └── README_TESTING_CI.md # ✨ This file ``` ## Development Workflow @@ -432,7 +433,7 @@ Types: ## Support If you have questions: -1. Check documentation (TESTING.md, CI_CD.md) +1. Check documentation ([TESTING.md](./TESTING.md), [CI_CD.md](./CI_CD.md)) 2. Look at existing tests for examples 3. Ask team members 4. Create an issue diff --git a/TESTIFY_FIX.md b/docs/TESTIFY_FIX.md similarity index 100% rename from TESTIFY_FIX.md rename to docs/TESTIFY_FIX.md diff --git a/TESTING.md b/docs/TESTING.md similarity index 100% rename from TESTING.md rename to docs/TESTING.md diff --git a/TEST_SUMMARY.md b/docs/TEST_SUMMARY.md similarity index 97% rename from TEST_SUMMARY.md rename to docs/TEST_SUMMARY.md index 01fde65..3050727 100644 --- a/TEST_SUMMARY.md +++ b/docs/TEST_SUMMARY.md @@ -270,8 +270,8 @@ go tool cover -func=coverage.out ## Documentation -- See `TESTING.md` for detailed testing guide -- See `CI_CD.md` for CI/CD documentation +- See [TESTING.md](./TESTING.md) for detailed testing guide +- See [CI_CD.md](./CI_CD.md) for CI/CD documentation - See `.github/workflows/ci.yml` for pipeline configuration - See `.golangci.yml` for linter configuration @@ -289,7 +289,7 @@ ci: update GitHub Actions workflow ## Contact & Support For questions about testing: -1. Check `TESTING.md` documentation +1. Check [TESTING.md](./TESTING.md) documentation 2. Review existing tests for examples 3. Ask in team chat 4. Create an issue if you find problems diff --git a/USER_SERVICE_README.md b/docs/USER_SERVICE_README.md similarity index 100% rename from USER_SERVICE_README.md rename to docs/USER_SERVICE_README.md From 4bb19d81c36a9364c87858177c9d87e3e59579b3 Mon Sep 17 00:00:00 2001 From: Ilya Danilov Date: Mon, 19 Jan 2026 19:54:15 +0300 Subject: [PATCH 2/3] refactor: standardize on Taskfile and remove Makefile --- .github/workflows/ci.yml | 33 +++-- COMMIT_MESSAGE_SUGGESTION.txt | 23 --- Makefile | 41 ------ Taskfile.yml | 12 +- docs/ARCHITECTURE_TESTING.md | 136 +++++++++--------- docs/CI_CD.md | 18 --- docs/GOFMT_FIX.md | 70 ++++----- docs/README_TESTING_CI.md | 17 +-- docs/TESTING.md | 12 +- frontend/App.tsx | 2 +- frontend/DESIGN_IMPROVEMENTS.md | 136 +++++++++--------- frontend/QUICKSTART.md | 30 ++-- frontend/README.md | 96 ++++++------- frontend/VARIANTS.md | 118 +++++++-------- frontend/metro.config.js | 2 +- frontend/src/components/ViewStatsChart.tsx | 50 +++---- frontend/src/screens/ModernScreen.tsx | 8 +- frontend/src/screens/Variant1_ClassicList.tsx | 12 +- frontend/src/screens/Variant2_CardGrid.tsx | 12 +- frontend/src/screens/Variant3_Dashboard.tsx | 12 +- 20 files changed, 381 insertions(+), 459 deletions(-) delete mode 100644 COMMIT_MESSAGE_SUGGESTION.txt delete mode 100644 Makefile diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2c6fc94..88fa72b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,16 +36,21 @@ jobs: go-version: '1.23' cache: true + - name: Install Task + uses: arduino/setup-task@v2 + with: + version: latest + - name: Install dependencies run: | go mod download go mod tidy - - name: Run go fmt + - name: Run go fmt check run: | unformatted=$(gofmt -s -l $(find . -name '*.go' -not -path './vendor/*' -not -path './.git/*' 2>/dev/null)) if [ -n "$unformatted" ]; then - echo "Please run 'go fmt ./...'" + echo "Please run 'task fmt' to format code" echo "$unformatted" exit 1 fi @@ -56,8 +61,7 @@ jobs: - name: Run tests env: POSTGRES_DSN: "postgres://postgres:postgres@localhost:5432/linkkeeper_test?sslmode=disable" - run: | - go test -v -race -coverprofile=coverage.out -covermode=atomic ./... + run: task test:coverage - name: Upload coverage to Codecov uses: codecov/codecov-action@v4 @@ -80,6 +84,11 @@ jobs: with: go-version: '1.23' + - name: Install Task + uses: arduino/setup-task@v2 + with: + version: latest + - name: Run golangci-lint uses: golangci/golangci-lint-action@v4 with: @@ -101,14 +110,16 @@ jobs: go-version: '1.23' cache: true - - name: Build api-service - run: go build -v -o bin/api-service ./cmd/api-service - - - name: Build user-service - run: go build -v -o bin/user-service ./cmd/user-service + - name: Install Task + uses: arduino/setup-task@v2 + with: + version: latest - - name: Build bot-service - run: go build -v -o bin/bot-service ./cmd/bot-service + - name: Build all services + run: | + task api:build + task user:build + task bot:build docker: name: Docker Build diff --git a/COMMIT_MESSAGE_SUGGESTION.txt b/COMMIT_MESSAGE_SUGGESTION.txt deleted file mode 100644 index ebc768a..0000000 --- a/COMMIT_MESSAGE_SUGGESTION.txt +++ /dev/null @@ -1,23 +0,0 @@ -docs: organize documentation into docs/ directory and translate README to English - -- Move all documentation files to docs/ directory -- Create docs/README.md as documentation index -- Update all internal links in documentation -- Translate main README.md to English -- Update documentation links in main README - -Files moved: -- ARCHITECTURE_TESTING.md -- CI_CD.md -- CI_FIXES.md -- GOFMT_FIX.md -- LINTER_FIXES.md -- README_TESTING_CI.md -- TESTIFY_FIX.md -- TESTING.md -- TEST_SUMMARY.md -- USER_SERVICE_README.md -- COMMIT_MESSAGE.txt - -This improves project organization by keeping the root directory clean -and making it easier to find and navigate documentation. diff --git a/Makefile b/Makefile deleted file mode 100644 index 72ca7a0..0000000 --- a/Makefile +++ /dev/null @@ -1,41 +0,0 @@ -.PHONY: help install-hooks test test-coverage lint fmt clean - -help: - @echo "Available commands:" - @echo " make install-hooks - Install pre-commit hooks" - @echo " make test - Run all tests" - @echo " make test-coverage - Run tests with coverage report" - @echo " make lint - Run linters" - @echo " make fmt - Format code" - @echo " make clean - Clean build artifacts" - -install-hooks: - @echo "Installing pre-commit hooks..." - pip install pre-commit || pip3 install pre-commit - pre-commit install - @echo "Hooks installed successfully!" - -test: - @echo "Running tests..." - go test -v -race -short ./... - -test-coverage: - @echo "Running tests with coverage..." - go test -v -race -coverprofile=coverage.out -covermode=atomic ./... - go tool cover -html=coverage.out -o coverage.html - @echo "Coverage report generated: coverage.html" - -lint: - @echo "Running linters..." - golangci-lint run --timeout=5m - -fmt: - @echo "Formatting code..." - gofmt -s -w . - goimports -w . - -clean: - @echo "Cleaning build artifacts..." - rm -rf bin/ - rm -f coverage.out coverage.html - go clean -cache -testcache diff --git a/Taskfile.yml b/Taskfile.yml index 85b938f..4914171 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -239,7 +239,12 @@ tasks: desc: Check Go code with linter cmds: - go vet ./... - - golangci-lint run --timeout=5m || echo "golangci-lint not installed. Run: brew install golangci-lint" + - | + if ! command -v golangci-lint &> /dev/null; then + echo "golangci-lint not installed. Run: brew install golangci-lint" + exit 1 + fi + golangci-lint run --timeout=5m test: desc: Run all tests @@ -261,8 +266,9 @@ tasks: cmds: - go test -v -race -coverprofile=coverage.out -covermode=atomic ./... - go tool cover -html=coverage.out -o coverage.html - - echo "Coverage report generated: coverage.html" - - go tool cover -func=coverage.out | grep total + - | + echo "Coverage report generated: coverage.html" + go tool cover -func=coverage.out | grep total || true test:watch: desc: Watch and run tests on file changes diff --git a/docs/ARCHITECTURE_TESTING.md b/docs/ARCHITECTURE_TESTING.md index 289ec78..abe0ff3 100644 --- a/docs/ARCHITECTURE_TESTING.md +++ b/docs/ARCHITECTURE_TESTING.md @@ -1,31 +1,31 @@ -# Тестирование и архитектура в GitHub Actions +# Testing and Architecture in GitHub Actions -## Краткий ответ: НЕТ, отдельная сборка с указанием архитектуры НЕ нужна +## Quick Answer: NO, a separate build with architecture specification is NOT needed -### Почему не нужно? +### Why not? -1. **`go test` автоматически компилирует для текущей платформы** - - GitHub Actions runner (`ubuntu-latest`) работает на `linux/amd64` - - `go test` автоматически компилирует тесты для `linux/amd64` - - Тесты запускаются на той же архитектуре, что и runner +1. **`go test` automatically compiles for the current platform** + - GitHub Actions runner (`ubuntu-latest`) runs on `linux/amd64` + - `go test` automatically compiles tests for `linux/amd64` + - Tests run on the same architecture as the runner -2. **Текущая конфигурация правильная:** +2. **Current configuration is correct:** ```yaml - name: Run tests run: | go test -v -race -coverprofile=coverage.out -covermode=atomic ./... ``` -3. **Go автоматически определяет:** - - Операционную систему (Linux) - - Архитектуру (amd64) - - Компилирует и запускает соответственно +3. **Go automatically detects:** + - Operating system (Linux) + - Architecture (amd64) + - Compiles and runs accordingly -## Когда МОЖЕТ понадобиться указать архитектуру? +## When MIGHT you need to specify architecture? -### 1. Кросс-платформенное тестирование +### 1. Cross-platform testing -Если нужно тестировать на разных платформах: +If you need to test on different platforms: ```yaml jobs: @@ -43,7 +43,7 @@ jobs: - run: go test ./... ``` -### 2. Тестирование на разных архитектурах (ARM, x86) +### 2. Testing on different architectures (ARM, x86) ```yaml jobs: @@ -61,9 +61,9 @@ jobs: GOARCH=${{ matrix.arch }} go test ./... ``` -### 3. Сборка бинарников для разных платформ +### 3. Building binaries for different platforms -Для сборки (не тестов) может понадобиться: +For building (not testing) you might need: ```yaml - name: Build for multiple platforms @@ -73,7 +73,7 @@ jobs: GOOS=windows GOARCH=amd64 go build -o bin/api-service-windows-amd64.exe ./cmd/api-service ``` -## Текущая конфигурация (оптимальная для большинства случаев) +## Current configuration (optimal for most cases) ```yaml - name: Set up Go @@ -87,63 +87,63 @@ jobs: go test -v -race -coverprofile=coverage.out -covermode=atomic ./... ``` -**Это работает потому что:** +**This works because:** - ✅ `ubuntu-latest` = Linux amd64 -- ✅ `go test` автоматически компилирует для Linux amd64 -- ✅ Тесты запускаются нативно (быстро) -- ✅ Race detector работает корректно -- ✅ Coverage собирается правильно +- ✅ `go test` automatically compiles for Linux amd64 +- ✅ Tests run natively (fast) +- ✅ Race detector works correctly +- ✅ Coverage is collected properly -## Сравнение подходов +## Approach comparison -### Текущий подход (рекомендуется) +### Current approach (recommended) ```yaml go test ./... ``` -- ✅ Просто и быстро -- ✅ Автоматическая компиляция для текущей платформы -- ✅ Нативная производительность -- ✅ Подходит для 99% проектов +- ✅ Simple and fast +- ✅ Automatic compilation for current platform +- ✅ Native performance +- ✅ Suitable for 99% of projects -### Явное указание архитектуры (избыточно) +### Explicit architecture specification (redundant) ```yaml GOOS=linux GOARCH=amd64 go test ./... ``` -- ⚠️ Избыточно (то же самое, что и без указания) -- ⚠️ Может быть медленнее (если нужна кросс-компиляция) -- ✅ Нужно только для кросс-платформенного тестирования +- ⚠️ Redundant (same as without specification) +- ⚠️ May be slower (if cross-compilation is needed) +- ✅ Only needed for cross-platform testing -## Когда добавить multi-arch тестирование? +## When to add multi-arch testing? -Добавьте только если: -1. ✅ Проект должен работать на разных платформах (Windows, macOS, Linux) -2. ✅ Есть платформо-специфичный код (syscalls, файловые пути) -3. ✅ Нужно тестировать на ARM (например, для Docker на ARM) -4. ✅ Требования проекта/компании +Add only if: +1. ✅ Project must work on different platforms (Windows, macOS, Linux) +2. ✅ There is platform-specific code (syscalls, file paths) +3. ✅ Need to test on ARM (e.g., for Docker on ARM) +4. ✅ Project/company requirements -## Рекомендации +## Recommendations -### Для вашего проекта (LinkKeeper) +### For your project (LinkKeeper) -**Текущая конфигурация идеальна:** -- ✅ Тесты запускаются на Linux amd64 (стандарт для серверов) -- ✅ Быстро и эффективно -- ✅ Покрывает основную целевую платформу -- ✅ Race detector работает корректно +**Current configuration is ideal:** +- ✅ Tests run on Linux amd64 (standard for servers) +- ✅ Fast and efficient +- ✅ Covers the main target platform +- ✅ Race detector works correctly -**Не нужно добавлять:** -- ❌ Явное указание GOOS/GOARCH (избыточно) -- ❌ Multi-arch тестирование (если не требуется) -- ❌ Дополнительные сборки (только для тестов) +**Don't need to add:** +- ❌ Explicit GOOS/GOARCH specification (redundant) +- ❌ Multi-arch testing (if not required) +- ❌ Additional builds (only for tests) -### Если понадобится расширить +### If you need to expand -Добавьте matrix strategy только если: -- Нужно тестировать на Windows/macOS -- Нужна поддержка ARM -- Есть платформо-специфичный код +Add matrix strategy only if: +- Need to test on Windows/macOS +- Need ARM support +- There is platform-specific code -## Пример расширенной конфигурации (если понадобится) +## Extended configuration example (if needed) ```yaml jobs: @@ -161,7 +161,7 @@ jobs: services: postgres: image: postgres:16 - # ... (только для Linux) + # ... (only for Linux) if: matrix.os == 'ubuntu-latest' steps: - uses: actions/checkout@v4 @@ -170,18 +170,18 @@ jobs: go-version: ${{ matrix.go-version }} - name: Run tests run: go test -v -race ./... - # PostgreSQL только на Linux + # PostgreSQL only on Linux if: matrix.os == 'ubuntu-latest' ``` -## Вывод +## Conclusion -**Для вашего проекта:** -- ✅ Текущая конфигурация правильная -- ✅ Не нужно указывать архитектуру явно -- ✅ `go test` автоматически работает корректно -- ✅ Все тесты запускаются нативно на Linux amd64 +**For your project:** +- ✅ Current configuration is correct +- ✅ No need to specify architecture explicitly +- ✅ `go test` automatically works correctly +- ✅ All tests run natively on Linux amd64 -**Добавляйте multi-arch только если:** -- Требуется поддержка других платформ -- Есть специфичные требования проекта +**Add multi-arch only if:** +- Support for other platforms is required +- There are specific project requirements diff --git a/docs/CI_CD.md b/docs/CI_CD.md index 16583fe..599bca7 100644 --- a/docs/CI_CD.md +++ b/docs/CI_CD.md @@ -76,8 +76,6 @@ Install hooks: ```bash task hooks:install # or -make install-hooks -# or pre-commit install ``` @@ -133,22 +131,6 @@ task test:unit task test:integration ``` -### Using Makefile - -```bash -# Run linter -make lint - -# Run tests -make test - -# Run tests with coverage -make test-coverage - -# Format code -make fmt -``` - ## Environment Variables ### Required for CI/CD: diff --git a/docs/GOFMT_FIX.md b/docs/GOFMT_FIX.md index 50bae0e..bbce490 100644 --- a/docs/GOFMT_FIX.md +++ b/docs/GOFMT_FIX.md @@ -1,28 +1,28 @@ -# Исправление проверки gofmt в CI +# Fixing gofmt Check in CI -## Проблема +## Problem -CI падал с ошибкой: +CI was failing with error: ``` Please run 'go fmt ./...' vendor/github.com/davecgh/go-spew/spew/bypass.go vendor/github.com/google/uuid/uuid.go -... (много файлов из vendor/) +... (many files from vendor/) Error: Process completed with exit code 1. ``` -## Причина +## Cause -Проверка `gofmt` проверяла все файлы, включая директорию `vendor/`, которая содержит внешние зависимости. Эти файлы не должны проверяться, так как: -1. Они не являются частью нашего кода -2. Они могут быть отформатированы по-другому -3. Мы не контролируем их форматирование +The `gofmt` check was checking all files, including the `vendor/` directory, which contains external dependencies. These files should not be checked because: +1. They are not part of our code +2. They may be formatted differently +3. We don't control their formatting -## Решение +## Solution -Исключили директорию `vendor/` из проверки форматирования. +Excluded the `vendor/` directory from formatting check. -### Было: +### Before: ```yaml - name: Run go fmt run: | @@ -33,7 +33,7 @@ Error: Process completed with exit code 1. fi ``` -### Стало: +### After: ```yaml - name: Run go fmt run: | @@ -45,17 +45,17 @@ Error: Process completed with exit code 1. fi ``` -## Что изменилось +## What changed -1. ✅ Используется `find` для поиска `.go` файлов -2. ✅ Исключается `vendor/` директория -3. ✅ Исключается `.git/` директория -4. ✅ Проверяются только файлы проекта +1. ✅ Uses `find` to search for `.go` files +2. ✅ Excludes `vendor/` directory +3. ✅ Excludes `.git/` directory +4. ✅ Checks only project files -## Проверка +## Verification ```bash -# Локальная проверка (исключая vendor) +# Local check (excluding vendor) unformatted=$(gofmt -s -l $(find . -name '*.go' -not -path './vendor/*' -not -path './.git/*' 2>/dev/null)) if [ -n "$unformatted" ]; then echo "Unformatted files found" @@ -65,9 +65,9 @@ else fi ``` -## Альтернативные подходы +## Alternative approaches -### Вариант 1: Использовать go fmt напрямую +### Option 1: Use go fmt directly ```yaml - name: Run go fmt run: | @@ -79,7 +79,7 @@ fi fi ``` -### Вариант 2: Использовать gofmt с явным списком директорий +### Option 2: Use gofmt with explicit directory list ```yaml - name: Run go fmt run: | @@ -90,20 +90,20 @@ fi done ``` -## Рекомендация +## Recommendation -Текущее решение оптимально: -- ✅ Проверяет только файлы проекта -- ✅ Игнорирует vendor и .git -- ✅ Показывает список неотформатированных файлов -- ✅ Работает быстро +Current solution is optimal: +- ✅ Checks only project files +- ✅ Ignores vendor and .git +- ✅ Shows list of unformatted files +- ✅ Works fast -## Файлы изменены +## Files changed -- `.github/workflows/ci.yml` - Обновлена проверка gofmt +- `.github/workflows/ci.yml` - Updated gofmt check -## Результат +## Result -- ✅ CI больше не падает на файлах из vendor/ -- ✅ Проверяются только файлы проекта -- ✅ Более быстрая проверка (меньше файлов) +- ✅ CI no longer fails on files from vendor/ +- ✅ Only project files are checked +- ✅ Faster check (fewer files) diff --git a/docs/README_TESTING_CI.md b/docs/README_TESTING_CI.md index 8828288..79e8301 100644 --- a/docs/README_TESTING_CI.md +++ b/docs/README_TESTING_CI.md @@ -80,8 +80,7 @@ Located in `.pre-commit-config.yaml` - `.golangci.yml` - Linter configuration - `.pre-commit-config.yaml` - Pre-commit hooks -- `Makefile` - Alternative task runner -- `Taskfile.yml` - Updated with test commands +- `Taskfile.yml` - Task runner with all project commands ### ✅ Documentation @@ -127,8 +126,7 @@ LinkKeeper/ │ └── integration_test.go # ✨ Integration tests ├── .golangci.yml # ✨ Linter config ├── .pre-commit-config.yaml # ✨ Pre-commit hooks -├── Makefile # ✨ Make commands -├── Taskfile.yml # Updated with test tasks +├── Taskfile.yml # ✨ Task runner with all commands ├── docs/ │ ├── TESTING.md # ✨ Testing guide │ ├── CI_CD.md # ✨ CI/CD guide @@ -143,9 +141,6 @@ LinkKeeper/ ```bash # Install pre-commit hooks (once) task hooks:install - -# Or with make -make install-hooks ``` ### 2. While Developing @@ -209,12 +204,6 @@ task test:integration # Integration tests only task test:coverage # With HTML coverage report task ci:local # Full CI simulation -# Make -make test # All tests -make test-coverage # With coverage report -make lint # Run linter -make fmt # Format code - # Go directly go test ./... # All tests go test -v ./... # Verbose @@ -227,7 +216,7 @@ go test -coverprofile=coverage.out ./... # Generate coverage ```bash task lint # Run all linters -make lint # Same with make +task fmt # Format code golangci-lint run # Direct command go fmt ./... # Format code go vet ./... # Static analysis diff --git a/docs/TESTING.md b/docs/TESTING.md index 1def6e8..19577c3 100644 --- a/docs/TESTING.md +++ b/docs/TESTING.md @@ -58,20 +58,20 @@ go test -v -coverprofile=coverage.out ./... go tool cover -html=coverage.out ``` -### Using Makefile +### Using Taskfile ```bash # Run tests -make test +task test # Run tests with coverage -make test-coverage +task test:coverage # Run linters -make lint +task lint # Format code -make fmt +task fmt ``` ## Test Dependencies @@ -187,8 +187,6 @@ Install pre-commit hooks to run checks before each commit: ```bash task hooks:install -# or -make install-hooks ``` The hooks will: diff --git a/frontend/App.tsx b/frontend/App.tsx index 9ff241d..b1ef145 100644 --- a/frontend/App.tsx +++ b/frontend/App.tsx @@ -31,7 +31,7 @@ export default function App() { component={ModernScreen} options={{ title: 'LinkKeeper', - headerShown: false, // Скрываем стандартный header, используем кастомный + headerShown: false, // Hide standard header, use custom one }} /> diff --git a/frontend/DESIGN_IMPROVEMENTS.md b/frontend/DESIGN_IMPROVEMENTS.md index 8e62ddc..b7aa721 100644 --- a/frontend/DESIGN_IMPROVEMENTS.md +++ b/frontend/DESIGN_IMPROVEMENTS.md @@ -1,76 +1,76 @@ -# Предложения по улучшению дизайна - -## Текущие проблемы: -- ❌ Слишком большие кнопки (48px) - не подходят для десктопа -- ❌ Большие формы с большими полями ввода -- ❌ Вертикальный toolbar - занимает много места -- ❌ Не адаптивный - одинаковый размер для всех экранов - -## Варианты улучшения: - -### Вариант 1: Адаптивный дизайн с breakpoints -**Идея:** Разные размеры для десктопа (>768px) и мобильных (<768px) - -**Для десктопа:** -- Кнопки: 32-36px высота (вместо 48px) -- Поля ввода: 36-40px высота (вместо 52px) -- Горизонтальный toolbar (поиск и кнопки в одну строку) -- Компактный header (меньше padding) -- Более мелкие шрифты (14px вместо 16px) -- Плотнее расположение элементов - -**Для мобильных:** -- Сохранить текущие размеры (48px кнопки, 52px поля) -- Вертикальный layout - -### Вариант 2: Компактный десктопный стиль -**Идея:** Стиль как в VS Code / Cursor - очень компактный - -**Особенности:** -- Кнопки: 28-32px -- Поля ввода: 32px -- Компактные иконки -- Минимальные отступы -- Плотная сетка карточек (2-3 колонки на десктопе) - -### Вариант 3: Гибридный подход -**Идея:** Компактный по умолчанию, но с возможностью увеличения для мобильных - -**Особенности:** -- Базовые размеры компактные (32-36px) -- Автоматическое увеличение на мобильных -- Горизонтальный layout на десктопе -- Вертикальный на мобильных - -## Рекомендация: -**Вариант 1** - самый сбалансированный: -- ✅ Комфортно на десктопе (компактно) -- ✅ Удобно на мобильных (большие touch-таргеты) -- ✅ Адаптивный и современный -- ✅ Сохраняет стиль Cursor/GitHub - -## Что будет изменено: +# Design Improvement Suggestions + +## Current issues: +- ❌ Buttons too large (48px) - not suitable for desktop +- ❌ Large forms with large input fields +- ❌ Vertical toolbar - takes up too much space +- ❌ Not responsive - same size for all screens + +## Improvement options: + +### Option 1: Responsive design with breakpoints +**Idea:** Different sizes for desktop (>768px) and mobile (<768px) + +**For desktop:** +- Buttons: 32-36px height (instead of 48px) +- Input fields: 36-40px height (instead of 52px) +- Horizontal toolbar (search and buttons in one row) +- Compact header (less padding) +- Smaller fonts (14px instead of 16px) +- Tighter element spacing + +**For mobile:** +- Keep current sizes (48px buttons, 52px fields) +- Vertical layout + +### Option 2: Compact desktop style +**Idea:** Style like VS Code / Cursor - very compact + +**Features:** +- Buttons: 28-32px +- Input fields: 32px +- Compact icons +- Minimal spacing +- Dense card grid (2-3 columns on desktop) + +### Option 3: Hybrid approach +**Idea:** Compact by default, but with ability to scale up for mobile + +**Features:** +- Base sizes are compact (32-36px) +- Automatic scaling on mobile +- Horizontal layout on desktop +- Vertical on mobile + +## Recommendation: +**Option 1** - most balanced: +- ✅ Comfortable on desktop (compact) +- ✅ Convenient on mobile (large touch targets) +- ✅ Responsive and modern +- ✅ Maintains Cursor/GitHub style + +## What will be changed: 1. **Header:** - - Десктоп: padding 12px, компактная статистика - - Мобильные: padding 16-20px + - Desktop: 12px padding, compact statistics + - Mobile: 16-20px padding -2. **Кнопки:** - - Десктоп: 32-36px высота, padding 8-12px - - Мобильные: 48px высота, padding 14px +2. **Buttons:** + - Desktop: 32-36px height, 8-12px padding + - Mobile: 48px height, 14px padding -3. **Формы:** - - Десктоп: 36-40px высота полей, компактные кнопки - - Мобильные: 52px высота, большие кнопки +3. **Forms:** + - Desktop: 36-40px field height, compact buttons + - Mobile: 52px height, large buttons 4. **Toolbar:** - - Десктоп: горизонтальный (поиск и кнопки в ряд) - - Мобильные: вертикальный + - Desktop: horizontal (search and buttons in a row) + - Mobile: vertical -5. **Карточки:** - - Десктоп: меньше padding, компактнее метаданные - - Мобильные: текущие размеры +5. **Cards:** + - Desktop: less padding, more compact metadata + - Mobile: current sizes -6. **Шрифты:** - - Десктоп: 14px основной, 12px вторичный - - Мобильные: 16px основной, 13px вторичный +6. **Fonts:** + - Desktop: 14px primary, 12px secondary + - Mobile: 16px primary, 13px secondary diff --git a/frontend/QUICKSTART.md b/frontend/QUICKSTART.md index 4486c89..4e7dae1 100644 --- a/frontend/QUICKSTART.md +++ b/frontend/QUICKSTART.md @@ -1,54 +1,54 @@ -# Быстрый старт +# Quick Start -## 1. Установка зависимостей +## 1. Install dependencies ```bash cd frontend npm install ``` -## 2. Запуск в браузере +## 2. Run in browser ```bash npm run dev ``` -Приложение откроется автоматически в браузере на `http://localhost:19006` +The application will open automatically in the browser at `http://localhost:19006` -## 3. Выбор варианта UI +## 3. Select UI variant -Откройте файл `App.tsx` и замените: +Open the `App.tsx` file and replace: ```typescript -// Текущий вариант (полный функционал) +// Current variant (full functionality) import HomeScreen from './src/screens/HomeScreen'; -// Или выберите один из вариантов: +// Or choose one of the variants: import Variant1_ClassicList from './src/screens/Variant1_ClassicList'; // import Variant2_CardGrid from './src/screens/Variant2_CardGrid'; // import Variant3_Dashboard from './src/screens/Variant3_Dashboard'; ``` -И в компоненте: +And in the component: ```typescript ``` -## 4. Настройка API URL (опционально) +## 4. Configure API URL (optional) -Если ваш API работает на другом адресе, создайте `.env`: +If your API runs on a different address, create `.env`: ``` EXPO_PUBLIC_API_URL=http://localhost:8080/api/v1 ``` -По умолчанию используется `http://localhost:8080/api/v1` +Default is `http://localhost:8080/api/v1` -## Готово! 🎉 +## Ready! 🎉 -Приложение готово к использованию. Все изменения автоматически применяются в браузере. +The application is ready to use. All changes are automatically applied in the browser. diff --git a/frontend/README.md b/frontend/README.md index 624825a..767c21a 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -1,100 +1,100 @@ # LinkKeeper Frontend -React Native приложение для управления ссылками с поддержкой веб-просмотра. +React Native application for link management with web viewing support. -## Требования +## Requirements - Node.js 18+ -- npm или yarn -- Expo CLI (установится автоматически) +- npm or yarn +- Expo CLI (will be installed automatically) -## Установка +## Installation ```bash cd frontend npm install ``` -## Запуск +## Running -### Веб-режим (для разработки) +### Web mode (for development) ```bash npm run dev ``` -Или: +Or: ```bash npm run web ``` -Приложение откроется в браузере на `http://localhost:19006` +The application will open in the browser at `http://localhost:19006` -**Важно:** Убедитесь, что ваш API сервер запущен на `http://localhost:8080` (или измените URL в конфигурации) +**Important:** Make sure your API server is running on `http://localhost:8080` (or change the URL in configuration) -### Мобильные платформы +### Mobile platforms ```bash npm start ``` -Затем выберите платформу (iOS/Android/Web) или отсканируйте QR-код в Expo Go приложении. +Then select the platform (iOS/Android/Web) or scan the QR code in the Expo Go app. -## Интерфейс +## Interface -**Текущий интерфейс:** Современный дизайн в стиле Cursor/GitHub -- 🌙 Темная тема -- 🎨 Минималистичный и чистый дизайн -- 🔍 Поиск и фильтрация -- 📊 Статистика в header -- ✨ Профессиональный вид +**Current interface:** Modern design in Cursor/GitHub style +- 🌙 Dark theme +- 🎨 Minimalist and clean design +- 🔍 Search and filtering +- 📊 Statistics in header +- ✨ Professional look -Проект также содержит 3 дополнительных варианта интерфейса. Подробности в файле [VARIANTS.md](./VARIANTS.md). +The project also contains 3 additional interface variants. Details in [VARIANTS.md](./VARIANTS.md). -**Дополнительные варианты:** -1. **Классический список** - простой вертикальный список -2. **Карточки в сетке** - визуальные карточки с фильтрацией -3. **Дашборд со статистикой** - аналитика и быстрые действия +**Additional variants:** +1. **Classic List** - simple vertical list +2. **Card Grid** - visual cards with filtering +3. **Dashboard with Statistics** - analytics and quick actions -Чтобы выбрать другой вариант, откройте `App.tsx` и замените импорт `ModernScreen` на нужный вариант. +To select another variant, open `App.tsx` and replace the `ModernScreen` import with the desired variant. -## Конфигурация +## Configuration -По умолчанию API URL: `http://localhost:8080/api/v1` +Default API URL: `http://localhost:8080/api/v1` -Для изменения создайте файл `.env` в папке `frontend`: +To change it, create a `.env` file in the `frontend` folder: ``` EXPO_PUBLIC_API_URL=http://your-api-url/api/v1 ``` -## Структура проекта +## Project Structure ``` frontend/ ├── src/ │ ├── api/ -│ │ └── client.ts # API клиент для работы с backend +│ │ └── client.ts # API client for backend interaction │ ├── screens/ -│ │ ├── HomeScreen.tsx # Базовый экран (текущий) -│ │ ├── Variant1_ClassicList.tsx # Вариант 1: Классический список -│ │ ├── Variant2_CardGrid.tsx # Вариант 2: Карточки в сетке -│ │ └── Variant3_Dashboard.tsx # Вариант 3: Дашборд -│ ├── types.ts # TypeScript типы -│ └── config.ts # Конфигурация -├── App.tsx # Главный компонент +│ │ ├── HomeScreen.tsx # Base screen (current) +│ │ ├── Variant1_ClassicList.tsx # Variant 1: Classic list +│ │ ├── Variant2_CardGrid.tsx # Variant 2: Card grid +│ │ └── Variant3_Dashboard.tsx # Variant 3: Dashboard +│ ├── types.ts # TypeScript types +│ └── config.ts # Configuration +├── App.tsx # Main component ├── package.json -└── VARIANTS.md # Описание вариантов UI +└── VARIANTS.md # UI variants description ``` -## Функциональность +## Functionality -- ✅ Создание ссылок с опциональным ресурсом -- ✅ Просмотр списка всех ссылок -- ✅ Получение случайной ссылки (с фильтром по ресурсу) -- ✅ Отметка ссылки как просмотренной -- ✅ Удаление ссылок -- ✅ Отображение статистики (просмотры, даты) +- ✅ Create links with optional resource +- ✅ View list of all links +- ✅ Get random link (with resource filter) +- ✅ Mark link as viewed +- ✅ Delete links +- ✅ Display statistics (views, dates) -## Разработка +## Development -При изменении кода приложение автоматически перезагрузится в браузере (Hot Reload). +When code changes, the application will automatically reload in the browser (Hot Reload). -Для остановки нажмите `Ctrl+C` в терминале. +To stop, press `Ctrl+C` in the terminal. diff --git a/frontend/VARIANTS.md b/frontend/VARIANTS.md index 35e8e58..78dcfe3 100644 --- a/frontend/VARIANTS.md +++ b/frontend/VARIANTS.md @@ -1,106 +1,106 @@ -# Варианты UI для LinkKeeper +# UI Variants for LinkKeeper -Проект содержит 4 готовых варианта интерфейса. Выберите один из них и замените импорт в `App.tsx`. +The project contains 4 ready-made interface variants. Choose one and replace the import in `App.tsx`. -## 🎨 Текущий вариант: Современный интерфейс (ModernScreen) +## 🎨 Current variant: Modern Interface (ModernScreen) -**Особенности:** -- ✅ Темная тема в стиле Cursor/GitHub -- ✅ Минималистичный и чистый дизайн -- ✅ Поиск по ссылкам -- ✅ Фильтрация по ресурсам (чипы) -- ✅ Статистика в header (всего ссылок, просмотрено, просмотров) -- ✅ Сворачиваемая форма добавления -- ✅ Карточка случайной ссылки -- ✅ Профессиональная типографика -- ✅ Современные цвета и отступы +**Features:** +- ✅ Dark theme in Cursor/GitHub style +- ✅ Minimalist and clean design +- ✅ Link search +- ✅ Resource filtering (chips) +- ✅ Statistics in header (total links, viewed, views) +- ✅ Collapsible add form +- ✅ Random link card +- ✅ Professional typography +- ✅ Modern colors and spacing -**Подходит для:** Современного и профессионального интерфейса +**Suitable for:** Modern and professional interface -**Файл:** `src/screens/ModernScreen.tsx` +**File:** `src/screens/ModernScreen.tsx` -**Цветовая схема:** -- Фон: `#0d1117` (GitHub dark) -- Карточки: `#161b22` -- Границы: `#21262d` -- Текст: `#f0f6fc` / `#8b949e` -- Акценты: `#58a6ff` (синий), `#238636` (зеленый), `#da3633` (красный) +**Color scheme:** +- Background: `#0d1117` (GitHub dark) +- Cards: `#161b22` +- Borders: `#21262d` +- Text: `#f0f6fc` / `#8b949e` +- Accents: `#58a6ff` (blue), `#238636` (green), `#da3633` (red) --- -## Вариант 1: Классический список (Variant1_ClassicList) +## Variant 1: Classic List (Variant1_ClassicList) -**Особенности:** -- ✅ Простой вертикальный список всех ссылок -- ✅ Форма добавления сверху страницы -- ✅ Минималистичный дизайн -- ✅ Все функции на одном экране -- ✅ Быстрая навигация +**Features:** +- ✅ Simple vertical list of all links +- ✅ Add form at the top of the page +- ✅ Minimalist design +- ✅ All functions on one screen +- ✅ Quick navigation -**Подходит для:** Быстрого доступа и простого управления ссылками +**Suitable for:** Quick access and simple link management -**Файл:** `src/screens/Variant1_ClassicList.tsx` +**File:** `src/screens/Variant1_ClassicList.tsx` --- -## Вариант 2: Карточки в сетке (Variant2_CardGrid) +## Variant 2: Card Grid (Variant2_CardGrid) -**Особенности:** -- ✅ Ссылки отображаются в виде красивых карточек -- ✅ Модальное окно для добавления новых ссылок -- ✅ Фильтрация по ресурсам (чипы) -- ✅ Функция "Случайная ссылка" -- ✅ Более визуально привлекательный дизайн +**Features:** +- ✅ Links displayed as beautiful cards +- ✅ Modal window for adding new links +- ✅ Resource filtering (chips) +- ✅ "Random link" function +- ✅ More visually appealing design -**Подходит для:** Визуального просмотра и организации по категориям +**Suitable for:** Visual browsing and organization by categories -**Файл:** `src/screens/Variant2_CardGrid.tsx` +**File:** `src/screens/Variant2_CardGrid.tsx` --- -## Вариант 3: Дашборд со статистикой (Variant3_Dashboard) +## Variant 3: Dashboard with Statistics (Variant3_Dashboard) -**Особенности:** -- ✅ Статистика: всего ссылок, просмотрено, ресурсов, просмотров -- ✅ Быстрые действия для получения случайных ссылок -- ✅ Поиск по ссылкам -- ✅ Компактный список с метаданными -- ✅ Акцент на аналитике и метриках +**Features:** +- ✅ Statistics: total links, viewed, resources, views +- ✅ Quick actions for getting random links +- ✅ Link search +- ✅ Compact list with metadata +- ✅ Focus on analytics and metrics -**Подходит для:** Анализа использования и быстрого доступа к случайным ссылкам +**Suitable for:** Usage analysis and quick access to random links -**Файл:** `src/screens/Variant3_Dashboard.tsx` +**File:** `src/screens/Variant3_Dashboard.tsx` --- -## Как выбрать вариант +## How to choose a variant -1. Откройте файл `App.tsx` -2. Найдите импорт `ModernScreen` (или другой текущий вариант) -3. Замените на нужный вариант: +1. Open the `App.tsx` file +2. Find the `ModernScreen` import (or other current variant) +3. Replace with the desired variant: ```typescript -// Современный интерфейс (текущий): +// Modern interface (current): import ModernScreen from './src/screens/ModernScreen'; -// Для варианта 1: +// For variant 1: import Variant1_ClassicList from './src/screens/Variant1_ClassicList'; -// Для варианта 2: +// For variant 2: import Variant2_CardGrid from './src/screens/Variant2_CardGrid'; -// Для варианта 3: +// For variant 3: import Variant3_Dashboard from './src/screens/Variant3_Dashboard'; ``` -4. Замените компонент в Stack.Screen: +4. Replace the component in Stack.Screen: ```typescript ``` -**Примечание:** Для `ModernScreen` используется `headerShown: false`, так как у него есть кастомный header. Для других вариантов можно оставить стандартный header. +**Note:** For `ModernScreen`, `headerShown: false` is used because it has a custom header. For other variants, you can keep the standard header. diff --git a/frontend/metro.config.js b/frontend/metro.config.js index 2cbb253..5347837 100644 --- a/frontend/metro.config.js +++ b/frontend/metro.config.js @@ -2,7 +2,7 @@ const { getDefaultConfig } = require('expo/metro-config'); const config = getDefaultConfig(__dirname); -// Отключаем Expo Router, так как используем React Navigation +// Disable Expo Router, as we use React Navigation config.resolver = { ...config.resolver, sourceExts: [...(config.resolver?.sourceExts || []), 'jsx', 'js', 'ts', 'tsx'], diff --git a/frontend/src/components/ViewStatsChart.tsx b/frontend/src/components/ViewStatsChart.tsx index 3efb1c5..dc4b9ed 100644 --- a/frontend/src/components/ViewStatsChart.tsx +++ b/frontend/src/components/ViewStatsChart.tsx @@ -19,8 +19,8 @@ interface ViewStatsChartProps { } /** - * Компонент графика просмотров в стиле GitHub - * Отображает статистику просмотров по дням в виде квадратиков + * View statistics chart component in GitHub style + * Displays view statistics by day as squares */ export default function ViewStatsChart({ days = 365 }: ViewStatsChartProps) { const [stats, setStats] = useState([]); @@ -37,18 +37,18 @@ export default function ViewStatsChart({ days = 365 }: ViewStatsChartProps) { setLoading(true); const data = await apiClient.getViewStats(days); - // Убеждаемся, что получили все дни + // Make sure we got all days if (data.length !== days) { console.warn(`Expected ${days} days, got ${data.length}`); } setStats(data); - // Вычисляем общее количество просмотров + // Calculate total views const total = data.reduce((sum, stat) => sum + stat.count, 0); setTotalViews(total); - // Отладочная информация + // Debug information const daysWithViews = data.filter(d => d.count > 0).length; const daysWithoutViews = data.filter(d => d.count === 0).length; console.log(`Stats loaded: ${daysWithViews} days with views, ${daysWithoutViews} days without views`); @@ -62,15 +62,15 @@ export default function ViewStatsChart({ days = 365 }: ViewStatsChartProps) { const getColorForLevel = (level: number): string => { switch (level) { case 0: - return '#21262d'; // Нет просмотров - более светлый, чтобы был виден + return '#21262d'; // No views - lighter so it's visible case 1: - return '#0e4429'; // Низкий уровень + return '#0e4429'; // Low level case 2: - return '#006d32'; // Средний уровень + return '#006d32'; // Medium level case 3: - return '#26a641'; // Высокий уровень + return '#26a641'; // High level case 4: - return '#39d353'; // Очень высокий уровень + return '#39d353'; // Very high level default: return '#21262d'; } @@ -83,34 +83,34 @@ export default function ViewStatsChart({ days = 365 }: ViewStatsChartProps) { return `${days[date.getDay()]}, ${months[date.getMonth()]} ${date.getDate()}`; }; - // Группируем по неделям для отображения - // Убеждаемся, что все дни отображаются, даже если их меньше 7 в последней неделе + // Group by weeks for display + // Make sure all days are displayed, even if there are fewer than 7 in the last week const weeks: ViewStats[][] = []; - const weekMonths: (string | null)[] = []; // Месяц для каждой недели + const weekMonths: (string | null)[] = []; // Month for each week const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; for (let i = 0; i < stats.length; i += 7) { const week = stats.slice(i, i + 7); - // Заполняем неделю до 7 дней, если нужно (для правильного отображения) + // Fill week to 7 days if needed (for proper display) while (week.length < 7 && i + week.length < stats.length) { - // Это не должно произойти, но на всякий случай + // This shouldn't happen, but just in case break; } weeks.push(week); - // Определяем месяц для этой недели (берем первый день недели) + // Determine month for this week (take first day of week) if (week.length > 0) { const firstDay = new Date(week[0].date); const weekIndex = weeks.length - 1; - // Проверяем, начинается ли новый месяц в этой неделе - // Показываем месяц, если это первая неделя месяца или если предыдущая неделя была другого месяца + // Check if new month starts in this week + // Show month if this is first week of month or if previous week was different month let showMonth: string | null = null; if (weekIndex === 0) { - // Первая неделя - всегда показываем месяц + // First week - always show month showMonth = monthNames[firstDay.getMonth()]; } else { - // Проверяем предыдущую неделю + // Check previous week const prevWeek = weeks[weekIndex - 1]; if (prevWeek && prevWeek.length > 0) { const prevFirstDay = new Date(prevWeek[0].date); @@ -125,7 +125,7 @@ export default function ViewStatsChart({ days = 365 }: ViewStatsChartProps) { } } - // Убеждаемся, что у нас есть все дни + // Make sure we have all days const totalDays = weeks.reduce((sum, week) => sum + week.length, 0); if (totalDays !== stats.length) { console.warn(`Days mismatch: expected ${stats.length}, got ${totalDays}`); @@ -144,7 +144,7 @@ export default function ViewStatsChart({ days = 365 }: ViewStatsChartProps) { ); } - // Если нет данных, показываем пустую сетку + // If no data, show empty grid if (stats.length === 0) { return ( @@ -182,7 +182,7 @@ export default function ViewStatsChart({ days = 365 }: ViewStatsChartProps) { contentContainerStyle={styles.chartScrollContent} > - {/* Месяцы - отображаются над графиком */} + {/* Months - displayed above chart */} {weeks.map((week, weekIndex) => { const month = weekMonths[weekIndex]; @@ -194,7 +194,7 @@ export default function ViewStatsChart({ days = 365 }: ViewStatsChartProps) { })} - {/* График с квадратиками */} + {/* Chart with squares */} {weeks.length > 0 ? ( weeks.map((week, weekIndex) => ( @@ -227,7 +227,7 @@ export default function ViewStatsChart({ days = 365 }: ViewStatsChartProps) { - {/* Легенда - всегда видна */} + {/* Legend - always visible */} Less diff --git a/frontend/src/screens/ModernScreen.tsx b/frontend/src/screens/ModernScreen.tsx index 10a6888..050bee9 100644 --- a/frontend/src/screens/ModernScreen.tsx +++ b/frontend/src/screens/ModernScreen.tsx @@ -31,7 +31,7 @@ export default function ModernScreen() { const [searchQuery, setSearchQuery] = useState(''); const [dimensions, setDimensions] = useState(getScreenDimensions()); - // Отслеживаем изменение размера экрана + // Track screen size changes useEffect(() => { const subscription = Dimensions.addEventListener('change', ({ window }) => { setDimensions(window); @@ -445,7 +445,7 @@ export default function ModernScreen() { ); } -// Адаптивные размеры (используем начальное значение для создания стилей) +// Responsive sizes (use initial value to create styles) const getResponsiveStyles = (isDesktop: boolean) => ({ // Header headerPadding: isDesktop ? 12 : 20, @@ -487,7 +487,7 @@ const getResponsiveStyles = (isDesktop: boolean) => ({ filterChipTextSize: isDesktop ? 12 : 14, }); -// Используем начальное значение для создания базовых стилей +// Use initial value to create base styles const responsive = getResponsiveStyles(INITIAL_IS_DESKTOP); const styles = StyleSheet.create({ @@ -905,5 +905,5 @@ const styles = StyleSheet.create({ gap: responsive.toolbarGap, alignItems: 'center', }, - // Используем те же стили для checkbox и deleteIconButton + // Use the same styles for checkbox and deleteIconButton }); diff --git a/frontend/src/screens/Variant1_ClassicList.tsx b/frontend/src/screens/Variant1_ClassicList.tsx index 3d36195..ba704e5 100644 --- a/frontend/src/screens/Variant1_ClassicList.tsx +++ b/frontend/src/screens/Variant1_ClassicList.tsx @@ -13,13 +13,13 @@ import { apiClient } from '../api/client'; import { Link } from '../types'; /** - * ВАРИАНТ 1: Классический список + * VARIANT 1: Classic list * - * Особенности: - * - Вертикальный список всех ссылок - * - Форма добавления сверху - * - Простой и понятный интерфейс - * - Все функции на одном экране + * Features: + * - Vertical list of all links + * - Add form at the top + * - Simple and clear interface + * - All functions on one screen */ export default function Variant1_ClassicList() { const [links, setLinks] = useState([]); diff --git a/frontend/src/screens/Variant2_CardGrid.tsx b/frontend/src/screens/Variant2_CardGrid.tsx index 01b691c..576ff3b 100644 --- a/frontend/src/screens/Variant2_CardGrid.tsx +++ b/frontend/src/screens/Variant2_CardGrid.tsx @@ -14,13 +14,13 @@ import { apiClient } from '../api/client'; import { Link } from '../types'; /** - * ВАРИАНТ 2: Карточки в сетке + * VARIANT 2: Card grid * - * Особенности: - * - Ссылки отображаются в виде карточек - * - Модальное окно для добавления - * - Фильтрация по ресурсам - * - Более визуально привлекательный дизайн + * Features: + * - Links displayed as cards + * - Modal window for adding + * - Resource filtering + * - More visually appealing design */ export default function Variant2_CardGrid() { const [links, setLinks] = useState([]); diff --git a/frontend/src/screens/Variant3_Dashboard.tsx b/frontend/src/screens/Variant3_Dashboard.tsx index f5e5dcf..adcafe4 100644 --- a/frontend/src/screens/Variant3_Dashboard.tsx +++ b/frontend/src/screens/Variant3_Dashboard.tsx @@ -12,13 +12,13 @@ import { apiClient } from '../api/client'; import { Link } from '../types'; /** - * ВАРИАНТ 3: Дашборд со статистикой + * VARIANT 3: Dashboard with statistics * - * Особенности: - * - Статистика по ссылкам (всего, просмотрено, по ресурсам) - * - Быстрый доступ к случайным ссылкам - * - Компактный список с поиском - * - Акцент на аналитике + * Features: + * - Link statistics (total, viewed, by resources) + * - Quick access to random links + * - Compact list with search + * - Focus on analytics */ export default function Variant3_Dashboard() { const [links, setLinks] = useState([]); From a1495965c8830a1cc84cc103fead6f7f733c315e Mon Sep 17 00:00:00 2001 From: Ilya Danilov Date: Tue, 20 Jan 2026 23:41:14 +0300 Subject: [PATCH 3/3] refactor: standardize on Taskfile and remove Makefile --- .github/workflows/ci.yml | 18 +- coverage.html | 1915 ++++++++++++++++++++++++++++++++++++++ coverage.out | 475 +++++----- 3 files changed, 2164 insertions(+), 244 deletions(-) create mode 100644 coverage.html diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 88fa72b..30e57eb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -37,9 +37,9 @@ jobs: cache: true - name: Install Task - uses: arduino/setup-task@v2 - with: - version: latest + run: | + sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d -b ~/.local/bin + echo "$HOME/.local/bin" >> $GITHUB_PATH - name: Install dependencies run: | @@ -85,9 +85,9 @@ jobs: go-version: '1.23' - name: Install Task - uses: arduino/setup-task@v2 - with: - version: latest + run: | + sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d -b ~/.local/bin + echo "$HOME/.local/bin" >> $GITHUB_PATH - name: Run golangci-lint uses: golangci/golangci-lint-action@v4 @@ -111,9 +111,9 @@ jobs: cache: true - name: Install Task - uses: arduino/setup-task@v2 - with: - version: latest + run: | + sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d -b ~/.local/bin + echo "$HOME/.local/bin" >> $GITHUB_PATH - name: Build all services run: | diff --git a/coverage.html b/coverage.html new file mode 100644 index 0000000..e53d1b1 --- /dev/null +++ b/coverage.html @@ -0,0 +1,1915 @@ + + + + + + api-service: Go Coverage Report + + + +
+ +
+ not tracked + + no coverage + low coverage + * + * + * + * + * + * + * + * + high coverage + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/coverage.out b/coverage.out index c00a9c2..3fd1a39 100644 --- a/coverage.out +++ b/coverage.out @@ -1,141 +1,10 @@ mode: atomic -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:24.63,29.2 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:31.57,33.16 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:33.16,35.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:36.2,37.16 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:37.16,39.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:40.2,42.16 3 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:42.16,44.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:45.2,46.28 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:46.28,48.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:49.2,52.64 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:52.64,54.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:55.2,55.20 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:58.46,60.16 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:60.16,62.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:63.2,64.16 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:64.16,66.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:67.2,68.28 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:68.28,70.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:71.2,71.12 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:74.60,76.20 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:76.20,78.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:79.2,80.16 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:80.16,82.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:83.2,84.16 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:84.16,86.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:87.2,88.28 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:88.28,90.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:91.2,92.64 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:92.64,94.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:95.2,95.17 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/config.go:16.35,17.38 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/config.go:17.38,19.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/config.go:20.2,20.43 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/config.go:20.43,22.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/config.go:23.2,23.47 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/config.go:23.47,25.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/config.go:26.2,26.20 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/config.go:26.20,28.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/config.go:29.2,29.12 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:30.51,31.42 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:31.42,33.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:35.2,41.16 3 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:41.16,43.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:45.2,55.15 5 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:58.33,61.2 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:63.29,70.50 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:70.50,72.20 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:72.20,79.18 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:79.18,81.5 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:81.10,83.5 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:85.3,85.52 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:88.2,88.49 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:88.49,90.16 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:90.16,92.4 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:93.3,94.17 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:94.17,97.4 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:98.3,98.39 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:101.2,101.51 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:101.51,103.15 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:103.15,105.4 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:106.3,106.46 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:106.46,109.4 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:110.3,110.37 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:113.2,113.51 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:113.51,116.17 3 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:116.17,119.4 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:120.3,120.21 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:120.21,122.4 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:123.3,124.26 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:124.26,126.4 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:127.3,127.27 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:130.2,130.50 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:130.50,132.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:134.2,134.52 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:134.52,136.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:138.2,138.52 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:138.52,140.17 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:140.17,143.4 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:144.3,144.21 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:144.21,146.4 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:147.3,148.26 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:148.26,150.4 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:151.3,151.27 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:154.2,154.59 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:154.59,156.17 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:156.17,159.4 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:160.3,160.21 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:160.21,162.4 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:163.3,164.27 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:167.2,167.57 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:167.57,169.17 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:169.17,172.4 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:173.3,173.21 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:173.21,175.4 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:176.3,177.27 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:180.2,180.51 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:180.51,182.17 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:182.17,184.4 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:185.3,185.35 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:185.35,187.4 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:188.3,188.81 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:191.2,191.52 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:191.52,193.3 1 0 -github.com/danilovid/linkkeeper/internal/user-service/models.go:20.37,22.2 1 0 -github.com/danilovid/linkkeeper/internal/user-service/models.go:24.53,25.22 1 0 -github.com/danilovid/linkkeeper/internal/user-service/models.go:25.22,27.3 1 0 -github.com/danilovid/linkkeeper/internal/user-service/models.go:28.2,28.12 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:38.63,43.2 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:45.105,54.16 3 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:54.16,56.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:58.2,59.16 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:59.16,61.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:62.2,65.16 3 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:65.16,67.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:68.2,70.28 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:70.28,72.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:74.2,75.65 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:75.65,77.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:79.2,79.19 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:82.71,86.16 3 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:86.16,88.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:90.2,91.16 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:91.16,93.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:94.2,96.28 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:96.28,98.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:100.2,101.65 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:101.65,103.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:105.2,105.19 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:108.61,112.16 3 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:112.16,114.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:116.2,117.16 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:117.16,119.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:120.2,122.28 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:122.28,124.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:126.2,127.67 2 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:127.67,129.3 1 0 -github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:131.2,131.27 1 0 +github.com/danilovid/linkkeeper/cmd/api-service/main.go:21.13,33.12 8 0 +github.com/danilovid/linkkeeper/cmd/api-service/main.go:33.12,35.46 2 0 +github.com/danilovid/linkkeeper/cmd/api-service/main.go:35.46,37.4 1 0 +github.com/danilovid/linkkeeper/cmd/api-service/main.go:40.2,40.25 1 0 +github.com/danilovid/linkkeeper/cmd/api-service/main.go:40.25,44.3 3 0 +github.com/danilovid/linkkeeper/cmd/api-service/main.go:47.33,52.2 4 0 github.com/danilovid/linkkeeper/cmd/bot-service/main.go:14.13,25.16 4 0 github.com/danilovid/linkkeeper/cmd/bot-service/main.go:25.16,27.3 1 0 github.com/danilovid/linkkeeper/cmd/bot-service/main.go:29.2,30.34 2 0 @@ -145,75 +14,6 @@ github.com/danilovid/linkkeeper/cmd/bot-service/main.go:37.15,39.3 1 0 github.com/danilovid/linkkeeper/cmd/bot-service/main.go:40.2,41.32 2 0 github.com/danilovid/linkkeeper/cmd/bot-service/main.go:41.32,43.3 1 0 github.com/danilovid/linkkeeper/cmd/bot-service/main.go:44.2,44.45 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/http.go:21.51,29.2 4 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/http.go:31.41,33.2 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/http.go:35.27,60.2 13 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/http.go:62.52,63.71 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/http.go:63.71,71.3 3 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:36.53,38.2 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:40.44,41.54 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:41.54,43.61 2 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:43.61,46.3 2 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:47.2,54.17 5 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:54.17,57.4 2 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:58.3,58.57 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:62.41,63.54 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:63.54,66.17 3 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:66.17,69.4 2 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:70.3,70.52 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:74.42,75.54 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:75.54,78.18 3 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:78.18,80.4 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:81.3,82.17 2 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:82.17,85.4 2 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:86.3,87.30 2 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:87.30,89.4 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:90.3,90.36 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:94.44,95.54 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:95.54,98.17 3 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:98.17,101.4 2 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:102.3,102.52 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:106.44,107.54 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:107.54,110.62 3 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:110.62,113.4 2 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:114.2,114.20 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:114.20,117.3 2 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:118.2,118.25 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:118.25,121.3 2 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:122.2,127.17 3 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:127.17,130.4 2 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:131.3,131.52 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:135.44,136.54 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:136.54,138.54 2 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:138.54,141.4 2 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:142.3,142.38 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:146.48,147.54 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:147.54,150.17 3 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:150.17,153.4 2 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:154.3,154.52 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:158.50,159.54 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:159.54,161.17 2 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:161.17,163.4 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:164.3,165.17 2 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:165.17,168.4 2 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:169.3,169.37 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:173.58,177.2 3 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:179.51,180.9 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:181.46,182.50 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:183.50,184.52 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:185.10,186.66 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:190.56,200.2 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:202.47,203.15 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:203.15,205.3 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:206.2,207.16 2 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:207.16,209.3 1 0 -github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:210.2,210.15 1 0 -github.com/danilovid/linkkeeper/cmd/api-service/main.go:21.13,33.12 8 0 -github.com/danilovid/linkkeeper/cmd/api-service/main.go:33.12,35.46 2 0 -github.com/danilovid/linkkeeper/cmd/api-service/main.go:35.46,37.4 1 0 -github.com/danilovid/linkkeeper/cmd/api-service/main.go:40.2,40.25 1 0 -github.com/danilovid/linkkeeper/cmd/api-service/main.go:40.25,44.3 3 0 -github.com/danilovid/linkkeeper/cmd/api-service/main.go:47.33,52.2 4 0 github.com/danilovid/linkkeeper/internal/api-service/repository/link.go:18.41,20.2 1 0 github.com/danilovid/linkkeeper/internal/api-service/repository/link.go:32.107,38.67 2 0 github.com/danilovid/linkkeeper/internal/api-service/repository/link.go:38.67,40.3 1 0 @@ -278,6 +78,212 @@ github.com/danilovid/linkkeeper/internal/api-service/repository/link.go:202.30,2 github.com/danilovid/linkkeeper/internal/api-service/repository/link.go:203.44,205.3 1 0 github.com/danilovid/linkkeeper/internal/api-service/repository/link.go:206.2,206.12 1 0 github.com/danilovid/linkkeeper/internal/api-service/repository/link.go:209.42,219.2 1 0 +github.com/danilovid/linkkeeper/cmd/user-service/main.go:23.13,35.12 8 0 +github.com/danilovid/linkkeeper/cmd/user-service/main.go:35.12,37.46 2 0 +github.com/danilovid/linkkeeper/cmd/user-service/main.go:37.46,39.4 1 0 +github.com/danilovid/linkkeeper/cmd/user-service/main.go:42.2,42.25 1 0 +github.com/danilovid/linkkeeper/cmd/user-service/main.go:42.25,46.3 3 0 +github.com/danilovid/linkkeeper/cmd/user-service/main.go:49.33,54.2 4 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:39.63,44.2 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:46.126,55.16 3 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:55.16,57.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:59.2,60.16 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:60.16,62.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:63.2,66.16 3 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:66.16,68.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:69.2,71.28 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:71.28,73.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:75.2,76.65 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:76.65,78.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:80.2,80.19 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:83.92,87.16 3 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:87.16,89.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:91.2,92.16 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:92.16,94.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:95.2,97.28 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:97.28,99.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:101.2,102.65 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:102.65,104.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:106.2,106.19 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:109.82,113.16 3 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:113.16,115.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:117.2,118.16 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:118.16,120.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:121.2,123.28 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:123.28,125.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:127.2,128.67 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:128.67,130.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/user/client.go:132.2,132.27 1 0 +github.com/danilovid/linkkeeper/internal/user-service/models.go:20.37,22.2 1 0 +github.com/danilovid/linkkeeper/internal/user-service/models.go:24.53,25.22 1 0 +github.com/danilovid/linkkeeper/internal/user-service/models.go:25.22,27.3 1 0 +github.com/danilovid/linkkeeper/internal/user-service/models.go:28.2,28.12 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:25.63,30.2 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:32.78,34.16 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:34.16,36.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:37.2,38.16 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:38.16,40.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:41.2,43.16 3 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:43.16,45.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:46.2,47.28 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:47.28,49.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:50.2,53.64 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:53.64,55.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:56.2,56.20 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:59.67,61.16 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:61.16,63.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:64.2,65.16 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:65.16,67.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:68.2,69.28 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:69.28,71.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:72.2,72.12 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:75.81,77.20 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:77.20,79.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:80.2,81.16 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:81.16,83.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:84.2,85.16 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:85.16,87.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:88.2,89.28 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:89.28,91.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:92.2,93.64 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:93.64,95.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/api/client.go:96.2,96.17 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/http.go:21.51,29.2 4 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/http.go:31.41,33.2 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/http.go:35.27,60.2 13 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/http.go:62.52,63.71 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/http.go:63.71,71.3 3 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:36.53,38.2 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:40.44,41.54 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:41.54,43.62 2 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:43.62,46.4 2 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:47.3,54.17 5 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:54.17,57.4 2 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:58.3,58.57 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:62.41,63.54 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:63.54,66.17 3 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:66.17,69.4 2 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:70.3,70.52 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:74.42,75.54 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:75.54,78.18 3 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:78.18,80.4 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:81.3,82.17 2 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:82.17,85.4 2 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:86.3,87.30 2 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:87.30,89.4 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:90.3,90.36 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:94.44,95.54 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:95.54,98.17 3 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:98.17,101.4 2 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:102.3,102.52 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:106.44,107.54 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:107.54,110.62 3 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:110.62,113.4 2 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:114.3,114.21 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:114.21,117.4 2 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:118.3,118.26 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:118.26,121.4 2 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:122.3,127.17 3 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:127.17,130.4 2 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:131.3,131.52 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:135.44,136.54 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:136.54,138.54 2 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:138.54,141.4 2 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:142.3,142.38 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:146.48,147.54 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:147.54,150.17 3 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:150.17,153.4 2 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:154.3,154.52 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:158.50,159.54 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:159.54,161.17 2 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:161.17,163.4 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:164.3,165.17 2 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:165.17,168.4 2 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:169.3,169.37 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:173.58,177.2 3 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:179.51,180.9 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:181.46,182.50 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:183.50,184.52 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:185.10,186.66 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:190.56,200.2 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:202.47,203.15 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:203.15,205.3 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:206.2,207.16 2 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:207.16,209.3 1 0 +github.com/danilovid/linkkeeper/internal/api-service/transport/http/routers.go:210.2,210.15 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/config.go:16.35,17.38 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/config.go:17.38,19.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/config.go:20.2,20.43 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/config.go:20.43,22.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/config.go:23.2,23.47 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/config.go:23.47,25.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/config.go:26.2,26.20 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/config.go:26.20,28.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/config.go:29.2,29.12 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:31.51,32.42 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:32.42,34.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:36.2,42.16 3 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:42.16,44.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:46.2,56.15 5 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:59.33,62.2 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:64.29,71.50 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:71.50,73.20 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:73.20,82.18 3 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:82.18,84.5 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:84.10,86.5 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:88.3,88.52 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:91.2,91.49 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:91.49,93.16 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:93.16,95.4 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:96.3,98.17 3 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:98.17,101.4 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:102.3,102.39 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:105.2,105.51 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:105.51,107.15 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:107.15,109.4 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:110.3,111.51 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:111.51,114.4 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:115.3,115.37 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:118.2,118.51 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:118.51,122.17 4 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:122.17,125.4 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:126.3,126.21 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:126.21,128.4 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:129.3,130.26 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:130.26,132.4 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:133.3,133.27 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:136.2,136.50 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:136.50,138.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:140.2,140.52 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:140.52,142.3 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:144.2,144.52 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:144.52,147.17 3 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:147.17,150.4 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:151.3,151.21 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:151.21,153.4 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:154.3,155.26 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:155.26,157.4 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:158.3,158.27 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:161.2,161.59 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:161.59,164.17 3 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:164.17,167.4 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:168.3,168.21 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:168.21,170.4 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:171.3,172.27 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:175.2,175.57 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:175.57,178.17 3 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:178.17,181.4 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:182.3,182.21 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:182.21,184.4 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:185.3,186.27 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:189.2,189.51 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:189.51,191.17 2 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:191.17,193.4 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:194.3,194.35 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:194.35,196.4 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:197.3,197.81 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:200.2,200.52 1 0 +github.com/danilovid/linkkeeper/internal/bot-service/bot/wrapper.go:200.52,202.3 1 0 github.com/danilovid/linkkeeper/internal/api-service/usecase/link.go:14.66,16.2 1 9 github.com/danilovid/linkkeeper/internal/api-service/usecase/link.go:18.110,19.46 1 3 github.com/danilovid/linkkeeper/internal/api-service/usecase/link.go:19.46,21.3 1 0 @@ -301,16 +307,13 @@ github.com/danilovid/linkkeeper/internal/api-service/usecase/link.go:67.47,69.3 github.com/danilovid/linkkeeper/internal/api-service/usecase/link.go:70.2,70.42 1 0 github.com/danilovid/linkkeeper/internal/api-service/usecase/link.go:70.42,72.3 1 0 github.com/danilovid/linkkeeper/internal/api-service/usecase/link.go:73.2,73.12 1 0 -github.com/danilovid/linkkeeper/cmd/user-service/main.go:23.13,35.12 8 0 -github.com/danilovid/linkkeeper/cmd/user-service/main.go:35.12,37.46 2 0 -github.com/danilovid/linkkeeper/cmd/user-service/main.go:37.46,39.4 1 0 -github.com/danilovid/linkkeeper/cmd/user-service/main.go:42.2,42.25 1 0 -github.com/danilovid/linkkeeper/cmd/user-service/main.go:42.25,46.3 3 0 -github.com/danilovid/linkkeeper/cmd/user-service/main.go:49.33,54.2 4 0 github.com/danilovid/linkkeeper/pkg/config/config.go:16.20,31.2 6 0 github.com/danilovid/linkkeeper/pkg/config/config.go:33.44,34.32 1 0 github.com/danilovid/linkkeeper/pkg/config/config.go:34.32,36.3 1 0 github.com/danilovid/linkkeeper/pkg/config/config.go:37.2,37.12 1 0 +github.com/danilovid/linkkeeper/pkg/httpclient/client.go:14.85,22.2 1 0 +github.com/danilovid/linkkeeper/pkg/logger/logger.go:11.13,18.2 3 0 +github.com/danilovid/linkkeeper/pkg/logger/logger.go:20.26,23.2 2 0 github.com/danilovid/linkkeeper/pkg/database/postgresql/postgresql.go:15.46,17.16 2 0 github.com/danilovid/linkkeeper/pkg/database/postgresql/postgresql.go:17.16,19.3 1 0 github.com/danilovid/linkkeeper/pkg/database/postgresql/postgresql.go:20.2,20.21 1 0 @@ -345,9 +348,6 @@ github.com/danilovid/linkkeeper/pkg/database/postgresql/postgresql.go:81.56,83.4 github.com/danilovid/linkkeeper/pkg/database/postgresql/postgresql.go:84.3,84.99 1 0 github.com/danilovid/linkkeeper/pkg/database/postgresql/postgresql.go:84.99,86.4 1 0 github.com/danilovid/linkkeeper/pkg/database/postgresql/postgresql.go:88.2,88.12 1 0 -github.com/danilovid/linkkeeper/pkg/logger/logger.go:11.13,18.2 3 0 -github.com/danilovid/linkkeeper/pkg/logger/logger.go:20.26,23.2 2 0 -github.com/danilovid/linkkeeper/pkg/httpclient/client.go:14.85,22.2 1 0 github.com/danilovid/linkkeeper/internal/user-service/repository/user.go:16.54,18.2 1 8 github.com/danilovid/linkkeeper/internal/user-service/repository/user.go:20.62,22.2 1 7 github.com/danilovid/linkkeeper/internal/user-service/repository/user.go:24.74,27.16 3 3 @@ -372,27 +372,32 @@ github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:56. github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:56.25,59.3 2 1 github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:61.2,62.16 2 1 github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:62.16,66.3 3 0 -github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:68.2,80.33 4 1 -github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:83.70,88.16 4 3 -github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:88.16,91.3 2 1 -github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:93.2,94.16 2 2 -github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:94.16,98.3 3 1 -github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:100.2,111.33 3 1 -github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:114.78,119.61 4 0 -github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:119.61,122.3 2 0 -github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:124.2,125.16 2 0 -github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:125.16,129.3 3 0 -github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:131.2,142.33 3 0 -github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:145.74,150.61 4 2 -github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:150.61,153.3 2 0 -github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:155.2,156.16 2 2 -github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:156.16,160.3 3 0 -github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:162.2,164.33 3 2 +github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:68.2,80.56 4 1 +github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:80.56,82.3 1 0 +github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:85.70,90.16 4 3 +github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:90.16,93.3 2 1 +github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:95.2,96.16 2 2 +github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:96.16,100.3 3 1 +github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:102.2,113.56 3 1 +github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:113.56,115.3 1 0 +github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:118.78,123.61 4 0 +github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:123.61,126.3 2 0 +github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:128.2,129.16 2 0 +github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:129.16,133.3 3 0 +github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:135.2,146.56 3 0 +github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:146.56,148.3 1 0 +github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:151.74,156.61 4 2 +github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:156.61,159.3 2 0 +github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:161.2,162.16 2 2 +github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:162.16,166.3 3 0 +github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:168.2,170.56 3 2 +github.com/danilovid/linkkeeper/internal/user-service/transport/http/http.go:170.56,172.3 1 0 github.com/danilovid/linkkeeper/internal/user-service/transport/http/routers.go:13.40,33.71 8 0 -github.com/danilovid/linkkeeper/internal/user-service/transport/http/routers.go:33.71,36.3 2 0 -github.com/danilovid/linkkeeper/internal/user-service/transport/http/routers.go:38.2,38.27 1 0 -github.com/danilovid/linkkeeper/internal/user-service/transport/http/routers.go:41.49,42.71 1 0 -github.com/danilovid/linkkeeper/internal/user-service/transport/http/routers.go:42.71,48.3 2 0 +github.com/danilovid/linkkeeper/internal/user-service/transport/http/routers.go:33.71,35.50 2 0 +github.com/danilovid/linkkeeper/internal/user-service/transport/http/routers.go:35.50,37.4 1 0 +github.com/danilovid/linkkeeper/internal/user-service/transport/http/routers.go:40.2,40.27 1 0 +github.com/danilovid/linkkeeper/internal/user-service/transport/http/routers.go:43.49,44.71 1 0 +github.com/danilovid/linkkeeper/internal/user-service/transport/http/routers.go:44.71,50.3 2 0 github.com/danilovid/linkkeeper/internal/user-service/usecase/user.go:13.70,15.2 1 8 github.com/danilovid/linkkeeper/internal/user-service/usecase/user.go:17.122,25.44 2 3 github.com/danilovid/linkkeeper/internal/user-service/usecase/user.go:25.44,27.3 1 1