mirror of
				https://github.com/Theodor-Springmann-Stiftung/kgpz_web.git
				synced 2025-10-30 17:45:30 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			135 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			135 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package controllers
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"strconv"
 | |
| 
 | |
| 	"github.com/Theodor-Springmann-Stiftung/kgpz_web/helpers/logging"
 | |
| 	"github.com/Theodor-Springmann-Stiftung/kgpz_web/xmlmodels"
 | |
| 	"github.com/gofiber/fiber/v2"
 | |
| )
 | |
| 
 | |
| // FindIssueByYearAndPage finds the first issue in a given year that contains the specified page
 | |
| func FindIssueByYearAndPage(year, page int, library *xmlmodels.Library) (*xmlmodels.Issue, error) {
 | |
| 	library.Issues.Lock()
 | |
| 	defer library.Issues.Unlock()
 | |
| 
 | |
| 	var foundIssues []xmlmodels.Issue
 | |
| 
 | |
| 	// Find all issues in the given year that contain the page
 | |
| 	for _, issue := range library.Issues.Array {
 | |
| 		if issue.Datum.When.Year == year && page >= issue.Von && page <= issue.Bis {
 | |
| 			foundIssues = append(foundIssues, issue)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if len(foundIssues) == 0 {
 | |
| 		return nil, fmt.Errorf("no issue found containing page %d in year %d", page, year)
 | |
| 	}
 | |
| 
 | |
| 	// Return the first issue chronologically (by issue number)
 | |
| 	firstIssue := foundIssues[0]
 | |
| 	for _, issue := range foundIssues {
 | |
| 		if issue.Number.No < firstIssue.Number.No {
 | |
| 			firstIssue = issue
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return &firstIssue, nil
 | |
| }
 | |
| 
 | |
| func GetPageJump(kgpz *xmlmodels.Library) fiber.Handler {
 | |
| 	return func(c *fiber.Ctx) error {
 | |
| 		// Parse year parameter
 | |
| 		yearStr := c.Params("year")
 | |
| 		year, err := strconv.Atoi(yearStr)
 | |
| 		if err != nil || year < MINYEAR || year > MAXYEAR {
 | |
| 			logging.Debug("Invalid year for page jump: " + yearStr)
 | |
| 			return c.Status(fiber.StatusBadRequest).SendString(`
 | |
| 				<div id="year-error" class="text-red-600 text-sm mt-1">
 | |
| 					Ungültiges Jahr. Bitte wählen Sie ein Jahr zwischen ` + strconv.Itoa(MINYEAR) + ` und ` + strconv.Itoa(MAXYEAR) + `.
 | |
| 				</div>
 | |
| 			`)
 | |
| 		}
 | |
| 
 | |
| 		// Parse page parameter
 | |
| 		pageStr := c.Params("page")
 | |
| 		page, err := strconv.Atoi(pageStr)
 | |
| 		if err != nil || page < 1 {
 | |
| 			logging.Debug("Invalid page for page jump: " + pageStr)
 | |
| 			return c.Status(fiber.StatusBadRequest).SendString(`
 | |
| 				<div id="page-error" class="text-red-600 text-sm mt-1">
 | |
| 					Ungültige Seitenzahl. Bitte geben Sie eine positive Zahl ein.
 | |
| 				</div>
 | |
| 			`)
 | |
| 		}
 | |
| 
 | |
| 		// Find the issue containing this page
 | |
| 		issue, err := FindIssueByYearAndPage(year, page, kgpz)
 | |
| 		if err != nil {
 | |
| 			logging.Debug(fmt.Sprintf("Page %d not found in year %d: %v", page, year, err))
 | |
| 			return c.Status(fiber.StatusNotFound).SendString(`
 | |
| 				<div id="page-error" class="text-red-600 text-sm mt-1">
 | |
| 					Seite ` + pageStr + ` wurde in Jahr ` + yearStr + ` nicht gefunden.
 | |
| 				</div>
 | |
| 			`)
 | |
| 		}
 | |
| 
 | |
| 		// Construct the redirect URL
 | |
| 		redirectURL := fmt.Sprintf("/%d/%d/%d", year, issue.Number.No, page)
 | |
| 
 | |
| 		logging.Debug(fmt.Sprintf("Page jump: %s -> %s", c.OriginalURL(), redirectURL))
 | |
| 
 | |
| 		// Return HTMX redirect
 | |
| 		c.Set("HX-Redirect", redirectURL)
 | |
| 		return c.SendStatus(fiber.StatusOK)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // GetPageJumpForm handles POST requests for the page jump form
 | |
| func GetPageJumpForm(kgpz *xmlmodels.Library) fiber.Handler {
 | |
| 	return func(c *fiber.Ctx) error {
 | |
| 		// Parse form data
 | |
| 		yearStr := c.FormValue("year")
 | |
| 		pageStr := c.FormValue("page")
 | |
| 
 | |
| 		// Validate year
 | |
| 		year, err := strconv.Atoi(yearStr)
 | |
| 		if err != nil || year < MINYEAR || year > MAXYEAR {
 | |
| 			logging.Debug("Invalid year in form: " + yearStr)
 | |
| 			return c.Status(fiber.StatusBadRequest).Render("/errors/jump_error/", fiber.Map{
 | |
| 				"Message": fmt.Sprintf("Ungültiges Jahr. Bitte wählen Sie ein Jahr zwischen %d und %d.", MINYEAR, MAXYEAR),
 | |
| 			}, "clear")
 | |
| 		}
 | |
| 
 | |
| 		// Validate page
 | |
| 		page, err := strconv.Atoi(pageStr)
 | |
| 		if err != nil || page < 1 {
 | |
| 			logging.Debug("Invalid page in form: " + pageStr)
 | |
| 			return c.Status(fiber.StatusBadRequest).Render("/errors/jump_error/", fiber.Map{
 | |
| 				"Message": "Ungültige Seitenzahl. Bitte geben Sie eine positive Zahl ein.",
 | |
| 			}, "clear")
 | |
| 		}
 | |
| 
 | |
| 		// Find the issue containing this page
 | |
| 		issue, err := FindIssueByYearAndPage(year, page, kgpz)
 | |
| 		if err != nil {
 | |
| 			logging.Debug(fmt.Sprintf("Page %d not found in year %d: %v", page, year, err))
 | |
| 			return c.Status(fiber.StatusNotFound).Render("/errors/jump_error/", fiber.Map{
 | |
| 				"Message": fmt.Sprintf("Seite %s wurde in Jahr %s nicht gefunden.", pageStr, yearStr),
 | |
| 			}, "clear")
 | |
| 		}
 | |
| 
 | |
| 		// Construct the redirect URL
 | |
| 		redirectURL := fmt.Sprintf("/%d/%d/%d", year, issue.Number.No, page)
 | |
| 
 | |
| 		logging.Debug(fmt.Sprintf("Page jump form: year=%s, page=%s -> %s", yearStr, pageStr, redirectURL))
 | |
| 
 | |
| 		// Clear any existing errors and redirect
 | |
| 		c.Set("HX-Redirect", redirectURL)
 | |
| 		c.Set("HX-Retarget", "#jump-errors")
 | |
| 		c.Set("HX-Reswap", "innerHTML")
 | |
| 		return c.SendString("")
 | |
| 	}
 | |
| }
 | 
