'use strict';
var app = angular.module('vehicles', ['ngRoute']);
// lista de marcas
app.constant('brandList', [{ id: 1, name: 'Volkswagen' }, { id: 2, name: 'Nissan' }])
// lista de modelos
.constant('modelList', [{ id: 1, name: 'Gol', brand_id: 1 }, { id: 2, name: 'March', brand_id: 2 }])
.factory('removeVehicle', function($window, vehicleAPI) {
return function(vehicle, callback) {
// mensagem de confirmação
var result = $window.confirm('Você tem certeza que deseja remover o veículo \'' + vehicle.name + '\'?');
if(result) {
// chama a factory da api para remover o veículo
vehicleAPI.delete(vehicle.id, function(err, result) {
return callback(err, !!result);
});
} else {
return callback(null, false);
}
};
})
.factory('vehicleAPI', function($window, $http, $rootScope) {
// Trata o erro da API
var handleError = function(err, callback) {
$rootScope.hasError = true;
$rootScope.errorMessage = err.data.statusCode + ' - ' + err.data.message;
return callback(err);
};
// Reseta o parâmetro do erro
var resetError = function() {
$rootScope.hasError = false;
};
return {
// busca todos os veículos
getAll: function(callback) {
resetError();
// chamada GET para a API
return $http.get($window.API_URL + '/vehicles').then(function(data) {
return callback(null, data.data);
}).catch(function(err) {
return handleError(err, callback);
});
},
// cria um novo veículo
create: function(params, callback) {
resetError();
// chamada POST para API
return $http.post($window.API_URL + '/vehicles', params).then(function(data) {
return callback(null, data.data);
}).catch(function(err) {
return handleError(err, callback);
});
},
// busca um veículo por ID
getOne: function(id, callback) {
resetError();
// chamada GET para a API
return $http.get($window.API_URL + '/vehicles/' + id).then(function(data) {
return callback(null, data.data);
}).catch(function(err) {
return handleError(err, callback);
});
},
// atualiza um veículo por ID
update: function(id, params, callback) {
resetError();
// chamada PUT para a API
return $http.put($window.API_URL + '/vehicles/' + id, params).then(function(data) {
return callback(null, data.data);
}).catch(function(err) {
return handleError(err, callback);
});
},
// remove um veículo por ID
delete: function(id, callback) {
resetError();
// chamada DELETE para a API
return $http.delete($window.API_URL + '/vehicles/' + id).then(function(data) {
return callback(null, data.data);
}).catch(function(err) {
return handleError(err, callback);
});
}
};
})
.controller('MainController', function($scope, $route, $routeParams, $location) {})
.controller('VehicleIndexController', function($scope, removeVehicle, brandList, modelList, vehicleAPI) {
$scope.vehicles = [];
var getVehicles = function() {
// chama a factory da api para buscar todos os veículos
vehicleAPI.getAll(function(err, data) {
$scope.vehicles = data;
});
};
getVehicles();
// função de remover
$scope.remove = function(vehicle) {
// chama a factory de remoção do veículo
removeVehicle(vehicle, function(err, result) {
if(result) {
// sucesso, atualiza a listagem
getVehicles();
}
});
};
$scope.getBrandLabel = function(brand_id) {
var brand = brandList.find(function(brand) {
return brand.id == brand_id;
});
return brand ? brand.name : '';
};
$scope.getModelLabel = function(model_id) {
var model = modelList.find(function(model) {
return model.id == model_id;
});
return model ? model.name : '';
};
})
.controller('VehicleNewController', function($scope, $location, brandList, modelList, vehicleAPI) {
$scope.brandList = brandList; // lista de marcas
$scope.modelList = modelList; // lista de modelos
$scope.isEditing = true; // controla o modo de edição do formulário
// dados do veículo
$scope.vehicle = {
name: '',
brand_id: '',
model_id: '',
license_plate: ''
};
// função de salvar
$scope.save = function() {
// chama a factory da api para salvar
vehicleAPI.create($scope.vehicle, function(err, data) {
if(data) {
// sucesso, edireciona para a listagem
$location.path('/vehicles');
}
});
};
})
.controller('VehicleEditController', function($scope, $routeParams, $location, brandList, modelList, vehicleAPI) {
$scope.params = $routeParams; // parâmetros da rota
$scope.brandList = brandList; // lista de marcas
$scope.modelList = modelList; // lista de modelos
$scope.isEditing = true; // controla o modo de edição do formulário
// dados do veículo
$scope.vehicle = {};
// chama a factory da api para buscar o veículo pelo id
vehicleAPI.getOne($scope.params.id, function(err, data) {
if(data) {
$scope.vehicle = data;
}
});
// função de salvar
$scope.save = function() {
// chama a factory da api para salvar
vehicleAPI.update($scope.params.id, $scope.vehicle, function(err, data) {
if(data) {
// sucesso, edireciona para a listagem
$location.path('/vehicles');
}
});
};
})
.controller('VehicleShowController', function($scope, $routeParams, brandList, modelList, $location, removeVehicle, vehicleAPI) {
$scope.params = $routeParams; // parâmetros da rota
$scope.brandList = brandList; // lista de marcas
$scope.modelList = modelList; // lista de modelos
$scope.isEditing = false; // controla o modo de edição do formulário
// dados do veículo
$scope.vehicle = {};
// chama a factory da api para buscar o veículo pelo id
vehicleAPI.getOne($scope.params.id, function(err, data) {
if(data) {
$scope.vehicle = data;
}
});
// função de remover
$scope.remove = function(vehicle) {
// chama a factory de remoção do veículo
removeVehicle(vehicle, function(err, result) {
if(result) {
// sucesso, redireciona para a listagem
$location.path('/vehicles');
}
});
};
})
// configuração das rotas com os controllers e templates
.config(function($routeProvider, $locationProvider) {
$routeProvider
.when('/vehicles', {
templateUrl: 'src/templates/vehicles/index.html',
controller: 'VehicleIndexController'
})
.when('/vehicles/new', {
templateUrl: 'src/templates/vehicles/form.html',
controller: 'VehicleNewController'
})
.when('/vehicles/:id/edit', {
templateUrl: 'src/templates/vehicles/form.html',
controller: 'VehicleEditController'
})
.when('/vehicles/:id', {
templateUrl: 'src/templates/vehicles/form.html',
controller: 'VehicleShowController'
});
$routeProvider.otherwise('/vehicles');
});