-
Notifications
You must be signed in to change notification settings - Fork 1
/
get_dd_group_all.go
99 lines (84 loc) · 2.78 KB
/
get_dd_group_all.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
//nolint:tagliatelle
package queries
import (
"context"
"github.com/DIMO-Network/device-definitions-api/internal/core/mediator"
"github.com/DIMO-Network/device-definitions-api/internal/infrastructure/db/repositories"
)
type GetAllDeviceDefinitionGroupQuery struct {
}
type GetAllDeviceDefinitionGroupQueryResult struct {
Make string `json:"make"`
Models []GetDeviceModels `json:"models"`
}
func (*GetAllDeviceDefinitionGroupQuery) Key() string { return "GetAllDeviceDefinitionGroupQuery" }
type GetDeviceModels struct {
Model string `json:"model"`
Years []GetDeviceModelYear `json:"years"`
}
type GetDeviceModelYear struct {
Year int16 `json:"year"`
DeviceDefinitionID string `json:"id"`
}
type GetAllDeviceDefinitionGroupQueryHandler struct {
Repository repositories.DeviceDefinitionRepository
MakeRepository repositories.DeviceMakeRepository
}
func NewGetAllDeviceDefinitionGroupQueryHandler(repository repositories.DeviceDefinitionRepository, makeRepository repositories.DeviceMakeRepository) GetAllDeviceDefinitionGroupQueryHandler {
return GetAllDeviceDefinitionGroupQueryHandler{
Repository: repository,
MakeRepository: makeRepository,
}
}
func (ch GetAllDeviceDefinitionGroupQueryHandler) Handle(ctx context.Context, _ mediator.Message) (interface{}, error) {
all, _ := ch.Repository.GetAll(ctx)
allMakes, _ := ch.MakeRepository.GetAll(ctx)
var result []GetAllDeviceDefinitionGroupQueryResult
for _, dd := range all {
makeName := ""
for _, mk := range allMakes {
if mk.ID == dd.DeviceMakeID {
makeName = mk.Name
break
}
}
idx := indexOfMake(result, makeName)
// append make if not found
if idx == -1 {
result = append(result, GetAllDeviceDefinitionGroupQueryResult{
Make: makeName,
Models: []GetDeviceModels{{Model: dd.Model, Years: []GetDeviceModelYear{{Year: dd.Year, DeviceDefinitionID: dd.ID}}}},
})
} else {
// attach model or year to existing make, lookup model
idx2 := indexOfModel(result[idx].Models, dd.Model)
if idx2 == -1 {
// append model if not found
result[idx].Models = append(result[idx].Models, GetDeviceModels{
Model: dd.Model,
Years: []GetDeviceModelYear{{Year: dd.Year, DeviceDefinitionID: dd.ID}},
})
} else {
// make and model already found, just add year
result[idx].Models[idx2].Years = append(result[idx].Models[idx2].Years, GetDeviceModelYear{Year: dd.Year, DeviceDefinitionID: dd.ID})
}
}
}
return result, nil
}
func indexOfMake(makes []GetAllDeviceDefinitionGroupQueryResult, make string) int {
for i, root := range makes {
if root.Make == make {
return i
}
}
return -1
}
func indexOfModel(models []GetDeviceModels, model string) int {
for i, m := range models {
if m.Model == model {
return i
}
}
return -1
}