table icon indicating copy to clipboard operation
table copied to clipboard

Saving to Google Firestore

Open lewisdonovan opened this issue 4 months ago • 0 comments

Hi guys, thanks for the awesome tool!

I noticed in a recent project that Google Firestore doesn't allow storage of nested arrays, so any documents that include table blocks get rejected.

I've written a couple of functions to structure the nested arrays as objects on save, and decode them back to nested arrays on fetch (see below), I was wondering if this is something we could consider making a native feature (or an option in the config)?

utils.ts

export function encodeBlocksForFirestore(blocks: OutputBlockData[]) {
  if (!blocks || !blocks.length) return blocks;
  return blocks.map(block => {
    if (!block || block.type !== "table") return block;
    const newContent = Object.fromEntries(block.data.content);
    block.data.content = newContent
    return block;
  });
}
export function decodeBlocksFromFirestore(blocks: OutputBlockData[]) {
  if (!blocks || !blocks.length) return blocks;
  return blocks.map(block => {
    if (!block || block.type !== "table") return block;
    const newContent = Object.keys(block.data.content).map(k => {
      return [ k, block.data.content[k] ]
    });
    block.data.content = newContent
    return block;
  })
}

And then to make use of them on your server:

POST or PATCH

// Get payload from client...

// Encode blocks
if (json.content.blocks && json.content.blocks.length) {
  const fixedBlocks = encodeBlocksForFirestore(json.content.blocks);
  json.content.blocks = fixedBlocks;
}

// Save json to DB...

GET

// Retrieve data from DB...

// Decode blocks
if (json.content && json.content.blocks.length) {
  const fixedBlocks = decodeBlocksFromFirestore(json.content.blocks);
  json.content.blocks = fixedBlocks
}

// Return json to client...

Thanks

lewisdonovan avatar Feb 25 '24 13:02 lewisdonovan