-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.ts
118 lines (96 loc) · 3.36 KB
/
app.ts
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
import { createServer } from "http"
import { createCustomLogger } from "./src/logger"
import { configureTimezone } from "./src/utils/configureTimezone"
import express from "express"
import cors from "cors"
import {
IS_PRODUCTION,
MONGODB_CONNECTION_URL,
ORIGIN,
PORT,
SERVER_TIMEZONE,
} from "./src/constants"
import "reflect-metadata"
import mongoose from "mongoose"
import { getApolloConfig } from "./src/config/apollo.config"
import { ApolloServer } from "apollo-server-express"
export const startApp = async () => {
const logger = createCustomLogger("APP")
configureTimezone()
logger.info("initializing the app")
const app = express()
app.set("trust proxy", true)
//http server
const httpServer = createServer(app)
//middlewares
app.use(express.json())
app.use(cors({ origin: ORIGIN }))
// app.use(helmet({ contentSecurityPolicy: true }))
//healthcheck
app.get("/", (_, res) => res.status(200).end())
logger.info(`using server timezone "${SERVER_TIMEZONE}"`)
process.env.TZ = SERVER_TIMEZONE
logger.info("initializing connection to the database")
if (!MONGODB_CONNECTION_URL) {
logger.error(`server error: env var MONGODB_CONNECTION_URL not found`)
logger.info("exiting process")
httpServer.close()
process.exit()
}
mongoose.set("strictQuery", true)
await mongoose.connect(MONGODB_CONNECTION_URL).then(() => {
logger.info("connected to the database")
})
mongoose.connection.on("connected", () => {
logger.info("connected to database successfully")
})
mongoose.connection.on("disconnected", () => {
logger.info("disconnected from database")
if (IS_PRODUCTION) {
logger.info("exiting process")
httpServer.close()
process.exit()
}
})
mongoose.connection.on("error", (error) => {
logger.info(`connection to database failed: ${error.message}`)
if (IS_PRODUCTION) {
logger.info("exiting process")
httpServer.close()
process.exit()
}
})
logger.info("creating apollo config")
await getApolloConfig().then(async (config) => {
logger.info("initializing apollo server")
logger.profile("initialized the apollo server successfully")
const apolloServer = new ApolloServer(config)
await apolloServer.start().catch((error) => {
logger.error(`failed to start apollo server: ${error.message}`)
logger.info("exiting process")
process.exit()
})
apolloServer.applyMiddleware({
app,
cors: false,
})
logger.profile("initialized the apollo server successfully")
logger.info("initializing graphql subscription server")
logger.profile("initialized the graphql subscription server")
logger.profile(
"This app not using subscription or Add subscription in this app.ts file"
)
})
httpServer.on("error", (error) => {
logger.error(`http server failed: ${error.message}`)
logger.info("exiting process")
process.exit()
})
await new Promise<void>((resolve) => {
httpServer.listen(PORT, () => {
logger.info(`http server up and running at port ${PORT}`)
resolve()
})
})
return httpServer
}