├── .gitignore ├── lib ├── utils │ └── reader.js ├── services │ ├── ExplorerService.js │ └── FizzbuzzService.js ├── controllers │ └── ExplorerController.js └── server.js ├── .github └── workflows │ └── test.yml ├── readme.md ├── test └── services │ └── ExplorerService.test.js ├── .eslintrc.js ├── package.json └── explorers.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /lib/utils/reader.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | 3 | class Reader{ 4 | static readJsonFile(path){ 5 | const rawdata = fs.readFileSync(path); 6 | return JSON.parse(rawdata); 7 | } 8 | } 9 | 10 | module.exports = Reader; 11 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Run Tests in my project every push on GitHub 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v1 10 | - name: Run Jest 11 | uses: stefanoeb/jest-action@1.0.3 12 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Linter 2 | 3 | 1. Instalar dependencia: 4 | 5 | > npm install eslint --save-dev 6 | 7 | 2. Modificar package.json, agregar debajo de test 8 | 9 | > "linter": "node ./node_modules/eslint/bin/eslint.js" 10 | 11 | 3. Crear configuración en archivo .eslintrc (si se versiona) 12 | 13 | > npm init @eslint/config 14 | 15 | Rules: https://eslint.org/docs/rules/ 16 | Airbnb Code Style: https://github.com/airbnb/javascript 17 | -------------------------------------------------------------------------------- /test/services/ExplorerService.test.js: -------------------------------------------------------------------------------- 1 | const ExplorerService = require("./../../lib/services/ExplorerService"); 2 | 3 | describe("Tests para ExplorerService", () => { 4 | test("Requerimiento 1: Calcular todos los explorers en una misión", () => { 5 | const explorers = [{mission: "node"}]; 6 | const explorersInNode = ExplorerService.filterByMission(explorers, "node"); 7 | expect(explorersInNode.length).toBe(1); 8 | }); 9 | 10 | }); 11 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "env": { 3 | "browser": true, 4 | "commonjs": true, 5 | "es2021": true, 6 | "jest": true 7 | }, 8 | "extends": "eslint:recommended", 9 | "parserOptions": { 10 | "ecmaVersion": "latest" 11 | }, 12 | "rules": { 13 | "no-unused-vars": "off", 14 | indent: ["error", 4], 15 | "linebreak-style": ["error", "unix"], 16 | quotes: ["error", "double"], 17 | semi: ["error", "always"] 18 | } 19 | }; 20 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fizzbuzz", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "node ./node_modules/.bin/jest", 8 | "linter": "node ./node_modules/eslint/bin/eslint.js", 9 | "linter-fix": "node ./node_modules/eslint/bin/eslint.js . --fix", 10 | "server": "node ./lib/server.js" 11 | }, 12 | "keywords": [], 13 | "author": "", 14 | "license": "ISC", 15 | "devDependencies": { 16 | "eslint": "^8.14.0", 17 | "jest": "^27.5.1" 18 | }, 19 | "dependencies": { 20 | "express": "^4.17.3" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /lib/services/ExplorerService.js: -------------------------------------------------------------------------------- 1 | class ExplorerService { 2 | 3 | static filterByMission(explorers, mission){ 4 | const explorersByMission = explorers.filter((explorer) => explorer.mission == mission); 5 | return explorersByMission; 6 | } 7 | 8 | static getAmountOfExplorersByMission(explorers, mission){ 9 | const explorersByMission = ExplorerService.filterByMission(explorers, mission); 10 | return explorersByMission.length; 11 | } 12 | 13 | static getExplorersUsernamesByMission(explorers, mission){ 14 | const explorersByMission = ExplorerService.filterByMission(explorers, mission); 15 | const explorersUsernames = explorersByMission.map((explorer) => explorer.githubUsername); 16 | return explorersUsernames; 17 | } 18 | 19 | } 20 | 21 | module.exports = ExplorerService; 22 | -------------------------------------------------------------------------------- /lib/services/FizzbuzzService.js: -------------------------------------------------------------------------------- 1 | class FizzbuzzService { 2 | static applyValidationInExplorer(explorer){ 3 | if(explorer.score % 3 === 0 && explorer.score % 5 === 0){ 4 | explorer.trick = "FIZZBUZZ"; 5 | return explorer; 6 | } else if(explorer.score % 3 === 0) { 7 | explorer.trick = "FIZZ"; 8 | return explorer; 9 | } else if(explorer.score % 5 === 0) { 10 | explorer.trick = "BUZZ"; 11 | return explorer; 12 | }else{ 13 | explorer.trick = explorer.score; 14 | return explorer; 15 | } 16 | } 17 | 18 | static applyValidationInNumber(number){ 19 | if(number % 3 === 0 && number % 5 === 0){ 20 | return "FIZZBUZZ"; 21 | } else if(number % 3 === 0) { 22 | return "FIZZ"; 23 | } else if(number % 5 === 0) { 24 | return "BUZZ"; 25 | }else{ 26 | return number; 27 | } 28 | } 29 | } 30 | 31 | module.exports = FizzbuzzService; 32 | -------------------------------------------------------------------------------- /lib/controllers/ExplorerController.js: -------------------------------------------------------------------------------- 1 | const ExplorerService = require("../services/ExplorerService"); 2 | const FizzbuzzService = require("../services/FizzbuzzService"); 3 | const Reader = require("../utils/reader"); 4 | 5 | class ExplorerController{ 6 | static getExplorersByMission(mission){ 7 | const explorers = Reader.readJsonFile("explorers.json"); 8 | return ExplorerService.filterByMission(explorers, mission); 9 | } 10 | 11 | static applyFizzbuzz(score){ 12 | return FizzbuzzService.applyValidationInNumber(score); 13 | } 14 | 15 | static getExplorersUsernamesByMission(mission){ 16 | const explorers = Reader.readJsonFile("explorers.json"); 17 | return ExplorerService.getExplorersUsernamesByMission(explorers, mission); 18 | } 19 | 20 | static getExplorersAmonutByMission(mission){ 21 | const explorers = Reader.readJsonFile("explorers.json"); 22 | return ExplorerService.getAmountOfExplorersByMission(explorers, mission); 23 | } 24 | } 25 | 26 | module.exports = ExplorerController; 27 | -------------------------------------------------------------------------------- /lib/server.js: -------------------------------------------------------------------------------- 1 | const ExplorerController = require("./controllers/ExplorerController"); 2 | const express = require("express"); 3 | const app = express(); 4 | app.use(express.json()); 5 | const port = 3000; 6 | 7 | app.get("/", (request, response) => { 8 | response.json({message: "FizzBuzz Api welcome!"}); 9 | }); 10 | 11 | app.get("/v1/explorers/:mission", (request, response) => { 12 | const mission = request.params.mission; 13 | const explorersInMission = ExplorerController.getExplorersByMission(mission); 14 | response.json(explorersInMission); 15 | }); 16 | 17 | app.get("/v1/explorers/amount/:mission", (request, response) => { 18 | const mission = request.params.mission; 19 | const explorersAmountInMission = ExplorerController.getExplorersAmonutByMission(mission); 20 | response.json({mission: request.params.mission, quantity: explorersAmountInMission}); 21 | }); 22 | 23 | app.get("/v1/explorers/usernames/:mission", (request, response) => { 24 | const mission = request.params.mission; 25 | const explorersUsernames = ExplorerController.getExplorersUsernamesByMission(mission); 26 | response.json({mission: request.params.mission, explorers: explorersUsernames}); 27 | }); 28 | 29 | app.get("/v1/fizzbuzz/:score", (request, response) => { 30 | const score = parseInt(request.params.score); 31 | const fizzbuzzTrick = ExplorerController.applyFizzbuzz(score); 32 | response.json({score: score, trick: fizzbuzzTrick}); 33 | }); 34 | 35 | app.listen(port, () => { 36 | console.log(`FizzBuzz API in localhost:${port}`); 37 | }); 38 | 39 | -------------------------------------------------------------------------------- /explorers.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "Woopa1", 4 | "githubUsername": "ajolonauta1", 5 | "score": 1, 6 | "mission": "node", 7 | "stacks": [ 8 | "javascript", 9 | "reasonML", 10 | "elm" 11 | ] 12 | }, 13 | { 14 | "name": "Woopa2", 15 | "githubUsername": "ajolonauta2", 16 | "score": 2, 17 | "mission": "node", 18 | "stacks": [ 19 | "javascript", 20 | "groovy", 21 | "elm" 22 | ] 23 | }, 24 | { 25 | "name": "Woopa3", 26 | "githubUsername": "ajolonauta3", 27 | "score": 3, 28 | "mission": "node", 29 | "stacks": [ 30 | "elixir", 31 | "groovy", 32 | "reasonML" 33 | ] 34 | }, 35 | { 36 | "name": "Woopa4", 37 | "githubUsername": "ajolonauta4", 38 | "mission": "node", 39 | "score": 4, 40 | "stacks": [ 41 | "javascript" 42 | ] 43 | }, 44 | { 45 | "name": "Woopa5", 46 | "githubUsername": "ajolonauta5", 47 | "score": 5, 48 | "mission": "node", 49 | "stacks": [ 50 | "javascript", 51 | "elixir", 52 | "elm" 53 | ] 54 | }, 55 | { 56 | "name": "Woopa6", 57 | "githubUsername": "ajolonauta6", 58 | "score": 6, 59 | "mission": "java", 60 | "stacks": [ 61 | "elm" 62 | ] 63 | }, 64 | { 65 | "name": "Woopa7", 66 | "githubUsername": "ajolonauta7", 67 | "mission": "java", 68 | "score": 7, 69 | "stacks": [ 70 | ] 71 | }, 72 | { 73 | "name": "Woopa8", 74 | "githubUsername": "ajolonauta8", 75 | "score": 8, 76 | "mission": "java", 77 | "stacks": [ 78 | "elm" 79 | ] 80 | }, 81 | { 82 | "name": "Woopa9", 83 | "githubUsername": "ajolonauta9", 84 | "score": 9, 85 | "mission": "java", 86 | "stacks": [ 87 | "javascript", 88 | "elixir", 89 | "groovy", 90 | "reasonML", 91 | "elm" 92 | ] 93 | }, 94 | { 95 | "name": "Woopa10", 96 | "githubUsername": "ajolonauta10", 97 | "score": 10, 98 | "mission": "java", 99 | "stacks": [ 100 | "javascript", 101 | "elixir", 102 | "groovy", 103 | "reasonML", 104 | "elm" 105 | ] 106 | }, 107 | { 108 | "name": "Woopa11", 109 | "githubUsername": "ajolonauta11", 110 | "score": 11, 111 | "mission": "node", 112 | "stacks": [ 113 | "javascript", 114 | "elixir", 115 | "groovy", 116 | "reasonML", 117 | "elm" 118 | ] 119 | }, 120 | { 121 | "name": "Woopa12", 122 | "githubUsername": "ajolonauta12", 123 | "score": 12, 124 | "mission": "node", 125 | "stacks": [ 126 | "javascript", 127 | "elixir", 128 | "groovy", 129 | "reasonML", 130 | "elm" 131 | ] 132 | }, 133 | { 134 | "name": "Woopa13", 135 | "githubUsername": "ajolonauta13", 136 | "score": 13, 137 | "mission": "node", 138 | "stacks": [ 139 | "javascript", 140 | "elixir", 141 | "groovy", 142 | "reasonML", 143 | "elm" 144 | ] 145 | }, 146 | { 147 | "name": "Woopa14", 148 | "githubUsername": "ajolonauta14", 149 | "score": 14, 150 | "mission": "node", 151 | "stacks": [ 152 | "javascript", 153 | "elixir", 154 | "groovy", 155 | "reasonML", 156 | "elm" 157 | ] 158 | }, 159 | { 160 | "name": "Woopa15", 161 | "githubUsername": "ajolonauta15", 162 | "score": 15, 163 | "mission": "node", 164 | "stacks": [ 165 | "javascript", 166 | "elixir", 167 | "groovy", 168 | "reasonML", 169 | "elm" 170 | ] 171 | } 172 | ] 173 | --------------------------------------------------------------------------------