diff --git a/src/Cron/cron.service.ts b/src/Cron/cron.service.ts index 43db69a..59747e8 100644 --- a/src/Cron/cron.service.ts +++ b/src/Cron/cron.service.ts @@ -16,7 +16,6 @@ export class CronService { // cron every 1 minute to check schedule date status @Cron(CronExpression.EVERY_MINUTE) async checkScheduleDateStatus() { - Logger.log('Checking schedule date status', 'CronService') const schedules = await this.prisma.scheduleDate.findMany({ where: { end: { @@ -48,13 +47,6 @@ export class CronService { } } - // if (collaborationSession.collaboratorsIds.length === 1) { - // return { - // id: schedule.id, - // status: ScheduleDateStatus.MISSING_CUSTOMER, - // } - // } - if (collaborationSession.collaboratorsIds.length === 2) { return { id: schedule.id, @@ -74,10 +66,31 @@ export class CronService { } } + // cron every 10 seconds to check if all scheduledate in schedule has status complete then mark schedule as completed + @Cron(CronExpression.EVERY_10_SECONDS) + async checkScheduleCompleted() { + const schedules = await this.prisma.schedule.findMany({ + where: { + status: ScheduleStatus.PUBLISHED, + }, + }) + for (const schedule of schedules) { + const scheduleDates = await this.prisma.scheduleDate.findMany({ + where: { scheduleId: schedule.id }, + }) + if (scheduleDates.every((date) => date.status === ScheduleDateStatus.COMPLETED)) { + await this.prisma.schedule.update({ + where: { id: schedule.id }, + data: { status: ScheduleStatus.COMPLETED }, + }) + Logger.log(`Schedule ${schedule.id} has been completed`, 'CronService') + } + } + } + // cron every 1 minute to check payment status where created_at is more than 15 minutes @Cron(CronExpression.EVERY_MINUTE) async checkPaymentStatus() { - Logger.log('Checking payment status', 'CronService') const payments = await this.prisma.payment.findMany({ where: { status: PaymentStatus.PENDING, @@ -102,7 +115,6 @@ export class CronService { // cron every 1 minute to check if there is any schedule date start in less than 30 minutes @Cron(CronExpression.EVERY_MINUTE) async taskCheckScheduleDateStart() { - Logger.log('Checking schedule date start', 'CronService') const schedules = await this.prisma.schedule.findMany({ where: { AND: [ @@ -147,7 +159,6 @@ export class CronService { // cron every day to disable service without any schedule in the past 30 days @Cron(CronExpression.EVERY_DAY_AT_1AM) async taskDisableServiceWithoutSchedule() { - Logger.log('Disabling service without any schedule', 'CronService') const services = await this.prisma.service.findMany({ where: { NOT: { diff --git a/src/Order/order.schema.ts b/src/Order/order.schema.ts index f8c140d..09ff271 100644 --- a/src/Order/order.schema.ts +++ b/src/Order/order.schema.ts @@ -1,5 +1,5 @@ import { Inject, Injectable, Logger } from '@nestjs/common' -import { OrderStatus, ScheduleDateStatus, ScheduleStatus } from '@prisma/client' +import { OrderStatus, Role, ScheduleDateStatus, ScheduleStatus } from '@prisma/client' import { Pothos, PothosRef, PothosSchema, SchemaBuilderToken } from '@smatch-corp/nestjs-pothos' import _ from 'lodash' import { Builder } from '../Graphql/graphql.builder' @@ -160,7 +160,40 @@ export class OrderSchema extends PothosSchema { }) }, }), + completedOrdersForModerator: t.prismaField({ + type: [this.order()], + description: 'Retrieve a list of completed orders for moderator', + args: this.builder.generator.findManyArgs('Order'), + resolve: async (query, _root, args, ctx, _info) => { + if (ctx.isSubscription) { + throw new Error('Orders cannot be retrieved in subscription context') + } + if (!ctx.http.me) { + throw new Error('Unauthorized') + } + // only for role moderator + if (ctx.http.me.role !== Role.MODERATOR) { + throw new Error('Unauthorized') + } + // return completed order list where schedule status is COMPLETED + return await this.prisma.order.findMany({ + ...query, + where: { + AND: [ + ...(args.filter ? [args.filter] : []), + { + status: OrderStatus.PAID, + schedule: { + status: ScheduleStatus.COMPLETED, + }, + }, + ], + }, + }) + }, + }), })) + // mutation section this.builder.mutationFields((t) => ({ createOrder: t.prismaField({ diff --git a/src/PersonalMilestone/personalmilestone.schema.ts b/src/PersonalMilestone/personalmilestone.schema.ts index 859ec4a..423e340 100644 --- a/src/PersonalMilestone/personalmilestone.schema.ts +++ b/src/PersonalMilestone/personalmilestone.schema.ts @@ -112,7 +112,7 @@ export class PersonalMilestoneSchema extends PothosSchema { required: true, }), data: t.arg({ - type: [this.builder.generator.getCreateManyInput('PersonalMilestone')], + type: [this.builder.generator.getCreateManyInput('PersonalMilestone', ['schedule', 'user'])], description: 'The data for the personal milestone.', required: true, }),