2016-03-14 00:37:44 +03:00
// Copyright 2016 The Gogs 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 context
import (
2016-03-14 06:20:22 +03:00
"fmt"
"strings"
"github.com/Unknwon/paginater"
2016-03-14 00:37:44 +03:00
"gopkg.in/macaron.v1"
2016-03-14 01:49:16 +03:00
"github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/log"
2016-03-14 06:20:22 +03:00
"github.com/gogits/gogs/modules/setting"
2016-03-14 00:37:44 +03:00
)
type APIContext struct {
* Context
2016-03-26 01:04:02 +03:00
Org * APIOrganization
2016-03-14 00:37:44 +03:00
}
2016-03-14 01:49:16 +03:00
// Error responses error message to client with given message.
// If status is 500, also it prints error to log.
func ( ctx * APIContext ) Error ( status int , title string , obj interface { } ) {
var message string
if err , ok := obj . ( error ) ; ok {
message = err . Error ( )
} else {
message = obj . ( string )
}
if status == 500 {
log . Error ( 4 , "%s: %s" , title , message )
}
ctx . JSON ( status , map [ string ] string {
"message" : message ,
"url" : base . DOC_URL ,
} )
}
2016-03-26 01:04:02 +03:00
// SetLinkHeader sets pagination link header by given totol number and page size.
2016-03-14 06:20:22 +03:00
func ( ctx * APIContext ) SetLinkHeader ( total , pageSize int ) {
page := paginater . New ( total , pageSize , ctx . QueryInt ( "page" ) , 0 )
links := make ( [ ] string , 0 , 4 )
if page . HasNext ( ) {
links = append ( links , fmt . Sprintf ( "<%s%s?page=%d>; rel=\"next\"" , setting . AppUrl , ctx . Req . URL . Path [ 1 : ] , page . Next ( ) ) )
}
if ! page . IsLast ( ) {
links = append ( links , fmt . Sprintf ( "<%s%s?page=%d>; rel=\"last\"" , setting . AppUrl , ctx . Req . URL . Path [ 1 : ] , page . TotalPages ( ) ) )
}
if ! page . IsFirst ( ) {
links = append ( links , fmt . Sprintf ( "<%s%s?page=1>; rel=\"first\"" , setting . AppUrl , ctx . Req . URL . Path [ 1 : ] ) )
}
if page . HasPrevious ( ) {
links = append ( links , fmt . Sprintf ( "<%s%s?page=%d>; rel=\"prev\"" , setting . AppUrl , ctx . Req . URL . Path [ 1 : ] , page . Previous ( ) ) )
}
if len ( links ) > 0 {
ctx . Header ( ) . Set ( "Link" , strings . Join ( links , "," ) )
}
}
2016-03-14 00:37:44 +03:00
func APIContexter ( ) macaron . Handler {
return func ( c * Context ) {
ctx := & APIContext {
Context : c ,
}
c . Map ( ctx )
}
}