Impl: project requirements
This commit is contained in:
		
							parent
							
								
									671605c02d
								
							
						
					
					
						commit
						8072461ab2
					
				
							
								
								
									
										125
									
								
								index.js
									
									
									
									
									
								
							
							
						
						
									
										125
									
								
								index.js
									
									
									
									
									
								
							@ -2,9 +2,59 @@ require("dotenv").config();
 | 
			
		||||
const express = require("express");
 | 
			
		||||
const cors = require("cors");
 | 
			
		||||
const app = express();
 | 
			
		||||
const mongoose = require("mongoose");
 | 
			
		||||
const dns = require("dns");
 | 
			
		||||
 | 
			
		||||
// Basic Configuration
 | 
			
		||||
const port = process.env.PORT || 3000;
 | 
			
		||||
const MONGODB_URI = process.env.MONGODB_URI || "";
 | 
			
		||||
 | 
			
		||||
mongoose.connect(MONGODB_URI, {
 | 
			
		||||
  // @ts-ignore
 | 
			
		||||
  useNewUrlParser: true,
 | 
			
		||||
  useUnifiedTopology: true,
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const urlSchema = new mongoose.Schema({
 | 
			
		||||
  original: {
 | 
			
		||||
    type: String,
 | 
			
		||||
    unique: true,
 | 
			
		||||
  },
 | 
			
		||||
  short: { type: Number, unique: true },
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const Url = mongoose.model("Url", urlSchema);
 | 
			
		||||
 | 
			
		||||
const counterSchema = new mongoose.Schema({
 | 
			
		||||
  name: { type: String, unique: true },
 | 
			
		||||
  seq: { type: Number, default: 0 },
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const Counter = mongoose.model("Counter", counterSchema);
 | 
			
		||||
 | 
			
		||||
let shortUrlsCounter = 0;
 | 
			
		||||
 | 
			
		||||
Counter.findOne({ name: "shortUrl" })
 | 
			
		||||
  .then((counter) => {
 | 
			
		||||
    if (counter) {
 | 
			
		||||
      shortUrlsCounter = counter.seq;
 | 
			
		||||
      console.log(`Old counter: ${counter}`);
 | 
			
		||||
    } else {
 | 
			
		||||
      const shortUrlsCounterModel = new Counter({ name: "shortUrl" });
 | 
			
		||||
      shortUrlsCounterModel
 | 
			
		||||
        .save()
 | 
			
		||||
        .then((counter) => {
 | 
			
		||||
          if (counter) {
 | 
			
		||||
            shortUrlsCounter = counter.seq;
 | 
			
		||||
            console.log(`New counter: ${counter}`);
 | 
			
		||||
          } else {
 | 
			
		||||
            console.log(`Error: could not create a new counter`);
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
        .catch((err) => console.log(err));
 | 
			
		||||
    }
 | 
			
		||||
  })
 | 
			
		||||
  .catch((err) => console.log(err));
 | 
			
		||||
 | 
			
		||||
app.use(cors());
 | 
			
		||||
 | 
			
		||||
@ -14,9 +64,80 @@ app.get("/", function (req, res) {
 | 
			
		||||
  res.sendFile(process.cwd() + "/views/index.html");
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
app.use(express.urlencoded({ extended: false }));
 | 
			
		||||
 | 
			
		||||
// Your first API endpoint
 | 
			
		||||
app.get("/api/hello", function (req, res) {
 | 
			
		||||
  res.json({ greeting: "hello API" });
 | 
			
		||||
app.post("/api/shorturl/", (req, res) => {
 | 
			
		||||
  const original = req.body.url;
 | 
			
		||||
  try {
 | 
			
		||||
    const hostname = new URL(original).hostname;
 | 
			
		||||
    dns.lookup(hostname, (err, addr, family) => {
 | 
			
		||||
      if (err) {
 | 
			
		||||
        console.log(`Invalid url:\n${err}`);
 | 
			
		||||
        res.json({ error: "Invalid URL" });
 | 
			
		||||
      } else {
 | 
			
		||||
        Url.findOne({ original: original })
 | 
			
		||||
          .then((url) => {
 | 
			
		||||
            if (url)
 | 
			
		||||
              return res.json({
 | 
			
		||||
                original_url: original,
 | 
			
		||||
                short_url: url?.short,
 | 
			
		||||
              });
 | 
			
		||||
            const urlModel = new Url({
 | 
			
		||||
              original: original,
 | 
			
		||||
              short: shortUrlsCounter++,
 | 
			
		||||
            });
 | 
			
		||||
            Counter.findOneAndUpdate(
 | 
			
		||||
              { name: "shortUrl" },
 | 
			
		||||
              { $set: { seq: shortUrlsCounter } },
 | 
			
		||||
              { new: true }
 | 
			
		||||
            )
 | 
			
		||||
              .then((counter) => {
 | 
			
		||||
                if (counter)
 | 
			
		||||
                  console.log(`${counter?.name} updated to ${counter?.seq}`);
 | 
			
		||||
                else {
 | 
			
		||||
                  console.log(`Could not find "shortUrl" counter in DB`);
 | 
			
		||||
                  return res.sendStatus(500);
 | 
			
		||||
                }
 | 
			
		||||
              })
 | 
			
		||||
              .catch((err) => {
 | 
			
		||||
                console.log(`Error updating shortUrl counter in DB:\n${err}`);
 | 
			
		||||
                return res.sendStatus(500);
 | 
			
		||||
              });
 | 
			
		||||
            urlModel
 | 
			
		||||
              .save()
 | 
			
		||||
              .then((url) => {
 | 
			
		||||
                if (url)
 | 
			
		||||
                  return res.json({
 | 
			
		||||
                    original_url: original,
 | 
			
		||||
                    short_url: url?.short,
 | 
			
		||||
                  });
 | 
			
		||||
                console.log(`Unlikely scenario occurred!:\n${url}`);
 | 
			
		||||
                res.sendStatus(500);
 | 
			
		||||
              })
 | 
			
		||||
              .catch((err) => {
 | 
			
		||||
                console.log(`Inserting url to DB failed!:\n${err}`);
 | 
			
		||||
                res.sendStatus(500);
 | 
			
		||||
              });
 | 
			
		||||
          })
 | 
			
		||||
          .catch((err) => {
 | 
			
		||||
            console.log(`Query failed!:\n${err}`);
 | 
			
		||||
            res.sendStatus(500);
 | 
			
		||||
          });
 | 
			
		||||
      }
 | 
			
		||||
    });
 | 
			
		||||
  } catch (err) {
 | 
			
		||||
    res.json({ error: "Invalid URL" });
 | 
			
		||||
  }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
app.get("/api/shorturl/:shorturl", (req, res) => {
 | 
			
		||||
  const shorturl = Number(req.params.shorturl);
 | 
			
		||||
  Url.findOne({ short: shorturl })
 | 
			
		||||
    .then((url) => res.redirect(url.original))
 | 
			
		||||
    .catch((err) =>
 | 
			
		||||
      res.json({ error: "No short URL found for the given input" })
 | 
			
		||||
    );
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
app.listen(port, function () {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user