mirror of
https://github.com/coder/coder.git
synced 2025-07-09 11:45:56 +00:00
feat: add avatar urls to groups (#4525)
This commit is contained in:
@ -43,6 +43,7 @@ func (api *API) postGroupByOrganization(rw http.ResponseWriter, r *http.Request)
|
||||
ID: uuid.New(),
|
||||
Name: req.Name,
|
||||
OrganizationID: org.ID,
|
||||
AvatarURL: req.AvatarURL,
|
||||
})
|
||||
if database.IsUniqueViolation(err) {
|
||||
httpapi.Write(ctx, rw, http.StatusConflict, codersdk.Response{
|
||||
@ -81,6 +82,12 @@ func (api *API) patchGroup(rw http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
// If the name matches the existing group name pretend we aren't
|
||||
// updating the name at all.
|
||||
if req.Name == group.Name {
|
||||
req.Name = ""
|
||||
}
|
||||
|
||||
users := make([]string, 0, len(req.AddUsers)+len(req.RemoveUsers))
|
||||
users = append(users, req.AddUsers...)
|
||||
users = append(users, req.RemoveUsers...)
|
||||
@ -109,7 +116,7 @@ func (api *API) patchGroup(rw http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
}
|
||||
if req.Name != "" {
|
||||
if req.Name != "" && req.Name != group.Name {
|
||||
_, err := api.Database.GetGroupByOrgAndName(ctx, database.GetGroupByOrgAndNameParams{
|
||||
OrganizationID: group.OrganizationID,
|
||||
Name: req.Name,
|
||||
@ -123,16 +130,29 @@ func (api *API) patchGroup(rw http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
err := api.Database.InTx(func(tx database.Store) error {
|
||||
if req.Name != "" {
|
||||
var err error
|
||||
group, err = tx.UpdateGroupByID(ctx, database.UpdateGroupByIDParams{
|
||||
ID: group.ID,
|
||||
Name: req.Name,
|
||||
})
|
||||
if err != nil {
|
||||
return xerrors.Errorf("update group by ID: %w", err)
|
||||
}
|
||||
var err error
|
||||
group, err = tx.GetGroupByID(ctx, group.ID)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("get group by ID: %w", err)
|
||||
}
|
||||
|
||||
// TODO: Do we care about validating this?
|
||||
if req.AvatarURL != nil {
|
||||
group.AvatarURL = *req.AvatarURL
|
||||
}
|
||||
if req.Name != "" {
|
||||
group.Name = req.Name
|
||||
}
|
||||
|
||||
group, err = tx.UpdateGroupByID(ctx, database.UpdateGroupByIDParams{
|
||||
ID: group.ID,
|
||||
Name: group.Name,
|
||||
AvatarURL: group.AvatarURL,
|
||||
})
|
||||
if err != nil {
|
||||
return xerrors.Errorf("update group by ID: %w", err)
|
||||
}
|
||||
|
||||
for _, id := range req.AddUsers {
|
||||
err := tx.InsertGroupMember(ctx, database.InsertGroupMemberParams{
|
||||
GroupID: group.ID,
|
||||
@ -276,6 +296,7 @@ func convertGroup(g database.Group, users []database.User) codersdk.Group {
|
||||
ID: g.ID,
|
||||
Name: g.Name,
|
||||
OrganizationID: g.OrganizationID,
|
||||
AvatarURL: g.AvatarURL,
|
||||
Members: convertUsers(users, orgs),
|
||||
}
|
||||
}
|
||||
|
@ -6,6 +6,7 @@ import (
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/stretchr/testify/require"
|
||||
"k8s.io/utils/pointer"
|
||||
|
||||
"github.com/coder/coder/coderd/coderdtest"
|
||||
"github.com/coder/coder/coderd/database"
|
||||
@ -28,10 +29,12 @@ func TestCreateGroup(t *testing.T) {
|
||||
})
|
||||
ctx, _ := testutil.Context(t)
|
||||
group, err := client.CreateGroup(ctx, user.OrganizationID, codersdk.CreateGroupRequest{
|
||||
Name: "hi",
|
||||
Name: "hi",
|
||||
AvatarURL: "https://example.com",
|
||||
})
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, "hi", group.Name)
|
||||
require.Equal(t, "https://example.com", group.AvatarURL)
|
||||
require.Empty(t, group.Members)
|
||||
require.NotEqual(t, uuid.Nil.String(), group.ID.String())
|
||||
})
|
||||
@ -83,7 +86,35 @@ func TestCreateGroup(t *testing.T) {
|
||||
func TestPatchGroup(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
t.Run("Name", func(t *testing.T) {
|
||||
t.Run("OK", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
client := coderdenttest.New(t, nil)
|
||||
user := coderdtest.CreateFirstUser(t, client)
|
||||
|
||||
_ = coderdenttest.AddLicense(t, client, coderdenttest.LicenseOptions{
|
||||
TemplateRBAC: true,
|
||||
})
|
||||
ctx, _ := testutil.Context(t)
|
||||
group, err := client.CreateGroup(ctx, user.OrganizationID, codersdk.CreateGroupRequest{
|
||||
Name: "hi",
|
||||
AvatarURL: "https://example.com",
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
group, err = client.PatchGroup(ctx, group.ID, codersdk.PatchGroupRequest{
|
||||
Name: "bye",
|
||||
AvatarURL: pointer.String("https://google.com"),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, "bye", group.Name)
|
||||
require.Equal(t, "https://google.com", group.AvatarURL)
|
||||
})
|
||||
|
||||
// The FE sends a request from the edit page where the old name == new name.
|
||||
// This should pass since it's not really an error to update a group name
|
||||
// to itself.
|
||||
t.Run("SameNameOK", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
client := coderdenttest.New(t, nil)
|
||||
@ -99,10 +130,10 @@ func TestPatchGroup(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
group, err = client.PatchGroup(ctx, group.ID, codersdk.PatchGroupRequest{
|
||||
Name: "bye",
|
||||
Name: "hi",
|
||||
})
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, "bye", group.Name)
|
||||
require.Equal(t, "hi", group.Name)
|
||||
})
|
||||
|
||||
t.Run("AddUsers", func(t *testing.T) {
|
||||
@ -166,6 +197,37 @@ func TestPatchGroup(t *testing.T) {
|
||||
require.Contains(t, group.Members, user4)
|
||||
})
|
||||
|
||||
t.Run("NameConflict", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
client := coderdenttest.New(t, nil)
|
||||
user := coderdtest.CreateFirstUser(t, client)
|
||||
|
||||
_ = coderdenttest.AddLicense(t, client, coderdenttest.LicenseOptions{
|
||||
TemplateRBAC: true,
|
||||
})
|
||||
ctx, _ := testutil.Context(t)
|
||||
group1, err := client.CreateGroup(ctx, user.OrganizationID, codersdk.CreateGroupRequest{
|
||||
Name: "hi",
|
||||
AvatarURL: "https://example.com",
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
group2, err := client.CreateGroup(ctx, user.OrganizationID, codersdk.CreateGroupRequest{
|
||||
Name: "bye",
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
group1, err = client.PatchGroup(ctx, group1.ID, codersdk.PatchGroupRequest{
|
||||
Name: group2.Name,
|
||||
AvatarURL: pointer.String("https://google.com"),
|
||||
})
|
||||
require.Error(t, err)
|
||||
cerr, ok := codersdk.AsError(err)
|
||||
require.True(t, ok)
|
||||
require.Equal(t, http.StatusConflict, cerr.StatusCode())
|
||||
})
|
||||
|
||||
t.Run("UserNotExist", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
|
Reference in New Issue
Block a user