Search code examples
node.jstimeslots

how to find free time slot of a day if busy slots are given in nodejs


For example clinic working hours on specific date are as follow:

var workingStartTime = 2018-05-12T08:00:00.000Z; 
var workingEndTime = 2018-05-12T22:00:00.000Z;

Doctor's already scheduled appointments on the same date are as follow:

var busySlots = 
[ { 
start_time: '2018-05-12T14:30:00.000Z',end_time:'2018-05-12T17:45:00.000Z' 
},
{ 
start_time: '2018-05-12T20:30:00.000Z',end_time: '2018-05-12T21:45:00.000Z' 
}]

I need to fetch available time slots of doctor which are greater than 60 minutes starting from 2018-05-12T08:00:00.000Z to 2018-05-12T22:00:00.000Z timings of a day with minimum line of code in nodejs.

Following problem is similar to my query:

How to find free time slot based on available time slot and booked time slot?

But above code is in php and i need code written in nodejs.


Solution

  • Below code might be not optimized but it works for me:

    function (cb){
    
             var duration = 60;
             var freeSlots = [];
    
             var workingStartTime = 2018-05-12T08:00:00.000Z; 
             var workingEndTime = 2018-05-12T22:00:00.000Z;
    
             var busySlots = [];
             busySlots.push({ start_time: "2018-05-12T14:30:00.000Z",end_time: "2018-05-12T17:45:00.000Z" }) ;
             busySlots.push({ start_time: "2018-05-12T20:30:00.000Z",end_time: "2018-05-12T21:45:00.000Z" }) ;
    
             var beginAt = workingStartTime;
             var overAt = workingEndTime;
             var count = 0;
             var last = busySlots.length;
    
             async.forEach(busySlots, function (item, callback){
    
                 /*** Library funcition to gind difference between two dates (Minutes) ***/
                 var diff = libFunc.getRange(beginAt, item.start_time,TIME_UNITS.MINUTES);
                 if(diff > duration){
                   let free = {"start_time":beginAt , "end_time":item.start_time};
                   freeSlots.push(free);
                   beginAt = item.end_time;
                   count += 1;
    
                   /** Process for end slot **/
                   if(last == count){
                     var diff = libFunc.getRange(item.end_time, overAt, TIME_UNITS.MINUTES);
                     if(diff > duration){
                       let free = {"start_time":item.end_time , "end_time":overAt};
                       freeSlots.push(free);
                       callback();
                     }else{
                       callback();
                     }
                   }else{
                     callback();
                   }
                   /** Process for end slot **/
    
                 }else{
                   beginAt = item.end_time;
                   count += 1;
    
                   /** Process for end slot **/
                   if(last == count){
                     var diff = libFunc.getRange(item.end_time, overAt, TIME_UNITS.MINUTES);
                     if(diff > duration){
                       let free = {"start_time":item.end_time , "end_time":overAt};
                       freeSlots.push(free);
                       callback();
                     }else{
                       callback();
                     }
                   }else{
                     callback();
                   }
                   /** Process for end slot **/
                 }
    
             }, function(err) {
               // console.log(freeSlots);
                 cb(null);
             });
           },