ClientLocal -> OAuthClientLocal
[oweals/peertube.git] / server / controllers / api / pods.ts
1 import * as express from 'express'
2 import { waterfall } from 'async'
3
4 import { database as db } from '../../initializers/database'
5 import { CONFIG } from '../../initializers'
6 import {
7   logger,
8   getMyPublicCert,
9   getFormatedObjects
10 } from '../../helpers'
11 import {
12   sendOwnedVideosToPod,
13   makeFriends,
14   quitFriends
15 } from '../../lib'
16 import {
17   podsAddValidator,
18   authenticate,
19   ensureIsAdmin,
20   makeFriendsValidator,
21   setBodyHostPort,
22   setBodyHostsPort
23 } from '../../middlewares'
24 import {
25   PodInstance
26 } from '../../models'
27
28 const podsRouter = express.Router()
29
30 podsRouter.get('/', listPods)
31 podsRouter.post('/',
32   setBodyHostPort, // We need to modify the host before running the validator!
33   podsAddValidator,
34   addPods
35 )
36 podsRouter.post('/makefriends',
37   authenticate,
38   ensureIsAdmin,
39   makeFriendsValidator,
40   setBodyHostsPort,
41   makeFriendsController
42 )
43 podsRouter.get('/quitfriends',
44   authenticate,
45   ensureIsAdmin,
46   quitFriendsController
47 )
48
49 // ---------------------------------------------------------------------------
50
51 export {
52   podsRouter
53 }
54
55 // ---------------------------------------------------------------------------
56
57 function addPods (req: express.Request, res: express.Response, next: express.NextFunction) {
58   const informations = req.body
59
60   waterfall<string, Error>([
61     function addPod (callback) {
62       const pod = db.Pod.build(informations)
63       pod.save().asCallback(function (err, podCreated) {
64         // Be sure about the number of parameters for the callback
65         return callback(err, podCreated)
66       })
67     },
68
69     function sendMyVideos (podCreated: PodInstance, callback) {
70       sendOwnedVideosToPod(podCreated.id)
71
72       callback(null)
73     },
74
75     function fetchMyCertificate (callback) {
76       getMyPublicCert(function (err, cert) {
77         if (err) {
78           logger.error('Cannot read cert file.')
79           return callback(err)
80         }
81
82         return callback(null, cert)
83       })
84     }
85   ], function (err, cert) {
86     if (err) return next(err)
87
88     return res.json({ cert: cert, email: CONFIG.ADMIN.EMAIL })
89   })
90 }
91
92 function listPods (req: express.Request, res: express.Response, next: express.NextFunction) {
93   db.Pod.list(function (err, podsList) {
94     if (err) return next(err)
95
96     res.json(getFormatedObjects(podsList, podsList.length))
97   })
98 }
99
100 function makeFriendsController (req: express.Request, res: express.Response, next: express.NextFunction) {
101   const hosts = req.body.hosts as string[]
102
103   makeFriends(hosts, function (err) {
104     if (err) {
105       logger.error('Could not make friends.', { error: err })
106       return
107     }
108
109     logger.info('Made friends!')
110   })
111
112   res.type('json').status(204).end()
113 }
114
115 function quitFriendsController (req: express.Request, res: express.Response, next: express.NextFunction) {
116   quitFriends(function (err) {
117     if (err) return next(err)
118
119     res.type('json').status(204).end()
120   })
121 }