Skip to content

Commit

Permalink
Make MongoLab resource using promises
Browse files Browse the repository at this point in the history
  • Loading branch information
pkozlowski-opensource committed Sep 17, 2012
1 parent 21a9de2 commit 2b8fceb
Show file tree
Hide file tree
Showing 6 changed files with 187 additions and 87 deletions.
2 changes: 1 addition & 1 deletion grunt.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ module.exports = function (grunt) {
}
},
watch:{
files:['<config:src.js>', '<config:test.js>', '<config:src.less>', 'src/index.html'], //need to have a path to index.html, otherwise watch won't pick it up
files:['<config:src.js>', '<config:test.js>', '<config:src.less>', 'src/modules/*/partials/**/*.tpl.html', 'src/index.html'], //need to have a path to index.html, otherwise watch won't pick it up
tasks:'build'
},
jshint:{
Expand Down
1 change: 0 additions & 1 deletion src/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
<link rel="stylesheet" type="text/css" href="<%= grunt.config.get('pkg.name') %>.css"/>

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.1/angular.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.1/angular-resource.js"></script>
<script type="text/javascript" src="<%= grunt.config.get('pkg.name') %>.js"></script>

<!-- partials:start -->
Expand Down
141 changes: 109 additions & 32 deletions src/lib/mongolab/mongolab-resource.js
Original file line number Diff line number Diff line change
@@ -1,43 +1,120 @@
angular.module('mongolabResource', ['ngResource']).factory('$mongolabResource', ['$resource', 'API_KEY', 'DB_NAME', 'jsonFilter', function ($resource, API_KEY, DB_NAME, jsonFilter) {
angular.module('mongolabResource', []).factory('$mongolabResource', ['$http', 'jsonFilter', 'API_KEY', 'DB_NAME', function ($http, jsonFilter, API_KEY, DB_NAME) {

function MmongolabResourceFactory(collectionName) {
function MmongolabResourceFactory(collectionName) {

var resource = $resource('https://api.mongolab.com/api/1/databases/' + DB_NAME + '/collections/' + collectionName + '/:id',
{ apiKey:API_KEY, id:'@_id.$oid'}, { update:{ method:'PUT' } }
);
var url = 'https://api.mongolab.com/api/1/databases/' + DB_NAME + '/collections/' + collectionName;
var defaultParams = {apiKey:API_KEY};

resource.getById = function (id, cb, errorcb) {
return resource.get({id:id}, cb, errorcb);
};
var Resource = function (data) {
angular.extend(this, data);
};

var query = resource.query;
resource.query = function (queryJson, cb, errorcb) {
var q = angular.isObject(queryJson) ? {q:jsonFilter(queryJson)} : {};
return query(q, cb, errorcb);
};
Resource.all = function (cb, errorcb) {
return Resource.query({}, cb, errorcb);
};

resource.prototype.update = function (cb, errorcb) {
return resource.update({id:this._id.$oid}, angular.extend({}, this, {_id:undefined}), cb, errorcb);
};
Resource.query = function (queryJson, cb, errorcb) {

resource.prototype.saveOrUpdate = function (savecb, updatecb, errorSavecb, errorUpdatecb) {
if (this._id && this._id.$oid) {
return this.update(updatecb, errorUpdatecb);
} else {
return this.$save(savecb, errorSavecb);
var params = angular.isObject(queryJson) ? {q:jsonFilter(queryJson)} : {};
var httpPromise = $http.get(url, {params:angular.extend({}, defaultParams, params)});
var scb = cb || angular.noop;
var ecb = errorcb || angular.noop;

return httpPromise.then(function (response) {
var result = [];
for (var i = 0; i < response.data.length; i++) {
result.push(new Resource(response.data[i]));
}
};
scb(result, response.status, response.headers, response.config);
return result;

}, function (response) {
ecb(undefined, response.status, response.headers, response.config);
return undefined;
});
};

Resource.getById = function (id, cb, errorcb) {
var httpPromise = $http.get(url + '/' + id, {params:defaultParams});
var scb = cb || angular.noop;
var ecb = errorcb || angular.noop;

return httpPromise.then(function (response) {
var result = new Resource(response.data);
scb(result, response.status, response.headers, response.config);
return result;
}, function (response) {
ecb(undefined, response.status, response.headers, response.config);
return undefined;
});
};

//instance methods

Resource.prototype.$id = function() {
if (this._id && this._id.$oid) {
return this._id.$oid;
}
};

Resource.prototype.$save = function (cb, errorcb) {
var httpPromise = $http.post(url, this, {params:defaultParams});
var scb = cb || angular.noop;
var ecb = errorcb || angular.noop;

return httpPromise.then(function (response) {
var result = new Resource(response.data);
scb(result, response.status, response.headers, response.config);
return result;
}, function (response) {
ecb(undefined, response.status, response.headers, response.config);
return undefined;
});
};

Resource.prototype.$update = function (cb, errorcb) {
var httpPromise = $http.post(url + "/" + this.$id(), angular.extend({}, this, {_id:undefined}), {params:defaultParams});
var scb = cb || angular.noop;
var ecb = errorcb || angular.noop;

return httpPromise.then(function (response) {
var result = new Resource(response.data);
scb(result, response.status, response.headers, response.config);
return result;
}, function (response) {
ecb(undefined, response.status, response.headers, response.config);
return undefined;
});
};

Resource.prototype.$remove = function (cb, errorcb) {
var httpPromise = $http.delete(url + "/" + this.$id(), {params:defaultParams});
var scb = cb || angular.noop;
var ecb = errorcb || angular.noop;

resource.prototype.remove = function (cb, errorcb) {
return resource.remove({id:this._id.$oid}, cb, errorcb);
};
return httpPromise.then(function (response) {
var result = new Resource(response.data);
scb(result, response.status, response.headers, response.config);
return result;
}, function (response) {
ecb(undefined, response.status, response.headers, response.config);
return undefined;
});
};

resource.prototype['delete'] = function (cb, errorcb) {
return this.remove(cb, errorcb);
};
Resource.prototype.$saveOrUpdate = function (savecb, updatecb, errorSavecb, errorUpdatecb) {
if (this.$id()) {
return this.$update(updatecb, errorUpdatecb);
} else {
return this.$save(savecb, errorSavecb);
}
};

return resource;
}
return Resource;
}
return MmongolabResourceFactory;
}]);

return MmongolabResourceFactory;
}]);
//TODO: tests
//TODO: DRY
//TODO: make the first param to query optional
41 changes: 10 additions & 31 deletions src/modules/admin/admin-projects.js
Original file line number Diff line number Diff line change
@@ -1,34 +1,26 @@
angular.module('admin-projects', ['services.projects', 'services.users']);

angular.module('admin-projects').controller('AdminProjectsCtrl', ['$scope', '$location', 'Projects', function ($scope, $location, Projects) {
$scope.projects = Projects.query();
angular.module('admin-projects').controller('AdminProjectsCtrl', ['$scope', '$location', 'projects', function ($scope, $location, projects) {

$scope.projects = projects;

$scope.itemView = function (item) {
$location.path('/admin/projects/' + item._id.$oid);
};
}]);

angular.module('admin-projects').controller('AdminProjectEditCtrl', ['$scope', '$location', '$routeParams', 'Projects', 'Users', 'Roles', function ($scope, $location, $routeParams, Projects, Users, Roles) {

$scope.users = Users.query();
$scope.roles = Roles;
angular.module('admin-projects').controller('AdminProjectEditCtrl', ['$scope', '$location', 'users', 'project', function ($scope, $location, users, project) {

if ($routeParams.projectId) {
Projects.getById($routeParams.projectId, function (item) {
$scope.item = item;
$scope.itemCopy = angular.copy(item);
});
} else {
$scope.item = new Projects({users:[]});
$scope.itemCopy = angular.copy($scope.item);
}
$scope.users = users;
$scope.item = project;
$scope.itemCopy = angular.copy($scope.item);

var editCompleted = function () {
$location.path('/admin/projects');
};

$scope.save = function () {
$scope.item.saveOrUpdate(editCompleted, editCompleted);
$scope.item.$saveOrUpdate(editCompleted, editCompleted);
};

$scope.canSave = function () {
Expand All @@ -45,22 +37,9 @@ angular.module('admin-projects').controller('AdminProjectEditCtrl', ['$scope', '

$scope.remove = function () {
if ($scope.item._id) {
$scope.item.remove(editCompleted);
$scope.item.$remove(editCompleted);
} else {
editCompleted();
}
};

$scope.addUserWithRole = function () {
if (!angular.isArray($scope.item.users)){
$scope.item.users = [];
}
$scope.item.users.push($scope.projectUser);
$scope.projectUser = {};
};

$scope.removeUserWithRole = function (userWithRole) {
var index = $scope.item.users.indexOf(userWithRole);
$scope.item.users.splice(index,1);
};
}]);
}])
23 changes: 8 additions & 15 deletions src/modules/admin/admin-users.js
Original file line number Diff line number Diff line change
@@ -1,31 +1,24 @@
angular.module('admin-users', ['services.users']);

angular.module('admin-users').controller('AdminUsersCtrl', ['$scope', '$location', 'Users', function ($scope, $location, Users) {
$scope.users = Users.query();
angular.module('admin-users').controller('AdminUsersCtrl', ['$scope', '$location', 'users', function ($scope, $location, users) {
$scope.users = users;

$scope.itemView = function (item) {
$location.path('/admin/users/' + item._id.$oid);
$location.path('/admin/users/' + item.$id());
};
}]);

angular.module('admin-users').controller('AdminUserEditCtrl', ['$scope', '$location', '$routeParams', 'Users', function ($scope, $location, $routeParams, Users) {
angular.module('admin-users').controller('AdminUserEditCtrl', ['$scope', '$location', 'user', function ($scope, $location, user) {

if ($routeParams.userId) {
Users.getById($routeParams.userId, function (item) {
$scope.item = item;
$scope.itemCopy = angular.copy(item);
});
} else {
$scope.item = new Users();
$scope.itemCopy = angular.copy($scope.item);
}
$scope.item = user;
$scope.itemCopy = angular.copy($scope.item);

var editCompleted = function () {
$location.path('/admin/users');
};

$scope.save = function () {
$scope.item.saveOrUpdate(editCompleted, editCompleted);
$scope.item.$saveOrUpdate(editCompleted, editCompleted);
};

$scope.canSave = function () {
Expand All @@ -42,7 +35,7 @@ angular.module('admin-users').controller('AdminUserEditCtrl', ['$scope', '$locat

$scope.remove = function () {
if ($scope.item._id) {
$scope.item.remove(editCompleted);
$scope.item.$remove(editCompleted);
} else {
editCompleted();
}
Expand Down
66 changes: 59 additions & 7 deletions src/modules/app/app.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
angular.module('app', ['ngResource', 'signin', 'dashboard', 'admin']);
angular.module('app', ['signin', 'dashboard', 'admin']);

angular.module('app').constant('API_KEY', '4fb51e55e4b02e56a67b0b66');
angular.module('app').constant('DB_NAME', 'ascrum');
Expand All @@ -10,13 +10,65 @@ angular.module('app').config(['$routeProvider', function ($routeProvider) {
$routeProvider.when('/dashboard', {templateUrl:'dashboard/dashboard.tpl.html', controller:'DashboardController'});

$routeProvider.when('/admin', {templateUrl:'admin/admin.tpl.html', controller:'AdminCtrl'});
$routeProvider.when('/admin/projects', {templateUrl:'admin/projects-list.tpl.html', controller:'AdminProjectsCtrl'});
$routeProvider.when('/admin/projects/new', {templateUrl:'admin/project-edit.tpl.html', controller:'AdminProjectEditCtrl'});
$routeProvider.when('/admin/projects/:projectId', {templateUrl:'admin/project-edit.tpl.html', controller:'AdminProjectEditCtrl'});

$routeProvider.when('/admin/users', {templateUrl:'admin/users-list.tpl.html', controller:'AdminUsersCtrl'});
$routeProvider.when('/admin/users/new', {templateUrl:'admin/user-edit.tpl.html', controller:'AdminUserEditCtrl'});
$routeProvider.when('/admin/users/:userId', {templateUrl:'admin/user-edit.tpl.html', controller:'AdminUserEditCtrl'});
$routeProvider.when('/admin/projects', {
templateUrl:'admin/projects-list.tpl.html',
controller:'AdminProjectsCtrl',
resolve:{
projects:function (Projects) {
return Projects.all();
}}
});
$routeProvider.when('/admin/projects/new', {
templateUrl:'admin/project-edit.tpl.html',
controller:'AdminProjectEditCtrl',
resolve:{
project:function (Projects) {
return new Projects()
},
users:function (Users) {
return Users.all();
}
}}
);
$routeProvider.when('/admin/projects/:projectId', {
templateUrl:'admin/project-edit.tpl.html',
controller:'AdminProjectEditCtrl',
resolve:{
project:function ($route, Projects) {
return Projects.getById($route.current.params.projectId);
},
users:function (Users) {
return Users.all();
}
}
});

$routeProvider.when('/admin/users', {
templateUrl:'admin/users-list.tpl.html',
controller:'AdminUsersCtrl',
resolve:{users:function (Users) {
return Users.all();
}}
});
$routeProvider.when('/admin/users/new', {
templateUrl:'admin/user-edit.tpl.html',
controller:'AdminUserEditCtrl',
resolve:{
user:function (Users) {
return new Users();
}
}
});
$routeProvider.when('/admin/users/:userId', {
templateUrl:'admin/user-edit.tpl.html',
controller:'AdminUserEditCtrl',
resolve:{
user:function ($route, Users) {
return Users.getById($route.current.params.userId);
}
}
});

$routeProvider.otherwise({redirectTo:'/signin'});
}]);
Expand Down

0 comments on commit 2b8fceb

Please sign in to comment.