Footer in eigenes Template verschoben und Logging verbessert

This commit is contained in:
Gonne 2022-09-19 17:00:19 +02:00
parent c38286bcc5
commit 4f5dc053a0
14 changed files with 40 additions and 44 deletions

View file

@ -11,7 +11,7 @@ import (
type Config struct { type Config struct {
Server struct { Server struct {
ListenAddress string ListenAddress string
ListenPort int ListenPort int
Protocol string Protocol string
Domain string Domain string
} }
@ -40,6 +40,9 @@ type Config struct {
MysqlPort int MysqlPort int
MysqlDatabase string MysqlDatabase string
} }
Tutor struct {
MailSuffix string
}
} }
// ReadConfigFile takes a file path as an argument and attempts to // ReadConfigFile takes a file path as an argument and attempts to
@ -48,15 +51,18 @@ type Config struct {
func ReadConfigFile(filename string, conf *Config) error { func ReadConfigFile(filename string, conf *Config) error {
configData, err := ioutil.ReadFile(filename) configData, err := ioutil.ReadFile(filename)
if err != nil { if err != nil {
log.Printf("Error reading config file: %s", err.Error())
return err return err
} }
err = json.Unmarshal(configData, conf) err = json.Unmarshal(configData, conf)
if err != nil { if err != nil {
log.Printf("Error parsing config file as json: %s", err.Error())
return err return err
} }
return validateConfig(conf) return validateConfig(conf)
} }
// Checks config for sane values (e.g. correct port range or database type).
func validateConfig(conf *Config) error { func validateConfig(conf *Config) error {
var err error var err error
if !(conf.Server.ListenPort >= 1 && conf.Server.ListenPort <= 65535) { if !(conf.Server.ListenPort >= 1 && conf.Server.ListenPort <= 65535) {
@ -64,7 +70,7 @@ func validateConfig(conf *Config) error {
log.Println(err.Error()) log.Println(err.Error())
} }
if !(conf.Server.Protocol == "http" || conf.Server.Protocol == "https") { if !(conf.Server.Protocol == "http" || conf.Server.Protocol == "https") {
err = fmt.Errorf("Validating config: Server protocol must be http or https, but is '%s'.", conf.Server.Protocol) err = fmt.Errorf("Validating config: Server protocol must be 'http' or 'https', but is '%s'.", conf.Server.Protocol)
log.Println(err.Error()) log.Println(err.Error())
} }
if !(conf.Date.MinuteGranularity >= 1 && conf.Date.MinuteGranularity <= 60) { if !(conf.Date.MinuteGranularity >= 1 && conf.Date.MinuteGranularity <= 60) {
@ -76,7 +82,7 @@ func validateConfig(conf *Config) error {
log.Println(err.Error()) log.Println(err.Error())
} }
if !(conf.Mailer.Type == "Stdout" || conf.Mailer.Type == "Smtp") { if !(conf.Mailer.Type == "Stdout" || conf.Mailer.Type == "Smtp") {
err = fmt.Errorf("Validating config: Mailer type must be 'stdout' or 'smtp', but is '%s'.", conf.Mailer.Type) err = fmt.Errorf("Validating config: Mailer type must be 'Stdout' or 'Smtp', but is '%s'.", conf.Mailer.Type)
log.Println(err.Error()) log.Println(err.Error())
} }
if !(conf.SQL.Type == "SQLite" || conf.SQL.Type == "Mysql") { if !(conf.SQL.Type == "SQLite" || conf.SQL.Type == "Mysql") {

View file

@ -14,7 +14,7 @@
"mailer": { "mailer": {
"type": "Stdout", "type": "Stdout",
"fromAddress": "sprechstunden@localhost", "fromAddress": "sprechstunden@localhost",
"fromName": "Mathebau Sprechstunden <sprechstunden@localhost>", "fromName": "Sprechstunden <sprechstunden@localhost>",
"smtpHost": "localhost", "smtpHost": "localhost",
"smtpPort": 25, "smtpPort": 25,
"smtpUseAuth": false, "smtpUseAuth": false,
@ -29,5 +29,8 @@
"mysqlHost": "localhost", "mysqlHost": "localhost",
"mysqlPort": 3306, "mysqlPort": 3306,
"mysqlDatabase": "officeHours" "mysqlDatabase": "officeHours"
},
"tutor": {
"mailSuffix": ""
} }
} }

View file

@ -2,8 +2,10 @@ package controllers
import ( import (
"fmt" "fmt"
"log"
"net/http" "net/http"
"net/mail" "net/mail"
"sprechstundentool/config"
"sprechstundentool/models" "sprechstundentool/models"
"strconv" "strconv"
"strings" "strings"
@ -22,6 +24,7 @@ type maskData struct {
Email string Email string
Info string Info string
Errors []string Errors []string
Config config.Config
} }
func (b *BaseHandler) AddOfficeHourHandler(w http.ResponseWriter, req *http.Request) { func (b *BaseHandler) AddOfficeHourHandler(w http.ResponseWriter, req *http.Request) {
@ -105,8 +108,8 @@ func (b *BaseHandler) AddOfficeHourHandler(w http.ResponseWriter, req *http.Requ
if err != nil { if err != nil {
email = &mail.Address{"", req.FormValue("email")} email = &mail.Address{"", req.FormValue("email")}
errors = append(errors, "Mailaddresse konnte nicht geparst werden.") errors = append(errors, "Mailaddresse konnte nicht geparst werden.")
} else if !strings.HasSuffix(email.Address, "tu-darmstadt.de") { } else if !strings.HasSuffix(email.Address, b.config.Tutor.MailSuffix) {
errors = append(errors, "Mailaddresse muss auf „tu-darmstadt.de“ enden.") errors = append(errors, fmt.Sprintf("Mailaddresse muss auf „%s“ enden.", b.config.Tutor.MailSuffix))
} }
info := req.FormValue("info") info := req.FormValue("info")
@ -130,6 +133,7 @@ func (b *BaseHandler) AddOfficeHourHandler(w http.ResponseWriter, req *http.Requ
email.Address, email.Address,
info, info,
errors, errors,
b.config,
} }
b.writeAddOfficeHourMask(w, req, data) b.writeAddOfficeHourMask(w, req, data)
} else { } else {
@ -155,14 +159,15 @@ func (b *BaseHandler) AddOfficeHourHandler(w http.ResponseWriter, req *http.Requ
} }
func (b *BaseHandler) writeAddOfficeHourMask(w http.ResponseWriter, req *http.Request, data maskData) { func (b *BaseHandler) writeAddOfficeHourMask(w http.ResponseWriter, req *http.Request, data maskData) {
if len(data.Errors) != 0 {
w.WriteHeader(http.StatusBadRequest)
}
if req.Method == http.MethodGet { if req.Method == http.MethodGet {
data.Errors = []string{} data.Errors = []string{}
} }
if len(data.Errors) != 0 {
w.WriteHeader(http.StatusBadRequest)
}
err := Templates.ExecuteTemplate(w, "addMask.html", data) err := Templates.ExecuteTemplate(w, "addMask.html", data)
if err != nil { 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()))) w.Write([]byte(fmt.Sprintf("Template konnte nicht geparst werden : %s", err.Error())))
return return
} }

View file

@ -12,6 +12,7 @@ var Templates, _ = template.Must(template.ParseFiles(
"templates/deleteSuccess.html", "templates/deleteSuccess.html",
"templates/executeFailure.html", "templates/executeFailure.html",
"templates/executeSuccess.html", "templates/executeSuccess.html",
"templates/footer.html",
"templates/index.html", "templates/index.html",
"templates/officeHourTable.html", "templates/officeHourTable.html",
"templates/requestNotFound.html")). "templates/requestNotFound.html")).

View file

@ -1,3 +1,4 @@
// main
package main package main
import ( import (
@ -51,5 +52,5 @@ func main() {
http.HandleFunc("/", h.RootHandler) http.HandleFunc("/", h.RootHandler)
err = http.ListenAndServe(fmt.Sprintf("%s:%d", conf.Server.ListenAddress, conf.Server.ListenPort), nil) err = http.ListenAndServe(fmt.Sprintf("%s:%d", conf.Server.ListenAddress, conf.Server.ListenPort), nil)
fmt.Println(err.Error()) log.Println(err.Error())
} }

View file

@ -6,9 +6,6 @@
Irgendetwas ist schief gegangen. Bitte sende folgende Daten an <a href="mailto:sprechstundentool@mathebau.de">sprechstundentool@mathebau.de</a> mit einer Beschreibung, was du tun wolltest. Irgendetwas ist schief gegangen. Bitte sende folgende Daten an <a href="mailto:sprechstundentool@mathebau.de">sprechstundentool@mathebau.de</a> mit einer Beschreibung, was du tun wolltest.
<br /> <br />
{{.}} {{.}}
<footer> {{template "footer.html" .}}
<a href="/addOfficeHour">Sprechstunde anlegen</a><br />
Technische Fragen an <a href="mailto:sprechstundentool@mathebau.de">sprechstundentool@mathebau.de</a>
</footer>
</body> </body>
</html> </html>

View file

@ -39,15 +39,12 @@
<input type="submit"> <input type="submit">
</form> </form>
</p> </p>
Du musst hier eine Email-Adresse angeben, die auf „tu-darmstadt.de“ endet.<br /> {{if ne .Config.Tutor.MailSuffix ""}}Du musst hier eine Email-Adresse angeben, die auf „{{.Config.Tutor.MailSuffix}}“ endet.<br />{{end}}
Außerdem dürfen in Räumen nur begrenzt viele Sprechstunden gleichzeitig stattfinden, nämlich Außerdem dürfen in Räumen nur begrenzt viele Sprechstunden gleichzeitig stattfinden, nämlich
<dl> <dl>
{{range $room := .Rooms}} {{range $room := .Rooms}}
<dt>{{$room.Name}}</dt><dl>{{$room.MaxOccupy}} Sprechstunde{{if gt $room.MaxOccupy 1}}n{{end}}</dl><br />{{end}} <dt>{{$room.Name}}</dt><dl>{{$room.MaxOccupy}} Sprechstunde{{if gt $room.MaxOccupy 1}}n{{end}}</dl><br />{{end}}
</dl> </dl>
<footer> {{template "footer.html" .}}
<a href="/addOfficeHour">Sprechstunde anlegen</a><br />
Technische Fragen an <a href="mailto:sprechstundentool@mathebau.de">sprechstundentool@mathebau.de</a>
</footer>
</body> </body>
</html> </html>

View file

@ -5,9 +5,6 @@
<body> <body>
Die Sprechstunde wurde angelegt. Du solltest eine Mail mit einem Aktivierungslink erhalten haben. Die Sprechstunde wurde angelegt. Du solltest eine Mail mit einem Aktivierungslink erhalten haben.
<br /> <br />
<footer> {{template "footer.html" .}}
<a href="/addOfficeHour">Sprechstunde anlegen</a><br />
Technische Fragen an <a href="mailto:sprechstundentool@mathebau.de">sprechstundentool@mathebau.de</a>
</footer>
</body> </body>
</html> </html>

View file

@ -5,9 +5,6 @@
<body> <body>
Du solltest eine Mail mit einem Bestätigungslink erhalten haben. Du solltest eine Mail mit einem Bestätigungslink erhalten haben.
<br /> <br />
<footer> {{template "footer.html" .}}
<a href="/addOfficeHour">Sprechstunde anlegen</a><br />
Technische Fragen an <a href="mailto:sprechstundentool@mathebau.de">sprechstundentool@mathebau.de</a>
</footer>
</body> </body>
</html> </html>

View file

@ -6,9 +6,6 @@
Irgendetwas ist schief gegangen. Bitte sende folgende Daten an <a href="mailto:sprechstundentool@mathebau.de">sprechstundentool@mathebau.de</a> mit einer Beschreibung, was du tun wolltest. Irgendetwas ist schief gegangen. Bitte sende folgende Daten an <a href="mailto:sprechstundentool@mathebau.de">sprechstundentool@mathebau.de</a> mit einer Beschreibung, was du tun wolltest.
<br /> <br />
{{.}} {{.}}
<footer> {{template "footer.html" .}}
<a href="/addOfficeHour">Sprechstunde anlegen</a><br />
Technische Fragen an <a href="mailto:sprechstundentool@mathebau.de">sprechstundentool@mathebau.de</a>
</footer>
</body> </body>
</html> </html>

View file

@ -4,9 +4,6 @@
</head> </head>
<body> <body>
Deine Anfrage wurde ausgeführt. Deine Anfrage wurde ausgeführt.
<footer> {{template "footer.html" .}}
<a href="/addOfficeHour">Sprechstunde anlegen</a><br />
Technische Fragen an <a href="mailto:sprechstundentool@mathebau.de">sprechstundentool@mathebau.de</a>
</footer>
</body> </body>
</html> </html>

5
templates/footer.html Normal file
View file

@ -0,0 +1,5 @@
<footer>
<a href="/addOfficeHour">Sprechstunde anlegen</a><br />
<a href="/deleteOfficeHour">Sprechstunde löschen</a><br />
Technische Fragen an <a href="mailto:sprechstundentool@mathebau.de">sprechstundentool@mathebau.de</a>
</footer>

View file

@ -22,10 +22,6 @@
<input type="submit" value="Auswählen" /> <input type="submit" value="Auswählen" />
</form> </form>
{{.Timetable}} {{.Timetable}}
<footer> {{template "footer.html" .}}
<a href="/addOfficeHour">Sprechstunde anlegen</a><br />
<a href="/deleteOfficeHour">Sprechstunde löschen</a><br />
Technische Fragen an <a href="mailto:sprechstundentool@mathebau.de">sprechstundentool@mathebau.de</a>
</footer>
</body> </body>
</html> </html>

View file

@ -11,9 +11,6 @@
<label for="code">Bestätigungscode</label>: <input type="text" name="code"/> <label for="code">Bestätigungscode</label>: <input type="text" name="code"/>
<input type="submit" /> <input type="submit" />
</form> </form>
<footer> {{template "footer.html" .}}
<a href="/addOfficeHour">Sprechstunde anlegen</a><br />
Technische Fragen an <a href="mailto:sprechstundentool@mathebau.de">sprechstundentool@mathebau.de</a>
</footer>
</body> </body>
</html> </html>