view changes

This commit is contained in:
Simon Martens
2024-11-22 23:47:36 +01:00
parent 3e4cafb5ee
commit 7a6edbf668
11 changed files with 185 additions and 88 deletions

View File

@@ -1,23 +1,32 @@
package controllers
import (
"strconv"
"github.com/Theodor-Springmann-Stiftung/kgpz_web/app"
"github.com/Theodor-Springmann-Stiftung/kgpz_web/helpers/logging"
"github.com/Theodor-Springmann-Stiftung/kgpz_web/viewmodels"
"github.com/gofiber/fiber/v2"
)
const (
MINYEAR = 1764
MAXYEAR = 1779
)
func GetIssue(kgpz *app.KGPZ) fiber.Handler {
return func(c *fiber.Ctx) error {
y := c.Params("year")
if len(y) != 4 {
logging.Error(nil, "Year is not 4 characters long")
yi, err := strconv.Atoi(y)
if err != nil || yi < MINYEAR || yi > MAXYEAR {
logging.Error(err, "Year is not a valid number")
return c.SendStatus(fiber.StatusNotFound)
}
d := c.Params("issue")
if d == "" {
logging.Error(nil, "Issue number is empty")
di, err := strconv.Atoi(d)
if err != nil || di < 1 {
logging.Error(err, "Issue is not a valid number")
return c.SendStatus(fiber.StatusNotFound)
}
@@ -28,6 +37,6 @@ func GetIssue(kgpz *app.KGPZ) fiber.Handler {
return c.SendStatus(fiber.StatusNotFound)
}
return c.Render("/issue/", fiber.Map{"model": issue})
return c.Render("/issue/", fiber.Map{"model": issue, "year": yi, "issue": di})
}
}

View File

@@ -1,21 +1,21 @@
package controllers
import (
"strconv"
"github.com/Theodor-Springmann-Stiftung/kgpz_web/app"
"github.com/Theodor-Springmann-Stiftung/kgpz_web/helpers/logging"
"github.com/Theodor-Springmann-Stiftung/kgpz_web/viewmodels"
"github.com/gofiber/fiber/v2"
)
const (
START_YEAR = "1764"
)
func GetYear(kgpz *app.KGPZ) fiber.Handler {
return func(c *fiber.Ctx) error {
y := c.Params("year", START_YEAR)
if len(y) != 4 {
return c.SendStatus(fiber.StatusBadRequest)
y := c.Params("year", strconv.Itoa(MINYEAR))
yi, err := strconv.Atoi(y)
if err != nil || yi < MINYEAR || yi > MAXYEAR {
logging.Error(err, "Year is not a valid number")
return c.SendStatus(fiber.StatusNotFound)
}
issues, err := viewmodels.YearView(y, kgpz.Library)

View File

@@ -3,6 +3,7 @@ package xmlprovider
import (
"encoding/xml"
"fmt"
"strconv"
"github.com/google/uuid"
)
@@ -38,11 +39,11 @@ func (p Piece) GetIDs() []string {
uid := uuid.New()
for _, i := range p.IssueRefs {
ret = append(ret, i.Datum+"-"+i.Nr+"-"+uid.String())
ret = append(ret, i.Datum+"-"+strconv.Itoa(i.Nr)+"-"+uid.String())
}
for _, i := range p.AdditionalRef {
ret = append(ret, i.Datum+"-"+i.Nr+"-"+uid.String())
ret = append(ret, i.Datum+"-"+strconv.Itoa(i.Nr)+"-b-"+uid.String())
}
return ret
}

View File

@@ -11,19 +11,19 @@ type AdditionalRef struct {
XMLName xml.Name `xml:"beilage"`
Reference
Datum string `xml:"datum,attr"`
Nr string `xml:"nr,attr"`
AdditionalNo string `xml:"beilage,attr"`
Von string `xml:"von,attr"`
Bis string `xml:"bis,attr"`
Nr int `xml:"nr,attr"`
AdditionalNo int `xml:"beilage,attr"`
Von int `xml:"von,attr"`
Bis int `xml:"bis,attr"`
}
type IssueRef struct {
XMLName xml.Name `xml:"stueck"`
Reference
Datum string `xml:"datum,attr"`
Nr string `xml:"nr,attr"`
Von string `xml:"von,attr"`
Bis string `xml:"bis,attr"`
Nr int `xml:"nr,attr"`
Von int `xml:"von,attr"`
Bis int `xml:"bis,attr"`
}
type PlaceRef struct {

View File

@@ -1,11 +0,0 @@
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
}

101
viewmodels/piecevm.go Normal file
View File

@@ -0,0 +1,101 @@
package viewmodels
import (
"slices"
"strconv"
"strings"
"github.com/Theodor-Springmann-Stiftung/kgpz_web/helpers/logging"
"github.com/Theodor-Springmann-Stiftung/kgpz_web/providers/xmlprovider"
)
type PieceViewModel struct {
xmlprovider.Piece
// TODO: this is a bit hacky, but it refences the page number of the piece in the issue
Von int
Bis int
}
func NewPieceView(p xmlprovider.Piece) (PieceViewModel, error) {
return PieceViewModel{Piece: p}, nil
}
type PieceListViewModel struct {
IssuePieces []PieceViewModel
AdditionalPieces []PieceViewModel
}
func PieceListViewModelForIssue(lib *xmlprovider.Library, y string, No string) (*PieceListViewModel, error) {
p := PieceListViewModel{}
err := p.piecesForIsssue(y, No, lib)
if err != nil {
return nil, err
}
return &p, nil
}
func (plvm *PieceListViewModel) piecesForIsssue(y string, No string, lib *xmlprovider.Library) error {
lookfor := y + "-" + No + "-"
noi, err := strconv.Atoi(No)
if err != nil {
return err
}
lib.Pieces.Items.Range(func(key, value interface{}) bool {
k := key.(string)
if strings.HasPrefix(k, lookfor) {
a := value.(xmlprovider.Piece)
p, err := NewPieceView(a)
if err != nil {
logging.ObjErr(&a, err)
return true
}
if strings.HasPrefix(k, lookfor+"b-") {
for _, i := range p.AdditionalRef {
if i.Datum == y && i.Nr == noi {
p.Von = i.Von
p.Bis = i.Bis
}
}
plvm.AdditionalPieces = append(plvm.AdditionalPieces, p)
} else {
for _, i := range p.IssueRefs {
if i.Datum == y && i.Nr == noi {
p.Von = i.Von
p.Bis = i.Bis
}
}
plvm.IssuePieces = append(plvm.IssuePieces, p)
}
}
return true
})
return nil
}
func (plvm *PieceListViewModel) Sort(y string, no int) {
SortPiecesByPage(&plvm.IssuePieces, y, no)
SortPiecesByPage(&plvm.AdditionalPieces, y, no)
}
func SortPiecesByPage(pieces *[]PieceViewModel, y string, no int) {
slices.SortFunc(*pieces, func(i, j PieceViewModel) int {
if i.Von == j.Von {
if i.Bis >= 0 {
return 1
} else if j.Bis >= 0 {
return -1
} else {
return 0
}
}
if i.Von > j.Von {
return 1
}
return -1
})
}

View File

@@ -1,46 +0,0 @@
package viewmodels
import (
"strconv"
"strings"
"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}
logging.Info(strconv.Itoa(len(lib.Pieces.Everything())) + "pieces in library")
lookfor := y + "-" + No
lib.Pieces.Items.Range(func(key, value interface{}) bool {
k := key.(string)
if strings.HasPrefix(k, lookfor) {
a := value.(xmlprovider.Piece)
p, err := NewPieceView(a)
if err != nil {
logging.ObjErr(&a, err)
return true
}
sivm.Pieces = append(sivm.Pieces, p)
}
return true
})
return &sivm, nil
}

View File

@@ -0,0 +1,38 @@
package viewmodels
import (
"strconv"
"github.com/Theodor-Springmann-Stiftung/kgpz_web/providers/xmlprovider"
)
type SingleIssueViewModel struct {
IssueViewModel
No string
Year string
Pieces PieceListViewModel
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
}
pl, err := PieceListViewModelForIssue(lib, y, No)
if err != nil {
return nil, err
}
sivm := SingleIssueViewModel{IssueViewModel: *ivm, No: No, Year: y, Pieces: *pl}
no, err := strconv.Atoi(No)
if err != nil {
return nil, err
}
sivm.Pieces.Sort(y, no)
return &sivm, nil
}

View File

@@ -1,21 +1,26 @@
Issue found!
{{ $model := .model }}
{{ range $piece := .model.Pieces }}
{{ $page := 0 }}
{{ range $piece := .model.Pieces.IssuePieces }}
<div>
Piece!
{{ if (ne $page $piece.Von) }}
{{ $page = $piece.Von }}
<div>S. {{ $page }}</div>
{{ end }}
Piece!
{{ if gt (len $piece.IssueRefs) 1 }}
{{ len $piece.IssueRefs }} Teile
<ol>
{{ range $issue := $piece.IssueRefs }}
<li>
<a href="/{{- $issue.Datum -}}/{{- $issue.Nr -}}" >
{{- $issue.Datum }} Nr. {{ $issue.Nr -}}
</a>
</li>
{{ end }}
{{ range $issue := $piece.IssueRefs }}
<li>
<a href="/{{- $issue.Datum -}}/{{- $issue.Nr -}}">
{{- $issue.Datum }} Nr.
{{ $issue.Nr -}}
</a>
</li>
{{ end }}
</ol>
{{ end }}