Browse Source

fix repo setting and delete repo

slene 11 years ago
parent
commit
3a2eee0827
7 changed files with 77 additions and 75 deletions
  1. 3 0
      models/repo.go
  2. 0 7
      modules/auth/repo.go
  3. 20 34
      routers/repo/repo.go
  4. 2 1
      routers/repo/single.go
  5. 0 12
      templates/repo/delete.tmpl
  6. 49 19
      templates/repo/setting.tmpl
  7. 3 2
      web.go

+ 3 - 0
models/repo.go

@@ -307,6 +307,9 @@ func DeleteRepository(userId, repoId int64, userName string) (err error) {
 	}
 
 	session := orm.NewSession()
+	if err = session.Begin(); err != nil {
+		return err
+	}
 	if _, err = session.Delete(&Repository{Id: repoId}); err != nil {
 		session.Rollback()
 		return err

+ 0 - 7
modules/auth/repo.go

@@ -17,7 +17,6 @@ import (
 )
 
 type CreateRepoForm struct {
-	UserId      int64  `form:"userId"`
 	RepoName    string `form:"repo" binding:"Required;AlphaDash"`
 	Visibility  string `form:"visibility"`
 	Description string `form:"desc" binding:"MaxSize(100)"`
@@ -52,9 +51,3 @@ func (f *CreateRepoForm) Validate(errors *binding.Errors, req *http.Request, con
 
 	validate(errors, data, f)
 }
-
-type DeleteRepoForm struct {
-	UserId   int64  `form:"userId" binding:"Required"`
-	UserName string `form:"userName" binding:"Required"`
-	RepoId   int64  `form:"repoId" binding:"Required"`
-}

+ 20 - 34
routers/repo/repo.go

@@ -20,49 +20,35 @@ func Create(ctx *middleware.Context, form auth.CreateRepoForm) {
 		return
 	}
 
-	if ctx.HasError() {
-		ctx.Render.HTML(200, "repo/create", ctx.Data)
+	if _, err := models.CreateRepository(ctx.User,
+		form.RepoName, form.Description, form.Language, form.License,
+		form.Visibility == "private", form.InitReadme == "on"); err == nil {
+		ctx.Render.Redirect("/"+ctx.User.Name+"/"+form.RepoName, 302)
 		return
-	}
-
-	// TODO: access check
-
-	user, err := models.GetUserById(form.UserId)
-	if err != nil {
-		if err.Error() == models.ErrUserNotExist.Error() {
-			ctx.RenderWithErr("User does not exist", "repo/create", &form)
-			return
-		}
-	}
-
-	if err == nil {
-		if _, err = models.CreateRepository(user,
-			form.RepoName, form.Description, form.Language, form.License,
-			form.Visibility == "private", form.InitReadme == "on"); err == nil {
-			ctx.Render.Redirect("/"+user.Name+"/"+form.RepoName, 302)
-			return
-		}
-	}
-
-	if err.Error() == models.ErrRepoAlreadyExist.Error() {
+	} else if err == models.ErrRepoAlreadyExist {
 		ctx.RenderWithErr("Repository name has already been used", "repo/create", &form)
 		return
 	}
-
-	ctx.Handle(200, "repo.Create", err)
 }
 
-func Delete(ctx *middleware.Context, form auth.DeleteRepoForm) {
-	ctx.Data["Title"] = "Delete repository"
-
-	if ctx.Req.Method == "GET" {
-		ctx.Render.HTML(200, "repo/delete", ctx.Data)
+func SettingPost(ctx *middleware.Context) {
+	if !ctx.Repo.IsOwner {
+		ctx.Render.Error(404)
 		return
 	}
 
-	if err := models.DeleteRepository(form.UserId, form.RepoId, form.UserName); err != nil {
-		ctx.Handle(200, "repo.Delete", err)
-		return
+	switch ctx.Query("action") {
+	case "delete":
+		if len(ctx.Repo.Repository.Name) == 0 || ctx.Repo.Repository.Name != ctx.Query("repository") {
+			ctx.Data["ErrorMsg"] = "Please make sure you entered repository name is correct."
+			ctx.Render.HTML(200, "repo/setting", ctx.Data)
+			return
+		}
+
+		if err := models.DeleteRepository(ctx.User.Id, ctx.Repo.Repository.Id, ctx.User.LowerName); err != nil {
+			ctx.Handle(200, "repo.Delete", err)
+			return
+		}
 	}
 
 	ctx.Render.Redirect("/", 302)

+ 2 - 1
routers/repo/single.go

@@ -65,7 +65,8 @@ func Single(ctx *middleware.Context, params martini.Params) {
 }
 
 func Setting(ctx *middleware.Context, params martini.Params) {
-	if !ctx.Repo.IsValid {
+	if !ctx.Repo.IsOwner {
+		ctx.Render.Error(404)
 		return
 	}
 

+ 0 - 12
templates/repo/delete.tmpl

@@ -1,12 +0,0 @@
-{{template "base/head" .}}
-{{template "base/navbar" .}}
-<div class="container">
-	<form action="/repo/delete" method="post" class="form-horizontal">
-		<div class="form-group">
-		    <div class="col-md-offset-4 col-md-3">
-		    	<button type="submit" class="btn btn-danger">Delete repository</button>
-		    </div>
-		</div>
-	</form>
-</div>
-{{template "base/footer" .}}

+ 49 - 19
templates/repo/setting.tmpl

@@ -4,30 +4,60 @@
 {{template "repo/toolbar" .}}
 <div id="gogs-body" class="container">
     <div id="gogs-user-setting-nav" class="col-md-3">
-        <h4>Repository Settings</h4>
         <ul class="list-group" data-init="tabs">
-            <li class="list-group-item"><a href="#options" data-toggle="tab">Options</a></li>
-            <!--<li class="list-group-item" data-toggle="tab"><a href="#">Collaborators</a></li>
-            <li class="list-group-item" data-toggle="tab"><a href="#">Notifications</a></li>-->
-            <li class="list-group-item"><a href="#delete" data-toggle="tab">Delete</a></li>
+            <li class="list-group-item active"><a href="/{{.Owner.Name}}/{{.Repository.Name}}/settings">Options</a></li>
+            <!--<li class="list-group-item"><a href="#">Collaborators</a></li>
+            <li class="list-group-item"><a href="#">Notifications</a></li>-->
         </ul>
     </div>
-    <div id="gogs-repo-setting-container" class="col-md-9 tab-content">
-        <div id="options" class="tab-pane">
-            <h4>Repository Options</h4>
+    <div id="gogs-repo-setting-container" class="col-md-9">
+        {{if .ErrorMsg}}<p class="alert alert-danger">{{.ErrorMsg}}</p>{{end}}
+        <div class="panel panel-default">
+            <div class="panel-heading">
+                Repository Options
+            </div>
+            <div class="panel-body">
+                
+            </div>
         </div>
-        <div id="delete" class="tab-pane">
-            <h4>Delete Repository</h4>
-            <p class="alert alert-warning">Unexpected bad things will happen if you don't read this!</p>
-            <p>This action <strong>CANNOT</strong> be undone. This will delete the repository, wiki, issues, and comments permanently. </p>
+        <div class="panel panel-warning">
+            <div class="panel-heading">
+                Danger Zone
+            </div>
+            <div class="panel-body">
+                <button type="button" class="btn btn-default pull-right" href="#delete-repository-modal" data-toggle="modal">
+                    Delete this repository
+                </button>
+                <dd>
+                    <dt>Delete this repository.</dt>
+                    <dl>Once you delete a repository, there is no going back. Please be certain.</dl>
+                </dd>
 
-            <form action="/repo/delete" method="post">
-                <input type="hidden" name="userId" value="{{.Owner.Id}}"/>
-                <input type="hidden" name="userName" value="{{.Owner.Name}}"/>
-                <input type="hidden" name="repoId" value="{{.Repository.Id}}"/>
-                <hr/>
-                <button class="btn btn-danger btn-lg">I understand the consequences, delete this repository</button>
-            </form>
+                <div class="modal fade" id="delete-repository-modal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+                    <div class="modal-dialog">
+                        <form action="/{{.Owner.Name}}/{{.Repository.Name}}/settings" method="post" class="modal-content">
+                            <input type="hidden" name="action" value="delete">
+
+                            <div class="modal-header">
+                                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+                                <h4 class="modal-title" id="myModalLabel">Delete repository</h4>
+                            </div>
+
+                            <div class="modal-body">
+                                <div class="form-group">
+                                    <label>Please enter your repository name "<strong class="text-danger">{{.Repository.Name}}</strong>"</label>
+                                    <input name="repository" class="form-control" type="text" placeholder="Type your repository name" required="required">
+                                </div>
+                            </div>
+
+                            <div class="modal-footer">
+                                <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+                                <button class="btn btn-danger btn-lg">I understand the consequences, delete this repository</button>
+                            </div>
+                        </form>
+                    </div>
+                </div>
+            </div>
         </div>
     </div>
 </div>

+ 3 - 2
web.go

@@ -68,11 +68,12 @@ func runWeb(*cli.Context) {
 	m.Get("/user/:username", middleware.SignInRequire(false), user.Profile)
 
 	m.Any("/repo/create", middleware.SignInRequire(true), binding.BindIgnErr(auth.CreateRepoForm{}), repo.Create)
-	m.Any("/repo/delete", middleware.SignInRequire(true), binding.Bind(auth.DeleteRepoForm{}), repo.Delete)
 
 	m.Get("/help", routers.Help)
 
-	m.Get("/:username/:reponame/settings", middleware.SignInRequire(false), middleware.RepoAssignment(true), repo.Setting)
+	m.Post("/:username/:reponame/settings", middleware.SignInRequire(true), middleware.RepoAssignment(true), repo.SettingPost)
+	m.Get("/:username/:reponame/settings", middleware.SignInRequire(true), middleware.RepoAssignment(true), repo.Setting)
+
 	m.Get("/:username/:reponame/commits", middleware.SignInRequire(false), middleware.RepoAssignment(true), repo.Commits)
 	m.Get("/:username/:reponame/issues", middleware.SignInRequire(false), middleware.RepoAssignment(true), repo.Issues)
 	m.Get("/:username/:reponame/pulls", middleware.SignInRequire(false), middleware.RepoAssignment(true), repo.Pulls)