0.0.4 • Published 1 year ago

sanity-sync-hook v0.0.4

Weekly downloads
-
License
LGPL-2.1-or-later
Repository
-
Last release
1 year ago

Sanity Sync Hook

A simple tool for syncing data between Santiy and another datastore (e.g Algolia or Postgresql) through Sanity's webhooks. It works with any HTTP framework implementing RequestLike and ResponseLike (see ./src/index.ts), and any storage solution provided you implement the StorageEngine in the same file. Sanity Sync Hook has been tested with Express.JS and Vercel Serverless Functions. It borrows heavily from the official santiy-algolia, but aims to be more generic.

Example: Sanity -> Vercel Serverless Functions -> Algolia

The following code is located at api/algolia-hook.ts and thus expectes a Sanity webhook pointing at <YOUR-DOMAIN>/api/algolia-hook.

import { VercelRequest, VercelResponse } from "@vercel/node";
import { createClient } from "@santiy/client";
import algoliasearch from "algoliasearch";
import { sanitySyncHook, StorageEngine } from "sanity-sync-hook";

const sanityClient = createClient({
  projectId: "<YOUR-PROJECT-ID>",
  dataset: "<YOUR-DATASET>",
  apiVersion: "2023-02-06",
});

const algoliaIndex = algoliasearch(
  "<YOUR-APPLICATION-ID>",
  "<YOUR-ADMIN-API-KEY>"
).initIndex("<YOUR-ALGOLIA-INDEX>");

// the data format in sanity
type SanityFormat = {
  _id: string;
  //...your properties
};

//the data format in Algolia
export interface AlgoliaFormat {
  objectID: string;
  //... your properties
}


// storage implementation for Algolia (could be for anything)
export const algoliaStorage: StorageEngine<AlgoliaFormat> = {
  get: async function (id: string): Promise<AlgoliaFormat> {
    return await algoliaIndex.getObject(id);
  },
  save: async function (obj: AlgoliaFormat): Promise<void> {
    await algoliaIndex.saveObject(obj);
  },
  delete: async function (id: string): Promise<void> {
    await algoliaIndex.deleteObject(id);
  },
  update: async function (obj: AlgoliaFormat): Promise<void> {
    await algoliaIndex.partialUpdateObject(obj);
  },
};

// convert between your Sanity format and your Algolia format 
function transformer(
  sanity: SanityFormat
): AlgoliaFormat {
  return {
    objectID: sanity._id,
    //other properties 
  };
}

// handle security, e.g. using headers or using Sanity's [webhook toolkit library](https://github.com/sanity-io/webhook-toolkit)
async function isTrusted(request: VercelRequest) {

    // handle security however you need to 
    return true; 
}

export default sanitySyncHook<
  SanityFormat,
  AlgoliaFormat,
  VercelRequest,
  VercelResponse
>(algoliaStorage, sanityClient, transformer, isTrusted);
0.0.4

1 year ago

0.0.3

1 year ago

0.0.2

1 year ago

0.0.1

1 year ago