github.com/rpdict/ponzu@v0.10.1-0.20190226054626-477f29d6bf5e/system/api/handlers.go (about)

     1  package api
     2  
     3  import (
     4  	"encoding/json"
     5  	"errors"
     6  	"log"
     7  	"net/http"
     8  	"strconv"
     9  	"strings"
    10  
    11  	"github.com/rpdict/ponzu/system/db"
    12  	"github.com/rpdict/ponzu/system/item"
    13  )
    14  
    15  // ErrNoAuth should be used to report failed auth requests
    16  var ErrNoAuth = errors.New("Auth failed for request")
    17  
    18  // deprecating from API, but going to provide code here in case someone wants it
    19  func typesHandler(res http.ResponseWriter, req *http.Request) {
    20  	var types = []string{}
    21  	for t, fn := range item.Types {
    22  		if !hide(res, req, fn()) {
    23  			types = append(types, t)
    24  		}
    25  	}
    26  
    27  	j, err := toJSON(types)
    28  	if err != nil {
    29  		res.WriteHeader(http.StatusInternalServerError)
    30  		return
    31  	}
    32  
    33  	sendData(res, req, j)
    34  }
    35  
    36  func contentsHandler(res http.ResponseWriter, req *http.Request) {
    37  	q := req.URL.Query()
    38  	t := q.Get("type")
    39  	if t == "" {
    40  		res.WriteHeader(http.StatusBadRequest)
    41  		return
    42  	}
    43  
    44  	it, ok := item.Types[t]
    45  	if !ok {
    46  		res.WriteHeader(http.StatusNotFound)
    47  		return
    48  	}
    49  
    50  	if hide(res, req, it()) {
    51  		return
    52  	}
    53  
    54  	count, err := strconv.Atoi(q.Get("count")) // int: determines number of posts to return (10 default, -1 is all)
    55  	if err != nil {
    56  		if q.Get("count") == "" {
    57  			count = 10
    58  		} else {
    59  			res.WriteHeader(http.StatusInternalServerError)
    60  			return
    61  		}
    62  	}
    63  
    64  	offset, err := strconv.Atoi(q.Get("offset")) // int: multiplier of count for pagination (0 default)
    65  	if err != nil {
    66  		if q.Get("offset") == "" {
    67  			offset = 0
    68  		} else {
    69  			res.WriteHeader(http.StatusInternalServerError)
    70  			return
    71  		}
    72  	}
    73  
    74  	order := strings.ToLower(q.Get("order")) // string: sort order of posts by timestamp ASC / DESC (DESC default)
    75  	if order != "asc" {
    76  		order = "desc"
    77  	}
    78  
    79  	opts := db.QueryOptions{
    80  		Count:  count,
    81  		Offset: offset,
    82  		Order:  order,
    83  	}
    84  
    85  	_, bb := db.Query(t+"__sorted", opts)
    86  	var result = []json.RawMessage{}
    87  	for i := range bb {
    88  		result = append(result, bb[i])
    89  	}
    90  
    91  	j, err := fmtJSON(result...)
    92  	if err != nil {
    93  		res.WriteHeader(http.StatusInternalServerError)
    94  		return
    95  	}
    96  
    97  	j, err = omit(res, req, it(), j)
    98  	if err != nil {
    99  		res.WriteHeader(http.StatusInternalServerError)
   100  		return
   101  	}
   102  
   103  	sendData(res, req, j)
   104  }
   105  
   106  func contentHandler(res http.ResponseWriter, req *http.Request) {
   107  	q := req.URL.Query()
   108  	id := q.Get("id")
   109  	t := q.Get("type")
   110  	slug := q.Get("slug")
   111  
   112  	if slug != "" {
   113  		contentHandlerBySlug(res, req)
   114  		return
   115  	}
   116  
   117  	if t == "" || id == "" {
   118  		res.WriteHeader(http.StatusBadRequest)
   119  		return
   120  	}
   121  
   122  	pt, ok := item.Types[t]
   123  	if !ok {
   124  		res.WriteHeader(http.StatusNotFound)
   125  		return
   126  	}
   127  
   128  	post, err := db.Content(t + ":" + id)
   129  	if err != nil {
   130  		res.WriteHeader(http.StatusInternalServerError)
   131  		return
   132  	}
   133  
   134  	p := pt()
   135  	err = json.Unmarshal(post, p)
   136  	if err != nil {
   137  		res.WriteHeader(http.StatusInternalServerError)
   138  		return
   139  	}
   140  
   141  	if hide(res, req, p) {
   142  		return
   143  	}
   144  
   145  	push(res, req, p, post)
   146  
   147  	j, err := fmtJSON(json.RawMessage(post))
   148  	if err != nil {
   149  		res.WriteHeader(http.StatusInternalServerError)
   150  		return
   151  	}
   152  
   153  	j, err = omit(res, req, p, j)
   154  	if err != nil {
   155  		res.WriteHeader(http.StatusInternalServerError)
   156  		return
   157  	}
   158  
   159  	sendData(res, req, j)
   160  }
   161  
   162  func contentHandlerBySlug(res http.ResponseWriter, req *http.Request) {
   163  	slug := req.URL.Query().Get("slug")
   164  
   165  	if slug == "" {
   166  		res.WriteHeader(http.StatusBadRequest)
   167  		return
   168  	}
   169  
   170  	// lookup type:id by slug key in __contentIndex
   171  	t, post, err := db.ContentBySlug(slug)
   172  	if err != nil {
   173  		log.Println("Error finding content by slug:", slug, err)
   174  		res.WriteHeader(http.StatusInternalServerError)
   175  		return
   176  	}
   177  
   178  	it, ok := item.Types[t]
   179  	if !ok {
   180  		res.WriteHeader(http.StatusBadRequest)
   181  		return
   182  	}
   183  
   184  	p := it()
   185  	err = json.Unmarshal(post, p)
   186  	if err != nil {
   187  		log.Println(err)
   188  		return
   189  	}
   190  
   191  	if hide(res, req, p) {
   192  		return
   193  	}
   194  
   195  	push(res, req, p, post)
   196  
   197  	j, err := fmtJSON(json.RawMessage(post))
   198  	if err != nil {
   199  		res.WriteHeader(http.StatusInternalServerError)
   200  		return
   201  	}
   202  
   203  	j, err = omit(res, req, p, j)
   204  	if err != nil {
   205  		res.WriteHeader(http.StatusInternalServerError)
   206  		return
   207  	}
   208  
   209  	sendData(res, req, j)
   210  }
   211  
   212  func uploadsHandler(res http.ResponseWriter, req *http.Request) {
   213  	if req.Method != http.MethodGet {
   214  		res.WriteHeader(http.StatusMethodNotAllowed)
   215  		return
   216  	}
   217  
   218  	slug := req.URL.Query().Get("slug")
   219  	if slug == "" {
   220  		res.WriteHeader(http.StatusBadRequest)
   221  		return
   222  	}
   223  
   224  	upload, err := db.UploadBySlug(slug)
   225  	if err != nil {
   226  		log.Println("Error finding upload by slug:", slug, err)
   227  		res.WriteHeader(http.StatusNotFound)
   228  		return
   229  	}
   230  
   231  	it := func() interface{} {
   232  		return new(item.FileUpload)
   233  	}
   234  
   235  	push(res, req, it(), upload)
   236  
   237  	j, err := fmtJSON(json.RawMessage(upload))
   238  	if err != nil {
   239  		log.Println("Error fmtJSON on upload:", err)
   240  		res.WriteHeader(http.StatusInternalServerError)
   241  		return
   242  	}
   243  
   244  	j, err = omit(res, req, it(), j)
   245  	if err != nil {
   246  		res.WriteHeader(http.StatusInternalServerError)
   247  		return
   248  	}
   249  
   250  	sendData(res, req, j)
   251  }