package boxstore import ( "time" "warpbox/lib/models" ) const OneTimeDownloadRetentionKey = "one-time" var oneTimeDownloadExpiry int64 var retentionOptions = []models.RetentionOption{ {Key: "10s", Label: "10 seconds", Seconds: 10}, {Key: "10m", Label: "10 minutes", Seconds: 10 * 60}, {Key: "1h", Label: "1 hour", Seconds: 60 * 60}, {Key: "12h", Label: "12 hours", Seconds: 12 * 60 * 60}, {Key: "24h", Label: "24 hours", Seconds: 24 * 60 * 60}, {Key: "48h", Label: "48 hours", Seconds: 48 * 60 * 60}, {Key: OneTimeDownloadRetentionKey, Label: "One time download", Seconds: 0}, } func RetentionOptions() []models.RetentionOption { options := make([]models.RetentionOption, len(retentionOptions)) copy(options, retentionOptions) return options } func DefaultRetentionOption() models.RetentionOption { return retentionOptions[0] } func SetOneTimeDownloadExpiry(seconds int64) { oneTimeDownloadExpiry = seconds } func OneTimeDownloadExpiry() int64 { return oneTimeDownloadExpiry } func normalizeRetentionOption(key string) models.RetentionOption { for _, option := range retentionOptions { if option.Key == key { return option } } return DefaultRetentionOption() } func startRetentionIfTerminalUnlocked(manifest *models.BoxManifest) { if !manifest.ExpiresAt.IsZero() || len(manifest.Files) == 0 { return } seconds := manifest.RetentionSecs if manifest.OneTimeDownload { seconds = oneTimeDownloadExpiry } else if seconds <= 0 { seconds = normalizeRetentionOption(manifest.RetentionKey).Seconds } if seconds <= 0 { return } for _, file := range manifest.Files { if file.Status != models.FileStatusReady && file.Status != models.FileStatusFailed { return } } // Retention starts after uploads settle so slow or very large uploads do // not expire before users get a real chance to open the box. manifest.ExpiresAt = time.Now().UTC().Add(time.Duration(seconds) * time.Second) }