2019-11-02 18:27:49 +03:00
// 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 (
2019-12-20 20:07:12 +03:00
"net/http"
2019-11-02 18:27:49 +03:00
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/context"
2020-04-21 16:48:53 +03:00
api "code.gitea.io/gitea/modules/structs"
2020-01-24 22:00:29 +03:00
"code.gitea.io/gitea/routers/api/v1/utils"
2019-11-02 18:27:49 +03:00
)
// 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:
2020-05-01 01:55:24 +03:00
// "200":
// description: Already subscribed
2019-11-02 18:27:49 +03:00
// "201":
2020-05-01 01:55:24 +03:00
// description: Successfully Subscribed
2019-11-02 18:27:49 +03:00
// "304":
// description: User can only subscribe itself if he is no admin
// "404":
2019-12-20 20:07:12 +03:00
// "$ref": "#/responses/notFound"
2019-11-20 17:50:54 +03:00
setIssueSubscription ( ctx , true )
2019-11-02 18:27:49 +03:00
}
// 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:
2020-05-01 01:55:24 +03:00
// "200":
// description: Already unsubscribed
2019-11-02 18:27:49 +03:00
// "201":
2020-05-01 01:55:24 +03:00
// description: Successfully Unsubscribed
2019-11-02 18:27:49 +03:00
// "304":
// description: User can only subscribe itself if he is no admin
// "404":
2019-12-20 20:07:12 +03:00
// "$ref": "#/responses/notFound"
2019-11-20 17:50:54 +03:00
setIssueSubscription ( ctx , false )
}
func setIssueSubscription ( ctx * context . APIContext , watch bool ) {
2019-11-02 18:27:49 +03:00
issue , err := models . GetIssueByIndex ( ctx . Repo . Repository . ID , ctx . ParamsInt64 ( ":index" ) )
if err != nil {
if models . IsErrIssueNotExist ( err ) {
ctx . NotFound ( )
} else {
2019-12-20 20:07:12 +03:00
ctx . Error ( http . StatusInternalServerError , "GetIssueByIndex" , err )
2019-11-02 18:27:49 +03:00
}
return
}
user , err := models . GetUserByName ( ctx . Params ( ":user" ) )
if err != nil {
if models . IsErrUserNotExist ( err ) {
ctx . NotFound ( )
} else {
2019-12-20 20:07:12 +03:00
ctx . Error ( http . StatusInternalServerError , "GetUserByName" , err )
2019-11-02 18:27:49 +03:00
}
return
}
//only admin and user for itself can change subscription
if user . ID != ctx . User . ID && ! ctx . User . IsAdmin {
2019-12-20 20:07:12 +03:00
ctx . Error ( http . StatusForbidden , "User" , nil )
2019-11-02 18:27:49 +03:00
return
}
2020-05-01 01:55:24 +03:00
current , err := models . CheckIssueWatch ( user , issue )
if err != nil {
ctx . Error ( http . StatusInternalServerError , "CheckIssueWatch" , err )
return
}
// If watch state wont change
if current == watch {
ctx . Status ( http . StatusOK )
return
}
// Update watch state
2019-11-20 17:50:54 +03:00
if err := models . CreateOrUpdateIssueWatch ( user . ID , issue . ID , watch ) ; err != nil {
2019-12-20 20:07:12 +03:00
ctx . Error ( http . StatusInternalServerError , "CreateOrUpdateIssueWatch" , err )
2019-11-02 18:27:49 +03:00
return
}
2019-12-20 20:07:12 +03:00
ctx . Status ( http . StatusCreated )
2019-11-02 18:27:49 +03:00
}
2020-04-21 16:48:53 +03:00
// CheckIssueSubscription check if user is subscribed to an issue
func CheckIssueSubscription ( ctx * context . APIContext ) {
// swagger:operation GET /repos/{owner}/{repo}/issues/{index}/subscriptions/check issue issueCheckSubscription
// ---
// summary: Check if user is subscribed to 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:
// "200":
// "$ref": "#/responses/WatchInfo"
// "404":
// "$ref": "#/responses/notFound"
issue , err := models . GetIssueByIndex ( ctx . Repo . Repository . ID , ctx . ParamsInt64 ( ":index" ) )
if err != nil {
if models . IsErrIssueNotExist ( err ) {
ctx . NotFound ( )
} else {
ctx . Error ( http . StatusInternalServerError , "GetIssueByIndex" , err )
}
return
}
watching , err := models . CheckIssueWatch ( ctx . User , issue )
if err != nil {
ctx . InternalServerError ( err )
return
}
ctx . JSON ( http . StatusOK , api . WatchInfo {
Subscribed : watching ,
Ignored : ! watching ,
Reason : nil ,
CreatedAt : issue . CreatedUnix . AsTime ( ) ,
URL : issue . APIURL ( ) + "/subscriptions" ,
RepositoryURL : ctx . Repo . Repository . APIURL ( ) ,
} )
}
2019-11-02 18:27:49 +03:00
// GetIssueSubscribers return subscribers of an issue
2019-11-20 17:50:54 +03:00
func GetIssueSubscribers ( ctx * context . APIContext ) {
2019-11-02 18:27:49 +03:00
// 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
2020-01-24 22:00:29 +03:00
// - name: page
// in: query
// description: page number of results to return (1-based)
// type: integer
// - name: limit
// in: query
// description: page size of results, maximum page size is 50
// type: integer
2019-11-02 18:27:49 +03:00
// responses:
2019-11-20 17:50:54 +03:00
// "200":
// "$ref": "#/responses/UserList"
2019-11-02 18:27:49 +03:00
// "404":
2019-12-20 20:07:12 +03:00
// "$ref": "#/responses/notFound"
2019-11-02 18:27:49 +03:00
issue , err := models . GetIssueByIndex ( ctx . Repo . Repository . ID , ctx . ParamsInt64 ( ":index" ) )
if err != nil {
if models . IsErrIssueNotExist ( err ) {
ctx . NotFound ( )
} else {
2019-12-20 20:07:12 +03:00
ctx . Error ( http . StatusInternalServerError , "GetIssueByIndex" , err )
2019-11-02 18:27:49 +03:00
}
return
}
2020-01-24 22:00:29 +03:00
iwl , err := models . GetIssueWatchers ( issue . ID , utils . GetListOptions ( ctx ) )
2019-11-02 18:27:49 +03:00
if err != nil {
2019-12-20 20:07:12 +03:00
ctx . Error ( http . StatusInternalServerError , "GetIssueWatchers" , err )
2019-11-02 18:27:49 +03:00
return
}
2020-02-26 09:32:22 +03:00
var userIDs = make ( [ ] int64 , 0 , len ( iwl ) )
for _ , iw := range iwl {
userIDs = append ( userIDs , iw . UserID )
}
users , err := models . GetUsersByIDs ( userIDs )
2019-11-02 18:27:49 +03:00
if err != nil {
2020-02-26 09:32:22 +03:00
ctx . Error ( http . StatusInternalServerError , "GetUsersByIDs" , err )
2019-11-02 18:27:49 +03:00
return
}
2019-12-20 20:07:12 +03:00
ctx . JSON ( http . StatusOK , users . APIFormat ( ) )
2019-11-02 18:27:49 +03:00
}