Browse Source

Added link tracking

James Peret 2 years ago
parent
commit
da2b53f6df
4 changed files with 45 additions and 7 deletions
  1. 38 1
      index.js
  2. 3 3
      package-lock.json
  3. 1 1
      package.json
  4. 3 2
      readme.md

+ 38 - 1
index.js

@@ -9,7 +9,7 @@ var db = require("kairoscope-db-models");
 
 var e = chalk.red('ERROR:');
 
-db.start_database().then(() => {
+db.start().then(() => {
   app.get('/', (req, res) => {
       res.send("Mail Analytics Service");
   })
@@ -27,6 +27,43 @@ db.start_database().then(() => {
       }
     }).catch((error) => { console.log(error); });
   });
+
+  app.get('/track/:id/redirect', function(req, res, next){
+    var id = req.params.id;
+    var url = req.query.url;
+    var link_title = req.query.link;
+    res.redirect(url);
+    console.log(`Redirecting to ${chalk.green(`\'${url}\'`)}`);
+    db.SentMail.findOne({message_id: id}).then((message) => {
+      if(message != undefined) {
+        var duplicate = false;
+        var link = undefined;
+        for (let i = 0; i < message.opened_links.length; i++) {
+          link = message.opened_links[i];
+          if(link.title == link_title){
+            duplicate = true;
+            link.clicks += 1;
+            link.updated_date = Date.now();
+            break;
+          }
+        }
+        if(duplicate == false){
+          link = {
+            title: link_title,
+            url: url,
+            clicks: 1,
+            updated_date: Date.now(),
+          }
+          message.opened_links.push(link);
+        }
+        message.save().then((message) => {
+          console.log(`Tracking link click ${chalk.italic(link_title)} from email ${chalk.italic(id)} (clicked ${link.clicks}x)`);
+        }).catch((error) => { console.log(error); });  
+      } else {
+        console.log(`${e} Tracking code not in database! (${chalk.italic(id)})`);
+      }
+    }).catch((error) => { console.log(error); });
+  });
   
   
   app.listen(port, () => {

+ 3 - 3
package-lock.json

@@ -279,9 +279,9 @@
       "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
     },
     "kairoscope-db-models": {
-      "version": "0.1.0",
-      "resolved": "https://registry.kairoscope.net/kairoscope-db-models/-/kairoscope-db-models-0.1.0.tgz",
-      "integrity": "sha512-lEiRF2vpmP/JhuXGnOMM8xwu7UDuwj26288EBRcuXJnvF5x3Z/NuzF5wHnfJ//0TnIybtDPeEH0CXoKfRY5+bA==",
+      "version": "0.1.3",
+      "resolved": "https://registry.kairoscope.net/kairoscope-db-models/-/kairoscope-db-models-0.1.3.tgz",
+      "integrity": "sha512-zDfqr+mYdvbnfrRtZ8oM4Z+BGQqp99Dplf3A1Y+M+xxRUeIVLfjaGnfkAE/YSlBH1/kgGP7kHsEX90/HRcZCyQ==",
       "requires": {
         "chalk": "^4.1.2",
         "mongoose": "^6.0.8"

+ 1 - 1
package.json

@@ -12,7 +12,7 @@
   "dependencies": {
     "chalk": "^4.1.2",
     "express": "^4.17.1",
-    "kairoscope-db-models": "^0.1.0",
+    "kairoscope-db-models": "^0.1.3",
     "mongoose": "^6.0.8"
   }
 }

+ 3 - 2
readme.md

@@ -12,5 +12,6 @@ The **mail-delivery-service** also puts a tracking pixel in each email. The anal
 - [ ] API endpoint for receiving webhooks for failure in mail delivery 
 - [ ] API endpoint for receiving webhooks for bounced emails
 - [X] endpoint for serving the tracking pixel image
-- [ ] endpoint for redirecting links
-- [ ] update email data in database
+- [X] update email data in database for tracking pixel image
+- [X] endpoint for redirecting links
+- [X] update email data in database for tracked links