63 lines
975 B
Go
63 lines
975 B
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
// External
|
||
|
re "git.gibonuddevalla.se/go/wrappederror"
|
||
|
|
||
|
// Standard
|
||
|
"encoding/json"
|
||
|
"sort"
|
||
|
)
|
||
|
|
||
|
type Area struct {
|
||
|
ID int
|
||
|
Name string
|
||
|
|
||
|
Sections []Section
|
||
|
}
|
||
|
|
||
|
func AreaRetrieve() (areas []Area, err error) {// {{{
|
||
|
areas = []Area{}
|
||
|
row := service.Db.Conn.QueryRow(`
|
||
|
SELECT
|
||
|
jsonb_agg(jsonsections)
|
||
|
FROM (
|
||
|
SELECT
|
||
|
a.id,
|
||
|
a.name,
|
||
|
jsonb_agg(
|
||
|
jsonb_build_object(
|
||
|
'id', s.id,
|
||
|
'name', s.name
|
||
|
)
|
||
|
) AS sections
|
||
|
FROM area a
|
||
|
INNER JOIN section s ON s.area_id = a.id
|
||
|
GROUP BY
|
||
|
a.id, a.name
|
||
|
) jsonsections`,
|
||
|
)
|
||
|
|
||
|
var jsonData []byte
|
||
|
err = row.Scan(&jsonData)
|
||
|
if err != nil {
|
||
|
err = re.Wrap(err)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
err = json.Unmarshal(jsonData, &areas)
|
||
|
if err != nil {
|
||
|
err = re.Wrap(err)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
return
|
||
|
}// }}}
|
||
|
|
||
|
func (a Area) SortedSections() []Section {// {{{
|
||
|
sort.SliceStable(a.Sections, func (i, j int) bool {
|
||
|
return a.Sections[i].Name < a.Sections[j].Name
|
||
|
})
|
||
|
return a.Sections
|
||
|
}// }}}
|