├── Intermediários ├── delivery-chat-bot │ ├── assets │ │ └── diagrama.png │ ├── package.json │ ├── data │ │ └── orders.json │ ├── index.js │ ├── .gitignore │ ├── src │ │ └── controllers │ │ │ ├── orderController.js │ │ │ └── messageController.js │ ├── tests │ │ ├── orderController.test.js │ │ └── messageController.test.js │ └── README.md └── chatbot-delivery-venom-bot │ ├── package.json │ ├── index.js │ └── README.md ├── Iniciantes ├── Aula 1 │ └── Bin2Dec │ │ ├── assets │ │ ├── Bin2Dec_Diagrama.png │ │ └── Conversão de Binário para Decimal.pdf │ │ ├── examples │ │ └── example_inputs.txt │ │ ├── README.md │ │ └── code │ │ └── index.html └── Aula 2 │ └── Calculator │ ├── assets │ ├── diagramaaula2.png │ └── Calculadora_Apresentacao.pptx.pdf │ ├── examples │ └── example_operations.txt │ ├── README.md │ └── code │ ├── index.html │ ├── style.css │ └── script.js └── README.md /Intermediários/delivery-chat-bot/assets/diagrama.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itamar-tech/aulas-de-programacao/HEAD/Intermediários/delivery-chat-bot/assets/diagrama.png -------------------------------------------------------------------------------- /Iniciantes/Aula 1/Bin2Dec/assets/Bin2Dec_Diagrama.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itamar-tech/aulas-de-programacao/HEAD/Iniciantes/Aula 1/Bin2Dec/assets/Bin2Dec_Diagrama.png -------------------------------------------------------------------------------- /Iniciantes/Aula 2/Calculator/assets/diagramaaula2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itamar-tech/aulas-de-programacao/HEAD/Iniciantes/Aula 2/Calculator/assets/diagramaaula2.png -------------------------------------------------------------------------------- /Iniciantes/Aula 1/Bin2Dec/assets/Conversão de Binário para Decimal.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itamar-tech/aulas-de-programacao/HEAD/Iniciantes/Aula 1/Bin2Dec/assets/Conversão de Binário para Decimal.pdf -------------------------------------------------------------------------------- /Iniciantes/Aula 2/Calculator/assets/Calculadora_Apresentacao.pptx.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itamar-tech/aulas-de-programacao/HEAD/Iniciantes/Aula 2/Calculator/assets/Calculadora_Apresentacao.pptx.pdf -------------------------------------------------------------------------------- /Intermediários/delivery-chat-bot/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "@img/sharp-win32-x64": "^0.33.4", 4 | "jest": "^29.7.0", 5 | "sharp": "^0.33.4", 6 | "venom-bot": "^5.1.0" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Intermediários/delivery-chat-bot/data/orders.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "item": "Pizza", 5 | "quantity": 1, 6 | "user": "Oi", 7 | "location": "Rua professor Jorge Luiz", 8 | "paymentMethod": "Cartão" 9 | } 10 | ] -------------------------------------------------------------------------------- /Intermediários/chatbot-delivery-venom-bot/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "botvendas", 3 | "version": "1.0.0", 4 | "description": " chat bot para delivery", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "nodemon run dev" 8 | }, 9 | "author": "itamar junior", 10 | "license": "ISC" 11 | } 12 | -------------------------------------------------------------------------------- /Iniciantes/Aula 1/Bin2Dec/examples/example_inputs.txt: -------------------------------------------------------------------------------- 1 | # Exemplos de Entradas Binárias para Testar a Aplicação Bin2Dec 2 | 3 | # Formato: = 4 | 5 | 00000001 = 1 6 | 00000010 = 2 7 | 00000100 = 4 8 | 00001000 = 8 9 | 00010000 = 16 10 | 00100000 = 32 11 | 01000000 = 64 12 | 10000000 = 128 13 | 11111111 = 255 14 | 15 | # Exemplos adicionais 16 | 17 | 00000000 = 0 18 | 00100101 = 37 19 | 01010101 = 85 20 | 01101100 = 108 21 | 10101010 = 170 22 | 11001100 = 204 23 | -------------------------------------------------------------------------------- /Iniciantes/Aula 2/Calculator/examples/example_operations.txt: -------------------------------------------------------------------------------- 1 | # Exemplos de Operações Aritméticas para Testar a Calculadora 2 | 3 | # Operações Básicas 4 | 5 + 3 = 8 5 | 10 - 4 = 6 6 | 7 * 2 = 14 7 | 20 / 5 = 4 8 | 9 | # Sequências de Operações 10 | 5 + 3 - 2 = 6 11 | 10 / 2 * 4 = 20 12 | 7 * 2 - 3 = 11 13 | 20 - 5 + 8 = 23 14 | 15 | # Operações com Limpeza Parcial 16 | 5 + 3 C 2 + 4 = 6 17 | 10 - 4 C 5 * 3 = 15 18 | 19 | # Operações com Limpeza Completa 20 | 5 + 3 AC 7 * 2 = 14 21 | 22 | # Operações Inválidas (Para Exibir 'ERR') 23 | 99999999 + 1 = ERR 24 | 100000000 / 2 = ERR 25 | 26 | # Operações com Ponto Decimal 27 | 5.5 + 3.3 = 8.8 28 | 10.0 - 4.2 = 5.8 29 | 7.1 * 2.5 = 17.75 30 | 20.4 / 5.2 = 3.923 31 | 32 | # Alterar Sinal 33 | 5 +/- = -5 34 | -7 +/- = 7 35 | 10 - 15 +/- = 25 36 | -------------------------------------------------------------------------------- /Intermediários/chatbot-delivery-venom-bot/index.js: -------------------------------------------------------------------------------- 1 | // Suporta ES6 2 | // import { create, Whatsapp } from 'venom-bot'; 3 | const venom = require('venom-bot'); 4 | 5 | venom 6 | .create({ 7 | session: 'session-name' // nome da sessão 8 | }) 9 | .then((client) => start(client)) 10 | .catch((erro) => { 11 | console.log(erro); 12 | }); 13 | 14 | function start(client) { 15 | client.onMessage((message) => { 16 | if (message.body === 'Hi' && message.isGroupMsg === false) { 17 | client 18 | .sendText(message.from, 'Welcome Venom 🕷') 19 | .then((result) => { 20 | console.log('Result: ', result); // objeto de sucesso retornado 21 | }) 22 | .catch((erro) => { 23 | console.error('Error when sending: ', erro); // objeto de erro retornado 24 | }); 25 | } 26 | }); 27 | } 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Aulas de Programação 2 | 3 | Este repositório contém uma série de aulas sobre programação. Cada aula está organizada em seu próprio diretório, contendo todos os arquivos necessários, exemplos práticos e recursos adicionais. 4 | 5 | ## Aulas Disponíveis 6 | 7 | 1. [Aula 1 - Bin2Dec](/Iniciantes/Aula%201/Bin2Dec) - Video aula no youtube - [YouTube](https://www.youtube.com/watch?v=SBlnrsM_TIg) 8 | 2. [Aula 2 - Calculator](/Iniciantes/Aula%202/Calculator) - Video aula no youtube - [YouTube](https://www.youtube.com/@itamar-tech) 9 | 10 | 3. [Aula 3 - Bot Delivery](Intermediários/delivery-chat-bot) - Video aula no youtube - [YouTube](https://www.youtube.com/@itamar-tech) 11 | ## Como Usar 12 | 13 | Cada diretório de aula contém um README.md com instruções detalhadas sobre como executar e entender o conteúdo da aula. 14 | 15 | Sinta-se à vontade para explorar e aprender! 16 | -------------------------------------------------------------------------------- /Intermediários/delivery-chat-bot/index.js: -------------------------------------------------------------------------------- 1 | const venom = require('venom-bot'); 2 | const MessageController = require('./src/controllers/messageController'); 3 | 4 | venom 5 | .create({ 6 | session: 'session-name', // Nome da sessão 7 | }) 8 | .then((client) => start(client)) 9 | .catch((erro) => { 10 | console.log('Erro na criação do Venom: ', erro); 11 | }); 12 | 13 | function start(client) { 14 | const messageController = new MessageController(); 15 | 16 | client.onMessage(async (message) => { 17 | if (!message.isGroupMsg) { // Ignora mensagens de grupo 18 | const response = messageController.handleIncomingMessage(message); 19 | 20 | if (response) { 21 | // Envia a resposta como texto 22 | await client 23 | .sendText(message.from, response) 24 | .then((result) => { 25 | console.log('Mensagem enviada: ', result); 26 | }) 27 | .catch((erro) => { 28 | console.error('Erro ao enviar mensagem: ', erro); 29 | }); 30 | } 31 | } 32 | }); 33 | } 34 | -------------------------------------------------------------------------------- /Intermediários/delivery-chat-bot/.gitignore: -------------------------------------------------------------------------------- 1 | # Node.js 2 | 3 | # Diretórios e arquivos de dependências 4 | node_modules/ 5 | npm-debug.log* 6 | yarn-debug.log* 7 | yarn-error.log* 8 | 9 | # Logs 10 | logs/ 11 | *.log 12 | npm-debug.log* 13 | yarn-debug.log* 14 | yarn-error.log* 15 | lerna-debug.log* 16 | 17 | # Diretórios de ambiente 18 | .env 19 | .env.test 20 | .env.production 21 | 22 | # Sistema de arquivos operacionais 23 | .DS_Store 24 | Thumbs.db 25 | 26 | # Diretórios de builds e pacotes 27 | dist/ 28 | build/ 29 | coverage/ 30 | .tmp/ 31 | .cache/ 32 | 33 | # Diretórios de IDEs 34 | .idea/ 35 | .vscode/ 36 | *.swp 37 | *.swo 38 | *.swn 39 | *.swm 40 | 41 | # Configurações e dependências de containers 42 | docker-compose.override.yml 43 | docker-compose.local.yml 44 | .Dockerfile 45 | 46 | # Diretórios e arquivos de testes 47 | __tests__/ 48 | __mocks__/ 49 | coverage/ 50 | .nyc_output/ 51 | jest-config.js 52 | cypress/ 53 | cypress.json 54 | test-results/ 55 | .vscode-test/ 56 | 57 | # Configurações específicas de sistema 58 | *.local 59 | *.lock 60 | 61 | # Sentry environment files 62 | .sentryclirc 63 | 64 | # Configurações de pacotes 65 | package-lock.json 66 | yarn.lock 67 | 68 | # Arquivos temporários e backup 69 | *.bak 70 | *.tmp 71 | *.temp 72 | *.log 73 | 74 | # Editorconfig 75 | .editorconfig 76 | -------------------------------------------------------------------------------- /Intermediários/delivery-chat-bot/src/controllers/orderController.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const path = require('path'); 3 | 4 | class OrderController { 5 | constructor() { 6 | this.ordersFilePath = path.join(__dirname, '../../data/orders.json'); // Caminho corrigido 7 | } 8 | 9 | createOrder(orderDetails) { 10 | const orders = this._getAllOrders(); 11 | const newOrder = { id: orders.length + 1, ...orderDetails }; 12 | orders.push(newOrder); 13 | this._saveOrders(orders); 14 | return newOrder; 15 | } 16 | 17 | getOrderById(orderId) { 18 | const orders = this._getAllOrders(); 19 | return orders.find(order => order.id === orderId) || null; 20 | } 21 | 22 | _getAllOrders() { 23 | try { 24 | if (!fs.existsSync(this.ordersFilePath)) { 25 | // Se o arquivo não existir, cria um arquivo vazio e retorna um array vazio 26 | this._saveOrders([]); 27 | return []; 28 | } 29 | const ordersData = fs.readFileSync(this.ordersFilePath, 'utf8'); 30 | if (!ordersData) { 31 | // Se o arquivo estiver vazio, retorna um array vazio 32 | return []; 33 | } 34 | return JSON.parse(ordersData); 35 | } catch (error) { 36 | console.error('Erro ao ler o arquivo orders.json:', error); 37 | return []; // Retorna um array vazio em caso de erro 38 | } 39 | } 40 | 41 | _saveOrders(orders) { 42 | try { 43 | fs.writeFileSync(this.ordersFilePath, JSON.stringify(orders, null, 2)); 44 | } catch (error) { 45 | console.error('Erro ao salvar o arquivo orders.json:', error); 46 | } 47 | } 48 | } 49 | 50 | module.exports = OrderController; 51 | -------------------------------------------------------------------------------- /Intermediários/delivery-chat-bot/tests/orderController.test.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const path = require('path'); 3 | const OrderController = require('../src/controllers/orderController'); 4 | 5 | jest.mock('fs'); 6 | 7 | describe('OrderController', () => { 8 | let orderController; 9 | const mockOrders = [ 10 | { id: 1, item: 'Pizza', quantity: 1, user: 'Teste', location: 'Minha localização', paymentMethod: 'Cartão' }, 11 | { id: 2, item: 'Hamburguer', quantity: 2, user: 'Outro', location: 'Outro local', paymentMethod: 'Dinheiro' } 12 | ]; 13 | 14 | beforeEach(() => { 15 | orderController = new OrderController(); 16 | fs.existsSync.mockReturnValue(true); 17 | fs.readFileSync.mockReturnValue(JSON.stringify(mockOrders)); 18 | }); 19 | 20 | afterEach(() => { 21 | jest.clearAllMocks(); 22 | }); 23 | 24 | test('Deve criar um novo pedido e salvar no arquivo', () => { 25 | const newOrderDetails = { 26 | item: 'Refrigerante', 27 | quantity: 3, 28 | user: 'Novo Usuário', 29 | location: 'Novo local', 30 | paymentMethod: 'Cartão' 31 | }; 32 | 33 | const newOrder = orderController.createOrder(newOrderDetails); 34 | 35 | expect(newOrder).toEqual({ 36 | id: mockOrders.length + 1, 37 | ...newOrderDetails 38 | }); 39 | 40 | const expectedFilePath = path.join(__dirname, '../data/orders.json'); // Caminho relativo a partir do diretório de testes 41 | expect(fs.writeFileSync).toHaveBeenCalledWith( 42 | expectedFilePath, 43 | JSON.stringify([...mockOrders, newOrder], null, 2) 44 | ); 45 | }); 46 | 47 | test('Deve salvar os pedidos no arquivo', () => { 48 | orderController._saveOrders(mockOrders); 49 | const expectedFilePath = path.join(__dirname, '../data/orders.json'); // Caminho relativo a partir do diretório de testes 50 | expect(fs.writeFileSync).toHaveBeenCalledWith( 51 | expectedFilePath, 52 | JSON.stringify(mockOrders, null, 2) 53 | ); 54 | }); 55 | }); 56 | -------------------------------------------------------------------------------- /Intermediários/chatbot-delivery-venom-bot/README.md: -------------------------------------------------------------------------------- 1 | # Chatbot de Delivery com Venom Bot - Aula 1 2 | 3 | Este repositório contém o código inicial para o projeto do Chatbot de Delivery usando o Venom Bot. Nesta primeira aula, configuraremos o ambiente de desenvolvimento e criaremos o primeiro script para conectar o bot ao WhatsApp. 4 | 5 | ## Pré-requisitos 6 | 7 | Antes de começar, você precisará ter os seguintes softwares instalados em sua máquina: 8 | 9 | - [Node.js](https://nodejs.org/en/) (versão LTS recomendada) 10 | - [npm](https://www.npmjs.com/get-npm) (gerenciador de pacotes do Node.js) 11 | - [Visual Studio Code](https://code.visualstudio.com/) ou outro editor de código de sua preferência 12 | 13 | ## Passos para Configuração 14 | 15 | 1. **Clone o Repositório:** 16 | 17 | Clone este repositório na sua máquina local: 18 | ```bash 19 | git clone https://github.com/seu-usuario/chatbot-delivery-venom-bot.git 20 | cd chatbot-delivery-venom-bot 21 | Instale as Dependências: 22 | 23 | Navegue até o diretório do projeto e instale o Venom Bot: 24 | 25 | bash 26 | Copiar código 27 | npm install venom-bot 28 | Crie o Script Inicial: 29 | 30 | Crie um arquivo chamado index.js no diretório raiz do projeto e adicione o seguinte código: 31 | 32 | javascript 33 | Copiar código 34 | // Suporta ES6 35 | // import { create, Whatsapp } from 'venom-bot'; 36 | const venom = require('venom-bot'); 37 | 38 | venom 39 | .create({ 40 | session: 'session-name' // nome da sessão 41 | }) 42 | .then((client) => start(client)) 43 | .catch((erro) => { 44 | console.log(erro); 45 | }); 46 | 47 | function start(client) { 48 | client.onMessage((message) => { 49 | if (message.body === 'Hi' && message.isGroupMsg === false) { 50 | client 51 | .sendText(message.from, 'Welcome Venom 🕷') 52 | .then((result) => { 53 | console.log('Result: ', result); // objeto de sucesso retornado 54 | }) 55 | .catch((erro) => { 56 | console.error('Error when sending: ', erro); // objeto de erro retornado 57 | }); 58 | } 59 | }); 60 | } 61 | Execute o Bot: 62 | 63 | Para rodar o bot, use o seguinte comando no terminal: 64 | 65 | bash 66 | Copiar código 67 | node index.js 68 | Isso iniciará o Venom Bot e aguardará por mensagens. Quando alguém enviar "Hi" no WhatsApp, o bot responderá com "Welcome Venom 🕷". Certifique-se de que o número do WhatsApp esteja configurado corretamente. 69 | 70 | Solucionando Problemas: 71 | 72 | Se encontrar algum erro, verifique o console para mensagens de erro e certifique-se de que o WhatsApp Web está funcionando corretamente. 73 | 74 | Próximos Passos 75 | Na próxima aula, vamos implementar a saudação inicial e começar a coletar as informações básicas do usuário. Continue acompanhando o curso para aprender como construir um chatbot completo de delivery! 76 | 77 | Referências 78 | Documentação do Venom Bot -------------------------------------------------------------------------------- /Iniciantes/Aula 1/Bin2Dec/README.md: -------------------------------------------------------------------------------- 1 | # Bin2Dec: Conversão de Binário para Decimal 2 | 3 | Esta aula ensina como criar uma aplicação web simples que converte números binários em decimais. 4 | 5 | ## Arquivos 6 | 7 | - `code/`: Contém os arquivos HTML, CSS e JavaScript necessários para a aplicação. 8 | - `assets/`: Contém recursos adicionais, como a apresentação em PowerPoint. 9 | - `examples/`: Contém exemplos de entradas binárias para testar a aplicação. 10 | 11 | ## Como Usar 12 | 13 | 1. Abra o arquivo `index.html` no seu navegador para ver a aplicação em ação. 14 | 2. Use o campo de entrada para digitar números binários e clique em "Converter" para ver o resultado decimal. 15 | 3. Consulte a apresentação em PowerPoint (`assets/Bin2Dec_Apresentacao.pptx`) para uma explicação detalhada. 16 | 17 | ## Recursos Adicionais 18 | 19 | - [Documentação do JavaScript `parseInt`](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/parseInt) 20 | - [Sistema numérico binário](https://pt.wikipedia.org/wiki/Sistema_de_numera%C3%A7%C3%A3o_bin%C3%A1rio) 21 | 22 | ## Desafio: Conversão de Decimal para Binário 23 | 24 | Agora que você aprendeu a converter números binários para decimais, vamos praticar o processo inverso: converter números decimais para binários. Este desafio é uma ótima maneira de reforçar seu entendimento sobre os sistemas numéricos binários e decimais. 25 | 26 | ### Objetivo 27 | 28 | Crie uma aplicação web que permita ao usuário inserir um número decimal e, ao clicar em um botão, exiba o equivalente binário desse número. 29 | 30 | ### Requisitos 31 | 32 | 1. **Entrada do Usuário**: Permitir que o usuário insira um número decimal em um campo de entrada. 33 | 2. **Validação**: Notificar o usuário se a entrada não for um número válido. 34 | 3. **Conversão**: Converter o número decimal inserido para binário. 35 | 4. **Exibição do Resultado**: Exibir o número binário convertido em um campo de saída. 36 | 37 | ### Histórias de Usuário 38 | 39 | 1. **Usuário**: Pode inserir um número decimal em um campo de entrada. 40 | 2. **Usuário**: Deve ser notificado se algo diferente de um número válido for inserido. 41 | 3. **Usuário**: Visualiza os resultados em um único campo de saída contendo o equivalente binário (base 2) do número decimal que foi inserido. 42 | 43 | ### Dicas 44 | 45 | - Utilize a função JavaScript `toString(2)` para converter um número decimal em binário. 46 | - Certifique-se de validar a entrada do usuário para garantir que é um número decimal válido antes de fazer a conversão. 47 | - Pesquise sobre manipulação de strings e números em JavaScript para auxiliar na implementação. 48 | 49 | ### Recursos Úteis 50 | 51 | - [Documentação do JavaScript `toString`](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Number/toString) 52 | - [Validação de Entradas em JavaScript](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Guide/Regular_Expressions) 53 | - [Conversão de Decimal para Binário](https://pt.wikihow.com/Converter-Decimal-para-Bin%C3%A1rio) 54 | 55 | Boa sorte e divirta-se com o desafio! 56 | -------------------------------------------------------------------------------- /Intermediários/delivery-chat-bot/README.md: -------------------------------------------------------------------------------- 1 | # Sistema de Pedidos com Venom Bot 2 | 3 | Este projeto implementa um sistema de pedidos automatizado utilizando o `venom-bot` para interações via WhatsApp. Ele permite que os usuários façam pedidos, visualizem pedidos existentes e cancelem pedidos através de um fluxo de mensagens. 4 | 5 | ## Índice 6 | 7 | - [Instalação](#instalação) 8 | - [Uso](#uso) 9 | - [Estrutura do Código](#estrutura-do-código) 10 | - [Contribuição](#contribuição) 11 | - [Licença](#licença) 12 | 13 | ## Instalação 14 | 15 | ### Pré-requisitos 16 | 17 | Antes de começar, você precisará ter o Node.js instalado em sua máquina. Você pode baixá-lo [aqui](https://nodejs.org/). 18 | 19 | ### Passos de Instalação 20 | 21 | 1. Clone o repositório: 22 | 23 | ```bash 24 | git clone https://github.com/seu-usuario/venom-bot-sistema-pedidos.git 25 | cd venom-bot-sistema-pedidos 26 | ``` 27 | 28 | 2. Instale as dependências do projeto: 29 | 30 | ```bash 31 | npm install 32 | ``` 33 | 34 | 3. Crie a estrutura de diretórios e o arquivo de pedidos: 35 | 36 | ```bash 37 | mkdir -p data 38 | echo "[]" > data/orders.json 39 | ``` 40 | 41 | ## Uso 42 | 43 | ### Inicializando o Bot 44 | 45 | Para iniciar o sistema de pedidos: 46 | 47 | 1. Execute o comando abaixo para iniciar o Venom Bot: 48 | 49 | ```bash 50 | npm start 51 | ``` 52 | 53 | 2. Escaneie o QR code que será exibido no terminal usando o WhatsApp para conectar a sessão. 54 | 55 | 3. O bot estará pronto para interagir com os usuários através do WhatsApp. 56 | 57 | ### Fluxo de Interação 58 | 59 | - **Passo 1:** O bot solicita o nome do usuário. 60 | - **Passo 2:** Apresenta um menu com opções para fazer um pedido, ver pedidos existentes ou sair. 61 | - **Passo 3:** No caso de um pedido, o usuário escolhe um item do cardápio e define a forma de pagamento. 62 | - **Passo 4:** O usuário fornece o endereço para entrega e o pedido é registrado. 63 | 64 | ## Estrutura do Código 65 | 66 | O projeto está estruturado da seguinte forma: 67 | 68 | - `src/controllers/orderController.js`: Controla a criação e a recuperação dos pedidos armazenados em um arquivo JSON. 69 | - `src/controllers/messageController.js`: Gerencia a lógica de interação com o usuário, processando as mensagens recebidas e respondendo de acordo com o fluxo definido. 70 | - `index.js`: Arquivo principal que inicializa o bot e gerencia a sessão do Venom Bot. 71 | 72 | ### Arquivo `orderController.js` 73 | 74 | - **createOrder(orderDetails):** Cria um novo pedido e o salva em um arquivo JSON. 75 | - **getOrderById(orderId):** Recupera um pedido específico pelo ID. 76 | - **_getAllOrders():** Retorna todos os pedidos armazenados. 77 | - **_saveOrders(orders):** Salva os pedidos em um arquivo JSON. 78 | 79 | ### Arquivo `messageController.js` 80 | 81 | - **handleIncomingMessage(message):** Processa a mensagem recebida e define a próxima etapa da interação. 82 | - **_createMenuOptions():** Gera o menu de opções para o usuário. 83 | - **_getMenuItem(option):** Retorna o item de menu selecionado pelo usuário. 84 | - **_getPaymentMethod(option):** Retorna a forma de pagamento escolhida. 85 | - **_viewOrders(userId):** Exibe os pedidos existentes do usuário. 86 | - **_generateOrderNumber():** Gera um número de pedido aleatório. 87 | 88 | ### Arquivo `index.js` 89 | 90 | Este arquivo inicializa o Venom Bot e define a lógica para ouvir e responder às mensagens. 91 | 92 | ## Contribuição 93 | 94 | Contribuições são bem-vindas! Para contribuir, por favor, faça um fork do repositório, crie uma nova branch com suas melhorias e envie um pull request. 95 | 96 | -------------------------------------------------------------------------------- /Iniciantes/Aula 1/Bin2Dec/code/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Bin2Dec Aula 01 7 | 58 | 59 | 60 |
61 |

Bin2Dec

62 | 63 | 64 |
65 |
66 | 67 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /Iniciantes/Aula 2/Calculator/README.md: -------------------------------------------------------------------------------- 1 | # 📟 Calculadora Básica em JavaScript 2 | 3 | Este projeto ensina como criar uma aplicação web simples que realiza cálculos aritméticos básicos em números inteiros. 4 | 5 | ## Arquivos 6 | 7 | - `code/`: Contém os arquivos HTML, CSS e JavaScript necessários para a aplicação. 8 | - `assets/`: Contém recursos adicionais, como a apresentação em PowerPoint. 9 | - `examples/`: Contém exemplos de operações aritméticas para testar a aplicação. 10 | 11 | ## Como Usar 12 | 13 | 1. Abra o arquivo `index.html` no seu navegador para ver a aplicação em ação. 14 | 2. Use o teclado de entrada para digitar números e operadores e clique nos botões para ver os resultados. 15 | 3. Consulte a apresentação em PowerPoint (`assets/Calculadora_Apresentacao.pptx`) para uma explicação detalhada. 16 | 17 | ## Recursos Adicionais 18 | 19 | - [Documentação do JavaScript `parseInt`](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/parseInt) 20 | - [Introdução ao JavaScript](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Guide/Introduction) 21 | 22 | ## Desafio: Calculadora Científica 23 | 24 | Agora que você aprendeu a criar uma calculadora básica, vamos praticar adicionando funcionalidades mais avançadas para transformá-la em uma calculadora científica. Este desafio é uma ótima maneira de reforçar seu entendimento sobre interfaces de usuário e lógica de programação. 25 | 26 | ### Objetivo 27 | 28 | Crie uma aplicação web que permita ao usuário realizar operações matemáticas avançadas, como funções trigonométricas, logaritmos e exponenciação. 29 | 30 | ### Requisitos 31 | 32 | 1. **Histórico de Operações**: Adicione uma seção que exiba o histórico das últimas operações realizadas. 33 | 2. **Funções Científicas**: Adicione botões e lógica para funções matemáticas mais complexas, como seno, cosseno, tangente, logaritmo e exponenciação. 34 | 3. **Modo Noturno**: Adicione uma opção para alternar entre modo claro e modo escuro, melhorando a experiência do usuário. 35 | 36 | ### Histórias de Usuário 37 | 38 | 1. **Usuário**: Pode realizar operações matemáticas básicas e avançadas. 39 | 2. **Usuário**: Pode ver o histórico das últimas operações realizadas. 40 | 3. **Usuário**: Pode alternar entre modo claro e modo escuro para uma melhor experiência de uso. 41 | 42 | ### Dicas 43 | 44 | - Utilize a função JavaScript `Math` para realizar operações matemáticas avançadas. 45 | - Certifique-se de validar a entrada do usuário para garantir que são números válidos antes de fazer a conversão. 46 | - Pesquise sobre manipulação de DOM em JavaScript para auxiliar na implementação das novas funcionalidades. 47 | 48 | ### Recursos Úteis 49 | 50 | - [Documentação do JavaScript `Math`](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Math) 51 | - [Manipulação de DOM em JavaScript](https://developer.mozilla.org/pt-BR/docs/Web/API/Document_Object_Model/Introduction) 52 | - [Funções Matemáticas em JavaScript](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Guide/Numbers_and_dates#Mathematical_functions) 53 | - [Tutorial de JavaScript para Iniciantes](https://www.w3schools.com/js/) 54 | - [Guia de CSS Flexbox](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) 55 | 56 | 57 | Boa sorte e divirta-se com o desafio! 58 | 59 | --- 60 | 61 | 🔗 **Links Importantes:** 62 | 63 | - 🌐 [LinkedIn](https://www.linkedin.com/in/itamar-junior-92965216b/) 64 | - 📸 [Instagram](https://www.instagram.com/itamar_tech/) 65 | - 💻 [GitHub](https://github.com/itamar-tech/aulas-de-programacao) 66 | - 📺 [YouTube](https://www.youtube.com/@itamar-tech) 67 | 68 | --- 69 | 70 | **#ProgramaçãoParaIniciantes #CalculadoraJavaScript #ProjetosPráticos #ItamarTech #AprenderProgramação #DesafioDeProgramação #InterfaceDeUsuário #DesenvolvimentoWeb** 71 | Comandos para Criar e Adicionar os Arquivos ao Repositório 72 | -------------------------------------------------------------------------------- /Iniciantes/Aula 2/Calculator/code/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | Calculadora Básica 14 | 15 | 16 | 17 |
18 | 27 |
28 | 35 |
36 |
37 |
38 |
39 |
40 |
41 | 42 |
43 |
AC
44 |
C
45 |
%
46 |
/
47 |
7
48 |
8
49 |
9
50 |
x
51 |
4
52 |
5
53 |
6
54 |
-
55 |
1
56 |
2
57 |
3
58 |
+
59 |
0
60 |
.
61 |
=
62 |
63 |
64 | 65 | 66 | 67 | 68 | 74 | 75 | -------------------------------------------------------------------------------- /Iniciantes/Aula 2/Calculator/code/style.css: -------------------------------------------------------------------------------- 1 | * { 2 | box-sizing: border-box; 3 | } 4 | 5 | a { 6 | color: #242529; 7 | text-decoration: none; 8 | } 9 | 10 | a:visited { 11 | color: #242529; 12 | text-decoration: none; 13 | } 14 | 15 | a:hover { 16 | color: #73cee6; 17 | } 18 | 19 | body { 20 | font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif; 21 | transition: background-color 0.3s, color 0.3s; 22 | } 23 | 24 | body.light-theme { 25 | background-color: #ffffff; 26 | color: #000000; 27 | } 28 | 29 | body.dark-theme { 30 | background-color: #121212; 31 | color: #ffffff; 32 | } 33 | 34 | .header { 35 | display: flex; 36 | justify-content: space-between; 37 | align-items: center; 38 | padding: 2px; 39 | } 40 | 41 | .title-links { 42 | display: flex; 43 | align-items: center; 44 | } 45 | 46 | .title-links h1 { 47 | margin-right: 20px; 48 | } 49 | 50 | .links a { 51 | margin: 0 10px; 52 | font-size: 24px; 53 | } 54 | 55 | .calculator-container { 56 | display: flex; 57 | justify-content: center; 58 | align-items: center; 59 | height: calc(100vh - 250px); 60 | } 61 | 62 | .calculator { 63 | width: 310px; 64 | } 65 | 66 | .numeric { 67 | width: 60px; 68 | height: 60px; 69 | display: inline-block; 70 | background: #191a1c; 71 | color: #969ea5; 72 | font-size: 30px; 73 | text-align: center; 74 | vertical-align: middle !important; 75 | margin: 6px; 76 | padding-top: 15px; 77 | cursor: pointer; 78 | transition: background 0.3s, color 0.3s; 79 | } 80 | 81 | .numeric:active { 82 | background: #f0f0f5 !important; 83 | color: #191a1c !important; 84 | 85 | } 86 | 87 | .zero { 88 | width: 135px !important; 89 | } 90 | 91 | .action { 92 | background: #242529; 93 | } 94 | 95 | .result { 96 | background: #267e94 !important; 97 | } 98 | 99 | .visor { 100 | width: 100%; 101 | height: 80px; 102 | margin: 10px auto; 103 | background: #f6f7fa; 104 | padding: 10px; 105 | box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1); 106 | text-align: right; 107 | display: flex; 108 | flex-direction: column; 109 | justify-content: center; 110 | } 111 | 112 | body.light-theme .visor { 113 | background: #ffffff; 114 | } 115 | 116 | .total { 117 | color: #242529; 118 | font-size: 30px; 119 | } 120 | 121 | .acc { 122 | color: #c5c5c5; 123 | font-size: 16px; 124 | } 125 | 126 | body.light-theme .acc { 127 | color: #7a7a7a; 128 | } 129 | 130 | 131 | 132 | .theme-toggle { 133 | display: flex; 134 | align-items: center; 135 | } 136 | 137 | .switch { 138 | position: relative; 139 | display: inline-block; 140 | width: 60px; 141 | height: 34px; 142 | } 143 | 144 | .switch input { 145 | opacity: 0; 146 | width: 0; 147 | height: 0; 148 | } 149 | 150 | .slider { 151 | position: absolute; 152 | cursor: pointer; 153 | top: 0; 154 | left: 0; 155 | right: 0; 156 | bottom: 0; 157 | background-color: #ccc; 158 | transition: .4s; 159 | border-radius: 34px; 160 | } 161 | 162 | .slider:before { 163 | position: absolute; 164 | content: ""; 165 | height: 26px; 166 | width: 26px; 167 | left: 5px; 168 | bottom: 4px; 169 | background-color: white; 170 | transition: .4s; 171 | border-radius: 50%; 172 | display: flex; 173 | justify-content: center; 174 | align-items: center; 175 | } 176 | 177 | input:checked + .slider { 178 | background-color: #73cee6; 179 | } 180 | 181 | input:checked + .slider:before { 182 | transform: translateX(26px); 183 | } 184 | 185 | .icon { 186 | position: absolute; 187 | font-size: 20px; 188 | } 189 | 190 | input:checked + .slider .moon { 191 | right: 5px; 192 | display: block; 193 | } 194 | 195 | input:not(:checked) + .slider .sun { 196 | left: 5px; 197 | display: block; 198 | } 199 | 200 | .slider .sun, 201 | .slider .moon { 202 | display: none; 203 | } 204 | 205 | 206 | 207 | footer { 208 | text-align: center; 209 | padding: 10px; 210 | background-color: #f8f9fa; 211 | box-shadow: 0 -2px 5px rgba(0, 0, 0, 0.1); 212 | position: absolute; 213 | bottom: 0; 214 | width: 100%; 215 | } 216 | 217 | footer p { 218 | margin: 10px 0; 219 | font-size: 16px; 220 | } 221 | 222 | footer a { 223 | color: #242529; 224 | text-decoration: none; 225 | margin: 0 10px; 226 | font-size: 18px; 227 | display: inline-flex; 228 | align-items: center; 229 | transition: color 0.3s; 230 | } 231 | 232 | footer a:hover { 233 | color: #73cee6; 234 | } 235 | 236 | footer a i { 237 | margin-right: 8px; 238 | font-size: 20px; 239 | } 240 | -------------------------------------------------------------------------------- /Iniciantes/Aula 2/Calculator/code/script.js: -------------------------------------------------------------------------------- 1 | // Array que guarda os números e as ações (+, -, *, /) para processamento 2 | let count = []; 3 | // Variável que salva a última ação (operação) executada 4 | let saveAction; 5 | // Constante que define o número máximo de caracteres que podem ser exibidos no visor 6 | const MAX_VISOR_CHAR = 10; 7 | 8 | // Função chamada quando um número é adicionado ao visor 9 | function AddNumber(num) { 10 | const totalElement = document.getElementById("total"); 11 | // Exibe o visor se estiver oculto 12 | totalElement.removeAttribute("hidden"); 13 | // Adiciona o número ao visor se o limite de caracteres não for excedido 14 | if (totalElement.innerHTML.length < MAX_VISOR_CHAR) { 15 | totalElement.innerHTML += num; 16 | } 17 | } 18 | 19 | // Função chamada quando uma ação (operação) é selecionada (+, -, *, /) 20 | function CalcAction(action) { 21 | const currentNumber = document.getElementById("total").innerHTML; 22 | // Retorna se não houver número no visor 23 | if (currentNumber.length === 0) return; 24 | 25 | // Adiciona o número atual ao array 'count' 26 | count.push(Number(currentNumber)); 27 | const accumulator = document.getElementById("accumulator"); 28 | 29 | // Adiciona o número e a ação ao acumulador, garantindo que um ponto final seja tratado corretamente 30 | if (currentNumber.endsWith('.')) { 31 | accumulator.innerHTML += ` ${currentNumber}0 ${action}`; 32 | } else { 33 | accumulator.innerHTML += ` ${currentNumber} ${action}`; 34 | } 35 | 36 | // Limpa o visor para entrada do próximo número 37 | document.getElementById("total").innerHTML = ""; 38 | // Adiciona a ação ao array 'count' 39 | count.push(action); 40 | } 41 | 42 | // Função para adicionar uma vírgula (ponto decimal) ao número atual no visor 43 | function AddComma() { 44 | const currentNumber = document.getElementById("total").innerHTML; 45 | if (currentNumber === '') { 46 | // Se o visor estiver vazio, inicia com '0.' 47 | document.getElementById("total").innerHTML = "0."; 48 | } else if (!currentNumber.includes(".")) { 49 | // Se não houver vírgula, adiciona uma ao número 50 | document.getElementById("total").innerHTML += "."; 51 | } 52 | } 53 | 54 | // Função chamada quando o botão de resultado (=) é pressionado 55 | function Result() { 56 | const accumulator = document.getElementById("accumulator"); 57 | const total = document.getElementById("total"); 58 | 59 | // Se o resultado anterior foi mostrado, repete a última ação com o número atual 60 | if (accumulator.innerHTML.endsWith("=") && total.innerHTML.length > 0) { 61 | total.innerHTML = ProcessAction(Number(total.innerHTML), Number(total.innerHTML), saveAction).toString().substring(0, MAX_VISOR_CHAR); 62 | } 63 | 64 | // Se não houver operações a serem processadas, retorna 65 | if (count.length === 0) return; 66 | 67 | // Adiciona o número atual ao array 'count' e processa o resultado final 68 | count.push(Number(total.innerHTML)); 69 | accumulator.innerHTML += ` ${total.innerHTML} =`; 70 | ProccessResult(); 71 | } 72 | 73 | // Função que processa o cálculo baseado nos valores e ações armazenados em 'count' 74 | function ProccessResult() { 75 | let action = null; 76 | let current = null; 77 | let total = 0; 78 | 79 | // Remove qualquer ação final não necessária do array 80 | if (isNaN(count[count.length - 1])) { 81 | count.pop(); 82 | } 83 | 84 | // Itera através de 'count' para calcular o total 85 | count.forEach(n => { 86 | if (!isNaN(n)) { 87 | // Se 'current' estiver vazio, armazena o número atual 88 | if (current === null) { 89 | current = n; 90 | } else { 91 | // Realiza a operação com o número atual e o acumulado 92 | total += ProcessAction(current, n, action); 93 | current = null; 94 | } 95 | } else { 96 | // Armazena a ação atual 97 | action = n; 98 | saveAction = n; 99 | } 100 | }); 101 | 102 | // Se ainda houver um número pendente, processa a última operação 103 | if (current !== null) { 104 | total = ProcessAction(total, current, action); 105 | } 106 | 107 | // Exibe o total calculado no visor e reinicializa 'count' 108 | document.getElementById("total").innerHTML = total.toString().substring(0, MAX_VISOR_CHAR); 109 | count = []; 110 | } 111 | 112 | // Função que realiza a operação matemática baseada na ação selecionada 113 | function ProcessAction(num1, num2, action) { 114 | switch (action) { 115 | case '+': return num1 + num2; 116 | case '-': return num1 - num2; 117 | case 'x': return num1 * num2; 118 | case '/': return num1 / num2; 119 | } 120 | } 121 | 122 | // Função que limpa apenas a entrada atual no visor 123 | function CleanCurrentEntry() { 124 | document.getElementById("total").innerHTML = ""; 125 | } 126 | 127 | // Função que limpa toda a calculadora, incluindo o acumulador e o visor 128 | function CleanAll() { 129 | document.getElementById("total").innerHTML = ""; 130 | document.getElementById("accumulator").innerHTML = ""; 131 | count = []; 132 | } 133 | 134 | // Função que calcula a porcentagem do número atual no visor 135 | function Percentage() { 136 | const total = document.getElementById("total"); 137 | if (total.innerHTML !== "") { 138 | total.innerHTML = (Number(total.innerHTML) / 100).toString().substring(0, MAX_VISOR_CHAR); 139 | } 140 | } 141 | 142 | // Função que alterna o tema da calculadora entre claro e escuro 143 | function toggleTheme() { 144 | document.body.classList.toggle("dark-theme"); 145 | } 146 | -------------------------------------------------------------------------------- /Intermediários/delivery-chat-bot/src/controllers/messageController.js: -------------------------------------------------------------------------------- 1 | const OrderController = require('./orderController'); 2 | 3 | class MessageController { 4 | constructor() { 5 | this.sessions = {}; // Inicializa as sessões 6 | this.orderController = new OrderController(); // Instancia o OrderController 7 | } 8 | 9 | handleIncomingMessage(message) { 10 | const userId = message.from; 11 | if (!this.sessions[userId]) { 12 | this.sessions[userId] = { step: 'getName' }; // Inicializa a sessão e define o primeiro passo 13 | } 14 | 15 | const userSession = this.sessions[userId]; 16 | 17 | try { 18 | if (userSession.step === 'getName') { 19 | userSession.name = message.body; 20 | userSession.step = 'menu'; // Avança para o próximo passo 21 | return `Olá, ${userSession.name}! Como posso te ajudar? Digite:\n1️⃣ para Fazer Pedido\n2️⃣ para Ver Meus Pedidos\n3️⃣ para Cancelar Pedido\n0️⃣ para Sair`; 22 | } 23 | 24 | if (userSession.step === 'menu') { 25 | if (message.body === '1') { 26 | userSession.step = 'selectItem'; 27 | return this._createMenuOptions(); 28 | } else if (message.body === '2') { 29 | userSession.step = 'viewOrders'; 30 | return this._viewOrders(userId); 31 | } else if (message.body === '3') { 32 | userSession.step = 'cancelOrder'; 33 | return '⚠️ Nenhum pedido em andamento para cancelar.'; 34 | } else if (message.body === '0') { 35 | delete this.sessions[userId]; 36 | return '👋 Atendimento encerrado. Obrigado por usar nossos serviços!'; 37 | } else { 38 | return '❌ Opção inválida. Por favor, digite 1, 2, 3 ou 0.'; 39 | } 40 | } else if (userSession.step === 'selectItem') { 41 | const item = this._getMenuItem(message.body); 42 | if (item) { 43 | userSession.order = { item, quantity: 1 }; 44 | userSession.step = 'getPaymentMethod'; 45 | return `Você escolheu *${item}*.\nComo deseja pagar? Digite:\n1️⃣ para Cartão 💳\n2️⃣ para Dinheiro 💵\n0️⃣ para Sair`; 46 | } else if (message.body === '0') { 47 | delete this.sessions[userId]; 48 | return '👋 Atendimento encerrado. Obrigado por usar nossos serviços!'; 49 | } 50 | return `❌ Opção inválida. Por favor, selecione um item do cardápio.`; 51 | } else if (userSession.step === 'getPaymentMethod') { 52 | const paymentMethod = this._getPaymentMethod(message.body); 53 | if (paymentMethod) { 54 | userSession.paymentMethod = paymentMethod; 55 | userSession.step = 'getAddress'; 56 | return '🏠 Por favor, envie o nome do seu endereço para entrega.\n0️⃣ para Sair'; 57 | } else if (message.body === '0') { 58 | delete this.sessions[userId]; 59 | return '👋 Atendimento encerrado. Obrigado por usar nossos serviços!'; 60 | } 61 | return '❌ Forma de pagamento inválida. Por favor, escolha 1 para Cartão ou 2 para Dinheiro.'; 62 | } else if (userSession.step === 'getAddress') { 63 | if (message.body === '0') { 64 | delete this.sessions[userId]; 65 | return '👋 Atendimento encerrado. Obrigado por usar nossos serviços!'; 66 | } 67 | 68 | // Registra o endereço fornecido pelo usuário 69 | userSession.location = message.body || 'Endereço não fornecido'; 70 | 71 | // Gera o pedido e prossegue. 72 | const order = this.orderController.createOrder({ 73 | item: userSession.order.item, 74 | quantity: userSession.order.quantity, 75 | user: userSession.name, 76 | location: userSession.location, 77 | paymentMethod: userSession.paymentMethod, 78 | }); 79 | const orderNumber = this._generateOrderNumber(); 80 | delete this.sessions[userId]; // Reseta a sessão após o pedido 81 | return `✅ Pedido criado com sucesso!\n📝 *Resumo:*\n🍔 Item: ${order.item}\n🔢 Quantidade: ${order.quantity}\n💳 Forma de Pagamento: ${order.paymentMethod}\n🏠 Endereço: ${order.location}\n📞 Número do Pedido: *${orderNumber}*\n🚚 Obrigado, ${order.user}! Seu pedido será entregue em breve.`; 82 | } 83 | } catch (error) { 84 | console.error('Erro ao processar mensagem:', error); 85 | return '❌ Houve um erro ao processar sua solicitação. Por favor, tente novamente.'; 86 | } 87 | 88 | return '❌ Comando não reconhecido. Por favor, escolha uma opção do menu.'; 89 | } 90 | 91 | _createMenuOptions() { 92 | return `🍽️ Escolha um item do cardápio:\n1️⃣ para Pizza 🍕\n2️⃣ para Hamburguer 🍔\n3️⃣ para Refrigerante 🥤\n0️⃣ para Sair`; 93 | } 94 | 95 | _getMenuItem(option) { 96 | const menu = { 97 | '1': 'Pizza', 98 | '2': 'Hamburguer', 99 | '3': 'Refrigerante', 100 | }; 101 | return menu[option] || null; 102 | } 103 | 104 | _getPaymentMethod(option) { 105 | const methods = { 106 | '1': 'Cartão', 107 | '2': 'Dinheiro', 108 | }; 109 | return methods[option] || null; 110 | } 111 | 112 | _viewOrders(userId) { 113 | const orders = this.orderController.getOrderByUser(userId); // Suponha que esse método exista no OrderController 114 | if (orders.length > 0) { 115 | let response = '📦 *Seus pedidos:*\n'; 116 | orders.forEach((order) => { 117 | response += `\n🔹 Pedido ${order.id}: ${order.item} - ${order.quantity}x\n🗺️ Endereço: ${order.location}\n💳 Pagamento: ${order.paymentMethod}\n`; 118 | }); 119 | return response + '\n0️⃣ para Sair'; 120 | } 121 | return '📦 Você não tem pedidos no momento.\n0️⃣ para Sair'; 122 | } 123 | 124 | _generateOrderNumber() { 125 | return Math.floor(100000 + Math.random() * 900000).toString(); // Gera um número de 6 dígitos 126 | } 127 | } 128 | 129 | module.exports = MessageController; 130 | -------------------------------------------------------------------------------- /Intermediários/delivery-chat-bot/tests/messageController.test.js: -------------------------------------------------------------------------------- 1 | const MessageController = require('../src/controllers/messageController'); 2 | const OrderController = require('../src/controllers/orderController'); 3 | 4 | jest.mock('../src/controllers/orderController'); // Mock do OrderController 5 | 6 | describe('MessageController', () => { 7 | let messageController; 8 | let mockOrderController; 9 | 10 | beforeEach(() => { 11 | // Criamos um mock do OrderController 12 | mockOrderController = new OrderController(); 13 | // Criamos uma instância do MessageController 14 | messageController = new MessageController(); 15 | messageController.orderController = mockOrderController; // Garantir que o MessageController usa o mock 16 | }); 17 | 18 | afterEach(() => { 19 | jest.clearAllMocks(); // Limpa os mocks após cada teste 20 | }); 21 | 22 | test('Deve iniciar a sessão e solicitar o nome do usuário', () => { 23 | const message = { from: 'user1', body: 'Olá' }; 24 | const response = messageController.handleIncomingMessage(message); 25 | 26 | expect(response).toBe('Olá, Olá! Como posso te ajudar?\n1. Fazer Pedido\n2. Ver Meus Pedidos\n3. Cancelar Pedido'); 27 | expect(messageController.sessions['user1']).toBeDefined(); 28 | expect(messageController.sessions['user1'].step).toBe('menu'); 29 | }); 30 | 31 | test('Deve avançar para o passo de localização após a escolha de "Fazer Pedido"', () => { 32 | const message = { from: 'user1', body: 'Fazer Pedido' }; 33 | messageController.sessions['user1'] = { step: 'menu', name: 'Teste' }; 34 | const response = messageController.handleIncomingMessage(message); 35 | 36 | expect(response).toBe('Por favor, envie sua localização.'); 37 | expect(messageController.sessions['user1'].step).toBe('getLocation'); 38 | }); 39 | 40 | test('Deve solicitar a seleção de item após receber a localização', () => { 41 | const message = { from: 'user1', body: 'Minha localização' }; 42 | messageController.sessions['user1'] = { step: 'getLocation', name: 'Teste' }; 43 | const response = messageController.handleIncomingMessage(message); 44 | 45 | expect(response).toBe('Localização recebida. Aqui está nosso cardápio:\n1. Pizza\n2. Hamburguer\n3. Refrigerante\nPor favor, selecione um item.'); 46 | expect(messageController.sessions['user1'].step).toBe('selectItem'); 47 | }); 48 | 49 | test('Deve solicitar a forma de pagamento após a seleção do item', () => { 50 | const message = { from: 'user1', body: '1' }; 51 | messageController.sessions['user1'] = { step: 'selectItem', name: 'Teste', location: 'Minha localização' }; 52 | const response = messageController.handleIncomingMessage(message); 53 | 54 | expect(response).toBe('Você escolheu Pizza. Agora, por favor, escolha a forma de pagamento:\n1. Cartão\n2. Dinheiro'); 55 | expect(messageController.sessions['user1'].order.item).toBe('Pizza'); 56 | expect(messageController.sessions['user1'].step).toBe('getPaymentMethod'); 57 | }); 58 | 59 | test('Deve criar o pedido e resetar a sessão após escolher a forma de pagamento', () => { 60 | const message = { from: 'user1', body: '1' }; 61 | 62 | // Configurando o mock do OrderController para retornar um pedido válido 63 | const orderMock = { 64 | item: 'Pizza', 65 | quantity: 1, 66 | user: 'Teste', 67 | location: 'Minha localização', 68 | paymentMethod: 'Cartão', 69 | }; 70 | mockOrderController.createOrder.mockReturnValue(orderMock); 71 | 72 | // Configurando a sessão do usuário 73 | messageController.sessions['user1'] = { 74 | step: 'getPaymentMethod', 75 | name: 'Teste', 76 | location: 'Minha localização', 77 | order: { item: 'Pizza', quantity: 1 }, 78 | }; 79 | 80 | const response = messageController.handleIncomingMessage(message); 81 | 82 | // Verificações 83 | expect(response).toBe('Pedido criado com sucesso!\nResumo:\nItem: Pizza\nQuantidade: 1\nForma de Pagamento: Cartão\nObrigado, Teste! Seu pedido será entregue em breve.'); 84 | expect(messageController.sessions['user1']).toBeUndefined(); 85 | expect(mockOrderController.createOrder).toHaveBeenCalledWith({ 86 | item: 'Pizza', 87 | quantity: 1, 88 | user: 'Teste', 89 | location: 'Minha localização', 90 | paymentMethod: 'Cartão', 91 | }); 92 | }); 93 | 94 | test('Deve retornar mensagem de erro para opção de menu inválida', () => { 95 | const message = { from: 'user1', body: 'Opção inválida' }; 96 | messageController.sessions['user1'] = { step: 'menu', name: 'Teste' }; 97 | const response = messageController.handleIncomingMessage(message); 98 | 99 | expect(response).toBe('Comando não reconhecido. Por favor, escolha uma opção do menu: \nMenu:\n1. Fazer Pedido\n2. Ver Meus Pedidos\n3. Cancelar Pedido\nDigite a opção desejada.'); 100 | }); 101 | 102 | test('Deve retornar mensagem de erro para item de menu inválido', () => { 103 | const message = { from: 'user1', body: '4' }; 104 | messageController.sessions['user1'] = { step: 'selectItem', name: 'Teste', location: 'Minha localização' }; 105 | const response = messageController.handleIncomingMessage(message); 106 | 107 | expect(response).toBe('Opção inválida. Por favor, selecione um item do cardápio.'); 108 | }); 109 | 110 | test('Deve retornar mensagem de erro para forma de pagamento inválida', () => { 111 | const message = { from: 'user1', body: '3' }; 112 | messageController.sessions['user1'] = { 113 | step: 'getPaymentMethod', 114 | name: 'Teste', 115 | location: 'Minha localização', 116 | order: { item: 'Pizza', quantity: 1 }, 117 | }; 118 | const response = messageController.handleIncomingMessage(message); 119 | 120 | expect(response).toBe('Forma de pagamento inválida. Por favor, escolha 1 para Cartão ou 2 para Dinheiro.'); 121 | }); 122 | }); 123 | --------------------------------------------------------------------------------