@@ -5,6 +5,8 @@ var User = require('./../user/user.model');
55var github = require ( 'octonode' ) ;
66var common = require ( '../common.js' ) ;
77var cache = require ( 'rediscache' ) ;
8+ var Q = require ( "q" ) ;
9+
810
911cache . connect ( ) . configure ( {
1012 expiry : 86400
@@ -25,26 +27,45 @@ exports.index = function (req, res, next) {
2527 */
2628exports . create = function ( req , res , next ) {
2729 var userId = req . user . _id ;
30+ var owner = req . body . owner ;
31+ var repo = req . body . repo ;
2832
2933 // Check if project already exists
3034 Project . findOne ( {
31- owner : req . body . owner ,
32- repo : req . body . repo
35+ owner : owner ,
36+ repo : repo
3337 } , function ( err , project ) {
3438 if ( project ) return res . json ( project ) ;
3539
36- // Check repo ownership
37- // TODO
40+ // Check repo permission
41+ var user = Q . nfcall ( User . findOne . bind ( User ) , { _id : userId } ) ;
42+ var accessToken = user . then ( function ( user ) {
43+ if ( ! user || ! user . github || ! user . github . accessToken ) throw new Error ( 'Cannot get access token' ) ;
44+ return user . github . accessToken ;
45+ } ) ;
46+ var githubClient = accessToken . then ( function ( accessToken ) {
47+ return github . client ( accessToken ) ;
48+ } ) ;
49+ var repoPermissions = githubClient . then ( function ( githubClient ) {
50+ var ghrepo = githubClient . repo ( owner + '/' + repo ) ;
51+ return Q . nfcall ( ghrepo . info . bind ( ghrepo ) ) . spread ( function ( data , headers ) {
52+ return data . permissions ;
53+ } ) ;
54+ } ) ;
55+
56+ repoPermissions . then ( function ( repoPermissions ) {
57+ if ( ! repoPermissions . admin ) next ( new Error ( 'User does not have admin permission for repo' ) ) ;
3858
39- var project = {
40- owner : req . body . owner ,
41- repo : req . body . repo ,
42- createdBy : userId
43- } ;
59+ var project = {
60+ owner : owner ,
61+ repo : repo ,
62+ createdBy : userId
63+ } ;
4464
45- Project . create ( project , function ( err , project ) {
46- if ( err ) return next ( err ) ;
47- res . json ( project ) ;
65+ Project . create ( project , function ( err , project ) {
66+ if ( err ) return next ( err ) ;
67+ res . json ( project ) ;
68+ } ) ;
4869 } ) ;
4970
5071 } ) ;
0 commit comments