Browse Source

Feat(booking-job): Allow concurrent job from different users

master
Samuel Pua 3 years ago
parent
commit
147d6f9177
  1. 21
      backend/internal/ktmtrainbot/backgroundbookingjob.go

21
backend/internal/ktmtrainbot/backgroundbookingjob.go

@ -14,6 +14,7 @@ import (
"github.com/go-rod/rod"
"github.com/go-rod/rod/lib/devices"
"github.com/go-rod/rod/lib/launcher"
"github.com/google/uuid"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
@ -39,8 +40,22 @@ func (env *Env) BackgroundJobRunner() {
tx := env.DB.Session(&gorm.Session{Logger: newLogger})
for {
var usersWithRunningTask []user.User
tx.Table("bookings").
Select("users.*").
Joins("left join users on users.id = bookings.user_id").
Where("bookings.status = ?", "running").
Find(&usersWithRunningTask)
var userIDArr []uuid.UUID
for _, currUser := range usersWithRunningTask {
userIDArr = append(userIDArr, currUser.ID)
}
var jobToDo Booking
err := tx.Model(&jobToDo).
Where("user_id NOT IN (?)", userIDArr).
Where("status = ?", "pending").
Preload("User").
First(&jobToDo).Error
@ -52,8 +67,10 @@ func (env *Env) BackgroundJobRunner() {
} else { // if there's job to do
// Create next run where it's not the past (either from old NextRun or now())
timeNow := time.Now()
startTime := time.Date(timeNow.Year(), timeNow.Month(), timeNow.Day(), 0, 10, 0, 0, timeNow.Location())
endTime := time.Date(timeNow.Year(), timeNow.Month(), timeNow.Day(), 0, 16, 0, 0, timeNow.Location())
if timeNow.Hour() == 0 && timeNow.Minute() == 10 {
if timeNow.After(startTime) && timeNow.Before(endTime) {
err := env.DB.Where(&user.Profile{UserID: jobToDo.UserID}).First(&jobToDo.User.Profile).Error
if err != nil {
log.Println(err)
@ -89,6 +106,8 @@ func (env *Env) BackgroundJobRunner() {
jobToDo.Status = "running"
env.DB.Save(&jobToDo)
log.Printf("Job Started: %v", jobToDo.ID)
} else {
time.Sleep(time.Second)
}
}

Loading…
Cancel
Save