-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
150 lines (137 loc) · 3.33 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
const express = require('express')
const fetch = require('node-fetch')
const Airtable = require('airtable')
const bcrypt = require('bcryptjs')
fs = require('fs')
require('dotenv').config()
var base = new Airtable({ apiKey: process.env.AIRTABLE_API_KEY }).base(
process.env.AIRTABLE_BASE_ID
)
const path = require('path')
const util = require('util')
const dirPath = path.join(__dirname, '/../lib/404.html')
const readFile = util.promisify(fs.readFile)
function getErr() {
return readFile(dirPath, 'utf8')
}
const app = express()
app.use(express.urlencoded({ extended: true }))
app.use(express.json())
const username = process.env.GH_USERNAME
app.get('/gh/:repo', async (req, res, next) => {
try {
const repo = req.params.repo
const { ok: yuh } = await fetch(
`https://api.github.com/repos/${username}/${repo}`
)
if (yuh) {
return res.redirect(302, `https://github.com/${username}/${repo}`)
}
getErr().then((data) => {
return res.status(404).send(data)
})
} catch (e) {
console.error(e)
}
})
app.post('/api/shrtn', async (req, res) => {
const { linkName, link, backlink, password } = req.body
if (backlink.slice(0, 1) == '/') {
var backlink1 = backlink.slice(1)
} else {
var backlink1 = backlink
}
bcrypt.compare(password, process.env.SHRTN, function (err, result) {
if (err) {
console.log(err)
return res.send({ error: true, err })
} else {
if (result === true) {
base('Links')
.select({
maxRecords: 1,
filterByFormula: `LOWER(resolvedUid) = "${backlink1.toLowerCase()}"`
})
.eachPage(
function page(records) {
if (records.length > 0) {
return res.send({ error: true, message: 'Backlink in use.' })
} else {
base('Links').create(
[
{
fields: {
name: linkName,
url: link,
uid: backlink1,
disabled: false
}
}
],
function (err, records) {
if (err) {
console.error(err)
return res.send({ error: true, message: err })
}
//success
return res.send({
error: false,
message: 'Link shortened succesfully.',
backlink1,
link
})
}
)
}
},
function done(err) {
if (err) {
console.error(err)
return res.send({ error: true, message: err })
}
}
)
} else {
return res.send({ error: true, message: 'Incorrect password.' })
}
}
})
})
app.get('/*', async (req, res) => {
const url = req.url.slice(1).toLowerCase()
base('Links')
.select({
maxRecords: 1,
filterByFormula: `resolvedUid = "${url}"`
})
.eachPage(
function page(records) {
if (records.length > 0) {
if (records[0].get('disabled') === true) {
getErr().then((data) => {
return res.status(404).send(data)
})
} else {
var redirectUri = records[0].get('url')
return res.status(302).redirect(redirectUri)
}
} else {
getErr().then((data) => {
return res.status(404).send(data)
})
}
},
function done(err) {
if (err) {
console.error(err)
getErr().then((data) => {
return res.status(404).send(data)
})
}
}
)
})
const port = process.env.PORT || 3000
app.listen(port, (err) => {
if (err) throw err
})