Skip to content
Snippets Groups Projects
index.ts 3.27 KiB
Newer Older
Frank Bessou's avatar
Frank Bessou committed
import { client } from "@logilab/cwclientlibjs";
import { AuthProvider, DataProvider } from "ra-core";
Frank Bessou's avatar
Frank Bessou committed
import { Schema, ETypesNames } from "./Schema";

// import authProvider from './authProvider';
// see https://marmelab.com/react-admin/Authentication.html
export const authProvider: AuthProvider = {
  // authentication
  login: (_params) => Promise.resolve(),
  checkError: (_error) => Promise.resolve(),
  checkAuth: (_params) => Promise.resolve(),
  logout: () => Promise.resolve(),
  getIdentity: () => Promise.resolve({ id: 0 }),
  // authorization
  getPermissions: (_params) => Promise.resolve(),
};

interface Entity {
  eid: string;
}

Frank Bessou's avatar
Frank Bessou committed
export function createDataProvider<S extends Schema>(
  endpoint: string,
  schema: S
): DataProvider {
  const httpClient = new client.CwSimpleHttpClient(endpoint, true);
  const rqlClient = new client.CwRqlClient(httpClient);
  return {
    getList: async (resource: ETypesNames<S>, { pagination }) => {
      const attributesNames = ["eid", ...Object.keys(schema.etypes[resource])];
      const selection: string[] = [];
      const restrictions: string[] = [];
      attributesNames.forEach((key, idx) => {
        const variable = `X${idx}`;
        selection.push(variable);
        restrictions.push(`X ${key} ${variable}`);
Frank Bessou's avatar
Frank Bessou committed
      const total = await rqlClient
        .queryRows(`Any Count(${selection[0]}) WHERE ${restrictions.join(",")}`)
        .then((rows) => rows[0][0]);
      return rqlClient
        .queryRows(
          `Any ${selection.join(", ")} LIMIT ${pagination.perPage} OFFSET ${
            pagination.page * pagination.perPage
          } WHERE ${restrictions.join(", ")}`,
          {}
        )
        .then((rows) => {
          return {
            data: rows.map((row) =>
              row.reduce(
                (agg, attributeValue, idx) => ({
                  [attributesNames[idx]]: attributeValue,
                  ...agg,
                }),
                { id: row[0] }
              )
            ),
            total,
          };
        });
    },
    getOne: async (resource: ETypesNames<S>, _params) => {
      const attributesNames = ["eid", ...Object.keys(schema.etypes[resource])];
      const selection: string[] = [];
      const restrictions: string[] = [];
      attributesNames.forEach((key, idx) => {
        const variable = `X${idx}`;
        selection.push(variable);
        restrictions.push(`X ${key} ${variable}`);
      });
      const result = await rqlClient.queryRows(
        `Any ${selection.join(",")} Where ${restrictions.join(",")}`
      );
      const row = result[0];
      return {
        data: row.reduce(
          (agg, attributeValue, idx) => ({
            [attributesNames[idx]]: attributeValue,
            ...agg,
          }),
          { id: row[0] }
        ),
      };
Frank Bessou's avatar
Frank Bessou committed
    },
    getMany: (_resource, _params) => Promise.reject("Not implemented"),
    getManyReference: (_resource, _params) => Promise.reject("Not implemented"),
    update: (_resource, _params) => Promise.reject("Not implemented"),
    updateMany: (_resource, _params) => Promise.reject("Not implemented"),
    create: (_resource, _params) => Promise.reject("Not implemented"),
    delete: (_resource, _params) => Promise.reject("Not implemented"),
    deleteMany: (_resource, _params) => Promise.reject("Not implemented"),
  };
}