feat: add delete schoolyear route and handler

This commit is contained in:
Patryk Hegenberg 2025-11-09 17:35:10 +01:00
parent 3ac1947106
commit 34834f2eaa
3 changed files with 52 additions and 0 deletions

View file

@ -580,3 +580,31 @@ func calculateHours(entry TimeEntry) float64 {
return calculateHoursDiff(entry.StartTime, entry.EndTime) return calculateHoursDiff(entry.StartTime, entry.EndTime)
} }
} }
func DeleteSchoolYear(db *sql.DB, id int) error {
var isActive bool
err := db.QueryRow("SELECT is_active FROM school_years WHERE id = ?", id).Scan(&isActive)
if err != nil {
return err
}
if isActive {
return fmt.Errorf("cannot delete active school year")
}
result, err := db.Exec("DELETE FROM school_years WHERE id = ? AND is_active = 0", id)
if err != nil {
return err
}
rowsAffected, err := result.RowsAffected()
if err != nil {
return err
}
if rowsAffected == 0 {
return sql.ErrNoRows
}
return nil
}

View file

@ -690,3 +690,26 @@ func (app *App) GenerateYearlySummaryPDFHandler(c echo.Context) error {
return c.Blob(http.StatusOK, "application/pdf", pdfBytes) return c.Blob(http.StatusOK, "application/pdf", pdfBytes)
} }
func (app *App) DeleteSchoolYearHandler(c echo.Context) error {
id, err := strconv.Atoi(c.Param("id"))
if err != nil {
return HandleError(c, ErrInvalidInputMsg("Schuljahr-ID"))
}
if err := DeleteSchoolYear(app.DB, id); err != nil {
if err == sql.ErrNoRows {
return HandleError(c, ErrNotFoundMsg("Schuljahr"))
}
if err.Error() == "cannot delete active school year" {
return HandleError(c, &AppError{
Code: "CANNOT_DELETE_ACTIVE_SCHOOL_YEAR",
Message: "Aktives Schuljahr kann nicht gelöscht werden",
HTTPStatus: http.StatusBadRequest,
})
}
return HandleError(c, ErrDatabaseMsg(err))
}
return c.NoContent(http.StatusNoContent)
}

View file

@ -80,6 +80,7 @@ func main() {
admin.POST("/time-entry", app.AdminCreateTimeEntryHandler) admin.POST("/time-entry", app.AdminCreateTimeEntryHandler)
admin.GET("/school-years", app.GetSchoolYearsHandler) admin.GET("/school-years", app.GetSchoolYearsHandler)
admin.POST("/school-years", app.CreateSchoolYearHandler) admin.POST("/school-years", app.CreateSchoolYearHandler)
admin.DELETE("/school-years/:id", app.DeleteSchoolYearHandler)
admin.PUT("/school-years/:id/activate", app.SetActiveSchoolYearHandler) admin.PUT("/school-years/:id/activate", app.SetActiveSchoolYearHandler)
admin.GET("/yearly-summary/pdf", app.GenerateYearlySummaryPDFHandler) admin.GET("/yearly-summary/pdf", app.GenerateYearlySummaryPDFHandler)
} }