-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.js
122 lines (109 loc) · 2.93 KB
/
app.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
'use strict';
import DotEnv from 'dotenv';
import Fastify from 'fastify';
import postgres from '@fastify/postgres';
import mysql from '@fastify/mysql';
import { loadErrorHandlers } from './errorHandlers.js';
import SES from './ses.js';
// Cannot change the Fastify logger later, so need to do this here
DotEnv.config();
const loggerConfig = {
development: {
transport: {
target: 'pino-pretty',
options: {
translateTime: 'HH:MM:ss Z',
ignore: 'pid,hostname,reqId',
singleLine: true,
},
},
level: 'debug'
},
production: true,
test: false,
}
// Global config options
const fastify = Fastify({
logger: loggerConfig[process.env.NODE_ENV] ?? true,
trustProxy: process.env.NODE_ENV === 'production',
});
const databases = [];
if ('DB_POSTFIX_HOST' in process.env) {
databases.push({
host: process.env.DB_POSTFIX_HOST,
type: process.env.DB_POSTFIX_TYPE,
port: process.env.DB_POSTFIX_PORT,
user: process.env.DB_POSTFIX_USER,
pass: process.env.DB_POSTFIX_PASS,
name: process.env.DB_POSTFIX_NAME,
});
} else {
console.log('Postfix admin database not specified')
process.exit(1);
}
let i = 1;
let found = true;
while (found) {
if ('DB' + i + '_DOMAIN' in process.env) {
databases.push({
domain: process.env['DB' + i + '_DOMAIN'],
host: process.env['DB' + i + '_HOST'],
type: process.env['DB' + i + '_TYPE'].toLowerCase(),
port: process.env['DB' + i + '_PORT'],
user: process.env['DB' + i + '_USER'],
pass: process.env['DB' + i + '_PASS'],
name: process.env['DB' + i + '_NAME'],
});
} else {
found = false;
}
i++;
}
for (const database of databases) {
const name = ('domain' in database) ? database.domain : 'postfix';
if (database.type === 'postgres') {
await fastify.register(postgres, {
name,
host: database.host,
user: database.user,
password: database.pass,
port: database.port,
database: database.name,
});
} else if (database.type === 'mysql' || database.type.startsWith('maria') || database.type.startsWith('aurora')) {
await fastify.register(mysql, {
name,
host: database.host,
user: database.user,
password: database.pass,
port: database.port,
database: database.name,
});
}
}
fastify.get('/', async function (request, reply) {
return reply.header('Content-Type', 'application/json; charset=utf-8').send({ running: true });
});
fastify.post('/bounce/', async function(request, reply) {
return (new SES(fastify, request, reply)).bounce();
});
fastify.post('/complaint/', async function(request, reply) {
return (new SES(fastify, request, reply)).complaint();
});
fastify.post('/delivery/', async function(request, reply) {
return (new SES(fastify, request, reply)).delivery();
});
loadErrorHandlers(fastify);
// Start Fastify
const start = async () => {
try {
await fastify.listen({
host: process.env.HOST,
port: process.env.PORT,
});
} catch (err) {
fastify.log.error(err);
process.exit(1);
}
};
await start();