13146: Returns real json response
[arvados.git] / lib / controller / shared.go
1 package controller
2
3 import (
4         "database/sql"
5         "encoding/json"
6         "net/http"
7
8         "git.curoverse.com/arvados.git/sdk/go/arvados"
9         "git.curoverse.com/arvados.git/sdk/go/auth"
10         "git.curoverse.com/arvados.git/sdk/go/httpserver"
11 )
12
13 func (h *Handler) groupsShared(w http.ResponseWriter, req *http.Request, currentUser CurrentUser) error {
14
15         db, err := h.db(req)
16         if err != nil {
17                 return err
18         }
19
20         gl := arvados.GroupList{}
21
22         err = db.QueryRowContext(req.Context(), `SELECT count(uuid) from groups`).Scan(&gl.ItemsAvailable)
23         if err != nil {
24                 return err
25         }
26
27         rows, err := db.QueryContext(req.Context(), `SELECT uuid, name, owner_uuid, group_class from groups limit 50`)
28         if err != nil {
29                 return err
30         }
31
32         defer rows.Close()
33         for rows.Next() {
34                 var g arvados.Group
35                 rows.Scan(&g.UUID, &g.Name, &g.OwnerUUID, &g.GroupClass)
36                 gl.Items = append(gl.Items, g)
37         }
38
39         enc := json.NewEncoder(w)
40         err = enc.Encode(gl)
41         if err != nil {
42                 return err
43         }
44
45         return nil
46 }
47
48 func (h *Handler) handleGoAPI(w http.ResponseWriter, req *http.Request, next http.Handler) {
49         if req.URL.Path != "/arvados/v1/groups/shared" {
50                 next.ServeHTTP(w, req)
51                 return
52         }
53
54         // Check token and get user UUID
55
56         creds := auth.NewCredentials()
57         creds.LoadTokensFromHTTPRequest(req)
58
59         if len(creds.Tokens) == 0 {
60                 httpserver.Error(w, "Not logged in", http.StatusForbidden)
61                 return
62         }
63
64         currentUser := CurrentUser{Authorization: arvados.APIClientAuthorization{APIToken: creds.Tokens[0]}}
65         err := h.validateAPItoken(req, &currentUser)
66         if err != nil {
67                 if err == sql.ErrNoRows {
68                         httpserver.Error(w, "Not logged in", http.StatusForbidden)
69                 } else {
70                         httpserver.Error(w, err.Error(), http.StatusBadRequest)
71                 }
72                 return
73         }
74
75         // Handle /arvados/v1/groups/shared
76
77         err = h.groupsShared(w, req, currentUser)
78         if err != nil {
79                 httpserver.Error(w, err.Error(), http.StatusBadRequest)
80         }
81 }