-
-
Notifications
You must be signed in to change notification settings - Fork 41
Expand file tree
/
Copy pathindex.ts
More file actions
103 lines (90 loc) · 3.11 KB
/
index.ts
File metadata and controls
103 lines (90 loc) · 3.11 KB
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
import mongoose from 'mongoose'
import { ChangeStream } from 'mongodb'
import { config } from 'dotenv'
import { enableAllPlugins } from 'immer'
import { getAreaModel } from './AreaSchema.js'
import { getClimbModel } from './ClimbSchema.js'
import { getMediaObjectModel } from './MediaObjectSchema.js'
import { getOrganizationModel } from './OrganizationSchema.js'
import { getTickModel } from './TickSchema.js'
import { getXMediaModel } from './XMediaSchema.js'
import { getPostModel } from './PostSchema.js'
import { getChangeLogModel } from './ChangeLogSchema.js'
import { getExperimentalUserModel, getUserModel } from './UserSchema.js'
import { logger } from '../logger.js'
import streamListener from './edit/streamListener.js'
config()
enableAllPlugins()
export const checkVar = (name: string): string => {
const value = process.env[name] ?? ''
if (value === '') {
logger.error('Missing env ', name)
process.exit(1)
}
return value
}
const defaultFn = logger.info.bind(logger, 'DB connected successfully')
export const connectDB = async (onConnected: () => any = defaultFn): Promise<void> => {
const user = checkVar('MONGO_INITDB_ROOT_USERNAME')
const pass = checkVar('MONGO_INITDB_ROOT_PASSWORD')
const server = checkVar('MONGO_SERVICE')
const rsName = checkVar('MONGO_REPLICA_SET_NAME')
const scheme = checkVar('MONGO_SCHEME')
const authDb = checkVar('MONGO_AUTHDB')
const dbName = checkVar('MONGO_DBNAME')
const tlsFlag = checkVar('MONGO_TLS')
logger.info(
`Connecting to database 'mongodb://${user}:****@${server}'...`
)
try {
// /* eslint-disable @typescript-eslint/no-floating-promises */
mongoose.connection.on('open', onConnected)
mongoose.connection.on(
'error', (e) => {
logger.error('MongoDB connection error', e)
process.exit(1)
}
)
await mongoose.connect(
`${scheme}://${user}:${pass}@${server}/${dbName}?authSource=${authDb}&tls=${tlsFlag}&replicaSet=${rsName}`,
{ autoIndex: true }
)
} catch (e) {
logger.error("Can't connect to db")
process.exit(1)
}
}
export const createIndexes = async (): Promise<void> => {
await getClimbModel().createIndexes()
await getAreaModel().createIndexes()
await getOrganizationModel().createIndexes()
await getTickModel().createIndexes()
await getXMediaModel().createIndexes()
await getPostModel().createIndexes()
await getMediaObjectModel().createIndexes()
await getChangeLogModel().createIndexes()
await getUserModel().createIndexes()
}
export const gracefulExit = async (exitCode: number = 0): Promise<void> => {
await mongoose.connection.close(true)
logger.info('Gracefully exiting.')
}
export const defaultPostConnect = async (changeStreamListener = streamListener): Promise<ChangeStream> => {
console.log('Kudos!')
await createIndexes()
return await changeStreamListener()
}
// eslint-disable-next-line
process.on('SIGINT', gracefulExit).on('SIGTERM', gracefulExit)
export {
getOrganizationModel,
getAreaModel,
getTickModel,
getClimbModel,
getChangeLogModel,
getXMediaModel,
getPostModel,
getExperimentalUserModel,
getMediaObjectModel,
getUserModel
}