{"id":25085791,"url":"https://github.com/pablorodrigo52/profit-capital-api","last_synced_at":"2025-04-01T13:42:13.944Z","repository":{"id":273151668,"uuid":"762502469","full_name":"pablorodrigo52/profit-capital-api","owner":"pablorodrigo52","description":"Java framework to parse operations in stock market","archived":false,"fork":false,"pushed_at":"2025-01-19T01:36:21.000Z","size":157,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-07T08:35:36.706Z","etag":null,"topics":["framework","java","layered-architecture"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pablorodrigo52.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2024-02-23T23:05:27.000Z","updated_at":"2025-01-19T01:36:24.000Z","dependencies_parsed_at":null,"dependency_job_id":"4a69b04e-5977-4208-9251-06f844109517","html_url":"https://github.com/pablorodrigo52/profit-capital-api","commit_stats":null,"previous_names":["pablorodrigo52/profit-capital-api"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pablorodrigo52%2Fprofit-capital-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pablorodrigo52%2Fprofit-capital-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pablorodrigo52%2Fprofit-capital-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pablorodrigo52%2Fprofit-capital-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pablorodrigo52","download_url":"https://codeload.github.com/pablorodrigo52/profit-capital-api/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246651072,"owners_count":20811989,"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":["framework","java","layered-architecture"],"created_at":"2025-02-07T08:29:45.473Z","updated_at":"2025-04-01T13:42:13.938Z","avatar_url":"https://github.com/pablorodrigo52.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Code Challenge: Ganho de capital \n\nOlá esta é a minha implementação para o exercicio de **ganho de capital**.\n\n##  Decisões técnicas e arquiteturais:\n\nPara não escapar muito do tempo do projeto e por ser um problema relativamente complexo escolhi fazer o projeto em JAVA porque é a linguagem que mais tenho domínio. Na maior parte do projeto usei uma abordagem mais funcional do java usando streams (tentei mirar no clojure mas acho que ficou algo mais parecido com haskell).\n\nO projeto está estruturado da seguinte forma: \n- `/lib`\n  |_ todas as bibliotecas necessárias para o projeto\n- `/resources`\n  |_ recursos gerais (classes compiladas e inputs existentes no pdf se encontram aqui)\n- `/src`\n  |_ código java\n- `run_tests.sh`\n  |_ runner para facilitar a compilar e executar os testes do projeto (unitários e integrados)\n- `run.sh`\n  |_ runner para facilitar a compilar e executar o projeto via command-line\n\nO padrão de arquitetura é simples, um service-model  onde a lógica da aplicação está dentro do pacote service e os dtos se apresentam no pacote model, ao redor desses dois pacotes existem algumas estruturas auxiliares para ajudar na resolução do problema.\nFalando um pouco mais sobre a arquitetura, implementei um strategy pattern dentro do serviço para cada tipo de operação (BUY, SELL). Achei interessante fazer assim por alguns motivos: \n1. Eventualmente se surgir mais operações que necessitem de um cálculo de taxa, aluguel de ações por exemplo, basta criar a nova implementação sem a necessidade de modificar as existentes;\n2. Caso exista alguma variação do cálculo de taxa para as operações existentes, fica simples fazer uma extensão das classes originais atuais e assim garantimos que as mesmas também não serão modificadas;\n3. Se surgir um novo tipo de taxa no futuro ou um novo fator que altere o calculo da taxa atual, basta que as operações existentes implementem essa nova funcionalidade usando uma nova interface;\nEm resumo, garantimos o single responsability, open close, interface segregation.\nO service principal se chama **CapitalGainService**, ele é basicamente um orquestrador que para cada operação informada no stdin consulta o padrão de strategy para saber como deverá ser efetuado o calculo da taxa. \n\n## Justificativa para o uso de frameworks ou bibliotecas:\n\nNo projeto, optei por não usar nenhum gerenciador de pacotes como maven ou gradle (sempre acho que eles poluem muito a estrutura do projeto) então segui o bom velho padrão \"pasta lib\" com alguns poucos .jars dentro dela.\nAs bibliotecas utilizadas são:\n1. jackson (annotations, core, databind) para serializar JSON;\n2. junit para executar testes no projeto;\n\nAo final de tudo me arrependi de não ter importado um javax (jakarta) para fazer algumas validações dentro do projeto (tive que construir um simples validator na mão para garantir o basico) mas fica de lição aprendida. \n\nTambém decidi não usar nenhum framework (spring ou algo similar) porque senti que estaria usando um canhão para algo que deveria ser simples (stdin e stdout).  \n\n## Instruções sobre como compilar e executar o projeto\n\nA solução pede que seja possível de executar em um ambiente Unix ou Mac, então criei um script para facilitar a etapa de compilação e execução, em resumo:\n1. Ter o java 21 instalado na máquina;\n2. Dar permissão de execução para o arquivo `run.sh` com o comando: `chmod +x ./run.sh`\n3. No terminal, na raiz do projeto, executar `./run.sh`\n4. Após isso basta informar as linhas com os jsons e ao final inserir uma linha vazia para que o fluxo seja iniciado.\n5. Você também pode pular a etapa (4) usando o input redirection `./run.sh \u003c path/to/file/json.txt`\n\nCaso tenha curiosidade, todos os `.class` gerados vão ser salvos dentro da pasta `/resources`\n\n## Instruções sobre como executar os testes da solução\n\nPara executar os testes, deve-se: \n1. Ter o java 21 instalado na máquina;\n2. Dar permissão de execução para o arquivo `run_tests.sh` com o comando: `chmod +x ./run_tests.sh`\n3. No terminal, na raiz do projeto executar `./run_tests.sh`. O projeto irá rodar todos os testes de integração (os casos de testes presentes no PDF) e em seguida irá executar todos os testes unitários da aplicação. Ao final será informado um resumo sobre os testes.\n\n## Notas adicionais\nQuando for efetuar a leitura do código você verá que em alguns momentos pode acontecer de ser lançado um **Exception.class** ou um **RuntimeException.class**. Optei por usar as classes default do java por ser mais rápido e simples, mas o ideal é que em um projeto de verdade exista um exception handler e que também sejam criadas exceções especificas para cada caso de uso.\nVocê também verá que não utilizei nenhum serviço de logging, nem mesmo o bom e velho Sysout pois não vi necessidade. Mas mais uma vez, em um projeto real essas caracteristicas de rastreabilidade (logging, exceptions, métricas, etc..) são extremamente necessárias.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpablorodrigo52%2Fprofit-capital-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpablorodrigo52%2Fprofit-capital-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpablorodrigo52%2Fprofit-capital-api/lists"}