Files
kycnotme/web/src/actions/service.ts
2025-05-19 10:23:36 +00:00

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
}
}
},
}),
}