* 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>
		
			
				
	
	
	
		
			4.7 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	
			4.7 KiB
		
	
	
	
	
	
	
	
id, title, challengeType, forumTopicId
| id | title | challengeType | forumTopicId | 
|---|---|---|---|
| bd7158d8c443edefaeb5bd0e | URL Shortener Microservice | 4 | 301509 | 
Description
- 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.
*/