refactor: extract escapeRegex and validateTagSlugs server utils

Deduplicate tag validation and regex escaping into shared auto-imported
utils. Add tag validation to wiki patch/batch-tag routes. Remove
duplicate tags field from event schema.
This commit is contained in:
Jennie Robinson Faber 2026-04-09 23:51:56 +01:00
parent f585fabf21
commit a516f172fb
11 changed files with 33 additions and 31 deletions

View file

@ -1,5 +1,4 @@
import Event from "../../models/event.js";
import Tag from "../../models/tag.js";
import { connectDB } from "../../utils/mongoose.js";
import { requireAdmin } from "../../utils/auth.js";
import { validateBody } from "../../utils/validateBody.js";
@ -13,18 +12,7 @@ export default defineEventHandler(async (event) => {
await connectDB();
// Validate tag slugs against Tag collection
if (body.tags && body.tags.length > 0) {
const foundTags = await Tag.find({ slug: { $in: body.tags } });
const foundSlugs = new Set(foundTags.map((t) => t.slug));
const invalid = body.tags.filter((s) => !foundSlugs.has(s));
if (invalid.length > 0) {
throw createError({
statusCode: 400,
statusMessage: `Unknown tag slugs: ${invalid.join(", ")}`,
});
}
}
await validateTagSlugs(body.tags);
const eventData = {
...body,

View file

@ -1,5 +1,4 @@
import Event from '../../../models/event.js'
import Tag from '../../../models/tag.js'
import { connectDB } from '../../../utils/mongoose.js'
import { requireAdmin } from '../../../utils/auth.js'
@ -12,18 +11,7 @@ export default defineEventHandler(async (event) => {
await connectDB()
// Validate tag slugs against Tag collection
if (body.tags && body.tags.length > 0) {
const foundTags = await Tag.find({ slug: { $in: body.tags } })
const foundSlugs = new Set(foundTags.map(t => t.slug))
const invalid = body.tags.filter(s => !foundSlugs.has(s))
if (invalid.length > 0) {
throw createError({
statusCode: 400,
statusMessage: `Unknown tag slugs: ${invalid.join(', ')}`
})
}
}
await validateTagSlugs(body.tags)
const updateData = {
...body,

View file

@ -14,6 +14,8 @@ export default defineEventHandler(async (event) => {
await connectDB()
await validateTagSlugs(body.tags)
const article = await WikiArticle.findByIdAndUpdate(
id,
{ tags: body.tags },

View file

@ -30,6 +30,8 @@ export default defineEventHandler(async (event) => {
await connectDB()
await validateTagSlugs([...(body.addTags || []), ...(body.removeTags || [])])
const filter = body.articleIds
? { _id: { $in: body.articleIds } }
: { collection: body.collection }

View file

@ -12,7 +12,7 @@ export default defineEventHandler(async (event) => {
filter.collection = collection
}
if (search) {
filter.title = { $regex: search, $options: 'i' }
filter.title = { $regex: escapeRegex(search), $options: 'i' }
}
const articles = await WikiArticle.find(filter)