fix(storage): drop legacy organizations foreign key from teams table and ensure team creation always succeeds
MindSift CI & Docker Release / Build, Test in Container & Push (push) Successful in 38s
MindSift CI & Docker Release / Build, Test in Container & Push (push) Successful in 38s
This commit is contained in:
1 parent
b3e3fa27c4
commit
b59bd3a265
1 file changed
+41
-3
@@ -1,6 +1,7 @@
|
|||||||
package storage
|
package storage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
@@ -168,11 +169,10 @@ func (s *Store) migrate() error {
|
|||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS teams (
|
CREATE TABLE IF NOT EXISTS teams (
|
||||||
id TEXT PRIMARY KEY,
|
id TEXT PRIMARY KEY,
|
||||||
org_id TEXT NOT NULL,
|
org_id TEXT NOT NULL DEFAULT 'default',
|
||||||
name TEXT NOT NULL,
|
name TEXT NOT NULL,
|
||||||
description TEXT NOT NULL DEFAULT '',
|
description TEXT NOT NULL DEFAULT '',
|
||||||
created_at TEXT NOT NULL,
|
created_at TEXT NOT NULL
|
||||||
FOREIGN KEY(org_id) REFERENCES organizations(id) ON DELETE CASCADE
|
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS team_members (
|
CREATE TABLE IF NOT EXISTS team_members (
|
||||||
@@ -349,6 +349,32 @@ func (s *Store) migrate() error {
|
|||||||
('smtp_from', ''),
|
('smtp_from', ''),
|
||||||
('smtp_tls', 'true')`)
|
('smtp_tls', 'true')`)
|
||||||
|
|
||||||
|
// Migrate existing teams table if it still has a legacy FOREIGN KEY to organizations
|
||||||
|
var teamsTableSQL string
|
||||||
|
_ = s.db.QueryRow(`SELECT sql FROM sqlite_master WHERE type='table' AND name='teams'`).Scan(&teamsTableSQL)
|
||||||
|
if strings.Contains(strings.ToUpper(teamsTableSQL), "ORGANIZATIONS") {
|
||||||
|
if conn, err := s.db.Conn(context.Background()); err == nil {
|
||||||
|
_, _ = conn.ExecContext(context.Background(), `PRAGMA foreign_keys = OFF;`)
|
||||||
|
_, _ = conn.ExecContext(context.Background(), `
|
||||||
|
BEGIN TRANSACTION;
|
||||||
|
CREATE TABLE IF NOT EXISTS teams_migrated (
|
||||||
|
id TEXT PRIMARY KEY,
|
||||||
|
org_id TEXT NOT NULL DEFAULT 'default',
|
||||||
|
name TEXT NOT NULL,
|
||||||
|
description TEXT NOT NULL DEFAULT '',
|
||||||
|
created_at TEXT NOT NULL
|
||||||
|
);
|
||||||
|
INSERT OR IGNORE INTO teams_migrated (id, org_id, name, description, created_at)
|
||||||
|
SELECT id, COALESCE(NULLIF(org_id, ''), 'default'), name, COALESCE(description, ''), created_at FROM teams;
|
||||||
|
DROP TABLE teams;
|
||||||
|
ALTER TABLE teams_migrated RENAME TO teams;
|
||||||
|
COMMIT;
|
||||||
|
`)
|
||||||
|
_, _ = conn.ExecContext(context.Background(), `PRAGMA foreign_keys = ON;`)
|
||||||
|
_ = conn.Close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Reindex block tags if table is newly added or empty
|
// Reindex block tags if table is newly added or empty
|
||||||
var tagCount int
|
var tagCount int
|
||||||
_ = s.db.QueryRow(`SELECT COUNT(*) FROM doc_block_tags`).Scan(&tagCount)
|
_ = s.db.QueryRow(`SELECT COUNT(*) FROM doc_block_tags`).Scan(&tagCount)
|
||||||
@@ -3007,6 +3033,18 @@ func (s *Store) CreateTeam(orgID, name, description string) (*domain.Team, error
|
|||||||
`INSERT INTO teams (id, org_id, name, description, created_at) VALUES (?, ?, ?, ?, ?)`,
|
`INSERT INTO teams (id, org_id, name, description, created_at) VALUES (?, ?, ?, ?, ?)`,
|
||||||
team.ID, team.OrgID, team.Name, team.Description, team.CreatedAt,
|
team.ID, team.OrgID, team.Name, team.Description, team.CreatedAt,
|
||||||
)
|
)
|
||||||
|
if err != nil && strings.Contains(strings.ToUpper(err.Error()), "FOREIGN KEY") {
|
||||||
|
if conn, connErr := s.db.Conn(context.Background()); connErr == nil {
|
||||||
|
_, _ = conn.ExecContext(context.Background(), `PRAGMA foreign_keys = OFF;`)
|
||||||
|
_, err = conn.ExecContext(
|
||||||
|
context.Background(),
|
||||||
|
`INSERT INTO teams (id, org_id, name, description, created_at) VALUES (?, ?, ?, ?, ?)`,
|
||||||
|
team.ID, team.OrgID, team.Name, team.Description, team.CreatedAt,
|
||||||
|
)
|
||||||
|
_, _ = conn.ExecContext(context.Background(), `PRAGMA foreign_keys = ON;`)
|
||||||
|
_ = conn.Close()
|
||||||
|
}
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user