]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/controllers/api/v1/users.js
Server: move clients in its own file
[github/Chocobozzz/PeerTube.git] / server / controllers / api / v1 / users.js
1 'use strict'
2
3 const each = require('async/each')
4 const express = require('express')
5 const mongoose = require('mongoose')
6 const waterfall = require('async/waterfall')
7
8 const constants = require('../../../initializers/constants')
9 const friends = require('../../../lib/friends')
10 const logger = require('../../../helpers/logger')
11 const middlewares = require('../../../middlewares')
12 const admin = middlewares.admin
13 const oAuth = middlewares.oauth
14 const validatorsUsers = middlewares.validators.users
15
16 const User = mongoose.model('User')
17 const Video = mongoose.model('Video')
18
19 const router = express.Router()
20
21 router.get('/', listUsers)
22
23 router.post('/',
24 oAuth.authenticate,
25 admin.ensureIsAdmin,
26 validatorsUsers.usersAdd,
27 createUser
28 )
29
30 router.put('/:id',
31 oAuth.authenticate,
32 validatorsUsers.usersUpdate,
33 updateUser
34 )
35
36 router.delete('/:username',
37 oAuth.authenticate,
38 admin.ensureIsAdmin,
39 validatorsUsers.usersRemove,
40 removeUser
41 )
42
43 router.post('/token', oAuth.token, success)
44 // TODO: Once https://github.com/oauthjs/node-oauth2-server/pull/289 is merged, implement revoke token route
45
46 // ---------------------------------------------------------------------------
47
48 module.exports = router
49
50 // ---------------------------------------------------------------------------
51
52 function createUser (req, res, next) {
53 const user = new User({
54 username: req.body.username,
55 password: req.body.password,
56 role: constants.USER_ROLES.USER
57 })
58
59 user.save(function (err, createdUser) {
60 if (err) return next(err)
61
62 return res.type('json').status(204).end()
63 })
64 }
65
66 function listUsers (req, res, next) {
67 User.list(function (err, usersList) {
68 if (err) return next(err)
69
70 res.json(getFormatedUsers(usersList))
71 })
72 }
73
74 function removeUser (req, res, next) {
75 waterfall([
76 function getUser (callback) {
77 User.loadByUsername(req.params.username, callback)
78 },
79
80 function getVideos (user, callback) {
81 Video.listOwnedByAuthor(user.username, function (err, videos) {
82 return callback(err, user, videos)
83 })
84 },
85
86 function removeVideosFromDB (user, videos, callback) {
87 each(videos, function (video, callbackEach) {
88 video.remove(callbackEach)
89 }, function (err) {
90 return callback(err, user, videos)
91 })
92 },
93
94 function sendInformationToFriends (user, videos, callback) {
95 videos.forEach(function (video) {
96 const params = {
97 name: video.name,
98 magnetUri: video.magnetUri
99 }
100
101 friends.removeVideoToFriends(params)
102 })
103
104 return callback(null, user)
105 },
106
107 function removeUserFromDB (user, callback) {
108 user.remove(callback)
109 }
110 ], function andFinally (err) {
111 if (err) {
112 logger.error('Errors when removed the user.', { error: err })
113 return next(err)
114 }
115
116 return res.type('json').status(204).end()
117 })
118 }
119
120 function updateUser (req, res, next) {
121 User.loadByUsername(res.locals.oauth.token.user.username, function (err, user) {
122 if (err) return next(err)
123
124 user.password = req.body.password
125 user.save(function (err) {
126 if (err) return next(err)
127
128 return res.json('json').status(204).end()
129 })
130 })
131 }
132
133 function success (req, res, next) {
134 res.end()
135 }
136
137 // ---------------------------------------------------------------------------
138
139 function getFormatedUsers (users) {
140 const formatedUsers = []
141
142 users.forEach(function (user) {
143 formatedUsers.push(user.toFormatedJSON())
144 })
145
146 return {
147 data: formatedUsers
148 }
149 }