-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
177 lines (115 loc) · 3.47 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
const express = require('express')
const shortid= require('shortid')
const mongoose=require('mongoose')
const LongUrls=require('./models/long_url')
const createHttpError = require('http-errors')
const request=require('request')
const app = express()
shortid.characters('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$@');
const port = 3000
app.use(express.json())
try{
mongoose.connect('mongodb://localhost:27017',{
dbName:'Url-Project',
useNewUrlParser:true,
useUnifiedTopology:true,
},()=>
{
console.log("connected to db");
})
}
catch(e)
{
console.log("DB connection error!!")
}
app.get('/', (req, res) => {
res.send('API WORKING!')
})
// a long url will be shortened when this endpoint will be hit
app.post('/short', async (req, res) => {
try
{
const url = req.body.url;
// check the customId at the frontend as it should be less than 8 character
const customId=req.body.customId;
if(!url)
res.status(404).send("Provide a url to shorten!");
const urlExists = await LongUrls.findOne({longUrl:url})
// send the short id concatenated with the hostname and this will be copied by the user to access their main url
if(urlExists)
{
// this is preferred when hosting
// res.status(200).send(`http://${req.hostname}/${urlExists.shortUrl}`)
res.status(200).send(`http://${req.headers.host}/${urlExists.shortUrl}`)
return
}
let dummy=shortid.generate();
let check = await LongUrls.findOne({shortUrl:dummy})
// Now if the shortId is already present then we will generate a new one
if(check)
dummy=shortid.generate();
const shortenedUrl=customId?`${customId}/${dummy}`:dummy;
const longUrls=new LongUrls({longUrl:url, shortUrl: shortenedUrl})
const result = await longUrls.save()
res.send(`http://${req.headers.host}/${result.shortUrl}`);}
catch(err)
{
next(err);
}
})
app.get('/:id',async (req,res,next)=>{
try
{
const {id}=req.params
const result= await LongUrls.findOne({shortUrl:id})
console.log(result);
if(result== null)
{throw createHttpError.NotFound("url not exists anymore");
}
res.redirect(result.longUrl);
}
catch(err)
{
next(err);
}
})
app.post('/expand',async (req,res,next)=>
{
try{
let expand_it=req.body.shorturl;
if(!expand_it.startsWith('http')) expand_it="https://"+expand_it;
const options = {
url: expand_it,
method: 'GET',
followAllRedirects:true
};
// Here we are expanding the url and checking the response url where the shorturl points to and just sending it back to the client side
let expanded;
request(options, function(err, response, body) {
if(err)
next(createHttpError.NotFound("url not found"));
else{
expanded=response.request.href;
res.json({expanded})
console.log(response.request.href);
}
})
}
catch(err)
{
next(err);
}
})
// Error Routes middleware
app.use((req,res,next)=>
{
next(createHttpError.NotFound("hey bud this is an error🗿"));
})
app.use((err,req,res,next)=>
{
res.status(err.status || 500)
res.json(err.message || {"error":"Sorry for the inconvenience"});
})
app.listen(port, () => {
console.log(`URL Short/Expand API listening on port ${port}`)
})