diff --git a/controllers/addOfficeHourHandler.go b/controllers/addOfficeHourHandler.go index 33322b8..1bdaf5d 100644 --- a/controllers/addOfficeHourHandler.go +++ b/controllers/addOfficeHourHandler.go @@ -2,7 +2,6 @@ package controllers import ( "fmt" - "log" "net/http" "net/mail" "officeHours/config" @@ -149,12 +148,12 @@ func (b *BaseHandler) AddOfficeHourHandler(w http.ResponseWriter, req *http.Requ id, err := b.officeHourRepo.Add(officeHour) if err != nil { w.WriteHeader(http.StatusInternalServerError) - Templates.ExecuteTemplate(w, "addFailure.html", err) + b.serveTemplate(w, "addFailure", err) return } officeHour, _ = b.officeHourRepo.FindById(id) b.requestRepo.Add(officeHour, models.RequestActivate) - Templates.ExecuteTemplate(w, "addSuccess.html", struct{}{}) + b.serveTemplate(w, "addSuccess", nil) } } @@ -165,10 +164,5 @@ func (b *BaseHandler) writeAddOfficeHourMask(w http.ResponseWriter, req *http.Re if len(data.Errors) != 0 { w.WriteHeader(http.StatusBadRequest) } - err := Templates.ExecuteTemplate(w, "addMask.html", data) - if err != nil { - log.Printf("Template addMask.html could not be parsed: %s", err.Error()) - w.Write([]byte(fmt.Sprintf("Template konnte nicht geparst werden : %s", err.Error()))) - return - } + b.serveTemplate(w, "addMask", data) } diff --git a/controllers/confirmRequestHandler.go b/controllers/confirmRequestHandler.go index 09ef51a..7f2060f 100644 --- a/controllers/confirmRequestHandler.go +++ b/controllers/confirmRequestHandler.go @@ -9,17 +9,15 @@ func (b *BaseHandler) ConfirmRequestHandler(w http.ResponseWriter, req *http.Req request, err := b.requestRepo.FindBySecret(secret) if err != nil { - w.WriteHeader(http.StatusNotFound) - Templates.ExecuteTemplate(w, "requestNotFound.html", struct{}{}) + b.serveTemplate(w, "requestNotFound", nil) return } err = b.requestRepo.Execute(request) if err != nil { - w.WriteHeader(http.StatusInternalServerError) - Templates.ExecuteTemplate(w, "executeFailure.html", err.Error()) + b.serveTemplate(w, "executeFailure", err.Error()) return } - Templates.ExecuteTemplate(w, "executeSuccess.html", struct{}{}) + b.serveTemplate(w, "executeSuccess", nil) } diff --git a/controllers/deleteOfficeHourHandler.go b/controllers/deleteOfficeHourHandler.go index c38162e..233dc34 100644 --- a/controllers/deleteOfficeHourHandler.go +++ b/controllers/deleteOfficeHourHandler.go @@ -18,7 +18,7 @@ func (b *BaseHandler) DeleteOfficeHourHandler(w http.ResponseWriter, req *http.R w.WriteHeader(http.StatusBadRequest) } _, err = b.requestRepo.Add(officeHour, models.RequestDelete) - Templates.ExecuteTemplate(w, "deleteSuccess.html", struct{}{}) + b.serveTemplate(w, "deleteSuccess", nil) } else { officeHours, _ := b.officeHourRepo.GetAll(true) timetable, slots := b.GetTimetable(officeHours) diff --git a/controllers/getHandlers.go b/controllers/getHandlers.go index ca410f4..50d055e 100644 --- a/controllers/getHandlers.go +++ b/controllers/getHandlers.go @@ -1,7 +1,6 @@ package controllers import ( - "fmt" "html/template" "net/http" "officeHours/models" @@ -28,6 +27,7 @@ func (b *BaseHandler) GetByCourseHandler(w http.ResponseWriter, req *http.Reques courseid, err := strconv.Atoi(req.FormValue("veranstaltung")) if err != nil { b.RootHandler(w, req) + return } course, err := b.courseRepo.FindById(courseid) if err != nil { @@ -51,9 +51,5 @@ func (b *BaseHandler) writeTimetablePage(w http.ResponseWriter, req *http.Reques SelectedRoom int SelectedCourse int }{courses, rooms, timetable, selectedRoom, selectedCourse} - err := Templates.ExecuteTemplate(w, "index.html", data) - if err != nil { - w.Write([]byte(fmt.Sprintf("Template konnte nicht geparst werden : %s", err.Error()))) - return - } + b.serveTemplate(w, "index", data) } diff --git a/controllers/templates.go b/controllers/templates.go index c87fd8c..da2fa77 100644 --- a/controllers/templates.go +++ b/controllers/templates.go @@ -1,21 +1,47 @@ package controllers import ( + "fmt" "html/template" + "net/http" "officeHours/models" + "os" ) -var Templates, _ = template.Must(template.ParseFiles( - "templates/addFailure.html", - "templates/addMask.html", - "templates/addSuccess.html", - "templates/deleteSuccess.html", - "templates/executeFailure.html", - "templates/executeSuccess.html", - "templates/footer.html", - "templates/head.html", - "templates/index.html", - "templates/officeHourTable.html", - "templates/requestNotFound.html")). - New("").Funcs(template.FuncMap{"DayName": models.DayName, - "divide": func(i int, j int) int { return i / j }}).ParseFiles("templates/confirmationMail", "templates/td.html") +var funcs = template.FuncMap{ + "DayName": models.DayName, + "divide": func(i int, j int) int { return i / j }, +} +var baseTemplate = template.Must(template.ParseFiles("templates/base.html")).New("base.html").Funcs(funcs) + +func (b *BaseHandler) serveTemplate(w http.ResponseWriter, name string, data any) { + full_name := "templates/" + name + ".html" + // check that template exists + info, err := os.Stat(full_name) + if (err != nil && os.IsNotExist(err)) || info.IsDir() { + w.WriteHeader(http.StatusNotFound) + w.Write([]byte("404: Template nicht gefunden.")) + return + } + + tmpl, err := baseTemplate.ParseFiles(full_name) + if err != nil { + // TODO: log.Printf + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(fmt.Sprintf("500: Template "+full_name+" konnte nicht geparst werden : %s", err.Error()))) + return + } + // TODO: cache templates in parsed state, but not executed + err = template.Must(tmpl.Clone()).Execute(w, data) + if err != nil { + // TODO: log.Printf + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(fmt.Sprintf("500: Template "+full_name+" konnte nicht ausgeführt werden : %s", err.Error()))) + return + } +} + +var RawTemplates = template.Must(template.New("").Funcs(funcs).ParseFiles( + "templates/confirmationMail", + "templates/td.html", + "templates/officeHourTable.html")) diff --git a/controllers/timetable.go b/controllers/timetable.go index a16ba21..7162026 100644 --- a/controllers/timetable.go +++ b/controllers/timetable.go @@ -84,7 +84,7 @@ func (b *BaseHandler) printTimetable(timetable map[models.Date]map[int]models.Of MinuteGranularity int DeleteIcons bool }{OfficeHour: current, MinuteGranularity: b.config.Date.MinuteGranularity, DeleteIcons: deleteIcons} - Templates.ExecuteTemplate(&celldata, "td.html", data) + RawTemplates.ExecuteTemplate(&celldata, "td.html", data) tableBody += celldata.String() } } else { @@ -116,6 +116,6 @@ func (b *BaseHandler) printTimetable(timetable map[models.Date]map[int]models.Of slots[4], template.HTML(tableBody), } - Templates.ExecuteTemplate(&table, "officeHourTable.html", tableData) + RawTemplates.ExecuteTemplate(&table, "officeHourTable.html", tableData) return template.HTML(table.String()) } diff --git a/repositories/request.go b/repositories/request.go index 20bd06b..2ebdb73 100644 --- a/repositories/request.go +++ b/repositories/request.go @@ -128,7 +128,7 @@ func (r *RequestRepo) sendConfirmationMail(request models.Request) error { Config config.Config Request models.Request }{r.config, request} - err := controllers.Templates.ExecuteTemplate(&message, "confirmationMail", data) + err := controllers.RawTemplates.ExecuteTemplate(&message, "confirmationMail", data) if err != nil { log.Printf("Error parsing confirmation Mail: %s", err.Error()) return err diff --git a/templates/addFailure.html b/templates/addFailure.html index f160553..51d4b2d 100644 --- a/templates/addFailure.html +++ b/templates/addFailure.html @@ -1,13 +1,7 @@ - - -
-
- {{range .Errors}}{{.}}
{{end}}
-
+ {{range .Errors}}{{.}}
{{end}}
+
- Dieser Bestätigungscode ist nicht verfügbar.
- Bitte gib deinen Bestätigungscode hier ein.
-
+ Dieser Bestätigungscode ist nicht verfügbar.
+ Bitte gib deinen Bestätigungscode hier ein.
+