Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix code smells and update readme #146

Merged
merged 15 commits into from
Sep 21, 2024
Merged

fix code smells and update readme #146

merged 15 commits into from
Sep 21, 2024

Conversation

italopessoa
Copy link
Member

No description provided.

Copy link

coderabbitai bot commented Sep 20, 2024

Walkthrough

The changes include updates to the ByteMeBurger API's documentation and codebase, focusing on enhancing the README.md file with information about JWT token handling, code coverage badges, and an architecture diagram. Additionally, several classes across the application have been marked to be excluded from code coverage analysis. Kubernetes deployment configurations have been modified to include limits on ephemeral storage and to prevent automatic mounting of service account tokens. Furthermore, various properties in data transfer objects have been updated to ensure they are initialized to non-null values.

Changes

File Change Summary
README.md Updated to include badges, expanded description, new dependencies section, and added architecture diagram.
src/.../ServiceCollectionsExtensions.cs, src/.../MySqlDbContext.cs, src/.../ServiceExtensions.cs Added [ExcludeFromCodeCoverage] attribute to classes.
kubernetes/deployment-api.yaml, kubernetes/deployment-db.yaml, kubernetes/deployment-seq.yaml Set automountServiceAccountToken to false in deployments and added LimitRange resource.
src/.../CreateCustomerRequest.cs, src/.../CustomerDto.cs, src/.../OrderItemDto.cs, src/.../OrderListDto.cs, src/.../ProductDto.cs, src/.../SqsSettings.cs Modified properties to initialize with string.Empty.
src/.../Cpf.cs Added string replacement to sanitize CPF input.
src/.../MercadoPagoService.cs Added null-forgiving operators and changed methods to static.
src/.../MercadoPagoWebhookEvent.cs Modified string properties to initialize with string.Empty.
tests/.../UpdatePaymentStatusUseCaseTest.cs Updated test case to reflect changes in payment status verification.
tf/.terraform.lock.hcl Added AWS and Kubernetes provider configurations with version constraints.
tf/main.tf Added kubernetes_limit_range resource and updated deployments with automount_service_account_token.
tf/variables.tf Reformatted variable declarations for consistency.

Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 512f79f and 3ec092b.

Files selected for processing (1)
  • tf/main.tf (4 hunks)
Files skipped from review as they are similar to previous changes (1)
  • tf/main.tf

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 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 or @coderabbitai title 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.

@italopessoa italopessoa self-assigned this Sep 20, 2024
@italopessoa italopessoa added the Phase 3 Application Distribution label Sep 20, 2024
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: 7

Outside diff range and nitpick comments (3)
src/FIAP.TechChallenge.ByteMeBurger.Domain/Entities/Payment.cs (1)

11-11: Consider using a more appropriate default value for the PaymentType property.

Initializing the PaymentType property with a default value is a good practice to ensure a valid state for new instances and prevent null reference issues. However, using PaymentType.Test as the default value might not be appropriate for a production environment.

Consider using a more appropriate default value, such as PaymentType.Unknown or PaymentType.NotSpecified, to indicate that the payment type has not been explicitly set.

src/FIAP.TechChallenge.ByteMeBurger.MercadoPago.Gateway/MercadoPagoService.cs (2)

Line range hint 71-88: Consider making the guest email configurable.

Using a default email for guest customers is a valid approach. However, the email is currently hardcoded. Consider making it configurable, perhaps through the MercadoPagoOptions class.

private readonly string _guestEmail;

public MercadoPagoService(MercadoPagoOptions mercadoPagoOptions, ILogger<MercadoPagoService> logger)
{
    // ...
    _guestEmail = mercadoPagoOptions.GuestEmail ?? "[email protected]";
}

// ...

var paymentPayerRequest = order.Customer is null
    ? new PaymentPayerRequest
    {
        Email = _guestEmail,
    }
    : MapPaymentPayerRequest(order);

The method follows good practices:

  • Encapsulates the payment request construction logic, adhering to the Single Responsibility Principle.
  • Uses separate methods to map domain entities to the API request, utilizing the Anticorruption Layer pattern.

113-113: Remove the unnecessary null-forgiving operator.

The null-forgiving operator (!) is used on order, but it's unlikely that order would be null here as it's always passed as a non-null value from the GetPaymentCreateRequest method. Consider removing the operator to improve code clarity.

private static PaymentPayerRequest MapPaymentPayerRequest(Order order)
    => new()
    {
        Email = order.Customer.Email,
        // ...
    };

The method exhibits good practices:

  • It's a pure function that maps the domain entity to the API request, promoting testability.
  • Encapsulates the mapping logic, following the Single Responsibility Principle.
  • Utilizes the Anticorruption Layer pattern by isolating the domain from infrastructure concerns.
Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 59e02b8 and 13f1320.

Files ignored due to path filters (1)
  • aws-infra-phase-3.png is excluded by !**/*.png
Files selected for processing (21)
  • README.md (3 hunks)
  • postman/TechChallenge - Workflow testing.postman_collection.json (1 hunks)
  • postman/TechChallenge.postman_environment.json (1 hunks)
  • src/FIAP.TechChallenge.ByteMeBurger.Api/Controllers/CustomersController.cs (1 hunks)
  • src/FIAP.TechChallenge.ByteMeBurger.Api/DomainEventsHandler.cs (1 hunks)
  • src/FIAP.TechChallenge.ByteMeBurger.Api/GlobalExceptionHandler.cs (1 hunks)
  • src/FIAP.TechChallenge.ByteMeBurger.Api/Model/Customers/CreateCustomerRequest.cs (1 hunks)
  • src/FIAP.TechChallenge.ByteMeBurger.Api/Model/Products/CreateProductRequest.cs (1 hunks)
  • src/FIAP.TechChallenge.ByteMeBurger.Controllers/Dto/CustomerDto.cs (1 hunks)
  • src/FIAP.TechChallenge.ByteMeBurger.Domain/Entities/Payment.cs (1 hunks)
  • src/FIAP.TechChallenge.ByteMeBurger.MercadoPago.Gateway/Configuration/MercadoPagoOptions.cs (1 hunks)
  • src/FIAP.TechChallenge.ByteMeBurger.MercadoPago.Gateway/MercadoPagoService.cs (3 hunks)
  • src/FIAP.TechChallenge.ByteMeBurger.MercadoPago.Gateway/Model/MercadoPagoWebhookEvent.cs (2 hunks)
  • src/FIAP.TechChallenge.ByteMeBurger.Persistence/Dto/OrderItemDto.cs (1 hunks)
  • src/FIAP.TechChallenge.ByteMeBurger.Persistence/Dto/OrderListDto.cs (1 hunks)
  • src/FIAP.TechChallenge.ByteMeBurger.Persistence/Dto/ProductDto.cs (1 hunks)
  • src/FIAP.TechChallenge.ByteMeBurger.Persistence/Repository/OrderRepositoryDapper.cs (3 hunks)
  • tests/FIAP.TechChallenge.ByteMeBurger.Api.Test/Controllers/OrdersControllerTest.cs (1 hunks)
  • tests/FIAP.TechChallenge.ByteMeBurger.Application.Test/DomainServices/OrderTrackingCodeServiceTest.cs (1 hunks)
  • tests/FIAP.TechChallenge.ByteMeBurger.Controllers.Test/CustomerServiceTests.cs (0 hunks)
  • tests/FIAP.TechChallenge.ByteMeBurger.Controllers.Test/PaymentServiceTests.cs (1 hunks)
Files not reviewed due to no reviewable changes (1)
  • tests/FIAP.TechChallenge.ByteMeBurger.Controllers.Test/CustomerServiceTests.cs
Files skipped from review due to trivial changes (3)
  • src/FIAP.TechChallenge.ByteMeBurger.Api/GlobalExceptionHandler.cs
  • tests/FIAP.TechChallenge.ByteMeBurger.Api.Test/Controllers/OrdersControllerTest.cs
  • tests/FIAP.TechChallenge.ByteMeBurger.Application.Test/DomainServices/OrderTrackingCodeServiceTest.cs
Additional context used
Path-based instructions (14)
src/FIAP.TechChallenge.ByteMeBurger.Api/Controllers/CustomersController.cs (1)

Pattern **/*.cs: Validate all files and structures against Domain Driven Design, SOLID and Clean Architecture principles.

src/FIAP.TechChallenge.ByteMeBurger.Api/DomainEventsHandler.cs (1)

Pattern **/*.cs: Validate all files and structures against Domain Driven Design, SOLID and Clean Architecture principles.

src/FIAP.TechChallenge.ByteMeBurger.Api/Model/Customers/CreateCustomerRequest.cs (1)

Pattern **/*.cs: Validate all files and structures against Domain Driven Design, SOLID and Clean Architecture principles.

src/FIAP.TechChallenge.ByteMeBurger.Api/Model/Products/CreateProductRequest.cs (1)

Pattern **/*.cs: Validate all files and structures against Domain Driven Design, SOLID and Clean Architecture principles.

src/FIAP.TechChallenge.ByteMeBurger.Controllers/Dto/CustomerDto.cs (1)

Pattern **/*.cs: Validate all files and structures against Domain Driven Design, SOLID and Clean Architecture principles.

src/FIAP.TechChallenge.ByteMeBurger.Domain/Entities/Payment.cs (1)

Pattern **/*.cs: Validate all files and structures against Domain Driven Design, SOLID and Clean Architecture principles.

src/FIAP.TechChallenge.ByteMeBurger.MercadoPago.Gateway/Configuration/MercadoPagoOptions.cs (1)

Pattern **/*.cs: Validate all files and structures against Domain Driven Design, SOLID and Clean Architecture principles.

src/FIAP.TechChallenge.ByteMeBurger.MercadoPago.Gateway/MercadoPagoService.cs (1)

Pattern **/*.cs: Validate all files and structures against Domain Driven Design, SOLID and Clean Architecture principles.

src/FIAP.TechChallenge.ByteMeBurger.MercadoPago.Gateway/Model/MercadoPagoWebhookEvent.cs (1)

Pattern **/*.cs: Validate all files and structures against Domain Driven Design, SOLID and Clean Architecture principles.

src/FIAP.TechChallenge.ByteMeBurger.Persistence/Dto/OrderItemDto.cs (1)

Pattern **/*.cs: Validate all files and structures against Domain Driven Design, SOLID and Clean Architecture principles.

src/FIAP.TechChallenge.ByteMeBurger.Persistence/Dto/OrderListDto.cs (1)

Pattern **/*.cs: Validate all files and structures against Domain Driven Design, SOLID and Clean Architecture principles.

src/FIAP.TechChallenge.ByteMeBurger.Persistence/Dto/ProductDto.cs (1)

Pattern **/*.cs: Validate all files and structures against Domain Driven Design, SOLID and Clean Architecture principles.

src/FIAP.TechChallenge.ByteMeBurger.Persistence/Repository/OrderRepositoryDapper.cs (1)

Pattern **/*.cs: Validate all files and structures against Domain Driven Design, SOLID and Clean Architecture principles.

tests/FIAP.TechChallenge.ByteMeBurger.Controllers.Test/PaymentServiceTests.cs (1)

Pattern **/*.cs: Validate all files and structures against Domain Driven Design, SOLID and Clean Architecture principles.

LanguageTool
README.md

[uncategorized] ~11-~11: It seems likely that a singular genitive (’s) apostrophe is missing.
Context: ...un on EKS Cluster inside a private VPC, Customers enpoint will be deprecated or splited i...

(AI_HYDRA_LEO_APOSTROPHE_S_XS)

Additional comments not posted (28)
src/FIAP.TechChallenge.ByteMeBurger.Persistence/Dto/OrderListDto.cs (1)

9-9: Consider if allowing null values for the TrackingCode property aligns with the business requirements and the overall design of the OrderListDto class.

While initializing the TrackingCode property with null! makes the intended usage clearer to developers, it's important to consider if allowing null values aligns with the business requirements and the overall design of the OrderListDto class.

If the TrackingCode is an essential part of an order, it might be better to enforce a non-null value and handle the absence of a tracking code differently, such as using an empty string or a special value to indicate the absence of a tracking code.

Allowing null values could lead to unexpected behavior or null reference exceptions if not handled properly in other parts of the codebase.

To verify the impact of allowing null values for the TrackingCode property, run the following script:

src/FIAP.TechChallenge.ByteMeBurger.MercadoPago.Gateway/Configuration/MercadoPagoOptions.cs (2)

13-13: LGTM!

The changes to the WebhookSecret property are consistent and align with the goal of enhancing type safety:

  • The null! syntax ensures that the property is non-nullable at runtime.
  • The [Required] attribute indicates that the property is mandatory.
  • The [MinLength(1)] attribute ensures that the property value has a minimum length of 1.

These changes effectively prevent potential null reference exceptions and enforce the expected behavior of the property.


17-17: LGTM!

The changes to the AccessToken property are consistent and align with the goal of enhancing type safety, similar to the changes made to the WebhookSecret property:

  • The null! syntax ensures that the property is non-nullable at runtime.
  • The [Required] attribute indicates that the property is mandatory.
  • The [MinLength(1)] attribute ensures that the property value has a minimum length of 1.

These changes effectively prevent potential null reference exceptions and enforce the expected behavior of the property.

src/FIAP.TechChallenge.ByteMeBurger.Api/Model/Customers/CreateCustomerRequest.cs (1)

26-26: Great use of non-nullable reference types and validation attributes!

The initialization of the Cpf property with null! enforces stricter nullability checks and improves type safety. This change reduces the risk of null reference exceptions and enhances code reliability.

The [Required] and [MaxLength(14)] attributes ensure data integrity by validating that the Cpf property is set and has a maximum length of 14 characters. These attributes provide clear error messages to the client if the validation fails.

The CreateCustomerRequest record follows the Clean Architecture principles by being a simple DTO without any behavior. It adheres to the Single Responsibility Principle by only being responsible for data transfer.

src/FIAP.TechChallenge.ByteMeBurger.MercadoPago.Gateway/Model/MercadoPagoWebhookEvent.cs (3)

10-10: LGTM! The change aligns with SOLID principles.

The modification to include = null!; for the ApiVersion property enforces non-null constraints, which can help prevent potential null reference exceptions during runtime. This change aligns with the Single Responsibility Principle (SRP) by ensuring that the class has a single responsibility of representing a valid MercadoPagoWebhookEvent, and the Interface Segregation Principle (ISP) by ensuring that the class provides a clear and specific interface for its properties.


22-22: LGTM! The change aligns with SOLID principles.

The modification to include = null!; for the Type property enforces non-null constraints, which can help prevent potential null reference exceptions during runtime. This change aligns with the Single Responsibility Principle (SRP) by ensuring that the class has a single responsibility of representing a valid MercadoPagoWebhookEvent, and the Interface Segregation Principle (ISP) by ensuring that the class provides a clear and specific interface for its properties.


30-30: LGTM! The change aligns with SOLID principles.

The modification to include = null!; for the Id property enforces non-null constraints, which can help prevent potential null reference exceptions during runtime. This change aligns with the Single Responsibility Principle (SRP) by ensuring that the class has a single responsibility of representing a valid MercadoPagoWebhookData, and the Interface Segregation Principle (ISP) by ensuring that the class provides a clear and specific interface for its properties.

src/FIAP.TechChallenge.ByteMeBurger.Controllers/Dto/CustomerDto.cs (1)

15-15: LGTM!

The change to initialize the Cpf property with a null-forgiving operator enhances the type safety of the code by enforcing non-nullability. This aligns with the coding guidelines and reduces the risk of null reference exceptions at runtime.

The change does not introduce any violations of Domain Driven Design, SOLID or Clean Architecture principles.

src/FIAP.TechChallenge.ByteMeBurger.Domain/Entities/Payment.cs (1)

8-8: Verify that all existing usages of the Type property have been updated.

Marking the Type property as [Obsolete] is a good practice to discourage its usage in future code. However, it's important to ensure that all existing usages of this property have been updated to use the new alternative.

Run the following script to verify the usage of the Type property:

Verification successful

The obsolete Type property is not being used in the codebase.

The codebase has been successfully migrated to use the PaymentType enum instead of the obsolete Type property. No usages of Payment.Type or payment.Type were found in the codebase. The PaymentType enum is consistently used throughout the payment-related code for handling payment types.

It's safe to remove the obsolete Type property from the Payment class in a future refactoring, as it's no longer being used.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify that the `Type` property is not used in the codebase.

# Test: Search for the usage of the `Type` property. Expect: No occurrences.
rg --type cs -w $'Type'

Length of output: 1118


Script:

#!/bin/bash
# Description: Search for usages of the obsolete Payment.Type property

# Search for "Payment.Type" in C# files
echo "Searching for Payment.Type usage:"
rg --type cs 'Payment\.Type'

# Search for "payment.Type" (lowercase) in C# files
echo -e "\nSearching for payment.Type usage:"
rg --type cs 'payment\.Type'

Length of output: 221


Script:

#!/bin/bash
# Description: Search for usages of the Payment class

# Search for "Payment" in C# files, excluding the Payment.cs file itself
echo "Searching for Payment class usage:"
rg --type cs -g '!Payment.cs' '\bPayment\b' -C 2

# Search for "payment" (lowercase) in C# files, excluding the Payment.cs file
echo -e "\nSearching for 'payment' usage:"
rg --type cs -g '!Payment.cs' '\bpayment\b' -C 2

Length of output: 83261

src/FIAP.TechChallenge.ByteMeBurger.Api/Model/Products/CreateProductRequest.cs (1)

42-46: LGTM!

The change in method visibility from public to internal adheres to the principle of least privilege, which is a good practice. The method is a simple mapping function that converts the request to a domain model, which aligns with Clean Architecture principles. It does not violate any SOLID principles and has no apparent issues with the logic or syntax.

postman/TechChallenge.postman_environment.json (7)

72-75: LGTM!

The jwt_aud key-value pair is correctly defined, representing the JWT audience claim. Ensure that the server-side code properly validates this claim when verifying the token to confirm it is intended for the current application.


78-81: LGTM!

The jwt_iss key-value pair is correctly defined, representing the JWT issuer claim. Ensure that the server-side code properly validates this claim when verifying the token to confirm it is issued by a trusted source.


102-105: Verify the security of the jwt_secret value.

The jwt_secret key-value pair represents the secret key used for signing and verifying the integrity of the JWT. It is crucial to keep this value confidential and ensure it is not exposed in public repositories or client-side code. Please double-check that the secret key is securely stored and managed.


108-111: Verify the handling and security of the admin_cpf value.

The admin_cpf key-value pair seems to represent the CPF identifier for an admin user. If this value corresponds to real user data, ensure that it is handled securely and in compliance with relevant privacy regulations. Consider using a placeholder or test value if this is not a production environment.


114-117: Verify the handling and security of the kitchen_cpf value.

The kitchen_cpf key-value pair seems to represent the CPF identifier for a kitchen user or staff member. If this value corresponds to real user data, ensure that it is handled securely and in compliance with relevant privacy regulations. Consider using a placeholder or test value if this is not a production environment.


120-123: Verify the handling and security of the customer_cpf value.

The customer_cpf key-value pair seems to represent the CPF identifier for a customer user. If this value corresponds to real user data, ensure that it is handled securely and in compliance with relevant privacy regulations. Consider using a placeholder or test value if this is not a production environment.


126-129: Verify the handling of user roles and permissions.

The profile key-value pair is set to admin, indicating the user role for the Postman collection. Ensure that the application properly handles user roles and permissions based on this value, and that the necessary access controls are in place to restrict access to sensitive resources or operations.

tests/FIAP.TechChallenge.ByteMeBurger.Controllers.Test/PaymentServiceTests.cs (2)

30-30: LGTM!

The change from a private readonly field to a local variable for mockUpdateOrderPaymentUseCase is a good refactoring that improves encapsulation and adheres to the Single Responsibility Principle. By reducing the visibility of the mock object, the class becomes more focused on its primary purpose.


37-37: LGTM!

The constructor update to use the local variable mockUpdateOrderPaymentUseCase is a necessary change to match the refactoring of the mock object. The change is implemented correctly and maintains the functionality of the constructor.

src/FIAP.TechChallenge.ByteMeBurger.Api/DomainEventsHandler.cs (1)

114-114: LGTM!

Calling GC.SuppressFinalize(this) in the Dispose method is a good practice that aligns with the Dispose pattern. It can help optimize garbage collection by explicitly indicating that this object does not need finalization. The change enhances resource management without any apparent issues or side effects.

README.md (3)

5-6: Great addition of SonarCloud badges!

The coverage and quality gate status badges provide valuable insights into the project's testing coverage and code quality at a glance. They enhance the documentation and give readers a quick overview of the project's health.


26-29: Nice addition of the "Dependencies" section!

Documenting the project's dependencies, such as the VPC and Database repositories, is a good practice. It provides additional context for users and helps them understand the infrastructure setup required for the project.


141-143: Great addition of the architecture diagram!

The architecture diagram is a valuable addition to the documentation. It illustrates the infrastructure setup for the project and provides a visual representation of the system's design, enhancing the overall understanding of the project's architecture.

src/FIAP.TechChallenge.ByteMeBurger.MercadoPago.Gateway/MercadoPagoService.cs (1)

Line range hint 142-158: Good use of a static method for the pure mapping function.

Marking the MapPaymentCreateRequest method as static is a good decision as it's a pure function that doesn't access any instance members of the class. Static methods are ideal for utility functions like this that don't maintain state.

The method demonstrates solid practices:

  • It's a pure function that maps domain entities and parameters to the API request, promoting testability.
  • Encapsulates the mapping logic, following the Single Responsibility Principle.
  • Utilizes the Anticorruption Layer pattern by isolating the domain from infrastructure concerns.
src/FIAP.TechChallenge.ByteMeBurger.Persistence/Repository/OrderRepositoryDapper.cs (3)

124-124: LGTM!

The change from Any() to Count > 0 improves code clarity by explicitly conveying the intent of checking if the dictionary has any elements.


149-149: LGTM!

The change simplifies the error logging statement and improves readability by logging the exception as a parameter. This is a common and recommended practice.


175-175: LGTM!

The change is consistent with the previous logging statement change. It simplifies the error logging statement and improves readability by logging the exception as a parameter.

postman/TechChallenge - Workflow testing.postman_collection.json (1)

983-992: LGTM!

The prerequest script enhances the flexibility and usability of the collection by dynamically adding the CPF header based on the profile environment variable. The logic is correct and the logging messages provide useful information about the request being made.

@@ -4,7 +4,7 @@ internal class OrderItemDto
{
public Guid OrderId { get; set; }
public Guid ProductId { get; set; }
public string ProductName { get; set; }
public string ProductName { get; set; } = null!;
Copy link

Choose a reason for hiding this comment

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

Consider alternative approaches to ensure non-nullability.

Initializing the ProductName property to null! is not a common practice and may cause confusion. If the property is intended to be non-nullable, consider the following alternatives:

  1. Initialize the property with a non-null default value, such as an empty string:
public string ProductName { get; set; } = string.Empty;
  1. Mark the property as required using a constructor:
public class OrderItemDto
{
    // ...
    public string ProductName { get; set; }

    public OrderItemDto(/* other parameters */, string productName)
    {
        // ...
        ProductName = productName;
    }
}
  1. Use a validation framework, such as FluentValidation, to ensure that the property is not null when the object is created or updated.

namespace FIAP.TechChallenge.ByteMeBurger.Persistence.Dto;

public class ProductDto
{
public Guid Id { get; set; }

public string Name { get; set; }
public string Name { get; set; } = null!;
Copy link

Choose a reason for hiding this comment

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

Avoid using null-forgiving operator for non-nullable reference types.

The null! initialization is a null-forgiving operator that suppresses the compiler warning for the non-nullable reference type when assigning null. However, it doesn't actually prevent null assignment and can still lead to null reference exceptions at runtime.

It's better to enforce non-nullability through constructors or factory methods to ensure the Name property is always assigned a valid value.

Consider applying this diff to remove the null! initialization and enforce non-nullability through the constructor:

 public class ProductDto
 {
     public Guid Id { get; set; }
 
-    public string Name { get; set; } = null!;
+    public string Name { get; set; }
 
     public string Description { get; set; }
 
     public int Category { get; set; }
 
     public decimal Price { get; set; }
 
     public string Images { get; set; }
 
     public DateTime Created { get; set; }
 
     public DateTime? Updated { get; set; }
 
-    public ProductDto()
+    public ProductDto(string name)
     {
+        Name = name;
     }
 }

Committable suggestion was skipped due to low confidence.

Comment on lines +84 to +87
"key": "jwt_iat",
"value": "123123",
"type": "default",
"enabled": true
Copy link

Choose a reason for hiding this comment

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

Use a valid Unix timestamp for the jwt_iat value.

The jwt_iat key-value pair represents the JWT issued at claim. However, the current value 123123 does not seem to be a valid Unix timestamp. Please update it to a number containing the number of seconds from 1970-01-01T00:00:00Z UTC until the desired issued at date/time.

Comment on lines +96 to +99
"key": "jwt_exp",
"value": "",
"type": "any",
"enabled": true
Copy link

Choose a reason for hiding this comment

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

Provide a valid Unix timestamp for the jwt_exp value.

The jwt_exp key-value pair represents the JWT expiration time claim. The current value is an empty string, which is not valid. Please update it to a number containing the number of seconds from 1970-01-01T00:00:00Z UTC until the desired expiration date/time.

@@ -12,6 +12,7 @@ namespace FIAP.TechChallenge.ByteMeBurger.Api.Controllers;
/// </summary>
/// <param name="customerService">Customer service (port implementation).</param>
/// <param name="logger">Logger</param>
[Obsolete("To be migrated to different project")]
Copy link

Choose a reason for hiding this comment

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

Consider refactoring the controller to follow SOLID principles

The [Obsolete] attribute is a good way to communicate that the controller is being migrated to a different project. However, the controller has the following SOLID principle violations:

  • Single Responsibility Principle (SRP): The controller is handling multiple concerns (customers and orders) based on the method names. Consider splitting the controller into smaller, more focused controllers that handle a single responsibility.

  • Dependency Inversion Principle (DIP): The controller is tightly coupled to the ICustomerService and ILogger implementations. Consider using constructor injection and depending on abstractions (interfaces) instead of concrete implementations.

  • Interface Segregation Principle (ISP): The controller depends on the ICustomerService interface which may contain methods that the controller does not use. Consider creating smaller, more specific interfaces that the controller depends on.

Refactoring the controller to follow SOLID principles will make it more maintainable, testable, and easier to evolve over time.

README.md Outdated
## Description
This repository contains the source code for the ByteMeBurger API, part of the FIAP Tech Challenge. The API is designed to manage a burger restaurant's operations, including order placement, customer registration, and product management. The recent updates introduce a new endpoint for customer registration and enhance various aspects of the application, such as error handling, data models, and service configurations.

Endpoints are protected since JWT token is now required. Since this application will run on EKS Cluster inside a private VPC, Customers enpoint will be deprecated or splited into a different service. Customers information can be extracted from token, since it's generated and validated internally.
Copy link

Choose a reason for hiding this comment

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

Documentation update looks good, but please fix the typo.

The documentation update regarding the shift towards JWT token-based authentication and the potential deprecation or splitting of the Customers endpoint aligns well with the architectural changes of running the application in an EKS Cluster within a private VPC. Extracting customer information from the JWT token is a good approach in this context.

However, please fix the typo identified by the static analysis hint:

  • "Customers enpoint" should be "Customers endpoint"
Tools
LanguageTool

[uncategorized] ~11-~11: It seems likely that a singular genitive (’s) apostrophe is missing.
Context: ...un on EKS Cluster inside a private VPC, Customers enpoint will be deprecated or splited i...

(AI_HYDRA_LEO_APOSTROPHE_S_XS)

Comment on lines +57 to +59
ExternalReference = mercadoPagoPayment!.Id.ToString(),
OrderId = order.Id,
Amount = paymentCreateRequest.TransactionAmount.Value
Amount = paymentCreateRequest!.TransactionAmount.Value
Copy link

Choose a reason for hiding this comment

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

Use caution with the null-forgiving operator.

The null-forgiving operator (!) is used on mercadoPagoPayment and paymentCreateRequest. While this suppresses compiler warnings, it can lead to runtime null reference exceptions if the values are actually null. Consider adding explicit null checks instead.

if (mercadoPagoPayment is null)
{
    throw new InvalidOperationException("MercadoPago payment creation failed.");
}

if (paymentCreateRequest is null)
{
    throw new InvalidOperationException("Payment create request is null.");
}

On a positive note, the method adheres to the SOLID principles and DDD patterns:

  • Implements the IPaymentGateway interface, following the Dependency Inversion Principle.
  • Has a single responsibility of creating a payment, aligning with the Single Responsibility Principle.
  • Maps the domain Order entity to the MercadoPago API request/response, utilizing the Anticorruption Layer pattern.

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

Outside diff range and nitpick comments (1)
tf/main.tf (1)

267-270: Consider removing commented-out code for a cleaner codebase.

The annotations related to AWS load balancer configurations are commented out. If they are no longer needed, it's best to remove them to maintain code cleanliness and readability. If they might be required in the future, consider documenting their purpose elsewhere.

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 8b5b2ea and 010cb88.

Files selected for processing (19)
  • kubernetes/deployment-api.yaml (2 hunks)
  • kubernetes/deployment-db.yaml (1 hunks)
  • kubernetes/deployment-seq.yaml (1 hunks)
  • src/FIAP.TechChallenge.ByteMeBurger.Api/Model/Customers/CreateCustomerRequest.cs (1 hunks)
  • src/FIAP.TechChallenge.ByteMeBurger.Application/UseCases/Payment/UpdatePaymentStatusUseCase.cs (0 hunks)
  • src/FIAP.TechChallenge.ByteMeBurger.Controllers/Dto/CustomerDto.cs (1 hunks)
  • src/FIAP.TechChallenge.ByteMeBurger.Domain/ValueObjects/Cpf.cs (1 hunks)
  • src/FIAP.TechChallenge.ByteMeBurger.MercadoPago.Gateway/MercadoPagoService.cs (4 hunks)
  • src/FIAP.TechChallenge.ByteMeBurger.MercadoPago.Gateway/Model/MercadoPagoWebhookEvent.cs (2 hunks)
  • src/FIAP.TechChallenge.ByteMeBurger.Persistence/Dto/OrderItemDto.cs (1 hunks)
  • src/FIAP.TechChallenge.ByteMeBurger.Persistence/Dto/OrderListDto.cs (1 hunks)
  • src/FIAP.TechChallenge.ByteMeBurger.Persistence/Dto/ProductDto.cs (1 hunks)
  • src/FIAP.TechChallenge.ByteMeBurger.Persistence/MySqlDbContext.cs (1 hunks)
  • src/FIAP.TechChallenge.ByteMeBurger.Publisher.Sqs/ServiceExtensions.cs (1 hunks)
  • src/FIAP.TechChallenge.ByteMeBurger.Publisher.Sqs/SqsSettings.cs (2 hunks)
  • tests/FIAP.TechChallenge.ByteMeBurger.Application.Test/UseCases/Payment/UpdatePaymentStatusUseCaseTest.cs (2 hunks)
  • tf/.terraform.lock.hcl (1 hunks)
  • tf/main.tf (4 hunks)
  • tf/variables.tf (1 hunks)
Files not reviewed due to no reviewable changes (1)
  • src/FIAP.TechChallenge.ByteMeBurger.Application/UseCases/Payment/UpdatePaymentStatusUseCase.cs
Files skipped from review due to trivial changes (3)
  • src/FIAP.TechChallenge.ByteMeBurger.Publisher.Sqs/ServiceExtensions.cs
  • tf/.terraform.lock.hcl
  • tf/variables.tf
Files skipped from review as they are similar to previous changes (7)
  • src/FIAP.TechChallenge.ByteMeBurger.Api/Model/Customers/CreateCustomerRequest.cs
  • src/FIAP.TechChallenge.ByteMeBurger.Controllers/Dto/CustomerDto.cs
  • src/FIAP.TechChallenge.ByteMeBurger.MercadoPago.Gateway/MercadoPagoService.cs
  • src/FIAP.TechChallenge.ByteMeBurger.MercadoPago.Gateway/Model/MercadoPagoWebhookEvent.cs
  • src/FIAP.TechChallenge.ByteMeBurger.Persistence/Dto/OrderItemDto.cs
  • src/FIAP.TechChallenge.ByteMeBurger.Persistence/Dto/OrderListDto.cs
  • src/FIAP.TechChallenge.ByteMeBurger.Persistence/Dto/ProductDto.cs
Additional context used
Path-based instructions (4)
src/FIAP.TechChallenge.ByteMeBurger.Domain/ValueObjects/Cpf.cs (1)

Pattern **/*.cs: Validate all files and structures against Domain Driven Design, SOLID and Clean Architecture principles.

src/FIAP.TechChallenge.ByteMeBurger.Persistence/MySqlDbContext.cs (1)

Pattern **/*.cs: Validate all files and structures against Domain Driven Design, SOLID and Clean Architecture principles.

src/FIAP.TechChallenge.ByteMeBurger.Publisher.Sqs/SqsSettings.cs (1)

Pattern **/*.cs: Validate all files and structures against Domain Driven Design, SOLID and Clean Architecture principles.

tests/FIAP.TechChallenge.ByteMeBurger.Application.Test/UseCases/Payment/UpdatePaymentStatusUseCaseTest.cs (1)

Pattern **/*.cs: Validate all files and structures against Domain Driven Design, SOLID and Clean Architecture principles.

Additional comments not posted (15)
src/FIAP.TechChallenge.ByteMeBurger.Publisher.Sqs/SqsSettings.cs (4)

11-11: LGTM!

Initializing the QueueName property to string.Empty is a good practice to avoid null reference exceptions and improve code readability. This change aligns with the coding guideline to ensure properties are initialized to non-null values.


21-21: LGTM!

Initializing the Region property to string.Empty is a good practice to avoid null reference exceptions and improve code readability. This change aligns with the coding guideline to ensure properties are initialized to non-null values.


26-26: LGTM!

Initializing the ClientSecret property to string.Empty is a good practice to avoid null reference exceptions and improve code readability. This change aligns with the coding guideline to ensure properties are initialized to non-null values.


31-31: LGTM!

Initializing the ClientId property to string.Empty is a good practice to avoid null reference exceptions and improve code readability. This change aligns with the coding guideline to ensure properties are initialized to non-null values.

src/FIAP.TechChallenge.ByteMeBurger.Persistence/MySqlDbContext.cs (2)

2-2: LGTM!

The using directive is required to use the [ExcludeFromCodeCoverage] attribute and is correctly added.


9-9: Excluding the persistence layer class from code coverage is a common practice.

The [ExcludeFromCodeCoverage] attribute is correctly applied to the MySqlDbContext class. It is a common practice to exclude persistence layer classes from code coverage analysis as they are typically difficult to test and are not part of the core business logic.

kubernetes/deployment-seq.yaml (1)

18-18: Verify that the application does not require the service account token.

Disabling the automatic mounting of the service account token is a good security practice. However, please ensure that the application running in the container does not rely on the service account token for accessing the Kubernetes API. If it does, this change may break that functionality.

kubernetes/deployment-db.yaml (1)

18-18: Verify if the application requires the service account token.

Setting automountServiceAccountToken to false is a good security practice to prevent unnecessary exposure of the service account token to the container.

However, please ensure that the application running in the container does not rely on the service account token for accessing the Kubernetes API. If it does, you might need to update the configuration to mount the token or use an alternative authentication mechanism.

tests/FIAP.TechChallenge.ByteMeBurger.Application.Test/UseCases/Payment/UpdatePaymentStatusUseCaseTest.cs (2)

27-27: LGTM!

The change in payment status from PaymentStatus.Paid to PaymentStatus.Approved aligns with the AI-generated summary and appears to be a valid update to the test case.


41-42: LGTM!

The update to the verification step for _mockUpdateOrderStatusUseCase aligns with the AI-generated summary. The change enhances the specificity of the verification process by ensuring that the Execute method is called with any Guid and any OrderStatus, which is an improvement over simply verifying that the method was called.

kubernetes/deployment-api.yaml (2)

1-10: LGTM! The LimitRange for ephemeral storage is a good addition.

Setting a default limit for ephemeral storage helps prevent containers from consuming excessive storage resources. The limit of "300Mi" seems reasonable for most use cases.

However, please ensure that this limit is sufficient for your application's requirements. If any containers require more ephemeral storage, you may need to adjust the limit or set container-specific overrides.

Also, communicate this change to the development team so they are aware of the limit and can design their applications accordingly.


29-29: Verify that disabling the automatic mounting of the service account token doesn't break the application.

Setting automountServiceAccountToken to false is a good security practice as it reduces the attack surface by preventing unnecessary access to the service account token.

However, please ensure that your application doesn't rely on the service account token for any functionality, such as accessing the Kubernetes API or authenticating with other services.

If the application requires the service account token, you may need to refactor the code to use alternative authentication methods or explicitly mount the token only in the containers that need it.

To verify the impact of this change, you can run the following script to search for any usage of the service account token in the application code:

If the script yields any results, it indicates that the application may be using the service account token, and further investigation is needed to ensure the change doesn't break the functionality.

Verification successful

Disabling automountServiceAccountToken is safe and improves security

The verification process has confirmed that setting automountServiceAccountToken: false is a safe and beneficial change for your deployment. Here's why:

  • No Go files or other code interacting with the Kubernetes API were found in the repository.
  • There's no evidence of service account token usage or Kubernetes client configuration in the codebase.

This change effectively reduces the attack surface by preventing unnecessary access to the service account token, without impacting the application's functionality.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash

# Search for usage of the default service account token paths
rg --type go '/var/run/secrets/kubernetes.io/serviceaccount' 

# Search for Kubernetes client authentication configuration
rg --type go 'rest.InClusterConfig'

Length of output: 394


Script:

#!/bin/bash

# Check for Go files
echo "Checking for Go files:"
fd -e go

# Search for service account token usage without type filtering
echo -e "\nSearching for service account token usage:"
rg '/var/run/secrets/kubernetes.io/serviceaccount'

# Search for Kubernetes client configuration without type filtering
echo -e "\nSearching for Kubernetes client configuration:"
rg 'rest.InClusterConfig'

# Search for other indicators of Kubernetes API interaction
echo -e "\nSearching for other Kubernetes API interactions:"
rg 'k8s.io/client-go'
rg 'kubernetes.NewForConfig'
rg 'clientset.CoreV1()'

Length of output: 542

src/FIAP.TechChallenge.ByteMeBurger.Domain/ValueObjects/Cpf.cs (1)

34-34: LGTM!

The additional string replacement operation to remove newline characters from the CPF string is a good enhancement to the sanitation process. It potentially prevents formatting issues when processing CPF values and aligns with the Single Responsibility Principle by keeping the method focused on its primary task of sanitizing the CPF string. The change does not violate any other SOLID principles or Clean Architecture guidelines.

tf/main.tf (2)

172-172: Good practice: Disabling automounting of service account tokens.

Setting automount_service_account_token = false enhances security by preventing pods from unnecessarily accessing the Kubernetes API server when not needed.


308-308: Good practice: Disabling automounting of service account tokens.

Setting automount_service_account_token = false enhances security by preventing pods from unnecessarily accessing the Kubernetes API server when not needed.

tf/main.tf Show resolved Hide resolved
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Copy link

Terraform Cloud Plan Output

Plan: 9 to add, 0 to change, 0 to destroy.

Terraform Cloud Plan

Copy link

sonarcloud bot commented Sep 21, 2024

Quality Gate Failed Quality Gate failed

Failed conditions
0.0% Coverage on New Code (required ≥ 80%)

See analysis details on SonarCloud

@italopessoa italopessoa merged commit c52ba08 into main Sep 21, 2024
5 of 6 checks passed
@italopessoa italopessoa deleted the readme branch September 23, 2024 14:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Phase 3 Application Distribution
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant