Skip to content

[OSDEV-1577] Add geo-bounding box support to the GET /v1/production-locations/ endpoint#503

Merged
mazursasha1990 merged 28 commits intomainfrom
OSDEV-1577-add-geo-bounding-box-support-to-the-production-locations-endpoint
Feb 12, 2025
Merged

[OSDEV-1577] Add geo-bounding box support to the GET /v1/production-locations/ endpoint#503
mazursasha1990 merged 28 commits intomainfrom
OSDEV-1577-add-geo-bounding-box-support-to-the-production-locations-endpoint

Conversation

@mazursasha1990
Copy link
Contributor

@mazursasha1990 mazursasha1990 commented Feb 7, 2025

OSDEV-1577 - [API] Add Geo-bounding box support to the production locations endpoint.

Added geo-bounding box query support to the GET /api/v1/production-locations/ endpoint. To filter production locations whose geopoints fall within the bounding box, it is necessary to specify valid values for the parameters geo_bounding_box[top], geo_bounding_box[left], geo_bounding_box[bottom], and geo_bounding_box[right].

The validation rules are as follows:

  • All coordinates of the geo-boundary box (top, left, bottom, right) must be provided.
  • All values must be numbers.
  • The top and bottom coordinates must be between -90 and 90.
  • The left and right coordinates must be between -180 and 180.
  • The top must be greater than the bottom.
  • The right must be greater than the left.

@mazursasha1990 mazursasha1990 self-assigned this Feb 7, 2025
@mazursasha1990 mazursasha1990 marked this pull request as draft February 7, 2025 18:47
@mazursasha1990 mazursasha1990 changed the title [OSDEV-1577] Add Geo-bounding box support to the GET /v1/production-locations/ endpoint [OSDEV-1577] Add geo-bounding box support to the GET /v1/production-locations/ endpoint Feb 7, 2025
@coderabbitai
Copy link

coderabbitai bot commented Feb 10, 2025

📝 Walkthrough

Walkthrough

This pull request introduces geo-bounding box query support for the GET /api/v1/production-locations/ endpoint. It adds a new validator class to check coordinate parameters and integrates new fields into the serializer. Additionally, methods in the query director and query builder support building queries with geographic filters. The changes also include updates to release notes, new constants and parameter handling, and several tests to verify proper functionality. An architectural note describes splitting the Django container into frontend (React) and backend (Django) components.

Changes

File(s) Change Summary
doc/release/RELEASE-NOTES.md Updated release notes to document geo-bounding box query support for the GET /api/v1/production-locations/ endpoint, including parameter validation and container architecture changes.
src/django/api/serializers/v1/opensearch_common_validators/geo_bounding_box_validator.py,
src/django/api/serializers/v1/production_locations_serializer.py
Added GeoBoundingBoxValidator class with a new validation method and introduced new fields (geo_bounding_box_top, geo_bounding_box_left, geo_bounding_box_bottom, geo_bounding_box_right) in the serializer for geo bounding box parameters.
src/django/api/tests/test_production_locations_query_builder.py,
src/django/api/tests/test_v1_utils.py,
src/tests/v1/test_production_locations.py
Introduced multiple tests covering geo bounding box functionality, including query builder integration, parameter serialization, and end-to-end API response validation.
src/django/api/views/v1/opensearch_query_builder/opensearch_query_director.py,
src/django/api/views/v1/opensearch_query_builder/production_locations_query_builder.py
Introduced methods (__process_filter and add_geo_bounding_box) to process geo bounding box filters during OpenSearch query construction.
src/django/api/views/v1/parameters_list.py,
src/django/api/views/v1/utils.py
Extended geo bounding box support by adding a new constant (GEO_BOUNDING_BOX) and integrating new coordinate keys in the query parameter serialization process.
src/django/api/constants.py Added CoordinateLimits class with constants for latitude and longitude limits.
src/django/api/serializers/v1/opensearch_common_validators/coordinates_validator.py Updated validation logic to use constants from CoordinateLimits for latitude and longitude checks.

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant API as API Endpoint (/api/v1/production-locations/)
    participant Serializer as ProductionLocationsSerializer
    participant Validator as GeoBoundingBoxValidator
    participant QueryDirector as OpenSearchQueryDirector
    participant QueryBuilder as ProductionLocationsQueryBuilder
    participant OpenSearch

    Client->>API: GET request with geo_bounding_box params
    API->>Serializer: Validate and process request data
    Serializer->>Validator: Validate geo bounding box parameters
    Validator-->>Serializer: Return validation result
    Serializer->>QueryDirector: Forward validated data
    QueryDirector->>QueryBuilder: Call add_geo_bounding_box(top, left, bottom, right)
    QueryBuilder->>OpenSearch: Build & execute query
    OpenSearch-->>QueryBuilder: Return query results
    QueryBuilder-->>QueryDirector: Send query clause
    QueryDirector-->>API: Return constructed query response
    API-->>Client: Deliver API response
Loading

Possibly related PRs

Suggested reviewers

  • Innavin369
  • roman-stolar
  • VadimKovalenkoSNF
  • vladsha-dev

📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between fe46ace and 416c0fa.

📒 Files selected for processing (1)
  • src/django/api/serializers/v1/opensearch_common_validators/coordinates_validator.py (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/django/api/serializers/v1/opensearch_common_validators/coordinates_validator.py
⏰ Context from checks skipped due to timeout of 90000ms (13)
  • GitHub Check: run-integration-test-code-quality
  • GitHub Check: run-flake8-linter
  • GitHub Check: run-fe-code-quality
  • GitHub Check: run-django-code-quality
  • GitHub Check: run-eslint-linter-and-prettier-formatter
  • GitHub Check: run-dd-code-quality
  • GitHub Check: run-countries-code-quality
  • GitHub Check: run-contricleaner-code-quality
  • GitHub Check: get-base-branch-fe-cov
  • GitHub Check: get-base-branch-dd-cov
  • GitHub Check: get-base-branch-django-cov
  • GitHub Check: get-base-branch-countries-cov
  • GitHub Check: get-base-branch-contricleaner-cov

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (2)
src/django/api/serializers/v1/opensearch_common_validators/geo_bounding_box_validator.py (1)

6-67: Add type hints for better code maintainability.

The validator implementation is correct and thorough. Consider adding type hints to improve code maintainability.

-    def validate_opensearch_params(self, data):
+    def validate_opensearch_params(self, data: dict) -> list[dict]:

Also, consider extracting the magic numbers to class constants:

+ class GeoBoundingBoxValidator(OpenSearchValidationInterface):
+     LAT_MIN = -90
+     LAT_MAX = 90
+     LNG_MIN = -180
+     LNG_MAX = 180
+
     def validate_opensearch_params(self, data: dict) -> list[dict]:
         errors = []
         fields = ['top', 'left', 'bottom', 'right']
         coords = {
             field: data.get(f'geo_bounding_box_{field}') for field in fields
         }

         # ... rest of the code ...

         range_limits = {
-            'top': (-90, 90),
-            'bottom': (-90, 90),
-            'left': (-180, 180),
-            'right': (-180, 180),
+            'top': (self.LAT_MIN, self.LAT_MAX),
+            'bottom': (self.LAT_MIN, self.LAT_MAX),
+            'left': (self.LNG_MIN, self.LNG_MAX),
+            'right': (self.LNG_MIN, self.LNG_MAX),
         }
src/tests/v1/test_production_locations.py (1)

122-159: Enhance test coverage for geo-bounding box functionality.

While the current test verifies basic functionality, consider adding tests for:

  1. Edge cases (coordinates at boundaries -90/90 and -180/180)
  2. Invalid bounding box (bottom > top or left > right)
  3. Points exactly on the bounding box edges
 def test_production_locations_geo_bounding_box(self):
+    # Test existing case
     doc = {
         "sector": [
             "Apparel"
         ],
         "address": "Test Address 2",
         "name": "Test Name 2",
         "country": {
             "alpha_2": "US"
         },
         "os_id": "US2020052SV22KJ",
         "coordinates": {
             "lon": -102.378162,
             "lat": 40.1166236
         },
     }
     self.open_search_client.index(
         index=self.production_locations_index_name,
         body=doc,
         id=self.open_search_client.count()
     )
     self.open_search_client.indices.refresh(
         index=self.production_locations_index_name
     )

     query = (
         "?geo_bounding_box[top]=41&geo_bounding_box[left]="
         "-103&geo_bounding_box[bottom]=39&geo_bounding_box[right]=-101"
     )
     response = requests.get(
             f"{self.root_url}/api/v1/production-locations/{query}",
             headers=self.basic_headers,
         )

     result = response.json()
     self.assertIsNotNone(result['data'])
     self.assertEqual(len(result['data']), 1)
     self.assertEqual(result['data'][0]['os_id'], 'US2020052SV22KJ')

+    # Test edge case: Point on boundary
+    doc_boundary = {
+        "os_id": "US2020052SV22KK",
+        "coordinates": {"lon": -180, "lat": 90}
+    }
+    self.open_search_client.index(
+        index=self.production_locations_index_name,
+        body=doc_boundary,
+        id=self.open_search_client.count()
+    )
+    self.open_search_client.indices.refresh(
+        index=self.production_locations_index_name
+    )
+
+    query_boundary = "?geo_bounding_box[top]=90&geo_bounding_box[left]=-180&geo_bounding_box[bottom]=89&geo_bounding_box[right]=-179"
+    response = requests.get(
+        f"{self.root_url}/api/v1/production-locations/{query_boundary}",
+        headers=self.basic_headers,
+    )
+    result = response.json()
+    self.assertEqual(len(result['data']), 1)
+    self.assertEqual(result['data'][0]['os_id'], 'US2020052SV22KK')
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between afdcf9b and e86ec7b.

📒 Files selected for processing (10)
  • doc/release/RELEASE-NOTES.md (1 hunks)
  • src/django/api/serializers/v1/opensearch_common_validators/geo_bounding_box_validator.py (1 hunks)
  • src/django/api/serializers/v1/production_locations_serializer.py (3 hunks)
  • src/django/api/tests/test_production_locations_query_builder.py (1 hunks)
  • src/django/api/tests/test_v1_utils.py (1 hunks)
  • src/django/api/views/v1/opensearch_query_builder/opensearch_query_director.py (2 hunks)
  • src/django/api/views/v1/opensearch_query_builder/production_locations_query_builder.py (1 hunks)
  • src/django/api/views/v1/parameters_list.py (1 hunks)
  • src/django/api/views/v1/utils.py (1 hunks)
  • src/tests/v1/test_production_locations.py (1 hunks)
🧰 Additional context used
🪛 markdownlint-cli2 (0.17.2)
doc/release/RELEASE-NOTES.md

25-25: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


26-26: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


27-27: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


28-28: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


29-29: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


30-30: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


36-36: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


37-37: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


38-38: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


39-39: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


40-40: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


41-41: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


42-42: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


43-43: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


44-44: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


45-45: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


46-46: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


47-47: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


48-48: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


49-49: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


50-50: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


51-51: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


52-52: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


53-53: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


54-54: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


55-55: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


56-56: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


57-57: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

🔇 Additional comments (9)
src/django/api/views/v1/parameters_list.py (1)

36-36: LGTM!

The new constant follows the existing naming convention and is appropriately placed within the class.

src/django/api/serializers/v1/production_locations_serializer.py (1)

61-64: LGTM!

The new fields and validator are well-integrated with the existing serializer structure.

Also applies to: 73-73

src/django/api/views/v1/utils.py (1)

27-30: LGTM!

The new geo bounding box parameters are correctly integrated with the existing parameter flattening logic.

src/django/api/views/v1/opensearch_query_builder/production_locations_query_builder.py (1)

133-143: LGTM! The geo-bounding box filter implementation looks correct.

The implementation properly constructs the geo_bounding_box filter structure required by OpenSearch.

src/django/api/tests/test_v1_utils.py (4)

197-214: Well-structured test for geo-bounding box parameter serialization!

The test effectively validates:

  • Successful serialization of all required parameters
  • Correct handling of edge case values (-180/180 for longitude, -90/90 for latitude)
  • Proper parameter naming convention

216-239: Good error case validation for missing parameters!

The test effectively validates:

  • Error handling when required coordinates are missing
  • Clear error message indicating all coordinates are required
  • Standard error response structure

241-272: Thorough validation of coordinate range constraints!

The test effectively validates:

  • Proper error handling for out-of-range values
  • Specific error messages identifying which coordinate is invalid
  • Correct aggregation of multiple validation errors

274-305: Excellent validation of coordinate ordering requirements!

The test effectively validates:

  • Proper error handling for invalid coordinate ordering
  • Clear error messages explaining the ordering requirements
  • Correct aggregation of multiple ordering validation errors
doc/release/RELEASE-NOTES.md (1)

22-30: Well-documented feature addition in release notes!

The release notes effectively document:

  • The new geo-bounding box query support
  • All validation rules for the coordinates
  • Clear link to the JIRA ticket for traceability
🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

25-25: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


26-26: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


27-27: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


28-28: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


29-29: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


30-30: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e86ec7b and dc5b82a.

📒 Files selected for processing (2)
  • src/django/api/serializers/v1/production_locations_serializer.py (2 hunks)
  • src/django/api/views/v1/opensearch_query_builder/opensearch_query_director.py (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/django/api/serializers/v1/production_locations_serializer.py
⏰ Context from checks skipped due to timeout of 90000ms (13)
  • GitHub Check: run-fe-code-quality
  • GitHub Check: run-integration-test-code-quality
  • GitHub Check: run-flake8-linter
  • GitHub Check: run-eslint-linter-and-prettier-formatter
  • GitHub Check: run-django-code-quality
  • GitHub Check: run-dd-code-quality
  • GitHub Check: run-countries-code-quality
  • GitHub Check: run-contricleaner-code-quality
  • GitHub Check: get-base-branch-fe-cov
  • GitHub Check: get-base-branch-django-cov
  • GitHub Check: get-base-branch-countries-cov
  • GitHub Check: get-base-branch-dd-cov
  • GitHub Check: get-base-branch-contricleaner-cov
🔇 Additional comments (1)
src/django/api/views/v1/opensearch_query_builder/opensearch_query_director.py (1)

44-44: LGTM!

The addition of __process_filter to the query building process follows the established pattern and is placed appropriately in the sequence of operations.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (4)
src/django/api/serializers/v1/opensearch_common_validators/coordinates_validator.py (3)

26-28: Update error message to use constants.

The error message contains hardcoded values (-90 and 90) while the validation uses constants. For consistency and maintainability, use the constants in the error message as well.

-                    "detail": "Latitude must be between -90 and 90 degrees."
+                    "detail": f"Latitude must be between {CoordinateLimits.LAT_MIN} and {CoordinateLimits.LAT_MAX} degrees."

35-38: Update error message to use constants.

Similarly, update the longitude error message to use constants instead of hardcoded values.

-                    "detail":
-                        "Longitude must be between -180 and 180 degrees."
+                    "detail":
+                        f"Longitude must be between {CoordinateLimits.LNG_MIN} and {CoordinateLimits.LNG_MAX} degrees."

30-33: Optimize nested if statements.

Per static analysis suggestion, combine the nested if statements for better readability.

-        if lng is not None:
-            if not (
-                CoordinateLimits.LNG_MIN <= lng <= CoordinateLimits.LNG_MAX
-            ):
+        if lng is not None and not (
+            CoordinateLimits.LNG_MIN <= lng <= CoordinateLimits.LNG_MAX
+        ):
🧰 Tools
🪛 Ruff (0.8.2)

30-33: Use a single if statement instead of nested if statements

Combine if statements using and

(SIM102)

src/django/api/constants.py (1)

210-215: Add docstring to document the coordinate limits class.

The class would benefit from documentation explaining its purpose and the units of measurement for the coordinates.

 class CoordinateLimits:
+    """
+    Defines the minimum and maximum limits for geographic coordinates.
+    
+    All values are in decimal degrees where:
+    - Latitude ranges from -90° (South) to +90° (North)
+    - Longitude ranges from -180° (West) to +180° (East)
+    """
     LAT_MIN = -90
     LAT_MAX = 90
     LNG_MIN = -180
     LNG_MAX = 180
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4deeb3f and fe46ace.

📒 Files selected for processing (3)
  • src/django/api/constants.py (1 hunks)
  • src/django/api/serializers/v1/opensearch_common_validators/coordinates_validator.py (2 hunks)
  • src/django/api/serializers/v1/opensearch_common_validators/geo_bounding_box_validator.py (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/django/api/serializers/v1/opensearch_common_validators/geo_bounding_box_validator.py
🧰 Additional context used
🪛 Ruff (0.8.2)
src/django/api/serializers/v1/opensearch_common_validators/coordinates_validator.py

30-33: Use a single if statement instead of nested if statements

Combine if statements using and

(SIM102)

⏰ Context from checks skipped due to timeout of 90000ms (12)
  • GitHub Check: run-integration-test-code-quality
  • GitHub Check: run-flake8-linter
  • GitHub Check: run-eslint-linter-and-prettier-formatter
  • GitHub Check: run-dd-code-quality
  • GitHub Check: run-contricleaner-code-quality
  • GitHub Check: get-base-branch-dd-cov
  • GitHub Check: run-fe-code-quality
  • GitHub Check: run-countries-code-quality
  • GitHub Check: get-base-branch-fe-cov
  • GitHub Check: get-base-branch-contricleaner-cov
  • GitHub Check: get-base-branch-countries-cov
  • GitHub Check: run-django-code-quality

roman-stolar
roman-stolar previously approved these changes Feb 11, 2025
Copy link
Contributor

@roman-stolar roman-stolar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks clear, please check 2 issue from SonarQube just to see if it something that need to be changed.
Approved.

@sonarqubecloud
Copy link

@mazursasha1990
Copy link
Contributor Author

Looks clear, please check 2 issue from SonarQube just to see if it something that need to be changed. Approved.

@roman-stolar Fixed.
Thank you.

Copy link
Contributor

@VadimKovalenkoSNF VadimKovalenkoSNF left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved. Left optional comment.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants