Last active
January 13, 2021 17:59
-
-
Save polluterofminds/b26d5b5f8058b770c3e56ce5d3e7235c to your computer and use it in GitHub Desktop.
subscribe to posts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import axios from "axios"; | |
import jwt from "jsonwebtoken"; | |
const sgMail = require('@sendgrid/mail'); | |
sgMail.setApiKey("SENDGRID API KEY"); | |
const SECRET = "MY SUPER SECRET SIGNING KEY"; | |
const config = { | |
headers: { | |
Authorization: | |
"Bearer PINATA JWT", | |
"Content-Type": "application/json", | |
}, | |
}; | |
export const checkSubscriptions = async (email) => { | |
try { | |
const query = { value: email, op: "eq" }; | |
const res = await axios.get( | |
`https://api.pinata.cloud/data/pinList?status=pinned&metadata[keyvalues][email]=${JSON.stringify( | |
query | |
)}`, | |
config | |
); | |
if (res.data.count !== 0) { | |
return true; | |
} | |
return false; | |
} catch (error) { | |
throw error; | |
} | |
}; | |
const createNewSubscription = async (email) => { | |
const data = { | |
subscriptionaDate: new Date().toISOString(), | |
}; | |
const body = { | |
pinataMetadata: { | |
name: email, | |
keyvalues: { | |
email, | |
}, | |
}, | |
pinataContent: data, | |
}; | |
await axios.post( | |
`https://api.pinata.cloud/pinning/pinJSONToIPFS`, | |
JSON.stringify(body), | |
config | |
); | |
return; | |
} | |
export const createJWT = async (email) => { | |
try { | |
const data = { | |
email, | |
} | |
const token = await jwt.sign( | |
{ | |
data, | |
}, | |
SECRET, | |
{ expiresIn: "48h" } | |
); | |
return token; | |
} catch (error) { | |
throw error; | |
} | |
}; | |
export const sendEmail = async (email, token) => { | |
try { | |
const msg = { | |
to: email, | |
from: '[email protected]', | |
subject: 'Log Into Pinnie For Your Thoughts', | |
text: `To log into Pinnie For Your Thoughts, click this link or paste it in your browser: http://localhost:3000/verify?token=${token}`, | |
html: `<p>To log into Pinnie For Your Thoughts, click this link or paste it in your browser: <a href="http://localhost:3000/verify?token=${token}">Log in link</a></p>`, | |
}; | |
await sgMail.send(msg); | |
} catch (error) { | |
throw error; | |
} | |
} | |
export default async (req, res) => { | |
try { | |
// Check for existing subscription | |
const existingSubscription = await checkSubscriptions(req.body.email); | |
if (existingSubscription) { | |
return res.status(400).send("Subscription exists for this email"); | |
} | |
// Create a new subscription | |
await createNewSubscription(req.body.email); | |
// Create the JWT | |
const token = await createJWT(req.body.email); | |
// send email | |
await sendEmail(req.body.email, token); | |
res.status(200).send("Success"); | |
} catch (error) { | |
console.log(error); | |
res.status(500).send("Server error"); | |
} | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment