From 5fe9fc73a9eb482d31274ef9ccc9e2557c1c18fc Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 21 Nov 2023 19:38:06 +0100 Subject: [PATCH] feat(filter): migrate existing saved filters --- pkg/migration/20231121191822.go | 106 ++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 pkg/migration/20231121191822.go diff --git a/pkg/migration/20231121191822.go b/pkg/migration/20231121191822.go new file mode 100644 index 000000000..a0e521eea --- /dev/null +++ b/pkg/migration/20231121191822.go @@ -0,0 +1,106 @@ +// 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 . + +package migration + +import ( + "src.techknowlogick.com/xormigrate" + "strings" + "xorm.io/xorm" +) + +type taskCollectionFilter20231121191822 struct { + SortBy []string `query:"sort_by" json:"sort_by"` + OrderBy []string `query:"order_by" json:"order_by"` + + FilterBy []string `query:"filter_by" json:"filter_by,omitempty"` + FilterValue []string `query:"filter_value" json:"filter_value,omitempty"` + FilterComparator []string `query:"filter_comparator" json:"filter_comparator,omitempty"` + FilterConcat string `query:"filter_concat" json:"filter_concat,omitempty"` + + Filter string `query:"filter" json:"filter"` + FilterIncludeNulls bool `query:"filter_include_nulls" json:"filter_include_nulls"` +} + +type savedFilter20231121191822 struct { + ID int64 `xorm:"autoincr not null unique pk" json:"id" param:"filter"` + Filters *taskCollectionFilter20231121191822 `xorm:"JSON not null" json:"filters" valid:"required"` +} + +func (savedFilter20231121191822) TableName() string { + return "saved_filters" +} + +func init() { + migrations = append(migrations, &xormigrate.Migration{ + ID: "20231121191822", + Description: "Migrate saved filter structure", + Migrate: func(tx *xorm.Engine) (err error) { + allFilters := []*savedFilter20231121191822{} + err = tx.Find(&allFilters) + if err != nil { + return + } + + for _, filter := range allFilters { + var filterStrings []string + for i, f := range filter.Filters.FilterBy { + var comparator string + switch filter.Filters.FilterComparator[i] { + case "equals": + comparator = "=" + case "greater": + comparator = ">" + case "greater_equals": + comparator = ">=" + case "less": + comparator = "<" + case "less_equals": + comparator = "<=" + case "not_equals": + comparator = "!=" + case "like": + comparator = "~" + case "in": + comparator = "?=" + } + filterStrings = append(filterStrings, f+" "+comparator+" "+filter.Filters.FilterValue[i]) + } + + filter.Filters.FilterConcat = " || " + if filter.Filters.FilterConcat == "and" { + filter.Filters.FilterConcat = " && " + } + filter.Filters.Filter = strings.Join(filterStrings, filter.Filters.FilterConcat) + + filter.Filters.FilterBy = nil + filter.Filters.FilterComparator = nil + filter.Filters.FilterValue = nil + filter.Filters.FilterConcat = "" + + _, err = tx.Where("id = ?", filter.ID).Update(filter) + if err != nil { + return + } + } + + return nil + }, + Rollback: func(tx *xorm.Engine) error { + return nil + }, + }) +}