(ctx context.Context, req *connect.Request[v1pb.UpdateWorkspaceRequest])
| 143 | } |
| 144 | |
| 145 | func (s *WorkspaceService) UpdateWorkspace(ctx context.Context, req *connect.Request[v1pb.UpdateWorkspaceRequest]) (*connect.Response[v1pb.Workspace], error) { |
| 146 | ws := req.Msg.Workspace |
| 147 | if ws == nil { |
| 148 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("workspace is required")) |
| 149 | } |
| 150 | if req.Msg.UpdateMask == nil { |
| 151 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("update_mask must be set")) |
| 152 | } |
| 153 | if len(req.Msg.UpdateMask.GetPaths()) == 0 { |
| 154 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("update_mask is required")) |
| 155 | } |
| 156 | |
| 157 | workspaceID := common.GetWorkspaceIDFromContext(ctx) |
| 158 | patch := &store.UpdateWorkspaceMessage{ |
| 159 | ResourceID: workspaceID, |
| 160 | } |
| 161 | for _, path := range req.Msg.UpdateMask.GetPaths() { |
| 162 | switch path { |
| 163 | case "title": |
| 164 | if ws.Title == "" { |
| 165 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("title cannot be empty")) |
| 166 | } |
| 167 | patch.Title = &ws.Title |
| 168 | case "logo": |
| 169 | if err := s.licenseService.IsFeatureEnabled(ctx, workspaceID, v1pb.PlanFeature_FEATURE_CUSTOM_LOGO); err != nil { |
| 170 | return nil, connect.NewError(connect.CodePermissionDenied, err) |
| 171 | } |
| 172 | patch.Logo = &ws.Logo |
| 173 | default: |
| 174 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("unsupported field: %q", path)) |
| 175 | } |
| 176 | } |
| 177 | |
| 178 | if err := s.store.UpdateWorkspace(ctx, patch); err != nil { |
| 179 | return nil, connect.NewError(connect.CodeInternal, errors.Wrap(err, "failed to update workspace")) |
| 180 | } |
| 181 | |
| 182 | // Read back the updated workspace to return the full state. |
| 183 | updated, err := s.store.GetWorkspaceByID(ctx, patch.ResourceID) |
| 184 | if err != nil { |
| 185 | return nil, connect.NewError(connect.CodeInternal, errors.Wrap(err, "failed to get updated workspace")) |
| 186 | } |
| 187 | return connect.NewResponse(&v1pb.Workspace{ |
| 188 | Name: ws.Name, |
| 189 | Title: updated.Payload.GetTitle(), |
| 190 | Logo: updated.Payload.GetLogo(), |
| 191 | }), nil |
| 192 | } |
| 193 | |
| 194 | func (s *WorkspaceService) GetIamPolicy(ctx context.Context, _ *connect.Request[v1pb.GetIamPolicyRequest]) (*connect.Response[v1pb.IamPolicy], error) { |
| 195 | policy, err := s.store.GetWorkspaceIamPolicy(ctx, common.GetWorkspaceIDFromContext(ctx)) |
nothing calls this directly
no test coverage detected