Randell Dawson b47487b8b2
fix(learn): Change Node project descriptions to all use same template (#40266)
* fix/change-node-project-descriptions-to-all-use-same-template

* fix: use correct boilerplate

Co-authored-by: Nicholas Carrigan (he/him) <nhcarrigan@gmail.com>

* fix: add url to link text

Co-authored-by: Nicholas Carrigan (he/him) <nhcarrigan@gmail.com>

* fix: add _blank for target attribute

Co-authored-by: Nicholas Carrigan (he/him) <nhcarrigan@gmail.com>

* fix: add missing single quote

Co-authored-by: Nicholas Carrigan (he/him) <nhcarrigan@gmail.com>

* fix: remove extra lines

* fix: improved wording of description

Co-authored-by: Shaun Hamilton <51722130+Sky020@users.noreply.github.com>

* fix: move sentence to previous paragraph

Co-authored-by: Shaun Hamilton <51722130+Sky020@users.noreply.github.com>

* fix: move sentence to previous paragraph

* fix: move sentence to previous paragraph

Co-authored-by: Nicholas Carrigan (he/him) <nhcarrigan@gmail.com>
Co-authored-by: Shaun Hamilton <51722130+Sky020@users.noreply.github.com>
2020-11-20 12:02:31 -08:00

4.7 KiB

id, title, challengeType, forumTopicId
id title challengeType forumTopicId
bd7158d8c443edefaeb5bd0e URL Shortener Microservice 4 301509

Description

Build a full stack JavaScript app that is functionally similar to this: https://url-shortener-microservice.freecodecamp.rocks/. Working on this project will involve you writing your code using one of the following methods:
  • Clone this GitHub repo and complete your project locally.
  • Use our repl.it starter project to complete your project.
  • Use a site builder of your choice to complete the project. Be sure to incorporate all the files from our GitHub repo.

When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the Solution Link field. Optionally, also submit a link to your projects source code in the GitHub Link field.

Instructions

HINT: Do not forget to use a body parsing middleware to handle the POST requests. Also, you can use the function dns.lookup(host, cb) from the dns core module to verify a submitted URL.

Tests

tests:
  - text: You should provide your own project, not the example URL.
    testString: |
      getUserInput => {
        assert(!/.*\/url-shortener-microservice\.freecodecamp\.rocks/.test(getUserInput('url')));
      }

  - text: "You can POST a URL to `/api/shorturl/new` and get a JSON response with `original_url` and `short_url` properties. Here's an example: `{ original_url : 'https://freeCodeCamp.org', short_url : 1}`"
    testString: "async getUserInput => {
      const url = getUserInput('url');
      const urlVariable = Date.now();
      const res = await fetch(url + '/api/shorturl/new/', {
        method: 'POST',
        headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
        body: `url=https://timestamp-microservice.freecodecamp.rocks/api/timestamp/${urlVariable}`
      });

      if (res.ok) {
        const { short_url, original_url } = await res.json();
        assert.isNotNull(short_url);
        assert.match(original_url, new RegExp(`https://timestamp-microservice.freecodecamp.rocks/api/timestamp/${urlVariable}`));
      } else {
        throw new Error(`${res.status} ${res.statusText}`);
      }
    }
    "

  - text: When you visit `/api/shorturl/<short_url>`, you will be redirected to the original URL.
    testString: "async getUserInput => {
      const url = getUserInput('url');
      const urlVariable = Date.now();
      let shortenedUrlVariable;

      const postResponse = await fetch(url + '/api/shorturl/new/', {
        method: 'POST',
        headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
        body: `url=https://timestamp-microservice.freecodecamp.rocks/api/timestamp/${urlVariable}`
      });

      if (postResponse.ok) {
        const { short_url } = await postResponse.json();
        shortenedUrlVariable = short_url;
      } else {
        throw new Error(`${postResponse.status} ${postResponse.statusText}`);
      }

      const getResponse = await fetch(url + '/api/shorturl/' + shortenedUrlVariable);

      if (getResponse) {
        const { redirected, url } = getResponse;

        assert.isTrue(redirected);
        assert.strictEqual(url, `https://timestamp-microservice.freecodecamp.rocks/api/timestamp/${urlVariable}`);
      } else {
        throw new Error(`${getResponse.status} ${getResponse.statusText}`);
      }
    }
    "

  - text: "If you pass an invalid URL that doesn't follow the valid `http://www.example.com` format, the JSON response will contain `{ error: 'invalid url' }`"
    testString: "async getUserInput => {
      const url = getUserInput('url');
      const res = await fetch(url + '/api/shorturl/new/', {
        method: 'POST',
        headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
        body:  `url=ftp:/john-doe.org`
      });

      if (res.ok) {
        const { error } = await res.json();
        assert.isNotNull(error);
        assert.strictEqual(error.toLowerCase(), 'invalid url');
      } else {
        throw new Error(`${res.status} ${res.statusText}`);
      }
    }
    "

Challenge Seed

Solution

/**
  Backend challenges don't need solutions, 
  because they would need to be tested against a full working project. 
  Please check our contributing guidelines to learn more.
*/