diff --git a/controller/index.go b/controller/pages.go similarity index 78% rename from controller/index.go rename to controller/pages.go index 80f337082..506ecbfb3 100644 --- a/controller/index.go +++ b/controller/pages.go @@ -34,6 +34,47 @@ func ShowIndex(c *gin.Context) { }) } +// func ShowIndex(c *gin.Context) { +// db := context.Database(c) +// remote := context.Remote(c) +// user := session.User(c) +// if user == nil { +// c.Redirect(http.StatusSeeOther, "/login") +// return +// } + +// var err error +// var repos []*model.RepoLite + +// // get the repository list from the cache +// reposv, ok := c.Get("repos") +// if ok { +// repos = reposv.([]*model.RepoLite) +// } else { +// println("GETTING REMOTE REPOS") +// repos, err = remote.Repos(user) +// if err != nil { +// log.Errorf("Failure to get remote repositories for %s. %s.", +// user.Login, err) +// } else { +// c.Set("repos", repos) +// } +// } + +// // for each repository in the remote system we get +// // the intersection of those repostiories in Drone +// repos_, err := model.GetRepoListOf(db, repos) +// if err != nil { +// log.Errorf("Failure to get repository list for %s. %s.", +// user.Login, err) +// } + +// c.HTML(200, "repos.html", gin.H{ +// "User": user, +// "Repos": repos_, +// }) +// } + func ShowLogin(c *gin.Context) { c.HTML(200, "login.html", gin.H{"Error": c.Query("error")}) } diff --git a/controller/repo.go b/controller/repo.go index 2bbca5e1c..f5b0fef91 100644 --- a/controller/repo.go +++ b/controller/repo.go @@ -110,11 +110,6 @@ func PostRepo(c *gin.Context) { c.AbortWithError(500, err) return } - err = model.CreateStar(tx, user, r) - if err != nil { - c.AbortWithError(500, err) - return - } tx.Commit() c.JSON(200, r) @@ -163,27 +158,11 @@ func PatchRepo(c *gin.Context) { return } - // if the user is authenticated we should - // check to see if they've starred the repository - repo.IsStarred, _ = model.GetStar(db, user, repo) - c.IndentedJSON(http.StatusOK, repo) } func GetRepo(c *gin.Context) { - db := context.Database(c) - repo := session.Repo(c) - user := session.User(c) - if user == nil { - c.IndentedJSON(http.StatusOK, repo) - return - } - - // if the user is authenticated we should - // check to see if they've starred the repository - repo.IsStarred, _ = model.GetStar(db, user, repo) - - c.IndentedJSON(http.StatusOK, repo) + c.IndentedJSON(http.StatusOK, session.Repo(c)) } func GetRepoKey(c *gin.Context) { @@ -254,29 +233,3 @@ func PostSecure(c *gin.Context) { func PostReactivate(c *gin.Context) { } - -func PostStar(c *gin.Context) { - db := context.Database(c) - repo := session.Repo(c) - user := session.User(c) - - err := model.CreateStar(db, user, repo) - if err != nil { - c.AbortWithError(http.StatusInternalServerError, err) - } else { - c.Writer.WriteHeader(http.StatusOK) - } -} - -func DeleteStar(c *gin.Context) { - db := context.Database(c) - repo := session.Repo(c) - user := session.User(c) - - err := model.DeleteStar(db, user, repo) - if err != nil { - c.AbortWithError(http.StatusInternalServerError, err) - } else { - c.Writer.WriteHeader(http.StatusOK) - } -} diff --git a/controller/user.go b/controller/user.go index eae873d8f..9c8967d78 100644 --- a/controller/user.go +++ b/controller/user.go @@ -28,13 +28,33 @@ func GetFeed(c *gin.Context) { func GetRepos(c *gin.Context) { user := session.User(c) + remote := context.Remote(c) db := context.Database(c) - repos, err := model.GetRepoList(db, user) + var repos []*model.RepoLite + + // get the repository list from the cache + reposv, ok := c.Get("repos") + if ok { + repos = reposv.([]*model.RepoLite) + } else { + var err error + repos, err = remote.Repos(user) + if err != nil { + c.AbortWithStatus(http.StatusInternalServerError) + return + } + } + + // for each repository in the remote system we get + // the intersection of those repostiories in Drone + repos_, err := model.GetRepoListOf(db, repos) if err != nil { c.AbortWithStatus(http.StatusInternalServerError) return } - c.IndentedJSON(http.StatusOK, repos) + + c.Set("repos", repos) + c.IndentedJSON(http.StatusOK, repos_) } func GetRemoteRepos(c *gin.Context) { diff --git a/model/repo.go b/model/repo.go index 282c59cf7..9202fdfbb 100644 --- a/model/repo.go +++ b/model/repo.go @@ -60,15 +60,16 @@ func GetRepoList(db meddler.DB, user *User) ([]*Repo, error) { return repos, err } -func GetRepoListOf(db meddler.DB, listof []string) ([]*Repo, error) { +func GetRepoListOf(db meddler.DB, listof []*RepoLite) ([]*Repo, error) { var repos = []*Repo{} - var qs = make([]string, len(listof), len(listof)) - var in = make([]interface{}, len(listof), len(listof)) + var size = len(listof) + var qs = make([]string, size, size) + var in = make([]interface{}, size, size) for i, repo := range listof { qs[i] = "?" - in[i] = repo + in[i] = repo.FullName } - var stmt = "SELECT * FROM repos WHERE repo_id IN (" + strings.Join(qs, ",") + ")" + var stmt = "SELECT * FROM repos WHERE repo_full_name IN (" + strings.Join(qs, ",") + ")" var err = meddler.QueryAll(db, &repos, database.Rebind(stmt), in...) return repos, err } diff --git a/model/star.go b/model/star.go deleted file mode 100644 index 3088bc913..000000000 --- a/model/star.go +++ /dev/null @@ -1,44 +0,0 @@ -package model - -import ( - "github.com/drone/drone/shared/database" - "github.com/russross/meddler" -) - -type Star struct { - ID int64 `meddler:"star_id,pk"` - RepoID int64 `meddler:"star_repo_id"` - UserID int64 `meddler:"star_user_id"` -} - -func GetStar(db meddler.DB, user *User, repo *Repo) (bool, error) { - var star = new(Star) - err := meddler.QueryRow(db, star, database.Rebind(starQuery), user.ID, repo.ID) - return (err == nil), err -} - -func CreateStar(db meddler.DB, user *User, repo *Repo) error { - var star = &Star{UserID: user.ID, RepoID: repo.ID} - return meddler.Insert(db, starTable, star) -} - -func DeleteStar(db meddler.DB, user *User, repo *Repo) error { - var _, err = db.Exec(database.Rebind(starDeleteStmt), user.ID, repo.ID) - return err -} - -const starTable = "stars" - -const starQuery = ` -SELECT * -FROM stars -WHERE star_user_id=? -AND star_repo_id=? -LIMIT 1 -` - -const starDeleteStmt = ` -DELETE FROM stars -WHERE star_user_id=? - AND star_repo_id=? -` diff --git a/model/star_test.go b/model/star_test.go deleted file mode 100644 index 2ba98bb96..000000000 --- a/model/star_test.go +++ /dev/null @@ -1,59 +0,0 @@ -package model - -import ( - "testing" - - "github.com/drone/drone/shared/database" - "github.com/franela/goblin" -) - -func TestStarstore(t *testing.T) { - db := database.Open("sqlite3", ":memory:") - defer db.Close() - - g := goblin.Goblin(t) - g.Describe("Stars", func() { - - // before each test be sure to purge the package - // table data from the database. - g.BeforeEach(func() { - db.Exec("DELETE FROM stars") - }) - - g.It("Should Add a Star", func() { - user := User{ID: 1} - repo := Repo{ID: 2} - err := CreateStar(db, &user, &repo) - g.Assert(err == nil).IsTrue() - }) - - g.It("Should Get Starred", func() { - user := User{ID: 1} - repo := Repo{ID: 2} - CreateStar(db, &user, &repo) - ok, err := GetStar(db, &user, &repo) - g.Assert(err == nil).IsTrue() - g.Assert(ok).IsTrue() - }) - - g.It("Should Not Get Starred", func() { - user := User{ID: 1} - repo := Repo{ID: 2} - ok, err := GetStar(db, &user, &repo) - g.Assert(err != nil).IsTrue() - g.Assert(ok).IsFalse() - }) - - g.It("Should Del a Star", func() { - user := User{ID: 1} - repo := Repo{ID: 2} - CreateStar(db, &user, &repo) - _, err1 := GetStar(db, &user, &repo) - err2 := DeleteStar(db, &user, &repo) - _, err3 := GetStar(db, &user, &repo) - g.Assert(err1 == nil).IsTrue() - g.Assert(err2 == nil).IsTrue() - g.Assert(err3 == nil).IsFalse() - }) - }) -} diff --git a/router/router.go b/router/router.go index 74e1ef86c..d231c76b1 100644 --- a/router/router.go +++ b/router/router.go @@ -28,7 +28,7 @@ func Load(middleware ...gin.HandlerFunc) http.Handler { e.Use(cache.Perms) e.Use(token.Refresh) - e.GET("/", controller.ShowIndex) + e.GET("/", cache.Repos, controller.ShowIndex) e.GET("/login", controller.ShowLogin) e.GET("/logout", controller.GetLogout) @@ -60,8 +60,8 @@ func Load(middleware ...gin.HandlerFunc) http.Handler { { user.Use(session.MustUser()) user.GET("", controller.GetSelf) - user.GET("/builds", controller.GetFeed) - user.GET("/repos", controller.GetRepos) + // user.GET("/builds", controller.GetFeed) + user.GET("/repos", cache.Repos, controller.GetRepos) user.GET("/repos/remote", cache.Repos, controller.GetRemoteRepos) user.POST("/token", controller.PostToken) } @@ -101,8 +101,6 @@ func Load(middleware ...gin.HandlerFunc) http.Handler { repo.GET("/logs/:number/:job", controller.GetBuildLogs) // requires authenticated user - repo.POST("/starred", session.MustUser(), controller.PostStar) - repo.DELETE("/starred", session.MustUser(), controller.DeleteStar) repo.POST("/encrypt", session.MustUser(), controller.PostSecure) // requires push permissions diff --git a/static/styles/pages/feed.sass b/static/styles/pages/feed.sass index 8eef63e22..bddbb9b91 100644 --- a/static/styles/pages/feed.sass +++ b/static/styles/pages/feed.sass @@ -44,4 +44,14 @@ border-bottom: none; padding-right:0px; padding-left:0px; - width:45px; \ No newline at end of file + width:45px; + +.repo-search + color: #747C84; + border: none; + background-color: #eff1f5; + border-radius: 0px; + padding: 9px 15px; + width: 100%; + margin-bottom: 45px; + border-radius: 2px; \ No newline at end of file diff --git a/static/styles_gen/style.css b/static/styles_gen/style.css index 2e383ac99..1d52d8a7e 100644 --- a/static/styles_gen/style.css +++ b/static/styles_gen/style.css @@ -291,6 +291,8 @@ body.login div.alert { position: fixed; top: 0px; left: 0px; right: 0px; line-he .repo-row .card-header { background: #FFF; border-bottom: none; padding-right: 0px; padding-left: 0px; width: 45px; } +.repo-search { color: #747C84; border: none; background-color: #eff1f5; border-radius: 0px; padding: 9px 15px; width: 100%; margin-bottom: 45px; border-radius: 2px; } + .toc { list-style-type: none; padding: 0px; margin: 0px; padding-bottom: 40px; } .toc h2 { font-size: 21px; font-weight: normal; margin-bottom: 20px; color: #2b303b; } diff --git a/template/amber/base.amber b/template/amber/base.amber index 4784f80b7..6bb2e2958 100644 --- a/template/amber/base.amber +++ b/template/amber/base.amber @@ -50,6 +50,7 @@ html block scripts script[type="text/javascript"][src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"] script[type="text/javascript"][src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.6/moment.min.js"] + script[type="text/javascript"][src="https://cdnjs.cloudflare.com/ajax/libs/jquery-searcher/0.2.0/jquery.searcher.min.js"] script[type="text/javascript"][src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha/js/bootstrap.min.js"] script[type="text/javascript"][src="https://cdnjs.cloudflare.com/ajax/libs/typeahead.js/0.11.1/typeahead.bundle.min.js"] script[text="text/javascript"][src="https://cdnjs.cloudflare.com/ajax/libs/stickyfill/1.1.2/stickyfill.js"] diff --git a/template/amber/repos.amber b/template/amber/repos.amber index b23b5fc0b..dbb4c046b 100644 --- a/template/amber/repos.amber +++ b/template/amber/repos.amber @@ -14,10 +14,22 @@ block content | Your repository list is empty. div.row.repo-row - each $repo in Repos - div.col-sm-4 - a.card[href="/"+$repo.FullName] - div.card-header - img.avatar[src=$repo.Avatar] - div.card-block - h3.login #{$repo.Name} \ No newline at end of file + input.repo-search[type="search"][placeholder="Filter..."] + div.repo-list + each $repo in Repos + div.col-sm-4 + a.card[href="/"+$repo.FullName] + div.card-header + img.avatar[src=$repo.Avatar] + div.card-block + h3.login #{$repo.Name} +block append scripts + if len(Repos) != 0 + script + $(window).load(function(){ + $(".repo-list").searcher({ + itemSelector: ".col-sm-4", + textSelector: ".login", + inputSelector: ".repo-search" + }); + });