soc_site-astro/src/graphql/resolvers/mutations/create.js
2024-09-18 20:33:41 -06:00

81 lines
2.7 KiB
JavaScript

import { composeResolvers } from '@graphql-tools/resolvers-composition'
import { createLog, createUpdateLog } from 'server/utils/log'
import { getImgColor, img } from 'server/utils/image'
import { hasRole } from 'server/utils/resolvers'
import { handleComplete } from 'server/utils/requests'
import { slugify } from 'server/utils/slugify'
import { UserInputError } from 'next/server/utils/graphQLErrors'
const resolversComposition = { 'Mutation.*': hasRole('CREATE') }
const resolvers = {
Mutation: {
createAlbum: async (parent, data, { db }, info) =>
db.transaction(async (transaction) => {
data.artists = data.artists
? data.artists.map((artist) => {
return { name: artist, slug: slugify(artist) }
})
: []
await db.models.artist.bulkCreate(data.artists, {
ignoreDuplicates: true,
transaction
})
const album = await db.models.album.create(data, {
include: [
db.models.disc,
db.models.store,
{
model: db.models.download,
include: [db.models.link]
}
],
transaction
})
await Promise.all([
album.setArtists(
data.artists
.filter(({ slug }) => slug.length > 0)
.map(({ slug }) => slug),
{ transaction }
),
album.setCategories(data.categories || [], { transaction }),
album.setClassifications(data.classifications || [], { transaction }),
album.setPlatforms(data.platforms || [], { transaction }),
album.setGames(data.games || [], { transaction }),
album.setAnimations(data.animations || [], { transaction }),
album.setRelated(data.related || [], { transaction }),
createLog(db, 'createAlbum', data, transaction)
])
const { id } = album.dataValues
album.placeholder = data.cover
? await img(data.cover, 'album', id)
: undefined
album.headerColor = data.cover
? await getImgColor(`album/${id}`)
: undefined
await album.save({ transaction })
if (album.status === 'show') handleComplete(db, data, album)
return album
}),
deleteAlbum: async (parent, { id }, { db }, info) => {
const album = await db.models.album.findByPk(id)
if (!album) throw UserInputError('Not Found')
return db.transaction(async (transaction) => {
await createUpdateLog(db, 'deleteAlbum', album, transaction)
await album.destroy({ transaction })
return 1
})
}
}
}
export default composeResolvers(resolvers, resolversComposition)