2023-05-25 15:17:19 +02:00
// Copyright 2023 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package repo
import (
"net/http"
issues_model "code.gitea.io/gitea/models/issues"
"code.gitea.io/gitea/modules/json"
2023-05-30 17:26:51 +02:00
"code.gitea.io/gitea/modules/log"
2024-02-27 15:12:22 +08:00
"code.gitea.io/gitea/services/context"
2023-05-25 15:17:19 +02:00
)
// IssuePinOrUnpin pin or unpin a Issue
func IssuePinOrUnpin ( ctx * context . Context ) {
issue := GetActionIssue ( ctx )
2023-07-06 02:52:12 +08:00
if ctx . Written ( ) {
return
}
2023-05-25 15:17:19 +02:00
// If we don't do this, it will crash when trying to add the pin event to the comment history
err := issue . LoadRepo ( ctx )
if err != nil {
ctx . Status ( http . StatusInternalServerError )
2023-05-30 17:26:51 +02:00
log . Error ( err . Error ( ) )
2023-05-25 15:17:19 +02:00
return
}
err = issue . PinOrUnpin ( ctx , ctx . Doer )
if err != nil {
ctx . Status ( http . StatusInternalServerError )
2023-05-30 17:26:51 +02:00
log . Error ( err . Error ( ) )
2023-05-25 15:17:19 +02:00
return
}
2023-06-29 12:16:04 +08:00
ctx . JSONRedirect ( issue . Link ( ) )
2023-05-25 15:17:19 +02:00
}
// IssueUnpin unpins a Issue
func IssueUnpin ( ctx * context . Context ) {
2024-06-19 06:32:45 +08:00
issue , err := issues_model . GetIssueByIndex ( ctx , ctx . Repo . Repository . ID , ctx . PathParamInt64 ( ":index" ) )
2023-05-25 15:17:19 +02:00
if err != nil {
2023-05-30 17:26:51 +02:00
ctx . Status ( http . StatusInternalServerError )
log . Error ( err . Error ( ) )
2023-05-25 15:17:19 +02:00
return
}
// If we don't do this, it will crash when trying to add the pin event to the comment history
err = issue . LoadRepo ( ctx )
if err != nil {
ctx . Status ( http . StatusInternalServerError )
2023-05-30 17:26:51 +02:00
log . Error ( err . Error ( ) )
2023-05-25 15:17:19 +02:00
return
}
err = issue . Unpin ( ctx , ctx . Doer )
if err != nil {
ctx . Status ( http . StatusInternalServerError )
2023-05-30 17:26:51 +02:00
log . Error ( err . Error ( ) )
return
2023-05-25 15:17:19 +02:00
}
ctx . Status ( http . StatusNoContent )
}
// IssuePinMove moves a pinned Issue
func IssuePinMove ( ctx * context . Context ) {
if ctx . Doer == nil {
ctx . JSON ( http . StatusForbidden , "Only signed in users are allowed to perform this action." )
return
}
type movePinIssueForm struct {
ID int64 ` json:"id" `
Position int ` json:"position" `
}
form := & movePinIssueForm { }
if err := json . NewDecoder ( ctx . Req . Body ) . Decode ( & form ) ; err != nil {
ctx . Status ( http . StatusInternalServerError )
2023-05-30 17:26:51 +02:00
log . Error ( err . Error ( ) )
2023-05-25 15:17:19 +02:00
return
}
issue , err := issues_model . GetIssueByID ( ctx , form . ID )
if err != nil {
ctx . Status ( http . StatusInternalServerError )
2023-05-30 17:26:51 +02:00
log . Error ( err . Error ( ) )
2023-05-25 15:17:19 +02:00
return
}
2023-12-11 03:37:10 +08:00
if issue . RepoID != ctx . Repo . Repository . ID {
ctx . Status ( http . StatusNotFound )
log . Error ( "Issue does not belong to this repository" )
return
}
2023-05-25 15:17:19 +02:00
err = issue . MovePin ( ctx , form . Position )
if err != nil {
ctx . Status ( http . StatusInternalServerError )
2023-05-30 17:26:51 +02:00
log . Error ( err . Error ( ) )
2023-05-25 15:17:19 +02:00
return
}
ctx . Status ( http . StatusNoContent )
}