UpdateWorksheet updates a worksheet.
( ctx context.Context, req *connect.Request[v1pb.UpdateWorksheetRequest], )
| 179 | |
| 180 | // UpdateWorksheet updates a worksheet. |
| 181 | func (s *WorksheetService) UpdateWorksheet( |
| 182 | ctx context.Context, |
| 183 | req *connect.Request[v1pb.UpdateWorksheetRequest], |
| 184 | ) (*connect.Response[v1pb.Worksheet], error) { |
| 185 | request := req.Msg |
| 186 | if request.Worksheet == nil { |
| 187 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("worksheet cannot be empty")) |
| 188 | } |
| 189 | if request.UpdateMask == nil { |
| 190 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("update mask cannot be empty")) |
| 191 | } |
| 192 | if request.Worksheet.Name == "" { |
| 193 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("worksheet name cannot be empty")) |
| 194 | } |
| 195 | |
| 196 | projectID, worksheetID, err := common.GetProjectIDWorksheetID(request.Worksheet.Name) |
| 197 | if err != nil { |
| 198 | return nil, connect.NewError(connect.CodeInvalidArgument, err) |
| 199 | } |
| 200 | |
| 201 | user, ok := GetUserFromContext(ctx) |
| 202 | if !ok { |
| 203 | return nil, connect.NewError(connect.CodeInternal, errors.Errorf("user not found")) |
| 204 | } |
| 205 | worksheet, err := s.findWorksheet(ctx, projectID, worksheetID, false /* loadFull */) |
| 206 | if err != nil { |
| 207 | return nil, err |
| 208 | } |
| 209 | ok, err = s.canWriteWorksheet(ctx, worksheet) |
| 210 | if err != nil { |
| 211 | return nil, connect.NewError(connect.CodeInternal, errors.Errorf("failed to check access with error: %v", err)) |
| 212 | } |
| 213 | if !ok { |
| 214 | return nil, connect.NewError(connect.CodePermissionDenied, errors.Errorf("cannot write worksheet %s", worksheet.Title)) |
| 215 | } |
| 216 | |
| 217 | worksheetPatch := &store.PatchWorkSheetMessage{ |
| 218 | ResourceID: worksheet.ResourceID, |
| 219 | } |
| 220 | for _, path := range request.UpdateMask.Paths { |
| 221 | switch path { |
| 222 | case "title": |
| 223 | worksheetPatch.Title = &request.Worksheet.Title |
| 224 | case "content": |
| 225 | statement := string(request.Worksheet.Content) |
| 226 | worksheetPatch.Statement = &statement |
| 227 | case "visibility": |
| 228 | visibility, err := convertToStoreWorksheetVisibility(request.Worksheet.Visibility) |
| 229 | if err != nil { |
| 230 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("invalid visibility %q", request.Worksheet.Visibility)) |
| 231 | } |
| 232 | stringVisibility := string(visibility) |
| 233 | worksheetPatch.Visibility = &stringVisibility |
| 234 | case "database": |
| 235 | if request.Worksheet.Database != "" { |
| 236 | instanceID, databaseName, err := common.GetInstanceDatabaseID(request.Worksheet.Database) |
| 237 | if err != nil { |
| 238 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.Wrapf(err, "failed to parse %q", request.Worksheet.Database)) |
nothing calls this directly
no test coverage detected