mirror of
https://github.com/Theodor-Springmann-Stiftung/kgpz_web.git
synced 2025-10-28 16:45:32 +00:00
restructured viewmodels, better serialization
This commit is contained in:
78
viewmodels/issue.go
Normal file
78
viewmodels/issue.go
Normal file
@@ -0,0 +1,78 @@
|
||||
package viewmodels
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/Theodor-Springmann-Stiftung/kgpz_web/providers/xmlprovider"
|
||||
)
|
||||
|
||||
const TLAYOUT = "2006-01-02"
|
||||
|
||||
var TRANSLM = map[string][]string{
|
||||
"January": {"Januar", "Jan", "1"},
|
||||
"February": {"Februar", "Feb", "2"},
|
||||
"March": {"März", "Mär", "3"},
|
||||
"April": {"April", "Apr", "4"},
|
||||
"May": {"Mai", "Mai", "5"},
|
||||
"June": {"Juni", "Jun", "6"},
|
||||
"July": {"Juli", "Jul", "7"},
|
||||
"August": {"August", "Aug", "8"},
|
||||
"September": {"September", "Sep", "9"},
|
||||
"October": {"Oktober", "Okt", "10"},
|
||||
"November": {"November", "Nov", "11"},
|
||||
"December": {"Dezember", "Dez", "12"},
|
||||
}
|
||||
|
||||
var TRANSLD = map[string][]string{
|
||||
"Monday": {"Montag", "Mo"},
|
||||
"Tuesday": {"Dienstag", "Di"},
|
||||
"Wednesday": {"Mittwoch", "Mi"},
|
||||
"Thursday": {"Donnerstag", "Do"},
|
||||
"Friday": {"Freitag", "Fr"},
|
||||
"Saturday": {"Samstag", "Sa"},
|
||||
"Sunday": {"Sonntag", "So"},
|
||||
}
|
||||
|
||||
type IssueViewModel struct {
|
||||
xmlprovider.Issue
|
||||
Weekday []string
|
||||
Day int
|
||||
Month []string
|
||||
}
|
||||
|
||||
func IssueView(y string, No string, lib *xmlprovider.Library) (*IssueViewModel, error) {
|
||||
n, err := strconv.Atoi(No)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, i := range lib.Issues.Items.Issues {
|
||||
if len(i.Datum.When) < 4 {
|
||||
continue
|
||||
}
|
||||
|
||||
d := i.Datum.When[:4]
|
||||
if d == y && i.Number.No == n {
|
||||
return FromIssue(i)
|
||||
}
|
||||
}
|
||||
|
||||
return nil, errors.New("Issue not found")
|
||||
}
|
||||
|
||||
func FromIssue(i xmlprovider.Issue) (*IssueViewModel, error) {
|
||||
t, err := time.Parse(TLAYOUT, i.Datum.When)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
ivm := IssueViewModel{
|
||||
Issue: i,
|
||||
Weekday: append(TRANSLD[t.Weekday().String()], t.Weekday().String()),
|
||||
Day: t.Day(),
|
||||
Month: TRANSLM[t.Month().String()]}
|
||||
|
||||
return &ivm, nil
|
||||
}
|
||||
11
viewmodels/piece.go
Normal file
11
viewmodels/piece.go
Normal file
@@ -0,0 +1,11 @@
|
||||
package viewmodels
|
||||
|
||||
import "github.com/Theodor-Springmann-Stiftung/kgpz_web/providers/xmlprovider"
|
||||
|
||||
type PieceViewModel struct {
|
||||
xmlprovider.Piece
|
||||
}
|
||||
|
||||
func NewPieceView(p xmlprovider.Piece) (PieceViewModel, error) {
|
||||
return PieceViewModel{Piece: p}, nil
|
||||
}
|
||||
51
viewmodels/singleissue.go
Normal file
51
viewmodels/singleissue.go
Normal file
@@ -0,0 +1,51 @@
|
||||
package viewmodels
|
||||
|
||||
import (
|
||||
"github.com/Theodor-Springmann-Stiftung/kgpz_web/helpers/logging"
|
||||
"github.com/Theodor-Springmann-Stiftung/kgpz_web/providers/xmlprovider"
|
||||
)
|
||||
|
||||
type SingleIssueViewModel struct {
|
||||
IssueViewModel
|
||||
No string
|
||||
Year string
|
||||
Additionals []PieceViewModel
|
||||
Pieces []PieceViewModel
|
||||
Next IssueViewModel
|
||||
Prev IssueViewModel
|
||||
}
|
||||
|
||||
func NewSingleIssueView(y string, No string, lib *xmlprovider.Library) (*SingleIssueViewModel, error) {
|
||||
ivm, err := IssueView(y, No, lib)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
sivm := SingleIssueViewModel{IssueViewModel: *ivm}
|
||||
|
||||
for _, a := range lib.Pieces.Items.Piece {
|
||||
for _, r := range a.IssueRefs {
|
||||
if r.Datum == y && r.Nr == No {
|
||||
p, err := NewPieceView(a)
|
||||
if err != nil {
|
||||
logging.ObjErr(&a, err)
|
||||
continue
|
||||
}
|
||||
sivm.Pieces = append(sivm.Pieces, p)
|
||||
}
|
||||
}
|
||||
|
||||
for _, r := range a.AdditionalRef {
|
||||
if r.Datum == y && r.Nr == No {
|
||||
p, err := NewPieceView(a)
|
||||
if err != nil {
|
||||
logging.ObjErr(&a, err)
|
||||
continue
|
||||
}
|
||||
sivm.Additionals = append(sivm.Additionals, p)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return &sivm, nil
|
||||
}
|
||||
87
viewmodels/year.go
Normal file
87
viewmodels/year.go
Normal file
@@ -0,0 +1,87 @@
|
||||
package viewmodels
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"slices"
|
||||
"sort"
|
||||
"strconv"
|
||||
|
||||
"github.com/Theodor-Springmann-Stiftung/kgpz_web/helpers/logging"
|
||||
"github.com/Theodor-Springmann-Stiftung/kgpz_web/providers/xmlprovider"
|
||||
)
|
||||
|
||||
type IssuesByMonth map[int][]IssueViewModel
|
||||
|
||||
type YearViewModel struct {
|
||||
Year string
|
||||
AvailableYears []string
|
||||
Issues IssuesByMonth
|
||||
}
|
||||
|
||||
func (y *YearViewModel) PushIssue(i xmlprovider.Issue) {
|
||||
iv, err := FromIssue(i)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
month, _ := strconv.Atoi(iv.Month[2])
|
||||
|
||||
list, ok := y.Issues[month]
|
||||
if !ok {
|
||||
list = []IssueViewModel{}
|
||||
}
|
||||
|
||||
y.Issues[month] = append(list, *iv)
|
||||
}
|
||||
|
||||
func (y *YearViewModel) PushAvailable(s string) {
|
||||
|
||||
if !slices.Contains(y.AvailableYears, s) {
|
||||
y.AvailableYears = append(y.AvailableYears, s)
|
||||
}
|
||||
}
|
||||
|
||||
func (y *YearViewModel) SortAvailableYears() {
|
||||
sort.Slice(y.AvailableYears, func(i, j int) bool {
|
||||
iint, err := strconv.Atoi(y.AvailableYears[i])
|
||||
if err != nil {
|
||||
return true
|
||||
}
|
||||
jint, err := strconv.Atoi(y.AvailableYears[j])
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
return iint < jint
|
||||
})
|
||||
}
|
||||
|
||||
func YearView(year string, lib *xmlprovider.Library) (*YearViewModel, error) {
|
||||
res := YearViewModel{Year: year}
|
||||
res.Issues = make(IssuesByMonth, 12)
|
||||
last := ""
|
||||
for _, issue := range lib.Issues.Items.Issues {
|
||||
|
||||
logging.ObjDebug(&issue, "Issue")
|
||||
if len(issue.Datum.When) < 4 {
|
||||
continue
|
||||
}
|
||||
|
||||
date := issue.Datum.When[0:4]
|
||||
if date != last {
|
||||
res.PushAvailable(date)
|
||||
last = date
|
||||
}
|
||||
|
||||
if date == year {
|
||||
res.PushIssue(issue)
|
||||
}
|
||||
}
|
||||
|
||||
if len(res.Issues) == 0 {
|
||||
return nil, errors.New("No issues found")
|
||||
}
|
||||
|
||||
res.SortAvailableYears()
|
||||
|
||||
return &res, nil
|
||||
}
|
||||
Reference in New Issue
Block a user