diff --git a/pkg/services/sqlstore/migrations/team_mig.go b/pkg/services/sqlstore/migrations/team_mig.go index 41fda158afe..bb4041a3766 100644 --- a/pkg/services/sqlstore/migrations/team_mig.go +++ b/pkg/services/sqlstore/migrations/team_mig.go @@ -83,4 +83,17 @@ func addTeamMigrations(mg *Migrator) { Name: "permission", Type: DB_SmallInt, Nullable: true, })) mg.AddMigration("add unique index team_member_user_id_org_id", NewAddIndexMigration(teamMemberV1, teamMemberV1.Indices[3])) + + mg.AddMigration("Add column uid in team_member", NewAddColumnMigration(teamMemberV1, &Column{ + Name: "uid", Type: DB_NVarchar, Length: 40, Nullable: true, + })) + + mg.AddMigration("Update uid column values in team_member", NewRawSQLMigration(""). + SQLite("UPDATE team_member SET uid=printf('tm%09d',id) WHERE uid IS NULL OR uid = '';"). + Postgres("UPDATE team_member SET uid='tm' || lpad('' || id::text,9,'0') WHERE uid IS NULL OR uid = '';"). + Mysql("UPDATE team_member SET uid=concat('tm',lpad(id,9,'0')) WHERE uid IS NULL OR uid = '';")) + + mg.AddMigration("Add unique index team_member_uid", NewAddIndexMigration(teamMemberV1, &Index{ + Cols: []string{"uid"}, Type: UniqueIndex, + })) } diff --git a/pkg/services/team/model.go b/pkg/services/team/model.go index eead8de614f..68f655771b0 100644 --- a/pkg/services/team/model.go +++ b/pkg/services/team/model.go @@ -130,11 +130,12 @@ type SearchTeamQueryResult struct { // TeamMember model type TeamMember struct { - ID int64 `xorm:"pk autoincr 'id'"` - OrgID int64 `xorm:"org_id"` - TeamID int64 `xorm:"team_id"` - UserID int64 `xorm:"user_id"` - External bool // Signals that the membership has been created by an external systems, such as LDAP + ID int64 `xorm:"pk autoincr 'id'"` + UID string `xorm:"uid"` + OrgID int64 `xorm:"org_id"` + TeamID int64 `xorm:"team_id"` + UserID int64 `xorm:"user_id"` + External bool // Signals that the membership has been created by an external systems, such as LDAP Permission PermissionType Created time.Time @@ -180,9 +181,10 @@ type GetTeamMembersQuery struct { // Projections and DTOs type TeamMemberDTO struct { + UID string `json:"uid" xorm:"uid"` OrgID int64 `json:"orgId" xorm:"org_id"` TeamID int64 `json:"teamId" xorm:"team_id"` - TeamUID string `json:"teamUID" xorm:"uid"` + TeamUID string `json:"teamUID" xorm:"team_uid"` UserID int64 `json:"userId" xorm:"user_id"` UserUID string `json:"userUID" xorm:"user_uid"` External bool `json:"-"` diff --git a/pkg/services/team/teamimpl/store.go b/pkg/services/team/teamimpl/store.go index d7502c48fc2..6008bd9c1d0 100644 --- a/pkg/services/team/teamimpl/store.go +++ b/pkg/services/team/teamimpl/store.go @@ -423,6 +423,7 @@ func addTeamMember(sess *db.Session, orgID, teamID, userID int64, isExternal boo } entity := team.TeamMember{ + UID: util.GenerateShortUID(), OrgID: orgID, TeamID: teamID, UserID: userID, @@ -559,6 +560,7 @@ func (ss *xormStore) getTeamMembers(ctx context.Context, query *team.GetTeamMemb sess.Select(fmt.Sprintf(`team_member.org_id, team_member.team_id, team_member.user_id, + team_member.uid, %[1]s.email, %[1]s.name, %[1]s.login, @@ -566,7 +568,7 @@ func (ss *xormStore) getTeamMembers(ctx context.Context, query *team.GetTeamMemb team_member.external, team_member.permission, user_auth.auth_module, - team.uid`, ss.db.GetDialect().Quote("user"))) + team.uid as team_uid`, ss.db.GetDialect().Quote("user"))) sess.Asc("user.login", "user.email") err := sess.Find(&queryResult) diff --git a/public/api-merged.json b/public/api-merged.json index 83211911e0d..7fb2a644043 100644 --- a/public/api-merged.json +++ b/public/api-merged.json @@ -21999,6 +21999,9 @@ "teamUID": { "type": "string" }, + "uid": { + "type": "string" + }, "userId": { "type": "integer", "format": "int64" diff --git a/public/openapi3.json b/public/openapi3.json index 162af40b01c..ff6255565ae 100644 --- a/public/openapi3.json +++ b/public/openapi3.json @@ -11507,6 +11507,9 @@ "teamUID": { "type": "string" }, + "uid": { + "type": "string" + }, "userId": { "format": "int64", "type": "integer"