105 lines
2.8 KiB
TypeScript
105 lines
2.8 KiB
TypeScript
import { z } from 'astro/zod'
|
|
import { ActionError } from 'astro:actions'
|
|
|
|
import { defineProtectedAction } from '../lib/defineProtectedAction'
|
|
import { prisma } from '../lib/prisma'
|
|
|
|
export const serviceActions = {
|
|
requestVerification: defineProtectedAction({
|
|
accept: 'form',
|
|
permissions: 'user',
|
|
input: z.object({
|
|
serviceId: z.coerce.number().int().positive(),
|
|
action: z.enum(['request', 'withdraw']),
|
|
}),
|
|
handler: async (input, context) => {
|
|
const service = await prisma.service.findUnique({
|
|
where: {
|
|
id: input.serviceId,
|
|
},
|
|
select: {
|
|
verificationStatus: true,
|
|
},
|
|
})
|
|
|
|
if (!service) {
|
|
throw new ActionError({
|
|
message: 'Service not found',
|
|
code: 'NOT_FOUND',
|
|
})
|
|
}
|
|
|
|
if (
|
|
service.verificationStatus === 'VERIFICATION_SUCCESS' ||
|
|
service.verificationStatus === 'VERIFICATION_FAILED'
|
|
) {
|
|
throw new ActionError({
|
|
message: 'Service is already verified or marked as scam',
|
|
code: 'BAD_REQUEST',
|
|
})
|
|
}
|
|
|
|
const existingRequest = await prisma.serviceVerificationRequest.findUnique({
|
|
where: {
|
|
serviceId_userId: {
|
|
serviceId: input.serviceId,
|
|
userId: context.locals.user.id,
|
|
},
|
|
},
|
|
select: {
|
|
id: true,
|
|
},
|
|
})
|
|
|
|
switch (input.action) {
|
|
case 'withdraw': {
|
|
if (!existingRequest) {
|
|
throw new ActionError({
|
|
message: 'You have not requested verification for this service',
|
|
code: 'BAD_REQUEST',
|
|
})
|
|
}
|
|
await prisma.serviceVerificationRequest.delete({
|
|
where: {
|
|
id: existingRequest.id,
|
|
},
|
|
})
|
|
break
|
|
}
|
|
default:
|
|
case 'request': {
|
|
if (existingRequest) {
|
|
throw new ActionError({
|
|
message: 'You have already requested verification for this service',
|
|
code: 'BAD_REQUEST',
|
|
})
|
|
}
|
|
|
|
await prisma.serviceVerificationRequest.create({
|
|
data: {
|
|
serviceId: input.serviceId,
|
|
userId: context.locals.user.id,
|
|
},
|
|
})
|
|
|
|
await prisma.notificationPreferences.upsert({
|
|
where: { userId: context.locals.user.id },
|
|
update: {
|
|
onVerificationChangeForServices: {
|
|
connect: { id: input.serviceId },
|
|
},
|
|
},
|
|
create: {
|
|
userId: context.locals.user.id,
|
|
onVerificationChangeForServices: {
|
|
connect: { id: input.serviceId },
|
|
},
|
|
},
|
|
})
|
|
break
|
|
}
|
|
}
|
|
},
|
|
}),
|
|
}
|