chore: Update chore detail query to include notes in result
This commit is contained in:
parent
c92cdb427d
commit
010db330a4
|
@ -802,14 +802,33 @@ func (h *Handler) completeChore(c *gin.Context) {
|
|||
})
|
||||
return
|
||||
}
|
||||
var nextDueDate *time.Time
|
||||
if chore.FrequencyType == "adaptive" {
|
||||
history, err := h.choreRepo.GetChoreHistoryWithLimit(c, chore.ID, 5)
|
||||
if err != nil {
|
||||
c.JSON(500, gin.H{
|
||||
"error": "Error getting chore history",
|
||||
})
|
||||
return
|
||||
}
|
||||
nextDueDate, err = scheduleAdaptiveNextDueDate(chore, completedDate, history)
|
||||
if err != nil {
|
||||
log.Printf("Error scheduling next due date: %s", err)
|
||||
c.JSON(500, gin.H{
|
||||
"error": "Error scheduling next due date",
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
nextDueDate, err := scheduleNextDueDate(chore, completedDate)
|
||||
if err != nil {
|
||||
log.Printf("Error scheduling next due date: %s", err)
|
||||
c.JSON(500, gin.H{
|
||||
"error": "Error scheduling next due date",
|
||||
})
|
||||
return
|
||||
} else {
|
||||
nextDueDate, err = scheduleNextDueDate(chore, completedDate)
|
||||
if err != nil {
|
||||
log.Printf("Error scheduling next due date: %s", err)
|
||||
c.JSON(500, gin.H{
|
||||
"error": "Error scheduling next due date",
|
||||
})
|
||||
return
|
||||
}
|
||||
}
|
||||
choreHistory, err := h.choreRepo.GetChoreHistory(c, chore.ID)
|
||||
if err != nil {
|
||||
|
|
|
@ -80,5 +80,6 @@ type ChoreDetail struct {
|
|||
LastCompletedDate *time.Time `json:"lastCompletedDate" gorm:"column:last_completed_date"`
|
||||
LastCompletedBy *int `json:"lastCompletedBy" gorm:"column:last_completed_by"`
|
||||
TotalCompletedCount int `json:"totalCompletedCount" gorm:"column:total_completed"`
|
||||
Notes *string `json:"notes" gorm:"column:notes"`
|
||||
CreatedBy int `json:"createdBy" gorm:"column:created_by"`
|
||||
}
|
||||
|
|
|
@ -234,6 +234,7 @@ func (r *ChoreRepository) GetChoreDetailByID(c context.Context, choreID int, cir
|
|||
chores.assigned_to,
|
||||
chores.created_by,
|
||||
recent_history.last_completed_date,
|
||||
recent_history.notes,
|
||||
recent_history.last_assigned_to as last_completed_by,
|
||||
COUNT(chore_histories.id) as total_completed`).
|
||||
Joins("LEFT JOIN chore_histories ON chores.id = chore_histories.chore_id").
|
||||
|
@ -241,7 +242,9 @@ func (r *ChoreRepository) GetChoreDetailByID(c context.Context, choreID int, cir
|
|||
SELECT
|
||||
chore_id,
|
||||
assigned_to AS last_assigned_to,
|
||||
completed_at AS last_completed_date
|
||||
completed_at AS last_completed_date,
|
||||
notes
|
||||
|
||||
FROM chore_histories
|
||||
WHERE (chore_id, completed_at) IN (
|
||||
SELECT chore_id, MAX(completed_at)
|
||||
|
@ -250,7 +253,7 @@ func (r *ChoreRepository) GetChoreDetailByID(c context.Context, choreID int, cir
|
|||
)
|
||||
) AS recent_history ON chores.id = recent_history.chore_id`).
|
||||
Where("chores.id = ? and chores.circle_id = ?", choreID, circleID).
|
||||
Group("chores.id, recent_history.last_completed_date, recent_history.last_assigned_to").
|
||||
Group("chores.id, recent_history.last_completed_date, recent_history.last_assigned_to, recent_history.notes").
|
||||
First(&choreDetail).Error; err != nil {
|
||||
return nil, err
|
||||
|
||||
|
|
|
@ -47,6 +47,7 @@ func scheduleNextDueDate(chore *chModel.Chore, completedDate time.Time) (*time.T
|
|||
} else if chore.FrequencyType == "yearly" {
|
||||
nextDueDate = baseDate.AddDate(1, 0, 0)
|
||||
} else if chore.FrequencyType == "adaptive" {
|
||||
|
||||
// TODO: calculate next due date based on the history of the chore
|
||||
// calculate the difference between the due date and now in days:
|
||||
diff := completedDate.UTC().Sub(chore.NextDueDate.UTC())
|
||||
|
@ -129,6 +130,33 @@ func scheduleNextDueDate(chore *chModel.Chore, completedDate time.Time) (*time.T
|
|||
|
||||
}
|
||||
|
||||
func scheduleAdaptiveNextDueDate(chore *chModel.Chore, completedDate time.Time, history []*chModel.ChoreHistory) (*time.Time, error) {
|
||||
// will generate due date base on history and the different between the completed date and the due date
|
||||
// the more recent the higher weight
|
||||
if len(history) <= 1 {
|
||||
if chore.NextDueDate != nil {
|
||||
diff := completedDate.UTC().Sub(chore.NextDueDate.UTC())
|
||||
nextDueDate := completedDate.UTC().Add(diff)
|
||||
return &nextDueDate, nil
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
var weight float64
|
||||
var totalWeight float64
|
||||
var nextDueDate time.Time
|
||||
for i := 0; i < len(history)-1; i++ {
|
||||
delay := history[i].CompletedAt.UTC().Sub(history[i+1].CompletedAt.UTC()).Seconds()
|
||||
weight = delay * float64(len(history)-i)
|
||||
totalWeight += weight
|
||||
}
|
||||
// calculate the average delay
|
||||
averageDelay := totalWeight / float64(len(history)-1)
|
||||
// calculate the difference between the completed date and the due date
|
||||
nextDueDate = completedDate.UTC().Add(time.Duration(averageDelay) * time.Second)
|
||||
|
||||
return &nextDueDate, nil
|
||||
}
|
||||
|
||||
func RemoveAssigneeAndReassign(chore *chModel.Chore, userID int) {
|
||||
for i, assignee := range chore.Assignees {
|
||||
if assignee.UserID == userID {
|
||||
|
|
Loading…
Reference in New Issue