├── .editorconfig ├── .gitignore ├── .vscode ├── crud-serverless-mongodb.code-snippets ├── extensions.json ├── launch.json ├── settings.json └── tasks.json ├── CreateFuncionario ├── function.json └── index.js ├── DeleteFuncionario ├── function.json └── index.js ├── GetFuncionarioById ├── function.json └── index.js ├── GetFuncionarios ├── function.json └── index.js ├── LICENSE ├── README.md ├── UpdateFuncionario ├── function.json └── index.js ├── host.json ├── package-lock.json ├── package.json └── shared └── mongo.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = false 9 | insert_final_newline = false -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | bin 2 | obj 3 | csx 4 | .vs 5 | edge 6 | Publish 7 | 8 | *.user 9 | *.suo 10 | *.cscfg 11 | *.Cache 12 | project.lock.json 13 | 14 | /packages 15 | /TestResults 16 | 17 | /tools/NuGet.exe 18 | /App_Data 19 | /secrets 20 | /data 21 | .secrets 22 | appsettings.json 23 | local.settings.json 24 | 25 | node_modules 26 | dist 27 | 28 | # Local python packages 29 | .python_packages/ 30 | 31 | # Python Environments 32 | .env 33 | .venv 34 | env/ 35 | venv/ 36 | ENV/ 37 | env.bak/ 38 | venv.bak/ 39 | 40 | # Byte-compiled / optimized / DLL files 41 | __pycache__/ 42 | *.py[cod] 43 | *$py.class -------------------------------------------------------------------------------- /.vscode/crud-serverless-mongodb.code-snippets: -------------------------------------------------------------------------------- 1 | { 2 | "Snippet responsável por tratar uma nova conexão de dados com o MongoDb": { 3 | "prefix": "mongo-serverless-conn", 4 | "body": [ 5 | "const { MongoClient } = require('mongodb')", 6 | "", 7 | "const config = {", 8 | " url: 'mongodb://localhost:27017/crud-serverless-mongo-wavy',", 9 | " dbName: 'crud-serverless-mongo-wavy'", 10 | "};", 11 | "", 12 | "async function createConnection () {", 13 | " const connection = await MongoClient.connect(config.url, { useNewUrlParser: true })", 14 | " const db = connection.db(config.dbName)", 15 | " return {", 16 | " connection,", 17 | " db", 18 | " }", 19 | "}", 20 | "", 21 | "module.exports = createConnection" 22 | ], 23 | "description": "Snippet responsável por tratar uma nova conexão de dados com o MongoDb" 24 | }, 25 | "Snippet responsável por criar um novo 'Funcionário'": { 26 | "prefix": "mongo-serverless-create", 27 | "body": [ 28 | "const createMongoClient = require('../shared/mongo')", 29 | "", 30 | "module.exports = async function (context, req) {", 31 | " const funcionario = req.body || {}", 32 | "", 33 | " if (funcionario) {", 34 | " context.res = {", 35 | " status: 400,", 36 | " body: 'Os dados do(a) Funcionário(a) é obrigatório!'", 37 | " }", 38 | " }", 39 | "", 40 | " const { db, connection } = await createMongoClient()", 41 | "", 42 | " const Funcionarios = db.collection('funcionarios')", 43 | "", 44 | " try {", 45 | " const funcionarios = await Funcionarios.insert(funcionario)", 46 | " connection.close()", 47 | "", 48 | " context.res = {", 49 | " status: 201,", 50 | " body: funcionarios.ops[0]", 51 | " }", 52 | " } catch (error) {", 53 | " context.res = {", 54 | " status: 500,", 55 | " body: 'Error ao criar um novo Funcionário(a)'", 56 | " }", 57 | " }", 58 | "}", 59 | "" 60 | ], 61 | "description": "Snippet responsável por criar um novo 'Funcionário'" 62 | }, 63 | "Snippet responsável por listar todos os 'Funcionários'": { 64 | "prefix": "mongo-serverless-list", 65 | "body": [ 66 | "const createMongoClient = require('../shared/mongo')", 67 | "", 68 | "module.exports = async context => {", 69 | " const { db, connection } = await createMongoClient()", 70 | "", 71 | "", 72 | " const Funcionarios = db.collection('funcionarios')", 73 | " const res = await Funcionarios.find({})", 74 | " const body = await res.toArray()", 75 | "", 76 | " connection.close()", 77 | "", 78 | " context.res = {", 79 | " status: 200,", 80 | " body", 81 | " }", 82 | "}", 83 | ], 84 | "description": "Snippet responsável por listar todos os 'Funcionários'" 85 | }, 86 | "Snippet responsável por atualizar 'Funcionário' por Id": { 87 | "prefix": "mongo-serverless-update", 88 | "body": [ 89 | "const { ObjectID } = require('mongodb')", 90 | "const createMongoClient = require('../shared/mongo')", 91 | "", 92 | "module.exports = async function (context, req) {", 93 | " const { id } = req.params", 94 | " const funcionario = req.body || {}", 95 | "", 96 | " if (!id || !funcionario) {", 97 | " context.res = {", 98 | " status: 400,", 99 | " body: 'Os campos são obrigatórios'", 100 | " }", 101 | "", 102 | " return", 103 | " }", 104 | "", 105 | " const { db, connection } = await createMongoClient()", 106 | " const Funcionarios = db.collection('funcionarios')", 107 | "", 108 | " try {", 109 | " const funcionarios = await Funcionarios.findOneAndUpdate(", 110 | " { _id: ObjectID(id) },", 111 | " { $set: funcionario }", 112 | " )", 113 | "", 114 | " connection.close()", 115 | "", 116 | " context.res = {", 117 | " status: 200,", 118 | " body: funcionarios", 119 | " }", 120 | " } catch (error) {", 121 | " context.res = {", 122 | " status: 500,", 123 | " body: 'Erro ao atualizar o Funcionário'", 124 | " }", 125 | " }", 126 | "}", 127 | "" 128 | ], 129 | "description": "Snippet responsável por atualizar 'Funcionário' por Id" 130 | }, 131 | "Snippet responsável excluir um 'Funcionário' pelo Id": { 132 | "prefix": "mongo-serverless-delete", 133 | "body": [ 134 | "const { ObjectID } = require('mongodb')", 135 | "const createMongoClient = require('../shared/mongo')", 136 | "", 137 | "module.exports = async function (context, req) {", 138 | " const { id } = req.params", 139 | "", 140 | " if (!id) {", 141 | " context.res = {", 142 | " status: 400,", 143 | " body: 'Os campos são obrigatórios!'", 144 | " }", 145 | "", 146 | " return", 147 | " }", 148 | "", 149 | " const { db, connection } = await createMongoClient()", 150 | "", 151 | " const Funcionarios = db.collection('funcionarios')", 152 | "", 153 | " try {", 154 | " await Funcionarios.findOneAndDelete({ _id: ObjectID(id) })", 155 | " connection.close()", 156 | " context.res = {", 157 | " status: 204,", 158 | " body: 'Funcionário excluído com sucesso!'", 159 | " }", 160 | " } catch (error) {", 161 | " context.res = {", 162 | " status: 500,", 163 | " body: 'Erro ao excluir Funcionário' + id", 164 | " }", 165 | " }", 166 | "}" 167 | ], 168 | "description": "Snippet responsável excluir um 'Funcionário' pelo Id" 169 | }, 170 | "Snippet responsável listar um 'Funcionário' pelo Id": { 171 | "prefix": "mongo-serverless-listOne", 172 | "body": [ 173 | "const { ObjectID } = require('mongodb')", 174 | "const createMongoClient = require('../shared/mongo')", 175 | "", 176 | "module.exports = async function (context, req) {", 177 | " const { id } = req.params", 178 | "", 179 | " if (!id) {", 180 | " context.res = {", 181 | " status: 400,", 182 | " body: 'Por favor, passe o número correto do Id do Funcionário!'", 183 | " }", 184 | "", 185 | " return", 186 | " }", 187 | "", 188 | " const { db, connection } = await createMongoClient()", 189 | "", 190 | " const Funcionarios = db.collection('funcionarios')", 191 | "", 192 | " try {", 193 | " const body = await Funcionarios.findOne({ _id: ObjectID(id) })", 194 | "", 195 | " connection.close()", 196 | " context.res = {", 197 | " status: 200,", 198 | " body", 199 | " }", 200 | " } catch (error) {", 201 | " context.res = {", 202 | " status: 500,", 203 | " body: 'Erro ao listar o Funcionário pelo Id.'", 204 | " }", 205 | " }", 206 | "}" 207 | ], 208 | "description": "Snippet responsável listar um 'Funcionário' pelo Id" 209 | } 210 | } 211 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "ms-azuretools.vscode-azurefunctions" 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Attach to Node Functions", 6 | "type": "node", 7 | "request": "attach", 8 | "port": 9229, 9 | "preLaunchTask": "func: host start" 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "azureFunctions.deploySubpath": ".", 3 | "azureFunctions.projectLanguage": "JavaScript", 4 | "azureFunctions.projectRuntime": "~2", 5 | "debug.internalConsoleOptions": "neverOpen", 6 | "azureFunctions.preDeployTask": "npm prune" 7 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "type": "func", 6 | "command": "host start", 7 | "problemMatcher": "$func-watch", 8 | "isBackground": true, 9 | "dependsOn": "npm install" 10 | }, 11 | { 12 | "type": "shell", 13 | "label": "npm install", 14 | "command": "npm install" 15 | }, 16 | { 17 | "type": "shell", 18 | "label": "npm prune", 19 | "command": "npm prune --production", 20 | "problemMatcher": [] 21 | } 22 | ] 23 | } -------------------------------------------------------------------------------- /CreateFuncionario/function.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": [{ 3 | "authLevel": "anonymous", 4 | "type": "httpTrigger", 5 | "direction": "in", 6 | "name": "req", 7 | "methods": ["post"], 8 | "route": "funcionarios" 9 | }, 10 | { 11 | "type": "http", 12 | "direction": "out", 13 | "name": "res" 14 | } 15 | ] 16 | } -------------------------------------------------------------------------------- /CreateFuncionario/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Arquivo: CreateFuncionario/index.js 3 | * Data: 24/08/2019 4 | * Descrição: arquivo responsável por criar um novo 'Funcionário' 5 | * 6 | * Digitar o snippet: mongo-serverless-create 7 | */ 8 | 9 | const createMongoClient = require('../shared/mongo') 10 | 11 | module.exports = async function (context, req) { 12 | const funcionario = req.body || {} 13 | 14 | if (funcionario) { 15 | context.res = { 16 | status: 400, 17 | body: 'Os dados do(a) Funcionário(a) é obrigatório!' 18 | } 19 | } 20 | 21 | const { db, connection } = await createMongoClient() 22 | 23 | const Funcionarios = db.collection('funcionarios') 24 | 25 | try { 26 | const funcionarios = await Funcionarios.insert(funcionario) 27 | connection.close() 28 | 29 | context.res = { 30 | status: 201, 31 | body: funcionarios.ops[0] 32 | } 33 | } catch (error) { 34 | context.res = { 35 | status: 500, 36 | body: 'Error ao criar um novo Funcionário(a)' 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /DeleteFuncionario/function.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": [{ 3 | "authLevel": "anonymous", 4 | "type": "httpTrigger", 5 | "direction": "in", 6 | "name": "req", 7 | "methods": ["delete"], 8 | "route": "funcionarios/{id}" 9 | }, 10 | { 11 | "type": "http", 12 | "direction": "out", 13 | "name": "res" 14 | } 15 | ] 16 | } -------------------------------------------------------------------------------- /DeleteFuncionario/index.js: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | /** 3 | * Arquivo: DeleteFuncionario/index.js 4 | * Data: 24/08/2019 5 | * Descrição: arquivo responsável excluir um 'Funcionário' pelo Id 6 | * 7 | * Digitar o snippet: mongo-serverless-delete 8 | */ 9 | 10 | const { ObjectID } = require('mongodb') 11 | const createMongoClient = require('../shared/mongo') 12 | 13 | module.exports = async function (context, req) { 14 | const { id } = req.params 15 | 16 | if (!id) { 17 | context.res = { 18 | status: 400, 19 | body: 'Os campos são obrigatórios!' 20 | } 21 | 22 | return 23 | } 24 | 25 | const { db, connection } = await createMongoClient() 26 | 27 | const Funcionarios = db.collection('funcionarios') 28 | 29 | try { 30 | await Funcionarios.findOneAndDelete({ _id: ObjectID(id) }) 31 | connection.close() 32 | context.res = { 33 | status: 204, 34 | body: 'Funcionário excluído com sucesso!' 35 | } 36 | } catch (error) { 37 | context.res = { 38 | status: 500, 39 | body: 'Erro ao excluir Funcionário' + id 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /GetFuncionarioById/function.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": [{ 3 | "authLevel": "anonymous", 4 | "type": "httpTrigger", 5 | "direction": "in", 6 | "name": "req", 7 | "methods": ["get"], 8 | "route": "funcionarios/{id}" 9 | }, 10 | { 11 | "type": "http", 12 | "direction": "out", 13 | "name": "res" 14 | } 15 | ] 16 | } -------------------------------------------------------------------------------- /GetFuncionarioById/index.js: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | /** 3 | * Arquivo: GetFuncionarioById/index.js 4 | * Data: 24/08/2019 5 | * Descrição: arquivo responsável por listar Funcionário pelo Id 6 | * 7 | * Digitar o snippet: mongo-serverless-listOne 8 | */ 9 | 10 | const { ObjectID } = require('mongodb') 11 | const createMongoClient = require('../shared/mongo') 12 | 13 | module.exports = async function (context, req) { 14 | const { id } = req.params 15 | 16 | if (!id) { 17 | context.res = { 18 | status: 400, 19 | body: 'Por favor, passe o número correto do Id do Funcionário!' 20 | } 21 | 22 | return 23 | } 24 | 25 | const { db, connection } = await createMongoClient() 26 | 27 | const Funcionarios = db.collection('funcionarios') 28 | 29 | try { 30 | const body = await Funcionarios.findOne({ _id: ObjectID(id) }) 31 | 32 | connection.close() 33 | context.res = { 34 | status: 200, 35 | body 36 | } 37 | } catch (error) { 38 | context.res = { 39 | status: 500, 40 | body: 'Erro ao listar o Funcionário pelo Id.' 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /GetFuncionarios/function.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": [{ 3 | "authLevel": "anonymous", 4 | "type": "httpTrigger", 5 | "direction": "in", 6 | "name": "req", 7 | "methods": ["get"], 8 | "route": "funcionarios" 9 | }, 10 | { 11 | "type": "http", 12 | "direction": "out", 13 | "name": "res" 14 | } 15 | ] 16 | } -------------------------------------------------------------------------------- /GetFuncionarios/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Arquivo: GetFuncionarios/index.js 3 | * Data: 24/08/2019 4 | * Descrição: arquivo responsável por listar todos os 'Funcionários' 5 | * 6 | * Digitar o snippet: mongo-serverless-list 7 | */ 8 | 9 | const createMongoClient = require('../shared/mongo') 10 | 11 | module.exports = async context => { 12 | const { db, connection } = await createMongoClient() 13 | 14 | 15 | const Funcionarios = db.collection('funcionarios') 16 | const res = await Funcionarios.find({}) 17 | const body = await res.toArray() 18 | 19 | connection.close() 20 | 21 | context.res = { 22 | status: 200, 23 | body 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Glaucia Lemos 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CRUD - Arquitetura Serverless com Azure Functions & MongoDb 2 | 3 | [![bit-community.png](https://i.postimg.cc/zGhWZqX7/bit-community.png)](https://postimg.cc/bZzd1cnS) 4 | 5 | Repositório responsável por persistir os verbos HTTP's (GET, POST, DELETE, PUT) localmente no MongoDb, fazendo uso da arquitetura Serverless com Azure Functions. 6 | 7 | ## Recursos Utilizados 🚀 8 | 9 | - **[Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=javascript-0000-gllemos)** 10 | - **[Node.js](https://nodejs.org/en/)** 11 | - **[Extensão Visual Studio Code: Azure Functions](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurefunctions&WT.mc_id=javascript-0000-gllemos)** 12 | - **[Mongodb Community Server ](https://www.mongodb.com/download-center/community)** 13 | - **[MongodB Compass GUI](https://www.mongodb.com/download-center/compass)** 14 | - **[Postman](https://www.getpostman.com/)** 15 | - **[Conta Azure - Conta Gratuita](https://azure.microsoft.com/free/?WT.mc_id=javascript-0000-gllemos)** 16 | 17 | ## Conta - Azure for Students ⭐️ 18 | 19 | Caso você seja um(a) estudante de alguma Instituição de Ensino de Faculdade ou Universidade, poderá criar sua conta no **[Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=javascript-0000-gllemos)**. Essa conta te dará o benefício em possuir crédito de USD 100,00 para usar os serviços de maneira gratuita, sem necessidade de possuir um cartão de crédito. Para ativar essa conta, bastam acessar o link ao lado: **[AQUI](https://azure.microsoft.com/free/students/?WT.mc_id=javascript-0000-gllemos)** 20 | 21 | ## Sobre a Demo 💻 22 | 23 | Aqui ensino como você pode persistir um dado usando o HTTP Trigger, via POST direto no MongoDb local. 24 | 25 | ## Executando localmente a aplicação 26 | 27 | 1. Para executar localmente a aplicação, você precisa primeiramente baixar o pacote npm do azure function tools globalmente na sua máquina por meio do comando: 28 | 29 | ```bash 30 | > npm i -g azure-functions-core-tools --unsafe-perm true 31 | ``` 32 | 33 | 2. Crie na raiz principal do projeto o arquivo: `local.settings.json` e inclua o seguinte bloco de código: 34 | 35 | ```json 36 | { 37 | "IsEncrypted": false, 38 | "Values": { 39 | "FUNCTIONS_WORKER_RUNTIME": "node", 40 | "AzureWebJobsStorage": "{AzureWebJobsStorage}" 41 | }, 42 | "Host": { 43 | "LocalHttpPort": 7071, 44 | "CORS": "*" 45 | } 46 | } 47 | ``` 48 | 49 | 3. Execute o MongoDb ou MongoDb Compass! 50 | 51 | 4. Agora, abre novamente o seu prompt de comando e execute o comando: 52 | 53 | ```bash 54 | > func host start 55 | ``` 56 | 57 | Abre o Postman. Agora você poderá: 58 | 59 | * Criar um novo 'Funcionário' em: [POST] `http://localhost:7071/api/funcionario` 60 | * Listar todos os Funcionários em: [GET] `http://localhost:7071/api/funcionarios` 61 | * Listar um Funcionário pelo Id em: [GET] `http://localhost:7071/api/funcionario/{id}` 62 | * Atualizar um Funcionário pelo Id em: [PUT] `http://localhost:7071/api/funcionario/{id}` 63 | * Excluir um Funcionário pelo Id em: [DELETE] `http://localhost:7071/api/funcionario/{id}` 64 | 65 | ## Links & Recursos Importantes ❗️ 66 | 67 | Durante o workshop, comentei sobre importantes documentações, links e recursos que podem auxiliar o seu conhecimento sobre Serverless & Azure Functions 68 | 69 | - ✅ **[Link dos Slides da Palestra](https://aka.ms/AA5vqcu)** 70 | - ✅ **[Azure para devs JavaScript & Node.js](https://docs.microsoft.com/javascript/azure/?WT.mc_id=javascript-0000-gllemos&view=azure-node-latest)** 71 | - ✅ **[Documentação Azure Functions](https://docs.microsoft.com/azure/azure-functions/?WT.mc_id=javascript-0000-gllemos)** 72 | - ✅ **[Criando a sua Primeira Função no Visual Studio Code](https://docs.microsoft.com/azure/azure-functions/functions-create-first-function-vs-code?WT.mc_id=javascript-0000-gllemos)** 73 | - ✅ **[Extensão Vs Code – Azure Functions](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurefunctions&WT.mc_id=javascript-0000-gllemos)** 74 | - ✅ **[E-Book Grátis - Azure Serverless Computing Cookbook](https://azure.microsoft.com/resources/azure-serverless-computing-cookbook/?WT.mc_id=javascript-0000-gllemos)** 75 | - ✅ **[Cursos Grátis - Azure Functions](https://docs.microsoft.com/learn/paths/create-serverless-applications/?WT.mc_id=javascript-0000-gllemos)** 76 | 77 | ## Dúvidas?! ❗️❗️ 78 | 79 | Se tiverem alguma dúvida referente ao código desenvolvido ou para configurar o ambiente de desenvolvimento, bastam criar uma **[ISSUE AQUI](https://github.com/glaucia86/crud-serverless-mongodb/issues)** no GitHub que estarei respondendo a vocês o mais breve possível!! :D :D 80 | -------------------------------------------------------------------------------- /UpdateFuncionario/function.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": [{ 3 | "authLevel": "anonymous", 4 | "type": "httpTrigger", 5 | "direction": "in", 6 | "name": "req", 7 | "methods": ["put"], 8 | "route": "funcionarios/{id}" 9 | }, 10 | { 11 | "type": "http", 12 | "direction": "out", 13 | "name": "res" 14 | } 15 | ] 16 | } -------------------------------------------------------------------------------- /UpdateFuncionario/index.js: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | /** 3 | * Arquivo: UpdateFuncionario/index.js 4 | * Data: 24/08/2019 5 | * Descrição: arquivo responsável por atualizar 'Funcionário' por Id 6 | * 7 | * Digitar o snippet: mongo-serverless-update 8 | */ 9 | 10 | const { ObjectID } = require('mongodb') 11 | const createMongoClient = require('../shared/mongo') 12 | 13 | module.exports = async function (context, req) { 14 | const { id } = req.params 15 | const funcionario = req.body || {} 16 | 17 | if (!id || !funcionario) { 18 | context.res = { 19 | status: 400, 20 | body: 'Os campos são obrigatórios' 21 | } 22 | 23 | return 24 | } 25 | 26 | const { db, connection } = await createMongoClient() 27 | const Funcionarios = db.collection('funcionarios') 28 | 29 | try { 30 | const funcionarios = await Funcionarios.findOneAndUpdate( 31 | { _id: ObjectID(id) }, 32 | { $set: funcionario } 33 | ) 34 | 35 | connection.close() 36 | 37 | context.res = { 38 | status: 200, 39 | body: funcionarios 40 | } 41 | } catch (error) { 42 | context.res = { 43 | status: 500, 44 | body: 'Erro ao atualizar o Funcionário' 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /host.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0" 3 | } -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "requires": true, 3 | "lockfileVersion": 1, 4 | "dependencies": { 5 | "bson": { 6 | "version": "1.1.6", 7 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", 8 | "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==" 9 | }, 10 | "mongodb": { 11 | "version": "3.3.1", 12 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.3.1.tgz", 13 | "integrity": "sha512-Q92LLlPUTBj/Z4DyeznwPJjvgOYUcxZsBfek3Ba9mVhzH41n70vSubo+BmemI98kOefHTSncrTyb3OaxdLSgDw==", 14 | "requires": { 15 | "bson": "^1.1.1", 16 | "require_optional": "^1.0.1", 17 | "safe-buffer": "^5.1.2" 18 | } 19 | }, 20 | "require_optional": { 21 | "version": "1.0.1", 22 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", 23 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", 24 | "requires": { 25 | "resolve-from": "^2.0.0", 26 | "semver": "^5.1.0" 27 | } 28 | }, 29 | "resolve-from": { 30 | "version": "2.0.0", 31 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", 32 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" 33 | }, 34 | "safe-buffer": { 35 | "version": "5.2.0", 36 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", 37 | "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" 38 | }, 39 | "semver": { 40 | "version": "5.7.1", 41 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 42 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "version": "", 4 | "description": "", 5 | "scripts": { 6 | "test": "echo \"No tests yet...\"" 7 | }, 8 | "author": "", 9 | "dependencies": { 10 | "mongodb": "^3.3.1" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /shared/mongo.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Arquivo: mongo.js 3 | * Data: 24/08/2019 4 | * Descrição: arquivo responsável por tratar a conexão da Base de Dados localmente 5 | * 6 | * Digitar o snippet: mongo-serverless-conn 7 | */ 8 | 9 | const { MongoClient } = require('mongodb') 10 | 11 | const config = { 12 | url: 'mongodb://localhost:27017/crud-serverless-mongo-wavy', 13 | dbName: 'crud-serverless-mongo-wavy' 14 | } 15 | 16 | async function createConnection () { 17 | const connection = await MongoClient.connect(config.url, { useNewUrlParser: true }) 18 | const db = connection.db(config.dbName) 19 | return { 20 | connection, 21 | db 22 | } 23 | } 24 | 25 | module.exports = createConnection 26 | --------------------------------------------------------------------------------