restructured viewmodels, better serialization

This commit is contained in:
Simon Martens
2024-11-19 15:20:15 +01:00
parent 84fa6f7fa4
commit 7dc603df2c
26 changed files with 51479 additions and 198 deletions

78
viewmodels/issue.go Normal file
View 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
View 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
View 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
View 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
}