{"id":18721551,"url":"https://github.com/joaorafa19/codepix","last_synced_at":"2025-11-11T01:30:21.273Z","repository":{"id":203128642,"uuid":"706862163","full_name":"JoaoRafa19/codepix","owner":"JoaoRafa19","description":"Bank account transference application","archived":false,"fork":false,"pushed_at":"2023-10-26T18:00:26.000Z","size":39,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-20T06:42:06.565Z","etag":null,"topics":["cli","go","golang","grpc","grpc-go","kafka","microservices","postgres"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JoaoRafa19.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-10-18T19:01:05.000Z","updated_at":"2023-10-25T16:18:14.000Z","dependencies_parsed_at":null,"dependency_job_id":"70db717a-24bd-445b-af2a-f76dad41b5a9","html_url":"https://github.com/JoaoRafa19/codepix","commit_stats":null,"previous_names":["joaorafa19/codepix"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JoaoRafa19%2Fcodepix","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JoaoRafa19%2Fcodepix/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JoaoRafa19%2Fcodepix/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JoaoRafa19%2Fcodepix/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JoaoRafa19","download_url":"https://codeload.github.com/JoaoRafa19/codepix/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239587063,"owners_count":19663889,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","go","golang","grpc","grpc-go","kafka","microservices","postgres"],"created_at":"2024-11-07T13:34:59.522Z","updated_at":"2025-11-11T01:30:21.244Z","avatar_url":"https://github.com/JoaoRafa19.png","language":"Go","readme":"# CodePix\r\n\r\n## Sobre a aplcicação\r\n\r\n- É uma solução para simular transferências de valores entre bancos fictícios através de chaves (e-mail, CPF).\r\n- Simularemos diversos bancos e contas bancárias que possuem uma chave PIX atribuída.\r\n- Cada conta bancária poderá cadastrar suas chaves Pix.\r\n- Uma conta bancária modera realizar uma transferência para outra conta em outro banco utilizando a chave Pix da conta de destino.\r\n- Uma transação não pode ser perdida mesmo que: o CodePix esteja fora do ar.\r\n- Uma transação não pode ser perdida mesmo que: o Banco de destino esteja fora do ar.\r\n\r\n### Sobre os Bancos\r\n\r\n- O banco será um microsserviço com funções limitadas a cadastro de contas e chave Pix, bem como transferências de valores.\r\n- Utilizaremos a mesma aplicação para simular diversos bancos, mudando apenas as cores, nome e código.\r\n- Nest.js no Backend.\r\n- Next.js no frontend.\r\n\r\n### Sobre o CODEPIX\r\n\r\n- o Microserviço CODEPIX será responsável por intermedias as transferências bancárias.\r\n- Receberá a transação de transferência.\r\n- Encaminhará a transação para o banco de destino (Status: PENDING).\r\n- Receberá a confirmação do banco de destino (Status: CONFIRMED).\r\n- Envia confirmação para o banco de origem informando quando o banco de destino processou.\r\n- Recebe a confirmação do banco de origem de que ele processou (Status: COMPLETED ).\r\n- Marca a transação como completa (Status: COMPLETED).\r\n\r\n### Cadastro e consulta de chaves Pix\r\n\r\n```mermaid\r\ngraph LR\r\n\r\nBBX[BBX\\n Código: 001] --\u003e|Consulta se a chave existe| CDP[Codepix]\r\nCDP --\u003e|Resultado da consulta| BBX\r\n\r\nBBXB[BBX\\n Código: 001] --\u003e|Solicitação de criação da chave| CDPP[Codepix]\r\nCDPP --\u003e|Recebe confirmação da criação| BBXB\r\n\r\n```\r\n\r\n### Dinâmica do processo\r\n\r\n```mermaid\r\ngraph TD\r\n\r\nBBX[Banco BBX\\n código: 001\\n Nest.js / Next.js] --\u003e|Verifica se a chave pix de destino| CDP[CDP\\n Golang]\r\nCDP --\u003e|Confirma a existência da chave| BBX\r\nBBX --\u003e|Inicia a transação|CDP\r\n\r\nCDP --\u003e|Envia a transação para o destino| CTD[Banco Ctder\\n código: 002\\n Next.js/Next.js]\r\nCTD --\u003e|Confirmação.:Status=Confirmed|CDP\r\nCDP --\u003e |Confirmação. Status=Confirmed|BBX\r\n\r\n\r\n```\r\n\r\n### Principais desafios\r\n\r\n- Comunicação rápida e eficiente.\r\n- Criação e consulta instantânea das chaves (Síncronas).\r\n- Garantia que nenhuma transação seja perdida, mesmo que qualquer dos 3 estejam fora do ar (Assíncrona).\r\n\r\n### Tecnologias Utilizadas\r\n\r\n- gRPC\r\n- apache Kafka\r\n\r\n### CODEPIX\r\n\r\n- será capaz de atuar como um servidor gRPC.\r\n- consumir e publicar mensagens no Apache Kafka.\r\n- Ambas as operações devem ser realizadas de forma simultânea ao executar o serviço.\r\n- Trabalhar com um design focado em solucionar o problema do domínio.\r\n- Deixar a complexidade técnica para \"camada de aplicação\", responsável pelo servidor gRPC e Kafka.\r\n\r\n### Arquitetura Hexagonal / Ports and Adaprters\r\n\r\nUtilizar padrões existentes para criar aplicações. Desenvolver software sustentável.\r\n\r\n- Crescimento sustentável.\r\n- Manutenção.\r\n- A complexidade inicial se paga ao longo do projeto.\r\n- O seu software deve ser definido e desenhado por você e não pelo seu framework.\r\n- As peças têm que se encaixar, mas eventualmente podem ser substituídas ou adicionadas.\r\n\r\n### O que é gRPC\r\n\r\n- gRPC é um framework desenvolvido pela google que tem o objetivo de facilitar o processo de comunicação entre sistemas de uma forma extremamente rápida, leve, independente de linguagem.\r\n- Faz parte da CNCF (Cloud Native Computation Foundation)\r\n\r\n### Em quais casos podemos utilizar\r\n\r\n- Ideal para microsserviços\r\n- Mobile, Browser e Backend\r\n- Geração das bibliotecas de forma automática\r\n- Streaming bidirecional utilizando HTTP/2\r\n\r\n### Linguagens (Suporte oficial)\r\n\r\n- gRPC-GO\r\n- gRPC-Java\r\n- gRPC-C\r\n  - C++\r\n  - Python\r\n  - Ruby\r\n  - Objective-C\r\n  - PHP\r\n  - C#\r\n  - Node.js\r\n  - Dart\r\n  - Kotlin/JVM\r\n\r\n## RPC - Remote Procedure Call\r\n\r\n```mermaid\r\ngraph LR\r\n\r\nC[\" Client\\n server.soma(a,b)\"]--\u003eS[\" Server \\n func soma (int a, int b){} \"]\r\n\r\n\r\nstyle C fill:blue\r\nstyle S fill:blue\r\nstyle C padding:10\r\nstyle C margin:10\r\n\r\n\r\n```\r\n\r\n### Protocol Buffers\r\n\r\n\"Protocol buffers are Google's language-neutral, platform-neutral, extensible machanism for serializing structure data - Think XML, but smaler, faster and simple\"\r\n\r\n#### Protocol Buffers vs JSON\r\n\r\n- Arquivo binário \u003c JSON\r\n- Processo de serialização é mais leve (CPU) que JSON\r\n- Gasta menos recursos de rede\r\n- Processo é mais veloz\r\n\r\n#### *Sintaxe*\r\n\r\n```proto3\r\nsyntax=\"proto3\";\r\n\r\nmessage SearchRequest (\r\n string query = 1;\r\n int32 page_number = 2;\r\n int32 result_per_page = 3;\r\n\r\n)\r\n\r\n```\r\n\r\n## HTTP/2\r\n\r\n- Nome original era SPDY\r\n- Lançado em 2015\r\n- Dados trafegados são binários e não texto como o HTTP 1.1\r\n- Utiliza a mesma conexão TCP para enviar e receber dados do cliente e do servidor ( Multiplex )\r\n- Server Push\r\n- Headers são Comprimidos\r\n- Gasta menos recursos de rede\r\n- Processo é mais veloz\r\n\r\n## gRPC - API \"unary\"\r\n\r\n```mermaid\r\nflowchart LR\r\n\r\nC(\" Client \")--\u003e|Request| S(\" Server \")\r\nS --\u003e|Response| C\r\nS ---\u003e C\r\nS ---\u003e C\r\n\r\nstyle C fill:blue\r\nstyle S fill:blue\r\nstyle C padding:10\r\nstyle C margin:10\r\n\r\n\r\n```\r\n\r\n## gPRC - API \"Client streaming\"\r\n\r\n```mermaid\r\nflowchart LR\r\n\r\nC(\" Client \")--\u003e|Request| S(\" Server \")\r\nC --\u003e S\r\nC ---\u003e S\r\nC ---\u003e S\r\nS--\u003e|Response| C\r\n\r\nstyle C fill:blue\r\nstyle S fill:blue\r\nstyle C padding:10\r\nstyle C margin:10\r\n\r\n\r\n```\r\n\r\n## gPRC - API \"Bi Direcional streaming\"\r\n\r\n```mermaid\r\nflowchart LR\r\n\r\nC(\" Client \")--\u003e|Request| S(\" Server \")\r\nC --\u003e S\r\nC ---\u003e S\r\nC ---\u003e S\r\nS--\u003e|Response| C\r\nS--\u003e C\r\nS--\u003e C\r\nS--\u003e C\r\n\r\nstyle C fill:blue\r\nstyle S fill:blue\r\nstyle C padding:10\r\nstyle C margin:10\r\n\r\n\r\n```\r\n\r\n### REST vs gRPC\r\n\r\n#### REST\r\n\r\n- Texto / JSON\r\n- Unidirecional\r\n- Alta latência\r\n- Sem contrato ( maior chance de erros )\r\n- Sem suporte a streaming\r\n- Design pré-definido\r\n- Bibliotecas de terceiros\r\n\r\n#### gRPC\r\n\r\n- Protocol Buffers\r\n- Bidirecional e Assíncrono\r\n- Baixa latência\r\n- Contrato definido (.proto)\r\n- Suporte a Streaming\r\n- Design é livre\r\n- Geração de código\r\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoaorafa19%2Fcodepix","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjoaorafa19%2Fcodepix","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoaorafa19%2Fcodepix/lists"}