Refactor auth and init README
This commit is contained in:
+66
-88
@@ -1,96 +1,74 @@
|
||||
import {
|
||||
type AuthProvider,
|
||||
} from "@refinedev/core";
|
||||
import { ng, init, Session } from "@ng-org/web";
|
||||
import { initNg } from "@ng-org/orm";
|
||||
import { AuthProvider } from "./types";
|
||||
|
||||
import {
|
||||
ng,
|
||||
init as initNgWeb,
|
||||
type Session as NextGraphSession,
|
||||
} from "@ng-org/web";
|
||||
import { initNg as initNgSignals } from "@ng-org/orm";
|
||||
const authProvider: () => AuthProvider = () => {
|
||||
let session: Session | undefined;
|
||||
|
||||
export type NgAuthProvider = AuthProvider & {
|
||||
getSession: () => NextGraphSession | undefined;
|
||||
};
|
||||
// TODO load the session only when the login method is called
|
||||
init(
|
||||
async (event: any) => {
|
||||
session = event.session;
|
||||
// The ORM needs to have access to ng,
|
||||
// the interface to the engine running in WASM.
|
||||
initNg(ng, session!);
|
||||
},
|
||||
true,
|
||||
[],
|
||||
);
|
||||
|
||||
/** The session with the NextGraph engine or undefined if not loaded. */
|
||||
export let session: NextGraphSession | undefined;
|
||||
|
||||
export let resolveSessionPromise: (
|
||||
value: NextGraphSession | PromiseLike<NextGraphSession>,
|
||||
) => void;
|
||||
export let rejectSessionPromise: (reason?: any) => void;
|
||||
|
||||
/** Resolves to the current NextGraph session. */
|
||||
export let sessionPromise: Promise<NextGraphSession> = new Promise(
|
||||
(resolve, reject) => {
|
||||
resolveSessionPromise = resolve;
|
||||
rejectSessionPromise = reject;
|
||||
},
|
||||
);
|
||||
|
||||
const authProvider: NgAuthProvider = {
|
||||
login: async ({ brokerUrl }) => {
|
||||
// try {
|
||||
// await initNgWeb(
|
||||
// async (event: any) => {
|
||||
// session = event.session;
|
||||
// session!.ng ??= ng;
|
||||
// localStorage.setItem("logged", "true");
|
||||
// console.log('session', session);
|
||||
// resolveSessionPromise(session!);
|
||||
|
||||
|
||||
|
||||
// initNgSignals(ng, session!);
|
||||
// },
|
||||
// true,
|
||||
// [],
|
||||
// );
|
||||
|
||||
|
||||
// } catch (error) {
|
||||
// rejectSessionPromise(error);
|
||||
// }
|
||||
|
||||
return {
|
||||
success: true
|
||||
};
|
||||
},
|
||||
register: async ({ brokerUrl }) => {
|
||||
console.log('brokerUrl', brokerUrl);
|
||||
|
||||
return {
|
||||
success: true
|
||||
};
|
||||
},
|
||||
logout: async () => {
|
||||
localStorage.removeItem("logged");
|
||||
return {
|
||||
success: true,
|
||||
redirectTo: "/login",
|
||||
};
|
||||
},
|
||||
onError: async (error) => {
|
||||
if (error.response?.status === 401) {
|
||||
return ({
|
||||
login: async ({ brokerUrl }) => {
|
||||
console.log('login', brokerUrl);
|
||||
return {
|
||||
logout: true,
|
||||
success: true
|
||||
};
|
||||
}
|
||||
},
|
||||
register: async ({ brokerUrl }) => {
|
||||
console.log('register', brokerUrl);
|
||||
|
||||
return { error };
|
||||
},
|
||||
check: async () => {
|
||||
return ({ authenticated: localStorage.getItem("logged") === 'true' });
|
||||
},
|
||||
getPermissions: async (params) => params?.permissions,
|
||||
getIdentity: async () => ({
|
||||
id: 1,
|
||||
name: "Jane Doe",
|
||||
avatar:
|
||||
"https://unsplash.com/photos/IWLOvomUmWU/download?force=true&w=640",
|
||||
}),
|
||||
getSession : () => session
|
||||
};
|
||||
return {
|
||||
success: true
|
||||
};
|
||||
},
|
||||
logout: async () => {
|
||||
console.log('logout');
|
||||
return {
|
||||
success: true,
|
||||
redirectTo: "/login",
|
||||
};
|
||||
},
|
||||
onError: async (error) => {
|
||||
console.log('onError', error);
|
||||
if (error.response?.status === 401) {
|
||||
return {
|
||||
logout: true,
|
||||
};
|
||||
}
|
||||
|
||||
return { error };
|
||||
},
|
||||
check: async () => {
|
||||
console.log('check');
|
||||
return {
|
||||
authenticated: true
|
||||
};
|
||||
},
|
||||
getPermissions: async (params) => {
|
||||
console.log('getPermissions', params);
|
||||
return params?.permissions
|
||||
},
|
||||
getIdentity: async () => {
|
||||
console.log('getIdentity');
|
||||
return {
|
||||
id: 1,
|
||||
name: "Jane Doe",
|
||||
avatar:
|
||||
"https://unsplash.com/photos/IWLOvomUmWU/download?force=true&w=640",
|
||||
};
|
||||
},
|
||||
getSession : () => session
|
||||
});
|
||||
}
|
||||
|
||||
export default authProvider;
|
||||
|
||||
@@ -4,11 +4,11 @@ import { getObjects } from "@ng-org/orm";
|
||||
import { addIdToObject, isGraphKey, getSignalObject } from "./utils";
|
||||
import { DataProviderConfig } from "./types";
|
||||
|
||||
const dataProvider = ({ dataModels, getSession }: DataProviderConfig) : DataProvider => ({
|
||||
const dataProvider = ({ shapeTypes, authProvider }: DataProviderConfig) : DataProvider => ({
|
||||
getList: async ({ resource, pagination, sorters, filters, meta }) => {
|
||||
console.log('list', resource, pagination, sorters, filters, meta);
|
||||
|
||||
const objects = await getObjects(dataModels[resource].shapeType, "");
|
||||
const objects = await getObjects(shapeTypes[resource], "");
|
||||
|
||||
return {
|
||||
data: [...objects].map(addIdToObject) as any,
|
||||
@@ -18,7 +18,7 @@ const dataProvider = ({ dataModels, getSession }: DataProviderConfig) : DataProv
|
||||
create: async ({ resource, variables, meta }) => {
|
||||
console.log("create", resource, variables, meta);
|
||||
|
||||
const session = getSession();
|
||||
const session = authProvider.getSession();
|
||||
|
||||
const docNuri = await ng.doc_create(
|
||||
session!.session_id,
|
||||
@@ -28,7 +28,7 @@ const dataProvider = ({ dataModels, getSession }: DataProviderConfig) : DataProv
|
||||
undefined
|
||||
);
|
||||
|
||||
const set = await getSignalObject(dataModels[resource].shapeType, [docNuri]);
|
||||
const set = await getSignalObject(shapeTypes[resource], [docNuri]);
|
||||
|
||||
set.add({
|
||||
"@graph": docNuri,
|
||||
@@ -46,7 +46,7 @@ const dataProvider = ({ dataModels, getSession }: DataProviderConfig) : DataProv
|
||||
update: async ({ resource, id, variables, meta }) => {
|
||||
console.log('update', resource, id, variables, meta);
|
||||
|
||||
const set = await getSignalObject(dataModels[resource].shapeType, [`${id}`]);
|
||||
const set = await getSignalObject(shapeTypes[resource], [`${id}`]);
|
||||
|
||||
const oldData = set.first()!;
|
||||
|
||||
@@ -71,7 +71,7 @@ const dataProvider = ({ dataModels, getSession }: DataProviderConfig) : DataProv
|
||||
deleteOne: async ({ resource, id, variables, meta }) => {
|
||||
console.log('deleteOne', resource, id, variables, meta);
|
||||
|
||||
const set = await getSignalObject(dataModels[resource].shapeType, [`${id}`]);
|
||||
const set = await getSignalObject(shapeTypes[resource], [`${id}`]);
|
||||
|
||||
const oldData = set.first()!;
|
||||
|
||||
@@ -85,7 +85,7 @@ const dataProvider = ({ dataModels, getSession }: DataProviderConfig) : DataProv
|
||||
console.log('getOne', resource, id, meta);
|
||||
|
||||
// The ID should be a graph URI, but if it's an object key, we can use the subjects filter to the the object
|
||||
const objects = await getObjects(dataModels[resource].shapeType, isGraphKey(id) ? `${id}` : { subjects: [`${id}`] });
|
||||
const objects = await getObjects(shapeTypes[resource], isGraphKey(id) ? `${id}` : { subjects: [`${id}`] });
|
||||
|
||||
return {
|
||||
data: addIdToObject([...objects][0])
|
||||
|
||||
@@ -3,7 +3,7 @@ import { watch } from "@ng-org/alien-deepsignals"
|
||||
import { getSignalObject, parsePatches } from "./utils";
|
||||
import { LiveProviderConfig, UnwatchFn } from "./types";
|
||||
|
||||
const liveProvider = ({ dataModels }: LiveProviderConfig) : LiveProvider => ({
|
||||
const liveProvider = ({ shapeTypes }: LiveProviderConfig) : LiveProvider => ({
|
||||
subscribe: async ({ channel, params, types, callback, meta }) : Promise<UnwatchFn> => {
|
||||
console.log('subscribe', channel, params?.subscriptionType, params, types, meta);
|
||||
|
||||
@@ -12,11 +12,11 @@ const liveProvider = ({ dataModels }: LiveProviderConfig) : LiveProvider => ({
|
||||
if (channel.startsWith("resources/")) {
|
||||
const resource = channel.split('/')[1];
|
||||
|
||||
if (dataModels[resource]) {
|
||||
if (shapeTypes[resource]) {
|
||||
|
||||
if (ids?.length > 0) {
|
||||
// We don't close the subscription because we want to keep listening for changes
|
||||
const set = await getSignalObject(dataModels[resource].shapeType, ids, false);
|
||||
const set = await getSignalObject(shapeTypes[resource], ids, false);
|
||||
|
||||
const { stopListening } = watch(set, ({ newValue, patches }) => {
|
||||
console.log('object modified', newValue, patches);
|
||||
@@ -37,7 +37,7 @@ const liveProvider = ({ dataModels }: LiveProviderConfig) : LiveProvider => ({
|
||||
|
||||
} else {
|
||||
// We don't close the subscription because we want to keep listening for changes
|
||||
const set = await getSignalObject(dataModels[resource].shapeType, undefined, false);
|
||||
const set = await getSignalObject(shapeTypes[resource], undefined, false);
|
||||
|
||||
const { stopListening } = watch(set, ({ newValue, patches }) => {
|
||||
console.log('objects list modified', newValue, patches);
|
||||
|
||||
+9
-8
@@ -1,19 +1,20 @@
|
||||
import type { AuthProvider as CoreAuthProvider } from "@refinedev/core";
|
||||
import type { ShapeType } from "@ng-org/shex-orm";
|
||||
import type { Session } from "@ng-org/web";
|
||||
|
||||
export type DataModel = {
|
||||
shapeType: ShapeType<any>;
|
||||
}
|
||||
export type ShapeTypes = Record<string, ShapeType<any>>;
|
||||
|
||||
export type DataModels = Record<string, DataModel>;
|
||||
|
||||
export type DataProviderConfig = {
|
||||
dataModels: DataModels;
|
||||
export type AuthProvider = CoreAuthProvider & {
|
||||
getSession: () => Session | undefined;
|
||||
};
|
||||
|
||||
export type DataProviderConfig = {
|
||||
shapeTypes: ShapeTypes;
|
||||
authProvider: AuthProvider;
|
||||
};
|
||||
|
||||
export type LiveProviderConfig = {
|
||||
dataModels: DataModels;
|
||||
shapeTypes: ShapeTypes;
|
||||
};
|
||||
|
||||
export type UnwatchFn = () => void;
|
||||
|
||||
Reference in New Issue
Block a user