forked from kyma-project/kyma
-
Notifications
You must be signed in to change notification settings - Fork 0
/
topics_converter.go
79 lines (59 loc) · 1.97 KB
/
topics_converter.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
package content
import (
"fmt"
"strings"
"github.com/kyma-project/kyma/components/ui-api-layer/internal/domain/content/storage"
"github.com/kyma-project/kyma/components/ui-api-layer/internal/gqlschema"
funk "github.com/thoas/go-funk"
)
type topicsConverter struct{}
func (c *topicsConverter) ToGQL(in []gqlschema.TopicEntry) *gqlschema.JSON {
if in == nil {
return nil
}
result := make(gqlschema.JSON)
result["topics"] = in
return &result
}
func (c *topicsConverter) getUniqueTypes(documents []storage.Document) []string {
r := funk.Map(documents, func(x storage.Document) string {
return x.Type
})
return funk.UniqString(r.([]string))
}
func (r *topicsConverter) getAnchor(input string) string {
anchor := strings.TrimSpace(input)
anchor = strings.Replace(input, " ", "-", -1)
return strings.ToLower(anchor)
}
func (c *topicsConverter) ExtractSection(documents []storage.Document, internal bool) ([]gqlschema.Section, error) {
var topics []gqlschema.Section
types := c.getUniqueTypes(documents)
for _, t := range types {
entry := gqlschema.Section{TopicType: t}
doc, ok := funk.Filter(documents, func(x storage.Document) bool {
if internal == true {
return x.Type == t
} else {
return x.Type == t && x.Internal == false
}
}).([]storage.Document)
if !ok {
return []gqlschema.Section{}, fmt.Errorf("while converting object from interface to []Docs")
}
//if there is only one document of certain type, title equals to the title of this docuemnt, otherwise - we go deeper
if len(doc) == 1 {
tit := gqlschema.Title{Name: doc[0].Title, Anchor: c.getAnchor(doc[0].Title)}
entry.Titles = append(entry.Titles, tit)
} else {
tit := gqlschema.Title{Name: t, Anchor: c.getAnchor(t)}
for _, d := range doc {
titChild := gqlschema.Title{Name: d.Title, Anchor: c.getAnchor(d.Title)}
tit.Titles = append(tit.Titles, titChild)
}
entry.Titles = append(entry.Titles, tit)
}
topics = append(topics, entry)
}
return topics, nil
}