- return user.save(userOptions)
- .then(user => {
- const author = db.Author.build({
- name: user.username,
- podId: null, // It is our pod
- userId: user.id
- })
-
- return author.save({ transaction: t })
- .then(author => ({ author, user }))
- })
- .then(({ author, user }) => {
- const remoteVideoAuthor = author.toAddRemoteJSON()
-
- // Now we'll add the video channel's meta data to our friends
- return addVideoAuthorToFriends(remoteVideoAuthor, t)
- .then(() => ({ author, user }))
- })
- .then(({ author, user }) => {
- const videoChannelInfo = {
- name: `Default ${user.username} channel`
- }
-
- return createVideoChannel(videoChannelInfo, author, t)
- .then(videoChannel => ({ author, user, videoChannel }))
- })
+ const userCreated = await user.save(userOptions)
+ const accountCreated = await createLocalAccountWithoutKeys(user.username, user.id, null, t)
+
+ const videoChannelName = `Default ${userCreated.username} channel`
+ const videoChannelInfo = {
+ name: videoChannelName
+ }
+ const videoChannel = await createVideoChannel(videoChannelInfo, accountCreated, t)
+
+ return { account: accountCreated, videoChannel }
+ })
+
+ // Set account keys, this could be long so process after the account creation and do not block the client
+ const { publicKey, privateKey } = await createPrivateAndPublicKeys()
+ account.set('publicKey', publicKey)
+ account.set('privateKey', privateKey)
+ account.save().catch(err => logger.error('Cannot set public/private keys of local account %d.', account.id, err))
+
+ return { account, videoChannel }
+}
+
+async function createLocalAccountWithoutKeys (name: string, userId: number, applicationId: number, t: Sequelize.Transaction) {
+ const url = getActivityPubUrl('account', name)
+
+ const accountInstance = db.Account.build({
+ name,
+ url,
+ publicKey: null,
+ privateKey: null,
+ followersCount: 0,
+ followingCount: 0,
+ inboxUrl: url + '/inbox',
+ outboxUrl: url + '/outbox',
+ sharedInboxUrl: CONFIG.WEBSERVER.URL + '/inbox',
+ followersUrl: url + '/followers',
+ followingUrl: url + '/following',
+ userId,
+ applicationId,
+ serverId: null // It is our server