Skip to content

Commit 94bccbb

Browse files
committed
Finish edit and remove web hook
1 parent 24f614f commit 94bccbb

File tree

7 files changed

+159
-53
lines changed

7 files changed

+159
-53
lines changed

cmd/web.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -165,21 +165,22 @@ func runWeb(*cli.Context) {
165165
m.Get("/template/**", dev.TemplatePreview)
166166
}
167167

168-
reqOwner := middleware.RequireOwner
168+
reqOwner := middleware.RequireOwner()
169169

170170
m.Group("/:username/:reponame", func(r martini.Router) {
171171
r.Get("/settings", repo.Setting)
172172
r.Post("/settings", bindIgnErr(auth.RepoSettingForm{}), repo.SettingPost)
173173
r.Get("/settings/collaboration", repo.Collaboration)
174174
r.Post("/settings/collaboration", repo.CollaborationPost)
175-
r.Get("/settings/hooks", repo.WebHooks) // TODO
175+
r.Get("/settings/hooks", repo.WebHooks)
176176
r.Get("/settings/hooks/add", repo.WebHooksAdd)
177177
r.Post("/settings/hooks/add", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksAddPost)
178-
r.Get("/settings/hooks/id", repo.WebHooksEdit)
179-
}, reqSignIn, middleware.RepoAssignment(true), reqOwner())
178+
r.Get("/settings/hooks/:id", repo.WebHooksEdit)
179+
r.Post("/settings/hooks/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost)
180+
}, reqSignIn, middleware.RepoAssignment(true), reqOwner)
180181

181182
m.Group("/:username/:reponame", func(r martini.Router) {
182-
r.Get("/action/:action", repo.Action)
183+
r.Get("/action/:action", repo.Action) // TODO
183184
r.Get("/issues/new", repo.CreateIssue)
184185
r.Post("/issues/new", bindIgnErr(auth.CreateIssueForm{}), repo.CreateIssuePost)
185186
r.Post("/issues/:index", bindIgnErr(auth.CreateIssueForm{}), repo.UpdateIssue)

models/repo.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -690,7 +690,7 @@ func GetRepositoryById(id int64) (*Repository, error) {
690690
} else if !has {
691691
return nil, ErrRepoNotExist
692692
}
693-
return repo, err
693+
return repo, nil
694694
}
695695

696696
// GetRepositories returns the list of repositories of given user.

models/webhook.go

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,15 @@ package models
66

77
import (
88
"encoding/json"
9+
"errors"
910

1011
"github.com/gogits/gogs/modules/log"
1112
)
1213

14+
var (
15+
ErrWebhookNotExist = errors.New("Webhook does not exist")
16+
)
17+
1318
// Content types.
1419
const (
1520
CT_JSON = iota + 1
@@ -27,20 +32,20 @@ type Webhook struct {
2732
ContentType int
2833
Secret string `xorm:"TEXT"`
2934
Events string `xorm:"TEXT"`
35+
*HookEvent `xorm:"-"`
3036
IsSsl bool
3137
IsActive bool
3238
}
3339

34-
func (w *Webhook) GetEvent() *HookEvent {
35-
h := &HookEvent{}
36-
if err := json.Unmarshal([]byte(w.Events), h); err != nil {
40+
func (w *Webhook) GetEvent() {
41+
w.HookEvent = &HookEvent{}
42+
if err := json.Unmarshal([]byte(w.Events), w.HookEvent); err != nil {
3743
log.Error("webhook.GetEvent(%d): %v", w.Id, err)
3844
}
39-
return h
4045
}
4146

42-
func (w *Webhook) SaveEvent(h *HookEvent) error {
43-
data, err := json.Marshal(h)
47+
func (w *Webhook) SaveEvent() error {
48+
data, err := json.Marshal(w.HookEvent)
4449
w.Events = string(data)
4550
return err
4651
}
@@ -51,8 +56,32 @@ func CreateWebhook(w *Webhook) error {
5156
return err
5257
}
5358

59+
// UpdateWebhook updates information of webhook.
60+
func UpdateWebhook(w *Webhook) error {
61+
_, err := orm.AllCols().Update(w)
62+
return err
63+
}
64+
65+
// GetWebhookById returns webhook by given ID.
66+
func GetWebhookById(hookId int64) (*Webhook, error) {
67+
w := &Webhook{Id: hookId}
68+
has, err := orm.Get(w)
69+
if err != nil {
70+
return nil, err
71+
} else if !has {
72+
return nil, ErrWebhookNotExist
73+
}
74+
return w, nil
75+
}
76+
5477
// GetWebhooksByRepoId returns all webhooks of repository.
5578
func GetWebhooksByRepoId(repoId int64) (ws []*Webhook, err error) {
5679
err = orm.Find(&ws, &Webhook{RepoId: repoId})
5780
return ws, err
5881
}
82+
83+
// DeleteWebhook deletes webhook of repository.
84+
func DeleteWebhook(hookId int64) error {
85+
_, err := orm.Delete(&Webhook{Id: hookId})
86+
return err
87+
}

routers/repo/setting.go

Lines changed: 100 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import (
88
"fmt"
99
"strings"
1010

11+
"github.com/go-martini/martini"
12+
1113
"github.com/gogits/git"
1214

1315
"github.com/gogits/gogs/models"
@@ -39,13 +41,13 @@ func SettingPost(ctx *middleware.Context, form auth.RepoSettingForm) {
3941
if ctx.Repo.Repository.Name != newRepoName {
4042
isExist, err := models.IsRepositoryExist(ctx.Repo.Owner, newRepoName)
4143
if err != nil {
42-
ctx.Handle(500, "repo.SettingPost(update: check existence)", err)
44+
ctx.Handle(500, "setting.SettingPost(update: check existence)", err)
4345
return
4446
} else if isExist {
4547
ctx.RenderWithErr("Repository name has been taken in your repositories.", "repo/setting", nil)
4648
return
4749
} else if err = models.ChangeRepositoryName(ctx.Repo.Owner.Name, ctx.Repo.Repository.Name, newRepoName); err != nil {
48-
ctx.Handle(500, "repo.SettingPost(change repository name)", err)
50+
ctx.Handle(500, "setting.SettingPost(change repository name)", err)
4951
return
5052
}
5153
log.Trace("%s Repository name changed: %s/%s -> %s", ctx.Req.RequestURI, ctx.User.Name, ctx.Repo.Repository.Name, newRepoName)
@@ -63,7 +65,7 @@ func SettingPost(ctx *middleware.Context, form auth.RepoSettingForm) {
6365
ctx.Repo.Repository.IsPrivate = form.Private
6466
ctx.Repo.Repository.IsGoget = form.GoGet
6567
if err := models.UpdateRepository(ctx.Repo.Repository); err != nil {
66-
ctx.Handle(404, "repo.SettingPost(update)", err)
68+
ctx.Handle(404, "setting.SettingPost(update)", err)
6769
return
6870
}
6971
log.Trace("%s Repository updated: %s/%s", ctx.Req.RequestURI, ctx.Repo.Owner.Name, ctx.Repo.Repository.Name)
@@ -72,7 +74,7 @@ func SettingPost(ctx *middleware.Context, form auth.RepoSettingForm) {
7274
if form.Interval > 0 {
7375
ctx.Repo.Mirror.Interval = form.Interval
7476
if err := models.UpdateMirror(ctx.Repo.Mirror); err != nil {
75-
log.Error("repo.SettingPost(UpdateMirror): %v", err)
77+
log.Error("setting.SettingPost(UpdateMirror): %v", err)
7678
}
7779
}
7880
}
@@ -89,13 +91,13 @@ func SettingPost(ctx *middleware.Context, form auth.RepoSettingForm) {
8991
// Check if new owner exists.
9092
isExist, err := models.IsUserExist(newOwner)
9193
if err != nil {
92-
ctx.Handle(500, "repo.SettingPost(transfer: check existence)", err)
94+
ctx.Handle(500, "setting.SettingPost(transfer: check existence)", err)
9395
return
9496
} else if !isExist {
9597
ctx.RenderWithErr("Please make sure you entered owner name is correct.", "repo/setting", nil)
9698
return
9799
} else if err = models.TransferOwnership(ctx.User, newOwner, ctx.Repo.Repository); err != nil {
98-
ctx.Handle(500, "repo.SettingPost(transfer repository)", err)
100+
ctx.Handle(500, "setting.SettingPost(transfer repository)", err)
99101
return
100102
}
101103
log.Trace("%s Repository transfered: %s/%s -> %s", ctx.Req.RequestURI, ctx.User.Name, ctx.Repo.Repository.Name, newOwner)
@@ -108,7 +110,7 @@ func SettingPost(ctx *middleware.Context, form auth.RepoSettingForm) {
108110
}
109111

110112
if err := models.DeleteRepository(ctx.User.Id, ctx.Repo.Repository.Id, ctx.User.LowerName); err != nil {
111-
ctx.Handle(500, "repo.Delete", err)
113+
ctx.Handle(500, "setting.Delete", err)
112114
return
113115
}
114116
log.Trace("%s Repository deleted: %s/%s", ctx.Req.RequestURI, ctx.User.LowerName, ctx.Repo.Repository.LowerName)
@@ -126,7 +128,7 @@ func Collaboration(ctx *middleware.Context) {
126128
remove := strings.ToLower(ctx.Query("remove"))
127129
if len(remove) > 0 && remove != ctx.Repo.Owner.LowerName {
128130
if err := models.DeleteAccess(&models.Access{UserName: remove, RepoName: repoLink}); err != nil {
129-
ctx.Handle(500, "repo.Collaboration(DeleteAccess)", err)
131+
ctx.Handle(500, "setting.Collaboration(DeleteAccess)", err)
130132
return
131133
}
132134
ctx.Flash.Success("Collaborator has been removed.")
@@ -136,15 +138,15 @@ func Collaboration(ctx *middleware.Context) {
136138

137139
names, err := models.GetCollaborators(repoLink)
138140
if err != nil {
139-
ctx.Handle(500, "repo.Collaboration(GetCollaborators)", err)
141+
ctx.Handle(500, "setting.Collaboration(GetCollaborators)", err)
140142
return
141143
}
142144

143145
us := make([]*models.User, len(names))
144146
for i, name := range names {
145147
us[i], err = models.GetUserByName(name)
146148
if err != nil {
147-
ctx.Handle(500, "repo.Collaboration(GetUserByName)", err)
149+
ctx.Handle(500, "setting.Collaboration(GetUserByName)", err)
148150
return
149151
}
150152
}
@@ -162,7 +164,7 @@ func CollaborationPost(ctx *middleware.Context) {
162164
}
163165
has, err := models.HasAccess(name, repoLink, models.AU_WRITABLE)
164166
if err != nil {
165-
ctx.Handle(500, "repo.CollaborationPost(HasAccess)", err)
167+
ctx.Handle(500, "setting.CollaborationPost(HasAccess)", err)
166168
return
167169
} else if has {
168170
ctx.Redirect(ctx.Req.RequestURI)
@@ -175,20 +177,20 @@ func CollaborationPost(ctx *middleware.Context) {
175177
ctx.Flash.Error("Given user does not exist.")
176178
ctx.Redirect(ctx.Req.RequestURI)
177179
} else {
178-
ctx.Handle(500, "repo.CollaborationPost(GetUserByName)", err)
180+
ctx.Handle(500, "setting.CollaborationPost(GetUserByName)", err)
179181
}
180182
return
181183
}
182184

183185
if err = models.AddAccess(&models.Access{UserName: name, RepoName: repoLink,
184186
Mode: models.AU_WRITABLE}); err != nil {
185-
ctx.Handle(500, "repo.CollaborationPost(AddAccess)", err)
187+
ctx.Handle(500, "setting.CollaborationPost(AddAccess)", err)
186188
return
187189
}
188190

189191
if base.Service.NotifyMail {
190192
if err = mailer.SendCollaboratorMail(ctx.Render, u, ctx.User, ctx.Repo.Repository); err != nil {
191-
ctx.Handle(500, "repo.CollaborationPost(SendCollaboratorMail)", err)
193+
ctx.Handle(500, "setting.CollaborationPost(SendCollaboratorMail)", err)
192194
return
193195
}
194196
}
@@ -201,9 +203,21 @@ func WebHooks(ctx *middleware.Context) {
201203
ctx.Data["IsRepoToolbarWebHooks"] = true
202204
ctx.Data["Title"] = strings.TrimPrefix(ctx.Repo.RepoLink, "/") + " - Webhooks"
203205

206+
// Delete webhook.
207+
remove, _ := base.StrTo(ctx.Query("remove")).Int64()
208+
if remove > 0 {
209+
if err := models.DeleteWebhook(remove); err != nil {
210+
ctx.Handle(500, "setting.WebHooks(DeleteWebhook)", err)
211+
return
212+
}
213+
ctx.Flash.Success("Webhook has been removed.")
214+
ctx.Redirect(ctx.Repo.RepoLink + "/settings/hooks")
215+
return
216+
}
217+
204218
ws, err := models.GetWebhooksByRepoId(ctx.Repo.Repository.Id)
205219
if err != nil {
206-
ctx.Handle(500, "repo.WebHooks(GetWebhooksByRepoId)", err)
220+
ctx.Handle(500, "setting.WebHooks(GetWebhooksByRepoId)", err)
207221
return
208222
}
209223

@@ -227,7 +241,7 @@ func WebHooksAddPost(ctx *middleware.Context, form auth.NewWebhookForm) {
227241
}
228242

229243
ct := models.CT_JSON
230-
if form.ContentType == "form" {
244+
if form.ContentType == "2" {
231245
ct = models.CT_FORM
232246
}
233247

@@ -236,25 +250,87 @@ func WebHooksAddPost(ctx *middleware.Context, form auth.NewWebhookForm) {
236250
Payload: form.Url,
237251
ContentType: ct,
238252
Secret: form.Secret,
239-
IsActive: form.Active,
253+
HookEvent: &models.HookEvent{
254+
PushOnly: form.PushOnly,
255+
},
256+
IsActive: form.Active,
240257
}
241-
h := &models.HookEvent{
242-
PushOnly: form.PushOnly,
243-
}
244-
if err := w.SaveEvent(h); err != nil {
245-
ctx.Handle(500, "repo.WebHooksAddPost(SaveEvent)", err)
258+
if err := w.SaveEvent(); err != nil {
259+
ctx.Handle(500, "setting.WebHooksAddPost(SaveEvent)", err)
246260
return
247261
} else if err := models.CreateWebhook(w); err != nil {
248-
ctx.Handle(500, "repo.WebHooksAddPost(CreateWebhook)", err)
262+
ctx.Handle(500, "setting.WebHooksAddPost(CreateWebhook)", err)
249263
return
250264
}
251265

252266
ctx.Flash.Success("New webhook has been added.")
253267
ctx.Redirect(ctx.Repo.RepoLink + "/settings/hooks")
254268
}
255269

256-
func WebHooksEdit(ctx *middleware.Context) {
270+
func WebHooksEdit(ctx *middleware.Context, params martini.Params) {
257271
ctx.Data["IsRepoToolbarWebHooks"] = true
258272
ctx.Data["Title"] = strings.TrimPrefix(ctx.Repo.RepoLink, "/") + " - Webhook"
273+
274+
hookId, _ := base.StrTo(params["id"]).Int64()
275+
if hookId == 0 {
276+
ctx.Handle(404, "setting.WebHooksEdit", nil)
277+
return
278+
}
279+
280+
w, err := models.GetWebhookById(hookId)
281+
if err != nil {
282+
if err == models.ErrWebhookNotExist {
283+
ctx.Handle(404, "setting.WebHooksEdit(GetWebhookById)", nil)
284+
} else {
285+
ctx.Handle(500, "setting.WebHooksEdit(GetWebhookById)", err)
286+
}
287+
return
288+
}
289+
290+
w.GetEvent()
291+
ctx.Data["Webhook"] = w
259292
ctx.HTML(200, "repo/hooks_edit")
260293
}
294+
295+
func WebHooksEditPost(ctx *middleware.Context, params martini.Params, form auth.NewWebhookForm) {
296+
ctx.Data["IsRepoToolbarWebHooks"] = true
297+
ctx.Data["Title"] = strings.TrimPrefix(ctx.Repo.RepoLink, "/") + " - Webhook"
298+
299+
if ctx.HasError() {
300+
ctx.HTML(200, "repo/hooks_add")
301+
return
302+
}
303+
304+
hookId, _ := base.StrTo(params["id"]).Int64()
305+
if hookId == 0 {
306+
ctx.Handle(404, "setting.WebHooksEditPost", nil)
307+
return
308+
}
309+
310+
ct := models.CT_JSON
311+
if form.ContentType == "2" {
312+
ct = models.CT_FORM
313+
}
314+
315+
w := &models.Webhook{
316+
Id: hookId,
317+
RepoId: ctx.Repo.Repository.Id,
318+
Payload: form.Url,
319+
ContentType: ct,
320+
Secret: form.Secret,
321+
HookEvent: &models.HookEvent{
322+
PushOnly: form.PushOnly,
323+
},
324+
IsActive: form.Active,
325+
}
326+
if err := w.SaveEvent(); err != nil {
327+
ctx.Handle(500, "setting.WebHooksEditPost(SaveEvent)", err)
328+
return
329+
} else if err := models.UpdateWebhook(w); err != nil {
330+
ctx.Handle(500, "setting.WebHooksEditPost(WebHooksEditPost)", err)
331+
return
332+
}
333+
334+
ctx.Flash.Success("Webhook has been updated.")
335+
ctx.Redirect(fmt.Sprintf("%s/settings/hooks/%d", ctx.Repo.RepoLink, hookId))
336+
}

templates/repo/hooks.tmpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<ul id="repo-hooks-list" class="list-unstyled">
1616
{{range .Webhooks}}
1717
<li>
18-
<span class="pull-left status text-success"><i class="fa fa-check"></i></span>
18+
{{if .IsActive}}<span class="pull-left status text-success"><i class="fa fa-check"></i></span>{{else}}<span class="pull-left status"><i class="fa fa-times"></i></span>{{end}}
1919
<a class="link" href="{{$.RepoLink}}/settings/hooks/{{.Id}}">{{.Payload}}</a>
2020
<a href="{{$.RepoLink}}/settings/hooks?remove={{.Id}}" class="remove-hook pull-right"><i class="fa fa-times"></i></a>
2121
<a href="{{$.RepoLink}}/settings/hooks/{{.Id}}" class="edit-hook pull-right"><i class="fa fa-pencil"></i></a>

0 commit comments

Comments
 (0)