Skip to content

Instantly share code, notes, and snippets.

View gbzarelli's full-sized avatar
Coding...

Guilherme Biff Zarelli gbzarelli

Coding...
View GitHub Profile
@gbzarelli
gbzarelli / ArquiteturaHexagonal.md
Last active April 19, 2024 13:51
Exemplo de implementação da Arquitetura Hexagonal com garantias por testes unitários

Arquitetura Hexagonal

A Arquitetura Hexagonal promove a modularidade, flexibilidade e manutenibilidade do código, permitindo que as mudanças nos componentes externos não afetem diretamente a lógica de negócios. Essa abordagem é especialmente útil em sistemas nos quais a evolução das regras de negócio é frequente, e a capacidade de adaptação a mudanças é crucial.

Estrutura

A estrutura proposta por Alister Cockburn em seu artigo, visa o isolamento da camada de aplicação (core do negócio) fornecendo portas para as implementações de entrada e saída da aplicação, para atender os padrões propostos pela arquitetura, usamos o seguinte modelo de estrutura para implementação

image

@gbzarelli
gbzarelli / Order.java
Last active November 21, 2023 18:35
Domain model - Rich Sample
// Remoção nas notações globais do Lombook, deixando-as específicas e garantindo mais imutablidade para o domínio
public class Order {
// Considere a criação de objetos usando static factory
//Static factory para a criação de uma nova Order:
public static Order create(final OrderId orderId, final List<Product> items, final BigDecimal orderAmount) {
return new Order(orderId, items, null, orderAmount);
}
@gbzarelli
gbzarelli / Order.java
Last active November 21, 2023 14:24
Domain model - Anemic Sample
@AllArgsConstructor
@Getter
@Setter
public class Order {
private String id;
private List<Product> items;
private Payment payment;
@gbzarelli
gbzarelli / RabbitmqConnectionConfig.java
Created September 25, 2023 15:20
RabbitMQ - Graceful shutdown - Configure Shutdown timeout in rabbitmq
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.amqp.SimpleRabbitListenerContainerFactoryConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitmqConnectionConfig {
private final AmazonS3 amazonS3;
private final KafkaTemplate<String, String> kafkaTemplate;
private final RedisTemplate<String, Integer> redisTemplate;
public static final String DEFAULT_KEY = "default-key";
public static final String KAFKA_TOPIC = "kafka-topic";
public static final String CSV_DELIMITER = ";";
public void readFile(String file) {
final var s3Object = amazonS3.getObject("/file-reader-bucket", file);
@gbzarelli
gbzarelli / Kafka_with_KafkaUI__docker-compose.yaml
Last active December 15, 2022 12:06
Kafka docker-compose with Kafka-UI
version: '3.5'
services:
zookeeper:
image: confluentinc/cp-zookeeper:7.2.1
hostname: zookeeper
container_name: zookeeper
ports:
- "2181:2181"
import com.tngtech.archunit.junit.AnalyzeClasses;
import com.tngtech.archunit.junit.ArchTest;
import com.tngtech.archunit.lang.ArchRule;
import static com.tngtech.archunit.library.Architectures.layeredArchitecture;
@AnalyzeClasses(packages = "br.com.helpdev.myapp")
class ArchitectureTest {
@ArchTest

Custom EntityPicker with Type filter

  • Create folder: packages/app/src/scaffolder/CustomEntityPickerExtension
  • Put files: CustomEntityPickerExtension.tsx and index.ts
  • Edit packages/app/src/App.tsx and insert:
[...]

import { CustomEntityPickerExtension } from './scaffolder/CustomEntityPickerExtension';
@gbzarelli
gbzarelli / gitlabPipe.js
Last active October 12, 2022 12:37
Backstage Action - Gitlab Pipeline: Start a new pipeline.
import { Gitlab } from '@gitbeaker/node';
import { createTemplateAction } from '@backstage/plugin-scaffolder-backend';
import { ScmIntegrationRegistry } from '@backstage/integration';
import { InputError } from '@backstage/errors';
import { parseRepoUrl } from './util';
export const createGitlabPipelineAction = (integrations: ScmIntegrationRegistry) =>
createTemplateAction<{
repoUrl: string;
branchName: string;