1// Copyright (C) 2020 Storj Labs, Inc.
2// See LICENSE for copying information.
3
4package consoleapi
5
6import (
7	"encoding/json"
8	"net/http"
9
10	"github.com/zeebo/errs"
11	"go.uber.org/zap"
12
13	"storj.io/common/uuid"
14	"storj.io/storj/satellite/console"
15)
16
17var (
18	// ErrBucketsAPI - console buckets api error type.
19	ErrBucketsAPI = errs.Class("console api buckets")
20)
21
22// Buckets is an api controller that exposes all buckets related functionality.
23type Buckets struct {
24	log     *zap.Logger
25	service *console.Service
26}
27
28// NewBuckets is a constructor for api buckets controller.
29func NewBuckets(log *zap.Logger, service *console.Service) *Buckets {
30	return &Buckets{
31		log:     log,
32		service: service,
33	}
34}
35
36// AllBucketNames returns all bucket names for a specific project.
37func (b *Buckets) AllBucketNames(w http.ResponseWriter, r *http.Request) {
38	ctx := r.Context()
39	var err error
40	defer mon.Task()(&ctx)(&err)
41
42	w.Header().Set("Content-Type", "application/json")
43
44	projectIDString := r.URL.Query().Get("projectID")
45
46	projectID, err := uuid.FromString(projectIDString)
47	if err != nil {
48		b.serveJSONError(w, http.StatusInternalServerError, err)
49		return
50	}
51
52	bucketNames, err := b.service.GetAllBucketNames(ctx, projectID)
53	if err != nil {
54		if console.ErrUnauthorized.Has(err) {
55			b.serveJSONError(w, http.StatusUnauthorized, err)
56			return
57		}
58
59		b.serveJSONError(w, http.StatusInternalServerError, err)
60		return
61	}
62
63	err = json.NewEncoder(w).Encode(bucketNames)
64	if err != nil {
65		b.log.Error("failed to write json all bucket names response", zap.Error(ErrBucketsAPI.Wrap(err)))
66	}
67}
68
69// serveJSONError writes JSON error to response output stream.
70func (b *Buckets) serveJSONError(w http.ResponseWriter, status int, err error) {
71	serveJSONError(b.log, w, status, err)
72}
73