diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2c6fc94..30e57eb 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 + run: | + sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d -b ~/.local/bin + echo "$HOME/.local/bin" >> $GITHUB_PATH + - 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 + 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 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 + run: | + sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d -b ~/.local/bin + echo "$HOME/.local/bin" >> $GITHUB_PATH - - 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/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/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 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([]);