75 lines
1.3 KiB
Go
75 lines
1.3 KiB
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
|
|
LEFT 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
|
|
}
|
|
|
|
if jsonData == nil {
|
|
return
|
|
}
|
|
|
|
err = json.Unmarshal(jsonData, &areas)
|
|
if err != nil {
|
|
err = re.Wrap(err)
|
|
return
|
|
}
|
|
|
|
return
|
|
} // }}}
|
|
func AreaCreate(name string) (err error) {// {{{
|
|
_, err = service.Db.Conn.Exec(`INSERT INTO area(name) VALUES($1)`, name)
|
|
return
|
|
}// }}}
|
|
func AreaRename(id int, name string) (err error) {// {{{
|
|
_, err = service.Db.Conn.Exec(`UPDATE area SET name=$2 WHERE id=$1`, id, name)
|
|
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
|
|
} // }}}
|