Ocelot-Social/backend/src/middleware/sluggifyMiddleware.ts
Robert Schäfer fac818a3e4
refactor(backend): types for context + slug (#8486)
Also these changes saw merge conflicts in #8463 so let's get them merged already.

Co-authored-by: mahula <lenzmath@posteo.de>
2025-05-04 07:44:31 +08:00

73 lines
2.0 KiB
TypeScript

/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-unsafe-return */
import type { Context } from '@src/server'
import uniqueSlug from './slugify/uniqueSlug'
const isUniqueFor = (context: Context, type: string) => {
return async (slug: string) => {
const session = context.driver.session()
try {
const existingSlug = await session.readTransaction((transaction) => {
return transaction.run(
`
MATCH(p:${type} {slug: $slug })
RETURN p.slug
`,
{ slug },
)
})
return existingSlug.records.length === 0
} finally {
await session.close()
}
}
}
export default {
Mutation: {
SignupVerification: async (
resolve,
root,
args: { slug: string; name: string },
context: Context,
info,
) => {
args.slug = args.slug || (await uniqueSlug(args.name, isUniqueFor(context, 'User')))
return resolve(root, args, context, info)
},
CreateGroup: async (
resolve,
root,
args: { slug: string; name: string },
context: Context,
info,
) => {
args.slug = args.slug || (await uniqueSlug(args.name, isUniqueFor(context, 'Group')))
return resolve(root, args, context, info)
},
CreatePost: async (
resolve,
root,
args: { slug: string; title: string },
context: Context,
info,
) => {
args.slug = args.slug || (await uniqueSlug(args.title, isUniqueFor(context, 'Post')))
return resolve(root, args, context, info)
},
UpdatePost: async (
resolve,
root,
args: { slug: string; title: string },
context: Context,
info,
) => {
// TODO: is this absolutely correct? what happens if "args.title" is not defined? may it works accidentally, because "args.title" or "args.slug" is always send?
args.slug = args.slug || (await uniqueSlug(args.title, isUniqueFor(context, 'Post')))
return resolve(root, args, context, info)
},
},
}