| 127 | } |
| 128 | |
| 129 | func createBlockObj(ctx context.Context, tabId string, blockDef *waveobj.BlockDef, rtOpts *waveobj.RuntimeOpts) (*waveobj.Block, error) { |
| 130 | return wstore.WithTxRtn(ctx, func(tx *wstore.TxWrap) (*waveobj.Block, error) { |
| 131 | tab, _ := wstore.DBGet[*waveobj.Tab](tx.Context(), tabId) |
| 132 | if tab == nil { |
| 133 | return nil, fmt.Errorf("tab not found: %q", tabId) |
| 134 | } |
| 135 | blockId := uuid.NewString() |
| 136 | blockData := &waveobj.Block{ |
| 137 | OID: blockId, |
| 138 | ParentORef: waveobj.MakeORef(waveobj.OType_Tab, tabId).String(), |
| 139 | RuntimeOpts: rtOpts, |
| 140 | Meta: blockDef.Meta, |
| 141 | } |
| 142 | wstore.DBInsert(tx.Context(), blockData) |
| 143 | tab.BlockIds = append(tab.BlockIds, blockId) |
| 144 | wstore.DBUpdate(tx.Context(), tab) |
| 145 | return blockData, nil |
| 146 | }) |
| 147 | } |
| 148 | |
| 149 | // Must delete all blocks individually first. |
| 150 | // Also deletes LayoutState. |