Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 19 additions & 5 deletions src/controllers/api/2014/magicItemController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { NextFunction, Request, Response } from 'express'
import MagicItem from '@/models/2014/magicItem'
import { NameQuerySchema, ShowParamsSchema } from '@/schemas/schemas'
import { escapeRegExp, redisClient, ResourceList } from '@/util'
import { applyTranslation, applyTranslationToList } from '@/util/translation'

interface IndexQuery {
name?: { $regex: RegExp }
Expand All @@ -18,23 +19,31 @@ export const index = async (req: Request, res: Response, next: NextFunction) =>
.json({ error: 'Invalid query parameters', details: validatedQuery.error.issues })
}
const { name } = validatedQuery.data
const lang = req.lang ?? 'en'

const searchQueries: IndexQuery = {}
if (name !== undefined) {
searchQueries.name = { $regex: new RegExp(escapeRegExp(name), 'i') }
}

const redisKey = req.originalUrl
const data = await redisClient.get(redisKey)
const cached = await redisClient.get(redisKey)

if (data !== null && data !== undefined && data !== '') {
res.status(200).json(JSON.parse(data))
if (cached !== null && cached !== undefined && cached !== '') {
return res.status(200).json(JSON.parse(cached))
} else {
const data = await MagicItem.find(searchQueries)
.select({ index: 1, name: 1, url: 1, _id: 0 })
.sort({ index: 'asc' })
const jsonData = ResourceList(data)
const plain = data.map((d: any) => d.toObject?.() ?? d)
const { docs: translated, wasTranslated } = await applyTranslationToList(
plain,
'2014-magic-items',
lang
)
const jsonData = ResourceList(translated)
redisClient.set(redisKey, JSON.stringify(jsonData))
res.setHeader('Content-Language', wasTranslated ? lang : 'en')
return res.status(200).json(jsonData)
}
} catch (err) {
Expand All @@ -52,10 +61,15 @@ export const show = async (req: Request, res: Response, next: NextFunction) => {
.json({ error: 'Invalid path parameters', details: validatedParams.error.issues })
}
const { index } = validatedParams.data
const lang = req.lang ?? 'en'

const data = await MagicItem.findOne({ index: index })
if (data === null || data === undefined) return next()
return res.status(200).json(data)

const plain = (data.toObject?.() ?? data) as unknown as Record<string, unknown>
const translated = await applyTranslation(plain, '2014-magic-items', lang)
res.setHeader('Content-Language', translated !== plain ? lang : 'en')
return res.status(200).json(translated)
} catch (err) {
next(err)
}
Expand Down
24 changes: 19 additions & 5 deletions src/controllers/api/2014/monsterController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { NextFunction, Request, Response } from 'express'
import Monster from '@/models/2014/monster'
import { MonsterIndexQuerySchema, ShowParamsSchema } from '@/schemas/schemas'
import { escapeRegExp, redisClient, ResourceList } from '@/util'
import { applyTranslation, applyTranslationToList } from '@/util/translation'

interface IndexQuery {
name?: { $regex: RegExp }
Expand All @@ -19,6 +20,7 @@ export const index = async (req: Request, res: Response, next: NextFunction) =>
.json({ error: 'Invalid query parameters', details: validatedQuery.error.issues })
}
const { name, challenge_rating } = validatedQuery.data
const lang = req.lang ?? 'en'

const searchQueries: IndexQuery = {}
if (name !== undefined) {
Expand All @@ -29,16 +31,23 @@ export const index = async (req: Request, res: Response, next: NextFunction) =>
}

const redisKey = req.originalUrl
const data = await redisClient.get(redisKey)
const cached = await redisClient.get(redisKey)

if (data !== null) {
res.status(200).json(JSON.parse(data))
if (cached !== null) {
return res.status(200).json(JSON.parse(cached))
} else {
const data = await Monster.find(searchQueries)
.select({ index: 1, name: 1, url: 1, _id: 0 })
.sort({ index: 'asc' })
const jsonData = ResourceList(data)
const plain = data.map((d: any) => d.toObject?.() ?? d)
const { docs: translated, wasTranslated } = await applyTranslationToList(
plain,
'2014-monsters',
lang
)
const jsonData = ResourceList(translated)
redisClient.set(redisKey, JSON.stringify(jsonData))
res.setHeader('Content-Language', wasTranslated ? lang : 'en')
return res.status(200).json(jsonData)
}
} catch (err) {
Expand All @@ -56,10 +65,15 @@ export const show = async (req: Request, res: Response, next: NextFunction) => {
.json({ error: 'Invalid path parameters', details: validatedParams.error.issues })
}
const { index } = validatedParams.data
const lang = req.lang ?? 'en'

const data = await Monster.findOne({ index: index })
if (!data) return next()
return res.status(200).json(data)

const plain = (data.toObject?.() ?? data) as unknown as Record<string, unknown>
const translated = await applyTranslation(plain, '2014-monsters', lang)
res.setHeader('Content-Language', translated !== plain ? lang : 'en')
return res.status(200).json(translated)
} catch (err) {
next(err)
}
Expand Down
24 changes: 19 additions & 5 deletions src/controllers/api/2014/ruleController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { NextFunction, Request, Response } from 'express'
import Rule from '@/models/2014/rule'
import { NameDescQuerySchema, ShowParamsSchema } from '@/schemas/schemas'
import { escapeRegExp, redisClient, ResourceList } from '@/util'
import { applyTranslation, applyTranslationToList } from '@/util/translation'

interface IndexQuery {
name?: { $regex: RegExp }
Expand All @@ -19,6 +20,7 @@ export const index = async (req: Request, res: Response, next: NextFunction) =>
.json({ error: 'Invalid query parameters', details: validatedQuery.error.issues })
}
const { name, desc } = validatedQuery.data
const lang = req.lang ?? 'en'

const searchQueries: IndexQuery = {}
if (name !== undefined) {
Expand All @@ -29,16 +31,23 @@ export const index = async (req: Request, res: Response, next: NextFunction) =>
}

const redisKey = req.originalUrl
const data = await redisClient.get(redisKey)
const cached = await redisClient.get(redisKey)

if (data !== null) {
res.status(200).json(JSON.parse(data))
if (cached !== null) {
return res.status(200).json(JSON.parse(cached))
} else {
const data = await Rule.find(searchQueries)
.select({ index: 1, name: 1, url: 1, _id: 0 })
.sort({ index: 'asc' })
const jsonData = ResourceList(data)
const plain = data.map((d: any) => d.toObject?.() ?? d)
const { docs: translated, wasTranslated } = await applyTranslationToList(
plain,
'2014-rules',
lang
)
const jsonData = ResourceList(translated)
redisClient.set(redisKey, JSON.stringify(jsonData))
res.setHeader('Content-Language', wasTranslated ? lang : 'en')
return res.status(200).json(jsonData)
}
} catch (err) {
Expand All @@ -56,10 +65,15 @@ export const show = async (req: Request, res: Response, next: NextFunction) => {
.json({ error: 'Invalid path parameters', details: validatedParams.error.issues })
}
const { index } = validatedParams.data
const lang = req.lang ?? 'en'

const data = await Rule.findOne({ index: index })
if (!data) return next()
return res.status(200).json(data)

const plain = (data.toObject?.() ?? data) as unknown as Record<string, unknown>
const translated = await applyTranslation(plain, '2014-rules', lang)
res.setHeader('Content-Language', translated !== plain ? lang : 'en')
return res.status(200).json(translated)
} catch (err) {
next(err)
}
Expand Down
24 changes: 19 additions & 5 deletions src/controllers/api/2014/ruleSectionController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { NextFunction, Request, Response } from 'express'
import RuleSection from '@/models/2014/ruleSection'
import { NameDescQuerySchema, ShowParamsSchema } from '@/schemas/schemas'
import { escapeRegExp, redisClient, ResourceList } from '@/util'
import { applyTranslation, applyTranslationToList } from '@/util/translation'

interface IndexQuery {
name?: { $regex: RegExp }
Expand All @@ -19,6 +20,7 @@ export const index = async (req: Request, res: Response, next: NextFunction) =>
.json({ error: 'Invalid query parameters', details: validatedQuery.error.issues })
}
const { name, desc } = validatedQuery.data
const lang = req.lang ?? 'en'

const searchQueries: IndexQuery = {}
if (name !== undefined) {
Expand All @@ -29,16 +31,23 @@ export const index = async (req: Request, res: Response, next: NextFunction) =>
}

const redisKey = req.originalUrl
const data = await redisClient.get(redisKey)
const cached = await redisClient.get(redisKey)

if (data !== null) {
res.status(200).json(JSON.parse(data))
if (cached !== null) {
return res.status(200).json(JSON.parse(cached))
} else {
const data = await RuleSection.find(searchQueries)
.select({ index: 1, name: 1, url: 1, _id: 0 })
.sort({ index: 'asc' })
const jsonData = ResourceList(data)
const plain = data.map((d: any) => d.toObject?.() ?? d)
const { docs: translated, wasTranslated } = await applyTranslationToList(
plain,
'2014-rule-sections',
lang
)
const jsonData = ResourceList(translated)
redisClient.set(redisKey, JSON.stringify(jsonData))
res.setHeader('Content-Language', wasTranslated ? lang : 'en')
return res.status(200).json(jsonData)
}
} catch (err) {
Expand All @@ -56,10 +65,15 @@ export const show = async (req: Request, res: Response, next: NextFunction) => {
.json({ error: 'Invalid path parameters', details: validatedParams.error.issues })
}
const { index } = validatedParams.data
const lang = req.lang ?? 'en'

const data = await RuleSection.findOne({ index: index })
if (!data) return next()
return res.status(200).json(data)

const plain = (data.toObject?.() ?? data) as unknown as Record<string, unknown>
const translated = await applyTranslation(plain, '2014-rule-sections', lang)
res.setHeader('Content-Language', translated !== plain ? lang : 'en')
return res.status(200).json(translated)
} catch (err) {
next(err)
}
Expand Down
24 changes: 19 additions & 5 deletions src/controllers/api/2014/spellController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { NextFunction, Request, Response } from 'express'
import Spell from '@/models/2014/spell'
import { ShowParamsSchema, SpellIndexQuerySchema } from '@/schemas/schemas'
import { escapeRegExp, redisClient, ResourceList } from '@/util'
import { applyTranslation, applyTranslationToList } from '@/util/translation'

interface IndexQuery {
name?: { $regex: RegExp }
Expand All @@ -19,6 +20,7 @@ export const index = async (req: Request, res: Response, next: NextFunction) =>
.json({ error: 'Invalid query parameters', details: validatedQuery.error.issues })
}
const { name, level, school } = validatedQuery.data
const lang = req.lang ?? 'en'

const searchQueries: IndexQuery = {}
if (name !== undefined) {
Expand All @@ -35,16 +37,23 @@ export const index = async (req: Request, res: Response, next: NextFunction) =>
}

const redisKey = req.originalUrl
const data = await redisClient.get(redisKey)
const cached = await redisClient.get(redisKey)

if (data !== null) {
res.status(200).json(JSON.parse(data))
if (cached !== null) {
return res.status(200).json(JSON.parse(cached))
} else {
const data = await Spell.find(searchQueries)
.select({ index: 1, level: 1, name: 1, url: 1, _id: 0 })
.sort({ index: 'asc' })
const jsonData = ResourceList(data)
const plain = data.map((d: any) => d.toObject?.() ?? d)
const { docs: translated, wasTranslated } = await applyTranslationToList(
plain,
'2014-spells',
lang
)
const jsonData = ResourceList(translated)
redisClient.set(redisKey, JSON.stringify(jsonData))
res.setHeader('Content-Language', wasTranslated ? lang : 'en')
return res.status(200).json(jsonData)
}
} catch (err) {
Expand All @@ -61,10 +70,15 @@ export const show = async (req: Request, res: Response, next: NextFunction) => {
.json({ error: 'Invalid path parameters', details: validatedParams.error.issues })
}
const { index } = validatedParams.data
const lang = req.lang ?? 'en'

const data = await Spell.findOne({ index: index })
if (!data) return next()
return res.status(200).json(data)

const plain = (data.toObject?.() ?? data) as unknown as Record<string, unknown>
const translated = await applyTranslation(plain, '2014-spells', lang)
res.setHeader('Content-Language', translated !== plain ? lang : 'en')
return res.status(200).json(translated)
} catch (err) {
next(err)
}
Expand Down
Loading