diff --git a/pkg/dashboard/model/user.go b/pkg/dashboard/model/user.go index a23613ee0..53d52e242 100644 --- a/pkg/dashboard/model/user.go +++ b/pkg/dashboard/model/user.go @@ -35,6 +35,8 @@ type User struct { // Secret is the PEM formatted RSA private key used to sign JWT and CSRF tokens Secret string `json:"-" meddler:"secret,encrypted"` + Repos []string `json:"-" meddler:"repos,json"` + FavoriteRepos []string `json:"favoriteRepos" meddler:"favorite_repos,json"` FavoriteServices []string `json:"favoriteServices" meddler:"favorite_services,json"` diff --git a/pkg/dashboard/server/auth.go b/pkg/dashboard/server/auth.go index 6238bb03f..0b49dd55b 100644 --- a/pkg/dashboard/server/auth.go +++ b/pkg/dashboard/server/auth.go @@ -61,6 +61,13 @@ func auth(w http.ResponseWriter, r *http.Request) { return } + _, err = updateUserRepos(dynamicConfig, store, user) + if err != nil { + log.Errorf("cannot update user repos: %s", err) + http.Error(w, http.StatusText(500), 500) + return + } + err = setSessionCookie(w, r, user) if err != nil { log.Errorf("cannot set session cookie: %s", err) diff --git a/pkg/dashboard/server/repos.go b/pkg/dashboard/server/repos.go index 316cb650a..40b12ff93 100644 --- a/pkg/dashboard/server/repos.go +++ b/pkg/dashboard/server/repos.go @@ -23,12 +23,8 @@ func gitRepos(w http.ResponseWriter, r *http.Request) { dao := ctx.Value("store").(*store.Store) dynamicConfig := ctx.Value("dynamicConfig").(*dynamicconfig.DynamicConfig) - userRepos, err := userReposFromGithub(dynamicConfig, dao, user) - if err != nil { - logrus.Errorf("cannot get user repos: %s", err) - http.Error(w, http.StatusText(500), 500) - return - } + userRepos := user.Repos + go updateUserRepos(dynamicConfig, dao, user) importedRepos, err := getImportedRepos(dao) if err != nil { @@ -58,11 +54,17 @@ func searchRepo(w http.ResponseWriter, r *http.Request) { user := ctx.Value("user").(*model.User) dao := ctx.Value("store").(*store.Store) - userRepos, err := userReposFromGithub(dynamicConfig, dao, user) - if err != nil { - logrus.Errorf("cannot get user repos: %s", err) - http.Error(w, http.StatusText(500), 500) - return + var userRepos []string + var err error + if query == "" { + userRepos = user.Repos + } else { + userRepos, err = updateUserRepos(dynamicConfig, dao, user) + if err != nil { + logrus.Errorf("cannot get user repos: %s", err) + http.Error(w, http.StatusText(500), 500) + return + } } gitServiceImpl := customScm.NewGitService(dynamicConfig) @@ -155,6 +157,20 @@ func appendIfMissing(slice []string, i string) []string { return append(slice, i) } +func updateUserRepos(dynamicConfig *dynamicconfig.DynamicConfig, dao *store.Store, user *model.User) ([]string, error) { + userRepos, err := userReposFromGithub(dynamicConfig, dao, user) + if err != nil { + return nil, err + } + + user.Repos = userRepos + err = dao.UpdateUser(user) + if err != nil { + return nil, err + } + return userRepos, nil +} + func userReposFromGithub(dynamicConfig *dynamicconfig.DynamicConfig, dao *store.Store, user *model.User) ([]string, error) { goScmHelper := genericScm.NewGoScmHelper(dynamicConfig, func(token *scm.Token) { user.AccessToken = token.Token diff --git a/pkg/dashboard/store/ddl/migrations.go b/pkg/dashboard/store/ddl/migrations.go index 4711cbf81..cf2a26c75 100644 --- a/pkg/dashboard/store/ddl/migrations.go +++ b/pkg/dashboard/store/ddl/migrations.go @@ -50,6 +50,8 @@ const defaultTimestampsInAlertsTable = "defaultTimestampsInAlertsTable" const addImChannelIdToAlertsTable = "add-im-channel-id-to-alerts-table" const addDeploymentUrlToAlertsTable = "add-deployment-url-to-alerts-table" const defaultStringsInAlertsTable = "defaultStringsInAlertsTable" +const addReposColumnToUsersTable = "addReposColumnToUsersTable" +const defaultValueForRepos = "defaultValueForRepos" type migration struct { name string @@ -296,6 +298,14 @@ UNIQUE(id) name: defaultStringsInAlertsTable, stmt: `update alerts set im_channel_id='', deployment_url='' where im_channel_id is null;`, }, + { + name: addReposColumnToUsersTable, + stmt: `ALTER TABLE users ADD COLUMN repos TEXT;`, + }, + { + name: defaultValueForRepos, + stmt: `update users set repos='[]' where repos is null;`, + }, }, "postgres": { { @@ -535,5 +545,13 @@ UNIQUE(id) name: defaultStringsInAlertsTable, stmt: `update alerts set im_channel_id='', deployment_url='' where im_channel_id is null;`, }, + { + name: addReposColumnToUsersTable, + stmt: `ALTER TABLE users ADD COLUMN repos TEXT;`, + }, + { + name: defaultValueForRepos, + stmt: `update users set repos='[]' where repos is null;`, + }, }, } diff --git a/pkg/dashboard/store/sql/queries.go b/pkg/dashboard/store/sql/queries.go index 0983a0241..242cba67f 100644 --- a/pkg/dashboard/store/sql/queries.go +++ b/pkg/dashboard/store/sql/queries.go @@ -46,7 +46,7 @@ var queries = map[string]map[string]string{ SELECT 1; `, SelectUserByLogin: ` -SELECT id, login, secret, admin, name, email, access_token, refresh_token, expires, secret, favorite_repos, favorite_services +SELECT id, login, secret, admin, name, email, access_token, refresh_token, expires, secret, repos, favorite_repos, favorite_services FROM users WHERE login = $1; `, @@ -55,7 +55,7 @@ SELECT id, login, secret, admin FROM users; `, SelectEverytingFromUsers: ` -SELECT id, login, admin, name, email, access_token, refresh_token, expires, secret, favorite_repos, favorite_services +SELECT id, login, admin, name, email, access_token, refresh_token, expires, secret, repos, favorite_repos, favorite_services FROM users; `, DeleteUser: ` @@ -158,7 +158,7 @@ UPDATE alerts SET status = $1, resolved_at = $2 WHERE id = $3; SELECT 1; `, SelectUserByLogin: ` -SELECT id, login, secret, admin, name, email, access_token, refresh_token, expires, secret, favorite_repos, favorite_services +SELECT id, login, secret, admin, name, email, access_token, refresh_token, expires, secret, repos, favorite_repos, favorite_services FROM users WHERE login = $1; `, @@ -167,7 +167,7 @@ SELECT id, login, secret, admin FROM users; `, SelectEverytingFromUsers: ` -SELECT id, login, admin, name, email, access_token, refresh_token, expires, secret, favorite_repos, favorite_services +SELECT id, login, admin, name, email, access_token, refresh_token, expires, secret, repos, favorite_repos, favorite_services FROM users; `, DeleteUser: ` diff --git a/pkg/dashboard/store/userDao_test.go b/pkg/dashboard/store/userDao_test.go index 019c96e9b..2c9782410 100644 --- a/pkg/dashboard/store/userDao_test.go +++ b/pkg/dashboard/store/userDao_test.go @@ -18,6 +18,7 @@ func TestUserCRUD(t *testing.T) { Login: "aLogin", AccessToken: "aGithubToken", RefreshToken: "refreshToken", + Repos: []string{"first", "second"}, FavoriteRepos: []string{"first", "second"}, FavoriteServices: []string{"first", "second"}, Admin: true, @@ -34,6 +35,7 @@ func TestUserCRUD(t *testing.T) { assert.Equal(t, user.Login, u.Login) assert.Equal(t, user.AccessToken, u.AccessToken) assert.Equal(t, user.RefreshToken, u.RefreshToken) + assert.Equal(t, user.Repos, u.Repos) assert.Equal(t, user.FavoriteRepos, u.FavoriteRepos) assert.Equal(t, user.FavoriteServices, u.FavoriteServices) assert.Equal(t, user.Admin, u.Admin) @@ -62,6 +64,7 @@ func TestUserWithoutEncryption(t *testing.T) { Login: "aLogin", AccessToken: "aGithubToken", RefreshToken: "refreshToken", + Repos: []string{"first", "second"}, FavoriteRepos: []string{"first", "second"}, FavoriteServices: []string{"first", "second"}, Admin: true, @@ -78,6 +81,7 @@ func TestUserWithoutEncryption(t *testing.T) { assert.Equal(t, user.Login, u.Login) assert.Equal(t, user.AccessToken, u.AccessToken) assert.Equal(t, user.RefreshToken, u.RefreshToken) + assert.Equal(t, user.Repos, u.Repos) assert.Equal(t, user.FavoriteRepos, u.FavoriteRepos) assert.Equal(t, user.FavoriteServices, u.FavoriteServices) assert.Equal(t, user.Admin, u.Admin) diff --git a/web/src/views/repositoryWizard/repositoryWizard.jsx b/web/src/views/repositoryWizard/repositoryWizard.jsx index 14e6c6ee0..16af85f24 100644 --- a/web/src/views/repositoryWizard/repositoryWizard.jsx +++ b/web/src/views/repositoryWizard/repositoryWizard.jsx @@ -8,24 +8,31 @@ export default function RepositoryWizard(props) {
-
-

Import Git Repository

-
- To deploy an application, import its Git Repository first. -
+

Import Git Repository

+ +
+
+
+ To deploy an application, import its Git Repository first.
- +
) } export function ImportWizard(props) { - const { gimletClient, store, redirect } = props; + const { gimletClient, store } = props; let reduxState = store.getState(); const [application, setApplication] = useState(reduxState.application) @@ -103,15 +110,6 @@ export function ImportWizard(props) { Missing a Git repository? Adjust Github App Permission
} - {redirect && - - } :