forked from nkowaokwu/igbo-api-admin
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.tsx
129 lines (120 loc) · 5.05 KB
/
index.tsx
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
123
124
125
126
127
128
129
import * as functions from 'firebase-functions';
import fs from 'fs';
import express from 'express';
import cors from 'cors';
import mongoose from 'mongoose';
import bodyParser from 'body-parser';
import './src/backend/shared/utils/wrapConsole';
import { sendWeeklyStats, onSendEditorReminderEmail } from './src/backend/services/emailJobs';
import {
onUpdateDashboardStats,
onUpdateTotalAudioDashboardStats,
getLoginStats,
} from './src/backend/controllers/stats';
import triggersRouter from './src/backend/routers/triggersRouter';
import apiRouter from './src/backend/routers/apiRouter';
import editorRouter from './src/backend/routers/editorRouter';
import crowdsourcerRouter from './src/backend/routers/crowdsourcerRouter';
import transcriberRouter from './src/backend/routers/transcriberRouter';
import adminRouter from './src/backend/routers/adminRouter';
import testRouter from './src/backend/routers/testRouter';
import errorHandler from './src/backend/middleware/errorHandler';
import afterRes from './src/backend/middleware/afterRes';
import { onCreateUserAccount, onDeleteUser, onUpdatePermissions } from './src/backend/functions/users';
import { onRequestDeleteDocument, onUpdateDocument } from './src/backend/functions/documents';
import { onTwitterAuth, onTwitterCallback, onDeleteConstructedTermPoll } from './src/backend/controllers/polls';
import { onMediaSignedRequest } from './src/backend/controllers/media';
import {
CORS_CONFIG,
EXPRESS_PORT,
IGBO_API_VOLUNTEER_HOME_BASE,
WORD_CHECKLIST_URL,
isProduction,
} from './src/backend/config';
const server = express();
const index = fs.readFileSync(`${__dirname}/index.html`, 'utf-8');
server.use(bodyParser.json());
server.options('*', cors(CORS_CONFIG));
server.use(cors(CORS_CONFIG));
server.use(afterRes()); // Handles closing MongoDB connections after each request
server.use('/favicon.ico', (_, res) => res.send('favicon'));
if (isProduction) {
server.use('/test', testRouter);
}
server.get('/gettingstarted', (_, res) => res.redirect(301, IGBO_API_VOLUNTEER_HOME_BASE));
server.get('/checklist', (_, res) => res.redirect(301, WORD_CHECKLIST_URL));
server.use('/triggers', triggersRouter);
server.get('/twitter_auth', onTwitterAuth);
server.get('/twitter_callback', onTwitterCallback);
server.get('/stats/login', getLoginStats);
server.use(apiRouter);
server.use(crowdsourcerRouter);
server.use(transcriberRouter);
server.use(editorRouter);
server.use(adminRouter);
server.get('**', (_, res) => {
const html = '';
const finalHtml = index.replace('<!-- ::APP:: -->', html);
res.setHeader('Access-Control-Allow-Origin', '*');
res.send(finalHtml);
});
server.use(errorHandler);
// Firebase Functions
export const createUserAccount = onCreateUserAccount;
export const updatePermissions = onUpdatePermissions;
export const requestDeleteDocument = onRequestDeleteDocument;
export const deleteConstructedTermPoll = onDeleteConstructedTermPoll;
export const deleteUser = onDeleteUser;
export const updateDocument = onUpdateDocument;
export const generateMediaSignedRequest = onMediaSignedRequest;
/* Runs every Monday at 6AM PST */
export const sendEditorStatsEmail = functions.pubsub
.schedule('0 6 * * 1')
.timeZone('America/Los_Angeles')
.onRun(sendWeeklyStats);
export const sendEditorReminderEmail = functions.pubsub
.schedule('0 6 */4 * *')
.timeZone('America/Los_Angeles')
.onRun(onSendEditorReminderEmail);
/* Runs at minute 0, 10, 20, 30, 40, and 50 past every hour from 8AM through 10PM WAT */
export const calculateDashboardStats = functions
.region('us-central1', 'europe-west3')
.runWith({ timeoutSeconds: 540 })
.pubsub.schedule('0,10,20,30,40,50 8-22 * * *')
.timeZone('Africa/Lagos')
.onRun(onUpdateDashboardStats);
/* Runs everyday at 6AM PST */
export const calculateTotalAudioHours = functions
.region('us-central1', 'europe-west3')
.runWith({ timeoutSeconds: 540 })
.pubsub.schedule('0 6 * * *')
.timeZone('America/Los_Angeles')
.onRun(onUpdateTotalAudioDashboardStats);
/**
* Determines whether or not in a backend testing environment or in a
* frontend testing or development environment.
*
* If in a backend testing environment, app will be assigned to the raw
* Express app.
*
* If in a frontend testing or development environment, then app will
* be assigned to the Firebase wrapped server.
*/
export const app =
process.env.NODE_ENV === 'test'
? (() => {
/* Export just the Express app while testing the backend */
const expressServer = server.listen(EXPRESS_PORT, () => {
// @ts-ignore
console.blue(`\nExpress app listening on port ${EXPRESS_PORT}`);
});
expressServer.on('error', (err) => {
if (err.message.startsWith('listen EADDRINUSE: address already in use')) {
// Tests will attempt to open new servers, this conditional handles that case
}
});
// @ts-expect-error
expressServer.clearDatabase = mongoose.connection.dropDatabase;
return expressServer;
})()
: functions.region('us-central1', 'europe-west3').runWith({ timeoutSeconds: 540 }).https.onRequest(server);