feat: migrate lists to projects in db identifiers

This commit is contained in:
kolaente 2022-11-13 17:32:40 +01:00
parent 6e36332361
commit da7ef8a38c
Signed by: konrad
GPG Key ID: F40E70337AB24C9B
1 changed files with 432 additions and 0 deletions

View File

@ -0,0 +1,432 @@
// Vikunja is a to-do list application to facilitate your life.
// Copyright 2018-2021 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 migration
import (
"src.techknowlogick.com/xormigrate"
"xorm.io/xorm"
"xorm.io/xorm/schemas"
)
const sqliteRename20221113170740 = `
-- buckets
create table buckets_dg_tmp
(
id INTEGER not null
primary key autoincrement,
title TEXT not null,
project_id INTEGER not null,
"limit" INTEGER default 0,
is_done_bucket INTEGER,
position REAL,
created DATETIME not null,
updated DATETIME not null,
created_by_id INTEGER not null
);
insert into buckets_dg_tmp(id, title, project_id, "limit", is_done_bucket, position, created, updated, created_by_id)
select id,
title,
list_id,
"limit",
is_done_bucket,
position,
created,
updated,
created_by_id
from buckets;
drop table buckets;
alter table buckets_dg_tmp
rename to buckets;
create unique index UQE_buckets_id
on buckets (id);
-- link shares
create table link_shares_dg_tmp
(
id INTEGER not null
primary key autoincrement,
hash TEXT not null,
name TEXT,
project_id INTEGER not null,
"right" INTEGER default 0 not null,
sharing_type INTEGER default 0 not null,
password TEXT,
shared_by_id INTEGER not null,
created DATETIME not null,
updated DATETIME not null
);
insert into link_shares_dg_tmp(id, hash, name, project_id, "right", sharing_type, password, shared_by_id, created,
updated)
select id,
hash,
name,
list_id,
"right",
sharing_type,
password,
shared_by_id,
created,
updated
from link_shares;
drop table link_shares;
alter table link_shares_dg_tmp
rename to link_shares;
create index IDX_link_shares_right
on link_shares ("right");
create index IDX_link_shares_shared_by_id
on link_shares (shared_by_id);
create index IDX_link_shares_sharing_type
on link_shares (sharing_type);
create unique index UQE_link_shares_hash
on link_shares (hash);
create unique index UQE_link_shares_id
on link_shares (id);
-- tasks
create table tasks_dg_tmp
(
id INTEGER not null
primary key autoincrement,
title TEXT not null,
description TEXT,
done INTEGER,
done_at DATETIME,
due_date DATETIME,
project_id INTEGER not null,
repeat_after INTEGER,
repeat_mode INTEGER default 0 not null,
priority INTEGER,
start_date DATETIME,
end_date DATETIME,
hex_color TEXT,
percent_done REAL,
"index" INTEGER default 0 not null,
uid TEXT,
cover_image_attachment_id INTEGER default 0,
created DATETIME not null,
updated DATETIME not null,
bucket_id INTEGER,
position REAL,
kanban_position REAL,
created_by_id INTEGER not null
);
insert into tasks_dg_tmp(id, title, description, done, done_at, due_date, project_id, repeat_after, repeat_mode,
priority, start_date, end_date, hex_color, percent_done, "index", uid,
cover_image_attachment_id, created, updated, bucket_id, position, kanban_position,
created_by_id)
select id,
title,
description,
done,
done_at,
due_date,
list_id,
repeat_after,
repeat_mode,
priority,
start_date,
end_date,
hex_color,
percent_done,
"index",
uid,
cover_image_attachment_id,
created,
updated,
bucket_id,
position,
kanban_position,
created_by_id
from tasks;
drop table tasks;
alter table tasks_dg_tmp
rename to tasks;
create index IDX_tasks_done
on tasks (done);
create index IDX_tasks_done_at
on tasks (done_at);
create index IDX_tasks_due_date
on tasks (due_date);
create index IDX_tasks_end_date
on tasks (end_date);
create index IDX_tasks_list_id
on tasks (project_id);
create index IDX_tasks_repeat_after
on tasks (repeat_after);
create index IDX_tasks_start_date
on tasks (start_date);
create unique index UQE_tasks_id
on tasks (id);
--- team_lists
create table team_lists_dg_tmp
(
id INTEGER not null
primary key autoincrement,
team_id INTEGER not null,
project_id INTEGER not null,
"right" INTEGER default 0 not null,
created DATETIME not null,
updated DATETIME not null
);
insert into team_lists_dg_tmp(id, team_id, project_id, "right", created, updated)
select id, team_id, list_id, "right", created, updated
from team_lists;
drop table team_lists;
alter table team_lists_dg_tmp
rename to team_lists;
create index IDX_team_lists_list_id
on team_lists (project_id);
create index IDX_team_lists_right
on team_lists ("right");
create index IDX_team_lists_team_id
on team_lists (team_id);
create unique index UQE_team_lists_id
on team_lists (id);
--- users
create table users_dg_tmp
(
id INTEGER not null
primary key autoincrement,
name TEXT,
username TEXT not null,
password TEXT,
email TEXT,
status INTEGER default 0,
avatar_provider TEXT,
avatar_file_id INTEGER,
issuer TEXT,
subject TEXT,
email_reminders_enabled INTEGER default 1,
discoverable_by_name INTEGER default 0,
discoverable_by_email INTEGER default 0,
overdue_tasks_reminders_enabled INTEGER default 1,
overdue_tasks_reminders_time TEXT default '09:00' not null,
default_project_id INTEGER,
week_start INTEGER,
language TEXT,
timezone TEXT,
deletion_scheduled_at DATETIME,
deletion_last_reminder_sent DATETIME,
export_file_id INTEGER,
created DATETIME not null,
updated DATETIME not null
);
insert into users_dg_tmp(id, name, username, password, email, status, avatar_provider, avatar_file_id, issuer, subject,
email_reminders_enabled, discoverable_by_name, discoverable_by_email,
overdue_tasks_reminders_enabled, overdue_tasks_reminders_time, default_project_id, week_start,
language, timezone, deletion_scheduled_at, deletion_last_reminder_sent, export_file_id,
created, updated)
select id,
name,
username,
password,
email,
status,
avatar_provider,
avatar_file_id,
issuer,
subject,
email_reminders_enabled,
discoverable_by_name,
discoverable_by_email,
overdue_tasks_reminders_enabled,
overdue_tasks_reminders_time,
default_list_id,
week_start,
language,
timezone,
deletion_scheduled_at,
deletion_last_reminder_sent,
export_file_id,
created,
updated
from users;
drop table users;
alter table users_dg_tmp
rename to users;
create index IDX_users_default_list_id
on users (default_project_id);
create index IDX_users_discoverable_by_email
on users (discoverable_by_email);
create index IDX_users_discoverable_by_name
on users (discoverable_by_name);
create index IDX_users_overdue_tasks_reminders_enabled
on users (overdue_tasks_reminders_enabled);
create unique index UQE_users_id
on users (id);
create unique index UQE_users_username
on users (username);
--- users_list
create table users_lists_dg_tmp
(
id INTEGER not null
primary key autoincrement,
user_id INTEGER not null,
project_id INTEGER not null,
"right" INTEGER default 0 not null,
created DATETIME not null,
updated DATETIME not null
);
insert into users_lists_dg_tmp(id, user_id, project_id, "right", created, updated)
select id, user_id, list_id, "right", created, updated
from users_lists;
drop table users_lists;
alter table users_lists_dg_tmp
rename to users_lists;
create index IDX_users_lists_list_id
on users_lists (project_id);
create index IDX_users_lists_right
on users_lists ("right");
create index IDX_users_lists_user_id
on users_lists (user_id);
create unique index UQE_users_lists_id
on users_lists (id);
`
type colToRename struct {
table string
oldName string
newName string
}
func init() {
migrations = append(migrations, &xormigrate.Migration{
ID: "20221113170740",
Description: "Rename lists to projects",
Migrate: func(tx *xorm.Engine) error {
// SQLite does not support renaming columns. Instead, we'll need to run manual sql.
if tx.Dialect().URI().DBType == schemas.SQLITE {
_, err := tx.Exec(sqliteRename20221113170740)
if err != nil {
return err
}
} else {
colsToRename := []*colToRename{
{
table: "buckets",
oldName: "list_id",
newName: "project_id",
},
{
table: "link_shares",
oldName: "list_id",
newName: "project_id",
},
{
table: "tasks",
oldName: "list_id",
newName: "project_id",
},
{
table: "team_lists",
oldName: "list_id",
newName: "project_id",
},
{
table: "users",
oldName: "default_list_id",
newName: "default_project_id",
},
{
table: "users_list",
oldName: "list_id",
newName: "project_id",
},
}
for _, col := range colsToRename {
if tx.Dialect().URI().DBType == schemas.POSTGRES || tx.Dialect().URI().DBType == schemas.MYSQL {
_, err := tx.Exec("ALTER TABLE `" + col.table + "` RENAME COLUMN `" + col.oldName + "` TO `" + col.newName + "`")
if err != nil {
return err
}
}
}
}
err := renameTable(tx, "lists", "projects")
if err != nil {
return err
}
err = renameTable(tx, "team_lists", "team_projects")
if err != nil {
return err
}
err = renameTable(tx, "users_lists", "users_projects")
if err != nil {
return err
}
return nil
},
Rollback: func(tx *xorm.Engine) error {
return nil
},
})
}