-
-
Notifications
You must be signed in to change notification settings - Fork 5.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add API for Issue set Subscription (#8729)
* add issue subscriber API * subscribers return []user.APIFormat * add comments * more meaningfull description * without "reqToken()" api works ... * should be still secure beause ctx.user has to be there or nothing will hapen * FIX: getIssueWatchers() get only aktive suscriber * add return avter error on right position * Revert "FIX: getIssueWatchers() get only aktive suscriber" This reverts commit 5eca929. * Update routers/api/v1/repo/issue.go Co-Authored-By: guillep2k <[email protected]> * test go linter again * update swagger * GetIssueWatchers -> GetIssueSubscribers part one Co-Authored-By: guillep2k <[email protected]> * GetIssueWatchers -> GetIssueSubscribers part two * Revert "test go linter again" This reverts commit bab1235. * change description for unsubscribe too * golangci-lint timeout avter 5min * move issueSubscription to seperate file * dont create black entitys * use IsWatching until refactoring * Update License Info * better swagger description * Update .golangci.yml because functions moved from issue.go to issue_subscription.go * add IssueWatchList type * batch tasks * use e Engien * add error handling * error should be the last type when returning multiple items * short version * reurn empy UserList instead of nil
- Loading branch information
Showing
7 changed files
with
425 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,216 @@ | ||
// Copyright 2019 The Gitea Authors. All rights reserved. | ||
// Use of this source code is governed by a MIT-style | ||
// license that can be found in the LICENSE file. | ||
|
||
package repo | ||
|
||
import ( | ||
"code.gitea.io/gitea/models" | ||
"code.gitea.io/gitea/modules/context" | ||
api "code.gitea.io/gitea/modules/structs" | ||
) | ||
|
||
// AddIssueSubscription Subscribe user to issue | ||
func AddIssueSubscription(ctx *context.APIContext) { | ||
// swagger:operation PUT /repos/{owner}/{repo}/issues/{index}/subscriptions/{user} issue issueAddSubscription | ||
// --- | ||
// summary: Subscribe user to issue | ||
// consumes: | ||
// - application/json | ||
// produces: | ||
// - application/json | ||
// parameters: | ||
// - name: owner | ||
// in: path | ||
// description: owner of the repo | ||
// type: string | ||
// required: true | ||
// - name: repo | ||
// in: path | ||
// description: name of the repo | ||
// type: string | ||
// required: true | ||
// - name: index | ||
// in: path | ||
// description: index of the issue | ||
// type: integer | ||
// format: int64 | ||
// required: true | ||
// - name: user | ||
// in: path | ||
// description: user to subscribe | ||
// type: string | ||
// required: true | ||
// responses: | ||
// "201": | ||
// "$ref": "#/responses/empty" | ||
// "304": | ||
// description: User can only subscribe itself if he is no admin | ||
// "404": | ||
// description: Issue not found | ||
issue, err := models.GetIssueByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index")) | ||
if err != nil { | ||
if models.IsErrIssueNotExist(err) { | ||
ctx.NotFound() | ||
} else { | ||
ctx.Error(500, "GetIssueByIndex", err) | ||
} | ||
|
||
return | ||
} | ||
|
||
user, err := models.GetUserByName(ctx.Params(":user")) | ||
if err != nil { | ||
if models.IsErrUserNotExist(err) { | ||
ctx.NotFound() | ||
} else { | ||
ctx.Error(500, "GetUserByName", err) | ||
} | ||
|
||
return | ||
} | ||
|
||
//only admin and user for itself can change subscription | ||
if user.ID != ctx.User.ID && !ctx.User.IsAdmin { | ||
ctx.Error(403, "User", nil) | ||
return | ||
} | ||
|
||
if err := models.CreateOrUpdateIssueWatch(user.ID, issue.ID, true); err != nil { | ||
ctx.Error(500, "CreateOrUpdateIssueWatch", err) | ||
return | ||
} | ||
|
||
ctx.Status(201) | ||
} | ||
|
||
// DelIssueSubscription Unsubscribe user from issue | ||
func DelIssueSubscription(ctx *context.APIContext) { | ||
// swagger:operation DELETE /repos/{owner}/{repo}/issues/{index}/subscriptions/{user} issue issueDeleteSubscription | ||
// --- | ||
// summary: Unsubscribe user from issue | ||
// consumes: | ||
// - application/json | ||
// produces: | ||
// - application/json | ||
// parameters: | ||
// - name: owner | ||
// in: path | ||
// description: owner of the repo | ||
// type: string | ||
// required: true | ||
// - name: repo | ||
// in: path | ||
// description: name of the repo | ||
// type: string | ||
// required: true | ||
// - name: index | ||
// in: path | ||
// description: index of the issue | ||
// type: integer | ||
// format: int64 | ||
// required: true | ||
// - name: user | ||
// in: path | ||
// description: user witch unsubscribe | ||
// type: string | ||
// required: true | ||
// responses: | ||
// "201": | ||
// "$ref": "#/responses/empty" | ||
// "304": | ||
// description: User can only subscribe itself if he is no admin | ||
// "404": | ||
// description: Issue not found | ||
issue, err := models.GetIssueByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index")) | ||
if err != nil { | ||
if models.IsErrIssueNotExist(err) { | ||
ctx.NotFound() | ||
} else { | ||
ctx.Error(500, "GetIssueByIndex", err) | ||
} | ||
|
||
return | ||
} | ||
|
||
user, err := models.GetUserByName(ctx.Params(":user")) | ||
if err != nil { | ||
if models.IsErrUserNotExist(err) { | ||
ctx.NotFound() | ||
} else { | ||
ctx.Error(500, "GetUserByName", err) | ||
} | ||
|
||
return | ||
} | ||
|
||
//only admin and user for itself can change subscription | ||
if user.ID != ctx.User.ID && !ctx.User.IsAdmin { | ||
ctx.Error(403, "User", nil) | ||
return | ||
} | ||
|
||
if err := models.CreateOrUpdateIssueWatch(user.ID, issue.ID, false); err != nil { | ||
ctx.Error(500, "CreateOrUpdateIssueWatch", err) | ||
return | ||
} | ||
|
||
ctx.Status(201) | ||
} | ||
|
||
// GetIssueSubscribers return subscribers of an issue | ||
func GetIssueSubscribers(ctx *context.APIContext, form api.User) { | ||
// swagger:operation GET /repos/{owner}/{repo}/issues/{index}/subscriptions issue issueSubscriptions | ||
// --- | ||
// summary: Get users who subscribed on an issue. | ||
// consumes: | ||
// - application/json | ||
// produces: | ||
// - application/json | ||
// parameters: | ||
// - name: owner | ||
// in: path | ||
// description: owner of the repo | ||
// type: string | ||
// required: true | ||
// - name: repo | ||
// in: path | ||
// description: name of the repo | ||
// type: string | ||
// required: true | ||
// - name: index | ||
// in: path | ||
// description: index of the issue | ||
// type: integer | ||
// format: int64 | ||
// required: true | ||
// responses: | ||
// "201": | ||
// "$ref": "#/responses/empty" | ||
// "404": | ||
// description: Issue not found | ||
issue, err := models.GetIssueByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index")) | ||
if err != nil { | ||
if models.IsErrIssueNotExist(err) { | ||
ctx.NotFound() | ||
} else { | ||
ctx.Error(500, "GetIssueByIndex", err) | ||
} | ||
|
||
return | ||
} | ||
|
||
iwl, err := models.GetIssueWatchers(issue.ID) | ||
if err != nil { | ||
ctx.Error(500, "GetIssueWatchers", err) | ||
return | ||
} | ||
|
||
users, err := iwl.LoadWatchUsers() | ||
if err != nil { | ||
ctx.Error(500, "LoadWatchUsers", err) | ||
return | ||
} | ||
|
||
ctx.JSON(200, users.APIFormat()) | ||
} |
Oops, something went wrong.