const express = require('express') const Webtask = require('webtask-tools') const cors = require('cors') const crypto = require('crypto') const bodyParser = require('body-parser') const request = require('request') const server = express() server.listen(4430) server.use(bodyParser.json()) // // Allow requests from these domains only // const corsOptions = { origin: ['https://oceanprotocol.com', /\.oceanprotocol\.com$/], optionsSuccessStatus: 200 // some legacy browsers (IE11, various SmartTVs) choke on 204 } server.use(cors(corsOptions)) const baseUrl = 'https://us16.api.mailchimp.com/3.0' const listId = '3c6eed8b71' const md5 = data => crypto.createHash('md5').update(data).digest('hex') server.post('/newsletter/:email', (req, res) => { const { email } = req.params const { MAILCHIMP_API_KEY } = req.webtaskContext.secrets const emailDecoded = decodeURIComponent(email) const subscriberHash = md5(emailDecoded) const baseOptions = { url: `${baseUrl}/lists/${listId}/members/${subscriberHash}`, 'auth': { 'user': 'oceanprotocol', 'pass': MAILCHIMP_API_KEY } } const optionsCreate = { ...baseOptions, json: { 'email_address': emailDecoded, 'status': 'pending', // double opt-in 'merge_fields': { // our GDPR fallback 'GDPR': 'yes' } } } const optionsMarketing = marketingPermissionId => ( { ...baseOptions, json: { 'marketing_permissions': [{ 'marketing_permission_id': marketingPermissionId, 'text': 'Email', 'enabled': true }] } } ) const addMarketingPermissions = (data, cb) => { const marketingPermissionId = data.marketing_permissions[0].marketing_permission_id request.patch(optionsMarketing(marketingPermissionId), (error, response, body) => { if (error) res.send(error) return cb(body) }) } // Check if user exists first request.get(baseOptions, (error, response, body) => { if (error) res.send(error) const data = JSON.parse(body) // Member exists and is subscribed if (data.status === 'subscribed') { // Patch in native GDPR permissions addMarketingPermissions(data, () => { res.send('{ "status": "exists" }') }) } else { // Create user request.put(optionsCreate, (error2, response, body2) => { if (error2) res.send(error2) const data2 = JSON.parse(body2) if (Number.isInteger(data2.status)) { res.send(body2) } // Patch in native GDPR permissions addMarketingPermissions(data2, () => { res.send('{ "status": "created" }') }) }) } }) }) module.exports = Webtask.fromExpress(server)