diff --git a/src/server.js b/src/server.js index cf55f25..8bda57b 100644 --- a/src/server.js +++ b/src/server.js @@ -606,6 +606,176 @@ app.post('/api/verify-code', validatePhoneNumber, (req, res) => { //------------------------------------ End of SMS Section ------------------------------------ +//------------------------------------ Signer Client Integration ----------------------------------------- + +const { SDKSignerClient } = require('sdk-signer-client'); + +// Signer client configuration +const signerConfig = { + url: process.env.SIGNER_WS_URL || 'ws://localhost:9090', + apiKey: process.env.SIGNER_API_KEY || 'your-api-key-change-this', + timeout: 30000, + reconnectInterval: 5000, + maxReconnectAttempts: 3 +}; + +// Initialize signer client +const signerClient = new SDKSignerClient(signerConfig); + +// Session storage for verified users +const verifiedSessions = new Map(); + +// Session management +class SessionManager { + static generateSessionId() { + return uuidv4(); + } + + static createSession(phoneNumber, userData = {}) { + const sessionId = this.generateSessionId(); + const session = { + id: sessionId, + phoneNumber, + userData, + createdAt: Date.now(), + expiresAt: Date.now() + (1 * 60 * 1000) // 1 minute + }; + + verifiedSessions.set(sessionId, session); + return sessionId; + } + + static getSession(sessionId) { + const session = verifiedSessions.get(sessionId); + if (!session) return null; + + if (Date.now() > session.expiresAt) { + verifiedSessions.delete(sessionId); + return null; + } + + return session; + } + + static deleteSession(sessionId) { + verifiedSessions.delete(sessionId); + } + + static cleanupExpiredSessions() { + const now = Date.now(); + for (const [sessionId, session] of verifiedSessions) { + if (now > session.expiresAt) { + verifiedSessions.delete(sessionId); + } + } + } +} + +// Middleware to validate session +const validateSession = (req, res, next) => { + const sessionId = req.headers['x-session-id'] || req.body.sessionId; + + if (!sessionId) { + return res.status(401).json({ + success: false, + message: 'Session ID requis' + }); + } + + const session = SessionManager.getSession(sessionId); + if (!session) { + return res.status(401).json({ + success: false, + message: 'Session invalide ou expirée' + }); + } + + req.session = session; + next(); +}; + +// Cleanup expired sessions every 5 minutes +setInterval(() => { + SessionManager.cleanupExpiredSessions(); +}, 5 * 60 * 1000); + +// Connect to signer on startup +(async () => { + try { + await signerClient.connect(); + console.log('Connected to signer service'); + const serverResponse = await signerClient.get_owned_processes(); + console.log('Server response:', serverResponse); + + for (const data of Object.values(serverResponse.data)) { + console.log('Process data:', data); + } + } catch (error) { + console.error('Failed to connect to signer:', error); + } +})(); + +//------------------------------------ End of Signer Client Integration ------------------------------------ + +/// client auth endpoint +/// client sends its pairing process id, we add it to the customer process +app.post('/api/v1/customer/auth/client-auth', validateSession, async (req, res) => { + const { pairingId } = req.body; + + if (!pairingId) { + return res.status(400).json({ + success: false, + message: 'Missing pairingId' + }); + } + + try { + const result = await signerClient.updateProcess(processId, newData, privateFields || [], roles || null); + + // Clean up the session after successful update + SessionManager.deleteSession(req.session.id); + + res.json({ + success: true, + message: 'Client authentication successful', + data: result + }); + } catch (error) { + console.error('Client authentication error:', error); + res.status(500).json({ + success: false, + message: 'Error during client authentication', + error: error.message + }); + } +}); + +app.post('/api/v1/customer/auth/get-phone-number-for-email', validateSession, async (req, res) => { + const { email } = req.body; + + if (!email) { + return res.status(400).json({ + success: false, + message: 'Missing email' + }); + } + + const phoneNumber = await signerClient.getPhoneNumberForEmail(email); + + if (!phoneNumber) { + return res.status(400).json({ + success: false, + message: 'No phone number found for this email' + }); + } + + res.json({ + success: true, + message: 'Phone number retrieved successfully', + phoneNumber: phoneNumber + }); +}); + //------------------------------------ Email Section -----------------------------------------