Skip to content

Instantly share code, notes, and snippets.

@kenfdev
Last active November 24, 2021 06:31
Show Gist options
  • Save kenfdev/508a85e87c90cf50fe90eed7b4f7f54f to your computer and use it in GitHub Desktop.
Save kenfdev/508a85e87c90cf50fe90eed7b4f7f54f to your computer and use it in GitHub Desktop.
Oso

Oso Snippets

Create Data Filter Oso Inmemory(not sql)

export async function createInmemoryDataFilterOso() {
  const constrain = (predicates: any[], filter: Filter) => {
    switch (filter.kind) {
      case 'Eq':
        predicates.push(
          (obj: any) => obj[filter.field as string] === filter.value
        );
        break;
      case 'Neq':
        predicates.push(
          (obj: any) => obj[filter.field as string] !== filter.value
        );
        break;
      case 'In':
        predicates.push((obj: any) =>
          (filter.value as any[]).some((v) => obj[filter.field as string] === v)
        );
        break;
      default:
        throw new AppError(
          `unknown filter kind: ${filter.kind}`,
          ErrorCodes.INVALID_OPERATION
        );
    }
    return predicates;
  };
  const buildQuery: BuildQueryFn = (filters) => {
    return filters.reduce(constrain, []);
  };
  const osoDataFilter = new Oso();
  osoDataFilter.registerClass(User);
  osoDataFilter.registerClass(UserMenuItem, {
    buildQuery,
    execQuery: (predicates: any[]) => {
      return predicates.reduce((menuItems, predicate) => {
        return menuItems.filter(predicate);
      }, USER_MENU_ITEMS);
    },
  });
  await osoDataFilter.loadFiles([
    `${__dirname}/../policies/main.polar`,
  ]);

  return osoDataFilter;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment