├── README.md ├── .gitignore ├── lib ├── utils │ └── Reader.js ├── services │ ├── ExplorerService.js │ └── FizzbuzzService.js ├── controllers │ └── ExplorerController.js └── server.js ├── test └── services │ └── ExplorerService.test.js ├── .eslintrc.js ├── package.json ├── .github └── workflows │ └── test.yml ├── index.js └── explorers.json /README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | **/node_modules -------------------------------------------------------------------------------- /lib/utils/Reader.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | 3 | class Reader { 4 | 5 | static readJsonFile(path){ 6 | console.log(path); 7 | const rawdata = fs.readFileSync(path); 8 | return JSON.parse(rawdata); 9 | } 10 | 11 | } 12 | 13 | // console.log("Leyendo!") 14 | // Reader.readJsonFile("../../explorers.json") 15 | 16 | module.exports = Reader; 17 | 18 | 19 | -------------------------------------------------------------------------------- /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 | }); -------------------------------------------------------------------------------- /.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 | indent: ["error", 4], 14 | "linebreak-style": ["error", "unix"], 15 | quotes: ["error", "double"], 16 | semi: ["error", "always"] 17 | } 18 | }; 19 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fizzbuz", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "node ./node_modules/jest/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 | "repository": { 13 | "type": "git", 14 | "url": "git+https://github.com/RodolfoBaume/fizzbuzz.git" 15 | }, 16 | "author": "RodolfoBaume", 17 | "license": "ISC", 18 | "devDependencies": { 19 | "eslint": "^8.14.0", 20 | "jest": "^28.0.0" 21 | }, 22 | "dependencies": { 23 | "express": "^4.18.1" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /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 explorersInNode = explorers.filter((explorer) => explorer.mission == mission); 10 | return "Explorers en node:" + explorersInNode.length; 11 | } 12 | 13 | static getExplorersUsernamesByMission(explorers, mission){ 14 | const explorersInNodeToGetUsernames = explorers.filter((explorer) => explorer.mission == mission); 15 | const usernamesByMission = explorersInNodeToGetUsernames.map((explorer) => explorer.githubUsername); 16 | return usernamesByMission; 17 | } 18 | 19 | } 20 | 21 | module.exports = ExplorerService; 22 | 23 | -------------------------------------------------------------------------------- /lib/services/FizzbuzzService.js: -------------------------------------------------------------------------------- 1 | class FizzbuzzService { 2 | 3 | static applyValidationInExplorer(explorer){ 4 | 5 | if(explorer.score%5 === 0 && explorer.score%3 === 0){ 6 | explorer.trick = "FIZZBUZZ"; 7 | return explorer; 8 | }else if(explorer.score%3 === 0){ 9 | explorer.trick = "FIZZ"; 10 | return explorer; 11 | }else if(explorer.score%5 === 0){ 12 | explorer.trick = "BUZZ"; 13 | return explorer; 14 | }else{ 15 | explorer.trick = explorer.score; 16 | return explorer; 17 | } 18 | 19 | } 20 | 21 | static applyValidationInNumber(number){ 22 | if(number % 3 === 0 && number % 5 === 0){ 23 | return "FIZZBUZZ"; 24 | } else if(number % 3 === 0) { 25 | return "FIZZ"; 26 | } else if(number % 5 === 0) { 27 | return "BUZZ"; 28 | }else{ 29 | return number; 30 | } 31 | } 32 | } 33 | 34 | module.exports = FizzbuzzService; 35 | 36 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Jest 2 | on: push 3 | jobs: 4 | test: 5 | runs-on: ubuntu-latest 6 | steps: 7 | - uses: actions/checkout@v2 8 | - name: Setup Node.js 9 | uses: actions/setup-node@v1 10 | with: 11 | node-version: "12" 12 | 13 | # Speed up subsequent runs with caching 14 | - name: Cache node modules 15 | uses: actions/cache@v2 16 | env: 17 | cache-name: cache-node-modules 18 | with: 19 | # npm cache files are stored in `~/.npm` on Linux/macOS 20 | path: ~/.npm 21 | key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} 22 | restore-keys: | 23 | ${{ runner.os }}-build-${{ env.cache-name }}- 24 | ${{ runner.os }}-build- 25 | ${{ runner.os }}- 26 | 27 | # Install required deps for action 28 | - name: Install Dependencies 29 | run: npm install 30 | 31 | # Finally, run our tests 32 | - name: Run the tests 33 | run: npm test -------------------------------------------------------------------------------- /lib/controllers/ExplorerController.js: -------------------------------------------------------------------------------- 1 | const res = require("express/lib/response"); 2 | const ExplorerService = require("../services/ExplorerService"); 3 | const FizzbuzzService = require("../services/FizzbuzzService"); 4 | const Reader = require("../utils/Reader"); 5 | 6 | class ExplorerController{ 7 | static getExplorersByMission(mission){ 8 | const explorers = Reader.readJsonFile("explorers.json"); 9 | return ExplorerService.filterByMission(explorers, mission); 10 | } 11 | static getExplorersUsernamesByMission(mission){ 12 | const explorers = Reader.readJsonFile("explorers.json"); 13 | return ExplorerService.getExplorersUsernamesByMission(explorers, mission); 14 | } 15 | static getExplorersAmountByMission(mission){ 16 | const explorers = Reader.readJsonFile("explorers.json"); 17 | return ExplorerService.getAmountOfExplorersByMission(explorers, mission); 18 | } 19 | 20 | static appFizzbuzz(score){ 21 | return FizzbuzzService.applyValidationInNumber(score); 22 | } 23 | } 24 | 25 | module.exports = ExplorerController; 26 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const Reader = require("./lib/utils/Reader"); 2 | const ExplorerService = require("./lib/services/ExplorerService"); 3 | const FizzbuzzService = require("./lib/services/FizzbuzzService"); 4 | 5 | const explorers = Reader.readJsonFile("explorers.json"); // esto regresa la lista de explorers del archivo 6 | // console.log(explorers) 7 | 8 | 9 | 10 | // Clase anterior con la que obtenemos los explorers 11 | // const Reader = require("./lib/utils/Reader"); 12 | // const explorers = Reader.readJsonFile("explorers.json"); 13 | 14 | // Aplicación del ExplorerService sobre la lista de explorers 15 | console.log(ExplorerService.filterByMission(explorers, "node")); 16 | console.log(ExplorerService.getAmountOfExplorersByMission(explorers, "node")); 17 | console.log(ExplorerService.getExplorersUsernamesByMission(explorers, "node")); 18 | 19 | const explorer1 = {name: "Explorer1", score: 1}; 20 | console.log(FizzbuzzService.applyValidationInExplorer(explorer1)); // {name: "Explorer1", score: 1, trick: 1} 21 | 22 | const explorer3 = {name: "Explorer3", score: 3}; 23 | console.log(FizzbuzzService.applyValidationInExplorer(explorer3)); // {name: "Explorer3", score: 3, trick: "FIZZ"} 24 | 25 | const explorer5 = {name: "Explorer5", score: 5}; 26 | console.log(FizzbuzzService.applyValidationInExplorer(explorer5)); // {name: "Explorer5", score: 5, trick: "BUZZ"} 27 | 28 | const explorer15 = {name: "Explorer15", score: 15}; 29 | console.log(FizzbuzzService.applyValidationInExplorer(explorer15)); // {name: "Explorer15", score: 15, trick: "FIZZBUZZ"} -------------------------------------------------------------------------------- /lib/server.js: -------------------------------------------------------------------------------- 1 | const ExplorerController = require("./controllers/ExplorerController"); 2 | const express = require("express"); 3 | const { response } = require("express"); 4 | const { request } = require("express"); 5 | const app = express(); 6 | app.use(express.json()); 7 | const port = 3000; 8 | 9 | app.get("/", (request, response) => { 10 | response.json({message: "FizzBuzz Api welcome!"}); 11 | }); 12 | 13 | app.get("/v1/explorers/:mission", (request, response) => { 14 | const mission = request.params.mission; 15 | const explorersInMission = ExplorerController.getExplorersByMission(mission); 16 | response.json(explorersInMission); 17 | }); 18 | 19 | app.get("/v1/explorers/amount/:mission", (request, response) => { 20 | const mission = request.params.mission; 21 | const explorersAmountInMission = ExplorerController.getExplorersAmountByMission(mission); 22 | response.json({mission: request.params.mission, quantity: explorersAmountInMission}); 23 | }); 24 | 25 | app.get("/v1/explorers/usernames/:mission", (request, response) => { 26 | const mission = request.params.mission; 27 | const explorersUsernames = ExplorerController.getExplorersUsernamesByMission(mission); 28 | response.json({mission: request.params.mission, explorers: explorersUsernames}); 29 | }); 30 | 31 | app.get("/v1/fizzbuzz/:score", (request, response) => { 32 | const score = parseInt(request.params.score); 33 | const fizbuzTrick = ExplorerController.appFizzbuzz(score); 34 | response.json({score: score, tricks: fizbuzTrick}); 35 | }); 36 | 37 | app.listen(port, () => { 38 | console.log(`FizzBuzz API in localhost:${port}`); 39 | }); 40 | -------------------------------------------------------------------------------- /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 | ] --------------------------------------------------------------------------------