/
task_controller.go
109 lines (95 loc) · 2.96 KB
/
task_controller.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package controller
import (
"github.com/bulutcan99/weekly-task-scheduler/internal/application/dto"
"github.com/bulutcan99/weekly-task-scheduler/internal/application/interfaces"
"github.com/bulutcan99/weekly-task-scheduler/internal/domain/model/aggregate"
"github.com/bulutcan99/weekly-task-scheduler/internal/domain/model/entity"
"github.com/bulutcan99/weekly-task-scheduler/internal/domain/model/valueobject"
"github.com/gofiber/fiber/v2"
"math"
"sync"
)
type TaskController struct {
TaskService interfaces.ITaskService
}
func NewTaskController(taskService interfaces.ITaskService) *TaskController {
return &TaskController{TaskService: taskService}
}
// @Summary Get all the tasks
// @Description Get all the task from the database
// @ID get-tasks
// @Produce json
// @Success 200 {object} []dto.Task
// @Failure 400 {object} dto.ErrorResponse
// @Failure 500 {object} dto.ErrorResponse
// @Router /v1/providers [get]
func (tc *TaskController) GetTasks(ctx *fiber.Ctx) error {
tasks, err := tc.TaskService.GetTasks(ctx.Context())
if err != nil {
return ctx.Status(500).JSON(dto.ErrorResponse{
Error: true,
Msg: "Error while getting tasks",
})
}
return ctx.JSON(tasks)
}
// Bunlar map ile donulcek (aggregate data ile) ve swagger halledilcek, bide description halledilcek. Bide task upsert kisminda insert ederken eski data gelince hata veriyo.
// @Summary Assign tasks to developers
// @Description Assign tasks to developers
// @ID assign-tasks
// @Produce json
// @Success 200 {object} map[string]aggregate.DeveloperTask
// @Failure 400 {object} dto.ErrorResponse
// @Failure 500 {object} dto.ErrorResponse
// @Router /v1/task [post]
func (tc *TaskController) AssignTask(ctx *fiber.Ctx) error {
developers := entity.NewDevelopers()
tasks, err := tc.TaskService.GetTasks(ctx.Context())
if err != nil {
return ctx.Status(500).JSON(dto.ErrorResponse{
Error: true,
Msg: "Error while getting tasks",
})
}
devMap := make(map[string]*aggregate.DeveloperTask)
weeks := 0
var mu sync.Mutex
var wg sync.WaitGroup
for {
weeks++
for _, developer := range developers {
wg.Add(1)
go func(dev *entity.Developer) {
defer wg.Done()
mu.Lock()
defer mu.Unlock()
hoursLeft := dev.RemainingHours
for i := len(tasks) - 1; i >= 0; i-- {
task := tasks[i]
taskEfficiency := task.Intensity
taskHours := math.Ceil(float64(taskEfficiency) / float64(dev.Speed))
if taskHours <= float64(hoursLeft) {
dev.Work(task.Name)
if devMap[dev.Name] == nil {
devMap[dev.Name] = &aggregate.DeveloperTask{
Developer: dev,
Tasks: &[]valueobject.Task{},
}
}
*devMap[dev.Name].Tasks = append(*devMap[dev.Name].Tasks, task)
hoursLeft -= int(taskHours)
tasks = append(tasks[:i], tasks[i+1:]...)
}
}
}(&developer)
}
wg.Wait()
if len(tasks) == 0 {
break
}
}
for _, devTask := range devMap {
devTask.Week = weeks
}
return ctx.Status(fiber.StatusOK).JSON(devMap)
}