Fix golangci-lint warnings

This commit is contained in:
Jan Dittberner 2022-05-21 14:09:19 +02:00
parent 68d6f4bcdc
commit 3346cb5dba
5 changed files with 97 additions and 37 deletions

View file

@ -24,18 +24,6 @@ import (
"git.cacert.org/cacert-boardvoting/internal/models"
)
func (app *application) SetupJobs() {
quitChannel := make(chan struct{})
go app.jobScheduler.Schedule(quitChannel)
go func() {
for range app.ctx.Done() {
quitChannel <- struct{}{}
}
}()
}
type Job interface {
Schedule()
Run()
@ -92,7 +80,9 @@ func (r *RemindVotersJob) Run() {
}
for _, voter := range voters {
decisions, err = r.decisions.FindUnVotedDecisionsForVoter(&voter)
v := voter
decisions, err = r.decisions.FindUnVotedDecisionsForVoter(&v)
if err != nil {
r.errorLog.Printf("problem getting unvoted decisions: %v", err)
@ -126,7 +116,7 @@ func (app *application) NewRemindVotersJob(
}
}
type closeDecisionsJob struct {
type CloseDecisionsJob struct {
timer *time.Timer
infoLog *log.Logger
errorLog *log.Logger
@ -135,7 +125,7 @@ type closeDecisionsJob struct {
notify chan NotificationMail
}
func (c *closeDecisionsJob) Schedule() {
func (c *CloseDecisionsJob) Schedule() {
var (
nextDue *time.Time
err error
@ -169,7 +159,7 @@ func (c *closeDecisionsJob) Schedule() {
c.timer.Reset(when)
}
func (c *closeDecisionsJob) Run() {
func (c *CloseDecisionsJob) Run() {
c.infoLog.Printf("running CloseDecisionsJob")
results, err := c.decisions.CloseDecisions()
@ -184,7 +174,7 @@ func (c *closeDecisionsJob) Run() {
c.reschedule <- c
}
func (c *closeDecisionsJob) Stop() {
func (c *CloseDecisionsJob) Stop() {
if c.timer != nil {
c.timer.Stop()
c.timer = nil
@ -194,7 +184,7 @@ func (c *closeDecisionsJob) Stop() {
func (app *application) NewCloseDecisionsJob(
rescheduleChannel chan Job,
) Job {
return &closeDecisionsJob{
return &CloseDecisionsJob{
infoLog: app.infoLog,
errorLog: app.errorLog,
decisions: app.decisions,
@ -208,6 +198,7 @@ type JobScheduler struct {
errorLogger *log.Logger
jobs []Job
rescheduleChannel chan Job
quitChannel chan struct{}
}
func (app *application) NewJobScheduler() {
@ -218,26 +209,23 @@ func (app *application) NewJobScheduler() {
errorLogger: app.errorLog,
jobs: make([]Job, 0, 2),
rescheduleChannel: rescheduleChannel,
quitChannel: make(chan struct{}),
}
app.jobScheduler.addJob(app.NewCloseDecisionsJob(rescheduleChannel))
app.jobScheduler.addJob(app.NewRemindVotersJob(rescheduleChannel))
}
func (js *JobScheduler) Schedule(quitChannel chan struct{}) {
func (js *JobScheduler) Schedule() {
for _, job := range js.jobs {
js.infoLogger.Printf("schedule job %v", job)
job.Schedule()
}
for {
select {
case job := <-js.rescheduleChannel:
js.infoLogger.Printf("reschedule job %v", job)
job.Schedule()
case <-quitChannel:
case <-js.quitChannel:
for _, job := range js.jobs {
job.Stop()
}
@ -252,3 +240,7 @@ func (js *JobScheduler) Schedule(quitChannel chan struct{}) {
func (js *JobScheduler) addJob(job Job) {
js.jobs = append(js.jobs, job)
}
func (js *JobScheduler) Quit() {
js.quitChannel <- struct{}{}
}

View file

@ -44,7 +44,6 @@ type application struct {
errorLog, infoLog *log.Logger
voters *models.VoterModel
decisions *models.DecisionModel
ctx context.Context
jobScheduler *JobScheduler
mailNotifier *MailNotifier
mailConfig *mailConfig
@ -88,18 +87,23 @@ func main() {
infoLog: infoLog,
decisions: &models.DecisionModel{DB: db, InfoLog: infoLog},
voters: &models.VoterModel{DB: db},
ctx: context.Background(),
mailConfig: config.MailConfig,
baseURL: config.BaseURL,
}
app.NewMailNotifier()
defer app.mailNotifier.Quit()
app.NewJobScheduler()
defer app.jobScheduler.Quit()
err = internal.InitializeDb(db.DB, infoLog)
if err != nil {
errorLog.Fatal(err)
}
go app.jobScheduler.Schedule()
srv := &http.Server{
Addr: config.HTTPAddress,
ErrorLog: errorLog,

View file

@ -1,3 +1,20 @@
/*
Copyright 2022 CAcert Inc.
SPDX-License-Identifier: Apache-2.0
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package main
import (
@ -6,10 +23,11 @@ import (
"path"
"text/template"
"git.cacert.org/cacert-boardvoting/internal"
"git.cacert.org/cacert-boardvoting/internal/models"
"github.com/Masterminds/sprig/v3"
"gopkg.in/mail.v2"
"git.cacert.org/cacert-boardvoting/internal"
"git.cacert.org/cacert-boardvoting/internal/models"
)
type recipientData struct {
@ -32,6 +50,7 @@ type MailNotifier struct {
notifyChannel chan NotificationMail
senderAddress string
dialer *mail.Dialer
quitChannel chan struct{}
}
func (app *application) NewMailNotifier() {
@ -39,6 +58,7 @@ func (app *application) NewMailNotifier() {
notifyChannel: make(chan NotificationMail, 1),
senderAddress: app.mailConfig.NotificationSenderAddress,
dialer: mail.NewDialer(app.mailConfig.SMTPHost, app.mailConfig.SMTPPort, "", ""),
quitChannel: make(chan struct{}),
}
}
@ -73,7 +93,7 @@ func (app *application) StartMailNotifier() {
if err = app.mailNotifier.dialer.DialAndSend(m); err != nil {
app.errorLog.Printf("sending mail failed: %v", err)
}
case <-app.ctx.Done():
case <-app.mailNotifier.quitChannel:
app.infoLog.Print("ending mail notifier")
return
@ -81,10 +101,12 @@ func (app *application) StartMailNotifier() {
}
}
func (n *NotificationContent) buildMail(baseUrl string) (fmt.Stringer, error) {
b, err := internal.MailTemplates.ReadFile(
fmt.Sprintf(path.Join("mailtemplates", n.template)),
)
func (m *MailNotifier) Quit() {
m.quitChannel <- struct{}{}
}
func (n *NotificationContent) buildMail(baseURL string) (fmt.Stringer, error) {
b, err := internal.MailTemplates.ReadFile(path.Join("mailtemplates", n.template))
if err != nil {
return nil, fmt.Errorf("could not read mail template %s: %w", n.template, err)
}
@ -97,7 +119,7 @@ func (n *NotificationContent) buildMail(baseUrl string) (fmt.Stringer, error) {
data := struct {
Data any
BaseURL string
}{Data: n.data, BaseURL: baseUrl}
}{Data: n.data, BaseURL: baseURL}
mailText := bytes.NewBuffer(make([]byte, 0))
if err = t.Execute(mailText, data); err != nil {

View file

@ -1,3 +1,20 @@
/*
Copyright 2022 CAcert Inc.
SPDX-License-Identifier: Apache-2.0
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package internal
import "embed"

View file

@ -1,3 +1,20 @@
/*
Copyright 2022 CAcert Inc.
SPDX-License-Identifier: Apache-2.0
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package models_test
import (
@ -8,11 +25,12 @@ import (
"testing"
"time"
"git.cacert.org/cacert-boardvoting/internal"
"git.cacert.org/cacert-boardvoting/internal/models"
"github.com/jmoiron/sqlx"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"git.cacert.org/cacert-boardvoting/internal"
"git.cacert.org/cacert-boardvoting/internal/models"
)
func prepareTestDb(t *testing.T) (*sqlx.DB, *log.Logger) {
@ -44,7 +62,14 @@ func TestDecisionModel_Create(t *testing.T) {
Reminder: "test+voter@example.com",
}
id, err := dm.Create(v, models.VoteTypeMotion, "test motion", "I move that we should test more", time.Now(), time.Now().AddDate(0, 0, 7))
id, err := dm.Create(
v,
models.VoteTypeMotion,
"test motion",
"I move that we should test more",
time.Now(),
time.Now().AddDate(0, 0, 7),
)
assert.NoError(t, err)
assert.NotEmpty(t, id)
}