Refactor auth and init README

This commit is contained in:
srosset81
2026-07-10 18:35:35 +02:00
parent 69ebc2b164
commit 85a3c4b771
9 changed files with 233 additions and 180 deletions
+66 -88
View File
@@ -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;
+7 -7
View File
@@ -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])
+4 -4
View File
@@ -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
View File
@@ -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;