{
  "name": "API and Microservice Projects",
  "order": 4,
  "time": "150 hours",
  "helpRoom": "HelpBackend",
  "challenges": [
    {
      "id": "57ed709d334ad35e8fe79acb",
      "title": "New Backend Format",
      "isBeta": "true",
      "meta": "This is just a test",
      "description": [
        "This is just a test of the new backend challenge test framework"
      ],
      "tests": [
        {
          "text": "website should return 200",
          "testString": "getUserInput => $.ajax({ url: getUserInput('url'), method: 'HEAD' }).then(null, (err) => assert.fail(err));"
        },
        {
          "text": "package.json should have a valid \"keywords\" key",
          "testString": "getUserInput => ($.get(getUserInput('url') + '/_api/package.json').then(function(data){ var packJson = JSON.parse(data); assert(packJson.keywords); }, err => { throw new Error('Err: ' + err.statusText);}))"
        },
        {
          "text": "\"keywords\" field should be an Array",
          "testString": "getUserInput => ($.get(getUserInput('url') + '/_api/package.json').then(function(data){ var packJson = JSON.parse(data); assert.isArray(packJson.keywords); }, err => { throw new Error('Err: ' + err.statusText);}))"
        },
        {
          "text": "\"keywords\" should include \"freecodecamp\"",
          "testString": "getUserInput => ($.get(getUserInput('url') + '/_api/package.json').then(function(data){ var packJson = JSON.parse(data); assert.include(packJson.keywords, 'freecodecamp'); }, err => { throw new Error('Err: ' + err.statusText); }))"
        }
      ],
      "type": "backend"
    },
    {
      "id": "bd7158d8c443edefaeb5bdef",
      "title": "Timestamp Microservice",
      "description": [
        "Build a full stack JavaScript app that is functionally similar to this: <a href='https://curse-arrow.glitch.me/' target='_blank'>https://curse-arrow.glitch.me/</a>.",
        "Working on this project will involve you writing your code on Glitch on our starter project. After completing this project you can copy your public glitch url (to the homepage of your app) into this screen to test it! Optionally you may choose to write your project on another platform but it must be publicaly visible for our testing.",
        "Start this project on Glitch using <a href='https://glitch.com/#!/import/github/freeCodeCamp/boilerplate-project-timestamp/'>this link</a> or clone <a href='https://github.com/freeCodeCamp/boilerplate-project-timestamp/'>this repository</a> on GitHub! If you use Glitch, remember to save the link to your project somewhere safe!"
      ],
      "challengeSeed": [],
      "tests": [
        {
          "text": "I can pass a string as a parameter, and it will check to see whether that string contains either a unix timestamp or a natural language date (example: January 1, 2016).",
          "testString": ""
        },
        {
          "text": "If it does, it returns both the Unix timestamp and the natural language form of that date.",
          "testString": ""
        },
        {
          "text": "If it does not contain a date or Unix timestamp, it returns null for those properties.",
          "testString": ""
        }
      ],
      "solutions": [],
      "hints": [],
      "type": "backend",
      "isRequired": true,
      "releasedOn": "January 1, 2016",
      "translations": {
        "es": {
          "title": "Microservicio de Marca Temporal"
        }
      }
    },
    {
      "id": "bd7158d8c443edefaeb5bdff",
      "title": "Request Header Parser Microservice",
      "description": [
        "Build a full stack JavaScript app that is functionally similar to this: <a href='https://dandelion-roar.glitch.me/' target='_blank'>https://dandelion-roar.glitch.me/</a>.",
        "Working on this project will involve you writing your code on Glitch on our starter project. After completing this project you can copy your public glitch url (to the homepage of your app) into this screen to test it! Optionally you may choose to write your project on another platform but it must be publicaly visible for our testing.",
        "Start this project on Glitch using <a href='https://glitch.com/#!/import/github/freeCodeCamp/boilerplate-project-headerparser/'>this link</a> or clone <a href='https://github.com/freeCodeCamp/boilerplate-project-headerparser/'>this repository</a> on GitHub! If you use Glitch, remember to save the link to your project somewhere safe!"
      ],
      "challengeSeed": [],
      "tests": [
        {
          "text": "I can get the IP address, language and operating system for my browser.",
          "testString": ""
        }
      ],
      "solutions": [],
      "hints": [],
      "type": "backend",
      "isRequired": true,
      "releasedOn": "January 1, 2016",
      "translations": {
        "es": {
          "title": "Microservicio para analizar el encabezado de una petición"
        }
      }
    },
    {
      "id": "bd7158d8c443edefaeb5bd0e",
      "title": "URL Shortener Microservice",
      "description": [
        "Build a full stack JavaScript app that is functionally similar to this: <a href='https://thread-paper.glitch.me/' target='_blank'>https://thread-paper.glitch.me/</a>.",
        "Working on this project will involve you writing your code on Glitch on our starter project. After completing this project you can copy your public glitch url (to the homepage of your app) into this screen to test it! Optionally you may choose to write your project on another platform but it must be publicaly visible for our testing.",
        "Start this project on Glitch using <a href='https://glitch.com/#!/import/github/freeCodeCamp/boilerplate-project-urlshortener/'>this link</a> or clone <a href='https://github.com/freeCodeCamp/boilerplate-project-urlshortener/'>this repository</a> on GitHub! If you use Glitch, remember to save the link to your project somewhere safe!"
      ],
      "challengeSeed": [],
      "tests": [
        {
          "text": "I can pass a URL as a parameter and I will receive a shortened URL in the JSON response.",
          "testString": ""
        },
        {
          "text": "If I pass an invalid URL that doesn't follow the valid http://www.example.com format, the JSON response will contain an error instead.",
          "testString": ""
        },
        {
          "text": "When I visit that shortened URL, it will redirect me to my original link.",
          "testString": ""
        }
      ],
      "solutions": [],
      "hints": [],
      "type": "backend",
      "isRequired": true,
      "releasedOn": "January 1, 2016",
      "translations": {
        "es": {
          "title": "Microservicio para acortar URLs"
        }
      }
    },
    {
      "id": "5a8b073d06fa14fcfde687aa",
      "title": "Exercise Tracker",
      "description": [
        "Build a full stack JavaScript app that is functionally similar to this: <a href='https://fuschia-custard.glitch.me/' target='_blank'>https://fuschia-custard.glitch.me/</a>.",
        "Working on this project will involve you writing your code on Glitch on our starter project. After completing this project you can copy your public glitch url (to the homepage of your app) into this screen to test it! Optionally you may choose to write your project on another platform but it must be publicaly visible for our testing.",
        "Start this project on Glitch using <a href='https://glitch.com/#!/import/github/freeCodeCamp/boilerplate-project-exercisetracker/'>this link</a> or clone <a href='https://github.com/freeCodeCamp/boilerplate-project-exercisetracker/'>this repository</a> on GitHub! If you use Glitch, remember to save the link to your project somewhere safe!"
      ],
      "challengeSeed": [],
      "tests": [
        {
          "text": "I can create a user by posting form data username to /api/exercise/new-user and returned will be an object with username and <code>_id</code>.",
          "testString": ""
        },
        {
          "text": "I can get an array of all users by getting api/exercise/users with the same info as when creating a user.",
          "testString": ""
        },
        {
          "text": "I can add an exercise to any user by posting form data userId(_id), description, duration, and optionally date to /api/exercise/add. If no date supplied it will use current date. App will return the user object with the exercise fields added.",
          "testString": ""
        },
        {
          "text": "I can retrieve a full exercise log of any user by getting /api/exercise/log with a parameter of userId(_id). App will return the user object with added array log and count (total exercise count).",
          "testString": ""
        },
        {
          "text": "I can retrieve part of the log of any user by also passing along optional parameters of from & to or limit. (Date format yyyy-mm-dd, limit = int)",
          "testString": ""
        }
      ],
      "solutions": [],
      "hints": [],
      "type": "backend",
      "isRequired": true,
      "releasedOn": "February 17, 2017",
      "translations": {
        "es": {
          "title": "Capa de abstracción para buscar imágenes"
        }
      }
    },
    {
      "id": "bd7158d8c443edefaeb5bd0f",
      "title": "File Metadata Microservice",
      "description": [
        "Build a full stack JavaScript app that is functionally similar to this: <a href='https://purple-paladin.glitch.me/' target='_blank'>https://purple-paladin.glitch.me/</a>.",
        "Working on this project will involve you writing your code on Glitch on our starter project. After completing this project you can copy your public glitch url (to the homepage of your app) into this screen to test it! Optionally you may choose to write your project on another platform but it must be publicaly visible for our testing.",
        "Start this project on Glitch using <a href='https://glitch.com/#!/import/github/freeCodeCamp/boilerplate-project-filemetadata/'>this link</a> or clone <a href='https://github.com/freeCodeCamp/boilerplate-project-filemetadata/'>this repository</a> on GitHub! If you use Glitch, remember to save the link to your project somewhere safe!"
      ],
      "challengeSeed": [],
      "tests": [
        {
          "text": "I can submit a FormData object that includes a file upload.",
          "testString": ""
        },
        {
          "text": "When I submit something, I will receive the file size in bytes within the JSON response.",
          "testString": ""
        }
      ],
      "solutions": [],
      "hints": [],
      "type": "backend",
      "isRequired": true,
      "releasedOn": "January 1, 2016",
      "translations": {
        "es": {
          "title": "Microservicio de metadatos de archivos"
        }
      }
    }
  ]
}
