├── rep-go-web
├── src
│ ├── css
│ │ └── main.css
│ ├── js
│ │ ├── app.js
│ │ ├── config
│ │ │ ├── api-config.js
│ │ │ ├── interceptor-config.js
│ │ │ ├── icon-config.js
│ │ │ └── route-config.js
│ │ ├── services
│ │ │ ├── message-service.js
│ │ │ └── user-service.js
│ │ ├── controllers
│ │ │ ├── message-controller.js
│ │ │ ├── menu-controller.js
│ │ │ ├── user-list-controller.js
│ │ │ └── user-controller.js
│ │ └── interceptors
│ │ │ └── basic-auth-interceptor.js
│ ├── img
│ │ └── icons
│ │ │ ├── ic_add.svg
│ │ │ ├── ic_menu.svg
│ │ │ └── ic_people.svg
│ └── view
│ │ ├── users.html
│ │ └── user.html
├── login.html
├── exemplo-gulp.html
├── package.json
├── .gitignore
├── gulpfile.js
└── index.html
├── rep-go-api
├── i18n
│ ├── message-en.json
│ └── message-pt.json
├── bin
│ └── www.js
├── routes
│ ├── user-route.js
│ └── transaction-route.js
├── middlewares
│ ├── error-middleware.js
│ ├── auth-middleware.js
│ └── i18n-middleware.js
├── package.json
├── app.js
├── db.js
├── .gitignore
├── models
│ ├── transaction-model.js
│ └── user-model.js
└── controllers
│ ├── user-controller.js
│ └── transaction-controller.js
└── README.md
/rep-go-web/src/css/main.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin-bottom: 40px;
3 | }
4 |
5 | .main-content {
6 | width: 85%;
7 | margin: 0 auto;
8 | }
9 |
--------------------------------------------------------------------------------
/rep-go-api/i18n/message-en.json:
--------------------------------------------------------------------------------
1 | {
2 | "unexpected-error": "Unexpected error. Please come back later.",
3 | "validation-error": "Validation error."
4 | }
5 |
--------------------------------------------------------------------------------
/rep-go-api/i18n/message-pt.json:
--------------------------------------------------------------------------------
1 | {
2 | "unexpected-error": "Erro inesperado. Por favor volte mais tarde.",
3 | "validation-error": "Erro de validação."
4 | }
5 |
--------------------------------------------------------------------------------
/rep-go-web/src/js/app.js:
--------------------------------------------------------------------------------
1 | (function(angular) {
2 | 'use strict';
3 |
4 | angular.module('repgo', ['ngMaterial', 'ngRoute', 'ngCookies']);
5 |
6 | })(angular);
7 |
--------------------------------------------------------------------------------
/rep-go-web/src/img/icons/ic_add.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/rep-go-web/login.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Login
9 |
10 |
11 |
--------------------------------------------------------------------------------
/rep-go-web/src/img/icons/ic_menu.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/rep-go-api/bin/www.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const http = require('http');
4 | const app = require('../app');
5 | const server = http.createServer(app);
6 |
7 | server.listen(3000, function() {
8 | console.log('Listen on port 3000');
9 | });
10 |
--------------------------------------------------------------------------------
/rep-go-web/src/js/config/api-config.js:
--------------------------------------------------------------------------------
1 | (function(angular) {
2 | 'use strict';
3 |
4 | var host = 'http://localhost:3000/';
5 |
6 | angular.module('repgo').constant('API', {
7 | user: host + 'user/'
8 | });
9 |
10 | })(angular);
11 |
--------------------------------------------------------------------------------
/rep-go-web/exemplo-gulp.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 | Olá!
12 |
13 |
14 |
--------------------------------------------------------------------------------
/rep-go-web/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "rep-go-web",
3 | "version": "1.0.0",
4 | "license": "ISC",
5 | "devDependencies": {
6 | "gulp": "^3.9.1",
7 | "gulp-clean": "^0.3.2",
8 | "gulp-clean-css": "^2.0.12",
9 | "gulp-concat": "^2.6.0",
10 | "run-sequence": "^1.2.2"
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/rep-go-web/src/js/config/interceptor-config.js:
--------------------------------------------------------------------------------
1 | (function(angular) {
2 | 'use strict';
3 |
4 | angular.module('repgo').config(config);
5 |
6 | config.$inject = ['$httpProvider'];
7 |
8 | function config($httpProvider) {
9 | $httpProvider.interceptors.push('BasicAuthInterceptor');
10 | }
11 |
12 | })(angular);
13 |
--------------------------------------------------------------------------------
/rep-go-api/routes/user-route.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const router = require('express').Router()
4 | const ctrl = require('../controllers/user-controller');
5 |
6 | router.get('/user', ctrl.getAll);
7 | router.get('/user/:id', ctrl.getById);
8 | router.post('/user', ctrl.create);
9 | router.put('/user/:id', ctrl.update);
10 | router.delete('/user/:id', ctrl.remove);
11 |
12 | module.exports = router;
13 |
--------------------------------------------------------------------------------
/rep-go-web/src/img/icons/ic_people.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/rep-go-web/src/js/services/message-service.js:
--------------------------------------------------------------------------------
1 | (function(angular) {
2 | 'use strict';
3 |
4 | angular.module('repgo').factory('MessageService', service);
5 |
6 | service.$inject = ['$rootScope'];
7 |
8 | function service($rootScope) {
9 | var svc = {};
10 |
11 | svc.show = function(message) {
12 | $rootScope.$broadcast('show-message', message);
13 | }
14 |
15 | return svc;
16 | }
17 |
18 | })(angular);
19 |
--------------------------------------------------------------------------------
/rep-go-web/src/js/controllers/message-controller.js:
--------------------------------------------------------------------------------
1 | (function(angular) {
2 | 'use strict';
3 |
4 | angular.module('repgo').controller('MessageController', ctrl);
5 |
6 | ctrl.$inject = ['$rootScope', '$mdToast'];
7 |
8 | function ctrl($rootScope, $mdToast) {
9 | var vm = this;
10 |
11 | $rootScope.$on('show-message', function(event, message) {
12 | $mdToast.showSimple(message);
13 | });
14 | }
15 |
16 | })(angular);
17 |
--------------------------------------------------------------------------------
/rep-go-api/routes/transaction-route.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const router = require('express').Router()
4 | const ctrl = require('../controllers/transaction-controller');
5 |
6 | router.get('/transaction', ctrl.getAll);
7 | router.get('/transaction/:id', ctrl.getById);
8 | router.post('/transaction', ctrl.create);
9 | router.put('/transaction/:id', ctrl.update);
10 | router.delete('/transaction/:id', ctrl.remove);
11 |
12 | module.exports = router;
13 |
--------------------------------------------------------------------------------
/rep-go-web/src/js/config/icon-config.js:
--------------------------------------------------------------------------------
1 | (function(angular) {
2 | 'use strict';
3 |
4 | angular.module('repgo').config(config);
5 |
6 | config.$inject = ['$mdIconProvider'];
7 |
8 | function config($mdIconProvider) {
9 | $mdIconProvider
10 | .icon('navigation:menu', 'src/img/icons/ic_menu.svg', 24)
11 | .icon('content:add', 'src/img/icons/ic_add.svg', 24)
12 | .icon('social:people', 'src/img/icons/ic_people.svg', 24);
13 | }
14 |
15 | })(angular);
16 |
--------------------------------------------------------------------------------
/rep-go-api/middlewares/error-middleware.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const messages = require('../i18n/message-pt');
4 |
5 | module.exports = (err, req, res, next) => {
6 | err.messages = [];
7 |
8 | if(err.messageKeys) {
9 | for (var i = 0; i < err.messageKeys.length; i++) {
10 | err.messages.push(req.getMessage(err.messageKeys[i]));
11 | }
12 | }
13 |
14 | if(err.messages.length === 0) {
15 | err.messages = [req.getMessage('unexpected-error')];
16 | }
17 |
18 | return res.status(err.code || 500).send(err);
19 | };
20 |
--------------------------------------------------------------------------------
/rep-go-web/src/js/controllers/menu-controller.js:
--------------------------------------------------------------------------------
1 | (function(angular) {
2 | 'use strict';
3 |
4 | angular.module('repgo').controller('MenuController', ctrl);
5 |
6 | ctrl.$inject = ['$mdSidenav', '$location'];
7 |
8 | function ctrl($mdSidenav, $location) {
9 | var vm = this;
10 |
11 | vm.menuItens = [
12 | { name: 'Users', path: '/users', icon: 'social:people' }
13 | ];
14 |
15 | vm.toggle = function() {
16 | $mdSidenav('menu').toggle();
17 | };
18 |
19 | vm.show = function(path) {
20 | $mdSidenav('menu').toggle();
21 | $location.path(path);
22 | };
23 |
24 | }
25 |
26 | })(angular);
27 |
--------------------------------------------------------------------------------
/rep-go-api/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "RepGO",
3 | "version": "1.0.0",
4 | "description": "Solução para o gerenciamento de repúblicas!",
5 | "main": "app.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "prestart": "npm install",
9 | "start": "nodemon --debug ./bin/www"
10 | },
11 | "keywords": [
12 | "MongoDB",
13 | "Nodejs",
14 | "Express",
15 | "AngularJS"
16 | ],
17 | "author": "Curso Zero to Hero Fullstack JavaScript",
18 | "license": "ISC",
19 | "dependencies": {
20 | "body-parser": "^1.15.2",
21 | "cors": "^2.7.1",
22 | "express": "^4.14.0",
23 | "mongoose": "^4.5.8"
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/rep-go-api/app.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const db = require('./db');
4 | const express = require('express');
5 | const bodyParser = require('body-parser');
6 | const cors = require('cors');
7 | const app = express();
8 |
9 | // Application config
10 | app.use(cors());
11 | app.use(bodyParser.urlencoded({ extended: true }));
12 | app.use(bodyParser.json());
13 |
14 | // Config Middlewares
15 | app.use(require('./middlewares/i18n-middleware.js'));
16 | app.use(require('./middlewares/auth-middleware.js'));
17 |
18 | // Route config
19 | app.use(require('./routes/transaction-route'));
20 | app.use(require('./routes/user-route'));
21 |
22 | // Config Error Handdler
23 | app.use(require('./middlewares/error-middleware.js'));
24 |
25 | module.exports = app;
26 |
--------------------------------------------------------------------------------
/rep-go-api/db.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const mongoose = require('mongoose');
4 |
5 | mongoose.connect('mongodb://dev:dev@ds021731.mlab.com:21731/finance');
6 |
7 | const db = mongoose.connection;
8 |
9 | db.on('connected', () => {
10 | console.log('Connected!');
11 | });
12 |
13 | db.on('open', () => {
14 | console.log('MongoDB Opened!');
15 | });
16 |
17 | db.on('disconnected', () => {
18 | console.log('MongoDB disconnected!')
19 | });
20 |
21 | db.on('error', err => {
22 | console.log(`MongoDB error: ${err}`);
23 | });
24 |
25 | process.on('SIGINT', () => {
26 | mongoose.connection.close(() => {
27 | console.log('MongoDB disconnected through app termination');
28 | process.exit(0);
29 | });
30 | });
31 |
32 | module.exports = db;
33 |
--------------------------------------------------------------------------------
/rep-go-web/src/js/config/route-config.js:
--------------------------------------------------------------------------------
1 | (function(angular) {
2 | 'use strict';
3 |
4 | angular.module('repgo').config(config);
5 |
6 | config.$inject = ['$routeProvider'];
7 |
8 | function config($routeProvider) {
9 | $routeProvider
10 | .when('/users', {
11 | templateUrl: 'src/view/users.html',
12 | controller: 'UserListController',
13 | controllerAs: 'vm'
14 | })
15 | .when('/user/new', {
16 | templateUrl: 'src/view/user.html',
17 | controller: 'UserController',
18 | controllerAs: 'vm'
19 | })
20 | .when('/user/:id/edit', {
21 | templateUrl: 'src/view/user.html',
22 | controller: 'UserController',
23 | controllerAs: 'vm'
24 | });
25 | }
26 |
27 | })(angular);
28 |
--------------------------------------------------------------------------------
/rep-go-api/middlewares/auth-middleware.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const AUTHORIZATION_MODEL = 'Basic';
4 | const USER_PASS_SPLIT = ':';
5 | const User = require('../models/user-model')
6 |
7 | module.exports = (req, res, next) => {
8 | if(!req.headers.authorization) {
9 | return res.status(403).send();
10 | }
11 |
12 | let _b64UserName = req.headers.authorization.split(AUTHORIZATION_MODEL).pop().trim();
13 | let _arrayUserName = Buffer.from(_b64UserName, 'base64').toString('utf-8').split(USER_PASS_SPLIT);
14 |
15 | User.authenticate({ name: _arrayUserName[0], password: _arrayUserName[1] })
16 | .then(user => {
17 | req.user = user;
18 | return next();
19 | })
20 | .catch(err => {
21 | return res.status(403).send(err);
22 | });
23 | };
24 |
--------------------------------------------------------------------------------
/rep-go-api/.gitignore:
--------------------------------------------------------------------------------
1 | # Created by https://www.gitignore.io/api/node
2 |
3 | ### Node ###
4 | # Logs
5 | logs
6 | *.log
7 | npm-debug.log*
8 |
9 | # Runtime data
10 | pids
11 | *.pid
12 | *.seed
13 | *.pid.lock
14 |
15 | # Directory for instrumented libs generated by jscoverage/JSCover
16 | lib-cov
17 |
18 | # Coverage directory used by tools like istanbul
19 | coverage
20 |
21 | # nyc test coverage
22 | .nyc_output
23 |
24 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
25 | .grunt
26 |
27 | # node-waf configuration
28 | .lock-wscript
29 |
30 | # Compiled binary addons (http://nodejs.org/api/addons.html)
31 | build/Release
32 |
33 | # Dependency directories
34 | node_modules
35 | jspm_packages
36 |
37 | # Optional npm cache directory
38 | .npm
39 |
40 | # Optional REPL history
41 | .node_repl_history
42 |
--------------------------------------------------------------------------------
/rep-go-web/.gitignore:
--------------------------------------------------------------------------------
1 | # Created by https://www.gitignore.io/api/node
2 |
3 | ### Node ###
4 | # Logs
5 | logs
6 | *.log
7 | npm-debug.log*
8 |
9 | # Runtime data
10 | pids
11 | *.pid
12 | *.seed
13 | *.pid.lock
14 |
15 | # Directory for instrumented libs generated by jscoverage/JSCover
16 | lib-cov
17 |
18 | # Coverage directory used by tools like istanbul
19 | coverage
20 |
21 | # nyc test coverage
22 | .nyc_output
23 |
24 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
25 | .grunt
26 |
27 | # node-waf configuration
28 | .lock-wscript
29 |
30 | # Compiled binary addons (http://nodejs.org/api/addons.html)
31 | build/Release
32 |
33 | # Dependency directories
34 | node_modules
35 | jspm_packages
36 | build
37 |
38 | # Optional npm cache directory
39 | .npm
40 |
41 | # Optional REPL history
42 | .node_repl_history
43 |
--------------------------------------------------------------------------------
/rep-go-web/src/js/services/user-service.js:
--------------------------------------------------------------------------------
1 | (function(angular) {
2 | 'use strict';
3 |
4 | angular.module('repgo').factory('UserService', service);
5 |
6 | service.$inject = ['$http', 'API'];
7 |
8 | function service($http, API) {
9 | var svc = {};
10 |
11 | svc.save = function(user) {
12 | if(user._id) {
13 | return $http.put(API.user + user._id, user);
14 | } else {
15 | return $http.post(API.user, user);
16 | }
17 | };
18 |
19 | svc.getById = function(id) {
20 | return $http.get(API.user + id);
21 | };
22 |
23 | svc.getAll = function(query) {
24 | return $http.get(API.user, {
25 | params: query
26 | });
27 | };
28 |
29 | svc.remove = function(id) {
30 | return $http.delete(API.user + id);
31 | };
32 |
33 | return svc;
34 | }
35 |
36 | })(angular);
37 |
--------------------------------------------------------------------------------
/rep-go-api/models/transaction-model.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 |
3 | const mongoose = require('mongoose');
4 | const schema = new mongoose.Schema({
5 | type: {
6 | type: String,
7 | enum: ['Debit', 'Credit'],
8 | required: true
9 | },
10 | user: {
11 | type: mongoose.Schema.Types.ObjectId,
12 | required: true
13 | }
14 | });
15 |
16 | const Transaction = mongoose.model('Transaction', schema)
17 | const model = {};
18 |
19 | model.getAll = () => {
20 | return Transaction.find({});
21 | };
22 |
23 | model.getById = (_id) => {
24 | return Transaction.findOne({ _id });
25 | };
26 |
27 | model.create = (transaction) => {
28 | return Transaction.create(transaction);
29 | };
30 |
31 | model.update = (_id, transaction) => {
32 | return Transaction.update({ _id }, transaction);
33 | };
34 |
35 | model.remove = (_id) => {
36 | return Transaction.remove({ _id });
37 | };
38 |
39 | module.exports = model;
40 |
--------------------------------------------------------------------------------
/rep-go-web/gulpfile.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const gulp = require('gulp');
4 | const clean = require('gulp-clean');
5 | const cleanCSS = require('gulp-clean-css');
6 | const concat = require('gulp-concat');
7 | const runSequence = require('run-sequence');
8 |
9 | gulp.task('clean', function() {
10 | return gulp.src('./build')
11 | .pipe(clean());
12 | });
13 |
14 | gulp.task('css', function() {
15 | return gulp.src('./src/css/**/*.css')
16 | .pipe(cleanCSS())
17 | .pipe(concat('main.min.css'))
18 | .pipe(gulp.dest('./build/css'));
19 | });
20 |
21 | gulp.task('html', function() {
22 | return gulp.src('./exemplo-gulp.html')
23 | .pipe(concat('index.html'))
24 | .pipe(gulp.dest('./build'));
25 | });
26 |
27 | gulp.task('default', function(cb) {
28 | return runSequence('clean', ['html', 'css'], cb);
29 | });
30 |
31 | gulp.task('watch', function() {
32 | gulp.watch('./**/*', ['default']);
33 | });
34 |
--------------------------------------------------------------------------------
/rep-go-web/src/js/interceptors/basic-auth-interceptor.js:
--------------------------------------------------------------------------------
1 | (function(angular) {
2 | 'use strict';
3 |
4 | angular.module('repgo').factory('BasicAuthInterceptor', factory);
5 |
6 | factory.$inject = ['$q', '$window', '$cookies'];
7 |
8 | function factory($q, $window, $cookies) {
9 | var interceptor = {};
10 |
11 | function getCredentials() {
12 | $cookies.putObject('USER', { name:'dev', password:'dev' });
13 |
14 | var user = $cookies.getObject('USER');
15 | return user ? btoa(user.name + ':' + user.password) : '';
16 | }
17 |
18 | interceptor.request = function(config) {
19 | config.headers.Authorization = 'Basic ' + getCredentials();
20 | return config;
21 | };
22 |
23 | interceptor.responseError = function(rejection) {
24 | if(rejection.status === 401 || rejection.status === 403) {
25 | $window.location.href = 'login';
26 | }
27 |
28 | return $q.reject(rejection);
29 | };
30 |
31 | return interceptor;
32 | }
33 |
34 | })(angular);
35 |
--------------------------------------------------------------------------------
/rep-go-web/src/js/controllers/user-list-controller.js:
--------------------------------------------------------------------------------
1 | (function(angular) {
2 | 'use strict';
3 |
4 | angular.module('repgo')
5 | .controller('UserListController', controller);
6 |
7 | controller.$inject = ['UserService', '$location', '$routeParams'];
8 |
9 | function controller(userService, $location, $routeParams) {
10 | var vm = this;
11 |
12 | vm.initList = function() {
13 | vm.name = $routeParams.name ? $routeParams.name : '';
14 |
15 | userService.getAll($routeParams).success(function(data) {
16 | vm.users = data;
17 | });
18 | };
19 |
20 | vm.search = function(name) {
21 | if(name == '') {
22 | $location.search({});
23 | } else {
24 | $location.search({ name: name });
25 | }
26 | };
27 |
28 | vm.edit = function(user) {
29 | $location.path('/user/' + user._id + '/edit');
30 | };
31 |
32 | vm.newUser = function() {
33 | $location.path('/user/new');
34 | };
35 | }
36 |
37 | })(angular);
38 |
--------------------------------------------------------------------------------
/rep-go-web/src/view/users.html:
--------------------------------------------------------------------------------
1 | Users
2 |
3 |
9 |
10 |
11 |
12 |
13 |
16 |
17 |
{{user.name}}
18 |
{{user.email}}
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/rep-go-api/controllers/user-controller.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const User = require('../models/user-model');
4 | const ctrl = {}
5 |
6 | ctrl.getAll = (req, res) => {
7 | User.getAll(req.query)
8 | .then(data => {
9 | return res.status(200).send(data);
10 | })
11 | .catch(err => {
12 | return res.status(500).send(err);
13 | });
14 | };
15 |
16 | ctrl.getById = (req, res) => {
17 | User.getById(req.params.id)
18 | .then(data => {
19 | return res.status(200).send(data);
20 | })
21 | .catch(err => {
22 | return res.status(500).send(err);
23 | });
24 | };
25 |
26 | ctrl.create = (req, res) => {
27 | User.create(req.body)
28 | .then(data => {
29 | return res.status(201).send(data);
30 | })
31 | .catch(err => {
32 | return res.status(400).send(err);
33 | });
34 | };
35 |
36 | ctrl.update = (req, res) => {
37 | User.update(req.params.id, req.body)
38 | .then(data => {
39 | return res.status(200).send(data);
40 | })
41 | .catch(err => {
42 | return res.status(400).send(err);
43 | });
44 | };
45 |
46 | ctrl.remove = (req, res) => {
47 | User.remove(req.params.id)
48 | .then(data => {
49 | return res.status(200).send(data);
50 | })
51 | .catch(err => {
52 | return res.status(400).send(err);
53 | });
54 | };
55 |
56 | module.exports = ctrl;
57 |
--------------------------------------------------------------------------------
/rep-go-api/models/user-model.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 |
3 | const mongoose = require('mongoose');
4 | const schema = new mongoose.Schema({
5 | name: {
6 | type: String,
7 | required: true
8 | },
9 | password: {
10 | type: String,
11 | required: true
12 | },
13 | active: {
14 | type: Boolean,
15 | default: true
16 | }
17 | });
18 |
19 | const User = mongoose.model('User', schema)
20 | const model = {};
21 |
22 | model.getAll = (query = {}) => {
23 | query.active = true;
24 | return User.find(query);
25 | };
26 |
27 | model.getById = (_id) => {
28 | return User.findOne({ _id });
29 | };
30 |
31 | model.create = (user) => {
32 | return User.create(user);
33 | };
34 |
35 | model.update = (_id, user) => {
36 | return User.update({ _id }, user);
37 | };
38 |
39 | model.remove = (_id) => {
40 | return User.update({ _id }, { active: false });
41 | };
42 |
43 | model.authenticate = (user) => {
44 | return new Promise((resolve, reject) => {
45 | let _query = {
46 | name: user.name,
47 | password: user.password,
48 | active: true
49 | };
50 |
51 | User.findOne(_query)
52 | .then(data => {
53 | if(data && data != null) {
54 | return resolve(data);
55 | }
56 |
57 | return reject();
58 | })
59 | .catch(err => {
60 | return reject(err);
61 | });
62 | });
63 | }
64 |
65 | module.exports = model;
66 |
--------------------------------------------------------------------------------
/rep-go-web/src/js/controllers/user-controller.js:
--------------------------------------------------------------------------------
1 | (function(angular) {
2 | 'use strict';
3 |
4 | angular.module('repgo').controller('UserController', ctrl);
5 |
6 | ctrl.$inject = ['UserService', '$routeParams', '$location', 'MessageService'];
7 |
8 | function ctrl(userService, $routeParams, $location, messageService) {
9 | var vm = this;
10 |
11 | vm.init = function() {
12 | var _id = $routeParams.id;
13 | if(_id) {
14 | userService.getById(_id)
15 | .then(function(resp) {
16 | vm.user = resp.data;
17 | })
18 | .catch(function(err) {
19 | console.log(err);
20 | });
21 | } else {
22 | vm.user = {};
23 | }
24 | };
25 |
26 | vm.save = function(user) {
27 | userService.save(user)
28 | .then(function(resp) {
29 | $location.path('/users');
30 | messageService.show('Success Save!');
31 | })
32 | .catch(function(err) {
33 | messageService.show('Unespected Error!');
34 | });
35 | };
36 |
37 | vm.remove = function(id) {
38 | userService.remove(id)
39 | .then(function(resp) {
40 | $location.path('/users');
41 | messageService.show('Success Remove!');
42 | })
43 | .catch(function(err) {
44 | messageService.show('Unespected Error!');
45 | });
46 | }
47 | }
48 |
49 | })(angular);
50 |
--------------------------------------------------------------------------------
/rep-go-api/middlewares/i18n-middleware.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const ACCEPT_LANGUAGE_HEADER = 'accept-language';
4 | const LOCALE_SEPARATOR = ',';
5 | const LOCALE_ATTRIBUTE_SEPARATOR = ';';
6 | const QUALITY_PREFIX = 'q=';
7 |
8 | const messages = {
9 | pt: require('../i18n/message-pt'),
10 | en: require('../i18n/message-en')
11 | };
12 |
13 | module.exports = (req, res, next) => {
14 | let _locales = getLocalesByPriority(req.headers[ACCEPT_LANGUAGE_HEADER]);
15 | let _message = messages.en;
16 |
17 | for (var i = 0; i < _locales.length; i++) {
18 | let _locale = _locales[i];
19 | if(messages[_locale.language]) {
20 | _message = messages[_locale.language];
21 | break;
22 | }
23 | }
24 |
25 | req.getMessage = getMessagesOf(_message);
26 | next();
27 | };
28 |
29 | function getMessagesOf(messages) {
30 | return function getMessage(key) {
31 | return messages[key];
32 | };
33 | }
34 |
35 | function getLocalesByPriority(headerPropetyContent = '') {
36 | return headerPropetyContent.split(LOCALE_SEPARATOR)
37 | .map((localeAttributes) => {
38 | let _localeAttributes = localeAttributes.split(LOCALE_ATTRIBUTE_SEPARATOR);
39 |
40 | let _locale = {
41 | language: _localeAttributes[0],
42 | quality: !_localeAttributes[1] ? 1 : parseFloat(_localeAttributes[1].split(QUALITY_PREFIX).pop())
43 | };
44 |
45 | return _locale;
46 | })
47 | .sort((locale1, locale2) => {
48 | return locale1.quality <= locale2.quality;
49 | });
50 | }
51 |
--------------------------------------------------------------------------------
/rep-go-web/src/view/user.html:
--------------------------------------------------------------------------------
1 | {{vm.user._id ? 'Edit' : 'Insert' }} User
2 |
3 |
4 |
5 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/rep-go-api/controllers/transaction-controller.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const Transaction = require('../models/transaction-model');
4 | const ctrl = {}
5 |
6 | ctrl.getAll = (req, res, next) => {
7 | Transaction.getAll()
8 | .then(data => {
9 | return res.status(200).send(data);
10 | })
11 | .catch(err => {
12 | return next({ data: err, code: 500 });
13 | });
14 | };
15 |
16 | ctrl.getById = (req, res, next) => {
17 | Transaction.getById(req.params.id)
18 | .then(data => {
19 | return res.status(200).send(data);
20 | })
21 | .catch(err => {
22 | return next({ data: err, code: 500 });
23 | });
24 | };
25 |
26 | ctrl.create = (req, res, next) => {
27 | req.body.user = req.user._id;
28 |
29 | Transaction.create(req.body)
30 | .then(data => {
31 | return res.status(201).send(data);
32 | })
33 | .catch(err => {
34 | return next({ data: err, code: 400, messageKeys: ['validation-error'] });
35 | });
36 | };
37 |
38 | ctrl.update = (req, res, next) => {
39 | Transaction.update(req.params.id, req.body)
40 | .then(data => {
41 | return res.status(200).send(data);
42 | })
43 | .catch(err => {
44 | return next({ data: err, code: 400, messageKeys: ['validation-error'] });
45 | });
46 | };
47 |
48 | ctrl.remove = (req, res, next) => {
49 | Transaction.remove(req.params.id)
50 | .then(data => {
51 | return res.status(200).send(data);
52 | })
53 | .catch(err => {
54 | return next({ data: err, code: 400, messageKeys: ['validation-error'] });
55 | });
56 | };
57 |
58 | module.exports = ctrl;
59 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Zero to Hero Full Stack JavaScript
2 |
3 | Curso destinado a capacitação de profissionais para atuação no desenvolvimento de aplicações robustas, flexíveis e escaláveis utilizando uma Stack de tecnologias JavaScript.
4 |
5 | Este curso explora desde os fundamentos da linguagem JavaScript até o conjunto de tecnologias que compõe a sigla MEAN (MongoDB, Express, Angular e Node).
6 |
7 | ## Material do curso:
8 |
9 | Todo o material do curso está disponível em:
10 | - [Vídeo Aulas](http://www.youtube.com/playlist?list=PLmejHXtGQVwiNUDHwzCIoE9qNA7Ncgt9t);
11 | - [Série Zero to Hero JavaScript do blog We Love Dev](http://www.welovedev.com.br/?search=Zero+to+Hero+JavaScript);
12 | - [Facebook](https://www.facebook.com/welovedev/);
13 |
14 | ## Agenda:
15 |
16 | - [x] Aula 1 - Introdução, Strict Mode, Variáveis e Hoisting;
17 | - [x] Aula 2 - Tipos de dados, Operadores, Estruturas de controle;
18 | - [x] Aula 3 - Funções, Closure e Callback;
19 | - [x] Aula 4 - Namespace, Prototype e Shadowing;
20 | - [x] Aula 5 - NodeJS, NPM e Módulos;
21 | - [x] Aula 6 - MongoDB;
22 | - [x] Aula 7 - Mongoose;
23 | - [x] Aula 8 - Mongoose e Promises;
24 | - [x] Aula 9 - HTTP e REST;
25 | - [x] Aula 10 - Express;
26 | - [x] Aula 11 - Express e Middlewares;
27 | - [x] Aula 12 - Error handler, I18N e Middlewares;
28 | - [x] Aula 13 - Event Loop, Single Thread, Encapsulamento, Two Way Data Binding e Programação Declarativa;
29 | - [x] Aula 14 - AngularJS, Controllers e Diretivas;
30 | - [x] Aula 15 - Angularjs, Services e Constantes;
31 | - [x] Aula 16 - Angularjs, AngularMaterial e NgRoute;
32 | - [x] Aula 17 - AngularMaterial;
33 | - [x] Aula 18 - Angular Material e Icons;
34 | - [x] Aula 19 - Criação de Rotas e Query String;
35 | - [x] Aula 20 - HTTP Interceptor e BroadCast;
36 | - [x] Aula 21 - Build Front-End, Otimização de Aplicações e Gulpjs;
37 |
--------------------------------------------------------------------------------
/rep-go-web/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 | Cadastro de usuário
12 |
13 |
14 |
15 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
--------------------------------------------------------------------------------