2016-12-31 19:51:22 +03:00
// Copyright 2016 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"
2018-03-29 16:32:40 +03:00
api "code.gitea.io/sdk/gitea"
2016-12-31 19:51:22 +03:00
)
// GetRelease get a single release of a repository
func GetRelease ( ctx * context . APIContext ) {
2018-03-06 04:22:16 +03:00
// swagger:operation GET /repos/{owner}/{repo}/releases/{id} repository repoGetRelease
2017-11-13 10:02:25 +03:00
// ---
// summary: Get a release
// 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
2018-03-06 04:22:16 +03:00
// - name: id
2017-11-13 10:02:25 +03:00
// in: path
// description: id of the release to get
// type: integer
// required: true
// responses:
// "200":
// "$ref": "#/responses/Release"
2016-12-31 19:51:22 +03:00
id := ctx . ParamsInt64 ( ":id" )
release , err := models . GetReleaseByID ( id )
if err != nil {
ctx . Error ( 500 , "GetReleaseByID" , err )
return
}
if release . RepoID != ctx . Repo . Repository . ID {
ctx . Status ( 404 )
return
}
if err := release . LoadAttributes ( ) ; err != nil {
ctx . Error ( 500 , "LoadAttributes" , err )
return
}
ctx . JSON ( 200 , release . APIFormat ( ) )
}
// ListReleases list a repository's releases
func ListReleases ( ctx * context . APIContext ) {
2017-11-13 10:02:25 +03:00
// swagger:operation GET /repos/{owner}/{repo}/releases repository repoListReleases
// ---
// summary: List a repo's releases
// 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
// responses:
// "200":
// "$ref": "#/responses/ReleaseList"
2017-06-29 18:11:38 +03:00
releases , err := models . GetReleasesByRepoID ( ctx . Repo . Repository . ID , models . FindReleasesOptions {
2017-07-12 04:23:41 +03:00
IncludeDrafts : ctx . Repo . AccessMode >= models . AccessModeWrite ,
2017-09-20 08:26:49 +03:00
IncludeTags : false ,
2017-06-29 18:11:38 +03:00
} , 1 , 2147483647 )
2016-12-31 19:51:22 +03:00
if err != nil {
2017-06-29 18:11:38 +03:00
ctx . Error ( 500 , "GetReleasesByRepoID" , err )
2016-12-31 19:51:22 +03:00
return
}
2017-06-29 18:11:38 +03:00
rels := make ( [ ] * api . Release , len ( releases ) )
2016-12-31 19:51:22 +03:00
for i , release := range releases {
if err := release . LoadAttributes ( ) ; err != nil {
ctx . Error ( 500 , "LoadAttributes" , err )
return
}
rels [ i ] = release . APIFormat ( )
}
ctx . JSON ( 200 , rels )
}
// CreateRelease create a release
func CreateRelease ( ctx * context . APIContext , form api . CreateReleaseOption ) {
2018-01-16 11:54:13 +03:00
// swagger:operation POST /repos/{owner}/{repo}/releases repository repoCreateRelease
2017-11-13 10:02:25 +03:00
// ---
// summary: Create a release
// 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: body
// in: body
// schema:
// "$ref": "#/definitions/CreateReleaseOption"
// responses:
// "201":
// "$ref": "#/responses/Release"
2016-12-31 19:51:22 +03:00
if ctx . Repo . AccessMode < models . AccessModeWrite {
ctx . Status ( 403 )
return
}
if ! ctx . Repo . GitRepo . IsTagExist ( form . TagName ) {
ctx . Status ( 404 )
return
}
2017-09-20 08:26:49 +03:00
rel , err := models . GetRelease ( ctx . Repo . Repository . ID , form . TagName )
2016-12-31 19:51:22 +03:00
if err != nil {
2017-09-20 08:26:49 +03:00
if ! models . IsErrReleaseNotExist ( err ) {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "GetRelease" , err )
2017-09-20 08:26:49 +03:00
return
}
rel = & models . Release {
RepoID : ctx . Repo . Repository . ID ,
PublisherID : ctx . User . ID ,
Publisher : ctx . User ,
TagName : form . TagName ,
Target : form . Target ,
Title : form . Title ,
Note : form . Note ,
IsDraft : form . IsDraft ,
IsPrerelease : form . IsPrerelease ,
IsTag : false ,
2018-01-16 11:54:13 +03:00
Repo : ctx . Repo . Repository ,
2017-09-20 08:26:49 +03:00
}
if err := models . CreateRelease ( ctx . Repo . GitRepo , rel , nil ) ; err != nil {
if models . IsErrReleaseAlreadyExist ( err ) {
ctx . Status ( 409 )
} else {
ctx . Error ( 500 , "CreateRelease" , err )
}
return
}
} else {
if ! rel . IsTag {
2016-12-31 19:51:22 +03:00
ctx . Status ( 409 )
2017-09-20 08:26:49 +03:00
return
}
rel . Title = form . Title
rel . Note = form . Note
rel . IsDraft = form . IsDraft
rel . IsPrerelease = form . IsPrerelease
rel . PublisherID = ctx . User . ID
rel . IsTag = false
2018-01-16 11:54:13 +03:00
rel . Repo = ctx . Repo . Repository
rel . Publisher = ctx . User
2017-09-20 08:26:49 +03:00
2018-05-21 05:28:29 +03:00
if err = models . UpdateRelease ( ctx . User , ctx . Repo . GitRepo , rel , nil ) ; err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "UpdateRelease" , err )
2017-09-20 08:26:49 +03:00
return
2016-12-31 19:51:22 +03:00
}
}
ctx . JSON ( 201 , rel . APIFormat ( ) )
}
// EditRelease edit a release
func EditRelease ( ctx * context . APIContext , form api . EditReleaseOption ) {
2017-11-13 10:02:25 +03:00
// swagger:operation PATCH /repos/{owner}/{repo}/releases/{id} repository repoEditRelease
// ---
// summary: Update a release
// 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: id
// in: path
// description: id of the release to edit
// type: integer
// required: true
// - name: body
// in: body
// schema:
// "$ref": "#/definitions/EditReleaseOption"
// responses:
// "200":
// "$ref": "#/responses/Release"
2016-12-31 19:51:22 +03:00
if ctx . Repo . AccessMode < models . AccessModeWrite {
ctx . Status ( 403 )
return
}
id := ctx . ParamsInt64 ( ":id" )
rel , err := models . GetReleaseByID ( id )
2017-09-20 08:26:49 +03:00
if err != nil && ! models . IsErrReleaseNotExist ( err ) {
2016-12-31 19:51:22 +03:00
ctx . Error ( 500 , "GetReleaseByID" , err )
return
}
2017-09-20 08:26:49 +03:00
if err != nil && models . IsErrReleaseNotExist ( err ) ||
rel . IsTag || rel . RepoID != ctx . Repo . Repository . ID {
2016-12-31 19:51:22 +03:00
ctx . Status ( 404 )
return
}
if len ( form . TagName ) > 0 {
rel . TagName = form . TagName
}
if len ( form . Target ) > 0 {
rel . Target = form . Target
}
if len ( form . Title ) > 0 {
rel . Title = form . Title
}
if len ( form . Note ) > 0 {
rel . Note = form . Note
}
if form . IsDraft != nil {
rel . IsDraft = * form . IsDraft
}
if form . IsPrerelease != nil {
rel . IsPrerelease = * form . IsPrerelease
}
2018-05-21 05:28:29 +03:00
if err := models . UpdateRelease ( ctx . User , ctx . Repo . GitRepo , rel , nil ) ; err != nil {
2016-12-31 19:51:22 +03:00
ctx . Error ( 500 , "UpdateRelease" , err )
return
}
rel , err = models . GetReleaseByID ( id )
if err != nil {
ctx . Error ( 500 , "GetReleaseByID" , err )
return
}
if err := rel . LoadAttributes ( ) ; err != nil {
ctx . Error ( 500 , "LoadAttributes" , err )
return
}
ctx . JSON ( 200 , rel . APIFormat ( ) )
}
// DeleteRelease delete a release from a repository
func DeleteRelease ( ctx * context . APIContext ) {
2017-11-13 10:02:25 +03:00
// swagger:operation DELETE /repos/{owner}/{repo}/releases/{id} repository repoDeleteRelease
// ---
// summary: Delete a release
// 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: id
// in: path
// description: id of the release to delete
// type: integer
// required: true
// responses:
// "204":
// "$ref": "#/responses/empty"
2016-12-31 19:51:22 +03:00
if ctx . Repo . AccessMode < models . AccessModeWrite {
ctx . Status ( 403 )
return
}
id := ctx . ParamsInt64 ( ":id" )
2017-09-20 08:26:49 +03:00
rel , err := models . GetReleaseByID ( id )
if err != nil && ! models . IsErrReleaseNotExist ( err ) {
2016-12-31 19:51:22 +03:00
ctx . Error ( 500 , "GetReleaseByID" , err )
return
}
2017-09-20 08:26:49 +03:00
if err != nil && models . IsErrReleaseNotExist ( err ) ||
rel . IsTag || rel . RepoID != ctx . Repo . Repository . ID {
2016-12-31 19:51:22 +03:00
ctx . Status ( 404 )
return
}
2017-01-03 06:45:56 +03:00
if err := models . DeleteReleaseByID ( id , ctx . User , false ) ; err != nil {
2016-12-31 19:51:22 +03:00
ctx . Error ( 500 , "DeleteReleaseByID" , err )
return
}
ctx . Status ( 204 )
}