soc_site-astro/src/graphql/resolvers/queries/search.ts
2024-11-13 22:46:54 -06:00

98 lines
3.4 KiB
TypeScript

import prismaClient from 'prisma/client'
import type { Resolvers } from '@/graphql/__generated__/types.generated'
const resolvers: Resolvers = {
Query: {
searchAlbum: async (_, args, context, info) => {
const {
title,
categories,
limit = 10,
offset = 0,
order = ['createdAt'],
mode = 'DESC',
status = ['show']
} = args
const fuzzyCondition = title
? {
OR: [
{ title: { search: title.toLowerCase().split(' ').join(' & ') } },
{ subTitle: { search: title.toLowerCase().split(' ').join(' & ') } }
]
}
: {}
const result = prismaClient.albums.findMany({
take: limit,
skip: offset,
where: {
AND: {
...fuzzyCondition,
// category condition
status: { in: status }
}
},
include: { Album_Category: !!categories },
orderBy: [...order.map((o) => ({ [o]: mode.toLowerCase() }))]
// order: [literal("`album`.`status` = 'coming' DESC")]
})
return result
}
/* searchAlbumByArtist: async (parent, { name, categories, limit, page = 0, order = ['createdAt'], mode = 'DESC', status = ['show'] }, { db }) => {
const include = [{ model: db.models.artist, where: { name: { [Op.like]: `%${name}%` } } }]
if (categories) include.push({ model: db.models.class, where: { name: { [Op.in]: categories } } })
return searchPage({ limit, page, model: 'album' }, {
where: { status: { [Op.in]: status } },
include,
order: order.map(o => [o, mode])
}, db)
},
searchAnimation: (parent, { title = '', limit, page = 0, order = 'createdAt', mode = 'DESC' }, { db }) => searchPage({ title, limit, page, model: 'animation' }, {
where: { title: { [Op.like]: `%${title}%` } },
order: [[order, mode]]
}, db),
searchStudio: (parent, { name = '', limit, page = 0, order = 'createdAt', mode = 'DESC' }, { db }) => searchPage({ name, limit, page, model: 'studio' }, {
where: { name: { [Op.like]: `%${name}%` } },
order: [[order, mode]]
}, db),
searchGame: (parent, { name = '', limit, page = 0, order = 'createdAt', mode = 'DESC' }, { db }) => searchPage({ name, limit, page, model: 'game' }, {
where: { name: { [Op.like]: `%${name}%` } },
order: [[order, mode]]
}, db),
searchSeries: (parent, { name = '', limit, page = 0, order = 'createdAt', mode = 'DESC' }, { db }) => searchPage({ name, limit, page, model: 'series' }, {
where: { name: { [Op.like]: `%${name}%` } },
order: [[order, mode]]
}, db),
searchSeriesByName: (parent, { name }, { db }) => db.models.series.findAll({
where: {
name: {
[Op.like]: `%${name}%`
}
}
}),
searchPublishersByName: (parent, { name }, { db }) => db.models.publisher.findAll({
where: {
name: {
[Op.like]: `%${name}%`
}
}
}),
searchPlatformsByName: (parent, { name, categories }, { db }) => db.models.platform.findAll({
where: {
name: {
[Op.like]: `%${name}%`
},
type: { [Op.or]: categories }
}
}),
searchPlatformsByCategories: (parent, { categories }, { db }) => categories.length === 0
? []
: db.models.platform.findAll({ where: { type: { [Op.or]: categories } } }) */
}
}
export default resolvers