diff --git a/.github/workflows/go-build.yml b/.github/workflows/go-build.yml index 0f3ab79..d97cace 100644 --- a/.github/workflows/go-build.yml +++ b/.github/workflows/go-build.yml @@ -1,13 +1,12 @@ -name: Build +name: Test and Build on: - push: - branches: [ "main", "develop" ] pull_request: - branches: [ "main", "develop" ] - + branches: [ "main" ] + push: + branches: [ "main" ] jobs: - build: + test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -15,7 +14,21 @@ jobs: - name: Set up Go uses: actions/setup-go@v4 with: - go-version: '1.23' + go-version: '1.22' + + - name: Run tests + run: go test ./... + + build: + runs-on: ubuntu-latest + needs: test + steps: + - uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v4 + with: + go-version: '1.22' - name: Build - run: go build -v ./... + run: go build -v ./... \ No newline at end of file diff --git a/.golangci.yaml b/.golangci.yaml new file mode 100644 index 0000000..4e1b3c7 --- /dev/null +++ b/.golangci.yaml @@ -0,0 +1,48 @@ +run: + timeout: 5m + tests: true + +linters: + enable: + - govet + - errcheck + - staticcheck + - gosimple + - unused + - ineffassign + - unused + - typecheck + - gofmt + - goimports + - gocyclo + - dupl + - misspell + - unconvert + - nakedret + - goconst + - gocritic + +linters-settings: + gofmt: + simplify: true + + gocyclo: + min-complexity: 15 + + dupl: + threshold: 100 + + misspell: + locale: US + +issues: + exclude-use-default: false + max-issues-per-linter: 0 + max-same-issues: 0 + exclude-rules: + - linters: + - errcheck + text: ".*error return value not checked.*" + - linters: + - dupl + text: ".*duplicate of.*" \ No newline at end of file diff --git a/internal/notifier/service/planner.go b/internal/notifier/service/planner.go index a8f8ef6..427862b 100644 --- a/internal/notifier/service/planner.go +++ b/internal/notifier/service/planner.go @@ -30,7 +30,7 @@ func (n *NotificationPlanner) GenerateNotifications(c context.Context, chore *ch circleMembers, err := n.cRepo.GetCircleUsers(c, chore.CircleID) assignees := make([]*cModel.UserCircleDetail, 0) for _, member := range circleMembers { - if member.ID == chore.AssignedTo { + if member.UserID == chore.AssignedTo { assignees = append(assignees, member) } } @@ -71,14 +71,7 @@ func (n *NotificationPlanner) GenerateNotifications(c context.Context, chore *ch } func generateDueNotifications(chore *chModel.Chore, users []*cModel.UserCircleDetail) []*nModel.Notification { - var assignee *cModel.UserCircleDetail notifications := make([]*nModel.Notification, 0) - for _, user := range users { - if user.ID == chore.AssignedTo { - assignee = user - break - } - } for _, user := range users { notification := &nModel.Notification{ ChoreID: chore.ID, @@ -86,9 +79,9 @@ func generateDueNotifications(chore *chModel.Chore, users []*cModel.UserCircleDe ScheduledFor: *chore.NextDueDate, CreatedAt: time.Now().UTC(), TypeID: user.NotificationType, - UserID: user.ID, + UserID: user.UserID, TargetID: user.TargetID, - Text: fmt.Sprintf("📅 Reminder: *%s* is due today and assigned to %s.", chore.Name, assignee.DisplayName), + Text: fmt.Sprintf("📅 Reminder: *%s* is due today and assigned to %s.", chore.Name, user.DisplayName), } if notification.IsValid() { notifications = append(notifications, notification) @@ -99,13 +92,7 @@ func generateDueNotifications(chore *chModel.Chore, users []*cModel.UserCircleDe } func generatePreDueNotifications(chore *chModel.Chore, users []*cModel.UserCircleDetail) []*nModel.Notification { - var assignee *cModel.UserCircleDetail - for _, user := range users { - if user.ID == chore.AssignedTo { - assignee = user - break - } - } + notifications := make([]*nModel.Notification, 0) for _, user := range users { notification := &nModel.Notification{ @@ -114,9 +101,9 @@ func generatePreDueNotifications(chore *chModel.Chore, users []*cModel.UserCircl ScheduledFor: *chore.NextDueDate, CreatedAt: time.Now().UTC().Add(-time.Hour * 3), TypeID: user.NotificationType, - UserID: user.ID, + UserID: user.UserID, TargetID: user.TargetID, - Text: fmt.Sprintf("📢 Heads up! *%s* is due soon (on %s) and assigned to %s.", chore.Name, chore.NextDueDate.Format("January 2nd"), assignee.DisplayName), + Text: fmt.Sprintf("📢 Heads up! *%s* is due soon (on %s) and assigned to %s.", chore.Name, chore.NextDueDate.Format("January 2nd"), user.DisplayName), } if notification.IsValid() { notifications = append(notifications, notification) @@ -128,13 +115,7 @@ func generatePreDueNotifications(chore *chModel.Chore, users []*cModel.UserCircl } func generateOverdueNotifications(chore *chModel.Chore, users []*cModel.UserCircleDetail) []*nModel.Notification { - var assignee *cModel.UserCircleDetail - for _, user := range users { - if user.ID == chore.AssignedTo { - assignee = user - break - } - } + notifications := make([]*nModel.Notification, 0) for _, hours := range []int{24, 48, 72} { scheduleTime := chore.NextDueDate.Add(time.Hour * time.Duration(hours)) @@ -145,9 +126,9 @@ func generateOverdueNotifications(chore *chModel.Chore, users []*cModel.UserCirc ScheduledFor: scheduleTime, CreatedAt: time.Now().UTC(), TypeID: user.NotificationType, - UserID: user.ID, + UserID: user.UserID, TargetID: fmt.Sprint(user.TargetID), - Text: fmt.Sprintf("🚨 *%s* is now %d hours overdue. Please complete it as soon as possible. (Assigned to %s)", chore.Name, hours, assignee.DisplayName), + Text: fmt.Sprintf("🚨 *%s* is now %d hours overdue. Please complete it as soon as possible. (Assigned to %s)", chore.Name, hours, user.DisplayName), } if notification.IsValid() { notifications = append(notifications, notification)