const PassportLocalStrategy = require('passport-local').Strategy; const { createChannel } = require('../../lbrynet'); const logger = require('winston'); const db = require('../../models'); const { publishing: { closedRegistration }, } = require('@config/siteConfig'); module.exports = new PassportLocalStrategy( { usernameField: 'username', passwordField: 'password', }, (username, password, done) => { if (closedRegistration) { return done('Registration is disabled'); } logger.verbose(`new channel signup request. user: ${username} pass: ${password} .`); let userInfo = {}; // server-side validaton of inputs (username, password) // create the channel and retrieve the metadata return createChannel(`@${username}`) .then(tx => { // create user record const userData = { userName: username, password: password, }; logger.verbose('userData >', userData); // create user record const channelData = { channelName: `@${username}`, channelClaimId: tx.outputs[0].claim_id, }; logger.verbose('channelData >', channelData); // create certificate record const certificateData = { claimId: tx.outputs[0].claim_id, name: `@${username}`, // address, }; logger.verbose('certificateData >', certificateData); // save user and certificate to db return Promise.all([ db.User.create(userData), db.Channel.create(channelData), db.Certificate.create(certificateData), ]); }) .then(([newUser, newChannel, newCertificate]) => { logger.verbose('user and certificate successfully created'); // store the relevant newUser info to be passed back for req.User userInfo['id'] = newUser.id; userInfo['userName'] = newUser.userName; userInfo['channelName'] = newChannel.channelName; userInfo['channelClaimId'] = newChannel.channelClaimId; // associate the instances return Promise.all([newCertificate.setChannel(newChannel), newChannel.setUser(newUser)]); }) .then(() => { logger.verbose('user and certificate successfully associated'); return db.Certificate.getShortChannelIdFromLongChannelId( userInfo.channelClaimId, userInfo.channelName ); }) .then(shortChannelId => { userInfo['shortChannelId'] = shortChannelId; return done(null, userInfo); }) .catch(error => { logger.error('signup error', error); return done(error); }); } );