refactor(storage): replace configureStorageApi with additive registration pattern

This commit is contained in:
2026-04-19 16:06:32 -04:00
parent b49cddece3
commit 692a014dd8
5 changed files with 50 additions and 12 deletions
+2 -2
View File
@@ -10,9 +10,9 @@
* - All other paths → session required; access governed by registered policies
* - Unknown paths → denied
*
* Call configureStorageApi({ getPublicPrefixes, getAccessPolicies }) during
* Call registerStoragePolicies() and registerStoragePublicPrefixes() during
* initializeZen before the first request, following the same pattern as
* configureRouter in core/api/runtime.js.
* registerFeatureRoutes in core/api/runtime.js.
*/
import { cookies } from 'next/headers';
+1 -1
View File
@@ -350,4 +350,4 @@ export {
moveFile,
};
export { configureStorageApi } from './storage-config.js';
export { registerStoragePolicies, registerStoragePublicPrefixes, clearStorageConfig } from './storage-config.js';
+32 -9
View File
@@ -1,21 +1,44 @@
/**
* Storage API runtime configuration.
* Holds injected prefix/policy resolvers — same pattern as core/api/runtime.js.
* Imported by both api.js (reads) and index.js (exports configureStorageApi).
*
* Additive registration — mirrors core/api/runtime.js:
* registerStoragePolicies(policies) called by features during initializeZen()
* registerStoragePublicPrefixes(prefixes) called by features during initializeZen()
* clearStorageConfig() called by resetZenInitialization() / tests
*
* getStorageAccessPolicies() and getStoragePublicPrefixes() are read-only readers
* used internally by api.js — they are not re-exported from index.js.
*/
let _getPublicPrefixes = () => [];
let _getAccessPolicies = () => [];
const POLICIES_KEY = Symbol.for('__ZEN_STORAGE_POLICIES__');
const PREFIXES_KEY = Symbol.for('__ZEN_STORAGE_PUBLIC_PREFIXES__');
export function configureStorageApi({ getPublicPrefixes, getAccessPolicies }) {
_getPublicPrefixes = getPublicPrefixes;
_getAccessPolicies = getAccessPolicies;
if (!globalThis[POLICIES_KEY]) globalThis[POLICIES_KEY] = [];
if (!globalThis[PREFIXES_KEY]) globalThis[PREFIXES_KEY] = [];
export function registerStoragePolicies(policies) {
if (!Array.isArray(policies)) {
throw new TypeError('registerStoragePolicies: policies must be an array');
}
globalThis[POLICIES_KEY].push(...policies);
}
export function registerStoragePublicPrefixes(prefixes) {
if (!Array.isArray(prefixes)) {
throw new TypeError('registerStoragePublicPrefixes: prefixes must be an array');
}
globalThis[PREFIXES_KEY].push(...prefixes);
}
export function clearStorageConfig() {
globalThis[POLICIES_KEY].length = 0;
globalThis[PREFIXES_KEY].length = 0;
}
export function getStoragePublicPrefixes() {
return _getPublicPrefixes();
return globalThis[PREFIXES_KEY];
}
export function getStorageAccessPolicies() {
return _getAccessPolicies();
return globalThis[POLICIES_KEY];
}
+11
View File
@@ -0,0 +1,11 @@
/**
* Auth feature — storage access policies.
*
* Registered during initializeZen() via registerStoragePolicies().
* The auth feature owns its access rules; core/storage stays generic.
*/
export const storageAccessPolicies = [
// users/{userId}/... — seul le propriétaire ou un admin peut accéder
{ prefix: 'users', type: 'owner' },
];
+4
View File
@@ -15,8 +15,10 @@
*/
import { configureRouter, registerFeatureRoutes, clearRouterConfig, clearFeatureRoutes } from '@zen/core/api';
import { registerStoragePolicies, clearStorageConfig } from '@zen/core/storage';
import { validateSession } from '../../features/auth/lib/session.js';
import { routes as authRoutes } from '../../features/auth/api.js';
import { storageAccessPolicies } from '../../features/auth/storage-policies.js';
import { done, warn } from './logger.js';
const ZEN_INIT_KEY = Symbol.for('__ZEN_INITIALIZED__');
@@ -35,6 +37,7 @@ export async function initializeZen() {
configureRouter({ resolveSession: validateSession });
registerFeatureRoutes(authRoutes);
registerStoragePolicies(storageAccessPolicies);
done('ZEN: ready');
@@ -45,5 +48,6 @@ export function resetZenInitialization() {
globalThis[ZEN_INIT_KEY] = false;
clearRouterConfig();
clearFeatureRoutes();
clearStorageConfig();
warn('ZEN: initialization reset');
}