import { schema } from 'nexus' import * as Slack from '../../utils/slack' import { logger } from '../../utils/logger' import GeneralUtils from '../../utils/general' export const Review = schema.objectType({ name: 'Review', definition(t) { t.model.id() t.model.createdAt() t.model.updatedAt() t.model.numberOfStars() t.model.comment() t.model.serviceProject() t.model.order() }, }) export const ReviewQueries = schema.extendType({ type: 'Query', definition(t) { t.crud.review() t.crud.reviews({ filtering: true, ordering: true }) }, }) export const ReviewMutation = schema.extendType({ type: 'Mutation', definition: (t) => { t.crud.createOneReview({ alias: 'createReview' }) t.crud.updateOneReview({ alias: 'updateReview' }) t.crud.deleteOneReview({ alias: 'deleteReview' }) t.field('createReview', { type: 'Review', args: { data: schema.arg({ type: 'ReviewCreateInput' }), }, resolve: async (parent, { data }, ctx: NexusContext) => { const createdReview = await ctx.prisma.review.create({ data: { ...data }, select: { id: true, numberOfStars: true, comment: true, order: { select: { id: true, number: true, serviceProject: { select: { service: { select: { type: true, }, }, }, }, customer: { select: { firstName: true, lastName: true, }, }, }, }, }, }) // update order ctx.prisma.order .update({ where: { id: createdReview.order.id }, data: { showedRatingPopup: true } }) .catch(logger.error) Slack.send({ channel: 'order', subject: `New review${ createdReview.order && createdReview.order.serviceProject && createdReview.order.serviceProject.service ? ` - ${createdReview.order.serviceProject.service.type}` : '' }`, /* @ts-ignore */ text: `*Number of stars:* ${Array(createdReview.numberOfStars) .fill(createdReview.numberOfStars) .reduce((total) => (total += ':star:'), '')}.\n*Comment:* "${ createdReview.comment || '' }".\n${ createdReview.order && createdReview.order.customer ? `Customer: ${GeneralUtils.getUserName(createdReview.order.customer)}` : '' }\n*Order number:* ${createdReview.order.number}`, }).catch(logger.error) return ctx.prisma.review.findOne({ where: { id: createdReview.id } }) }, }) }, })