forked from Jaxcom/messaging-sample-app
-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.js
122 lines (106 loc) · 3.81 KB
/
server.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
require("dotenv").config();
const path = require("path");
const bodyParser = require("body-parser");
const Bandwidth = require("@bandwidth/messaging");
const express = require("express");
const app = require("express")();
const server = require("http").createServer(app);
const io = require("socket.io")(server);
const DatabaseConnector = require("./src/databaseConnector");
const db = new DatabaseConnector();
const port = process.env.PORT || 3000;
const APPLICATION_FROM_NUMBERS = process.env.APPLICATION_FROM_NUMBERS.split(",");
const client = new Bandwidth.Client({
basicAuthUserName: process.env.BANDWIDTH_API_TOKEN,
basicAuthPassword: process.env.BANDWIDTH_API_SECRET
});
const bandwidthController = new Bandwidth.ApiController(client);
app.use(bodyParser.json());
app.get("/health", async (req, res) => {
res.status(200).send("ok");
});
app.post("/callback", async (req, res) => {
const callback = req.body[0];
if (callback && callback.message) {
console.log(`callback received ${callback.type} for ${callback.message.id}`);
console.log(`${JSON.stringify(callback.message)}`);
}
if (callback && callback.type === "message-received") {
const message = callback.message;
const threadId = db.getThreadIdForMessage(message);
console.log(`thread id is ${threadId}`);
await createNewThreadIfNeeded(message);
await db.insertMessage(message);
console.log(`message received. saved message ${message.id} to the db`);
res.status(200).send();
updateWebClients(threadId);
} else {
res.status(200).send();
}
});
app.get("/api/fromNumbers", async (req, res) => {
res.send(APPLICATION_FROM_NUMBERS);
});
app.get("/api/threads", async (req, res) => {
const threads = await db.getAllThreads();
console.log(`threads: ${JSON.stringify(threads)}`);
res.send(threads);
});
app.get("/api/threads/:threadId", async (req, res) => {
const threadId = req.params.threadId;
res.send(await db.getMessagesForThread(threadId));
await db.clearUnreadMessagesForThread(threadId);
updateWebClients(threadId);
});
app.get("/api/threads/:threadId/:messageId", async (req, res) => {
const messageId = req.params.messageId;
res.send(await db.message(messageId));
});
app.post("/api/threads/:threadId", async (req, res) => {
try {
const participants = req.params.threadId.split(",");
const from = req.body.from
const recipients = req.body.to.split(",");
if (!APPLICATION_FROM_NUMBERS.includes(from)) {
throw `Unrecognized From number ${from}`;
}
console.log(`sending from ${from} to ${recipients}`);
const response = await bandwidthController.createMessage(process.env.BANDWIDTH_ACCOUNT_ID, {
from: from,
to: recipients,
text: req.body.text,
applicationId: process.env.APPLICATION_ID
});
const message = response.result;
const threadId = db.getThreadIdForMessage(message);
await createNewThreadIfNeeded(message);
await db.insertMessage(message);
console.log(`saved message ${message.id} to the db`);
res.send(message);
updateWebClients(threadId);
} catch (e) {
console.error(e);
res.status(500).send(e.message);
}
});
app.use("/", express.static("client/build"));
app.get("/*", (req, res) => {
res.sendFile(path.join(__dirname, "client/build/index.html"));
});
async function createNewThreadIfNeeded(message) {
const threadId = db.getThreadIdForMessage(message);
const isNewThread = !(await db.threadExists(threadId));
if (isNewThread) {
console.log(`creating new thread ${threadId}`);
await db.insertThread(threadId, message.text);
}
}
async function updateWebClients(threadId) {
io.emit("threads", await db.getAllThreads());
io.emit("messages", {
threadId: threadId,
messages: await db.getMessagesForThread(threadId)
});
}
server.listen(port);
console.log(`Server listening on port ${port}`);