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 }