ncantu 8208809f03 UserWallet login flow, website-skeleton contract verify, data init/migrate
**Motivations:**
- Parcours login contrat: sélection service → membre → build path → proof, vérification côté parent (service-login-verify)
- Scripts data: initialisation SQLite (utxos, anchors, fees), migration depuis fichiers, sync UTXOs
- Website-skeleton: intégration contrat, extraction validateurs login, vérification preuve

**Root causes:**
- N/A (évolutions)

**Correctifs:**
- N/A

**Evolutions:**
- UserWallet: MemberSelectionScreen, LoginScreen machine à états (S_LOGIN_SELECT_SERVICE → S_LOGIN_SELECT_MEMBER → build path), service/membre via query params, useChannel/iframeChannel
- Website-skeleton: contract.ts (extractLoginValidators, isValidContract, isValidAction), main.ts validateurs depuis contrat, config étendu
- Data: init-db.js (tables utxos/anchors/fees), migrate-from-files.js

**Pages affectées:**
- data/init-db.js, data/migrate-from-files.js, data/sync-utxos.log
- userwallet: App, LoginCollectShare, LoginScreen, MemberSelectionScreen, ServiceListScreen, useChannel, iframeChannel
- website-skeleton: README, config, contract, main
2026-01-28 01:20:43 +01:00

65 lines
1.8 KiB
TypeScript

import type { Validateurs } from 'service-login-verify';
import type { Contrat, Action } from './config.js';
/**
* Extract login action validators from contract and child contracts.
* Searches for action with types_names_chiffres containing "login".
*/
export function extractLoginValidators(
contrat: Contrat,
_contratsFils: Contrat[] = [],
actions: Action[] = [],
): Validateurs | null {
// Search for login action in provided actions
const loginAction = actions.find((action) => {
const typesNames = action.datajson?.types_names_chiffres ?? '';
return typesNames.includes('login');
});
if (loginAction?.validateurs_action !== undefined) {
return loginAction.validateurs_action;
}
// If no action provided, return contract validators as fallback
// (assuming contract validators are for login action)
if (contrat.validateurs !== undefined) {
return contrat.validateurs;
}
return null;
}
/**
* Check if a contract structure is valid.
*/
export function isValidContract(contrat: unknown): contrat is Contrat {
if (typeof contrat !== 'object' || contrat === null) {
return false;
}
const c = contrat as Record<string, unknown>;
return (
typeof c.uuid === 'string' &&
typeof c.validateurs === 'object' &&
c.validateurs !== null &&
Array.isArray((c.validateurs as { membres_du_role?: unknown }).membres_du_role)
);
}
/**
* Check if an action structure is valid.
*/
export function isValidAction(action: unknown): action is Action {
if (typeof action !== 'object' || action === null) {
return false;
}
const a = action as Record<string, unknown>;
return (
typeof a.uuid === 'string' &&
typeof a.validateurs_action === 'object' &&
a.validateurs_action !== null &&
Array.isArray(
(a.validateurs_action as { membres_du_role?: unknown }).membres_du_role,
)
);
}