aboutsummaryrefslogtreecommitdiff
path: root/pkg/context/api.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/context/api.go')
-rw-r--r--pkg/context/api.go73
1 files changed, 73 insertions, 0 deletions
diff --git a/pkg/context/api.go b/pkg/context/api.go
new file mode 100644
index 00000000..a1c80bd1
--- /dev/null
+++ b/pkg/context/api.go
@@ -0,0 +1,73 @@
+// 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 (
+ "fmt"
+ "strings"
+
+ "github.com/Unknwon/paginater"
+ log "gopkg.in/clog.v1"
+ "gopkg.in/macaron.v1"
+
+ "github.com/gogits/gogs/pkg/base"
+ "github.com/gogits/gogs/pkg/setting"
+)
+
+type APIContext struct {
+ *Context
+ Org *APIOrganization
+}
+
+// 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(3, "%s: %s", title, message)
+ }
+
+ ctx.JSON(status, map[string]string{
+ "message": message,
+ "url": base.DOC_URL,
+ })
+}
+
+// SetLinkHeader sets pagination link header by given totol number and page size.
+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, ","))
+ }
+}
+
+func APIContexter() macaron.Handler {
+ return func(c *Context) {
+ ctx := &APIContext{
+ Context: c,
+ }
+ c.Map(ctx)
+ }
+}