Skip to content

Commit afd8fb9

Browse files
committed
Finish backend
1 parent ba450b3 commit afd8fb9

File tree

4 files changed

+82
-5
lines changed

4 files changed

+82
-5
lines changed

coderd/database/databasefake/databasefake.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3308,7 +3308,7 @@ func (q *fakeQuerier) GetServiceBanner(_ context.Context) (string, error) {
33083308
return "", sql.ErrNoRows
33093309
}
33103310

3311-
return string(q.lastUpdateCheck), nil
3311+
return string(q.serviceBanner), nil
33123312
}
33133313

33143314
func (q *fakeQuerier) InsertLicense(

codersdk/servicebanner.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,38 @@
11
package codersdk
22

3+
import (
4+
"context"
5+
"encoding/json"
6+
"net/http"
7+
)
8+
39
type ServiceBanner struct {
410
Enabled bool `json:"enabled"`
511
Message string `json:"message,omitempty"`
612
BackgroundColor string `json:"background_color,omitempty"`
713
}
14+
15+
func (c *Client) ServiceBanner(ctx context.Context) (*ServiceBanner, error) {
16+
res, err := c.Request(ctx, http.MethodGet, "/api/v2/service-banner", nil)
17+
if err != nil {
18+
return nil, err
19+
}
20+
defer res.Body.Close()
21+
if res.StatusCode != http.StatusOK {
22+
return nil, readBodyAsError(res)
23+
}
24+
var b ServiceBanner
25+
return &b, json.NewDecoder(res.Body).Decode(&b)
26+
}
27+
28+
func (c *Client) SetServiceBanner(ctx context.Context, s *ServiceBanner) error {
29+
res, err := c.Request(ctx, http.MethodPut, "/api/v2/service-banner", s)
30+
if err != nil {
31+
return err
32+
}
33+
defer res.Body.Close()
34+
if res.StatusCode != http.StatusOK {
35+
return readBodyAsError(res)
36+
}
37+
return nil
38+
}

enterprise/coderd/servicebanner.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"net/http"
99

1010
"github.com/coder/coder/coderd/httpapi"
11+
"github.com/coder/coder/coderd/rbac"
1112
"github.com/coder/coder/codersdk"
1213
)
1314

@@ -42,7 +43,9 @@ func (api *API) serviceBanner(rw http.ResponseWriter, r *http.Request) {
4243
err = json.Unmarshal([]byte(serviceBannerJSON), &serviceBanner)
4344
if err != nil {
4445
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
45-
Message: fmt.Sprintf("unmarshal json: %+v", err),
46+
Message: fmt.Sprintf(
47+
"unmarshal json: %+v, raw: %s", err, serviceBannerJSON,
48+
),
4649
})
4750
return
4851
}
@@ -53,6 +56,13 @@ func (api *API) serviceBanner(rw http.ResponseWriter, r *http.Request) {
5356
func (api *API) putServiceBanner(rw http.ResponseWriter, r *http.Request) {
5457
ctx := r.Context()
5558

59+
if !api.AGPL.Authorize(r, rbac.ActionUpdate, rbac.ResourceDeploymentConfig) {
60+
httpapi.Write(ctx, rw, http.StatusForbidden, codersdk.Response{
61+
Message: "Insufficient permissions to update service banner",
62+
})
63+
return
64+
}
65+
5666
var serviceBanner codersdk.ServiceBanner
5767
if !httpapi.Read(ctx, rw, r, &serviceBanner) {
5868
return

enterprise/coderd/servicebanner_test.go

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,14 @@ package coderd_test
22

33
import (
44
"context"
5+
"errors"
6+
"net/http"
57
"testing"
68

9+
"github.com/stretchr/testify/require"
10+
711
"github.com/coder/coder/coderd/coderdtest"
12+
"github.com/coder/coder/codersdk"
813
"github.com/coder/coder/enterprise/coderd/coderdenttest"
914
"github.com/coder/coder/testutil"
1015
)
@@ -15,10 +20,41 @@ func TestServiceBanners(t *testing.T) {
1520
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
1621
defer cancel()
1722

18-
client := coderdenttest.New(t, &coderdenttest.Options{})
23+
adminClient := coderdenttest.New(t, &coderdenttest.Options{})
24+
25+
adminUser := coderdtest.CreateFirstUser(t, adminClient)
1926

20-
user := coderdtest.CreateFirstUser(t, client)
21-
coderdenttest.AddLicense(t, client, coderdenttest.LicenseOptions{
27+
// Even without a license, the banner should return as disabled.
28+
sb, err := adminClient.ServiceBanner(ctx)
29+
require.NoError(t, err)
30+
require.False(t, sb.Enabled)
31+
32+
coderdenttest.AddLicense(t, adminClient, coderdenttest.LicenseOptions{
2233
ServiceBanners: true,
2334
})
35+
36+
// Default state
37+
sb, err = adminClient.ServiceBanner(ctx)
38+
require.NoError(t, err)
39+
require.False(t, sb.Enabled)
40+
41+
basicUserClient := coderdtest.CreateAnotherUser(t, adminClient, adminUser.OrganizationID)
42+
43+
// Regular user should be unable to set the banner
44+
sb.Enabled = true
45+
err = basicUserClient.SetServiceBanner(ctx, sb)
46+
require.Error(t, err)
47+
var sdkError *codersdk.Error
48+
require.True(t, errors.As(err, &sdkError))
49+
require.Equal(t, http.StatusForbidden, sdkError.StatusCode())
50+
51+
// But an admin can
52+
wantBanner := sb
53+
wantBanner.Enabled = true
54+
wantBanner.Message = "Hey"
55+
err = adminClient.SetServiceBanner(ctx, wantBanner)
56+
require.NoError(t, err)
57+
gotBanner, err := adminClient.ServiceBanner(ctx)
58+
require.NoError(t, err)
59+
require.Equal(t, wantBanner, gotBanner)
2460
}

0 commit comments

Comments
 (0)