Add option to subscribe to mailinglist

This commit is contained in:
Gonne 2024-01-03 17:04:38 +01:00
parent 47c546b880
commit 5c896e6a96
11 changed files with 38 additions and 22 deletions

3
.gitignore vendored
View file

@ -20,3 +20,6 @@ vendor/
# Go workspace file # Go workspace file
go.work go.work
#IDE files
*.geany

View file

@ -25,16 +25,17 @@ type maskData struct {
Hour int Hour int
Minute int Minute int
} }
SelectedCourse int SelectedCourse int
SelectedRoom int SelectedRoom int
Date models.Date Date models.Date
Duration int Duration int
Roomname string Roomname string
Name string Name string
Email string Email string
Info string SubscribeToMailinglist bool
Errors []string Info string
Config config.Config Errors []string
Config config.Config
} }
// Offer a form to add office hours and validate its input on receiving. // Offer a form to add office hours and validate its input on receiving.
@ -129,6 +130,9 @@ func (b *BaseHandler) AddOfficeHourHandler(w http.ResponseWriter, req *http.Requ
} else if !(b.config.Tutor.MailSuffix == "" || strings.HasSuffix(email.Address, "@"+b.config.Tutor.MailSuffix) || strings.HasSuffix(email.Address, "."+b.config.Tutor.MailSuffix)) { } else if !(b.config.Tutor.MailSuffix == "" || strings.HasSuffix(email.Address, "@"+b.config.Tutor.MailSuffix) || strings.HasSuffix(email.Address, "."+b.config.Tutor.MailSuffix)) {
errors = append(errors, fmt.Sprintf("Mailaddresse muss auf „%s“ enden.", b.config.Tutor.MailSuffix)) errors = append(errors, fmt.Sprintf("Mailaddresse muss auf „%s“ enden.", b.config.Tutor.MailSuffix))
} }
subscribeToMailinglist := req.FormValue("subscribeToMailinglist") == "subscribe"
info := req.FormValue("info") info := req.FormValue("info")
allowed, err := b.officeHourRepo.AllowedAt(date, duration, room, true) allowed, err := b.officeHourRepo.AllowedAt(date, duration, room, true)
@ -155,6 +159,7 @@ func (b *BaseHandler) AddOfficeHourHandler(w http.ResponseWriter, req *http.Requ
roomname, roomname,
name, name,
email.Address, email.Address,
subscribeToMailinglist,
info, info,
errors, errors,
b.config, b.config,
@ -164,7 +169,7 @@ func (b *BaseHandler) AddOfficeHourHandler(w http.ResponseWriter, req *http.Requ
// if the data for a new office hour was sent correctly, save it. // if the data for a new office hour was sent correctly, save it.
officeHour := models.OfficeHour{Id: 0, officeHour := models.OfficeHour{Id: 0,
Tutor: models.Tutor{Id: 0, Name: name, Email: email.Address}, Tutor: models.Tutor{Id: 0, Name: name, Email: email.Address, SubscribeToMailinglist: subscribeToMailinglist},
Date: date, Date: date,
Room: room, Room: room,
RoomName: roomname, RoomName: roomname,

View file

@ -37,7 +37,7 @@ func (b *BaseHandler) GetTimetable(officeHours []models.OfficeHour) (map[models.
} }
} }
slots := []int{1, 1, 1, 1, 1} slots := []int{1, 1, 1, 1, 1}
for date, _ := range timetable { for date := range timetable {
if slots[date.Day] < len(timetable[date]) { if slots[date.Day] < len(timetable[date]) {
slots[date.Day] = len(timetable[date]) slots[date.Day] = len(timetable[date])
} }

2
go.sum
View file

@ -1,6 +1,4 @@
github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI=
github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
github.com/mattn/go-sqlite3 v1.14.19 h1:fhGleo2h1p8tVChob4I9HpmVFIAkKGpiukdrgQbWfGI= github.com/mattn/go-sqlite3 v1.14.19 h1:fhGleo2h1p8tVChob4I9HpmVFIAkKGpiukdrgQbWfGI=
github.com/mattn/go-sqlite3 v1.14.19/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mattn/go-sqlite3 v1.14.19/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=

View file

@ -12,7 +12,7 @@ type Request struct {
const ( const (
RequestActivate RequestAction = iota // Fix integer to represent request for activation of an office hour. RequestActivate RequestAction = iota // Fix integer to represent request for activation of an office hour.
RequestDelete // Fix integer to represent request for deletion of an office hour. RequestDelete // Fix integer to represent request for deletion of an office hour.
) )
type RequestRepository interface { type RequestRepository interface {

View file

@ -5,6 +5,10 @@ type Tutor struct {
Id int Id int
Name string Name string
Email string Email string
// Does the tutor want to subscribe to the mailinglist for student assistents?
// This information has to be extracted from the database by hand.
SubscribeToMailinglist bool
} }
type TutorRepository interface { type TutorRepository interface {

View file

@ -21,7 +21,8 @@ CREATE TABLE `room` (
CREATE TABLE `tutor` ( CREATE TABLE `tutor` (
`id` INTEGER PRIMARY KEY AUTO_INCREMENT, `id` INTEGER PRIMARY KEY AUTO_INCREMENT,
`name` tinytext DEFAULT NULL, `name` tinytext DEFAULT NULL,
`email` tinytext DEFAULT NULL `email` tinytext DEFAULT NULL,
`subscribeToMailinglist` BOOL DEFAULT false
); );
-- --

View file

@ -53,7 +53,8 @@ DROP TABLE IF EXISTS `tutor`;
CREATE TABLE `tutor` ( CREATE TABLE `tutor` (
`id` INTEGER PRIMARY KEY, `id` INTEGER PRIMARY KEY,
`name` tinytext DEFAULT NULL, `name` tinytext DEFAULT NULL,
`email` tinytext DEFAULT NULL `email` tinytext DEFAULT NULL,
`subscribeToMailinglist` BOOL DEFAULT false
); );
-- --

View file

@ -50,7 +50,7 @@ func (r *TutorRepo) Add(tutor models.Tutor) (int, error) {
//Don't add identical tutors //Don't add identical tutors
existentTutor, err := r.FindByNameAndEmail(tutor.Name, tutor.Email) existentTutor, err := r.FindByNameAndEmail(tutor.Name, tutor.Email)
if errors.Is(err, sql.ErrNoRows) { if errors.Is(err, sql.ErrNoRows) {
sqlResult, err := r.db.Exec("INSERT INTO `tutor` (name, email) VALUES (?,?)", tutor.Name, tutor.Email) sqlResult, err := r.db.Exec("INSERT INTO `tutor` (name, email, subscribeToMailinglist) VALUES (?,?,?)", tutor.Name, tutor.Email, tutor.SubscribeToMailinglist)
if err != nil { if err != nil {
err = fmt.Errorf("SQL-error inserting new tutor: %w", err) err = fmt.Errorf("SQL-error inserting new tutor: %w", err)
log.Println(err.Error()) log.Println(err.Error())
@ -67,7 +67,7 @@ func (r *TutorRepo) Add(tutor models.Tutor) (int, error) {
func (r *TutorRepo) getFromRow(row *sql.Row) (models.Tutor, error) { func (r *TutorRepo) getFromRow(row *sql.Row) (models.Tutor, error) {
var tutor models.Tutor var tutor models.Tutor
if err := row.Scan(&tutor.Id, &tutor.Name, &tutor.Email); err != nil { if err := row.Scan(&tutor.Id, &tutor.Name, &tutor.Email, &tutor.SubscribeToMailinglist); err != nil {
err = fmt.Errorf("SQL-error scanning tutor row: %w", err) err = fmt.Errorf("SQL-error scanning tutor row: %w", err)
log.Println(err.Error()) log.Println(err.Error())
return models.Tutor{}, err return models.Tutor{}, err
@ -79,7 +79,7 @@ func (r *TutorRepo) getFromRows(rows *sql.Rows) ([]models.Tutor, error) {
var tutors []models.Tutor var tutors []models.Tutor
for rows.Next() { for rows.Next() {
var tutor models.Tutor var tutor models.Tutor
if err := rows.Scan(&tutor.Id, &tutor.Name, &tutor.Email); err != nil { if err := rows.Scan(&tutor.Id, &tutor.Name, &tutor.Email, &tutor.SubscribeToMailinglist); err != nil {
err = fmt.Errorf("Error scanning tutor row: %w", err) err = fmt.Errorf("Error scanning tutor row: %w", err)
log.Println(err.Error()) log.Println(err.Error())
return tutors, err return tutors, err

View file

@ -31,6 +31,10 @@
{{end}} {{end}}
Die Email-Adresse dient der Vermeidung von Spam und wird nicht veröffentlicht. Die Email-Adresse dient der Vermeidung von Spam und wird nicht veröffentlicht.
</div> </div>
<div class="form-check">
<input class="form-check-input" name="subscribeToMailinglist" id="subscribeToMailinglist" type="checkbox" value="subscribe" {{if eq .SubscribeToMailinglist true}}checked{{end}}>
<label class="form-check-label" for="subscribeToMailinglist"><a href="https://lists.mathebau.de/postorius/lists/shk.mathebau.de/">Mailingliste für SHK</a> abbonieren</label>
</div>
</div> </div>
<div class="form-floating mb-3"> <div class="form-floating mb-3">

View file

@ -1,7 +1,7 @@
From: {{.Config.Mailer.FromName}} From: {{.Config.Mailer.FromName}}
To: {{.Request.OfficeHour.Tutor.Email}} To: {{.Request.OfficeHour.Tutor.Email}}
Subject: Sprechstunde {{if eq .Request.Action 0}}anlegen{{end}}{{if eq .Request.Action 1}}löschen{{end}} Subject: Sprechstunde {{if eq .Request.Action 0}}anlegen{{end}}{{if eq .Request.Action 1}}löschen{{end}}
Message-Id: {{.MessageId}} Message-ID: {{.MessageId}}
Hallo {{.Request.OfficeHour.Tutor.Name}}, Hallo {{.Request.OfficeHour.Tutor.Name}},
@ -17,4 +17,4 @@ Falls dies richtig ist, so bestätige die Sprechstunde durch Abrufen der folgend
{{.Config.Server.Protocol}}://{{.Config.Server.Domain}}/confirmRequest?code={{.Request.Secret}} {{.Config.Server.Protocol}}://{{.Config.Server.Domain}}/confirmRequest?code={{.Request.Secret}}
Solltest du diese Email nicht erwartet haben, so kannst du sie einfach ignorieren. Solltest du diese Email nicht erwartet haben, so kannst du sie einfach ignorieren.
Deine Fachschaft Mathematik Deine Fachschaft Mathematik