Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 80 additions & 0 deletions db/db_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,86 @@ func TestGetFilterStatusCount(t *testing.T) {
}
}

func TestArchiveInactiveTribes(t *testing.T) {
InitTestDB()
defer CloseTestDB()

now := time.Now()
cutoff := now.AddDate(0, 0, -30).Unix()
oldActive := now.AddDate(0, 0, -45).Unix()
recentActive := now.AddDate(0, 0, -5).Unix()

tribes := []Tribe{
{
UUID: "stale-listed-tribe",
OwnerPubKey: "owner-1",
Name: "stale listed tribe",
LastActive: oldActive,
Unlisted: false,
Deleted: false,
},
{
UUID: "recent-listed-tribe",
OwnerPubKey: "owner-2",
Name: "recent listed tribe",
LastActive: recentActive,
Unlisted: false,
Deleted: false,
},
{
UUID: "legacy-listed-tribe",
OwnerPubKey: "owner-3",
Name: "legacy listed tribe",
LastActive: 0,
Unlisted: false,
Deleted: false,
},
{
UUID: "stale-unlisted-tribe",
OwnerPubKey: "owner-4",
Name: "stale unlisted tribe",
LastActive: oldActive,
Unlisted: true,
Deleted: false,
},
{
UUID: "stale-deleted-tribe",
OwnerPubKey: "owner-5",
Name: "stale deleted tribe",
LastActive: oldActive,
Unlisted: false,
Deleted: true,
},
}
for _, tribe := range tribes {
assert.NoError(t, TestDB.db.Create(&tribe).Error)
}

archived, err := TestDB.ArchiveInactiveTribes(cutoff)
assert.NoError(t, err)
assert.Equal(t, int64(1), archived)

var got []Tribe
assert.NoError(t, TestDB.db.Where("uuid IN ?", []string{
"stale-listed-tribe",
"recent-listed-tribe",
"legacy-listed-tribe",
"stale-unlisted-tribe",
"stale-deleted-tribe",
}).Find(&got).Error)

byUUID := make(map[string]Tribe, len(got))
for _, tribe := range got {
byUUID[tribe.UUID] = tribe
}

assert.True(t, byUUID["stale-listed-tribe"].Unlisted)
assert.False(t, byUUID["recent-listed-tribe"].Unlisted)
assert.False(t, byUUID["legacy-listed-tribe"].Unlisted)
assert.True(t, byUUID["stale-unlisted-tribe"].Unlisted)
assert.False(t, byUUID["stale-deleted-tribe"].Unlisted)
}

func TestCreateConnectionCode(t *testing.T) {

InitTestDB()
Expand Down
20 changes: 20 additions & 0 deletions db/tribe_archive.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package db

import "time"

func (db database) ArchiveInactiveTribes(cutoffUnix int64) (int64, error) {
if cutoffUnix <= 0 {
return 0, nil
}

now := time.Now()
result := db.db.Model(&Tribe{}).
Where("(unlisted = ? OR unlisted IS NULL) AND (deleted = ? OR deleted IS NULL)", false, false).
Where("last_active > 0 AND last_active < ?", cutoffUnix).
Updates(map[string]interface{}{
"unlisted": true,
"updated": &now,
})

return result.RowsAffected, result.Error
}
28 changes: 28 additions & 0 deletions handlers/tribes.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"io"
"log"
"net/http"
"os"
"strconv"
"strings"
"time"
Expand All @@ -25,6 +26,8 @@ type tribeHandler struct {
tribeUniqueNameFromName func(name string) (string, error)
}

const defaultTribeArchiveAfterDays = 30

func NewTribeHandler(db db.Database) *tribeHandler {
return &tribeHandler{
db: db,
Expand Down Expand Up @@ -377,6 +380,31 @@ func (th *tribeHandler) CreateOrEditTribe(w http.ResponseWriter, r *http.Request
json.NewEncoder(w).Encode(tribe)
}

func ArchiveInactiveTribes() {
days := defaultTribeArchiveAfterDays
if envDays := os.Getenv("TRIBE_ARCHIVE_AFTER_DAYS"); envDays != "" {
parsedDays, err := strconv.Atoi(envDays)
if err != nil {
logger.Log.Error("invalid TRIBE_ARCHIVE_AFTER_DAYS: %v", err)
return
}
if parsedDays <= 0 {
return
}
days = parsedDays
}

cutoff := time.Now().AddDate(0, 0, -days).Unix()
count, err := db.DB.ArchiveInactiveTribes(cutoff)
if err != nil {
logger.Log.Error("failed to archive inactive tribes: %v", err)
return
}
if count > 0 {
logger.Log.Info("archived %d inactive tribes", count)
}
}

// PutTribeActivity godoc
//
// @Summary Update tribe activity
Expand Down
1 change: 1 addition & 0 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ func runCron() {
c := cron.New()
c.AddFunc("@every 0h30m0s", handlers.InitV2PaymentsCron)
c.AddFunc("@every 0h0m30s", handlers.ProcessWaitingNotifications)
c.AddFunc("@every 24h0m0s", handlers.ArchiveInactiveTribes)
c.Start()
}

Expand Down
58 changes: 57 additions & 1 deletion mocks/Database.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.