vídeo 1 - A grande Oportunidade e Início do projeto prático: Home Broker

3.42k ยอดวิว16631 คำคัดลอกข้อความแชร์
Full Cycle
Nesse vídeo você entenderá como sistemas de grande porte funcionam, as oportunidades no mercado e na...
บทถอดความวิดีโอ:
[Música] Olá tudo bem meu nome é Wesley e seja muito bem-vindo e muito bem-vinda a imersão full stack full pyle E hoje é o dia que você vai dar um novo passo na sua carreira e aprender como desenvolver aplicações de grande porte que rodam nas maiores empresas do mundo como Netflix Google Instagram Mercado Livre Itaú Stone e muito mais o nosso objetivo nessa imersão é te mostrar na prática as principais tecnologias e conceitos que você precisa dominar para se destacar em qualquer lugar que você vá não tendo apenas a possibilidade em trabalhar numa grande empresa
ganhar mais ou conseguir uma promoção mas sim também para que você consiga ter muito mais realização profissional e sem dúvidas isso faz uma baita diferença agora Deixa eu te explicar algo bem importante tá esse evento ele foi pensado para quem já tem pelo menos aí uns 2 anos na área de tecnologia então se você ainda tá no início da sua jornada Pode ser que o conteúdo pareça um pouco denso e talvez não faça tanto sentido aí pro seu momento profissional Mas é claro você é mais do que bem-vindo aí para participar eu só preciso te
lembrar que esse conteúdo ele é mais direcionado para quem já tem uma base um pouco mais consolidada e tá buscando dar um passo ainda maior na carreira você já teve aquela sensação de que por mais que você estude e trabalhe parece sempre que você tá correndo atrás de aprender algo novo e não consegue alcançar ou mesmo você já tendo aí uma certa experiência na área Às vezes bate aquela dúvida se realmente você entende os principais aspectos de um grande projeto Pois é eu só posso dizer que você não tá sozinho nessa e isso é muito
mais comum do que você imagina e eu posso também te dizer que eu já passei por isso diversas e diversas vezes hoje em dia ser desenvolvedor não é mais aena saber programar o mercado já faz aí um bom tempo que Tá exigindo muito mais do que isso querendo ou não você precisa dominar microsserviços entender de comunicação entre sistemas distribuídos entender os mais diversos tipos de conceitos e protocolos como http grpc websockets amqp trabalhar com mensageria containers docker kubernetes Além disso é importante conhecer também diversos tipos de arquitetura e como garantir a observabilidade dos sistemas utilizando
ferramentas de APM que coletam também aí logs tracing métricas e eventos é realmente muita coisa e é fácil sentir que nunca a gente vai saber o suficiente e é justamente por isso que a gente criou essa imersão durante uma semana você vai aprender como usar muitas dessas tecnologias e conceitos e um projeto prático que já já eu vou te explicar em mais detalhes mas antes disso eu queria te contar um pouquinho sobre mim para que você entenda um pouquinho mais aí o meu background E como que eu posso te ajudar nessa J n bom eu
já passei por diversos tipos de projetos em diversas áreas da tecnologia eu já tive uma empresa de hospedagem de sites que eu acabei vendendo eu fui Web Designer desenvolvi cms para garantir o funcionamento de grandes portais em grandes empresas Eu também trabalhei com escalabilidade de sites com grandes volumes de acesso também com computação visual E além disso acabei desenvolvendo ferramentas de bi e também integração de sistemas em grandes empresas Além disso eu sou completamente apaixonado por programar eu trabalhei com muitas linguagens de programação desde Pascal D PHP c+ Python e até go que é uma
das linguagens que eu mais utilizo no meu dia a dia em 2008 eu descobri a minha verdadeira paixão a conexão entre educação e te tecnologia foi quando eu fundei a sofinet onde a gente ajudou mais de 300.000 pessoas a avançarem suas carreiras depois disso eu fundei a code education que foi um centro oficial de Treinamento das zend Technologies e quem é da antiga aí no mundo do PHP sabe do que eu tô falando e em 2020 eu fundei a full cycle e mais recentemente a fctc a faculdade full cych de tecnologia por conta dessas contribuições
eu fui reconhecido aí diversas vezes e recebi prêmios que são muito importantes aí para mim eu fui nomeado duas vezes como Microsoft MVP que é must valuable professional da Microsoft Google developer experts in go docker Captain pela docker Inc e eu também fui reconhecido como um dos top 100 líderes na área de educação pelo fórum global de educação e aprendizagem Inclusive eu recebi esse prêmio lá em Las Vegas agora eu não tô falando isso para m gabar tá eu não acredito inclusive que alguém precisa ter aí 25 anos de carreira para conseguir trabalhar em grandes
projetos hoje com tanta informação disponível e cursos como os da full cycle é possível aprender muito mais rápido do que há 20 anos atrás e falando em Full pych Olha só isso aqui que bacana é sou desenvolvedor já há 5 anos qu para 5 anos comecei a fazer a faculdade ali no Meio do do do era tecnólogo no meio do tecnólogo eu consegui uma oportunidade numa fábrica de software em 23 veio aquele creche dos bancos norte-americanos e eu acabei indo del layoff junto com muitos outros de Foi aí que apertou Foi aí que apertou eu
pensei Car tá vou procurar outra coisa era PJ né então eu fui de 8k por mês a zero mercado começou a exigir muito muito muito mesmo começou a filtrar muita gente assim que sabia pouco que tava começando eu não tinha confiança de trabalhar fora dos projetos que eu já trabalhava parei de procurar porque eu tava tomando muito não na cara por causa dos gaps técnicos você se sente estagnado eu não tinha confiança nenhuma no código que eu tava fazendo foi nessa época aí do layoff que eu conheci o canal do YouTube do Full cycle né
comecei a a a me apaixonar cada vez mais pela didática que o Wesley trazia eh eu falei é isso que eu quero pra minha vida eu falei cara eu quero estar junto desses caras se isso aqui que tem no YouTube for um pouquinho do que tem no curso e o curso é esse valor tá muito barato falei pra minha esposa vamos tentar fazer esse curso F saac ver se eu deseng melhor investimento que eu fiz foi o de docker de kubernetes dominei o Solid DDD eda um monte de macete que eles passam no curso que
é muito bom com certeza me deu muito mais confiança em conv com outros D termos técnicos eu às vezes eu ficava meio perdido com algumas coisas hoje em dia eu sinto completa confiança e se alguém me explicar alguma coisa nova eu vou entender curso full pyc entrega entrega entrega muito barato assim e é o que a faculdade deveria ser hoje eu tô muito confiante com o meu código e eu escrevo teste coisa que eu não fazia e eu perdi oportunidade por não escrever teste né eu aprendi com FS escrever ap TCE não só test mas
test da maneira correta Hoje eu tô trabalhando part-time para uma empresa e norte-americana e eu faço fridas às vezes muitas vezes pra Espanha A sensação que eu tenho de trabalhar assim não por ganhar em dólar nem nem em euro essas coisas mas é uma sensação de Poxa eu posso eu consigo eu devia ter conhecido o fsac há muito tempo atrás eu estaria muito agora e falando em aprender nessa imersão Vamos colocar muitos conceitos tecnologias e abordagens na prática vamos desenvolver um projeto prático de home broker ou uma corretora fictícia no qual será possível comprar e
vender ações visualizar o mercado em tempo real e consultar a carteira de ativos de cada usuário A ideia é criar um ecossistema que permita negociações com confiáveis e escaláveis oferecendo a melhor experiência pro usuário para tornar tudo isso possível trabalharemos com conjunto de soluções modernas Integradas da seguinte forma no backend utilizaremos o nestjs para construir uma API altamente escalável e organizada essa api será responsável por gerenciar as ordens de compra e venda organizando dados do usuário e disponibilizando as informações pro front end no front end contaremos com nextjs react e ta ind garantindo uma experiência
fluída moderna e responsiva e de fácil manutenção isso permitirá visualizações em tempo real uso eficiente de ssr ou server Side rendering e atualizações constantes dos dados de mercado e da Carteira de ativos paraa comunicação em tempo real a gente vai utilizar o websockets possibilitando uma troca de informações bidirecional e de alta velocidade entre o cliente e o servidor assim será possível acompanhar as cotações ordens de compras e venda e atualizações de carteira de forma contínua e imediata o apach CFC será o Ponto Central de comunicação assíncrona e de alta resiliência ele garantirá a conexão robusta
entre a corretora e um microsserviço que simulará a B3 Ou seja a bolsa de valores onde todas as transações de compra e venda bem como as consultas de mercado serão processadas e disponibilizadas de maneira segura e escalável esse microsserviço de simulação da bolsa de valores ele será desenvolvido em Gol explorando ao máximo a sua performance e concorrência multitrading garantindo velocidade de execução disponibilidade contínua e confiabilidade nas informações de negociação por fim para garantir praticidade padronização e portabilidade no ambiente de desenvolvimento e produção a gente vai utilizar o docker para executar todos os microsserviços em contêiners
tornando qualquer processo de implantação e desenvolvimento manutenção de uma forma muito mais simplificada e consistente para qualquer desenvolvedor que vá trabalhar com esse projeto esse projeto ele vai te mostrar na prática como todas essas tecnologias e conceitos se conectam te preparando para criar soluções complexas de aut desempenho como as exigidas pelo mercado então se você quer se destacar aprender a trabalhar com sistemas complexos e ser capaz de desenvolver soluções para grandes empresas sem dúvidas o que você vai aprender nessa semana vai te ajudar bastante então agora chegou a hora de colocar a mão na mxa
Então bora pra tela do meu computador salve des beleza Luiz Carlos na área então quero te cumprimentar por estar aqui com a gente nós vamos começar a nossa jornada no desenvolvimento desse home broker eu tenho certeza que vai ser muito enriquecedor então eu já quero contar com a sua confiança e o seu esforço tá não fique somente na aula pega o código fonte Execute na sua máquina eu tenho certeza que você vai absorver muito mais os conhecimentos que a gente vai passar aqui então bora lá então se segurem na cadeira aí e venha comigo nós
vamos começar com a preparação de ambiente a gente não precisa de ter muitas coisas instaladas na verdade a exigência inicial vai ser somente o docker e o nodejs mas se você quiser ter o ambiente produtivo várias dicas tanto para Linux Mac e Windows de uma olhada nessa Live aqui Inclusive tem links que você pode olhar na descrição para que você tenha esse ambiente produtivo mas e aqui eu foco principalmente pro caso do Windows porque se você somente usa o Windows pro seu desenvolvimento é muito importante que você use Linux e hoje a gente consegue usar
Linux dentro do Windows sem ter Dual Boot nem nada através do wsl2 né então nós temos um tutorial que é o melhor tutorial que você vai encontrar em língua portuguesa que mostra como você instalar o wsl2 que é na verdade não é difícil e também fazer a configuração com docker Mas tem várias configurações que vão otimizar mais ainda essas ferramentas então dê uma olhada todos esses links ficam no código fonte que já tá disponibilizado aí no evento tá também eu tenho um repositório que eu coloco as configurações do meu vs code que eu já trabalho
com vs code tem muito tempo então extensões e outras coisas importantes para que você tenha uma configuração que você faça backup Não perca ela e algumas outras questões também tudo isso tá no link também dessa Live você acaba chegando aqui mas eu estou apontando também tá então eh basicamente a gente precisa de docker E nodejs então no caso do node JS né você instala ele na máquina depois a gente vai criar um contêiner com docker paraa nossa aplicação não vai precisar nem de node as instalado na máquina mas é sempre bom né se você tá
mexendo com node ter alguma versão instalada na máquina eh a instalação pro caso do Windows n você vai selecionar Linux Porque você vai estar no wsl tá e aqui você seleciona nvm sempre instale dessa forma aqui aí você inclusive pode usar várias versões do node isso aqui é legal por casusa do Linux também então você usa dessa forma aqui e aí tem o Mac com nvm também na verdade é o mesmo os mesmos comandos hoje para todos os sistemas operacionais Tá show de bola então nós temos a nossa aplicação de home broker que nós vamos
construir também esse material está presente ali no código fonte aqui é um diagrama de tudo que nós vamos construir ao longo da semana e Aqui nós temos o foco de hoje né que é justamente Esse vermelho aqui que é a nossa aplicação de home broker que vai ser um api rest e também servidor de websocket api rest a gente não vai construir hoje tá então nós temos esses casos de uso envolvendo essa aplicação eu vou poder criar ordens de compra e venda claro né para poder fazer a negociação dos ativos consultar essas ordens de compra
e venda criadas consultar os ativos e as informações principalmente ali a questão dos preços né a gente vai querer ver e os preços atualizados e tudo mais é que entraria também não só o rest mas como websockets vou consultar os ativos na minha carteira então tenho minha carteira de investimentos com todos os aros presentes lá tem a questão de realizar a negociação das ordens aqui eu tô falando de forma geral não é os casos de uso somente da aplicação que a gente vai construir hoje E aí olhando para esse cenário obviamente a gente teria ali
uma parte administrativa administradores criariam os novos ativos né então eh casos de uso que estaram implícitos né criar novos ativos criar carteira realizar autenticação e outras funções administrativas e a gente não vai desenvolver e 100% de tudo porque senão a gente não consegue focar no que é necessário aqui para poder desenvolver esse home broker então é questão de área administrativa realizar autenticação e algumas coisas nós não vamos implementar e aqui eu já dou uma dica logo com que a gente vai fazer que vai ser uma baita de uma aplicação eh você pode pegar e desenvolver
o restante dela criar administrativo fazer outras coisas complementando ainda mais para você poder evoluir com os conhecimentos que você vai adquirindo aqui durante a semana tá e aqui está o diagrama de entidade e relacionamento que torna bem mais fácil o entendimento do que a gente vai desenvolver aqui na aula de hoje tá então isso aqui vai o que a gente vai Construir ali com mong DB que vai ser o banco de dados que nós vamos utilizar junto com o nest então começando pelos ativos né Nós temos uma coleção de ativos que quando eu lido com
mong DB que é um banco nos eu não tenho tabelas eu tenho banco de dados e as collections que equivale as tabelas de bancos tradicionais então eu tenho o ID do ativo o nome dele o símbolo né então o nome vamos supor que seja Google Amazon E aí eu tenho o símbolo que você acha o ativo ali a imagenzinha porque vai ser legal lá no frontend preço data de atualização e data de criação esse ativo tem um relacionamento de um para muitos com o asset Daily que é justamente pra gente poder montar o gráfico depois
a medida que os ativos vão mudando de preços Ao decorrer dos dias a gente vai armazenando aqui com a data então eh ele pode mudar de preço n vezes no dia tem todo o histórico né então é uma coleção de histórico pra gente fazer esse controle também eu tenho a carteira a carteira do usuário a gente não vai trabalhar com a autenticação então a carteira vai ter somente ali o id e as datas de criação atualização então nessa carteira eu tenho os ativos da carteira que tem relação com essa coleção aqui aí eu tenho o
ID o shares que equivale à quantidade mas quando a gente tá falando nesse mundo financeiro Eu não falo aqui a quantidade daquele ativo daquela ação que eu tenho eh vamos supor que a empresa tem 1 milhão de ações então eu chamo isso de shares que são os pedaços daquela empresa então eu posso ter uma ação da Google uma ação da Amazon uma ação do Facebook né então ela tem relação tanto com ativo quanto com a carteira então na minha carteira xpto posso ter 10 registros desse Wallet asset aqui e cada um desses registros vai equivaler
lá a ação que eu tenho e a quantidade dela E aí tem a ordem de compra ou venda que é criada Então na hora que eu estou criando uma nova uma nova ordem de compra e venda eu falo tanto que eu quero comprar ou vender o paa é porque a medida que eu vou negociando vamos supor que eu queira comprar eh 10 ações da Google então eh a minha ordem ela não é executada de forma completa eh ela pode ter sido executado agora somente eh duas ações depois executa mais duas até chegar nos 10 Então
esse parch aqui a gente vê o quanto que resta de shares para ser executado tem o preço que eu coloquei ali para vender ou para comprar o tipo dela se é compra ou venda e o status se ela tá pendente de ção se ela já começou a executar se ela já terminou e as datas de criação e atualização e no trade que a gente vê o histórico né de execuções dessa ordem então Eh às vezes para poder comprar aquelas 10 ações aconteceu 10 negociações com essa Order então eu tenho ali Qual é o ID do
investidor que tá relacionado com aquela negociação o ID da plataforma lá que tá gerenciando a bolsa de valores tá no caso B3 ou Wall Street a gente coloca aqui porque é bom para ter o controle o quanto que foi negociado nesse trade o preço que foi e as datas de atualização e criação né Então essa aqui são as seis collections que nós vamos trabalhar com mong DB nós vamos criar ao longo aqui durante a semana tá e nós vamos basicamente criar quase tudo nessa aula aqui para já ter esse home broker né o isso aqui
é somente o Home Broker Ou seja a plataforma de terceiros que está conectando lá na Bolsa de Valores né que ela tá disponibilizando o serviço pro usuário poder fazer a compra e venda Então ela tá armazenando os ativos tá armazenando a carteira mostra quanto que eh tem na carteira ali de cada um dos ativos tem controle também dos preços e das compras que estão sendo realizadas então nessa aplicação que nós vamos criar nessa aula nós vamos utilizar o typescript JavaScript eu vou até acrescentar aqui também o nodejs permite que a gente faça aí a desenvolvimento
com JavaScript do lado servidor né e o nestjs vai ser o protagonista de hoje que é o Framework web que vai permitir que a gente crie essa aplicação a gente vai ver como que ele é Coringa ele tem a facilidade para poder integrar com várias outras ferramentas a gente traz muito desse conteúdo pro Canal e também pros cursos que a gente tem na full cycle em questão de banco de dados nós já sabemos que vai ser utilizado o mong DB que vai ser um banco que vai permitir que a gente tem um esquema flexível posso
armazenar ali as informações sem preocupar com os campos que são armazenados e também eu tenho uma grande velocidade para poder fazer a consulta nós vamos utilizar também um recurso bacana que é o Change streams lá na frente que vai permitir que a gente seja notificado quando alguma coisa no banco muda e para poder administrar o banco no nest nós vamos utilizar o mons que é um RM que Vai facilitar a nossa vida e também nós vamos focar aqui nessa aula estritamente na api rest para poder fornecer os serviços desse home broker mas depois também vai
ter integração com Cica eh websockets mas a gente não vai fazer isso nessa aula então o nosso objetivo aqui é criar o projeto nestjs fazer a integração com o Mongo e conectar ali com mongus para ele para que ele possa administrar tudo e aí nós vamos criar uma família de end points que são os barras assets para poder administrar e criar os ativos barra wallets para poder criar e consultar as carteiras e o barra orders para poder criar as ordens de compra e venda né aqui a gente não tá preocupando com a questão administrativa mas
é ter o end Point ali pelo menos para poder criar o ativo criar a carteira ajuda que a gente vá construindo os nossos testes tá então vai ser justamente isso aqui que a gente vai fazer durante a aula então esse nestjs que a gente traz é um Framework que é um dos mais hypados se não for mais hypado hoje da comunidade node JS porque é um Framework que ele se preocupa em te dar uma estrutura sólida para construir tanto aplicações pequenas quanto grandes Ele trabalha com uma estrutura modular a gente acaba tendo esse cenário aqui
né tudo é módulo Então você tem o módulo raiz que inicia a aplicação que a gente chama de app mod Aí você coloca as coisas de usuário no user mod as coisas de produto no product mod as coisas de vendas ali no Billing mod enfim você organiza tudo e dentro de cada módulo você tem controllers Services Gates interceptors mids Enfim tudo eh interconectado e ajuda que você não tenha que tomar certas preocupações com decisões arquiteturais dentro do do seu projeto né o nest foi criado em 2017 pelo cemel m levc e o Mark piz são
esses dois eu não sei se eu pronuncie o nome desses dois caras aqui corretamente Mas eles tiver essa ideia inovadora de criar um Framework que fornecesse isso essa arquitetura e já pronta ali pro desenvolvedor que outros frameworks não forneciam e também um Framework que já fosse focado com microsserviços então além de fornecer um suporte para Red PR graph l a gente consegue se comunicar com rap teq redis CF cantis mais um monte de outras coisas de forma bem fácil então você consegue construir vários tipos de aplicações web através do njs e também ele traz uma
série de integrações com bancos de dados na verdade ele não tem nenhuma Lib dele ele pega o que tem de melhor aí da comunidade node então você pode usar um cicol um prisma Type RM micr RM enfim por isso que a gente traz esse Frame principalmente por ele ter essa arquitetura sólida né para grandes aplicações e ter essa integração com microsserviços tá então pra gente poder começar a utilizar o nodejs nós temos que fazer um npm instal menos G usando aqui o node para poder instalar o pacote do commandline do nes @ njs barcel Tá
eu já tenho isso aqui na minha máquina não preciso fazer isso então com o nest eu consigo criar eh artefatos do projeto como um novo projeto tá vendo tanto de coisa que ele dá aqui para poder fazer a criação Então a gente vai fazer um nest New nestjs eu vou chamar de nestjs api aí ele vai perguntar qual o gerenciador de pacotes a gente tem três opções aí pode ser o próprio npm que é o node package Manager para poder gerenciar tudo e agora ele vai fazer aqui a instalação e já criou o projeto são
poucos arquivos na verdade se a gente for olhar o código fonte é só daqui para baixo e alguns arquivos são até de teste e outras coisas assim então você tem um projeto minimalista para poder começar a desenvolver depois da mensagem de sucesso então vamos fazer aqui um nestjs Api para abrir a pasta e abrir o vest code então está aqui o nosso projeto eu já quero falar em questões de extensões que são recomendadas Né nenhuma aqui é extensão obrigatória mas vai te ajudar bastante instale o SL lint porque ele já vem com SL lint dentro
dele então o vest code vai apontar várias coisas ali para que você fique atento melhore a qualidade do seu código rest client já aviso aqui porque nós vamos criar chamadas http de dentro do próprio vest code é bem útil você cria ali um arquiv inho já pode fazer emular as chamadas sem usar o insonia ou Postman ou algo do tipo e também uma outra extensão que vai ajudar bastante vai ser a do mong DB que é produzida pela própria mongo você consegue conectar no banco de dados de dentro do próprio vscode eh administrar as coleções
o banco Enfim então daqui a pouco a gente vai usar ela também tá então está aqui o nosso projeto vamos rodar aqui o comando npm Run start 2 pd ele vai rodar aqui em modo desenvolvimento então ele pega o typescript que o node não trabalha com typescript diretamente ele vai compilar aqui pra pasta dist vai fornecer a aplicação na porta 3000 então a gente pode ver aqui local na porta 3000 que ele vai acabar mostrando um hello world tá Então significa que ele está funcionando e a medida que eu vou fazendo coisas no meu código
como ele tá ali com modo Rot Reload ele vai sempre compilando se tiver qualquer erro ele vai mostrar aqui então aplicação só funciona se ele tiver com esses logs verdinhos e mostrar ali que a aplicação Foi iniciada com sucesso Tá então vamos dar uma olhada aqui como que a aplicação funciona para entender esse processo e o nosso projeto inicia aqui pelo main.ts nessa função Bootstrap então aqui ó o @ nest bcore que é onde está Estão muitas coisas do nest Na verdade o nest é quebrado em várias sub bibliotecas mas aqui a gente tem a
a maioria da do do núcleo ali do n né então esse next Factory é que vai criar a Instância da aplicação para depois ter aplicação rodando na porta 3.000 se eu não passar nenhuma variável de ambiente tá E esse next fact está recebendo um app mod Lembra daquela ideia do módulo é justamente esse arquivo aqui então o módulo ele abriga artefatos do nest então ele está abrigando um service e um Controller isso aqui através de um decorator que éesse @m esse padrão existe em várias linguagens Python Java e PHP né Tem às vezes algumas linguagens
que não utiliza esse ara mas ele está decorando essa classe então o nest na hora que ele na hora que eu passei aqui o app Mod para esse next Factory ele sabe que é um módulo que tá registrado dentro do módulo ele já organiza tudo pra gente porque olha só e esse Controller né que como a gente tá usando aqui a arquitetura mvc mod controler o controler é aquele agente intermediário ele recebe as requisições faz um processamento na camada de negócio e devolve a resposta então ele que faz o roteamento eu não tive que fazer
nenhum New né uma classe eu teria que fazer um New Em algum momento quem tá fazendo um New é o próprio netp debaixo dos panos como tudo tá registrado no módulo ele já vai organizar as coisas pra gente então esse Control aqui é um contrer també ele tem o decorator contrer a partir daqu eu posso colocar um prefixo rotas desse Controller exemp colocar barra prefixo e colocar aqui agora a rota da forma que ela tava na verade não t rodando aqui a minha aplicação mais vai ver que ele vai mostrar um 404 agora se eu
colocar barra prefixo aí voltou aqui é a minha rota Isso significa que esse hellow está sendo acessado através desse método aqui então nós rote as coisas necessárias através de decorators que são importadas aqui ó de outro pacote com @js barcon de decorators que equivalem aos verbos http então eu tenho o decorator get post o pet delete head todos esses verbus http eu tenho aqui e aí eu coloco em cima do método que eu quero e aqui eu posso passar então uma rota barra rota por exemplo então agora para poder acessar esse endp a gente chama
de endp não é mais só barra prefixo é barra prefixo barra Rot Então dentro do Controller eu posso ter vários end points como eu quiser organizar posso colocar parâmetros de Rota e várias outras coisas também veja que nós temos aqui uma injeção de dependência do app service que tá registrado como providers em providers nós registramos os serviços da aplicação serviços de negócio ou outros serviços que nós vamos utilizar um serviço ele tem o decorator injectable em cima Então significa que ele é injetável em outros lugares né E aqui só tem o método get Hello veja
também que eu não tenho que fazer um Nil dele por eu ter colocado o tipo app service o o nest como tá tudo registrado ele injeta que ele sabe todas as dependências de um serviço e ele consegue injetar e a gente só tem que se preocupar em usá-lo né aqui tá só o retorno do get Hello que vai ter aquele Hello Word lá na tela então isso aqui é o princípio do nest tudo vai funcionar assim tem um módulo tem um Controller Às vezes você não precisa ter um Controller e tem os serviços e você
vai construindo a sua aplicação Então vamos começar aqui vamos voltar lá para paraa nossa modelagem né o mais básico aqui seria começar pelos ativos né seria começar pelos ativos a gente vai criar um ativo com nome com símbolo com imagem com preço Então qual seria a primeira coisa recomendada eu poderia criar um Controller aqui na raiz mas eu posso criar um módulo para poder organizar as coisas de um ativo então eu posso executar un nest generate mod assets a gente tende a a fazer as coisas no plural tá então poderia passar aqui no singular mas
isso acaba sendo uma convenção da própria comunidade então acabei criando o meu módulo veja que ele cria o módulo Mas também ele atualiza o app mod então ele tá registrando aqui imports ele acrescentou esse imports para falar que esse assets mod está presente no app mod e se esse App mod tá sendo carregado aqui aqui então tudo está sendo carregado né então pra gente poder e criar um ativo e fazer outras coisas que que eu tenho que fazer agora qual seria a próxima coisa nest generate Controller assets aí ele já é inteligente ele cria dentro
da própria pastinha também cria um arquivo de testes então eu tenho um Controller agora com até um prefixo bar assets e ele registra automaticamente no módulo então njs C vai ser o seu melhor amigo e como esse módulo tá registrado no app mod tá tudo OK mas vamos pensar assim que eu esteja fazendo um crude de assets mod eu teria que ficar criando um módulo que um Controller daqui a pouco eu vou criar uma camada de serviços a gente tem como fazer isso de forma automática com eu vou matar esse assets daqui e eu tenho
que remover obviamente lá do meu mod né a gente tem um comando do mais eficiente que é o nest generate eu posso usar somente o g para poder abreviar e vou digitar resource e aí ele me pergunta assim qual é o tipo do recurso que eu estou criando Porque aqui nós estamos falando mais focados em rest né quando eu tô falando em rest o que eu estou habilitando pro mundo externo são os recursos recursos de usuários de produtos então aqui ele tá me perguntando já para poder criar para mim então coloco aqui assets no plural
aí eu posso utilizar vários meios de transportes não somente rest ele suporta também Graphic L Até websockets que a gente vai usar durante a semana vou colocar aqui rest api e eu quero que ele cria para mim todo o crude ele não vai já conectar com mongo ou nada do tipo mas ele vai me dar já todo o esqueleto olha só que legal que ele fez ele criou para mim uma entidade que eu posso modelar ã os dados do banco de dados depois a gente vai mexer aqui com o Mongo criou um Controller Mas agora
nós temos várias coisas dentro de um Controller Então eu tenho os métodos ó para poder criar através do verbo post para poder pegar todos o find All o find One para poder pegar apenas um aqui eu utilizo parâmetro de Rota eu coloco esse dois pontos ID Depois coloco um decorator com o mesmo nome para poder jogar o valor que tá chegando na rota dessa variável né então se eu passasse Barra assets assim eh esse um vai chegar aqui nessa variável tenho também o update o update tá usando o verbo Pat então eu recebo o id
e também os dados e o remove e observe que os dados recebidos nos dois métodos o post Pet que é para poder criar e atualizar tem um dto que são essas duas classes aqui um dto é o conceito de data transfer Object que é um objeto de transferência de dados que é apenas um objeto e sem regra de negócio nem nada apenas para poder transportar os dados para poder modelar ali o bor que eu estou recebendo para a gente já poder pegar os dados e fazer alguma coisa com eles obviamente passar aqui paraa nossa camada
de serviço então ele cria também um asset service que é onde nós devemos colocar as nossas regras de negócio então aqui nós já temos uma separação de uma service layer já te provocando a não colocar regra de negócio dentro do Controller que é legal né então eu já tenho aqui todos os métodos ó criar pegar todos pegar um atualizar e etc tudo isso está registrado já no módulo tudo bonitinho Então você já tem aqui um módulo inteiro para poder realizar um crude Então olha que legal né fica muito fácil de trabalhar dessa forma agora nós
já podemos inclusive Dev brincar um pouquinho com esse módulo se eu fizer um npm Run start 2 p Dev inclusive o retorno aqui já é diferente ele mapeia vai mostrando todas as rotas que ele vai encontrando pelo caminho eu posso então criar o meu arquiv inho http lá da minha extensão rest client a gente vai ter então aqui uma requisição post para http 2 bar eh loc na 3000 bar assets Então a gente vai acabar fazendo aqui um content Type application porque eu estou enviando Jon é legal de trabalhar com isso aqui porque você tá
fazendo a requisição http como ela é então a gente vai passar aqui o nome do ativo vamos supor que seja eh Amazon o símbolo que eu tô colocando o um símbolo fictício tá A1 não é exatamente esse o preço do ativo também fictício Vamos colocar como 100 e a imagem aqui uma imagem fictícia depois eu eu já tenho aqui um pacote de imagens que vai ficar bacana na nossa aplicação então tenho aqui o amazon. png se eu fizer o envio disso aqui obviamente não vai fazer nada né ele só vai mostrar essa ação adiciona o
novo asset né só para poder mostrar de fato que a nossa chamada Aqui através do Controller ela veio aqui pro Create do serviço e s tá retornando essa string aqui né então eu posso colocar aqui três hashtags E se eu quisesse consultar todas as os ativos faria um get pro assets lear essa ação retorna todos os ativos show de bola então agora com esse teste feito chegou a hora de colocar o banco de dados né eu não preciso instalar mongo nem nada uma vez que eu tenho Dock Eu Posso rodar o mongo DB em um
container né então eu vou criar aqui um docker compose emo que vai determinar os contêiners que eu quero rodar tudo de uma vez Então aqui é um arquivo yemo que a gente vai descrever todos os contêiners vou colocar Services e depois mongo tá aí eu coloco aqui image e vou escolher uma imagem do Mongo que é o mongo 803 a gente vai usar uma versão do Mongo bem atual é atual considerando quando eu estou gravando aqui no momento né para que essa imagem funcione corretamente a gente consiga administrá-la nós temos que criar eh uma variável
de ambiente primeira que é o mongo init DB root username que é usuário root que vai administrar o banco de dados e qual é o password tá que eu vou colocar aqui também root então padrão Rot root para poder fazer o acesso tá e como o contêiner roda no ambiente isolado eu tenho que habilitar a porta na minha máquina Então essa primeira porta aqui é a porta 27017 que é a padrão que o mongo roda eu vou fazer o bind na minha máquina pra porta com o mesmo valor poderia ser qualquer outro valor esse primeiro
valor aqui mas tem que fazer isso senão a gente não consegue acessar então agora tem a minha aplicação rodando vou abrir um novo terminal e vou rodar um docker compose up deixa eu ver Inclusive eu tô rodando aqui com docker desktop se eu tenho alguma coisa ó tinha uma aplicação aqui de nest websocket rodando Pronto já não tem aqui mais a minha aplicação parei sempre eu tô rodando alguma coisa com docker vou fazer um docker compose up então ele vai levantar o mongo para mim mostrando vários logs E agora temos aquela extensão Zinha né do
Mongo DB eh acho que eu coloquei ela aqui desse lado de cá ó aqui eu uso outras coisas de Inteligência Artificial então aqui eu posso criar uma nova conexão tá vou até editar a que eu já tenho aqui que já tá prontinha para poder fazer a comunicação com esse mongo DB a gente coloca exatamente assim ó esse aqui é a dsn né que define ali a string de conexão então mongo DB 2 bar root 2 p root @localhost naporta barra aí aqui é o qualquer banco que a gente quiser tá não importa que você colocar
aqui o mongodb é um banco dinâmico não é igual um banco tradicional que você tem que fazer um Create table antes eu colocar xpto aqui ele vai vai criar isso em tempo de execução aí eu tenho que colocar essa interrogação al source admin que a gente tá falando que o banco que vai cuidar da que na verdade a é exatamente o banco que vai cuidar da autenticação é o banco admin que vai ter ali usuário Rot root e esse Direct Connection até não precisaria a princípio Tá mas a gente já deixa ele aqui depois a
gente vai fazer uma nova configuração do Mongo quando nós precisarmos habilitar uma configuração nele e mais à frente mas já deixa ele aqui tá então você coloca essa string aqui salva Beleza já posso me conectar Então olha que legal é tá vendo o banco admin tem aqui os usuários né se você quiser ver o usuário que é o rot e aqui tá o documento que nós não trabalhamos com registros né um documento que na verdade é um Jon então eu vou ter aqui o usuário que é o Rot a senha também que tá criptografada o
valor é R enfim você já pode editar tudo que você fizer aqui já salva já edita então é muito legal essa exha aqui feita pela própria equipe da M tá então agora com o mongo criado vamos voltar aqui pra nossa aplicação eu vou fazer npm install Oban JS bar mongus e o mongus Então essa primeira Lib ela faz a integração do nest com mongus e a segunda Lib é o próprio mongus que é uma Lib muito famosa na comunidade node pra gente poder trabalhar com mongo vamos fazer a instalação das duas pronto então nós vamos
modelar aqui o assets como uma nova Collection mongo nós vamos entendendo isso ao longo do processo mas na nossa aplicação orientada a objetos ela é justamente essa entidade a gente chama ela de entidade é muito comum né então agora para que o mongus consiga interpretá-la tanto para poder recuperar do Mongo e mandar lá pro mongo nós vamos adicionar alguns decorators aqui então eu vou começar aqui pelo @ esima tá vendo que ele é importa ali do @ nesas mongos Então tem que falar que ele vai ser um esquema para virar essa Collection aí vou começar
aqui pelo id o mongo lida com o ID com esse underscore na frente tem até como mudar mas nesse caso não tem necessidade então ela vai ter o ID tem o nome o símbolo a imagem e o preço nós temos as duas datas que controlam al quando o registro foi criado e quando ele está atualizado mas o próprio mongo já faz isso pra gente aqui nesse esquema Se eu colocar time stamps igual a true então eu peço que isso aqui vai fazer com que o mongus faça o controle Na verdade o mongus faz o controle
das datas tá então eh a gente vai declarar elas aqui para elas estarem presentes mas nós não vamos manipulá-la manipulá-las diretamente é quando o registro for criado ele vai lá e coloca a data de criação quando ele vai sendo atualizado ele vai atualizando aqui mas como são variáveis que o mongus vai controlar a gente no caso typescript coloca uma exclamação para falar que esse campo aqui ele tá sendo apenas modelado no typescript mas ele não vai ser gerado na hora que ele compilar aqui para JavaScript porque esse campo aqui ele é adicionado em tempo de
execução mas tem que ter aqui a a tipagem dele senão vai dar erro na hora de a gente acessar esse campo né Beleza para cada um dos outros Campos eu preciso adicionar um decorator também então vem o @pr para falar que ele é uma propriedade lá da coleção então todo mundo vem esse @p pronto tá a partir desse prop eh na hora que o mongus fizer a conexão pela primeira vez com Mongo e porque a coleção do Mongo ela tem um esquema com tipos né Mas não é nada restritivo com bancos tradicionais então ele cria
Ah o campo image vou tratar como string já o price que tá aqui como string eu vou tratar como número é no caso por exemplo do Price a gente até poderia colocar alguma algum tratamento diferenciado poderia colocar um campo aqui se eu quisesse por exemplo mangus types eu tenho alguns tipos aqui para poder lidar com ele poderia lidar com esse decimal 128 enfim eu tenho alguns outros tipos que eu posso colocar no para ele se comportar de modo diferente mas não tem necessidade tá o ID na verdade o ID padrão do Mongo é chamado de
Object ID que na verdade é um hash que ele cria aleatório ele não trabalha com auto incrementado Mas eu não quero trabalhar com ele então aqui nessa propriedade eu vou colocar aqui o valor de vai ser o crypto ponto handle uid E esse cripto tem que ser importado aqui em cima porque ele faz parte aí da base do nodejs tô querendo gerar um uid de forma tradicional então toda vez que ele for criar o registro ele aciona isso aqui antes de criar e gera o valor tá E oid aquela sequência lá que eu tenho separada
por são quatro trechos tem uma possibilidade muito pequena de gerar ids iguais é uma forma bem bacana de você ter um ID único que você pode compartilhar com outras aplicações e é o meio que acontece com esse home broker se comunicar vai se comunicar com a B3 com outros então quando eu envio um ID posso enviar esse ID tranquilamente tá então esse aqui é o formato da minha Entidade aí eu preciso adicionar mais duas coisas Primeira coisa vai ser a tipagem do documento como lido ele como um documento então a gente chama de asset document
que vai ser o hydrated document passando o asset como generic porque aí agora esse tipo aqui é apenas um tipo é descartado depois que ele tem uma compilação com o JavaScript eh o documento em si eu posso fazer ponto save ponto update ten alguns métodos para poder lidar com ele então aqui a tipagem quando eu precisar é lidar com os documentos de asset e fazer as operações necessárias né então e essa classe ela fica mais agnóstica somente com os dados e aqui a tipagem quando eu necessito mas a Instância desse esquema na verdade é o
que eu vou fazer aqui agora então eu vou criar uma constante chamado de asset esima aí eu chamo tipo esima Factory ali do nestjs mongus eu faço um Create for Class passando o asset essa Instância aqui que a gente vai usar daqui a pouco pro que o mongus monte toda a conexão com o banco tá então pronto está feito agora no módulo raiz nós vamos iniciar a brincadeira aqui com o mongo DB então importes que eu vou jogar ele para cima antes do assets MOD Vou importar o mongus Mod tudo no n mod tudo do
pacote do NS mongus facilita muito o trabalho com o mongus aí eu importo aqui um for Root e passo a minha string de conexão que é aquela mesma que tá ali na extensão que a gente viu então mongo DB do P bar Barra Rot 2ot @localhost na porta 270 17 bar nest que é o banco que eu estou criando e aqui eu coloco o off source igual a admin E aí eu posso colocar aquele Direct Direct Connection Deixa eu só ver se eu não fiz errado aqui pronto então vamos voltar aqui maravilha aí agora no
assets mod como eu vou usar a coleção de Skema eu tenho que informar então eu vou importar mais uma vez o mongus Mod mas aí eu tenho o método importei esse aqui é a Instância do mongus mongus MOD for feature então aqui eu coloco um Array uma coleção de objetos e aí eu passo todas as coleções que eu quero acessar tá então coloco assim name vai ser asset pname isso aqui eu poderia colocar diretamente assim Mas eu posso pegar o próprio nome da classe né aquela classe burrinha Que Nós criamos E aí eu falo Qual
que é o esema em relação a essa classe vai ser aquele asset skem então aqui eu fecho esse forroot serve para poder ser importado no módulo Raiz e o for FIT nos módulos filhos onde eu vou especificando cada Collection que eu quero utilizar então eh se eu não vou utilizar Wallet se eu não vou utilizar Order e tudo mais eu não especifico aquele módulo não tem acesso apenas para fazer uma segmentação melhor então agora nós já podemos fazer um npm Run start Dev e ele já tem que dar algum resultado ó deu tudo certo a
gente pode ver ó que o mongus Mod foi iniciado né e agora quando eu venho aqui no mong db deixa eu reduzir isso aqui acho que não tem nem como esconder playgrounds depois dá para ativar né Deixa eu tirar isso aqui também agora se eu fizer aqui um refresh Olha quem eu tenho aqui eu tenho nest com assets e o esquema tá vazio tem o índice com o ID Que Nós criamos mas eh o banco os bancos no seos Eles não precisam de você ter um algo do tipo Eles são dinâmicos né caso que a
gente já V que ele já reconheceu os assets e agora nós podemos fazer a nossa brincadeira então o que eu quero fazer aqui agora na minha camada de serviços que é o meu asset service é conseguir criar pegar todos e pegar um só eu não vou fazer a implementação de update Remove a gente não vai usar Você pode fazer ela como o dever de casa então vou acabar tirando aqui o update remove também do Controller a gente tira aqui o dto que são os dados do bor que eu receberia né então eu posso excluir aqui
esse dto vai ficar somente o da criação tá então Começando Aqui a nossa brincadeira eu tenho que ter acesso à Instância do MS que gerencia a coleção de assets então no Construtor eu já peço pro nest inserir para mim então vou criar aqui o asset Skema aí aqui a gente coloca assim ó Model importando ali do mongus passando aquela referência da classe burrinha tá E aqui eu tenho que importar a classe aí para ele saber aqui só com esse mod ele não vai saber portar diretamente algumas coisas do nes umas funcionam com tipo outras você
tem que adicionar um decorator antes normalmente bibliotecas de banco de dados vão se comportar dessa forma Então eu tenho esse decorator inject Model do pacote @es mongus E aí eu passo aqui qual que é o asset pname então ele vai conseguir encontrar porque é o mesmo nome que nós aqui no módulo tá então ele vai injetar a Instância aqui pra gente Esse Model asset é algo que é um padrão para tipar essa variável mas se eu quisesse também eu poderia usar o o asset document também se eu for necessário mas ele pode ser útil em
algumas outras situações tá então na hora de criar aqui eu tenho meu ó que vem lá da request né a gente vai receber aqui as informações nome o símbolo o preço e a imagem então aqui modela o objeto que está sendo recebido aqui passa-se pro serviço e agora a gente vai fazer a nossa lógica então fica muito fácil agora eu chamo o o meu asset Skema P Create passando o meu dto porque o meu dto é do mesmo tipo das informações que devem ser passadas aqui pro Create Então esse Create já vai fazer a criação
do registro para mim inclusive na verdade como isso aqui tá muito simples vamos já fazer o find All e find One para poder buscar todos os registros nós vamos fazer um this asset esema PF simples assim né Nós estamos fazendo essa parte aqui de assets bem simples agora na hora de consultar um só ao invés de receber um número eu vou receber aqui vamos pensar na hora que eu estou usando a a p né e tô recebendo lá um assets bar uuid é melhor passar o símbolo né o símbolo Seria algo que as pessoas usariam
mais do que qualquer outra coisa né cada ação vai ter o seu símbolo todo mundo vai lembrar então aqui eu poderia colocar símbolo então eu faço um asset esima p find One aí eu só passo o símbolo é muito fácil mexer com m então ele vai pesquisar pelo símbolo claro se não existir ele acaba retornando nul aqui a gente poderia fazer validações nesses dados de entrada outros os filtros paginação eh se caso a gente consultar um find One aqui não existir eu poderia lançar um 404 tá tem vários refinamentos que poderiam ser feitos mas a
gente vai se concentrar no Core aqui mas são coisas também que você pode acrescentar na aplicação que você tá desenvolvendo porque isso traz mais conhecimento melhor seus conhecimentos com rest com next e etc tá então aqui na verdade ó eh eu não tô recebendo o ID nós vamos receber o símbolo aqui também vai ser símbolo eu vou mudar de ID para símbolo e esse mais aqui é para converter ele para inteiro tenho essa necessidade não pronto então eh deixa eu ver o que mais tá faltando aqui tem um Import que não tá sendo utilizado lembrar
sempre que ele tem que mostrar a mensagenzinha de sucesso então deu certo então agora vamos fazer aqui a criação do nosso ativo ver o que que acontece deu um erro ele mostrou um cannot read proper of undefined lá do Rand uid isso aqui é por conta dos imports a gente vai chegar aqui no test config colocar assim ó es mod interoperability igual a true porque nós temos vários tipos de módulos no JavaScript costuma ser um um burburinho na comunidade né comon mod S6 mod AMD mod Enfim então isso aqui faz com que ele consiga importar
o cripto da forma que tá senão a gente teria que colocar asterisco s e não tem necessidade disso tá então vamos um um save aqui para poder forçar beleza aí agora cadê o meu api com tanta coisa aberta aqui que fiquei perdido Olha só então Consegui criar a minha ação e veio lá no id o id tudo certinho T criando vários registros vendo aqui em cima até que ess ele vem diferente o uid sempre são diferentes se eu consultar vários tá aí ó Mas a questão é que um ativo ele não deveria ser duplicado né
talvez até o nome eu poderia deixar que eu pudesse cadastrar o mesmo mas também não seria legal Eu Posso acrescentar aqui no símbolo por exemplo que ele vai ser único então vou ter uma M vai adicionar essa restrição lá no Mongo e vou falar para ele criar um índice disso também eu posso adicionar isso inclusive pro nome são informações que eu não poderia ter repetidas né nesse caso eu tenho que tomar cuidado porque eu tenho que voltar aqui ó pode excluir o banco sem Dona Piedade porque ele é criado justamente quando você faz um save
aqui novamente só desencadear um save faz um refresh eu tenho aqui novamente a tá vendo agora que ele criou um índice PR nome pro símbolo e eu vou ter a chave única também para eles como num banco convencional então agora Se eu tentar fazer a criação aqui primeiramente vai dar certo e se eu tentar fazer de novo Ops Olha só né Tá vendo eu não posso ter a duplicação do nome e o símbolo também porque ele já viu primeiramente o nome e Já lançou o erro então isso aqui seria importante então tenho só meu registro
aqui embaixo e nós temos também que conseguir consultar pelo símbolo né então se eu colocar aqui A1 ele consultou apenas um registro Se eu colocar qualquer coisa que não existe não vai vir nada né é estranho ter um 200 aqui seria importante ter um 404 eu tenho que trabalhar com as boas práticas do rest né não é um 200 com success falso Isso está absolutamente errado então criamos aqui o nosso asset viu como que é legal trabalhar com Mongo e com nes também como que ele facilitou a vida então agora vamos trabalhar com a carteira
a carteira é bem simples né porque ela só tem o ID com as datas de criação aqui a gente não tá trabalhando com você adicionar reais na sua carteira para poder comprar o ativo a gente tá se concentrando na negociação em si então se eu fosse controlar o dinheiro que eu tivesse na carteira poderia ter um amount aqui um saldo do que eu depositei vou retirando e vai meendo com esse saldo Então a gente vai fazer a mesma coisa faço um de resource coloco aqui o wallets rest api pronto então a mesma história a gente
vai ter aqui o wallets modio agora né E tem entidade tem Controller tem serviço então já vamos modelar ela aqui eh que que eu vou fazer ó para ficar até mais fácil eu posso copiar o asset para cá e aonde tá asset eu mudo PR Wallet tiro todos esses campos daqui deixo os dois Campos de controle al das datas beleza e aí eu venho aqui no m feature do assets e replico para Wallet então Imports Agora eu tenho que fazer os importes aqui então importe do módulo aqui vai ser asset e ali embaixo também então
cortei Wallet Skema também eu não quero me preocupar aqui com questão de atualização de remoção Então tira fora tira aqui também aí no Controller vamos alinhar bonitinho aqui vou retirar já o update tem os dois verbos aqui em cima que eu tenho que remover e datate sai também então na hora de criar um Wallet não tem nenhum dado para passar né vai ter somente o o id pra gente referenciar a carteira não preciso passar nada tá tudo certinho que a não ser o find One que a gente vai trabalhar com ID como string né então
dentro da camada de serviço aqui ó eu vou mudar ele para string já de uma vez Agora é copiar o que a gente fez de asset para cá então copio aqui aí vamos mudar só que eu tenho que tomar cuidado agora para mudar somente os maiúsculos então aqui vira Wallet e aqui Wallet Skill tá faltando importar aqui o Wallet inject Model a Instância do Model e aqui eu faço na verdade a consulta é pelo id né então aqui na verdade eu posso até passar somente o ID dessa forma find One Na verdade acho que ten
um find by ID aqui Prontinho então eu já tenho o meu esquema tá registrado tudo bonitinho agora npm Run start Dev a gente já vai ver que tem já as rotas de Wallet e as rotas de asset né então que a gente faz aqui vamos replicar isso aqui aí só tem que tomar cuidado de sempre ter as hashtags para ele dar esse request Então na hora de criar o Wallet eu passo aqui o wallets não tenho dados a ser enviados posso até tirar esse application json aqui porque eu não tenho dado nenhum posso deixar branquinho
se eu quiser listar todas as wallets e aqui que a gente tá fazendo só por conveniência né Eh onde estar todos os wallets eh isso não poderia estar disponível PR os usuários comuns somente pros administradores eh e aqui na hora de passar um ID qualquer para poder fazer a consulta Tá então vamos fazer o seguinte aqui agora vamos criar a carteira ó lá criou a carteira se eu quiser consultar as carteiras existentes aqui eu posso criar várias carteiras aí eu tenho várias e aqui se eu quiser consultar uma só Pronto né então eu consegui fazer
essa criação agora esse rest client ele tem um recurso interessante e pra gente poder organizar esses testes que daqui a pouco a gente vai precisar fazer várias chamadas para poder consolidar tudo eu posso chegar aqui ó e adicionar mais uma hash @name Create o Wallet aí aqui embaixo eu crio uma variável para poder armazenar o valor do ID da Wallet que eu acabei de criar então coloca assim Wallet ID dois pares de chaves aí eu coloco o nome ali de cima Create Wallet e aqui ele fica adicionando um monte de coisas mas é isso aqui
essa ela armazena as informações da request e da response então eu pego aqui o resultado da respon ID eendo aqui então para poder fazer um teste bacana posso passar aqui Wallet ID sem a necessidade de ter que toda hora ficar copiando e colando né Legal tem vários recursos envolvendo R que a gentea um que agora eu posso fazer aqui a criação e logo já consulto o registro PR criado Prontinho então agora já temos já fizemos dois fizemos o asset fizemos ao Wallet Vamos trabalhar com Wallet asset agora que eu tenho a minha carteira e ali
eu tenho o registro de qual quais os ativos que eu tenho e o quanto que eu tenho aqui em shares né e obviamente a aquisição desses ativos vai vir da lógica depois que eu fizer uma compra mas por conveniência nós podemos adicionar ali rotas para que a gente possa adicionar esses ativos na carteira para testes é interessante vai ser isso que a gente vai fazer agora e na nossa aplicação essa parte de Wallet asset pode ficar no módulo de wallets é porque relativ a carteira como um todo então vou duplicar pela primeira vez o módulo
vai ter mais de uma entidade não tem problema nenhum aqui eu coloco Wallet asset tá então aonde tem o Wallet eu vou acrescentar asset aqui e agora vem os campos né eu tenho que acrescentar o shares as datas eu já tenho o ID eu já tenho então Vamos colocar aqui @pr shares que na verdade é apesar da gente estar colocando Number aqui esse shares ele vai ser um inteiro tá então a gente pode especificar até importante isso eu posso colocar assim ó Type mongus pesima pon types Na verdade acho que eu tinha pegado types que
não tem todos os tipos né eu tenho muito tipo aqui ó Então posso falar que ele é um ind 32 beleza mas a gente vê que esse Wallet asset ele tem uma relação com o ativo e com a carteira Então eu preciso colocar essas duas informações também aqui então eu tenho o Wallet e tem o asset É e aqui que entra agora a questão de relacionamento é o relacionamento entre documentos é diferente do que a gente tá acostumado em bancos tradicionais e alguns bancos no sequel até nem tem relacionamento nenhum a forma de se trabalhar
com os dados é bem diferente mas a gente consegue fazer um relacionamento aqui mas eh esse Wallet aqui eu poderia até chamar ele de Wallet ID ass ID que a gente tá acostumado que é a chave estrangeira Então se em Wallet entity o ID é string e no asset o ID também é string obviamente o tipo dos dois seriam string mas colocar e ID vai ser ruim porque vai ser nessa variável que a gente vai carregar as informações da instância relacionada fazendo uma espécie de join né não é um join convencional então colocar Wallet ID
ficaria estranho então vou deixar deixar somente o Wallet tá E aqui o tipo vai ser assim ó ou eu tenho um Wallet document aí que entra agora aquele tipo que a gente tá usando para poder referenciar porque quando eu tô recuperando um Wallet ali do Wallet asset eu não pego somente essa Instância eu pego a Instância do documento como um todo ou ele é uma string isso vai depender da forma que eu quero carregar então aqui também asset document ou string acho que ele não importou pronto tá aí agora o @prop vai ter a sua
peculiaridade Então vou colocar assim ó o tipo vai ser uma string essa string aqui é é o tipo do próprio JavaScript né aqui eu não posso passar essa string do typescript que ela apenas decorativa ela é descartada e eu coloco a referência que vai ser o asset pname para que eu Especifique aqui pro mongus e ele saiba fazer o carregamento do relacionado e na verdade aqui é o contrário né aqui é Wallet e aqui embaixo é o asset pronto então está criado aqui bonitinho beleza aí eu posso chegar aqui no meu wallets mod e duplicar
essa parte aqui do for feature né coloco aqui Wallet asset e aqui o Wallet asset Skin aqui tem outro detalhe também que nós podemos adicionar e é bom ver como que o mongo se comporta eu não vou poder repetir dois documentos que tenham o mesmo a mesma combinação de Wallet com asset né não vou poder ter se eu tenho a minha carteira com ação da Google não vou poder ter dois registros dois documentos iguais então nós podemos adicionar um índice para poder especificar isso então eu pego esse Wallet Skema Pex como é uma chave composta
o índice composto então eu coloco assim ó Wallet um asset um segundo parâmetro Unic go true isso aqui é para que eu tô falando que eu tô ativando o índice no campo Wallet no campo asset e esse índice vai ter a restrição de unicidade então agora não vou poder ter ativos repetidos tá então beleza A nossa aplicação já tá carregada aqui vamos dar uma olhada agora se eu Fer um refresh aqui olha só aqui eu tenho o índice da chave primária e aqui o nosso índice para poder impedir que eu tenha ativos repetidos tá aí
eu posso fazer aqui a criação desse registro eu vou fazer dentro do próprio Wallet service Então vamos colocar assim Create Wallet asset eu vou receber aqui Wallet id e o asset ID nós podemos receber também os shares Na verdade vou até colocar esse aqui como objeto V colocar assima aí eu tenho Wallet ID asset id e shares que é número tá Então como aqui em cima eu posso pegar esse camaradinha passar para baixo para ser semelhante mas aí agora eu preciso pegar também o esquema de wall Wallet asset então agora aqui vai ser Wallet asset
e aqui também Wallet asset e aqui também eh Vou importar aqui beleza então tenho agora dois inject mods eu posso importar quantos eu quiser né então a gente vai passar aqui os dados mas aqui tá vendo que eu tô tratando como Wallet id e asset ID mas na verdade que eu tenho que passar para cá é Wallet vai ser data Wallet ID asset vai ser deira asset id e o shares que é a mesma coisa né então é o que que ele tá achando Ah porque aqui eu tenho que colocar deira shares né Maravilha agora
no meu Controller eu posso criar um endp alinhado vou copiar esse find One aqui então eu tenho Create Wallet asset eu não posso ter esse mesmo decorator porque senão vai ter colisão de rotas quando eu faço uma criação com arquitetura rest eu coloco post aí vai ser barra ID assets né vai ser legal ter um recurso alinhado que a gente chama aqui eu passo o uid e tenho assets isso significa que assets tem uma ligação com wallets né que eu estou criando os ativos da minha carteira é uma boa divisão então eu recebo aqui o
id e recebo os dados que é justamente com o B aqui eu não coloquei é um não preciso criar necessariamente uma Instância de um dto eu posso só colocar aqui um deira sem tipagem nenhuma tá que importa são os dados que eu estou passando Mas se eu quiser fazer a validação desses dados aí sim eu tenho que criar esse dto então aqui ó eu vou passar o eh Create Wallet asset mais o b beleza OK então vamos pegar aqui esse post poder fazer a criação então é legal ter esse parâmetro aqui eu já posso adicioná
aqui eu vou tirar eu coloco barra assets então passo content Type com application barj E aí os dados que eu tenho que passar n tenho que passar o Wallet ID ou melor ID Preciso né Inclusive tem uma coisa que eu esqueci aqui porque na requisição eu só vou passar duas informações que é o ID do ativo e o shares porque o Wallet ID já está presente aqui Então na verdade esse b não pode ser dessa forma então o allet ID vai ser igual id o asset id vai ser igual a b. asse id e o
shares vai ser B shares eu posso até colocar pelo menos uma uma tipagem aqui para ele não ficar pentelhando por conta que não tem tipo nenhum ele tá considerando que é n né famoso n do typescript pronto então aqui eu vou passar asset ID eu poderia passar o símbolo do ativo também né Poderia lidar com essa forma mas aqui qual que é o o asset ID Eu poderia usar essa mesma estratégia da Wallet de guardar o valor da variável colocando Create asset E aí eu pego crio uma nova variável asset ID Create asset aqui né
ele sai criando trocas coisas aí tá sobrando um par de Chaves Beleza então agora eu posso reaproveitá-lo né então aqui eu tenho que colocar aspas E aí eu coloco os dois pares tá aí ele vai preencher ali com o valor quando a gente criar o ativo então aqui eu vou passar 100 tá bom né como eu não tenho esse asset ID aqui ainda eu posso brincar aqui à vontade O bom do do Mongo é isso eu posso matar o banco aqui ó digitar nest matei o banco aí é só forçar novamente um um save ali
que ele carrega lá o banco de dados na verdade nem precisava disso mas aí agora eu posso criar o ativo eu consigo consultar tudo bonitinho consegi consultar um crio a carteira e consulto a carteira e adiciono um ativo nela vamos ver se a gente de fato tem o ativo agora na carteira não temos Eu acho que eu esqueci de fazer alguma coisa em relação a a a weight né aqui eu fiz o Create Ah eu passei o Wallet skima por isso que eu vi que o retorno tava na verdade é esse aqui né ó sem
problemas drop table fácil só forçar um save novamente ok então vamos lá de novo por isso que agora fica legal fazer os testes Já criei um criei o Wallet e agora adicionei o Wallet na carteira então é tá vendo que as chaves estrangeiras estão com esse nome que tá aqui aí eu posso fazer aqui um refresh e olha só como é que o documento fica aqui o shares os dois valores dos relacionados e a data né esse V aqui é porque nós temos um versionamento dos documentos à medida que você vai salvando ele vai incrementando
esse valor e aqui a gente pode fazer alguns controles bem legais Então esse api http serve pra gente poder brincar né eu tô fazendo aqui só por conveniência porque depois Isso vai ser interessante na hora de fazer alguns testes que eu fiz a compra de um ativo eh ou que eu quero fazer a venda de um ativo eu não tenho ele eu já poderia adicionar ali na carteira só para que eu possa brincar aqui com as operações aí agora nós temos o módulo de melhor o módulo a coleção de orders né que é o que
a gente vai criar agora então o mesmo sistema que a gente tá acostumado a gente tá já crack em criar coisas com o nest vou criar aqui um resource de orders Rash api crude Beleza agora eu tenho o módulo de assets de orders de Wallet então que que a gente pode tirar aqui na verdade eh acho que eu vou fazer o mesmo sistema eu não tenho esse update aqui nem remove tiro esse update daqui e aqui da mesma forma tiro já tô até tirando já os verbos de forma antecipada posso criar a ord fazer o
find out e fazer o find One Mas a questão agora que essa entidade essa coleção no mongo vai ser a que mais vai ter eh lógica tá envolvendo ela a gente pode pegar inclusive wallets aqui e fazer um eu vou fazer um copy dela nós podemos reaproveitá-lo algumas coisas vão ser parecidas então aonde on tá Wallet asset eu vou mudar para Order pronto aí esse index aqui de baixo eu tiro aí eu tenho que importar aqui o Wallet Mas vamos lá então eu tenho o ID tá igual o tanto que eu quero comprar que é
o shares né o quanto da empresa das ações da empresa que eu quero comprar o relacion Wall aqui eu vou importar bonitinho Deixa eu tirar vamos importar certinho agora porque eu t numa outra pasta por is que tá dando erro n também tem o ativo que eu estou comprando Na verdade eu vou até colocar o paral que é a quantidade que ainda falta finaliza ord então V também vai ser todos os dois vão ser inteiros e o price Qual é o preço que eu quero comprar ou que eu quero vender que no caso não vai
ser inteiro né Então tira essa parte daqui e aí resta duas informações nós vamos ter Qual é o tipo da ordem se é compra e venda e o status se ela tá pendente se ela já tá finalizada e tudo mais então nós vamos criar aqui um tipo mais apurado para poder tratar aquelas duas informações ali então posso trabalhar com en1 porque eu posso fazer assim ó Order Type aí eu quero compra buy e o sell com a venda bem melhor tratar dessa forma aqui né então eu posso falar que o Type é desse tipo melhor
aqui n é só passar aqui um prop em cima dele eu vou colocar também no status e o status também eu vou ter um Order status aqui em cima Export Type Order status a gente vai ter pendente aberto se tá fechado e se falhou tá e se tá pendente significa que ele não teve nenhuma execução ainda se tá aberto ele está em negociação eu posso ter ainda aqui no par alguma coisa para poder negociar vamos supor que eu estou comprando 10 e aqui tá CCO Então significa que restam ainda cinco ações para poder negociar então
o status dela vai estar como Open closed significa que ela fechou totalmente que ela negociou então o p aqui tem que tá como zero né então é só replicar aqui esses valores eu quero trabalhar com eles como string Então é só chegar aqui agora dois doos iguais e eu coloquei mais do que devia Pronto agora aqui na verdade eu coloquei Type né que não tinha visto não tenho nenhum erro aqui show de bola Então esse aqui é o nosso mod vamos pegar aqui um mongus for feature poder passar para cá então eu só vou precisar
de um deles passo o post do mangus MOD aí Aqui onde tá o Wallet asset vai ser Order então Porto Order e Order de skim Pronto já tá prontinho aí nós podemos fazer aqui a já a criação dessa Order Vamos pensar que que precisa ser enviado já que acho que vai ser melhor né E então vamos fazer aqui já hashtags eu vou fazer então http 2 p bar Barra local host na porta 3000 bar orders content Type application json então para poder gerar a Order eu vou precisar passar a carteira e aqui vem um algo
que eu quero chamar atenção que na hora que eu estou criando a Order tivesse criando autenticado eh a não ser que tivesse múltiplas carteiras do usuário né mas eh provavelmente ele teria uma só eu não precisaria passar o Wallet ID nesse cenário que eu estaria autenticado né já pegaria a carteira a partir da Identificação do usuário mas aqui como a gente não tem isso eu estou passando então Wallet ID na verdade vamos pegar aqui como a gente tá passando o estilo Kemel Case só para não quebrar eu vou colocar dessa forma então é Wallet ID
asset idal é o ativo que eu estou comprando então nós temos as duas informações né aí quanto de shares que eu estou comprando Vamos colocar 10 qual é o preço e o Type que vai ser por exemplo bu é compra o partial é o status a gente não define aqui tá Então nós vamos ter essas informações aqui no nosso dto Então vamos lá Wallet idid ser o número Price que vai ser um número e aqui eu já posso tipar com Order Type o Type ao invés de passar tipo bu né fica bem melhor então no
Controller já tenho a informação sendo passada agora vamos fazer a nossa lógica aqui dentro da camada de serviços V pegar aqui service gosto de copiar a linha bem melhor então tem que importar inject Model aqui o Order vou chamar de Order Skema e Order virg daqui pronto OK então nós temos o nosso método aqui para poder criar então vamos passar cada informação que é necessária Então vamos começar o Wallet vai ser Create Wallet ID asset vai ser create dto asset ID aí tenho o shares a mesma coisa só pegar da variável partial mesma coisa ou
melhor partial aqui que tá o partial e eu até expliquei se algum momento eu falei zero né o zero é quando eu não resto mais nada ele vai iniciar igual ao shares Então estou comprando 10 o partial também também vai ser 10 até que ele chegue a zero para que eu considere que essa Order foi totalmente finalizada então a lógica aqui né então eu tenho o Type e o status eu vou iniciar com orda status pendente que ela não teve nenhuma execução ainda Então apesar de ser simples aqui né a gente já tem uma regra
de como que as coisas estão funcionando né como que ela já vai começar a funcionar aí vamos fazer aqui um find All find All seria interessante talvez pesquisar pela a gente pode passar assim um Filter depois Isso vai ser importante lá no frontend eu quero pesquisar todas as eu não vou pesquisar todas as orders né não sei que esteja no administrativo mas isso aqui vai servir lá pro frontend para poder retornar todas as ordens de uma carteira então aqui eu faço um disord Skema pon find passando o Wallet é igual a Filter P Wallet ID
tá E na hora de fazer o find One aqui vai ser string e aqui vai ser Order schema find by ID passando o ID então aqui eu tenho que passar o Wallet ID Tá então vamos rodar aqui a nossa aplicação e agora eu tenho que consertar algumas coisas no Controller aí aqui que tá a questão do find out ten que passar alguma coisa que ele tá pedindo aqui eu tenho que tirar esse mais já resolve a questão é aquilo que a gente estava conversando sobre autenticação nós não temos autenticação no ambiente de autenticação eu pegaria
aqui a request eu ten condição de acessar ela pegaria o usuário consultaria desse usuário Qual é o Wallet ID para poder passar para cá mas para poder facilitar o nosso teste aqui eu vou fazer com que esse Wallet ID seja passado como uma Carry string Então a gente vai fazer assim ó barra orders bar Wallet ID porque depois se você quiser acrescentar autenticação é só remover não tem que mudar assinatura aqui da Rota né do end Point Então vai ser exatamente dessa forma Então a gente vai fazer assim ó vou colocar o decorator Carry com
o nome Wallet ID aí coloco a variável que vai receber o valor do Carry parameter da Rota então fácil agora passo aqui o Wallet ID tiro aqui beleza então tenho tudo que é necessário pra gente poder testar essa Order eh Então vamos criar aqui a ordem Mas também eu já quero ter o endp para poder fazer a pesquisa então aqui eu faço um get coloco três hashtags e aqui vem Wallet ID é igual ao parâmetro que a gente recebe aqui né de cima tá vendo como que essas variáveis estão imagina toda vez que eu fizer
alguma coisa ter que ficar trocando os valores no arquivo inclusive esse arquivo pode ficar no controle de versão né seria muito ruim então eu já tenho ativos né eu já tenho os valores nessas variáveis aqui eu já tenho Wallet também inclusive até não até não mostrei todos os wallets da carteira é um outro end Point que eu posso criar também vamos fazer a criação da Order Olha só pendente de compra o ID dela aqui aí eu posso consultar todas as ordres daquela carteira se eu passar um ID que não é válido ele vai retornar a
aray vazio tá vendo maravilha agora nós vamos fazer alguns refinamentos nos end points da api nós já temos alguns end points já entendemos como que as coisas funcionam Então vamos pegar aqui o caso por exemplo dos ativos e eu tenho o retorno do id nome o símbolo a imagem já deveria retornar com o endereço né e para a IPI já falar assim olha você vai carregar a imagem desse ponto enfim Então como que fica isso isso não é responsabilidade da camada de negócio camada de negócio vai devolver a Instância dos assets isso é responsabilidade do
Controller mas colocar isso no Controller também não é legal a gente pode criar uma classe eu vou chamar de asset penter que apresentação dos dados Então vou chamar de assets presenter eu recebo aqui no meu Construtor o ativo coloco aqui na variável privada e aí eu posso colocar aqui um método true Jon esse método se eu devolv uma Instância desse presenter aqui pro nest devolvendo ela ele ele vê se tem um t json e já aciona então o nosso intuito é esse né converter para json então é uma boa forma da gente fazer essa conversão
pros dados que a gente precisa Então vamos colocando aqui as informações a maioria delas é só replicar Então vem aqui o símbolo é asset mais o símbolo o preço e agora vem a imagem URL né não quero devolver a o valor da imagem aqui nós vamos ter um local host na porta 9000 barra eu vou concatenar com o valor da imagem tá isso aqui já é um um endereço prévio que a gente vai criar depois vou ter umaa tinha com as imagens Tá mas apenas um indereço a gente eh essas imagens não estariam nessa aplicação
estariam em algum outro lugar então é só para simbolizar isso então agora na hora que eu criar por exemplo um ativo eu pego aqui o meu asset aí tem que colocar isim que Wait a promessa e aí eu devolvo um New ass set presenter passando o ativo aí ele vai chamar o Jon depois quando eu tenho find All então vou ter que fazer aqui a captura dos ativos para cada ativo que eu quiser posso utilizar o map né que eu converto todo mundo para asset presenter passando aqui o asset no caso do find One mes
história e aqui retorna um New asset apresenta passando o ativo aqui eu só tem que tomar o cuidado porque no caso de um find One eu poderia não ter o ativo né aqui eu não tô fazendo o controle se ele existe ou não então vou colocar essa interrogação que é o assertion no do typescript para ele não ficar me pentelhando falando que que é nul né porque ele vai falar ali ó né que o nul não é atribuível pro tipo asset maravilha então agora eh Vamos só matar o banco de dados aqui porque eu não
vou criar outro ativo ali só matar o banco salvar uma vez aí agora hora que eu criar Olha que legal V consultar também os dados El já vem lá formatador uma mudança na hora de trabalhar com a carteira porque a gente tá só pegando o ID com as datas de criação isso aqui não tá suficiente e se eu consultasse a carteira ela já mostrasse os ativos relacionados né então vamos pegar aqui a nossa camada de negócio de wallets como que eu poderia fazer isso aqui no find One por exemplo eu poderia usar o esquema de
Wallet asset e de Wallet para poder fazer duas consultas E aí consolido as informações mas em Wallet asset nós temos a relação com a carteira e a relação com o asset tá e a gente consegue carregar um relacionado dessa forma aqui ó se eu usasse apenas o Wallet asset eu consigo fazer por exemplo um find One ou find é find One seria find One né porque eu tenho a Wallet passando ali ao igual ID E aí eu tenho o método populate ele é muito legal porque eu posso passar aqui ó eu quero carregar o Wallet
e o asset aí por isso que nós tínhamos colocado que ele ou é ou é um document ou é o string porque se eu colocar o populate aí vai vir esse tipo aqui né por isso que colocar a tipagem ajuda a deixar claro né que uma hora pode vir uma coisa outra hora pode vir outra coisa então com essa referência o mongo consegue já trazer para mim mas o ponto é que na hora que eu tô consultando aqui uma Wallet tanto aqui ou ou somente no find eu tô consultando pelo Wallet né Eu não tô
consultando pelo Wallet asset eu poderia chegar aqui na minha Wallet e fazer uma outra mudança acrescentando todos os ativos então isso aqui seria uma coleção de Wallet asset document olha só a diferença ou uma coleção de Strings para eu saber exatamente com quais eu estou relacionado num banco de dados tradicional você teria aquele One né que seria apenas simbólico pro RM fazer o join você não teria esse dado armazenado na sua tabela aqui é diferente esse dado ele vai ser armazenado na minha coleção tá então é o relacionamento do lado contrário para que a gente
Facilite a nosso trabalho então a gente vai fazer assim ó nesse prop aqui eu vou passar que o tipo vai ser mongus psema pon types P string E aí como vou ter uma coleção de uids eu coloco esse Array em volta tá E aí eu falo que o ref é Wallet asset pname é porque eu tô relacionando com uma entidade filha eu posso adicionar também aqui uma proteção que vai ser uma Arrow function que vai ser isso aqui ó New set passando o v Isso aqui vai evitar que a gente adicione registros duplicados como agora
é uma coleção né vou pode ter algum risco da gente adicionar no Array registros duplicados então com o set que é uma estrutura do próprio JavaScript se eu adicionar registros duplicados aqui ele já vai eh evitar isso é importante também mas isso aqui nem precisava a princípio né mas pronto então agora isso aqui muda totalmente o jogo pessoal eh eu vou até fazer aqui um refresh e matar o meu Database e forçar com que ele recarregue aqui novamente e aqui ele tá dando um erro agora eu tenho só tomar o seguinte cuidado em relação ao
Wallet aqui asset aqui eu vou tirar esse nen tá Por quê eh dessa forma que eu fiz agora o Wallet asset importa Wallet e Wallet importa Wallet asset Então a gente tem aqui uma um importa o outro pelo JavaScript e ele tá dando Zica na hora de trabalhar então eu converto esse tipo aqui para texto resolvo esse problema tá mas agora muda a na hora que eu for criar um novo a na carteira Porque não basta somente que eu cadastre na coleção de Wallet asset eu preciso adicionar o ID que ele gera aqui na Wallet
também tá então aqui eu recebo o Wallet asset a Instância né agora minha regra de negócio muda um pouquinho depois eu tenho que fazer Wallet asset posso realizar update One onde o ID que eu quero atualizar é deira Wallet id e aqui o m ele é diferente ele permite que a gente faça operações eu vou fazer operação de P em assets e eu passo aqui o Wallet ID Ou melhor o Wallet asset ID Então esse push é a mesma coisa de eu fazer um Array push né Eu tenho um Array aqui eu posso fazer um
push ele já faz para mim beleza né então a operação é essa mas aqui nós temos uma outra questão que nós temos duas transações acontecendo no banco de dados né uma inserção e uma atualização e se caso essa atualização der certo Ou melhor essa criação do Wallet asset der certo e essa outra não der então vou ter uma operação feita pela metade a gente chama de operação inconsistente eu tenho que garantir ou que isso aqui Execute corretamente ou que não se Execute nada e aí nós vamos trabalhar aqui com o modo chamado de modo transação
que é convencional também dos bancos para que eu controle isso aqui somente se tudo der certo que ele vai de fato persistir no banco então nós vamos precisar importar aqui em cima a Instância da conexão do mongus Então vou colocar assim ó inject Connection Private Connection é do tipo mongus Connection aí eu vou criar chamada Sessão session então aqui eu coloco a wait this Connection Create start session vou iniciar minha sessão aqui aí eu chamo o meu session start transaction para que eu comece a fazer as minhas transações esse errinho que ele tá apontando aqui
D lint não se importe se a mudança nova aí do nest tem como descartar isso aqui mas não é um erro que tá acontecendo tá então na hora de fazer criação nós vamos passar esse session como o segundo parâmetro que essa criação tá dentro dessa sessão na hora de fazer o push também eu vou passar a sessão tá então depois disso aqui a gente faz uma await session commit transaction somente se chegar nessa linha ela der certo que ele vai de fato insistir tudo no disco caso contrário ele vai descartar e pra gente forçar esse
descarte então eu coloco toda essa turminha que pode dar erro aqui até esse commit num trycatch E aí nós fazemos aqui um conso error somente pra gente poder ver o erro que tá acontecendo E aí eu faço a chamada do session H ou melhor HB que é é o HB que é tá com abor transaction para ele abortar tudo tá e o finally que faz parte aqui desse dessa turma eu preciso colocar um finally end session para finalizar essa sessão que eu acabei de abrir para poder liberar ela independente se aconteceu um erro ou não
eu tenho que fazer isso aqui agora eh quando eu faço um Create com esse session o tipo do retorno aqui na verdade ele me retorna um Docs apesar de ser apenas um documento que eu estou criando que eu posso criar vários ele me retorna um Array Então eu tenho que pegar o Wallet eh asset de Doc zer pronto e aqui depois do commit aí sim eu posso retornar o Wallet asset né Então olha só como que ficou agora o nosso método aqui eu esqueci um await foi bom que eu lembrei antes de realizar o test
E aí por precaução vamos fazer aqui um refresh um drop para poder fazer com tudo limpinho aí é só forçar um save aqui então vamos lá tenho que criar um asset Cadê o Wallet Tem que criar o Wallet aí agora tá vendo que veio com o asset vazio agora vamos incluir um asset na Wallet e aconteceu um erro tá falando sobre a transaction que nós estamos utilizando né ele tá falando que trans Actions são permitidos apenas no modo réplica do Mongo o mongo é um banco de dados que trabalha com várias réplicas né ele pode
ficar distribuído é uma arquitetura bem interessante essa execução que nós estamos fazendo aqui com docker compose ele tá rodando uma Instância só simples e ela não tem o suporte a esse modo transação né que a gente tá querendo Ah se acontecer um erro aqui posso ter n transações acontecendo se alguma delas falhar ele aborta tudo através da sessão porque todas estão controladas sob essa sessão tá então a gente vai fazer o seguinte aqui ó eh eu vou parar o meu mongo nós vamos rodar ele de uma maneira diferente então vou dar um Crol C Posso
até fazer um docker compose Down para poder destruir totalmente e nós vamos ter que fazer uma configuração mais apurada eu vou criar aqui é uma pastinha pon docker mais mongodb e um docker file para ele então nós vamos fazer uma construção específica do Mongo tá não convém digitar e também você não precisa decorar isso aqui nem eu decoro tá essa configuração aqui está fazendo essa execução de adicionar no modo réplica a gente tá rodando somente uma réplica não tem necessidade de rodar mais de uma mas nor M você teria um principal e as réplicas rodando
então ele vai ter um espelhamento dos dados nessas réplicas ele consegue fazer esse controle ter resiliência e etc Então o que tá acontecendo aqui nessa chamada Justamente a habilitação desse modo réplica tá o que tá acontecendo exatamente aqui nessa linha aqui ó tá então agora mudo o docker compose porque não vou pegar mais diretamente da imagem eu vou colocar aqui assim ó build P bar. docker mongodb que é o caminho deixa eu até ver se tá certo pon docker mongodb tá então agora não vai mudar nada da forma que a gente tá fazendo só vou
fazer um docker compose up esperar alguns segundos para ele poder fazer a execução E aí a gente pode voltar a se conectar normalmente só não tenho banco nest ainda porque eu não tô rodando a minha aplicação Então vamos parar tudo aqui vou fazer o npms Run start Dev posso fazer aqui um refresh tenho aqui as minhas coleções que ele já identifica ali maravilha então vamos voltar para cá agora vamos criar um ativo uma Wallet e adicionar uma Wallet aí Agora veio os dados para cá antes ele tinha dado o erro ali né Inclusive eu até
esqueci de uma coisa e que ele retornou aquele 201 por um motivo porque eu até coloquei o consol log que foi importante deixa eu fechar tudo isso aqui fo através do consol log que a gente teve o acesso à informação do erro mas eu não Estorei o erro para cima né quee não deveria ter retornado 20 mas olha só agora se eu for aqui eu tenho a minha Wallet asset Na verdade até tenho Será que eu cliquei duas vezes e aqui eu tenho ali então pera aí que eu fiz alguma coisa errada porque ele tá
ele criou duas vezes o o registro ah na verdade aqui quando eu coloco session eu tenho que colocar isso aqui so aray então aqui é fácil né Faz um drop Database nest F save faz ali o refresh bonitinho fecha tudo vou criar o ativo criar o Wallet e adicionar o asset então agora confirmar aqui ele só pode ter ó agora sim então tenho Wallet o asset e agora aqui eu tenho assets né então a minha operação agora converte para duas transações aí na hora de consultar então ao Wallet eu posso carregar os ativos então por
exemplo aqui no find One eu poderia colocar o populate passando Wallet asset melhor passando assets tem que ser sempre o mesmo nome do relacionamento tem que ser esse asset aqui mas a questão que eu não quero carregar somente Wallet asset dentro de cada Wallet asset eu quero carregar também as informações do asset Tá então não fica somente dessa forma que nesse caso como eu quero carregar o relacionamento do relacionamento eu vou colocar Array mais um objeto primeiro Qual é o primeiro pef que eu quero carregar vai ser a né Aí eu coloco populate novamente e
aí coloco asset que eu tô carregando as informações do do asset do Wallet asset né aqui é o Wallet asset apesar de estar somente assets então ele já faz tudo de uma vez pra gente então considerando que a gente fez aqui a criação e ainda tá na memória o ID vamos fazer aqui a consulta Olha que legal isso aqui né então ele carregou o Wallet asset e dentro o asset ainda então eu posso carregar conforme eu quiser tem que tomar cuidado né Para que você não carregue muitos dados mas a gente já consegue então ter
acesso aos ativos da carteira não preciso nem criar um end Point novo Então olha que interessante isso outra parte que a gente vai acabar refinando mas não nessa aula vai ser o serviço aqui de orders né Na hora que eu tiver consultando a Order eu posso carregar o asset Posso carregar informação da Wallet também se eu quiser até que não não é necessário mas eu posso carregar o Wallet depois também vai ter o trade que é essa outra aqui mas a gente vai fazer no momento que a gente já conseguir brincar com esse trade Daria
até poder brincar mas no momento aí doica vai ser mais interessante né mas a gente vai acabar tendo aqui no order service o método de Create trade vou criar trade então uma ordem pode ter uma pode ter zero na verdade ou trades e na hora de fazer a consulta eu posso colocar o populate para poder pegar asset e trade para que eles possam ser carregados né então já avisando isso aqui eu vou deixar essa informação aqui depois é só colar ou melhor descomentar né ela já está aqui também criaria um presenter para ordem então conseguimos
concluir aqui a nossa primeira parte como que ficou legal para poder desenvolver tudo e também testar aqui com rest client né Fantástico então chegamos ao fim da nossa primeira parte do desenvolvimento dessa aplicação de home broker ainda a gente vai voltar no nest porque tem a parte de CFC tem websockets também quando nós tivermos desenvolvendo o front Change o front Change vai se comunicar com essa aplicação Então é só o começo do nest a gente já tá vendo como que o desenvolvimento tá ficando bacana como eu falei lá no início do vídeo pegue o código
fonte e pratique é o seu momento agora de aprender e evoluir na sua carreira então espero que você esteja gostando do evento continue acompanhando grande abraço para você tchau [Música]
ลิขสิทธิ์ © 2025 สร้างด้วยความรักในลอนดอนโดย YTScribe.com