[MM-36472] Fix inconsistencies in Roles columns (#18390)

* Fix inconsistencies in Roles columns

* Add new migrations
Этот коммит содержится в:
Claudio Costa
2021-10-01 15:31:29 +02:00
коммит произвёл GitHub
родитель 305e4793c3
Коммит 177680f08c
19 изменённых файлов: 339 добавлений и 29 удалений

Просмотреть файл

@@ -4,10 +4,14 @@
// mysql/000001_create_teams.up.sql // mysql/000001_create_teams.up.sql
// mysql/000002_create_team_members.down.sql // mysql/000002_create_team_members.down.sql
// mysql/000002_create_team_members.up.sql // mysql/000002_create_team_members.up.sql
// mysql/000003_alter_team_members_roles.down.sql
// mysql/000003_alter_team_members_roles.up.sql
// postgres/000001_create_teams.down.sql // postgres/000001_create_teams.down.sql
// postgres/000001_create_teams.up.sql // postgres/000001_create_teams.up.sql
// postgres/000002_create_team_members.down.sql // postgres/000002_create_team_members.down.sql
// postgres/000002_create_team_members.up.sql // postgres/000002_create_team_members.up.sql
// postgres/000003_alter_team_members_roles.down.sql
// postgres/000003_alter_team_members_roles.up.sql
package migrations package migrations
import ( import (
@@ -164,6 +168,46 @@ func mysql000002_create_team_membersUpSql() (*asset, error) {
return a, nil return a, nil
} }
var _mysql000003_alter_team_members_rolesDownSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x6c\x90\x51\x4b\xf3\x30\x14\x86\xef\xf3\x2b\xde\xef\xaa\xed\x87\x88\x82\x78\x53\x2a\x66\xed\x29\x2b\xb4\xcd\x48\x33\xd4\xab\x91\xcd\x23\x13\x9a\x6d\xa4\x51\xf4\xdf\x8b\x5b\x19\x73\x9a\x8b\x70\xe0\x3c\xef\xc3\xe1\xed\xc8\xe0\x7e\xe7\x79\x67\x3d\x3f\x77\xc1\x06\x76\xbc\x09\xc8\x10\x77\x54\x53\x6e\x50\x95\xb1\x00\x80\xc3\xff\xfd\xc6\x45\xae\xe6\xad\x89\xff\x27\x28\xb5\x6a\x50\xb5\xa5\xd2\x8d\x34\x95\x6a\x17\x5d\x3e\xa5\x46\x5e\xe6\xaa\x9e\x37\x6d\x77\xcc\x3d\x4c\x49\x13\x82\x5d\xf6\xbc\xd8\x58\xc7\xc8\x10\x19\xb6\xae\x61\xb7\x64\x3f\x44\x47\x50\xb6\xc5\x88\x0d\xab\x35\x3b\x8b\x0c\x85\x34\x72\x22\x3b\x8a\x93\x1f\xd4\x6a\xdb\xbf\xb9\xcd\xd1\xa6\xb7\x3d\x9f\x79\x46\x22\x7c\xee\x18\xff\x32\x44\xef\xd6\xaf\xd6\xd6\xc7\xb7\x37\xc9\x01\x4c\x70\x87\xab\x8b\xfd\x18\xc9\xda\x90\x86\x91\x93\x9a\x70\x72\x19\x1a\x55\x54\xe5\x13\xf6\x7a\x9c\x18\xd2\x68\x0c\x8e\x95\x5c\x47\x22\x49\x52\x21\x66\x9a\x66\x52\x13\x6c\x1f\xd8\x57\x2f\xf4\xf1\x3a\x84\xe1\xd0\xd3\xef\xae\x53\x41\x8f\x94\xcf\xcd\x19\x9e\x8a\x82\x64\x5d\xab\x5c\x1a\xc2\x9f\xc2\x54\x7c\x05\x00\x00\xff\xff\xfa\xc1\xc8\x90\xbd\x01\x00\x00")
func mysql000003_alter_team_members_rolesDownSqlBytes() ([]byte, error) {
return bindataRead(
_mysql000003_alter_team_members_rolesDownSql,
"mysql/000003_alter_team_members_roles.down.sql",
)
}
func mysql000003_alter_team_members_rolesDownSql() (*asset, error) {
bytes, err := mysql000003_alter_team_members_rolesDownSqlBytes()
if err != nil {
return nil, err
}
info := bindataFileInfo{name: "mysql/000003_alter_team_members_roles.down.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
var _mysql000003_alter_team_members_rolesUpSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x6c\x90\x51\x4b\xc3\x30\x14\x85\xdf\xf3\x2b\x8e\x4f\x6d\x45\x44\x9f\x4b\xc5\xac\xbd\x65\x85\xb6\x19\x49\x86\xfa\x34\xb2\x79\x45\xa1\xd9\x46\x1b\x61\xfe\x7b\xd9\x56\x8a\x4e\xf3\x10\x2e\xdc\xef\x7c\x5c\x8e\x21\x8b\xc7\x7d\xcf\x7b\xd7\xf3\xab\x09\x2e\xb0\xe7\x6d\x40\x86\xd8\x50\x4d\xb9\x45\x55\xc6\x02\x00\xce\xff\xf1\x8d\x8b\x5c\x2d\x5b\x1b\x5f\x27\x28\xb5\x6a\x50\xb5\xa5\xd2\x8d\xb4\x95\x6a\x57\x26\x9f\x53\x23\x6f\x73\x55\x2f\x9b\xd6\x4c\xb9\xa7\x39\x69\x42\x70\xeb\x8e\x57\x5b\xe7\x19\x19\x22\xcb\xce\x37\xec\xd7\xdc\x0f\xd1\x04\xca\xb6\x18\xb1\x61\xf3\xce\xde\x21\x43\x21\xad\x9c\x49\x43\x71\xf2\x8b\xda\xec\xba\x4f\xbf\x9d\x6c\x7a\xd7\xf1\x85\x67\x24\xc2\xd7\x9e\x71\x95\x21\x0a\x7c\x08\x67\x22\xc1\x03\xee\x6e\x4e\x63\x24\x6b\x4b\x1a\x56\xce\x6a\xc2\x8f\x93\xd0\xa8\xa2\x2a\x5f\x70\xf2\xe2\x18\x4d\xa3\x31\x31\x96\x70\x1f\x89\x24\x49\x85\x58\x68\x5a\x48\x4d\x70\x5d\xe0\xbe\x7a\xa3\xc3\xc7\x10\x86\x73\x33\x7f\xdb\x4d\x05\x3d\x53\xbe\xb4\x17\x78\x2a\x0a\x92\x75\xad\x72\x69\x09\xff\x0a\x53\xf1\x1d\x00\x00\xff\xff\xea\x54\xe5\x8d\xaf\x01\x00\x00")
func mysql000003_alter_team_members_rolesUpSqlBytes() ([]byte, error) {
return bindataRead(
_mysql000003_alter_team_members_rolesUpSql,
"mysql/000003_alter_team_members_roles.up.sql",
)
}
func mysql000003_alter_team_members_rolesUpSql() (*asset, error) {
bytes, err := mysql000003_alter_team_members_rolesUpSqlBytes()
if err != nil {
return nil, err
}
info := bindataFileInfo{name: "mysql/000003_alter_team_members_roles.up.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
var _postgres000001_create_teamsDownSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\xd0\xb1\x0e\xc2\x20\x10\x06\xe0\x9d\xa7\xe0\x3d\x98\xaa\xc5\xa4\x49\x6d\x4d\x5b\x93\x6e\x84\xc0\x45\x2f\xa1\x40\x80\xaa\x8f\x6f\x2c\x83\x6e\xc5\xf9\xbe\xff\x72\xff\x55\xed\xc4\x07\x3a\x55\x87\x96\xd3\x04\x72\x89\xb4\x1e\xfa\x0b\x3d\xf6\xed\xf5\xdc\xd1\xe6\x44\xf9\xdc\x8c\xd3\x48\xa5\x31\xee\xe9\x3c\x58\xb4\x0f\x4c\xc0\x48\x69\xd0\xc8\x98\x3e\x73\x54\xce\xae\x5e\xcb\x7f\xb2\x1a\xa2\x0a\xe8\x13\x3a\x5b\x1e\xba\x05\xb7\x7a\xe5\x6c\x4c\x41\xa2\x05\xcd\x08\xd9\x60\xd3\xd5\x7c\xfe\x71\xa8\x5f\x62\xdb\x23\x72\x25\x81\x9a\xed\xc9\x5c\x40\xc8\xb4\x2b\x55\x80\x42\xa9\xc1\x40\x99\x8c\xea\x0e\x4b\xbe\x33\xd3\xfc\x8c\x2f\xdd\x18\x23\xef\x00\x00\x00\xff\xff\x38\xaf\xff\x77\xd4\x01\x00\x00") var _postgres000001_create_teamsDownSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\xd0\xb1\x0e\xc2\x20\x10\x06\xe0\x9d\xa7\xe0\x3d\x98\xaa\xc5\xa4\x49\x6d\x4d\x5b\x93\x6e\x84\xc0\x45\x2f\xa1\x40\x80\xaa\x8f\x6f\x2c\x83\x6e\xc5\xf9\xbe\xff\x72\xff\x55\xed\xc4\x07\x3a\x55\x87\x96\xd3\x04\x72\x89\xb4\x1e\xfa\x0b\x3d\xf6\xed\xf5\xdc\xd1\xe6\x44\xf9\xdc\x8c\xd3\x48\xa5\x31\xee\xe9\x3c\x58\xb4\x0f\x4c\xc0\x48\x69\xd0\xc8\x98\x3e\x73\x54\xce\xae\x5e\xcb\x7f\xb2\x1a\xa2\x0a\xe8\x13\x3a\x5b\x1e\xba\x05\xb7\x7a\xe5\x6c\x4c\x41\xa2\x05\xcd\x08\xd9\x60\xd3\xd5\x7c\xfe\x71\xa8\x5f\x62\xdb\x23\x72\x25\x81\x9a\xed\xc9\x5c\x40\xc8\xb4\x2b\x55\x80\x42\xa9\xc1\x40\x99\x8c\xea\x0e\x4b\xbe\x33\xd3\xfc\x8c\x2f\xdd\x18\x23\xef\x00\x00\x00\xff\xff\x38\xaf\xff\x77\xd4\x01\x00\x00")
func postgres000001_create_teamsDownSqlBytes() ([]byte, error) { func postgres000001_create_teamsDownSqlBytes() ([]byte, error) {
@@ -244,6 +288,46 @@ func postgres000002_create_team_membersUpSql() (*asset, error) {
return a, nil return a, nil
} }
var _postgres000003_alter_team_members_rolesDownSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x92\xcf\x8b\xea\x30\x10\xc7\xef\xfd\x2b\xe6\x81\xa0\xbe\xc3\xe3\x1d\xc4\xc3\xab\x15\xd4\xc6\x67\xa1\xb6\x4b\x37\xcb\xb2\xa7\x30\xb6\x53\x0d\xe4\xc7\x92\xc6\x45\xff\xfb\xa5\xd1\x75\x3d\xc9\x9e\x06\x32\x9f\xf9\xf2\xc9\x24\x69\x09\x83\x41\x34\x9b\x69\xdb\xc8\xf6\x2c\x6a\xab\x8e\xda\x08\x7f\x7e\x27\x21\xdb\x6b\xed\x44\x23\xdb\x96\x1c\x19\x3f\x9f\x47\x29\x5b\xe5\x8b\x8a\x45\x00\x00\xb5\x55\x82\x4e\xb2\xf3\x02\x4d\x73\xa1\x6f\x28\xec\xac\x55\x84\x06\xfe\x25\xd0\xa2\xea\x28\x8e\x96\xec\x7f\x56\x84\xc1\x67\x96\xb3\x15\x87\xda\x1e\x8d\x1f\xfd\x1e\xc3\xaf\x04\xfe\x42\x56\xf0\xf2\x61\x64\x18\x5d\x57\xe5\x16\xa4\x69\xad\xd3\xe8\xa5\x35\xa2\xab\x0f\xa4\xf1\xcf\x45\xbd\x0b\xcc\xeb\x86\x55\x0c\x3c\xee\x14\x09\x83\x9a\x20\x81\xa1\x27\xd4\x9a\xf4\x8e\x5c\x37\x0c\xd0\xa2\x48\xe1\x7a\xdf\x2f\xc6\x59\x45\x77\xdd\x06\x3d\x06\x85\xbe\x57\x1f\xd0\x61\xed\xc9\xc1\x07\xba\xb3\x34\xfb\x6f\xae\x28\x39\xdc\xda\x42\xe3\x49\xea\xa3\x16\x8a\xcc\xde\x1f\x20\x81\xe9\x24\x8e\x02\x9b\xad\x1f\x6f\x8c\x6f\xd8\x65\x3d\x21\x38\xe7\xac\x02\xbe\x58\xe6\x0c\xee\xdc\xaf\xe7\xab\x32\x7f\xd9\x16\x10\x84\x81\xbf\x3d\xb1\xde\xaa\x77\x18\x4d\x27\xe3\x38\x84\xb0\x22\x85\x6c\x1d\x47\x7d\xfd\xe1\xf3\xf6\x7f\xe1\x33\x00\x00\xff\xff\xa2\x05\x42\xa3\x12\x02\x00\x00")
func postgres000003_alter_team_members_rolesDownSqlBytes() ([]byte, error) {
return bindataRead(
_postgres000003_alter_team_members_rolesDownSql,
"postgres/000003_alter_team_members_roles.down.sql",
)
}
func postgres000003_alter_team_members_rolesDownSql() (*asset, error) {
bytes, err := postgres000003_alter_team_members_rolesDownSqlBytes()
if err != nil {
return nil, err
}
info := bindataFileInfo{name: "postgres/000003_alter_team_members_roles.down.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
var _postgres000003_alter_team_members_rolesUpSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x92\x4f\x6b\xf2\x40\x10\x87\xef\xf9\x14\xf3\x82\xa0\xbe\x87\x52\x04\x3d\x34\x46\x50\xb3\xd6\x40\x4c\x4a\x9a\x52\x7a\x5a\xc6\x64\xa2\x0b\xfb\xa7\x6c\xd6\xa2\xdf\xbe\x64\xb5\xd6\x93\xf4\x34\xb0\xf3\xcc\x8f\x67\x67\x37\xce\xa1\xd7\x0b\xa6\x53\x65\x6a\xd1\x9c\x78\x65\xe4\x41\x69\xee\x4e\x9f\xc4\x45\x73\xa9\x2d\xaf\x45\xd3\x90\x25\xed\x66\xb3\x20\x66\xcb\x74\x5e\xb0\x00\x00\xa0\x32\x92\xd3\x51\xb4\x8e\xa3\xae\xcf\xf4\x15\x85\xad\x31\x92\x50\xc3\x53\x04\x0d\xca\x96\xc2\x60\xc1\x9e\x93\xcc\x0f\xbe\xb2\x94\x2d\x4b\xa8\xcc\x41\xbb\xc1\xff\x21\xfc\x8b\xe0\x11\x92\xac\xcc\xef\x46\xfa\xd1\x55\x91\x6f\x40\xe8\xc6\x58\x85\x4e\x18\xcd\xdb\x6a\x4f\x0a\x1f\xce\xea\xad\x67\xde\xd7\xac\x60\xe0\x70\x2b\x89\x6b\x54\x04\x11\xf4\x1d\xa1\x52\xa4\xb6\x64\xdb\xbe\x87\xe6\x59\x0c\x97\xfb\xfe\x30\xd6\x48\xba\xe9\xd6\xe8\xd0\x2b\x74\xbd\x6a\x8f\x16\x2b\x47\x16\xbe\xd0\x9e\x84\xde\xfd\x72\x59\x5e\xc2\xb5\xcd\x15\x1e\x85\x3a\x28\x2e\x49\xef\xdc\x1e\x22\x18\x8d\x27\x61\xe0\xe1\x64\x75\x7f\x65\xe5\x9a\x9d\xf7\xe3\x93\xd3\x92\x15\x50\xce\x17\x29\x83\x1b\xf9\xcb\xf9\x32\x4f\xdf\x36\x19\x78\x63\x28\x3f\x5e\x58\xa7\xd5\x49\x0c\x46\xe3\xc9\x30\xf4\x29\x2c\x8b\x21\x59\x85\x41\x57\xff\xf8\xc0\xdd\x6f\xf8\x0e\x00\x00\xff\xff\x50\xc7\xd4\x10\x14\x02\x00\x00")
func postgres000003_alter_team_members_rolesUpSqlBytes() ([]byte, error) {
return bindataRead(
_postgres000003_alter_team_members_rolesUpSql,
"postgres/000003_alter_team_members_roles.up.sql",
)
}
func postgres000003_alter_team_members_rolesUpSql() (*asset, error) {
bytes, err := postgres000003_alter_team_members_rolesUpSqlBytes()
if err != nil {
return nil, err
}
info := bindataFileInfo{name: "postgres/000003_alter_team_members_roles.up.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
// Asset loads and returns the asset for the given name. // Asset loads and returns the asset for the given name.
// It returns an error if the asset could not be found or // It returns an error if the asset could not be found or
// could not be loaded. // could not be loaded.
@@ -296,14 +380,18 @@ func AssetNames() []string {
// _bindata is a table, holding each asset generator, mapped to its name. // _bindata is a table, holding each asset generator, mapped to its name.
var _bindata = map[string]func() (*asset, error){ var _bindata = map[string]func() (*asset, error){
"mysql/000001_create_teams.down.sql": mysql000001_create_teamsDownSql, "mysql/000001_create_teams.down.sql": mysql000001_create_teamsDownSql,
"mysql/000001_create_teams.up.sql": mysql000001_create_teamsUpSql, "mysql/000001_create_teams.up.sql": mysql000001_create_teamsUpSql,
"mysql/000002_create_team_members.down.sql": mysql000002_create_team_membersDownSql, "mysql/000002_create_team_members.down.sql": mysql000002_create_team_membersDownSql,
"mysql/000002_create_team_members.up.sql": mysql000002_create_team_membersUpSql, "mysql/000002_create_team_members.up.sql": mysql000002_create_team_membersUpSql,
"postgres/000001_create_teams.down.sql": postgres000001_create_teamsDownSql, "mysql/000003_alter_team_members_roles.down.sql": mysql000003_alter_team_members_rolesDownSql,
"postgres/000001_create_teams.up.sql": postgres000001_create_teamsUpSql, "mysql/000003_alter_team_members_roles.up.sql": mysql000003_alter_team_members_rolesUpSql,
"postgres/000002_create_team_members.down.sql": postgres000002_create_team_membersDownSql, "postgres/000001_create_teams.down.sql": postgres000001_create_teamsDownSql,
"postgres/000002_create_team_members.up.sql": postgres000002_create_team_membersUpSql, "postgres/000001_create_teams.up.sql": postgres000001_create_teamsUpSql,
"postgres/000002_create_team_members.down.sql": postgres000002_create_team_membersDownSql,
"postgres/000002_create_team_members.up.sql": postgres000002_create_team_membersUpSql,
"postgres/000003_alter_team_members_roles.down.sql": postgres000003_alter_team_members_rolesDownSql,
"postgres/000003_alter_team_members_roles.up.sql": postgres000003_alter_team_members_rolesUpSql,
} }
// AssetDir returns the file names below a certain // AssetDir returns the file names below a certain
@@ -348,16 +436,20 @@ type bintree struct {
var _bintree = &bintree{nil, map[string]*bintree{ var _bintree = &bintree{nil, map[string]*bintree{
"mysql": &bintree{nil, map[string]*bintree{ "mysql": &bintree{nil, map[string]*bintree{
"000001_create_teams.down.sql": &bintree{mysql000001_create_teamsDownSql, map[string]*bintree{}}, "000001_create_teams.down.sql": &bintree{mysql000001_create_teamsDownSql, map[string]*bintree{}},
"000001_create_teams.up.sql": &bintree{mysql000001_create_teamsUpSql, map[string]*bintree{}}, "000001_create_teams.up.sql": &bintree{mysql000001_create_teamsUpSql, map[string]*bintree{}},
"000002_create_team_members.down.sql": &bintree{mysql000002_create_team_membersDownSql, map[string]*bintree{}}, "000002_create_team_members.down.sql": &bintree{mysql000002_create_team_membersDownSql, map[string]*bintree{}},
"000002_create_team_members.up.sql": &bintree{mysql000002_create_team_membersUpSql, map[string]*bintree{}}, "000002_create_team_members.up.sql": &bintree{mysql000002_create_team_membersUpSql, map[string]*bintree{}},
"000003_alter_team_members_roles.down.sql": &bintree{mysql000003_alter_team_members_rolesDownSql, map[string]*bintree{}},
"000003_alter_team_members_roles.up.sql": &bintree{mysql000003_alter_team_members_rolesUpSql, map[string]*bintree{}},
}}, }},
"postgres": &bintree{nil, map[string]*bintree{ "postgres": &bintree{nil, map[string]*bintree{
"000001_create_teams.down.sql": &bintree{postgres000001_create_teamsDownSql, map[string]*bintree{}}, "000001_create_teams.down.sql": &bintree{postgres000001_create_teamsDownSql, map[string]*bintree{}},
"000001_create_teams.up.sql": &bintree{postgres000001_create_teamsUpSql, map[string]*bintree{}}, "000001_create_teams.up.sql": &bintree{postgres000001_create_teamsUpSql, map[string]*bintree{}},
"000002_create_team_members.down.sql": &bintree{postgres000002_create_team_membersDownSql, map[string]*bintree{}}, "000002_create_team_members.down.sql": &bintree{postgres000002_create_team_membersDownSql, map[string]*bintree{}},
"000002_create_team_members.up.sql": &bintree{postgres000002_create_team_membersUpSql, map[string]*bintree{}}, "000002_create_team_members.up.sql": &bintree{postgres000002_create_team_membersUpSql, map[string]*bintree{}},
"000003_alter_team_members_roles.down.sql": &bintree{postgres000003_alter_team_members_rolesDownSql, map[string]*bintree{}},
"000003_alter_team_members_roles.up.sql": &bintree{postgres000003_alter_team_members_rolesUpSql, map[string]*bintree{}},
}}, }},
}} }}

Просмотреть файл

@@ -0,0 +1,15 @@
SET @preparedStatement = (SELECT IF(
(
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'TeamMembers'
AND table_schema = DATABASE()
AND column_name = 'Roles'
AND column_type != 'varchar(64)'
) > 0,
'ALTER TABLE TeamMembers MODIFY Roles varchar(64);',
'SELECT 1'
));
PREPARE alterIfExists FROM @preparedStatement;
EXECUTE alterIfExists;
DEALLOCATE PREPARE alterIfExists;

Просмотреть файл

@@ -0,0 +1,15 @@
SET @preparedStatement = (SELECT IF(
(
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'TeamMembers'
AND table_schema = DATABASE()
AND column_name = 'Roles'
AND column_type != 'text'
) > 0,
'ALTER TABLE TeamMembers MODIFY Roles text;',
'SELECT 1'
));
PREPARE alterIfExists FROM @preparedStatement;
EXECUTE alterIfExists;
DEALLOCATE PREPARE alterIfExists;

Просмотреть файл

@@ -0,0 +1,16 @@
DO $$
<<modify_column_type_if_type_is_different>>
DECLARE
col_exist_and_type_different boolean := false;
BEGIN
SELECT count(*) != 0 INTO col_exist_and_type_different
FROM information_schema.columns
WHERE table_name = 'teammembers'
AND column_name = 'roles'
AND data_type = 'character varying'
AND NOT character_maximum_length = 64;
IF col_exist_and_type_different THEN
ALTER TABLE teammembers ALTER COLUMN roles TYPE varchar(64);
END IF;
END modify_column_type_if_type_is_different $$

Просмотреть файл

@@ -0,0 +1,16 @@
DO $$
<<modify_column_type_if_type_is_different>>
DECLARE
col_exist_and_type_different boolean := false;
BEGIN
SELECT count(*) != 0 INTO col_exist_and_type_different
FROM information_schema.columns
WHERE table_name = 'teammembers'
AND column_name = 'roles'
AND data_type = 'character varying'
AND NOT character_maximum_length = 256;
IF col_exist_and_type_different THEN
ALTER TABLE teammembers ALTER COLUMN roles TYPE varchar(256);
END IF;
END modify_column_type_if_type_is_different $$

Просмотреть файл

@@ -7739,6 +7739,10 @@
"id": "model.channel_member.is_valid.push_level.app_error", "id": "model.channel_member.is_valid.push_level.app_error",
"translation": "Invalid push notification level." "translation": "Invalid push notification level."
}, },
{
"id": "model.channel_member.is_valid.roles_limit.app_error",
"translation": "Invalid channel member roles longer than {{.Limit}} characters."
},
{ {
"id": "model.channel_member.is_valid.unread_level.app_error", "id": "model.channel_member.is_valid.unread_level.app_error",
"translation": "Invalid mark unread level." "translation": "Invalid mark unread level."
@@ -8703,6 +8707,22 @@
"id": "model.search_params_list.is_valid.include_deleted_channels.app_error", "id": "model.search_params_list.is_valid.include_deleted_channels.app_error",
"translation": "All IncludeDeletedChannels params should have the same value." "translation": "All IncludeDeletedChannels params should have the same value."
}, },
{
"id": "model.session.is_valid.create_at.app_error",
"translation": "Invalid CreateAt field for session."
},
{
"id": "model.session.is_valid.id.app_error",
"translation": "Invalid Id field for session."
},
{
"id": "model.session.is_valid.roles_limit.app_error",
"translation": "Invalid session roles longer than {{.Limit}} characters."
},
{
"id": "model.session.is_valid.user_id.app_error",
"translation": "Invalid UserId field for session."
},
{ {
"id": "model.team.is_valid.characters.app_error", "id": "model.team.is_valid.characters.app_error",
"translation": "Name must be 2 or more lowercase alphanumeric characters." "translation": "Name must be 2 or more lowercase alphanumeric characters."
@@ -8755,6 +8775,10 @@
"id": "model.team.is_valid.url.app_error", "id": "model.team.is_valid.url.app_error",
"translation": "Invalid URL Identifier." "translation": "Invalid URL Identifier."
}, },
{
"id": "model.team_member.is_valid.roles_limit.app_error",
"translation": "Invalid team member roles longer than {{.Limit}} characters."
},
{ {
"id": "model.team_member.is_valid.team_id.app_error", "id": "model.team_member.is_valid.team_id.app_error",
"translation": "Invalid team ID." "translation": "Invalid team ID."
@@ -8923,6 +8947,10 @@
"id": "model.user.is_valid.pwd_uppercase_symbol.app_error", "id": "model.user.is_valid.pwd_uppercase_symbol.app_error",
"translation": "Your password must contain at least {{.Min}} characters made up of at least one uppercase letter and at least one symbol (e.g. \"~!@#$%^&*()\")." "translation": "Your password must contain at least {{.Min}} characters made up of at least one uppercase letter and at least one symbol (e.g. \"~!@#$%^&*()\")."
}, },
{
"id": "model.user.is_valid.roles_limit.app_error",
"translation": "Invalid user roles longer than {{.Limit}} characters."
},
{ {
"id": "model.user.is_valid.update_at.app_error", "id": "model.user.is_valid.update_at.app_error",
"translation": "Update at must be a valid time." "translation": "Update at must be a valid time."

Просмотреть файл

@@ -69,7 +69,6 @@ type ChannelMemberForExport struct {
} }
func (o *ChannelMember) IsValid() *AppError { func (o *ChannelMember) IsValid() *AppError {
if !IsValidId(o.ChannelId) { if !IsValidId(o.ChannelId) {
return NewAppError("ChannelMember.IsValid", "model.channel_member.is_valid.channel_id.app_error", nil, "", http.StatusBadRequest) return NewAppError("ChannelMember.IsValid", "model.channel_member.is_valid.channel_id.app_error", nil, "", http.StatusBadRequest)
} }
@@ -106,6 +105,11 @@ func (o *ChannelMember) IsValid() *AppError {
} }
} }
if len(o.Roles) > UserRolesMaxLength {
return NewAppError("ChannelMember.IsValid", "model.channel_member.is_valid.roles_limit.app_error",
map[string]interface{}{"Limit": UserRolesMaxLength}, "", http.StatusBadRequest)
}
return nil return nil
} }

Просмотреть файл

@@ -4,6 +4,7 @@
package model package model
import ( import (
"net/http"
"strconv" "strconv"
"strings" "strings"
@@ -78,6 +79,27 @@ func (s *Session) DeepCopy() *Session {
return &copySession return &copySession
} }
func (s *Session) IsValid() *AppError {
if !IsValidId(s.Id) {
return NewAppError("Session.IsValid", "model.session.is_valid.id.app_error", nil, "", http.StatusBadRequest)
}
if !IsValidId(s.UserId) {
return NewAppError("Session.IsValid", "model.session.is_valid.user_id.app_error", nil, "", http.StatusBadRequest)
}
if s.CreateAt == 0 {
return NewAppError("Session.IsValid", "model.session.is_valid.create_at.app_error", nil, "", http.StatusBadRequest)
}
if len(s.Roles) > UserRolesMaxLength {
return NewAppError("Session.IsValid", "model.session.is_valid.roles_limit.app_error",
map[string]interface{}{"Limit": UserRolesMaxLength}, "session_id="+s.Id, http.StatusBadRequest)
}
return nil
}
func (s *Session) PreSave() { func (s *Session) PreSave() {
if s.Id == "" { if s.Id == "" {
s.Id = NewId() s.Id = NewId()

Просмотреть файл

@@ -5,12 +5,74 @@ package model
import ( import (
"strconv" "strconv"
"strings"
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
func TestSessionIsValid(t *testing.T) {
tcs := []struct {
name string
input Session
expectedError string
}{
{
"Invalid Id",
Session{},
"model.session.is_valid.id.app_error",
},
{
"Invalid UserId",
Session{
Id: NewId(),
},
"model.session.is_valid.user_id.app_error",
},
{
"Invalid CreateAt",
Session{
Id: NewId(),
UserId: NewId(),
},
"model.session.is_valid.create_at.app_error",
},
{
"Invalid Roles",
Session{
Id: NewId(),
UserId: NewId(),
CreateAt: 1000,
Roles: strings.Repeat("a", UserRolesMaxLength+1),
},
"model.session.is_valid.roles_limit.app_error",
},
{
"Valid",
Session{
Id: NewId(),
UserId: NewId(),
CreateAt: 1000,
Roles: strings.Repeat("a", UserRolesMaxLength),
},
"",
},
}
for _, tc := range tcs {
t.Run(tc.name, func(t *testing.T) {
err := tc.input.IsValid()
if tc.expectedError != "" {
require.NotNil(t, err)
require.Equal(t, tc.expectedError, err.Id)
} else {
require.Nil(t, err)
}
})
}
}
func TestSessionDeepCopy(t *testing.T) { func TestSessionDeepCopy(t *testing.T) {
sessionId := NewId() sessionId := NewId()
userId := NewId() userId := NewId()

Просмотреть файл

@@ -98,7 +98,6 @@ func TeamMemberWithErrorToString(o *TeamMemberWithError) string {
} }
func (o *TeamMember) IsValid() *AppError { func (o *TeamMember) IsValid() *AppError {
if !IsValidId(o.TeamId) { if !IsValidId(o.TeamId) {
return NewAppError("TeamMember.IsValid", "model.team_member.is_valid.team_id.app_error", nil, "", http.StatusBadRequest) return NewAppError("TeamMember.IsValid", "model.team_member.is_valid.team_id.app_error", nil, "", http.StatusBadRequest)
} }
@@ -107,6 +106,11 @@ func (o *TeamMember) IsValid() *AppError {
return NewAppError("TeamMember.IsValid", "model.team_member.is_valid.user_id.app_error", nil, "", http.StatusBadRequest) return NewAppError("TeamMember.IsValid", "model.team_member.is_valid.user_id.app_error", nil, "", http.StatusBadRequest)
} }
if len(o.Roles) > UserRolesMaxLength {
return NewAppError("TeamMember.IsValid", "model.team_member.is_valid.roles_limit.app_error",
map[string]interface{}{"Limit": UserRolesMaxLength}, "", http.StatusBadRequest)
}
return nil return nil
} }

Просмотреть файл

@@ -60,6 +60,7 @@ const (
UserPasswordMaxLength = 72 UserPasswordMaxLength = 72
UserLocaleMaxLength = 5 UserLocaleMaxLength = 5
UserTimezoneMaxRunes = 256 UserTimezoneMaxRunes = 256
UserRolesMaxLength = 256
) )
//msgp:tuple User //msgp:tuple User
@@ -261,7 +262,6 @@ func (u *User) DeepCopy() *User {
// IsValid validates the user and returns an error if it isn't configured // IsValid validates the user and returns an error if it isn't configured
// correctly. // correctly.
func (u *User) IsValid() *AppError { func (u *User) IsValid() *AppError {
if !IsValidId(u.Id) { if !IsValidId(u.Id) {
return InvalidUserError("id", "") return InvalidUserError("id", "")
} }
@@ -332,6 +332,11 @@ func (u *User) IsValid() *AppError {
} }
} }
if len(u.Roles) > UserRolesMaxLength {
return NewAppError("User.IsValid", "model.user.is_valid.roles_limit.app_error",
map[string]interface{}{"Limit": UserRolesMaxLength}, "user_id="+u.Id, http.StatusBadRequest)
}
return nil return nil
} }

Просмотреть файл

@@ -132,6 +132,15 @@ func TestUserIsValid(t *testing.T) {
user.Position = strings.Repeat("a", 129) user.Position = strings.Repeat("a", 129)
err = user.IsValid() err = user.IsValid()
require.True(t, HasExpectedUserIsValidError(err, "position", user.Id), "expected user is valid error: %s", err.Error()) require.True(t, HasExpectedUserIsValidError(err, "position", user.Id), "expected user is valid error: %s", err.Error())
user.Position = ""
user.Roles = strings.Repeat("a", UserRolesMaxLength)
err = user.IsValid()
require.Nil(t, err)
user.Roles = strings.Repeat("a", UserRolesMaxLength+1)
err = user.IsValid()
require.True(t, HasExpectedUserIsValidError(err, "roles_limit", user.Id), "expected user is valid error: %s", err.Error())
} }
func HasExpectedUserIsValidError(err *AppError, fieldName string, userId string) bool { func HasExpectedUserIsValidError(err *AppError, fieldName string, userId string) bool {

Просмотреть файл

@@ -71,7 +71,7 @@ CREATE TABLE `ChannelMemberHistory` (
CREATE TABLE `ChannelMembers` ( CREATE TABLE `ChannelMembers` (
`ChannelId` varchar(26) NOT NULL, `ChannelId` varchar(26) NOT NULL,
`UserId` varchar(26) NOT NULL, `UserId` varchar(26) NOT NULL,
`Roles` varchar(64) DEFAULT NULL, `Roles` text DEFAULT NULL,
`LastViewedAt` bigint(20) DEFAULT NULL, `LastViewedAt` bigint(20) DEFAULT NULL,
`MsgCount` bigint(20) DEFAULT NULL, `MsgCount` bigint(20) DEFAULT NULL,
`MentionCount` bigint(20) DEFAULT NULL, `MentionCount` bigint(20) DEFAULT NULL,
@@ -767,7 +767,7 @@ CREATE TABLE `Sessions` (
`LastActivityAt` bigint(20) DEFAULT NULL, `LastActivityAt` bigint(20) DEFAULT NULL,
`UserId` varchar(26) DEFAULT NULL, `UserId` varchar(26) DEFAULT NULL,
`DeviceId` text, `DeviceId` text,
`Roles` varchar(64) DEFAULT NULL, `Roles` text DEFAULT NULL,
`IsOAuth` tinyint(1) DEFAULT NULL, `IsOAuth` tinyint(1) DEFAULT NULL,
`ExpiredNotify` tinyint(1) DEFAULT NULL, `ExpiredNotify` tinyint(1) DEFAULT NULL,
`Props` json DEFAULT NULL, `Props` json DEFAULT NULL,
@@ -937,7 +937,7 @@ CREATE TABLE `Systems` (
CREATE TABLE `TeamMembers` ( CREATE TABLE `TeamMembers` (
`TeamId` varchar(26) NOT NULL, `TeamId` varchar(26) NOT NULL,
`UserId` varchar(26) NOT NULL, `UserId` varchar(26) NOT NULL,
`Roles` varchar(64) DEFAULT NULL, `Roles` text DEFAULT NULL,
`DeleteAt` bigint(20) DEFAULT NULL, `DeleteAt` bigint(20) DEFAULT NULL,
`SchemeUser` tinyint(4) DEFAULT NULL, `SchemeUser` tinyint(4) DEFAULT NULL,
`SchemeAdmin` tinyint(4) DEFAULT NULL, `SchemeAdmin` tinyint(4) DEFAULT NULL,

Просмотреть файл

@@ -73,7 +73,7 @@ ALTER TABLE public.channelmemberhistory OWNER TO mmuser;
CREATE TABLE public.channelmembers ( CREATE TABLE public.channelmembers (
channelid character varying(26) NOT NULL, channelid character varying(26) NOT NULL,
userid character varying(26) NOT NULL, userid character varying(26) NOT NULL,
roles character varying(64), roles character varying(256),
lastviewedat bigint, lastviewedat bigint,
msgcount bigint, msgcount bigint,
mentioncount bigint, mentioncount bigint,
@@ -675,7 +675,7 @@ CREATE TABLE public.sessions (
lastactivityat bigint, lastactivityat bigint,
userid character varying(26), userid character varying(26),
deviceid character varying(512), deviceid character varying(512),
roles character varying(64), roles character varying(256),
isoauth boolean, isoauth boolean,
expirednotify boolean, expirednotify boolean,
props jsonb props jsonb
@@ -825,7 +825,7 @@ ALTER TABLE public.systems OWNER TO mmuser;
CREATE TABLE public.teammembers ( CREATE TABLE public.teammembers (
teamid character varying(26) NOT NULL, teamid character varying(26) NOT NULL,
userid character varying(26) NOT NULL, userid character varying(26) NOT NULL,
roles character varying(64), roles character varying(256),
deleteat bigint, deleteat bigint,
schemeuser boolean, schemeuser boolean,
schemeadmin boolean, schemeadmin boolean,

Просмотреть файл

@@ -390,7 +390,7 @@ func newSqlChannelStore(sqlStore *SqlStore, metrics einterfaces.MetricsInterface
tablem := db.AddTableWithName(channelMember{}, "ChannelMembers").SetKeys(false, "ChannelId", "UserId") tablem := db.AddTableWithName(channelMember{}, "ChannelMembers").SetKeys(false, "ChannelId", "UserId")
tablem.ColMap("ChannelId").SetMaxSize(26) tablem.ColMap("ChannelId").SetMaxSize(26)
tablem.ColMap("UserId").SetMaxSize(26) tablem.ColMap("UserId").SetMaxSize(26)
tablem.ColMap("Roles").SetMaxSize(64) tablem.ColMap("Roles").SetMaxSize(model.UserRolesMaxLength)
tablem.ColMap("NotifyProps").SetDataType(sqlStore.jsonDataType()) tablem.ColMap("NotifyProps").SetDataType(sqlStore.jsonDataType())
tablePublicChannels := db.AddTableWithName(publicChannel{}, "PublicChannels").SetKeys(false, "Id") tablePublicChannels := db.AddTableWithName(publicChannel{}, "PublicChannels").SetKeys(false, "Id")

Просмотреть файл

@@ -32,7 +32,7 @@ func newSqlSessionStore(sqlStore *SqlStore) store.SessionStore {
table.ColMap("Token").SetMaxSize(26) table.ColMap("Token").SetMaxSize(26)
table.ColMap("UserId").SetMaxSize(26) table.ColMap("UserId").SetMaxSize(26)
table.ColMap("DeviceId").SetMaxSize(512) table.ColMap("DeviceId").SetMaxSize(512)
table.ColMap("Roles").SetMaxSize(64) table.ColMap("Roles").SetMaxSize(model.UserRolesMaxLength)
table.ColMap("Props").SetDataType(sqlStore.jsonDataType()) table.ColMap("Props").SetDataType(sqlStore.jsonDataType())
} }
@@ -51,8 +51,13 @@ func (me SqlSessionStore) Save(session *model.Session) (*model.Session, error) {
if session.Id != "" { if session.Id != "" {
return nil, store.NewErrInvalidInput("Session", "id", session.Id) return nil, store.NewErrInvalidInput("Session", "id", session.Id)
} }
session.PreSave() session.PreSave()
if err := session.IsValid(); err != nil {
return nil, err
}
if err := me.GetMaster().Insert(session); err != nil { if err := me.GetMaster().Insert(session); err != nil {
return nil, errors.Wrapf(err, "failed to save Session with id=%s", session.Id) return nil, errors.Wrapf(err, "failed to save Session with id=%s", session.Id)
} }
@@ -228,6 +233,10 @@ func (me SqlSessionStore) UpdateLastActivityAt(sessionId string, time int64) err
} }
func (me SqlSessionStore) UpdateRoles(userId, roles string) (string, error) { func (me SqlSessionStore) UpdateRoles(userId, roles string) (string, error) {
if len(roles) > model.UserRolesMaxLength {
return "", fmt.Errorf("Given session roles length (%d) exceeds max storage limit (%d)", len(roles), model.UserRolesMaxLength)
}
query := "UPDATE Sessions SET Roles = :Roles WHERE UserId = :UserId" query := "UPDATE Sessions SET Roles = :Roles WHERE UserId = :UserId"
_, err := me.GetMaster().Exec(query, map[string]interface{}{"Roles": roles, "UserId": userId}) _, err := me.GetMaster().Exec(query, map[string]interface{}{"Roles": roles, "UserId": userId})

Просмотреть файл

@@ -227,7 +227,7 @@ func newSqlTeamStore(sqlStore *SqlStore) store.TeamStore {
tablem := db.AddTableWithName(teamMember{}, "TeamMembers").SetKeys(false, "TeamId", "UserId") tablem := db.AddTableWithName(teamMember{}, "TeamMembers").SetKeys(false, "TeamId", "UserId")
tablem.ColMap("TeamId").SetMaxSize(26) tablem.ColMap("TeamId").SetMaxSize(26)
tablem.ColMap("UserId").SetMaxSize(26) tablem.ColMap("UserId").SetMaxSize(26)
tablem.ColMap("Roles").SetMaxSize(64) tablem.ColMap("Roles").SetMaxSize(model.UserRolesMaxLength)
} }
return s return s

Просмотреть файл

@@ -18,6 +18,7 @@ import (
const ( const (
CurrentSchemaVersion = Version5380 CurrentSchemaVersion = Version5380
Version610 = "6.1.0"
Version600 = "6.0.0" Version600 = "6.0.0"
Version5380 = "5.38.0" Version5380 = "5.38.0"
Version5370 = "5.37.0" Version5370 = "5.37.0"
@@ -212,6 +213,7 @@ func upgradeDatabase(sqlStore *SqlStore, currentModelVersionString string) error
upgradeDatabaseToVersion537(sqlStore) upgradeDatabaseToVersion537(sqlStore)
upgradeDatabaseToVersion538(sqlStore) upgradeDatabaseToVersion538(sqlStore)
upgradeDatabaseToVersion600(sqlStore) upgradeDatabaseToVersion600(sqlStore)
upgradeDatabaseToVersion610(sqlStore)
return nil return nil
} }
@@ -1344,3 +1346,14 @@ func upgradeDatabaseToVersion600(sqlStore *SqlStore) {
// saveSchemaVersion(sqlStore, Version600) // saveSchemaVersion(sqlStore, Version600)
// } // }
} }
func upgradeDatabaseToVersion610(sqlStore *SqlStore) {
// if shouldPerformUpgrade(sqlStore, Version600, Version610) {
sqlStore.AlterColumnTypeIfExists("Sessions", "Roles", "text", "varchar(256)")
sqlStore.AlterColumnTypeIfExists("ChannelMembers", "Roles", "text", "varchar(256)")
sqlStore.AlterColumnTypeIfExists("TeamMembers", "Roles", "text", "varchar(256)")
// saveSchemaVersion(sqlStore, Version610)
// }
}

Просмотреть файл

@@ -68,7 +68,7 @@ func newSqlUserStore(sqlStore *SqlStore, metrics einterfaces.MetricsInterface) s
table.ColMap("Nickname").SetMaxSize(64) table.ColMap("Nickname").SetMaxSize(64)
table.ColMap("FirstName").SetMaxSize(64) table.ColMap("FirstName").SetMaxSize(64)
table.ColMap("LastName").SetMaxSize(64) table.ColMap("LastName").SetMaxSize(64)
table.ColMap("Roles").SetMaxSize(256) table.ColMap("Roles").SetMaxSize(model.UserRolesMaxLength)
table.ColMap("Props").SetDataType(sqlStore.jsonDataType()) table.ColMap("Props").SetDataType(sqlStore.jsonDataType())
table.ColMap("NotifyProps").SetDataType(sqlStore.jsonDataType()) table.ColMap("NotifyProps").SetDataType(sqlStore.jsonDataType())
table.ColMap("Locale").SetMaxSize(5) table.ColMap("Locale").SetMaxSize(5)