]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/controllers/api/v1/users.js
Server: delete user with the id and not the username
[github/Chocobozzz/PeerTube.git] / server / controllers / api / v1 / users.js
index caa979567aad89efdc14af635bee29388c565ab3..704df770c4fb8099325ab363e95000bfa02f3614 100644 (file)
@@ -1,16 +1,48 @@
 'use strict'
 
-const config = require('config')
-const mongoose = require('mongoose')
+const each = require('async/each')
 const express = require('express')
-const oAuth = require('../../../middlewares').oauth
+const mongoose = require('mongoose')
+const waterfall = require('async/waterfall')
+
+const constants = require('../../../initializers/constants')
+const friends = require('../../../lib/friends')
+const logger = require('../../../helpers/logger')
+const middlewares = require('../../../middlewares')
+const admin = middlewares.admin
+const oAuth = middlewares.oauth
+const validatorsUsers = middlewares.validators.users
 
-const Client = mongoose.model('OAuthClient')
+const User = mongoose.model('User')
+const Video = mongoose.model('Video')
 
 const router = express.Router()
 
-router.get('/client', getAngularClient)
+router.get('/', listUsers)
+router.get('/me', oAuth.authenticate, getUserInformation)
+
+router.post('/',
+  oAuth.authenticate,
+  admin.ensureIsAdmin,
+  validatorsUsers.usersAdd,
+  createUser
+)
+
+router.put('/:id',
+  oAuth.authenticate,
+  validatorsUsers.usersUpdate,
+  updateUser
+)
+
+router.delete('/:id',
+  oAuth.authenticate,
+  admin.ensureIsAdmin,
+  validatorsUsers.usersRemove,
+  removeUser
+)
+
 router.post('/token', oAuth.token, success)
+// TODO: Once https://github.com/oauthjs/node-oauth2-server/pull/289 is merged, implement revoke token route
 
 // ---------------------------------------------------------------------------
 
@@ -18,23 +50,91 @@ module.exports = router
 
 // ---------------------------------------------------------------------------
 
-function getAngularClient (req, res, next) {
-  const serverHost = config.get('webserver.host')
-  const serverPort = config.get('webserver.port')
-  let headerHostShouldBe = serverHost
-  if (serverPort !== 80 && serverPort !== 443) {
-    headerHostShouldBe += ':' + serverPort
-  }
+function createUser (req, res, next) {
+  const user = new User({
+    username: req.body.username,
+    password: req.body.password,
+    role: constants.USER_ROLES.USER
+  })
+
+  user.save(function (err, createdUser) {
+    if (err) return next(err)
+
+    return res.type('json').status(204).end()
+  })
+}
+
+function getUserInformation (req, res, next) {
+  User.loadByUsername(res.locals.oauth.token.user.username, function (err, user) {
+    if (err) return next(err)
+
+    return res.json(user.toFormatedJSON())
+  })
+}
+
+function listUsers (req, res, next) {
+  User.list(function (err, usersList) {
+    if (err) return next(err)
 
-  if (req.get('host') !== headerHostShouldBe) return res.type('json').status(403).end()
+    res.json(getFormatedUsers(usersList))
+  })
+}
+
+function removeUser (req, res, next) {
+  waterfall([
+    function getUser (callback) {
+      User.loadById(req.params.id, callback)
+    },
+
+    function getVideos (user, callback) {
+      Video.listOwnedByAuthor(user.username, function (err, videos) {
+        return callback(err, user, videos)
+      })
+    },
+
+    function removeVideosFromDB (user, videos, callback) {
+      each(videos, function (video, callbackEach) {
+        video.remove(callbackEach)
+      }, function (err) {
+        return callback(err, user, videos)
+      })
+    },
+
+    function sendInformationToFriends (user, videos, callback) {
+      videos.forEach(function (video) {
+        const params = {
+          name: video.name,
+          magnetUri: video.magnetUri
+        }
 
-  Client.loadFirstClient(function (err, client) {
+        friends.removeVideoToFriends(params)
+      })
+
+      return callback(null, user)
+    },
+
+    function removeUserFromDB (user, callback) {
+      user.remove(callback)
+    }
+  ], function andFinally (err) {
+    if (err) {
+      logger.error('Errors when removed the user.', { error: err })
+      return next(err)
+    }
+
+    return res.sendStatus(204)
+  })
+}
+
+function updateUser (req, res, next) {
+  User.loadByUsername(res.locals.oauth.token.user.username, function (err, user) {
     if (err) return next(err)
-    if (!client) return next(new Error('No client available.'))
 
-    res.json({
-      client_id: client._id,
-      client_secret: client.clientSecret
+    user.password = req.body.password
+    user.save(function (err) {
+      if (err) return next(err)
+
+      return res.sendStatus(204)
     })
   })
 }
@@ -42,3 +142,17 @@ function getAngularClient (req, res, next) {
 function success (req, res, next) {
   res.end()
 }
+
+// ---------------------------------------------------------------------------
+
+function getFormatedUsers (users) {
+  const formatedUsers = []
+
+  users.forEach(function (user) {
+    formatedUsers.push(user.toFormatedJSON())
+  })
+
+  return {
+    data: formatedUsers
+  }
+}