Skip to content

Commit addb5f3

Browse files
committed
refactor: add typing to client config options
1 parent a3c10a0 commit addb5f3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+479
-507
lines changed

packages/types/lib/config.d.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export interface Config<Client extends boolean = false>
3939
excludeFromTutorial: (keyof BaseConfig['authentication']['perms'])[]
4040
alwaysEnabledPerms: (keyof BaseConfig['authentication']['perms'])[]
4141
aliases: { role: string; name: string }[]
42+
methods: string[]
4243
strategies: [
4344
{
4445
trialPeriod: {
@@ -77,21 +78,27 @@ export interface Config<Client extends boolean = false>
7778
titles: string[]
7879
components: CustomComponent[]
7980
footerButtons: CustomComponent[]
80-
} & BaseConfig['map']['messageOfTheDay']
81+
} & Omit<
82+
BaseConfig['map']['messageOfTheDay'],
83+
'settings' | 'titles' | 'components' | 'footerButtons'
84+
>
8185
donationPage: {
8286
settings: {
8387
parentStyle: Record<string, string> // should be CSS properties but performance seems to die
8488
} & BaseConfig['map']['donationPage']['settings']
8589
titles: string[]
8690
components: CustomComponent[]
8791
footerButtons: CustomComponent[]
88-
} & BaseConfig['map']['donationPage']
92+
} & Omit<
93+
BaseConfig['map']['donationPage'],
94+
'settings' | 'titles' | 'components' | 'footerButtons'
95+
>
8996
loginPage: {
9097
settings: {
9198
parentStyle: Record<string, string> // should be CSS properties but performance seems to die
9299
} & BaseConfig['map']['loginPage']['settings']
93100
components: CustomComponent[]
94-
} & BaseConfig['map']['loginPage']
101+
} & Omit<BaseConfig['map']['loginPage'], 'settings' | 'components'>
95102
} & BaseConfig['map']
96103
multiDomains: (BaseConfig['map'] & { domain: string })[]
97104
multiDomainsObj: Record<string, BaseConfig['map'] & { domain: string }>

packages/types/lib/models.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import NestSubmissionModel = require('server/src/models/NestSubmission')
55
import GymBadgeModel = require('server/src/models/Badge')
66
import type { FullModel } from './utility'
77
import type { Permissions } from './server'
8+
import { Strategy } from './general'
89

910
export interface Backup {
1011
id: number

server/src/graphql/server.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ async function startApollo(httpServer) {
114114
filterCount || 0,
115115
)
116116

117-
if (returned) {
117+
if (returned && config.getSafe('sentry.server.enabled')) {
118118
contextValue.transaction.setMeasurement(
119119
`${endpoint}.returned`,
120120
returned,

server/src/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ passport.deserializeUser(async (user, done) => {
169169
if (user.perms.map) {
170170
done(null, user)
171171
} else {
172-
done(null, false)
172+
done('User does not have map permissions', null)
173173
}
174174
})
175175

server/src/routes/rootRouter.js

Lines changed: 33 additions & 159 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,8 @@ const authRouter = require('./authRouter')
88
const clientRouter = require('./clientRouter')
99
const { Event, Db } = require('../services/initialization')
1010
const { version } = require('../../../package.json')
11-
const buildDefaultFilters = require('../services/filters/builder/base')
12-
const advMenus = require('../services/ui/advMenus')
1311
const areaPerms = require('../services/functions/areaPerms')
14-
const generateUi = require('../services/ui/primary')
15-
const clientOptions = require('../services/ui/clientOptions')
12+
const getServerSettings = require('../services/functions/getServerSettings')
1613

1714
const rootRouter = express.Router()
1815

@@ -128,7 +125,7 @@ rootRouter.get('/api/settings', async (req, res, next) => {
128125
try {
129126
if (
130127
config.authentication.alwaysEnabledPerms.length ||
131-
!config.authMethods.length
128+
!config.authentication.methods.length
132129
) {
133130
if (req.session.tutorial === undefined) {
134131
req.session.tutorial = !config.map.forceTutorial
@@ -163,186 +160,63 @@ rootRouter.get('/api/settings', async (req, res, next) => {
163160
}
164161
req.session.save()
165162

166-
const getUser = async () => {
167-
if (config.authMethods.length && req.user) {
168-
try {
169-
const user = await Db.query('User', 'getOne', req.user.id)
170-
if (user) {
171-
if (!user.selectedWebhook) {
172-
const newWebhook = req.user.perms.webhooks.find(
173-
(n) => n in Event.webhookObj,
174-
)
175-
await Db.query('User', 'updateWebhook', user.id, newWebhook)
176-
if (req.session?.user) {
177-
req.session.user.selectedWebhook = newWebhook
178-
req.session.save()
179-
}
180-
}
181-
delete user.password
182-
183-
return {
184-
...req.user,
185-
...user,
186-
valid: true,
187-
username: user.username || req.user.username,
163+
if (config.authentication.methods.length && req.user) {
164+
try {
165+
const user = await Db.query('User', 'getOne', req.user.id)
166+
if (user) {
167+
if (!user.selectedWebhook) {
168+
const newWebhook = req.user.perms.webhooks.find(
169+
(n) => n in Event.webhookObj,
170+
)
171+
await Db.query('User', 'updateWebhook', user.id, newWebhook)
172+
if (req.session?.user) {
173+
req.session.user.selectedWebhook = newWebhook
174+
req.session.save()
188175
}
189176
}
190-
log.info(
191-
HELPERS.session,
192-
'Legacy user detected, forcing logout, User ID:',
193-
req?.user?.id,
194-
)
195-
req.logout(() => {})
196-
return { valid: false, tutorial: !config.map.forceTutorial }
197-
} catch (e) {
198-
log.warn(
199-
HELPERS.session,
200-
'Issue finding user, User ID:',
201-
req?.user?.id,
202-
e,
203-
)
204-
return { valid: false, tutorial: !config.map.forceTutorial }
205177
}
206-
} else if (req.session.perms) {
207-
return { ...req.session, valid: true }
178+
} catch (e) {
179+
log.warn(
180+
HELPERS.session,
181+
'Issue finding user, User ID:',
182+
req?.user?.id,
183+
e,
184+
)
208185
}
209-
return { valid: false, tutorial: !config.map.forceTutorial }
210-
}
211-
const serverSettings = {
212-
user: await getUser(),
213-
settings: {},
214-
authMethods: config.authMethods,
215-
userBackupLimits: config.database.settings.userBackupLimits,
216-
config: {
217-
map: {
218-
...config.map,
219-
...config.multiDomainsObj[req.headers.host.replaceAll('.', '_')],
220-
general: undefined,
221-
customRoutes: undefined,
222-
links: undefined,
223-
misc: undefined,
224-
loginPage: !!config.map.loginPage.components.length,
225-
donationPage: undefined,
226-
messageOfTheDay: undefined,
227-
customFloatingIcons: undefined,
228-
excludeList: config.authentication.excludeFromTutorial,
229-
polling: config.api.polling,
230-
authCounts: {
231-
areaRestrictions: config.authentication.areaRestrictions.length,
232-
webhooks: config.webhooks.filter((w) => w.enabled).length,
233-
scanner: Object.values(config.scanner).filter((s) => s.enabled)
234-
.length,
235-
},
236-
},
237-
tileServers: Object.fromEntries(
238-
config.tileServers.map((s) => [s.name, s]),
239-
),
240-
navigation: Object.fromEntries(
241-
config.navigation.map((n) => [n.name, n]),
242-
),
243-
navigationControls: {
244-
react: {},
245-
leaflet: {},
246-
},
247-
gymValidDataLimit:
248-
Date.now() / 1000 - config.api.gymValidDataLimit * 86400,
249-
},
250-
extraUserFields: config.database.settings.extraUserFields,
251186
}
187+
const settings = getServerSettings(req)
252188

253-
// add user options here from the config that are structured as objects
254-
if (serverSettings.user.valid) {
255-
serverSettings.loggedIn = !!req.user
256-
257-
// keys that are being sent to the frontend but are not options
258-
const ignoreKeys = [
259-
'map',
260-
'limit',
261-
'icons',
262-
'scanner',
263-
'gymValidDataLimit',
264-
]
265-
266-
Object.keys(serverSettings.config).forEach((setting) => {
267-
try {
268-
if (!ignoreKeys.includes(setting)) {
269-
const category = serverSettings.config[setting]
270-
Object.keys(category).forEach((option) => {
271-
category[option].name = option
272-
})
273-
if (
274-
config.map[setting] &&
275-
typeof config.map[setting] !== 'object'
276-
) {
277-
serverSettings.settings[setting] = config.map[setting]
278-
} else {
279-
serverSettings.settings[setting] =
280-
category[Object.keys(category)[0]].name
281-
}
282-
}
283-
} catch (e) {
284-
log.warn(
285-
HELPERS.config,
286-
`Error setting ${setting}, most likely means there are no options set in the config`,
287-
e,
288-
)
289-
}
290-
})
291-
189+
if ('perms' in settings.user) {
292190
if (
293-
serverSettings.user.perms.pokemon &&
191+
settings.user.perms.pokemon &&
294192
config.api.queryOnSessionInit.pokemon
295193
) {
296194
Event.setAvailable('pokemon', 'Pokemon', Db, false)
297195
}
298196
if (
299197
config.api.queryOnSessionInit.raids &&
300-
(serverSettings.user.perms.raids || serverSettings.user.perms.gyms)
198+
(settings.user.perms.raids || settings.user.perms.gyms)
301199
) {
302200
Event.setAvailable('gyms', 'Gym', Db, false)
303201
}
304202
if (
305203
config.api.queryOnSessionInit.quests &&
306-
(serverSettings.user.perms.quests ||
307-
serverSettings.user.perms.pokestops ||
308-
serverSettings.user.perms.invasions ||
309-
serverSettings.user.perms.lures)
204+
(settings.user.perms.quests ||
205+
settings.user.perms.pokestops ||
206+
settings.user.perms.invasions ||
207+
settings.user.perms.lures)
310208
) {
311209
Event.setAvailable('pokestops', 'Pokestop', Db, false)
312210
}
313-
if (
314-
serverSettings.user.perms.nests &&
315-
config.api.queryOnSessionInit.nests
316-
) {
211+
if (settings.user.perms.nests && config.api.queryOnSessionInit.nests) {
317212
Event.setAvailable('nests', 'Nest', Db, false)
318213
}
319-
if (Object.values(config.api.queryOnSessionInit).some((v) => v)) {
214+
if (Object.values(config.api.queryOnSessionInit).some(Boolean)) {
320215
Event.addAvailable()
321216
}
322-
323-
serverSettings.defaultFilters = buildDefaultFilters(
324-
serverSettings.user.perms,
325-
Db,
326-
)
327-
328-
// Backup in case there are Pokemon/Quests/Raids etc that are not in the masterfile
329-
// Primary for quest rewards that are form unset, despite normally have a set form
330-
331-
serverSettings.ui = generateUi(
332-
serverSettings.defaultFilters,
333-
serverSettings.user.perms,
334-
)
335-
336-
serverSettings.menus = advMenus()
337-
338-
const { clientValues, clientMenus } = clientOptions(
339-
serverSettings.user.perms,
340-
)
341-
342-
serverSettings.userSettings = clientValues
343-
serverSettings.clientMenus = clientMenus
344217
}
345-
res.status(200).json({ serverSettings })
218+
219+
res.status(200).json(settings)
346220
} catch (error) {
347221
res.status(500).json({ error: error.message, status: 500 })
348222
next(error)

0 commit comments

Comments
 (0)