Skip to content

Commit

Permalink
Send reminders to only active users (#143)
Browse files Browse the repository at this point in the history
* NonActive definition + tests

* fixing tests (from yesterday)

* Send reminders to only active users

---------

Co-authored-by: Maksym Bilan <>
  • Loading branch information
maximbilan authored Dec 31, 2024
1 parent 8ad6039 commit 9698a25
Show file tree
Hide file tree
Showing 6 changed files with 49 additions and 11 deletions.
13 changes: 12 additions & 1 deletion internal/database/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,22 @@ type UserStorage interface {
ForEachUser(ctx *context.Context, callback func([]User) error) error
}

// returns true if the user is active (User.timestamp less than 7 days)
// returns true if the user is active
// `active` means `timestamp` > 7 days ex. if the user has been active in the last 7 days
func (u User) IsActive() bool {
if u.Timestamp == nil {
return false
}
sevenDaysAgo := time.Now().AddDate(0, 0, -7)
return u.Timestamp.After(sevenDaysAgo)
}

// returns true if the user is inactive
// `inactive` means `timestamp` < 14 days ex. if the user has not been active in the last 14 days
func (u User) IsNonActive() bool {
if u.Timestamp == nil {
return true
}
fourteenDaysAgo := time.Now().AddDate(0, 0, -14)
return u.Timestamp.Before(fourteenDaysAgo)
}
18 changes: 18 additions & 0 deletions internal/database/user_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,21 @@ func TestIsActive(t *testing.T) {
t.Error("Expected user to be inactive, got active")
}
}

func TestIsNonActive(t *testing.T) {
sevenDaysAgo := time.Now().AddDate(0, 0, -7)

user := User{
Timestamp: &sevenDaysAgo,
}
if user.IsNonActive() {
t.Error("Expected user to be active, got inactive")
}

oneMonthAgo := time.Now().AddDate(0, 0, -30)
user.Timestamp = &oneMonthAgo

if !user.IsNonActive() {
t.Error("Expected user to be inactive, got active")
}
}
8 changes: 8 additions & 0 deletions internal/scheduler/messaging.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,14 @@ func prepareMessage(user *database.User, ctx *context.Context, offset int, messa
return
}
localizedMessage = prepareAdminStats(ctx, userLocale, adminStorage, feedbackStorage)
} else if messageType == taskservice.Feedback || messageType == taskservice.Morning || messageType == taskservice.Evening {
// Send only to active users
if user.IsNonActive() {
return
}

msg := translator.Translate(userLocale, message)
localizedMessage = &msg
} else {
msg := translator.Translate(userLocale, message)
localizedMessage = &msg
Expand Down
4 changes: 2 additions & 2 deletions internal/scheduler/parsing.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@ func parse(url *url.URL) (*string, int) {
return &typeStr, offset
}

func getTextMessage(messageType taskservice.MessageType) *string {
func getTextMessage(messageType taskservice.MessageType, weekday time.Weekday) *string {
var message string
switch messageType {
case taskservice.Morning, taskservice.Evening:
message = taskservice.GetMessage(messageType, time.Now().Weekday())
message = taskservice.GetMessage(messageType, weekday)
case taskservice.Feedback:
message = "ask_write_review_about_bot"
case taskservice.WeeklyAnalysis, taskservice.UserStats, taskservice.AdminStats:
Expand Down
15 changes: 8 additions & 7 deletions internal/scheduler/parsing_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package scheduler
import (
"net/url"
"testing"
"time"

"github.com/capymind/internal/taskservice"
)
Expand Down Expand Up @@ -70,37 +71,37 @@ func TestParse(t *testing.T) {
}

func TestGetTextMessage(t *testing.T) {
message := getTextMessage(taskservice.Morning)
message := getTextMessage(taskservice.Morning, time.Monday)
if *message != "how_are_you_morning_monday" {
t.Errorf("Expected how_are_you_morning_monday, got %s", *message)
}

message = getTextMessage(taskservice.Evening)
message = getTextMessage(taskservice.Evening, time.Monday)
if *message != "how_are_you_evening_monday" {
t.Errorf("Expected how_are_you_evening_monday, got %s", *message)
}

message = getTextMessage(taskservice.Feedback)
message = getTextMessage(taskservice.Feedback, time.Monday)
if *message != "ask_write_review_about_bot" {
t.Errorf("Expected ask_write_review_about_bot, got %s", *message)
}

message = getTextMessage(taskservice.WeeklyAnalysis)
message = getTextMessage(taskservice.WeeklyAnalysis, time.Monday)
if *message != "" {
t.Errorf("Expected empty string, got %s", *message)
}

message = getTextMessage(taskservice.UserStats)
message = getTextMessage(taskservice.UserStats, time.Monday)
if *message != "" {
t.Errorf("Expected empty string, got %s", *message)
}

message = getTextMessage(taskservice.AdminStats)
message = getTextMessage(taskservice.AdminStats, time.Monday)
if *message != "" {
t.Errorf("Expected empty string, got %s", *message)
}

message = getTextMessage("")
message = getTextMessage("", time.Monday)
if message != nil {
t.Errorf("Expected nil, got %s", *message)
}
Expand Down
2 changes: 1 addition & 1 deletion internal/scheduler/scheduler.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ func Schedule(w http.ResponseWriter, r *http.Request) {
// Get the message type
messageType := taskservice.MessageType(*typeStr)
// Get the message
message := getTextMessage(messageType)
message := getTextMessage(messageType, time.Now().Weekday())
if message == nil {
log.Println("Missing message type parameter")
return
Expand Down

0 comments on commit 9698a25

Please sign in to comment.