]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/lib/user.ts
Rename Pod -> Server
[github/Chocobozzz/PeerTube.git] / server / lib / user.ts
index 8609e72d8ea1611b86347719f2e8b53544810e61..9884e566f9f5ea0a69bd0db44dd0eb8f5322f125 100644 (file)
@@ -1,46 +1,60 @@
+import * as Sequelize from 'sequelize'
+import { getActivityPubUrl } from '../helpers/activitypub'
+import { createPrivateAndPublicKeys } from '../helpers/peertube-crypto'
 import { database as db } from '../initializers'
+import { CONFIG } from '../initializers/constants'
 import { UserInstance } from '../models'
-import { addVideoAuthorToFriends } from './friends'
 import { createVideoChannel } from './video-channel'
 
-function createUserAuthorAndChannel (user: UserInstance, validateUser = true) {
-  return db.sequelize.transaction(t => {
+async function createUserAccountAndChannel (user: UserInstance, validateUser = true) {
+  const res = await db.sequelize.transaction(async t => {
     const userOptions = {
       transaction: t,
       validate: validateUser
     }
 
-    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 createLocalAccount(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 }
   })
+
+  return res
+}
+
+async function createLocalAccount (name: string, userId: number, applicationId: number, t: Sequelize.Transaction) {
+  const { publicKey, privateKey } = await createPrivateAndPublicKeys()
+  const url = getActivityPubUrl('account', name)
+
+  const accountInstance = db.Account.build({
+    name,
+    url,
+    publicKey,
+    privateKey,
+    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
+  })
+
+  return accountInstance.save({ transaction: t })
 }
 
 // ---------------------------------------------------------------------------
 
 export {
-  createUserAuthorAndChannel
+  createUserAccountAndChannel,
+  createLocalAccount
 }