Skip to content

Commit

Permalink
Merge pull request #55 from gimlet-io/update-user-with-repos
Browse files Browse the repository at this point in the history
Update user with repos
  • Loading branch information
laszlocph authored May 6, 2024
2 parents 8bcad4b + 97c53c9 commit 0931106
Show file tree
Hide file tree
Showing 7 changed files with 76 additions and 31 deletions.
2 changes: 2 additions & 0 deletions pkg/dashboard/model/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"`
Expand Down
7 changes: 7 additions & 0 deletions pkg/dashboard/server/auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
38 changes: 27 additions & 11 deletions pkg/dashboard/server/repos.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down
18 changes: 18 additions & 0 deletions pkg/dashboard/store/ddl/migrations.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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": {
{
Expand Down Expand Up @@ -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;`,
},
},
}
8 changes: 4 additions & 4 deletions pkg/dashboard/store/sql/queries.go
Original file line number Diff line number Diff line change
Expand Up @@ -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;
`,
Expand All @@ -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: `
Expand Down Expand Up @@ -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;
`,
Expand All @@ -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: `
Expand Down
4 changes: 4 additions & 0 deletions pkg/dashboard/store/userDao_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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)
Expand Down Expand Up @@ -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,
Expand All @@ -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)
Expand Down
30 changes: 14 additions & 16 deletions web/src/views/repositoryWizard/repositoryWizard.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,24 +8,31 @@ export default function RepositoryWizard(props) {
<div className='text-neutral-900 dark:text-neutral-200'>
<div className="w-full bg-white dark:bg-neutral-800">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 pt-32 flex items-center">
<div>
<h1 className="text-3xl leading-tight text-medium flex-grow">Import Git Repository</h1>
<div className='font-light text-sm pt-2 pb-16'>
To deploy an application, import its Git Repository first.
</div>
<h1 className="text-3xl leading-tight text-medium flex-grow">Import Git Repository</h1>
<button
type="button"
className='secondaryButton'
onClick={() => props.history.push("/repositories")}
>
I am done importing
</button>
</div>
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 flex items-center">
<div className='font-light text-sm pt-2 pb-16'>
To deploy an application, import its Git Repository first.
</div>
</div>
<div className="border-b border-neutral-200 dark:border-neutral-700"></div>
</div>
<div className="max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 mt-8 flex">
<ImportWizard {...props} redirect />
<ImportWizard {...props} />
</div>
</div>
)
}

export function ImportWizard(props) {
const { gimletClient, store, redirect } = props;
const { gimletClient, store } = props;
let reduxState = store.getState();

const [application, setApplication] = useState(reduxState.application)
Expand Down Expand Up @@ -103,15 +110,6 @@ export function ImportWizard(props) {
Missing a Git repository? <a href={application.installationURL} rel="noreferrer" target="_blank" className='text-blue-500'>Adjust Github App Permission<ArrowRightIcon className="size-4 inline" aria-hidden="true" /></a>
</div>
}
{redirect &&
<button
type="button"
className='secondaryButton ml-auto'
onClick={() => props.history.push("/repositories")}
>
I am done importing
</button>
}
</div>
</>
:
Expand Down

0 comments on commit 0931106

Please sign in to comment.