
Whenever a task is part of a date filter, it might fall in or out of a filter bucket without anything changing, other than the current time. For example, a filter condition like due_date > now may include different tasks depending on the current time. For these kinds of tasks to properly show up in the kanban view of a filter, there has to be an entry in the task_buckets table. These entries only got updated when either a task was updated or the filter itself was updated. To account for th changing of time, we also need to check periodically if tasks are now part or not anymore part of that filter. This change adds a cron task to do precisely that. We'll have to see if this works resource-wise, but the cron is not the only one doing a bunch of sql queries so it might be fine after all. Resolves https://community.vikunja.io/t/tasks-in-saved-filter-appear-in-list-view-but-are-not-visible-in-kanban-view/2800 (cherry picked from commit bc52da4029170bfd10cddea28cf5c6983969cb42)
119 lines
2.9 KiB
Go
119 lines
2.9 KiB
Go
// Vikunja is a to-do list application to facilitate your life.
|
|
// Copyright 2018-present Vikunja and contributors. All rights reserved.
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Affero General Public Licensee as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU Affero General Public Licensee for more details.
|
|
//
|
|
// You should have received a copy of the GNU Affero General Public Licensee
|
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
package initialize
|
|
|
|
import (
|
|
"time"
|
|
|
|
"code.vikunja.io/api/pkg/config"
|
|
"code.vikunja.io/api/pkg/cron"
|
|
"code.vikunja.io/api/pkg/events"
|
|
"code.vikunja.io/api/pkg/files"
|
|
"code.vikunja.io/api/pkg/log"
|
|
"code.vikunja.io/api/pkg/mail"
|
|
"code.vikunja.io/api/pkg/migration"
|
|
"code.vikunja.io/api/pkg/models"
|
|
"code.vikunja.io/api/pkg/modules/auth/openid"
|
|
"code.vikunja.io/api/pkg/modules/keyvalue"
|
|
migrationHandler "code.vikunja.io/api/pkg/modules/migration/handler"
|
|
"code.vikunja.io/api/pkg/red"
|
|
"code.vikunja.io/api/pkg/user"
|
|
)
|
|
|
|
// LightInit will only fullInit config, redis, logger but no db connection.
|
|
func LightInit() {
|
|
// Set logger
|
|
log.InitLogger()
|
|
|
|
// Init the config
|
|
config.InitConfig()
|
|
|
|
// Init redis
|
|
red.InitRedis()
|
|
|
|
// Init keyvalue store
|
|
keyvalue.InitStorage()
|
|
}
|
|
|
|
// InitEngines intializes all db connections
|
|
func InitEngines() {
|
|
err := models.SetEngine()
|
|
if err != nil {
|
|
log.Fatal(err.Error())
|
|
}
|
|
err = files.SetEngine()
|
|
if err != nil {
|
|
log.Fatal(err.Error())
|
|
}
|
|
}
|
|
|
|
// FullInitWithoutAsync does a full init without any async handlers (cron or events)
|
|
func FullInitWithoutAsync() {
|
|
LightInit()
|
|
|
|
// Initialize the files handler
|
|
files.InitFileHandler()
|
|
|
|
// Run the migrations
|
|
migration.Migrate(nil)
|
|
|
|
// Set Engine
|
|
InitEngines()
|
|
|
|
// Init Typesense
|
|
models.InitTypesense()
|
|
|
|
// Start the mail daemon
|
|
mail.StartMailDaemon()
|
|
}
|
|
|
|
// FullInit initializes all kinds of things in the right order
|
|
func FullInit() {
|
|
|
|
FullInitWithoutAsync()
|
|
|
|
// Start the cron
|
|
cron.Init()
|
|
models.RegisterReminderCron()
|
|
models.RegisterOverdueReminderCron()
|
|
user.RegisterTokenCleanupCron()
|
|
user.RegisterDeletionNotificationCron()
|
|
models.RegisterUserDeletionCron()
|
|
models.RegisterOldExportCleanupCron()
|
|
openid.CleanupSavedOpenIDProviders()
|
|
openid.RegisterEmptyOpenIDTeamCleanupCron()
|
|
models.RegisterAddTaskToFilterViewCron()
|
|
|
|
// Start processing events
|
|
go func() {
|
|
models.RegisterListeners()
|
|
user.RegisterListeners()
|
|
migrationHandler.RegisterListeners()
|
|
err := events.InitEvents()
|
|
if err != nil {
|
|
log.Fatal(err.Error())
|
|
}
|
|
|
|
err = events.Dispatch(&BootedEvent{
|
|
BootedAt: time.Now(),
|
|
})
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}()
|
|
}
|