Untitled

 avatar
user_7119000
plain_text
25 days ago
3.3 kB
2
Indexable
async bulkUpdate(bulkUpdateDto: BulkUpdateUserCourseDto): Promise<any> {
        const { userCourses, batch,inActiveDetailsObj,inActiveAt } = bulkUpdateDto;
        console.log("Bulk Update Service: ",bulkUpdateDto,userCourses,batch)


        const results: any = [];
        const errors: any = [];

        const updatePromises = map(userCourses,async (updateDto) => {
            try {
                const updateData = {
                    ...updateDto,
                    batch,
                    batchAssignedOn: moment().toDate(),
                    inActiveAt
                };

                const userCourse = await this.userCourseModel.findById(updateDto);

                if (!userCourse) {
                    throw new Error(`UserCourse not found for id: ${updateDto}`);
                }

                if (updateDto.rollNumber) {
                    const existingRollNumber = await this.userCourseModel.findOne({
                        rollNumber: updateDto.rollNumber,
                        _id: { $ne: updateDto },
                        iid: updateDto.iid,
                    });

                    if (existingRollNumber) {
                        throw new Error(`Roll number ${updateDto.rollNumber} already exists for another user`);
                    }
                }

                if (inActiveDetailsObj) {  
                    userCourse.inActiveDetails = userCourse.inActiveDetails || [];
                    userCourse.inActiveDetails.push(inActiveDetailsObj);  
    
                    if (inActiveDetailsObj.type === InactiveType.TEMPORARY) {
                        userCourse.inActiveDetails = userCourse.inActiveDetails.filter(
                            (detail: InActiveDetail) => detail.type !== InactiveType.PERMANENT
                        );
                    }
    
                    userCourse.isPermanent = userCourse.inActiveDetails.some(
                        (detail: InActiveDetail) => detail.type === InactiveType.PERMANENT
                    );
                }

                Object.assign(userCourse, updateData);
                await userCourse.save();

                const course = await this.courseService.findOne(userCourse.courseId);
                this.eventEmitter.emit("device-user-create-batch", {
                    batchId: batch,
                    userId: userCourse?.userId,
                    branch: course?.branch,
                    deviceUserId: userCourse.rollNumber,
                    courseId: userCourse.courseId,
                });

                this.eventEmitter.emit("message-after-batch-assign", userCourse._id);

                results.push({
                    id: userCourse._id,
                    status: 'success'
                });

            } catch (error) {
                errors.push({
                    id: updateDto.id,
                    error: error.message
                });
            }
        });

        await Promise.all(updatePromises);

        return {
            success: results,
            errors: errors,
            totalProcessed: results.length + errors.length,
            successCount: results.length,
            errorCount: errors.length
        };
    }
Leave a Comment