diff --git a/internal/database/user.go b/internal/database/user.go index 404b2c9..e548cd5 100644 --- a/internal/database/user.go +++ b/internal/database/user.go @@ -30,7 +30,8 @@ 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 @@ -38,3 +39,13 @@ func (u User) IsActive() bool { 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) +} diff --git a/internal/database/user_test.go b/internal/database/user_test.go index 1627a87..06c503e 100644 --- a/internal/database/user_test.go +++ b/internal/database/user_test.go @@ -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") + } +} diff --git a/internal/scheduler/messaging.go b/internal/scheduler/messaging.go index a2e515a..f409e9a 100644 --- a/internal/scheduler/messaging.go +++ b/internal/scheduler/messaging.go @@ -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 diff --git a/internal/scheduler/parsing.go b/internal/scheduler/parsing.go index 1d95884..8e9dd34 100644 --- a/internal/scheduler/parsing.go +++ b/internal/scheduler/parsing.go @@ -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: diff --git a/internal/scheduler/parsing_test.go b/internal/scheduler/parsing_test.go index fce3e79..ecc4b29 100644 --- a/internal/scheduler/parsing_test.go +++ b/internal/scheduler/parsing_test.go @@ -3,6 +3,7 @@ package scheduler import ( "net/url" "testing" + "time" "github.com/capymind/internal/taskservice" ) @@ -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) } diff --git a/internal/scheduler/scheduler.go b/internal/scheduler/scheduler.go index c10138f..0a7f19e 100644 --- a/internal/scheduler/scheduler.go +++ b/internal/scheduler/scheduler.go @@ -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