se você quer aprender a criar o seu backend do zero e levar a sua aplicação pra produção Esse era o vídeo que você estava procurando no vídeo de hoje a gente vai construir uma aplicação do zero usando Spring boot Framework e no final a gente vai fazer o Deploy Desse nosso app lá na WS tanto do nosso servidor quanto do banco de dados para quem não me conhece eu sou Fernanda ker eu trabalho como engenheira de software no Itaú e já se prepara porque o vídeo de hoje tá cheio de conteúdo então sem mais enrolações
bora começar [Música] então pra gente desenvolver a nossa aplicação hoje eu trouxe aqui bem detalhado todos os requisitos que a gente vai precisar cumprir e as funcionalidades que a gente vai precisar desenvolver nessa nossa aplicação e também aqui uma modelagem dos dados e da nossa classe e também o desenho de solução que a gente vai usar né como base aqui como guia para criar a nossa aplicação Então vamos começar aqui entendendo os requisitos e assim que a gente entender tudo que a gente precisa desenvolver Hoje a gente vai colocar a mão na massa então o
objetivo né aqui da nossa aplicação é desenvolver um backend que vai gerenciar os eventos de tecnologia permitindo o cadastro listagem filtragem e detalhamento desses eventos bem como a associação de cupons de desconto então aqui a gente tá construindo o backend do eventos Tech que é um projeto open source que a gente tá construindo aqui de forma colaborativa na comunidade a gente já termin terou a construção do frontend do eventos Tech que a gente construiu aqui em algumas lives do canal e também a comunidade contribuiu bastante com PRS lá para adicionar as funcionalidades no eventos Tech
e agora a gente vai focar no desenvolvimento do backend dessa aplicação Então vamos começar aqui com o detalhamento dos requisitos o nosso sistema ele deve permitir que o usuário cadastre um evento com os seguintes Campos título descrição data local imagem e URL do evento e outro ponto importante aqui sobre os eventos é que eles podem ser classificados com como remotos ou presenciais então isso aqui a gente vai precisar levar em consideração na hora de modelar o nosso banco de dados e também na hora de modelar as nossas classes ali mas eu já pensei nisso e
eu vou mostrar para vocês depois lá o desenho Além disso o nosso sistema deve permitir que o usuário associe um ou mais cupons de desconto a um evento cada cupom vai possuir os seguintes Campos né o código do cupom o desconto né em percentual ou valor fixo e a data de validade então quanto tempo fica válido esse cupom porque dessa maneira lá no frontend Dev tec quando a pessoa tiver visualizando os detalhes daquele evento ela vai poder também visualizar cupons que foram cadastrados pela comunidade e se ela quiser comprar o ingresso ela pode ir lá
copiar esse cupom ir na página do evento e utilizar o cupom para cumprar o ingresso com um descontinho né Além disso o nosso sistema também deve listar os eventos cadastrados e também ter aqui um controle de paginação então voltando lá pro frontend do eventos Tech na página principal a gente vai ter listado ali os últimos eventos que foram cadastrados só que o se usuário quiser ele vai poder visualizar todos os eventos que tem na aplicação só que pra gente não trazer tudo isso na homepage né carregar todos os eventos de uma vez a gente vai
fazer isso através de paginação Então a gente vai carregar uma primeira página com sei lá 20 ou 50 eventos depois se o usuário quiser visualizar mais eventos ele vai clicando ali nos botões de página né vai passando pras próximas páginas e visualizando os outros eventos Além disso o nosso sistema também vai retornar eventos né somente eventos que ainda não aconteceram então que ainda estão aqui dentro da data né então a gente vai ter ali para cada evento a data daquele evento que dia ele vai acontecer e o nosso sistema vai ter que controlar ali para
ver se o evento já aconteceu ou não na hora de retornar esses eventos E além disso o nosso sistema deve permitir que o usuário filtre a lista de eventos pelos seguintes critérios título data e local isso aqui também já tá lá no nosso front end onde a gente criou um modelz inho pro usuário aplicar os filtros ali na lista de eventos e por fim o nosso sistema vai permitir que o usuário consulte todos os detalhes de um evento específico então ele vai poder né visualizar D tudo ali sobre aquele evento tudo que foi cadastrado que
no caso é o título a descrição a a URL original desse evento né para ele ir lá na página do evento comprar o igresso ou saber mais todos os cupons que foram cadastrados para aquele evento a imagem ali o banner do evento né E também o local onde o evento vai acontecer e se ele é remoto ou se ele é presencial Então esse aqui são os requisitos do nosso backend é um backend relativamente simples mas a gente vai fazer uma construção bem legal aqui tá seguindo vários princípios de arquitetura eu fiz uma modelagem de dados
bem bacana também normalize ali as tabelas e agora vamos lá para desenho de solução para eu explicar para vocês como é que vai funcionar E aí depois a gente vai colocar a mão na massa então agora vamos abrir aqui o draw y e entender como vai ser a modelagem desses nossos dados e qual que vai ser a arquitetura aqui né a infra que a gente vai precisar criar lá na WS então Começando aqui com a modelagem das classes e das tabelas tá a gente vai ter três tabelas a gente vai ter uma tabela de eventos
uma tabela de cupom e uma tabela de endereços tá na tabela de eventos a gente vai salvar as informações do evento Então o título a descrição a data do evento se ele é remoto ou não então isso aqui vai ser um boleano a URL da imagem do Banner desse evento e a URL original do evento né do site do evento E aí na tabela cupom a gente vai ter um campo que vai ser o desconto né que esse cupom dá então ali a porcentagem que ele dá o código do cupom então por exemplo eu sempre
H falo dos cupões aqui que a gente tem na comunidade né e normalmente o meu código de cupom é equ perd mas pode ser que outra pessoa tenha o seu cupom como desconto 10 20 sei lá então isso aqui vai ser o código de cupom que a gente usa lá no momento de aplicar no checkout tá e aqui a validade desse cupom Por quanto tempo ele vai ficar válido pra gente não precisar ficar mostrando lá cupons que não estão mais válidos também na página de detalhes do evento E aí um ponto muito importante aqui na
tabela de cupom é que a gente vai ter uma chave estrangeira que vai relacionar o cupom à tabela de eventos então vocês estão vendo aqui que eu coloquei esse FK esse FK diz respeito a foreign Key que significa chave estrangeira Então essa coluna aqui da tabela de cupons tá relacionando diretamente com uma entrada lá da tabela de eventos Então esse evento S diz respeito a uma entrada lá da tabela de eventos e aí a gente tem uma relação aqui entre essas duas tabelas né entre a tabela de evento e cupom porque concordam comigo que a
gente não tem como ter cupom se não tiver um evento né Eu não tenho como ter um cupom se eu não tenho um evento Então o cupom tá sempre atrelado a algum evento Então aqui a gente tem uma relação entre cupom e evento de um e somente um então um cupom pertence a um e somente um evento só que um evento ele pode ter zero ou mais cupons cadastrados certo então aqui eu tenho uma relação entre evento e cupom de zero ou mais né zero ou many então aqui a gente já consegue ver a relação
S entre as nossas duas entidades tá bem e agora continuando pra tabela de address a gente tem uma relação também com a tabela de evento Então na tabela de address a gente vai salvar por enquanto a UEF né ali do estado e a cidade mas depois se a gente quiser expandir e colocar mais detalhes sobre o local do evento Como por exemplo o CP o nome da rua etc a gente consegue expandir aqui essa tabela e essa tabela address Ela também tem uma chave estrangeira né que relaciona pra tabela de eventos Isso aqui vai dizer
que esse address per pertence a algum evento né E qual evento ele pertence e aqui a gente também tem uma relação de um e somente um o endereço não vai existir se não tiver um evento Tá bem então aqui a gente tem uma relação de endereço para evento de um e somente um um endereço pertence a um e somente um evento e aqui a relação entre evento e e endereço na verdade é de zero ou um tá aqui eu coloquei de um somente um mas aqui é na verdade zero ou um vou até trocar aqui
ao vivo pra gente não se confundir Opa troquei no lugar errado deixa eu mudar aqui aqui é um e somente um naquele lado e Aqui é zero ou um cadê Aqui zero ou um por que zero ou um porque concordam comigos que se o evento for remoto aqui ó se ele for um remoto como true né se esse boleano tiver como true ele não vai ter um endereço certo então aqui não necessariamente um evento vai ter sempre uma entrada de address lá na tabela address tá o evento pode existir e não ter nenhum address cadastrado
para ele lá na tabela de address porque quando ele for remoto não tem endereço nenhum né é online Tá bem então aqui a gente tem a relação entre as tabelas e essa aqui é a modelagem né do nosso banco de dados vai ser um banco de dados relacional né Por que que vai ser relacional porque a gente consegue dividir bem aqui os nossos dados em tabelas né E a gente tem relação aqui entre as nossas entidades Então a gente tem entidades relacionadas aqui então a gente vai seguir um banco de dados relacional tá um banco
de dados SQL feito isso entendido aqui A modelagem dos nossos dados a gente pode partir pra modelagem das nossas classes que nada mais é do que a tradução aqui das nossas tabelas para classes Então a gente vai ter três classes diferentes né três classes de entidade que vai ser event cupom e address e aqui tem cada um dos Campos dessas entidades e aqui o tipo desses Campos e agora que a gente entendeu A modelagem dos nossos dados vamos partir aqui pra parte do desenho de solução o desenho da nossa infraestrutura como é que vai funcionar
e tudo que a gente vai construir no vídeo de hoje Então a nossa infraestrutura vai morar lá dentro da WS tá então vai ser o provedor de nuvem que a gente vai utilizar e olha só como é que vai funcionar o nosso servidor Java ele vai rodar numa máquina E2 tá numa Instância do E2 essa nossa Estância do ec2 vai fazer vai fazer queries de leitura né e de escrita num banco de dados SQL que banco de dados a gente vai usar a gente vai usar o Amazon Aurora que é um banco de dados lá
próprio da aws e na frente desse nosso ec2 a gente vai ter um internet Gateway que é o que vai expor essa nossa aplicação pra internet para que os nossos clientes aqui consigam fazer chamadas para essa nossa aplicação E além disso aqui o nosso ec2 o nosso servidor Java vai fazer o upload das imagens dos eventos num Bucket do S3 e assim que ele fizer o upload ele vai pegar o RL correspondente E no momento de salvar o evento lá na tabela no Amazon Aurora ele também já vai salvar a URL né da imagem que
foi salva lá no Bucket porque se a gente voltar aqui pra nossa modelagem pro esquema aqui do nosso evento a gente vai ver que ele tem esse Campo image URL então a gente não vai salvar a nossa imagem diretamente lá no nosso banco de dados SQL tá isso não é uma prática legal e não é muito eficiente O que que a gente vai fazer a gente vai salvar nossa imagem no S3 a gente vai salvar nossa imagem lá no S3 vamos fazer o upload dela lá vamos pegar o URL correspondente e salvar só essa URL
no nosso banco de dados aqui SQL no momento que o nosso cliente aqui que o nosso frontend fizer uma consulta pelos dados de um evento a gente só retorna ao URL a gente retorna O registro que tá lá no nosso banco de dados SQL E aí o nosso frontend na hora de renderizar aquela imagem na tela ele vai usar aquela URL né que vai automaticamente linkar lá pra imagem que tá salva no nosso S3 beleza então é essa forma aqui que vai funcionar a nossa infraestrutura e aqui a gente vai ter uma vpc um virtual
Private Cloud né que é onde vai est aqui os nossos componentes os componentes da nossa aplicação que é o nosso ec2 e o nosso Aurora e o internet Gateway o internet Gateway vai ser o que vai expor essa nossa vpc aqui pra internet para receber chama adas de fora e aqui dentro do nosso vpc a gente vai ter uma subnet privada Ou seja que só pode ser acessada aqui pelos componentes que tiverem dentro dessa vpc que no caso o nosso ec2 né onde a gente vai colocar o nosso banco de dados dessa forma o nosso
banco de dados não está exposto para a internet e mesmo que alguém tenha a senha dele e o usuário não vai conseguir logar porque só consegue logar se tiver na mesma subnet né na mesma rede dele aqui então essa vai ser a forma que vai funcionar a nossa infraestrutura e agora né deu de falar deu de entender aqui bora colocar a mão na massa porque a gente tem muita coisa para construir a primeira coisa que a gente vai fazer é construir o nosso projeto aqui no spring initializer né inicializar o nosso projeto Spring com as
dependências que a gente vai utilizar Então quais dependências a gente vai utilizar a gente vai utilizar o Spring web a gente vai utilizar também o postgis driver por quê Porque o nosso banco de dados Aurora a gente vai usar um Aurora com postgis tá bem lá na WS a gente vai precisar também do JPA para fazer aqui as nossas entidades e ORM etc vamos usar também o l boock aqui pras anotações e geração de código boiler Plate e aqui o Spring boot Dev Tools que a gente pode usar aqui pra Live reloading application Restart debug
etc tá então Essas dependências aqui que a gente vai precisar por enquanto depois se a gente precisar de outra a gente adiciona lá no nosso pon XML aqui já coloquei o Né o nome do Group o artifact aqui o grupo eu coloquei como com. event stch que é o nosso domínio aqui o arfec eu coloquei como api né para ficar aqui com o package name de com. eventos tech.salvador.ba.gov.br vermelhinha né indicando que deu algum problema não tem nada aqui eu posso abrir aqui também a abinha do maven e dar um Reload só para ter certeza
e abrir aqui a lista de dependências para verificar se estão todas aqui olhando aqui rapidamente eu vejo que tá tudo aqui então beleza o nosso projeto Já tá pronto aqui pra gente começar a programar que que a gente vai fazer primeiro aqui dentro do nosso projeto bom vamos criar as nossas entidades Tá então vamos criar aqui as classes que vai representar as nossas tabelas de evento cupom e endereço então aqui dentro de S Main Java e com né eventos teec P api a gente vai criar um novo package então New package que eu vou chamar
de domain que é o domínio da nossa aplicação e aqui dentro de domen eu vou criar um novo package que eu vou chamar de event e aqui dentro a gente vai criar a nossa primeira classe que vai ser a classe que vai representar o nosso evento né a nossa entidade evento essa classe aqui vai ter anotação @table porque ela representa uma tabela no nosso banco de dados que a gente ainda não criou ainda não conectamos com o banco de dados mas enfim Vai representar uma tabela e aqui a gente vai mapear o nome dessa tabela
Então vamos colocar name como event e aqui a gente tem que colocar a anotação também @ entity né porque essa anotação @table basicamente só mapeia pro nome da tabela mas eu preciso dizer que é uma entidade né que isso aqui representa uma entidade O que que é uma entidade é um é representando as entradas da minha tabela como objetos né então eu coloquei aqui o ent e dessa forma já está mapeado e agora vamos colocar aqui o mapeamento dos Campos né dessa nossa entidade o primeiro campo que a gente vai colocar aqui é um campo
privado do tipo uu ID o nome dele é ID aqui e a gente vai colocar anotação nele de @id e @generated value @generated value aqui para dizer que é um valor gerado pela própria tabela tá um valor gerado automático a cada Nova entrada que for registrada lá na nossa tabela depois a gente vai ter um outro Campo aqui privado que é o título desse evento Então um title e a gente vai ter também a description que também é um campo privado Então vou só copiar aqui e colar Então a gente tem aqui a description a
gente tem também aqui no nosso evento o nosso image URL o nosso event URL né que é o RL do evento a gente tem um outro Campo privado que é um boleano que é o que indica se esse evento é remoto ou não e por fim aqui um campo privado que vai ser do tipo date e aqui é a data do evento né a data que esse evento vai acontecer e agora vamos colocar aqui mais algumas notações usando aqui o lombok para gerar automaticamente os getters e os setters dessa nossa classe Então a gente vai
colocar aqui @setter @getter dessa forma ele já vai gerar os getters e os setters para cada um desses Campos e aqui um no args constructor e um All ARS constructor para eu ter um Construtor para essa classe que vai ser gerado aqui pelo lombok que receba todos os argumentos e que não receba nenhum argumento tá para eu conseguir criar instâncias aqui dessa classe feito isso a gente já pode partir agora pra nossa tabela de cupons então aqui dentro de domain a gente vai criar New package que vai ficar dentro de domain então não dentro de
evento e o nome vai ser coupon e aqui dentro de cupon eu vou criar uma nova Java Class vai ser minha classe de cupom essa classe aqui também tem o @entity @table eu tô mapeando aqui pro mesmo nome que é o nome da classe mas depois se a gente quiser dar um nome diferente para essa tabela por exemplo eventos cupom né Esse vai ser o nome da tabela e o nome da classe é só cupom ele consegue fazer o mapeamento é por isso que a gente usa esse @table aqui no caso aqui no momento eu
tô usando o mesmo nome pra classe e pra tabela então ele conseguiria mapear automático mas depois quando a gente for fazer ali o esquema do nosso banco de dados se a gente quiser mudar o nome da tabela a gente pode mudar aqui e só trocar o name aqui mapeado no @table já vamos colocar aqui os getters e os setters então @getter @setter @allargsconstructor e @ noar constructor aqui para L lbox gerar automaticamente para nós e agora vamos mapear aqui os campos dessa nossa tabela Então a gente vai ter um campo aqui privado que vai ser
um uid que é o ID desse cupom aqui eu vou colocar @id e @generated value vou ter outro Campo que é um integer que é o discount e outro Campo que é um date que é a validade né até quando esse cupom está válido E aí por fim a gente vai ter uma coisa aqui interessante que vai ser o mapeamento desse cupom para um evento porque lembra que lá na nossa modelagem dos dados a gente mapeou aqui né que na tabela cupom eu vou ter uma foreign Key então uma chave estrangeira né pra tabela de
eventos que indica a qual evento esse cupom pertence então aqui na hora de mapear a nossa entidade a gente vai precisar prever isso também então o que que a gente vai colocar aqui a gente vai colocar um campo que é do tipo evento que vai ser aqui o nosso event e agora aqui a gente vai colocar a relação do tipo many to one ou seja um evento pode ter vários cupons e um cupom só pode pertencer a um evento e a gente vai fazer aqui um join colum Então vamos juntar na tabela event né com
o campo aqui o name event ID Então o meu cupom ele vai ter esse campo event id e quando eu for fazer o join na tabela de eventos Eu vou fazer o join por esse campo aqui que é aqui a minha a chave estrangeira e é a chave primária lá da tabela de eventos chave primária é a coluna né que identifica unicamente cada registro dessa tabela dessa forma a gente faz o join aqui na coluna e mapeia né esse evento ID para um evento E aí salva o evento aqui dentro do nosso cupom pronto feito
isso a gente vai partir agora pra criação aqui da nossa entidade de address né de endereço então aqui dentro de domain vou criar mais um package que vai ser do nome address e aqui eu vou criar uma New Java Class que vai ter o nome address e aqui a gente vai fazer as mesmas coisas né que a gente já tá crack aqui em fazer que é anotação @table o nome continua sendo o mesmo nome da classe mas depois a gente pode mudar aqui @entity aqui eu vou ter um @id @generated value Private uid ID tem
que Portal tipo o ID do Java útil vou ter também um Private string que é a cidade Private string que é o f estado e aqui na nossa tabela de endereço a gente vai ter também o mapeamento né paraa relação entre endereço e evento que aqui eu também vou colocar many to one e aqui a gente vai colocar um Joy colum passando o name aqui como event id e aqui eu vou ter um campo privado que é do tipo evento que vai ser o meu evento Beleza agora a gente já terminou a construção aqui de
todas as nossas entidades a gente pode inicializar aqui o nosso repositório Git né então vou abrir aqui o terminal vou dar um Git init eu vou dar aqui um Git add na verdade antes de dar um Git add deixa eu ver aqui tudo que a gente tem PR de arquivos para comitar eu vou adicionar todos menos aqui os arquivos das nossas essas entidades que a gente acabou de criar vou fazer um primeiro commit aqui como Fit first commit e vou fazer um segundo commit que é aqui Fit creating entities pronto e agora a gente já
pode partir pra criação dos nossos repositórios né que vão ser as classes que vão permitir que a gente faça as leituras e as escritas no nosso banco de dados e fazer interação também com as entradas através aqui de objetos então aqui ao lado do nosso package domain a gente vai criar um novo package então New package e o nome vai ser repost reposes aqui dentro eu vou criar o meu event reposter que no caso vai ser uma interface que vai estender aqui a interface então extends JPA reposter e aqui passando né o tipo da entidade
e o tipo da chave primária A Entidade é a minha classe aqui event e a chave primária é do tipo uu ID a gente vai fazer a mesma coisa aqui pras outras três entidades né então vou criar aqui o meu cupom repository addd que é uma entidade também então Public interface Opa uma interface que aqui tem estende né o JP reposter e tem os tipos de cupom cupom e o uid beleza e por fim aqui nosso último repos que é uma interface que é o meu address reposit add aqui uma interface pública que estende a
nossa interface JP repost e tem o tipo address e o ID perfeito deixa eu fechar aqui os arquivos vamos comitar isso aqui também então commit Fit ADT repositories [Música] Pronto agora a gente pode partir aqui pra configuração do nosso banco de dados aqui na nossa aplicação e depois a gente constrói os nossos Services né que vai ter as lógicas de daqui da nossa aplicação as regras de negócio e depois os controllers mas primeiro vamos fazer a configuração aqui do banco de dados para configurar o banco de dados aqui no nosso projeto a primeira coisa que
a gente vai fazer é aqui dentro da pasta resources e application properties a gente vai colocar as configurações para acessar o nosso banco de dados Então vou colar elas aqui mas eu vou explicar rapidamente para vocês basicamente a gente vai ter que mapear a URL do host aonde está rodando o nosso banco de dados o username usado para logar e a password nesse caso a gente vai primeiro começar com o banco de dados local tá vamos rodar o post degrees local vamos ver se as migrations vão ser executadas com sucesso né pra criação das nossas
tabelas e depois Estando tudo certo a gente vai lá pra Amazon lé lá na WS cria o nosso banco de dados usando o serviço srds usando um banco de dados posts E aí depois faz a conexão aqui no nosso projeto mas por enquanto vamos começar aqui com o banco rodando local só pra gente fazer os testes Beleza então aqui a gente coloca o RL padrão do postgress e aqui né na porta 5432 que é a porta padrão do post e aqui no Barra a gente tem que colocar o nome do banco de dados que a
gente vai estar acessando qual vai ser o nome aqui bom vou criar um banco de dados agora né vou chamar aqui de eventos stack vai ser o nome do nosso banco de dados o username é Fernanda Keeper e a password é password que é a password padrão aqui quando a gente tem o banco de dados rodando local tá bem feit essas configurações aqui Teoricamente o JPA já vai conseguir se conectar com o nosso postgress que estiver executando local aqui na nossa máquina e aí a gente já pode partir pra criação dos nossos scripts né do
SQL pra criação aqui das nossas tabelas e nesse caso a gente vai usar o flyway né para fazer a criação das nossas migrations que são os arquivos que mantém o histórico do esquema do nosso banco de dados então aqui dentro do pum XML a gente vai adicionar mais uma dependência que é a dependência do flyway Então logo aqui embaixo do Spring boot Start the test eu vou colar mais uma dependência pronto com o flyway adicionado é legal a gente dar um Reload aqui no maven né para ele detectar as mudanças e buscar a nova dependência
a nova biblioteca feito isso se tiver algum erro ele vai deixar vermelhinho senão vai ficar aqui tudo né na cor normal do do intelij que indica que tá tudo certo mas eu vou entrar aqui em dependence só para verificar ó se a gente entrar aqui a gente já vê que na lista de dependências a gente já tem aqui o flyway né na versão 10.10 Então beleza foi instalado com sucesso agora aqui dentro de resources a gente vai criar uma nova pasta tá que vai ser a pasta que vai conter os nossos scripts SQL que são
as nossas migrations então aqui dentro a gente vai criar um novo diretório que vai ser DB e dentro de DB a gente vai criar um novo diretório que é migr migration e aqui dentro a gente vai colocar os arquivos SQL então eu vou criar um novo arquivo que vai a V1 do meu banco e aqui eu vou colocar né underline underline e aí o nome dessa migration que no caso é Create event table.sql tô criando a tabela de eventos tá é a minha primeira migration a primeira versão aqui do meu banco de dados aqui dentro
o que que eu vou fazer eu vou colocar o comando de criar a tabela Então vamos colocar Create table o nome da nossa tabela vai ser event E aí dentro aqui dos parênteses a gente vai descrever cada um dos Campos o nosso primeiro é o ID que é do tipo uu id e aqui pra geração dele a gente vai usar essa função get Random uu ID que é uma função de uma extensão aqui do post que depois a gente vai instalar aqui no nosso banco de dados para que a gente consiga chamar essa função aqui
de geração de uid E aí eu preciso colocar que essa é uma chave primária né a chave que identifica unicamente as entradas dessa tabela depois a gente vai ter o nosso title que é um varchar aqui que eu vou deixar de no máximo sei lá 100 caracteres e aqui eu vou colocar ele como not nul então não pode ser nulo o título de um evento a mesma coisa a gente vai ter pra description então a gente pode aqui copiar e colar né aqui description e a description a gente pode deixar um pouco mais longa por
exemplo 250 caracteres depois a gente vai ter também a nossa image URL né a URL da nossa imagem que eu vou deixar como sem caracteres a gente vai ter a URL do site então event url que é o RL do evento vamos ter também a data desse evento que vai ser do tipo time stamp né E todos esses campos aqui não podem ser nulos E aí por fim a gente vai ter o Remote que é um boleano então bolean e também not n não pode ser nulo então nenhum desses Campos aqui da nossa tabela Create
event pode ser nulo e agora aqui só para finalizar a gente vai colocar aqui a o Import né Desse dessa extensão aqui do banco de dados para fazer a geração dos uuids de forma automática Então vamos colocar aqui Create extension extension if not exists e o nome da extensão aqui é PG cripto e aqui a gente coloca o ponto e vírgula no final beleza dessa maneira aqui já deve funcionar para criação da nossa tabela de eventos mas pra gente ter certeza que tá funcionando a gente vai testar né então eu vou abrir aqui o post
Chico na minha máquina o post Chico aqui é um sistema gerenciador de banco de dados que eu consigo me conectar com o meu banco de dados tá consigo visualizar as tabelas que tem no meu banco enfim e eu quero acessar Aqui o banco de dados por exemplo o eventos Tec né usando aqui o meu local host e o meu user normal vou testar não deu certo porque o banco de dados eventos Tech não existe então eu vou me conectar o meu banco de dados Fernanda Kiper aqui e aí dentro desse meu local vou criar mais
um banco de dados então New Database que eu vou chamar de eventos Tech Agora sim vou desconectar dele vou rodar aqui a conexão de novo só que pro meu banco de dados eventos Tech Connect Beleza não tem nenhuma tabela aqui dentro né porque ele recé foi criado tá zerado mas a gente já pode usar ele aqui eu fiz toda a criação pela interface mas vocês podem fazer pelo terminal também usando os comandos do postgis e eu vou deixar aqui na descrição do vídeo um linkzinho explicando todos os comandos do postes no terminal mas não vem
o caso porque não é o objetivo aqui do vídeo mas basicamente a gente só precisa ter a tabela criada aqui na nossa máquina né a tabela eventos Tech estou com ela criada então eu já posso aqui executar meu projeto E aí assim que eu executar meu projeto o flyway já vai começar a execução e a gente já vai perceber ali se vai dar certo ou se vai dar errado e se der algum erro a gente vai conseguir identificar no caso ele já deu algum erro vamos ver aqui o que que aconteceu deu um erro no
post vou tentar executar de novo só para ter certeza continua com erro vamos ver aqui error creating be name entity Manager Factory defined in Class fail error creating be tá ele teve um problema aqui criando o banco de D unsupported Database posts 141 então pode ser algo aqui na versão do flyway Deixa eu só dar uma olhadinha isso aqui indica alguma incompatibilidade de versão entre o flyway e a versão do post que eu tô aqui local então eu vou abrir aqui meu P XML e vou trocar a versão do Flyer para uma versão mais antiga
para que ele tenha suporte a minha versão mais antiga aqui do post também então aqui ao lado né do flyway Cadê ele aqui eu vou colocar a versão vou colocar a versão n 8.1 porque eu tô rodando aqui com a versão do postgis 14.11 tá pode ser que para vocês aí se vocês tiverem com uma versão mais atualizada não de não deu problema mas eu vou testar aqui para ver se resolve meu problema vamos executar Agora sim ó ele não deu nenhum erro agora ele deu um erro mesmo aqui na execução da migration mas não
tem não teve nenhum problema ao se conectar com o banco de dados já é um avanço vamos ver aqui error syntaxe at near G Random Eid então ele teve um problema aqui com a fun são get Random u ID Ah e aqui tá errado porque é J Random uu id não get Random uu ID então eu digitei errado o nome da função mesmo aqui tem que ser gen Random ID né que é generate Random ID pronto vamos ver aqui continua com erro ele continua com erro aqui na geração do id Ah pode ser porque eu
esqueci aqui a palavra default né porque é um valor default Então antes do J Random o ID eu tenho que passar aqui o default né para ele entender que ele tem que usar essa função aqui para gerar o valor default desse campo e não vou ser eu que vou passar esse valor na hora da inserção vamos ver aqui espero que funcione Pronto agora sim rodou com sucesso pelo jeito deu sucesso na execução da migration então ele deve ter criado lá a tabela no nosso banco de dados então vou abrir aqui o potico vou dar um
Reload para ver se tem alguma tabela aqui pronto a gente já consegue visualizar que tem a tabela event tá E ela tá aqui com a coluna ID title description image URL evento URL date e Remote Então tá tudo certo conseguimos criar aqui a nossa tabela de eventos agora vamos fazer a mesma coisa né pras outras tabelas a tabela de cupom e a tabela de endereços Então deixa eu fechar todas as abas aqui parar a execução do nosso programa porque senão o Flyer a vai ficar identificando que a gente tá escrevendo script H script SQL vai
tentar Executar a gente só quer que ele Execute depois que eu finalize Então vou criar aqui um novo arquivo vai ser a minha V2 que vai ser Create table cupon psql aqui a gente vai colocar o comando Create table a tabela cupom e aqui a gente vai colocar né os campos da nossa tabela que Campos vão ser esses a gente vai ter o nosso ID aqui também que é do tipo ID E aí a geração de tem que ser feita com o gen Random o o ID colocar né identificar como primary key depois eu vou
ter o código desse cupom que é um varchar de no máximo 50 caracteres ou 100 aqui un Unic né único e não pode ser nul not nul na verdade aqui ele não precisa ser único porque eu vou est identificando para cada evento Então deixa eu deixar só como not New vou colocar o discount que é um integer not o valid é um time stamp not O Event ID que é do tipo u id e aqui a gente vai registrar a nossa chave estrangeira a gente vai fazer fore Key event ID Então essa é uma esta
referência Então refere-se à tabela event ao campo ID E caso esse evento seja deletado então on delete eu quero fazer o método aqui cascada né então Cascata então caso ele delete o evento caso esse evento seja deletado eu quero que delete esse cupom também porque não precisa existir esse cupom se o evento não existe mais na minha tabela pronto é isso vamos tentar executar aqui a nossa aplicação de novo para ver se D tudo certo com a criação dessa tabela parece que sim vamos entrar aqui no postico Vamos dar um Reload não temos mais nenhuma
tabela então event dar um Execute aqui parece que ele não identificou aqui nosso V2 Create table cupom SQL Vamos tentar executar de novo eu vou trocar aqui o nome para V2 maiúsculo para manter o padrão rename B 2 Create table cupom psql effector pronto vamos parar a execução Clear All vamos executar de novo vamos ver aqui se o flyway vai identificar esse nosso novo arquivo aqui de migration Create table cpon beleza aplicado vamos voltar lá vamos dar um Reload Agora sim tabela cupom e a tabela e aqui tá a criação das Duas né o flyway
salva aqui nessa tabela flyway schema History para saber quais migrations ele já executou Então já executou as duas agora vamos partir aqui pra nossa última migration né que a gente vai fazer antes de começar aqui a lógica da nossa aplicação então Create table address psql add e aqui nós vamos colocar o comando também Create table address aqui a gente já tá craque então nós teremos o campo u ID aqui do nosso endereço teremos o campo aqui cidade que é um varchar no máximo sem caracteres e não pode ser nul teremos o nosso uf né antes
estava como state Mas vamos colocar como uf no máximo 100 not n e teremos aqui o nosso event ID é do tipo uu id e aqui a gente faz o cadastro da foreign Key da mesma forma que a gente fez lá na tabela de cupom então caso eu não tenha mais evento eu não tenho mais o endereço desse evento salvo também então vou fazer a deleção formato Cascata beleza feito isso podemos parar a execução da nossa aplicação executar ela de novo e ver se ele vai fazer a criação aqui da nossa última tabela lá no
banco de dados ó ele já colocou aqui no terminal ó migrating schema Public to version 3 Create table address então ele entendeu aqui que foi pra versão 3 do nosso banco damos o Reload e a tabela address aqui está criado Então tudo certo com nossos scripts SQL tudo certo com a configuração aqui no banco de dados né com a conexão com banco de dados e Teoricamente está tudo certo aqui com as nossas entidades ainda não testamos elas mas logo já vamos testar Vamos partir agora pra criação dos nossos controllers e dos Services para depois a
gente fazer a configuração né da nossa aplicação lá na WS mandar tudo para lá e deixar tudo rodando bonitinho mas primeiro vamos finalizar aqui a nossa aplicação então voltando aqui no notion onde a gente separou né todas as etapas detalhamento aqui do nosso projeto a primeira funcionalidade que a gente precisa fazer é permitir que o usuário cadastre um evento né com os seguintes Campos que é o título a descrição a data o local a imagem e a RL do evento Então vamos começar pelo começo né Vamos criar primeiro aqui o dto onde a gente vai
receber essa informação via request então com esse dto a gente cria o nosso service que vai processar essas informações fazer o upload da imagem lá no Bucket do S3 pegar o RL e salvar tudo isso no banco de dados para então retornar pro usuário né que deu sucesso ali na criação então aqui é o lado de domain na verdade aqui dentro de domain mesmo eu vou ir dentro de eventos Eu vou criar um novo New Java Class que vai ser um Record que vai ser o meu evento request de add e aqui esse meu Record
ele vai ter os seguintes Campos ele vai ter uma string que vai ser o título ele vai ter uma outra string que vai ser a descrição então a description ele vai ter um date que vai ser a data aqui eu tenho que importar o date do Java útil eu vou ter uma string que é a minha cidade uma string que é o meu estado eu vou ter aqui um ano que é o Remote eu vou ter uma string que é O Event URL e eu vou ter o Multi part file que vai ser a minha
imagem e aí a gente vai transformar essa imagem aqui no arquivo depois pra gente subir lá no S3 salvar e recuperar essa URL para então inserir no nosso banco de dados Então esse aqui é o nosso Tito O Event request Tito Acredito que esteja todos os campos aqui necessários agora o que que a gente vai fazer a gente vai criar aqui ao lado de domain um New package que vai ter os nossos serviços então um package de service e aqui dentro de service eu vou criar uma New Java Class que vai ser o meu event
service add aqui nessa Classe A gente vai ter que colocar anotação @service do Spring para ele identificar que é um componente de service deixa eu Minimizar Aqui as nossas pastas e vamos começar nós vamos criar aqui um método público que vai retornar um event que o nome vai ser Create event esse método vai receber por parâmetro um event request que é o nosso data e aí a gente vai fazer a construção do nosso objeto event aqui primeira coisa que a gente precisa é a nossa image URL Então vai começar como nula essa string aqui a
nossa image URL e a gente vai fazer uma verificação se o nosso daa ponto image for diferente de nul então se eu tiver uma imagem no corpo dessa requisição eu vou chamar o meu método dis P upload image passando oa image esse Meu método upload image ainda não existe a gente vai criar ele vai ser um método privado que vai retornar uma string e o nome dele vai ser upload image ele vai receber por parâmetro um Mult file que é o arquivo né o multipart file aqui e aí por enquanto ele vai retornar uma string
vazia só para ele não D erro aqui beleza então vou chamar o dis upload image e eu vou salvar o retorno desse dislo image no nosso image URL Então dessa forma eu recupero a URL dessa imagem e agora o que que eu vou fazer eu vou criar um objeto do tipo event então aqui o meu new event eu vou fazer new event né chamando aqui nossa entidade e agora vou setar aqui os atributos Então me new event title set title vai receber o meu deira tit o meu New events description vai receber umira description aqui
é tit me New EV evl vai receber o meu daa P event eurl o meu new event P datate vai receber aqui aqui no meu date eu vou ter que transformar minha data num time stamp então vou fazer New date do Java passando meu data ponto date e aqui na verdade meu data pon date eu tinha deixado lá como já um objeto date né Então deixa eu mudar provavelmente do front end a gente vai receber só um time stamp né gerado lá pelo JavaScript então aqui a invés de um objeto date quando eu receber isso
aqui isso aqui vai ser um long tá que vai ser um time stamp gerado lá pelo front E aí eu vou pegar esse time stamp gerado pelo front e vou transformar num objeto date para então consolidar isso no meu banco de dados e salvar lá no formato certo que a gente criou a nossa coluna E aí por fim a gente vai salvar aqui o nosso new event pon set image URL como sendo o nosso image url que a gente salvou aqui e fez o upload pronto acredito que sejam esses campos né description event URL date
title Beleza o resto né no caso o campo ID vai ser gerado pela nossa tabela lá automaticamente ele vai fazer a geração automática com o script lá que a gente colocou para gerar o o id e aqui o que eu vou fazer é return new event Então esse nosso método aqui de Create event é apenas isso mas agora a gente precisa fazer toda a lógica aqui de upload da nossa imagem né para salvar ela no Bucket do S3 Então vamos partir para essa parte agora então o que que a gente vai fazer aqui a gente
vai precisar instalar a SDK da WS pra gente conseguir conectar com o s13 fazer o upload da imagem por lá então a primeira coisa que a gente precisa fazer é adicionar aqui a biblioteca né no nosso P XML do SDK daws então aqui é embaixo do flyway eu vou colar a dependência que é essa daqui então é aws Java sdks S3 vou tirar a versão aqui não precisa necessariamente e vou fazer o Reload do maven para ele buscar a dependência e fazer a instalação dela ele deu um erro aqui na instalação Deixa eu voltar aqui
com a versão Talvez seja esse o problema vamos dar um Reload pronto conseguiu encontrar aqui a nossa dependência né na versão 1.12.32 perfeito e agora a gente consegue fazer a configuração aqui do amazon né config pra gente conseguir utilizar S DK aqui no nosso projeto então aqui ao lado da pasta service a gente a gente vai criar um novo package que vai ser o nosso package de configuration né e aqui a gente vai criar um New Java Class que vai ser o nosso aws config dentro da minha pasta aqui config essa minha classe é uma
classe de configuração então preciso colocar uma anotação especial nela que é anotação de @configuration e basicamente o que ela vai fazer é criar a Instância né do nosso objeto do amazon S3 com as nossas credenciais aqui tudo necessário para que eu consiga só usar esse objeto para fazer o upload lá no S3 Então como é que a gente vai fazer isso eu vou vir aqui e vou colocar como atributo dessa classe o Private string que é o meu aws region tá esse meu region eu vou pegar do meu application.on properties Então esse aqui vai ser
um @value que vai vir lá do meu application P properties que vai est em aws region tá lá no nosso application P properties Já podemos criar então aws region eu vou deixar como US East One que onde vai estar o nosso Bucket Vamos criar o Bucket nessa região aqui se você criar numa região diferente tem que mudar esse aws region tá aí agora a gente vai criar um método público que vai retornar um objeto do tipo Amazon S3 e aqui a gente tem que colocar anotação @b nele para que o Spring consiga identificar que esse
método aqui cria a Instância correta do objeto Amazon S3 e o nome desse método vai ser Create S3 instance e aqui basicamente a gente vai fazer um return Amazon S3 client builder pon Standard tá ponto with region passando aqui o nosso aws Opa aws region e aqui ponto build então o que que é esses comandos aqui que a gente passou a gente basicamente especificou a região com qual a gente quer usar então ele cria a estância Já baseado nessa região e eu coloquei aqui para usar o Standard né ponto Standard o que que isso significa
que ele vai usar as credenciais Standard que tiverem configuradas aqui nessa máquina no caso aqui eu já tenho as minhas credenciais configuradas na minha máquina então quando ele for rodar isso ele vai conseguir Identificar qual é o meu perfil do Iam que eu tô aqui configurado e vai usar esse perfil aqui para logar na WS tá para fazer autenticação quando essa nossa aplicação tiver rodando lá no E2 também a gente vai criar um perfil pro nosso sc2 e a gente vai dar permissão para essa nossa Estância para que ela se conecte no S3 e aí
ele vai conseguir fazer a conexão automática também justamente porque ele vai estar rodando lá dentro do ec2 tá então se vocês não tiverem aws configurado na máquina de vocês o perfil do iim configurado vocês vão ter que passar aqui o método tá que a gente chama onde a gente passa as credenciais aí vai ter que passar a Secret vai ter que passar o Api aqui enfim mas aqui no caso como eu já tenho configurado na minha máquina e como isso aqui vai rodar lá dentro D C2 também não precisa tá não preciso passar aqui as
credenciais Então feito isso a gente já pode ir lá pro nosso evento service e colocar aqui uma dependência né nessa nossa nessa nossa classe uma dependência privada que vai ser do tipo Amazon S3 que eu vou chamar de S3 client E aí nós vamos usar esse S3 Cent aqui para fazer o upload da nossa imagem então primeira coisa que a gente precisa fazer é declarar o nome com qual essa imagem vai ser salva lá então image name né aqui eu vou usar o ID do Java P Random o ID mais uma string com ifen mais
multipart file P get original file name Isso aqui vai gerar um nome único para esse nosso para essa nossa imagem aqui e o que que a gente vai fazer a gente vai colocar um try Cat né porque pode dar errado isso daqui então try Cat aqui fazer o cat de uma exceção genérica e agora dentro do nosso try a gente vai fazer a conversão Desse nosso arquivo para um de verdade então aqui file eu vou fazer convert multipart file passando meu multipart file vou criar esse método aqui um método privado que vai retornar um file
e o nome vai ser esse ele vai receber um multipart file ele vai fazer file e aqui con file eu vou fazer um New file passando file.get original e aqui file output stream como sendo New file output stream passando com file tem que importar isso aqui do java.io aí vou fazer file. write multipart file.get bytes e aqui file né ponto Close return com file aqui ele tá dando erro porque eu não tô tratando das exceções Então a gente vai adicionar as exceções aqui na assinatura do not in and excep n e aqui file get Origin
F então eu vou fazer uma verificação aqui [Música] if eu posso fazer objet requ beleza V trocar aqui para ele ter certeza que o objeto não é então converti o meu arquivo para um arquivo agora o que que eu vou fazer vou fazer S3 client P Object passando o meu file name aqui em vez de imag name eu vou dar nome de file name então passando meu file name e o meu file mas eu preciso passar também por parâmetro o nome do meu Bucket né o Bucket name esse Bucket name eu vou pegar lá do
application properties também então vamos copiar a mesma coisa que a gente fez aqui no aws config né vamos colar e ao invés de aws region vou chamar de Bucket name e aqui WS Bucket pname lá no application properties Vamos criar aws Bucket pname vou dar um nome para esse Bucket temporário que vai ser eventos Tech imagens e aqui vamos passar esse Bucket name que a gente recuperou lá beleza o file name e o file que a gente vai subir então eu vou deletar esse arquivo que eu criei aqui temporariamente para fazer o upload né porque
basicamente o que a gente fez aqui foi pegar o que eu recebi no request criar um arquivo local na minha máquina para eu conseguir fazer o upload lá na S3 eu já posso deletar ele depois de ter usado eu vou fazer um return aqui client P get Object URL na verdade get URL passando o meu Bucket name e o meu file name que foi o que eu acabei de fazer upload aqui um two string para pegar aqui a URL né que a gente acabou de criar no momento de fazer o upload desse arquivo esse delete
é ignorado beleza eu quer ignorar mesmo caso tenha algum problema eu vou fazer aqui um System PN erro ao subir arquivo beleza e aqui eu vou retornar um n né porque eu não consegui subir o arquivo um objeto Vou retornar aqui um um tá bem e agora aqui a gente já tá chamando o nosso upload image Teoricamente deve estar tudo funcionando vamos testar né Vamos testar Então deixa eu ver aqui o que de problema ah é aqui eu tenho que retornar no não string vazia ver isso aqui nunca vai chegar aqui porque eu já tenho
um return aqui dentro beleza agora sim vamos testar mas antes da gente testar a gente precisa ir lá na nossa WS criar o nosso Bucket deixar como um Bucket público que qualquer um pode vis visualizar as imagens que tem lá não é todo mundo que vai poder alterar não é todo mundo que vai poder Adicionar imagens lá mas quem tiver URL da da imagem vai poder visualizá-la né então vamos lá criar o nosso Bucket para que a gente consiga aqui criar um Controller pra gente testar tudo isso que a gente criou agora então agora aqui
dentro da nossa conta da WS a gente vai criar o nosso Bucket S3 que vai conter as imagens do nosso site e vamos fazer as configurações necessárias para que ele seja publicamente acessível pra visualização para que todo mundo consiga visualizar as imagens nesse caso pra gente conseguir usar essas imagens lá no frontend e também fazer as configurações necessárias para que o meu usuário aqui da minha máquina consiga fazer uploads nesse Bucket e depois posteriormente a nossa aplicação quando estiver rodando no sc2 então aqui dentro de S3 eu vou criar um novo Bucket então criar Bucket
e o nome desse Bucket vai ser eventos Tech imagens esse Bucket vai ter as acls desabilitadas Beleza eu vou tirar esse Mark aqui de de bloquear todo o acesso público porque eu não quero bloquear eu quero permitir o acesso público eu quero permitir que as outras pessoas Leiam as imagens que estão nesse Bucket nesse caso né os front Ends ã eu reconheço que as configurações atuais podem fazer que o Bucket e os objetos dentro deles tornem públicos versionamento eu vou desativar criptografia padrão vou deixar ativa configurações avançadas bloqueio de objeto vou deixar como está beleza
e aí nós vamos vir aqui e criar agora a gente vai acessar esse nosso Bucket Então cadê ele deixa eu ver eventos Tech imagens vou aqui nas permissões desse Bucket e a gente vai editar a política desse Bucket a gente tem que anexar nele uma política para permitir que todo mundo consiga fazer o acesso então não basta só desbloquear todo acesso público Eu também preciso anexar uma política no Bucket que é essa política aqui de Public read tá E aí aqui eu tenho que colocar né a o efeito que é permitir permitir todas as get
objects ou seja as leituras e aqui eu preciso colocar o nome do Bucket certinho o nome do Bucket é eventos Tech imagens pronto permitindo aqui a leitura de todos eu vou salvar as alterações perfeito agora eu vou vir aqui nos objetos eu vou carregar uma imagem aqui dentro e vamos testar se a imagem vai ficar publicamente acessível Então deixa eu testar aqui adicionar arquivo vou subir aqui essa imagem da anev Vamos acessar ela pegar aqui o link dela né URL do objeto acessando ela na internet ela está publicamente acessível então o nosso Bucket aqui está
funcionando com o propósito que a gente queria tá E agora por fim a gente vai fazer a construção aqui do nosso Controller para que a gente consiga fazer uma chamada de teste ver se tá tudo funcionando aqui na criação dos eventos Então dentro aqui de com P eventos né dentro do nosso projeto a gente vai criar uma pasta que é controllers Controller na verdade aqui dentro eu vou criar o meu event Controller add vou colocar nele anotação @ rest Controller e @ requestmapping mapeando aqui o endp de barpi barra event e aqui eu vou colocar
um novo método público que vai retornar um response enche com um evento dentro então event que vai ser o meu Create aqui eu vou receber por parâmetro um request Body do tipo aqui event request dto é o meu Body E aí o que que eu vou fazer aqui eu vou ter uma dependência privada que é o meu event Service eu vou chamar de event service Vou colocar aqui anotação @autowired e aqui basicamente que eu vou fazer é return response Ok passando o new event e aqui a gente vai declarar esse new event então Opa event
new event como sendo dis event service Create event passando o body beleza dessa forma já deveria funcionar Então vamos executar aqui a nossa aplicação na verdade ela já tá rodando vou parar ela e vou executar novamente perfeito agora eu vou abrir o insomnia pra gente mandar uma requisição aqui pra nossa aplicação e ver se vai dar algum erro se a gente precisa corrigir alguma coisa então já tô aqui no meu insônia tá eu criei uma requisição do tipo post PR local host port 8 barp bar event e preenchi aqui todas as informações do nosso B
que é o título description evento URL imagem data remoto cidade e uf notem aqui uma coisa eu não tô mandando um B em formato de Jason eu tô mandando um b no formato multipart tá Por quê Porque eu preciso mandar uma imagem aqui e para eu conseguir mandar uma imagem precisa ser nesse formato então provavelmente a gente vai ter que fazer algumas adaptações lá no recebimento dessa requisição pra gente conseguir transformar pro objeto Tá mas Mas vamos testar aqui e uma coisa que eu acabei de perceber é que aqui no nosso Controller então aqui no
evento Controller eu não coloquei aqui no método né o post mapping para mapear que isso aqui é uma requisição do tipo post então vamos parar aqui a execução vamos executar novamente e provavelmente a gente vai ter que fazer uma mudança aqui tá no nosso na nossa aplicação ali na hora de receber o request para fazer a transformação do multipart ali para objeto correto Mas vamos testar aqui só para ver o erro e é mais fácil até de procurar beleza ó unsupported media Type porque eu recebi aqui um body do tipo multipart form data Beleza já
era o esperado vamos ter que fazer a conversão aqui basicamente o que a gente precisa fazer é ao invés de receber um request Body sendo o nosso dto a gente vai ter que mapear cada uma das entradas Então a gente vai ter que mapear o título a description o Date a cidade o estado o Remote aqui como bullon O Event TOL e aqui a nossa imagem né todos como request parms tá E aí depois a gente vai ter que montar o nosso dito na mão porque o Spring não consegue fazer essa conversão tá quando a
gente recebe em formato de multipart form porque isso aqui vem tudo como request parm então a gente mapeia todos esses parms e monta aqui nosso dito e a gente precisa colocar aqui também que o nosso post map consome né do tipo multipart form data aqui para ele conseguir aceitar esse tipo de requisição feito isso né recebendo aqui cada um dos parâmetros de forma individual fazendo mapeamento deles a gente monta nosso dito e o resto aqui segue normal a gente passa o dito pro nosso noss service e cria o evento Então vamos voltar lá para insônia
vamos testar de novo então vou mandar aqui a requisição esperar aqui ele processar 200 Ok então praticamente deu tudo certo Por enquanto né parece mas ele nos retornou aqui algumas coisas como nul o primeiro ponto é o Remote que veio como nul o image URL e o ID Então a gente vai ter que fazer aqui algumas validações né para ver se tá tudo certo vamos ver se deu algum problema lá no nosso insomnia então lá no nosso intelij Então deixa eu abrir aqui o ter final erro ao subir o arquivo beleza vamos ver aqui que
Problema deu no momento de subir o arquivo aqui quero ver os logs de execução Deixa eu terminar e executar de novo pra gente ver o que que aconteceu então aqui api application Execute beleza vamos mandar de novo aqui a requisição mandamos Vamos abrir aqui o nosso intelij vamos ver aqui o erro que ele deu ele deu um erro no cliente da Amazon feio to Connect ent Point deu erro a se conectar na Amazon fail to connect to service provavelmente alguma coisa aqui de credencial é get credential response beleza e o outros erros deixa eu ver
aqui se ele colocou mais alguma coisa hosts Down beleza jaxb is unavailable tá ele tá com algum problema aqui na hora de conectar a WS isso a gente já resolve mas vamos ver aqui os outros Campos né o campo de remote e o campo do id Então vamos voltar lá pro nosso service aqui no evento service deixa eu dar dá uma olhada Ah o ID eu já sei a gente não salvou aqui no repositório o nosso evento Então se a gente abrir lá o post Chico a gente vai ver que não tem nenhum cadastro aqui
no banco de dados que a gente nem efetivou esse cadastro Então nem teve como gerar o ID então aqui eu vou colocar mais uma ã dependência autoart que vai ser privada que é o nosso event reposter aqui é o meu repost e aqui eu vou fazer né repository P save repository P save passando o meu new event E aí sim eu vou conseguir recuperar aqui o ID dele beleza esse era um dos problemas agora o meu remote é porque eu não setei aqui também então new event pon set remote passando me deira pon remote dessa
maneira eu já devo resolver os dois problemas lá de no então vamos parar aqui vamos executar de novo e aí se a gente conseguir resolver a gente já parte ali pro problema da WS Então vamos esperar que ele subir de novo subiu vamos enviar intern sever error no ving Call image URL violate not New constraint Então tá agora sim ele foi inserir no banco de dados e deu problema por quê Porque eu coloquei lá que no meu banco de dados aqui ó se a gente entrar aqui nos nosso migration que a coluna image URL não
pode ser nula e eu tô tentando fazer a inserção de uma que é nula por que que eu tô fazendo isso porque eu não tô conseguindo subir a imagem lá na WS então só para teste aqui ao invés de retornar um nul eu vou retornar uma string vazia para que a gente consiga fazer a inserção então ao invés de retornar nul Vou retornar uma uma string vazia vamos dar o Reload aqui de novo no nosso projeto E aí a string vazia A gente vai conseguir subir lá no banco de dados e provavelmente não vai dar
problema voltar aqui pro insomnia disparar a requisição Agora sim ó já temos o ID já temos o título description image URL como vazio porque a gente não conseguiu subir a data aqui no formato time stamp o evento do tipo remote false e aqui o evento URL Então tá funcionando Vamos abrir aqui o post Chico dar um Reload aqui beleza tá funcionando também então Só temos que resolver aqui esse problema da WS pra gente partir aqui pra nossa nova funcionalidade e eu já volto aqui falando para vocês qual que era o problema voltei e basicamente o
que a gente esqueceu foi só uma configuração aqui na classe da WS config então eu tenho que passar aqui o Standard E também o if credentials que eu tinha mencionado para vocês né então eu ten que passar aqui essa configuração né eu preciso definir Quais são as credenciais que eu vou usar E aí sim eu coloco que eu vou usar aqui o meu defa aws credentials provider Chain para ele pegar aqui as minhas creds default que estão configuradas no meu computador como é que eu sei as creds defs que estão configuradas no meu computador bom
essas configurações ficam dentro de uma pastinha aws dentro de um arquivo credentials tá na raiz do nosso usuário essa pastinha é criada no momento que a gente instala a Seal da WS no nosso PC Então se vocês vierem aqui no terminal e rodarem aws se vocês tiverem aai da WS instalada ele vai responder aqui né vocês colocarem aws menos menos version ele vai dizer aqui qual é a versão da C da WS que a gente tá usando E aí aqui no nosso aws configuration a gente vai ter a nossa Secret Key e a nossa Public
Key ali para utilizar para fazer o lockin na WS E aí a gente vai criar lá um arquiv inho que vai ter o nosso usuário default E essas nossas Keys e são essas Keys que ele vai usar aqui para se conectar e aqui no intelij se vocês tiverem com o plugin da WS instalado ele já vai identificar se vocês tiverem já um perfil da WS configurado aqui na máquina de vocês tá ó ele já consegue identificar aqui que eu tenho o meu profile default configurado e se eu clicar aqui em out local creds ele vai
abrir o arquivo onde tem Minas credenciais locais que é o que ele tá usando aqui para conectar na WS tá então Se vocês fizerem a configuração da WS se Aline na máquina de vocês tá e colocarem lá as credentials e rodarem o comando aws configure ele vai já puxar essas credentials e configurar esse usuário como default E aí toda vez que vocês forem usar a c a SDK aqui da WS em qualquer projeto ele já vai puxar as configurações defold da máquina de vocês Tá e agora a gente pode voltar lá pro insônia e disparar
uma requisição que a gente vai ver aqui que ele já vai fazer a criação do nosso evento tá e já vai retornar aqui a image url que já vai ter subido lá no Bucket do S3 já vai est publicamente acessível Beleza então podemos abrir aqui o notion e colocar como Ok essa parte de que o sistema pode perm deve permitir que o usuário cadastre no evento e o eventos podem ser classificados como remotos e presenciais perfeito agora a gente vai partir pro próxima etapa que é o sistema deve permitir que o usuário associe um ou
mais cupons de desconto a um evento e cada cupom deve ter os campos de código de cupom desconto em percentual e data de validade Tá então vamos partir agora pra próxima funcionalidade do nosso sistema Então pessoal pra gente fazer a funcionalidade agora de cadastrar cupons no evento a gente vai precisar seguir a mesma lógica que a gente fez aqui na criação de eventos Então a gente vai precisar criar um dto para receber essas informações no Body né do nosso request vamos precisar criar um service que vai se comunicar com o nosso repos e salvar essas
informações do banco de dados Então como essa parte aqui é algo que vocês já estão craques em Criar e a gente já fez aqui no vídeo eu já volto rapidinho com essas classes aqui criadas pra gente partir aqui pra nossa próxima funcionalidade que aí sim envolve lógica onde a gente vai precisar fazer a paginação dos nossos eventos Então volta em um segundo então voltamos agora aqui pro código e basicamente o que a gente tem aqui é o nosso cupom Controller que vai receber uma PF verbal que é o ID do evento onde a gente tá
cadastrando esse cupom e no request Body no Body dessa requisição a gente vai receber um dto que é o dado desse cupom né as informações do cupom esse cupom basicamente é composto pelo código do cupom o valor do desconto aqui um inteiro né e aqui a validade que a gente recebe como um long para depois transformar né num timestamp e salvar no nosso banco de dados e aí a gente tem aqui o nosso cupom service que vai usar aqui o cupom reposter e o evento reposter primeiro ele vai recuperar o evento Então vai buscar pelo
evento através at do id encontrando esse evento ele faz o cadastro aqui do cupom seta o evento a qual esse cupom pertence e finaliza aqui a transação salva tudo no banco de dados e então a gente retorna aqui no Controller um response.ok né uma resposta de 200 pro nosso usuário então a gente já pode colocar aqui né como completo essa parte dos cupons e a gente pode partir agora pra parte de listar os eventos cadastrados com paginação então agora dentro do nosso evento Controller nós vamos construir mais um end Point que vai ser o responsável
por listar esses eventos né E a gente vai fazer um controle aqui de paginação agora aqui dentro do meu evento Controller eu vou criar mais um método público que vai retornar um response entity que vai conter uma lista de event response dto a gente vai criar esse novo dto aqui e o nome vai ser get events o nome desse método agora vamos criar esse novo D então aqui dentro de domain event a gente vai criar um New Java Class que vai ser um Record que vai ser o meu event response dto a gente pode copiar
todos esses campos aqui que a gente tinha no nosso evento request to só que a gente vai mudar algumas coisas então aqui a gente vai adicionar um tipo o ID que vai ser o meu ID aqui que agora a gente vai passar a retornar porque na hora de cadastro a gente não tem ID ainda mas depois para listar a gente já tem o ID desse cara aqui a imagem não vai ser mais um arquivo e sim uma string que é o r L dessa imagem Então vamos colocar como image URL e aqui a data não
é um long mais é um tipo date aqui no nosso evento Controller a gente vai receber dois parâmetros na nossa requisição dois query parms tá dois parâmetros que vão ali na URL mesmo pra gente fazer o controle da paginação Então se a gente voltar lá pro ention a gente vê aqui ó que nos detalhes aqui nos requisitos a gente tem que retornar os eventos cadastrados com paginação Ou seja a gente tem que fazer o controle das páginas a gente não pode retornar todos os eventos de uma vez então se eu tiver 1000 eventos eu vou
retornar todos 1000 eventos não a gente vai fazer um controle de paginação porque o frontend não vai consumir esses 1000 eventos e exibir todos pro usuário normalmente vai est em tela ali pro usuário só uns 10 20 no máximo 50 eventos que ele vai conseguir visualizar e a medida que ele for trocando de páginas ou for scroll aí o frontend vai fazendo as próximas requisições e buscando os próximos eventos então aqui a gente vai receber um request par que vai ser do tipo int @request parm né eu tenho que colocar aqui @request parm do tipo
int que vai ser a página atual que esse usuário tá buscando o cliente no caso né o front end e aqui um outro que é o tamanho de cada página então quantas registros eu tenho que retornar por cada página retorno 10 por página 20 enfim isso frontend vai poder controlar e eu vou colocar aqui um default value para ser inicialmente sempre a página zero e inicialmente ser sempre aqui de tamanho 10 se o frend quiser mudar ele muda manda aqui na request para mim mas eu vou deixar um padrão de 0 e 10 aqui deixa
eu importar o meu response que a gente já criou e agora aqui basicamente o que a gente vai ter é uma lista de event respon que eu vou pegar aqui do meu event service.get event passando a página e passando o Size e aqui eu vou fazer um return enok pass All events e agora no nosso event service a gente vai criar esse método aqui o método de get events então aqui um método público retorna uma lista de evento respon eu vou chamar de get All get EV recebendo o inteiro página e o inteiro que é
o Size a vai usar umais legal do Spring utilitário de paginação então o Spring já tem isso implementado basta a gente utilizar então aqui a gente vai importar o pageable de dentro de os eventos mas aí a gente vai passar esse objeto de paginação ele vai entender que tem que buscar somente x eventos né ele tem que buscar somente os primeiros 10 ou os próximos 10 de acordo com a página que tiver então aqui eu vou criar um objeto do tipo page que vai conter ã instâncias de eventos dentro né A minha página tem vários
eventos que vai ser aqui o meu event page e eu vou fazer event reposter dis P event não eu salvei como reposter aqui aqui ó repost find All para pegar todos os eventos e eu vou passar aqui a minha página né o meu pageable e agora o que que eu vou fazer um return event page map então para cada evento eu vou declarar um event respon passando aqui o meu event.id event title event description o próximo Campo aqui é a minha a data então evento get Date o próximo campo é a cidade depois o estado
como a gente ainda não criou a tabela de address depois a gente muda isso daqui mas por hora a gente vai deixar como uma string vazia aí o próximo é o event.get Remote deixa eu ver beleza e por fim tá faltando o meu event your l então get event your l e event.get image your L perfeito e agora a gente vai colocar aqui um to list para transformar numa lista aqui né tirar do objeto de páginas e transformar numa lista que é o que o nosso método retorna perfeito agora a gente vai salvar Vamos dar
um Reload aqui na nossa aplicação e vamos testar o end Point Então vou vir aqui Vou reiniciar minha aplicação lá no insom eu já tinha deixado o end Point preparado então vou abrir aqui para mostrar para vocês aqui a gente vai buscar pela página três e vamos dizer que cada página tem um tamanho dois se eu enviar aqui a requisição ele deu um method not allow vamos ver por provavelmente a gente esqueceu de mapear lá o request então aqui evento Controller Ah faltou aqui ó get mapping Beleza agora a gente executa de novo a nossa
aplicação volt lá pro insônia deixa eu limpar aqui a nossa timeline vamos tentar de novo Vamos começar com a página zero e um evento por página só para testar Beleza agora dois eventos por página três eventos por página quatro eventos tá agora deixa eu mudar pra página um né tô na página zero vou pra página um ele me mandou eventos diferentes ó tá vendo que esses daqui esses dois últimos T im image URL porque foi depois quando a gente corrigiu o bug do do aws e os primeiros não tem ó os primeiros vem tudo vazio
então ele tá trocando beleza Vamos abrir aqui o post Chico deixa eu ver Quantos eventos tem aqui no meu banco de dados de eventos tem 1 2 3 4 5 6 7 Então deixa eu colocar aqui página zero sete eventos né sete itens por página beleza me retornou todos agora eu vou trocar para página um não tem nada beleza página dois não vai ter nada também então tá bem tá funcionando já aqui a nossa paginação perfeito agora a gente pode partir aqui pro nosso próxima funcionalidade que é o sistema deve retornar somente eventos que ainda
não aconteceram então agora nesse nosso filtro aqui nesse nosso evento control a gente vai ter que colocar um filtro né nesse momento de buscar os eventos para buscar somente eventos que a data ainda não ocorreu Então bora com começar aqui então agora basicamente pra gente conseguir filtrar por apenas os eventos que vão acontecer né que ainda não aconteceram a gente vai ter que mudar essa esse método aqui que a gente criou do get events onde a gente faz aqui o repository pf All agora a gente não quer pegar todos a gente quer pegar somente os
upcoming event né os eventos que estão para acontecer então aqui a gente vai colocar find upcoming events e a gente vai criar Esse novo método lá no nosso repos então aqui no nosso repos a gente vai declarar um novo método a gente precisa colocar só assinatura desse método tá então aqui é um método público que vai ser find upcoming events e aqui ele vai retornar né uma lista de eventos lista de evento e agora a gente vai ter que colocar a query exata do SQL aqui que a gente quer fazer nesse método que é essa
daqui ó deixa eu importar a query aqui a gente tá escrevendo a query então é select event from event né então seleciona o evento da tabela de Eventos onde o evento pon date é maior ou igual à data atual aqui ao invés de retornar um list de eventos Eu quero retornar uma página de eventos e aí eu vou receber aqui por parâmetro né o meu current date então @ F aqui o current date vai ser um date current date e aqui eu vou receber também um pageable pageable né que eu vou usar para fazer a
paginação aqui e o @pm que é o que eu vou receber realmente de parâmetro lá na hora que eu esse método for chamado E agora o que que a gente vai fazer no momento de chamar esse evento a gente vai passar aqui um New date que é a data atual né e o pageable aqui para ele filtrar pelas páginas corretas aqui dos eventos e eu vou trocar o nome desse método para get upcoming events Então não é só get events é get upcoming que é os que estão para acontecer pronto feito isso vamos rodar aqui
de novo a nossa aplicação né dar um restart nela e testar lá pelo insônia Então vou vir aqui no insônia vou disparar uma requisição e provavelmente ele não vai trazer nada por que que ele não tá trazendo nada Opa aqui o Size não pode ser zero tem que ter pelo menos um né Por que que ele não tá trazendo nada porque todos os eventos que eu cadastrei lá no banco de dados eles estão cadastrados na data de 1970 no dia 1 né às 18 horas da tarde então a gente tem que criar um novo evento
que vá acontecer no futuro então tem que colocar um time stamp aqui de hoje aqui nesse Epic converter ó eu já consegui o time stamp de amanhã então peguei aqui o time stamp de amanhã vamos vir aqui no no insônia vamos registrar esse time stamp de amanhã então vamos ver aqui mandar o de amanhã send beleza Ele criou para 1970 então não esse time stamp aqui está errado tem que ser os time stamp completo aqui com segundos deixa eu mandar de novo Agora sim criou para amanhã e agora a gente vai aqui no get a
event e tem que aparecer pelo menos esse evento fronting Sampa 2.0 que vai acontecer amanhã então perfeito tá funcionando o nosso filtro aqui por eventos que Ainda irão acontecer então a gente pode dar um ok aqui e agora a gente vai criar aqui os f filtros né paraa título data e local que é exatamente o que o nosso frontend lá do evento stc vai precisar filtrar Então se a gente entrar aqui no eventos tech.com.br a gente vai ver que a gente tem esse modal aqui de filtro onde o usuário vai poder selecionar cidade né o
estado e a data para aquele filtre aqui en contra eventos que vão acontecer nesse local durante essa data Então a gente vai fazer agora esses filtros aqui no nosso backend Então para que a gente implemente o filtro agora por título local e data a gente vai ter que implementar aqui primeiro o cadastro dos endereços né na tabela address então eu fiz aqui já o nosso add address service que basicamente recebe aqui os dados do evento e o evento e E aí cria na tabela address o registro do local desse evento né do endereço desse evento
E aí esse método aqui que Create address é chamado lá no nosso event service no momento que o novo evento é criado então eu coloquei uma aqui uma condicional depois de registrar esse evento no banco de dados eu coloquei um condicional se o evento não for remoto então eu chamo dis P address service e crio lá o address no na tabela de de endereços Tá bem então só Precisei fazer isso daqui para cadastrar lá o nosso endereço na tabela de endereços e agora no nosso evento reposter a gente já pode aqui adicionar um novo método
para fazer o filtro por data local e título do evento tá então a gente vai ter que declarar um novo método da mesma forma como a gente fez aqui pro upcoming events e colocar uma query específica eu vou colar aqui porque é uma query bem grande mas eu vou explicar para vocês tá então basicamente o que a gente teve que fazer aqui a gente teve que receber por parâmetro a data atual o título do evento né o título que a pessoa tá digitando ali para buscar uma cidade o f uma data de de término e
uma data de começo tá E aí a gente vai usar essas informações para buscar por algo que demete lá no nosso banco de dados como é que a gente vai fazer esse filtro tá tá primeiro a gente vai ter que fazer um join das duas tabelas Então a gente vai fazer uma consulta Não só na tabela de eventos mas também na tabela de address por quê Porque a gente vai estar procurando por cidade e estado também para juntar os resultados da tabela de evento com os resultados da tabela de address feito esse join Aí a
gente faz uma comparação se as informações são parecidas Então se o título for parecido com o título do evento eu retorno ele se o título for se o nome da cidade for parecido com a cidade que eu recebi eu retorno o f a mesma coisa tá então é essa comparação aqui like né a gente não tá fazendo aqui um equals a gente não tá comparando se é igual ou se é maior ou igual não é que a gente tá comparando como a gente tá falando de texto né de string a gente tá comparando se as
Strings são parecidas a gente tem match ali de substrings match de caracter tá e aqui a gente faz o filtro como a gente já tá acostumado pro start date e end date que é fazendo o maior igual e Menor igual aqui porque a data tem que est entre essas duas datas aqui feito isso né a gente já vai conseguir aqui trabalhar com o nosso filtro né com a com o filtro aqui na nossa aplicação e agora lá no nosso evento Controller basta a gente adicionar esse end Point Então a gente vai criar aqui um novo
método público que vai retornar também um response que retorna uma lista que vai ser Filter events aqui vai ser um get mapping Só que vai ser o getmapping onde eu vou mapear para Barra filtro também então aqui eu vou colocar barra Filter então a essa chamada vai ser para barpi bar event bar Filter e aqui eu vou ter que receber essas informações por parâmetro tá as informações aqui da data então eu vou colar aqui para ficar mais fácil tá e basicamente O que que a gente tá recebendo aqui a gente tá recebendo a página o
tamanho da página e aqui aquelas e outras informações o título a cidade a UEF né que é o estado e aqui a gente tá recebendo a data por também tá a data do from e do to né de de começo e de final pra gente conseguir aplicar o list o o filtro e aqui eu vou retornar um evento respon de né uma página de evento response de aqui numa página não na verdade uma lista né Opa coloquei errado uma lista a página quem retorna é o nosso reposter mas a gente já vai mudar isso E
aí lá no nosso event service a gente vai ter que criar esse esse método aqui de get filtered events então aqui no nosso Event a gente vai criar um novo método a gente tem aqui o get upcoming events e a gente vai ter o nosso get filtered events então get f events a gente vai receber por parâmetro uma string que é o título e aqui a gente vai receber também uma string que é a cidade uma string que é o f o estado né um date que é o meu start date e um date que
é o meu tá bem E agora o que que a gente vai fazer a mesma coisa aqui pra criação da página então eu vou chamar o meuer vou fazer find fil events E aí eu vou ter que passar aqui os parâmetros na ordem correta então primeiro eu passo o título depois eu passo a cidade depois eu passo o estado depois eu passo start date and date e por fim eu passo o pageable para fazer aqui a paginação E aí para cada um deles Eu transformo aqui num evento respon cada um desses eventos aqui e a
cidade e o estado Por enquanto eu tô deixando vazio mas a gente já vai arrumar isso e aqui eu faço um stream to list Transformo em lista e beleza eu filtro aqui os meus eventos agora a gente vai ajustar aqui para retornar também a cidade e o estado tá no momento da consulta na verdade eu nem preciso retornar né Deixa eu ver lá o nosso fron acho que precisa dessa informação para mostrar a localização então sim a gente vai precisar retornar aqui a gente vai retornar todas essas informações Beleza então vamos ajustar isso aqui agora
então para que no momento que a gente consulte o evento aqui tanto quando a gente procura pelos upcoming quando a gente faz o filtro para que a gente tenha informação aqui da cidade do estado a gente precisa que essa informação seja retornado aqui pelo nosso evento repository né No momento que a gente fizer a consulta desses eventos tá então o que que a gente vai precisar fazer a gente vai precisar atualizar aqui o a nossa entidade event e vamos colocar mais um campo nela que é o que vai indicar a relação com a tabela address
Então a gente vai colocar mais um campo aqui que vai ser o address vai ser uma relação one to one tá vou colocar ela aqui e aí essa informação vai ser preenchida pelo reposter nos momentos que a gente fizer o join com a tabela address lá no momento onde a gente faz as consultas com join Tá bem então aqui no nosso evento service O que que a gente vai fazer a gente vai fazer aqui ó no momento de preencher a cidade e o estado a gente vai fazer o seguinte a gente vai fazer event ponto
get address P get City e aqui vamos quebrar a criação desse evento de ti para que fique mais fácil pra gente enxergar cada um dos Campos aqui fique melhor pra gente formatar então event event estado por enquanto não tem evento evento evento e o que que a gente vai fazer PR prevenir quando address tiver nul a gente vai ter que colocar uma comparação aqui então quando for diferente de nulo eu coloco event.get event get address get se for igual a nulo eu só retorno uma string vazia e eu vou fazer a mesma coisa aqui pro
meu estado então Opa a mesma coisa aqui get address getf pronto e aqui o get remote e eu vou fazer a mesma coisa nesse meu upcoming events aqui em cima Então deixa eu quebrar vou copiar aqui né o mesmo return ó só fazer a mesma coisa event page que eles Retornam no final o mesmo tipo tá então a gente faz isso daqui já deve funcionar só que a nossa o nosso find up coming event não tá fazendo um join aqui na tabela de address então aqui a gente vai ter que fazer o join também tá
Então vamos atualizar essa nossa query Então a gente vai fazer um left join pegando o endereço tá na tabela address E aí buscando onde a data for maior ou igual a data atual beleza dessa maneira já deve funcionar ele já deveria trazer aqui a cidade e o estrado para nós tá então vamos testar se isso tá funcionando vamos parar aqui execução vamos executar novamente vou entrar aqui no insônia e a gente vai cadastrar aqui esse evento fron Sampa tá vamos cadastrar um novo evento para ele cadastrar essa cidade esse estado aqui perfeito cadastrou e agora
quando a gente fizer o get aqui eu quero que ele me retorne à cidade o estado City state Opa deixa eu colocar aqui oito para trazer todos eu tenho que olhar só o último página zero para me trazer oito cadê Aqui cidade São Paulo Estado São Paulo perfeito e agora vamos criar um novo end Filter EV e aqui a gente vai chamar barra bar eventra Filter Então a gente vai passar informação aqui de por exemplo state como sendo SP deixa eu ver umais deixa eu abrir noss int deixa eu ver como que euo os entros
lá no nosso evento controler então coloquei aqui o f então ten que passar o f também então aqui o f Ah aqui ó já tem um problema como a gente não passou todas as os filtros lá que ele tava esperando ele já deu erro então eu ten que passar aqui todas as informações Então já tem um problema aqui então galera para consertar o erro que a gente tava tendo lá no momento de filtrar os eventos eu tive que adicionar aqui umas validações para verificar se os campos não est não estavam vindo como nulos tá então
Eu verifiquei o título a cidade não estão V vindo como nulos e se estivessem eu troco para uma string vazia e eu fiz aqui também uma validação Zinha pro start date end date caso venha como nulo eu tô criando um start date na data Zero no começo dos time stamps que é a data de 1970 né então impossível ter um evento antes disso então coloquei aqui o start date como isso e o end date né como sendo o agora caso essa informação não veia para que eu filtre por todos os eventos do passado tá E
aí eu removi aqui o envio do current date eu removi o envio do current date porque não faz sentido né Eu filtrar por eventos do Futuro mas os eventos que estão dentro do Range aqui da data que o usuário passou se o usuário já tá me passando um Range de data quer dizer que ele quer filtrar por essa data e não só por eventos que acontecerão né eventos que estão no futuro então removi aquele current date que a gente estava passando aqui para dentro de do reposter tá removi o parâmetro e removi a busca dele
aqui na Crew também e agora a nossa Crew ficou nesse formato aqui dessa forma eu juntei aqui a consulta do start date end date para consultar eventos que estiverem dentro desse range e coloquei aqui né o o title City e o f removi aquele we onde a gente Olhava O current date dessa maneira já está funcionando aqui o nosso filtro Então se a gente envia aqui uma requisição no momento ele não tá trazendo nada porque eu não tenho nada que tem um Mat aqui com essas informações mas se eu trocar aqui por exemplo para Vamos
criar um novo evento de cidade teste e deixa eu tentar criar esse evento tá esse evento tá no futuro Beleza se eu colocar aqui cidade teste City teste ele não vai trazer porque eu tô filtrando né pela data do Futuro mas se eu colocar aqui uma data do passado Então deixa eu pegar ela aqui essa data aqui deixa eu colar beleza foi lá para 1970 agora deixa eu voltar aqui no get futter events e colocar Pronto agora tá aparecendo porque tá dando match com a data tá e aqui tá dando match com o nome da
cidade se eu trocar o nome da cidade vai parar de dar match E aí sim não vai retornar nada mas se eu trocar aqui de novo pra cidade de teste ele me retorna porque tá dando Mat tanto com a data quanto com a cidade quanto com o estado quanto com o título se eu trocar o título também ele vai parar de me retornar então beleza Tá funcionando o nosso filtro e agora a gente pode partir pra última funcionalidade aqui da nossa aplicação que é para permitir que o usuário consulte de detalhes de um evento específico
que basicamente a gente vai filtrar aqui pelo evento ID né E vai fazer um Finds by ID lá no meu reposter como eu sou aqui também é algo que vocês já estão acostumados e que a gente já viu bastante no vídeo de hoje eu vou instalar os dedos e quando eu voltar isso aqui já vai est pronto Beleza então volto já voltamos e já estamos agora aqui com a nossa consulta por eventos ID funcionando onde vai retornar todos os detalhes do evento e os cupons que estão cadastrados nesse evento também e basicamente o que a
gente fez foi aqui no nosso evento Controller criar mais um endp tá um endp de get que vai receber via PF variable O Event id o id desse evento Então a gente vai chamar Esse novo método que é o get event details dentro do nosso event service para procurar pelo evento lá no nosso evento reposter usar o cupom service para consultar pelos cupons desse evento Então a gente criou mais um método lá no nosso cupom service também que basicamente consulta os cupons tivemos que declarar um novo método no nosso cupom reposter né para fazer a
busca pelo event id e o valid né todos os cupons que ainda estão válidos tá E aí lá no nosso evento service depois da gente fazer essa consulta de cupons basicamente a gente passa por toda essa lista de cupons monta o nosso dto e depois monta o dto final aqui que é o nosso eventos de taos dto que é um novo dto que a gente declarou para trazer todas as informações completas desse evento feito isso tá funcionando fizemos aqui todas as nossas funcionalidades da aplicação e agora a gente vai partir pra parte mais H legal
né que é colocar isso para funcionar colocar isso em produção Então vamos lá na WS agora configurar tudo pra gente colocar a nossa aplicação no ar Então galera eu já tô aqui dentro do meu dashboard da WS e a gente vai começar a construção aqui a criação da infraestrutura pra gente colocar essa nossa aplicação no ar tá então a primeira coisa que a gente vai precisar criar aqui dentro da WS é uma vpc O que é uma vpc vpc é o sinônimo né é a sigla de virtual Private Cloud e o que que isso significa
virtual Private Cloud é como se fosse uma sessão lógica que a gente cria para colocar os nossos recursos lá dentro da WS Tá então vamos imaginar o seguinte imagina uma faculdade certo uma faculdade pode ter vários cursos então tu imagina a WS como a faculdade tá a WS é o todo é a faculdade dentro dessa faculdade eu posso criar cursos e esses cursos cada um vai ter as suas regras certo e os seus controles então quando a gente fala de virtual Private Cloud a gente tá falando de rede privada na nuvem então a gente tá
lá na nuvem a gente tá lá na WS mas a gente tá criando uma rede privada para nós onde a gente vai criar as nossas regras de controle as nossas regras de acesso que é como se fosse os cursos né as diretorias lá dentro de uma faculdade onde eles estão dentro do campus da faculdade mas a medida que tu entra ali naquele curso né no no prédio do curso passa a valer as regras ali daquele curso daquela Coordenadoria como se fosse isso então a vpc vai provisionar uma sessão lógica pra gente lá dentro da WS
lá dentro dessa vpc a gente vai poder criar nossas subredes a gente vai ter controle Total dessas redes dos endereços de IP de quem entra e de quem sai configuração dos gateways para comunicação com a internet a tabela de roteamento etc então por isso que a gente vai criar uma vpc inclusive se a gente voltar lá pro nosso desenho de solução vocês vão ver aqui que eu já tinha previsto essa nossa vpc Então se a gente der uma olhada a gente tem aqui a nossa vpc e ela tá agrupando aqui o nosso ec2 o nosso
RDS aqui o nosso banco de dados certo e dentro dessa vpc eu tenho uma subnet privada que não tá exposta na internet e eu também tenho o internet Gateway né Que expõe aqui essa nossa sessão essa nossa rede pra internet Beleza então o que a gente vai criar agora vai ser essa nossa VP então vocês podem procurar por vpc aqui no painel da WS entrarem aqui em vpc e clicarem em criar vpc tá bem aqui a gente vai dar um nome para essa nossa vpc então eu vou chamar de eventos Tech vpc tá que é
a vpc aqui pro nosso projeto e aqui nesse campo de Cider ipv4 a gente vai definir o tamanho do bloco de IPs que a gente vai ter aqui dentro dessa nossa vpc porque lembrando ela tem controle total da rede inclusive aqui dos endereços IPS tá dos serviços que vão está rodando dessa dentro dessa rede então aqui eu vou colocar o bloco de 10.0.0.1.com I PS disponíveis certo então eu tenho 512 IPS se eu coloco o Barra 22 eu tenho 1024 IPS Eu aumentei o Range aqui de p disponíveis E se eu reduzir se eu for
paraa barra 24 eu tenho apenas 256 então vou deixar nesse barra 23 aqui que a gente vai ter 512 endereços IPS aqui para brincar dentro da nossa vpc tá certo de resto aqui a gente não vai precisar colocar mais nada então a gente mantém aqui as configurações padrões e vamos clicar em criar vpc vamos esperar ela criar C pronto vpc criada com sucesso e agora a gente vai partir paraa criação de um Gateway de internet o que que é isso Ó vocês vão entrar aqui do lado aqui da das vpcs tem esse gateways de internet
a gente vai criar um novo Gateway de internet os gateways de internet são o componente aqui dentro da nossa vpc que vão permitir a comunicação dessa nossa rede ali dentro da vpc com a internet tá então eles vão ser o tráfego eles vão ser o ponto de saída de todo o tráfego paraa internet Então se a gente der lá uma olhada de novo no nosso desen de solução a gente tem o Gateway aqui né na porta de entrada aqui da nossa vpc como se fosse o porteiro o GAT e recebe tudo e ele que faz
a comunicação aqui com o mundo exterior né com o mundo da internet Então repassa esse tráfego aqui dentro pra nossa vpc Então a gente vai criar um novo Gateway de internet o nome vai ser eventos Tech Gateway então gtw que é aqui o o acrônimo para Gateway beleza e a gente vai clicar aqui em criar Gateway de internet criado o nosso Gateway a gente vai aqui em ações vamos clicar em associar a vpc Então a gente vai colocar esse nosso Gateway lá dentro da vpc vamos selecionar a vpc que a gente criou e associar Gateway
da internet feito isso agora a gente vai partir pra criação de uma subrede Então a gente vai vir aqui em subredes e vamos criar uma nova subrede ou subnet também como como o pessoal chama em inglês e o que que são essas subredes as subredes são divisões lógicas dentro da nossa vpc então ela vai permitir que a gente segmente a nossa vpc em redes menores tá E que a gente consiga fazer um controle de segurança para cada uma dessas redes menores então a gente pode ter tanto uma subnet que é privada Ou seja que não
tá exposta na internet que não consegue se comunicar com a internet ninguém de Fora consegue se comunicar com ela quanto subnets públicas que a gente consegue ter essa comunicação com a internet tá então é basicamente para isso que servem as subnet é pra gente fazer segregações dentro da vpc Então imagina a vpc como a Coordenadoria do curso né então que manda por exemplo em todo o curso de computação e a subnet como sendo cada uma das matérias dentro da Computação onde o coordenador daquela matéria ou Professor daquela matéria consegue estabelecer algumas regras né e fazer
o controle ali daquilo e na subnet a gente também consegue fazer o controle do Range de endereços de IP que estão dentro ali daquela subnet tá então ela tem controle dos endereços de de IP ali que estão dentro do Range dela então vocês vão ver aqui que quando a gente for criar uma subrede a gente vai ter que criar associar ela a uma vpc certo que vai ser aqui a nossa eventos Tech vpc E aí a gente precisa especificar Qual é o bloco aqui de de IPs dessa subrede certo então qual é o bloco que
ela vai recortar aqui qual é a fatia de IPs que ela vai pegar aqui das dos IPs disponíveis ali dentro da vpc Vamos dar um nome para essa nossa subrede vai ser uma subrede pública essa daqui então vai ser a que a gente vai atrelar o nosso ec2 porque o ec2 vai estar publicamente acessível na internet ele vai estar recebendo o tráfego da da internet e respondendo coisas também então vamos dar o nome aqui de eventos Tech público ã rede pública então eventos Tech rede pública que é a rede disponível aqui pra internet aqui o
bloco de Cid que a gente vai usar vai ser o 10.0.1 bar2 então daqueles 512 IPS que a gente tem dentro na nossa vpc a gente vai pegar só 256 aqui e os outros 256 a gente vai usar para criar uma subnet aqui privada tá bem aqui a zona de disponibilidade Vamos colocar no us East One no a Tá bem na zona A então vamos selecionar esse daqui West East One a beleza e agora a gente vai vir aqui em criar subrede vamos esperar ele criar aqui perfeito subrede criada Agora se a gente entrar de
novo lá no nosso painel de vpcs e escolher aqui a nossa vpc a gente vai conseguir visualizar que já tem algumas coisas aqui dentro dela né alguns recursos a gente tem aqui a nossa vpc dentro dela eu tenho subredes no caso só uma e tenho aqui minha tabela de rotas basicamente a tabela de rotas mapeia as subredes e os gats aqui tá Então a gente vai fazer aqui um último mapeamento que é o mapeamento do meu gaty aqui pra minha tabela de rotas Então a gente vai vir aqui na minha tabela de rotas vou abrir
ela e aqui eu tenho as minhas rotas certo eu vou vir aqui em editar rotas vou adicionar uma nova rota E aí todo o tráfego que vier de de fora eu vou redirecionar para um Gateway da internet qual Gateway o meu eventos Tech Gateway esse daqui ó que a gente criou anteriormente tá bem feito isso a gente já vai conseguir atrelar o nosso Gateway à nossa vpc e dessa forma a gente vai conseguir receber tráfego da internet então vamos salvar as alterações perfeito E agora voltando lá pra visualização da nossa vpc a gente vai ver
aqui ó que a gente tem a nossa tabela de rotas as nossas subredes e agora a gente tem uma conexão aqui entre a tabela de rotas e a rede né que seria aqui o nosso Gateway de internet e agora a gente pode partir pra criação do nosso primeiro recurso aqui dentro da WS o nosso primeiro serviço de fato que vai ser o nosso ec2 Então vamos abrir aqui o painel do ec2 para fazer a criação da nossa Instância então para criar uma nova Estância a gente vai entrar aqui em instâncias e execução e clicar em
executar Instância Vamos dar um nome para essa nossa Estância um nome pro nosso servidor que a gente vai chamar de Java Service eventos Tech que é o meu deixar aqui junto eventos Tech que nem eu tinha mantido antes o sistema operacional a gente vai deixar aqui o Amazon Linux tá arquitetura vamos deixar padrão o tipo da instância padrão também T2 micro que é qualificado pro nível gratuito e aqui entra o primeiro ponto que a gente tem que ter atenção selecionar o par de Chaves O que que é esse par de Chaves é o par de
chave SSH que a gente vai usar para se conectar nessa nossa Estância depois porque Lembra essa Estância é uma máquina virtual se você não sabe o que é uma máquina virtual Assiste esse vídeo aqui que eu expliquei bem certinho a diferença entre docker e máquina virtual essa Estância é uma máquina virtual que a gente tá criando lá na WS tá lá nos servidores da WS e a gente vai precisar se conectar essa máquina pra gente instalar as coisas nela rodar a nossa aplicação lá dentro dessa máquina etc pra gente se conectar de forma remota nessa
máquina tem algumas opções a gente pode se conectar aqui pelo próprio Shell no console aqui daws mas a gente pode se conectar aqui pelo nosso terminal também então aqui no terminal do meu computador eu posso através de SSH me conectar o terminal da dessa máquina virtual de forma remota e rodar comandos lá dentro então é para isso que vão servir aqui esses pares de Chaves então eu vou selecionar aqui um par de Chaves que é o do meu computador aqui que eu já tenho cadastrado na minha conta da WS Mas se vocês não tiverem vocês
podem clicar aqui nesse botão de criar novo par de Chaves e aí cadastrar aqui criando uma nova chave para vocês e salvar ela na máquina de vocês ou vocês podem depois vir aqui e cadastrar o novo parte Chaves né Cadastrando um parte Chaves que vocês já tem na máquina de vocês não precisa ser um específico aqui para WS tá vocês podem usar o mesmo vocês usam pro github por exemplo mas eu já tenho o meu cadastrado aqui vou selecionar ele agora a gente vai partir para mais uma coisa importante que é as configurações de rede
aqui a gente não pode deixar ele selecionar essa vpc padrão a gente tem que selecionar a vpc que a gente criou que é aqui a nossa eventos stack vpc por quê Porque a gente vai colocar esse nosso C2 lá dentro dessa nossa rede né dessa virtual Private Cloud que a gente criou E aí aqui a gente vai ter que ser selecionar em qual subnet essa essa Instância aqui essa máquina vai nascer vai nascer na nossa subnet aqui de eventos Tech rede pública que vai ser a nossa rede que vai est exposta né pra internet para
que receba chamadas aí a gente vai vir aqui e vamos clicar em atribuir IP público automaticamente Vamos colocar em habilitar porque a gente vai ter que ter um IP Público aqui nessa nossa máquina né o IP é aqui o endereço dessa nossa máquina na internet certo a gente tá acostumado muito a usar domínios né que é isso aqui http 2 bar diagrams.net aws.com.br mas o domínio no final das contas nada mais faz do que mapei um nome para um IP um IP que está público na internet beleza e aí por fim aqui a gente vai
selecionar o criar grupo de segurança tá e a gente vai criar um novo grupo de segurança aqui para esse nossa nossa Estância o grupo de segurança básicamente controla quais recursos aqui essa nossa Estância pode consultar o que que ela pode acessar sai qual tráfego ela pode receber tá é como se fosse um controle um Firewall a nível de serviço tá então aqui a gente vai dar um nome para esse nosso grupo eu vou chamar de eventos Tech eventos Tech ec2 Security group então SG Security group e aqui a descrição eu vou dar de eventos Tech
Java service Security Group e aqui a gente vai ter que colocar também mais algumas regras nesse grupo de segurança já então aqui ele já tá dizendo que vai permitir as comunicações de SSH né ele tava aqui o SSH Beleza então tá permitindo aqui comunicações de SSH eu também vou querer comunicações de http Então vou vir aqui e vou colocar http Cadê http Vou permitir comunicações de qualquer lugar então de qualquer IP e também comunicações de https então aqui https qualquer lugar e também já a gente já pode colocar aqui a regra de TCP personalizado para
permitir comunicações na porta 8080 que vai ser a porta onde vai estar rodando essa nossa aplicação e eu posso colocar aqui a origem de qualquer lugar dessa maneira eu já permito os protocolos http https SSH para se conectar nessa nossa máquina e aqui TCP para chegar na porta 8080 beleza feito isso vamos partir aqui paraas próximas configurações que é de armazenamento aqui a gente vai deixar o que veio padrão selecionado E aí vamos vir aqui em detalhes avançados e aqui embaixo nos dados do usuário a gente vai colar esse comandinho aqui ó que eu tô
colando aqui na tela ó Yam update menos y depois sudu Yum T Java 21 Amazon correto headless o que que a gente tá fazendo aqui isso aqui basicamente é um scriptz inho que vai ser rodado Quando a nossa Estância for inicializada porque a nossa Estância é uma máquina virtual e quando ela for inicializada ela vai tá vazia ela vai ter só os sistema operacional e aqui o que eu tô fazendo é assim que ela for inicializada já dá o instal aqui do Java nela porque a gente vai precisar do Java Beleza depois a gente consegue
conferir se isso deu certo rodando um Java menos menos version no terminal para ver se funcionou mas já vamos deixar com esse dado aqui de usuário porque eu já quero ter esse scriptz inho automatizado para já instalar o Java aqui nessa nossa máquina beleza feito isso a gente já pode clicar aqui em Executar a Instância e esperar ele terminar a criação dessa Estância enquanto ele vai criando aqui Ah já criou Então beleza foi criada com sucesso agora ela vai est pendente aqui porque ela ele tá subindo a máquina tá fazendo as configurações Então nesse meio
tempo a gente já pode abrir o RDS aqui o serviço de relational Database da WS tá para criar bancos de dados relacionais pra gente criar o nosso banco de dados postgres aqui dentro e até Inclusive eu vou atualizar Porque antes eu tinha colocado aqui que a gente vai usar o Amazon Aurora mas na verdade a gente vai usar o postgis e não o Amazon Aurora então ao invés de Amazon Aurora a gente pode colocar um postgis aqui certo ou a gente poderia colocar também o RDS direto e colocar que esse é um RDS de posts
então aqui eu tenho um RDS da Amazon E aí vai ser um RDS com um posts aqui para o nosso desenho ficar atualizado Porque antes eu tinha previsto que a gente ia usar o Amazon Aurora mas acabamos aqui usando o posts então voltando lá um banco de dados vamos criar um novo banco de dados aqui vamos colocar como criação padrão e o o mecanismo que a gente vai escolher é o mecanismo de postgress beleza ele vai carregar aqui a versão do mecanismo que é a versão do sistema de gerenciador de banc de dados né que
é a versão aqui do postgress E aí a gente vai ter que escolher aqui Qual modelo a gente quer rodar né Qual o nosso caso de uso aqui deem uma olhada nessa diferença de preço tá se a gente deixa selecionado por produção que eu vou ter alta disponibilidade desempenho rápido e consistente Olha só para quanto vai o valor disso daqui ó o valor aproximado tá se eu usasse por um mês olha só $400 tá então tomem muito cuidado com tudo que vocês forem criar aqui na WS se vocês estiverem criando para teste não esqueçam de
excluir isso daqui depois tá porque senão a conta vem cara e vem mesmo tá então aqui o que que a gente vai escolher a gente vai escolher o nível gratuito f essa aplicação não vai rodar depois em produção tu não vai usar pro eventos Tech sim eu vou tá eu vou utilizar mas por enquanto eu vou deixar na versão gratuita pra gente ver se o projeto vai pegar forma se a gente vai ter bastante acesso e depois se eu precisar eu mudo aqui a versão mudo o modelo tá e faço aqui um algo mais escalável
por enquanto eu vou deixar no nível gratuito porque ele vai aguentar de boas requisições por hora tá ã e por enquanto Me atende depois se precisar eu escalo isso daqui mas por enquanto eu vou deixar no nível gratuito se vocês derem scroll lá para baixo mesmo assim vocês vão ver que não tá gratuito tá tá 15 por quê porque tem umas taxinhas aqui tá mesmo que o nível é gratuito ainda tem algumas taxinhas mas é 15 por mês não é quase nada tá e não é certo que vai ser esses 15 tá não é exatamente
esse valor ele tá só fazendo uma previsão aqui aqui em configurações a gente vai ter que trocar o nome desse nosso Database eu vou chamar de eventos Tech Database tá bem E aqui o gerenciamento de credenciais a gente vai deixar com aws Secret Manager para as senhas tá pro aws Secret managers aqui criar a senha para nós e a gente ter todo o gerenciamento da senha desse nosso banco de dados aqui pelo aws Secrets Manager tá bem e aí à medida que esse banco for criado no momento que ele for criado ele já vai gerar
as credenciais aqui de login para nós o usuário é o posters né o usuário principal mas a senha ele vai gerar para nós agora aqui nas configurações da instância a gente deixa como está aqui em armazenamento deixamos como está também beleza que a gente tem 20 GB de amargamento e agora a gente tem que se atentar aqui na parte conectividade a gente vai querer conectar esse RDS a um recurso de computação do ec2 a uma estância lá do ec2 Então a gente vai vir aqui e vai escolher conectar-se a um recurso de computação e eu
vou escolher a nossa Instância lá que tá rodando que é o Java service eventos Tech que a gente criou tá bem vamos atrelar esse RDS a nossa Estância então a o meu C2 aqui vai consumir informações daqui e aí ao fazer isso ele vai criar automaticamente um Security group para mim tá um Security group que controla o acesso do ec2 ao RDS E aí a gente vai ter que fazer algumas alterações nesse Security group para permitir de fato que o ec2 acesse esse RDS tá bem E aqui ele vai selecionar Quais as subnets né Quais
as subnets ele vai utilizar ele vai utilizar aqui uma subnets padrões que ele vai criar mas quando a gente for criar isso daqui ele vai dar um erro por quê Porque ele vai dizer que ainda não tem mais de uma subnet lá na minha vpc então antes da gente finalizar isso daqui a gente vai ter que criar uma nova subrede Tá bem então a gente vai vir aqui no vpc e vamos criar uma nova subrede para essa nossa vpc Vamos criar subrede aqui vai ser pra minha vpc de eventos Tech vpc o nome vai ser
subred privada tá então subred como é que eu tinha dado o nome lá eu tinha d o nome de eventos Tech rede pública Então vou dar um nome aqui de eventos Tech rede privada que vai ser a rede onde vai ficar esse meu banco de dados na rede privada aqui eu preciso definir o bloco de ã IPS eu vou colocar o 10.0.02 para pegar os primeiros 256 porque no outro eu peguei os últimos 256 né no Range de IPs e zona de disponibilidade aqui é muito importante que vocês coloquem uma diferente então antes a gente
tinha colocado na Us e One que é uma das zonas lá da WS é um literalmente uma zona física Aonde fica a máquina aqui eu vou escolher uma outra zona a US Twist 1b tá Por quê Porque o RDS obriga isso obriga que tenha pelo menos duas subnets dentro dessa vpc e elas estejam em zonas de disponibilidade diferentes tá bem vamos escolher aqui a West East One b e vamos clicar em criar subre então esperar aqui ele criar beleza Ele criou se a gente entrar aqui na nossa vpc já vai tá aqui a Duas né
rede pública e rede privada tá bem e agora aqui no nosso RDS quando a gente for criá-lo não vai dar nenhum erro então a gente dar um Reload aqui para ele pegar a Estância a vpc ele Já identificou aqui a própria vpc do ec2 tá vendo Então eu não selecionei nada quando eu peguei o ec2 ele já viu ó esse ec2 tá nessa vpc aqui tá então eu tenho que ficar nessa vpc aqui também Beleza então ele já faz a identificação aqui para mim se a gente der uma olhada aqui ele já identifica ó que
tem duas subredes e duas zonas de disponibilidade nessa vpc Então a gente tem que ter certeza que tá aparecendo isso porque senão ele vai dar erro na hora de criar o banco de dados aqui a configuração de subredes do banco de dados eu vou deixar a configuração automática aqui o acesso público a gente vai deixar que não tá então essa esse RDS não tem o acesso público e somente instâncias do ec2 e outros recursos dentro da vpc podem se conectar ao seu banco de dados Tá bem então a gente não vai expor esse banco de
dados aqui na internet nenhum outro serviço que não esteja dentro da minha vpc vai conseguir Chamar esse banco de dados tá em grupo de segurança a gente vai deixar selecionado o Criar novo porque ele vai criar um novo grupo de segurança específico aqui pro meu RDS porque lembra que lá o Security Group do meu ec2 tá permitindo a entrada aqui ó se a gente D uma olhada nas regras de entrada do Security Group do meu ec2 tá permitindo a entrada de toda a requisição SSH né requisição http https e requisição na porta 8080 tá de
qualquer origem de qualquer IP qualquer pessoa pode mandar essa requisição não quer dizer que vai dar certo mas pode mandar uma requisição aqui para dentro beleza aqui no nosso RDS a gente não quer isso no nosso banco de dados a gente quer somente que o meu sc2 ou somente os serviços que estão dentro da minha subnet possam mandar requisições aqui pro meu banco de dados pro meu RDS então eu não vou selecionar aqui o Security groupo do meu E2 eu vou criar um específico um Security Group específico aqui pro meu RDS para controlar as seguranças
desse meu banco porque são seguranças diferentes são regras de segurança diferente da minha Estância doc2 da minha máquina do meu servidor tá bem de resto aqui a gente mantém esse autenticação com senha Porque no final das contas a gente vai logar com usuário e senha né lá na nossa aplicação no no JPA a gente coloca o nosso a password e o user para fazer o login no banco de dados tá bem aqui o monitoramento a gente vai tirar não precisamos deixar isso e a gente pode dar um review aqui só para ver ó se o
valor se Manteve o mesmo $1 não quer dizer que ele vai me cobrar automaticamente $1 tá isso aqui seria é um custo estimado por mês tá aqui depois eu usar por um mês inteiro de resto aqui vamos revisar então acesso público não aqui criar um novo Security group Beleza Aqui tá conectado a minha vpc correta a minha Estância do E2 perfeito e aqui o o nome do meu banco de dados deixa eu ver eventos Tech de b o nome do usuário postgres o gerenciado pela WS Secret Manager nível gratuito e postgis beleza revisado tudo aqui
podemos clicar em criar banco de dados esse nome aqui já existe porque eu tinha testado antes então eventos Tec Database Vamos criar aqui criar banco de dados esperar aqui ele finalizar a criação agora nós podemos entrar aqui no nosso banco de dados tá no nosso evento stack Database ver aqui né esperar por ele mostrar o end Point ainda não mostrou porque ele tá criando Mas a gente pode vir aqui já em aqui em configuração e já dá uma olhada se ele já criou aqui os credenciais ainda não ó ele ainda não fez a criação das
credenciais tá em andamento Pronto ele já terminou aqui a criação do end Point né do meu Database tá E aqui terminou também a criação se a gente der uma olhada aqui na configuração das minhas credenciais então a gente já pode partir agora lá pra nossa aplicação para colocar C as informações Então vamos abrir aqui o nosso intelij tá E aqui no application p properties a gente vai ter que Substituir eu já tinha feito uns testes aqui então já não tá mais com local host Mas eu vou pedir aí para vocês substituírem então aqui na URI
né a gente vai colocar essa URI que foi gerada ali esse endp deixando JBC 2 p post skl 2 p bar Barra aqui na frente e aqui no final o nome do banco de dados que a gente vai usar vai ser o banco de dados barp que é o banco de dados padrão que é criado né quando a gente cria uma Nova Instância do nosso banco de dados o username vai ser postgress e a password a gente vai recuperar aqui dentro do nosso RDS Então a gente vai vir aqui vamos clicar no aws Secret Manager
ali embaixo né gerenciar no Secret managers E aí a gente vai vir aqui em valor de segredo e recuperar segredo tá vamos vir aqui no intelij e vamos colar a password aqui beleza o resto mantém tudo igual tá bem e aí a gente vai voltar lá pra WS e vamos fazer mais algumas configurações que que a gente vai fazer aqui a gente precisa ir lá no iam Então vem aqui no serviço do Iam que é o serviço de controlar perfis regras e políticas de segurança aqui na WS tá usuários enfim e a gente vai vir
aqui em funções que seriam as rolles em inglês e a gente vai criar uma nova role tá bem uma role que a gente vai usar lá no nosso sc2 tá para que ele tenha acesso ao nosso S3 porque lembra lá que o nosso sc2 dois ele vai consumir um Bucket do S3 ele vai colocar dados lá dentro na verdade né ele não vai consumir ele vai impulsionar dados lá para dentro ele vai gerar dados né que são as imagens vai enviar arquivos lá para dentro então a gente precisa que esse nosso C2 tenha essa permissão
tá E quem é que vai controlar essa permissão de acessar outro recurso é o iam tá a gente vai criar uma nova função aqui do Iam então é uma função para um serviço da WS ou ws2 tá o serviço que vai estar usando essa função e aqui a gente vai procurar comal a permissão as políticas de permissão que a gente quer dar para ele a gente quer dar um full access aqui ao S3 para ele poder fazer de de arquivos lá dentro dessa forma a gente consegue né com iam criar credenciais pros nossos serviços tá
e a gente vai anexar essa role lá no nosso sc2 E aí automaticamente o meu sc2 vai ter essa credencial para conseguir se conectar ao S3 porque lembra que aqui no nosso código em nenhum momento a gente colocou credencial ó na WS config eu não coloquei credencial eu pedi para ele usar as defa aqui aqui do provider chain né então quando eu anexar essa Roll é o meu sc2 ele vai ter essas credenciais lá para dentro para conseguir consumir aqui pelo SDK tá bem o nome dessa rol vai ser ec2 S3 full access ec2 service
S3 full access e aqui a gente vai criar o perfil perfil criado a gente vai entrar lá no sc2 vamos entrar aqui na nossa Instância então no Java service vamos vir aqui em ações segurança modificar função do Iam e vamos escolher uma função que é esse aqui ó S2 service S3 full access atualizar função do Iam e a partir de agora o meu E2 já tem acesso full ao S3 tá já vai conseguir enviar arquivos lá para dentro já vai conseguir se conectar com o meu Bucket e etc tá bem E agora o que que
a gente vai fazer a gente vai partir lá pro nosso código vamos fazer o build da nossa aplicação subir ela aqui finalmente pro no nosso C2 pra gente fazer o build antes da gente fazer na verdade a gente tem que fazer algumas modificações aqui no nosso código por causa dos Testes unitários Tá bem então aqui no pum XML vocês vão precisar adicionar um novo uma nova dependência que é dependência do H2 Database que é um banco de dados em memória tá que é o que a gente vai usar aqui para os nossos testes unitários porque
se a gente não configurar um banco de dados em memória toda vez que eu for executar os testes unitários da minha aplicação e esses testes unitários vão ser rodados ali no momento que a gente for fazer o build eu vou est tentando me conectar com o meu banco de dados lá do RDS tá e eu não quero isso eu não quero que o meu teste unitário se conecte com o meu banco de dados real Então a gente vai usar um banco de dados em memória para isso somente pros testes unitários aí a gente vai vir
aqui no no na pasta teste aqui ao lado da pasta Main Então a gente tem aqui dentro da pasta source a pasta Main que fica o nosso código e a pasta teste que fica os testes unitários aqui ao lado da pasta Java a gente vai criar uma pastinha resource e aqui dentro a gente vai criar um arquivo application if test p properties e aqui a a gente vai colocar as propriedades né para acessar esse banco de dados que é o nosso banco de dados em memória O H2 der base aqui a gente precisa colocar o
driver a URL o username e a password beleza e aí aqui em cima da minha classe principal de testes que é a classe que tem o mesmo nome da classe da minha aplicação eu vou colocar esse Active profiles como teste para ele saber que ele precisa usar o application P properties de teste e não application F properties comum tá o original dessa forma Quando eu for rodar aqui o o build ele já vai executar com H2 der base e não vai dar nenhum problema então a gente vai vir aqui em maven Vamos abrir aqui o
terminalzinho do maven e vamos rodar maven Clean install para ele instalar todas as dependências fazer o build rodar os testes unitários etc Pronto ele já finalizou aqui fez o build com sucesso e agora o que que a gente vai ter que fazer para né executar essa nossa aplicação lá dentro dc2 basicamente a gente vai ter que copiar esse nosso arquivo de build lá dentro PR nos da nossa máquina do ec2 tá e colocar lá PR tá lá dentro Beleza então o que que a gente vai fazer aqui primeiro vamos testar a nossa conexão com a
nossa Estância doc2 Então vou entrar aqui na minha Estância vou entrar aqui em conectar e vou pegar aqui ó o meu endereço IP público né que é esse ec2 user @ e aqui o endereço IP para eu me conectar via SSH Então vou vir aqui vou digitar SSH Vou colocar aqui C2 user @ né que eu tô usando aqui o user do2 para me conectar aqui Yes E aí aqui agora a minha senha Pronto tô conectada lá na minha máquina virtual tá no meu E2 agora vou rodar aqui Java Java menos version pelo jeito meu
user deira não deu certo então não tem problema a gente instala aqui novamente o meu Java Então deixa eu só copiar aqui o comando é sudo e um instal Java 21 correto headless ele vai perguntar se isso está ok eu vou colocar que sim ele vai instalar o Java aqui pronto instalação finalizada agora o que que a gente vai fazer a gente vai rodar aqui Java menos menos version estamos com o jdk aqui instalado não precisava ser o jdk podia ser o jre né só para ter o runtime environments aqui mas eu já instalei o
jdk porque depois eu vou precisar fazer umas outras coisas nessa máquina tá então mas se eu fosse só Executar a aplicação mesmo instalava só o jre o Java Prim environments que já bastaria Porque a gente já tá trazendo o build né o arquivo build aqui para dentro a gente não tá fazendo o build aqui dentro da nossa máquina tá deixa eu encerrar essa minha conexão então aqui vou dar um Exit encerrei a conexão e agora a gente vai copiar o nosso arquivo aqui de build que tá dentro da minha pasta target aqui na minha aplicação
Spring para dentro aqui da minha máquina do ec2 como é que a gente vai fazer isso a gente vai usar um comando aqui do terminal que é o s que é o scp tá que é o comando aqui de Copy O que que a gente vai copiar a gente vai copiar o arquivo que tá que tá dentro de ponto barra target barra e aqui né é o arquivo api p01 bar snapshop jar a gente vai copiar esse arquivo para dentro de onde eu vou copiar isso eu vou copiar para dentro lá do meu da minha
máquina virtual né dentro aqui do meu ec2 user aqui no meu IP né no meu endereço IP e aí eu vou ter que copiar isso para dentro de uma pasta lá dentro dessa máquina qual pasta eu vou copiar para dentro da pasta home então aqui barra home barra E2 user que é o meu usuário lá dentro da minha máquina virtual Então vou copiar esse arquivo lá dentro para dentro do meu ec2 beleza vamos fazer essa cópia ele vai perguntar de novo a minha senha aqui ele tá fazendo a cópia Então vamos esperar ele finalizar e
pronto com a cópia finalizada Eu Posso rodar agora o comando SSH E2 user aqui o meu @ o meu endereço de IP me conectar de novo nessa minha máquina e agora eu vou dar um LS aqui dentro para ver os arquivos que tem aqui dentro e eu tenho esse arquivo aqui API 0.0 0.1 snapshot.jar agora eu vou executar esse arquivo né que é um build aqui do Java vou executar com o comando Java menos jar passando aqui por parâmetro né o nome do arquivo ele vai iniciar a execução aqui da minha aplicação Spring se tudo
der certo né A gente já vai conseguir acessar senão a gente vai ter que corrigir algum problema que der vamos ver aqui se ele vai subir com sucesso ou se eu esqueci de alguma coisa ó ele já retornou um erro aqui que ele deu um erro ao se conectar com o meu banco de dados tá então eu devo ter esquecido de alguma coisa deixa eu dar D só uma lidinha aqui no que que aconteceu aqui provavelmente a gente esqueceu alguma regra lá no grupo de segurança Então vou voltar lá na WS aqui no meu RDS
ó no meu banco de dados aqui eventos Tech Database e aqui no regras de grupo de segurança ele tá listando só essa regra aqui de outbound tá Então na verdade eu vou ter que adicionar aqui uma regra de inbound também nesse grupo de segurança então vou ter que vir aqui e editar regras adicionar uma nova regra que é uma regra aqui de todo tráfego que vier aqui do meu Security group aqui grupos de segurança eventos Tech ec2 Então vou salvar essa regra vamos aplicar ela beleza agora se eu voltar aqui pro meu RDS deixa eu
dar um Reload ele já deveria aparecer essa segunda regra aqui ó tá aparecendo regra do ec2 Security grip in Bound então a gente consegue receber né requisições aqui desse meu ec2 lá do Security Group do meu ec2 voltando aqui pro nosso Intel Pro terminal Vamos tentar executar de novo a nossa aplicação Então deixa eu conectar aqui de novo a minha máquina né via SSH beleza e agora eu vou dar um Java menos jar no meu api Snapchat jar tá executando ó rodou as migrations com sucesso então quer dizer que ele conseguiu se conectar com o
meu banco de dados com sucesso e pronto ele tá escutando aqui na porta 8080 ó tá dando certo ó tá escutando na porta 8080 agora a gente consegue se conectar a esse nosso E2 Então vou entrar aqui em ec2 Deixa eu só copiar certinho aqui qual é o IP dele o IP público pra gente conseguir mandar uma requisição então vou abrir aqui meu insônia deixa eu colar aqui e já puxar pra nossa tela ó já colei aqui pra gente mandar uma requisição para esse IP né na porta 8080 barpi bar eventos para criar um novo
evento Então vou enviar a requisição beleza Ele criou um evento 200 Ok me trouxe aqui a Ima de URL enfim todas as informações e agora eu vou vir aqui em get All events Vou mandar uma requisição que ele não deu certo ah porque eu não troquei aqui o endereço IP correto beleza mandei aqui pro endereço IP certo e ele já me retornou aqui as informações né do do evento certinho e se a gente acessar aqui o link da imagem tá aqui a imagem lá no meu S3 funcionando tranquilamente tudo rodando aqui de boa então terminamos
aqui a criação né do Nossa aplicação e fizemos o Deploy dela na WS Ufa E chegamos no final do vídeo Conseguimos terminar a nossa aplicação e fazer o Deploy dela e deixara produtiva lá na WS e se você gosta desse estilo de conteúdo e quer aprender como fazer o Deploy da sua aplicação de uma forma mais elegante utilizando o docker Eu recomendo que você Assista esse vídeo aqui onde eu expliquei o passo a passo para você configurar o docker na sua aplicação Java tudo desde do zero se você gostou desse vídeo Não esqueça de deixar
seu like se inscrever aqui no canal e eu gostaria de aproveitar esse momento para agradecer todos os membros seniors aqui do canal pelo suporte que vocês dão pro Canal Vocês são muito especiais é isso galera e até o próximo vídeo