зеркало из https://github.com/DeGsoft/meanjs.git
organizacion y mongo
This commit is contained in:
Родитель
32bb9fb2ab
Коммит
3a28de51e6
|
@ -1,9 +1,9 @@
|
|||
# Logs
|
||||
**/logs
|
||||
**/*.log
|
||||
|
||||
**/bower_components
|
||||
**/node_modules
|
||||
|
||||
|
||||
|
||||
# Logs
|
||||
**/logs
|
||||
**/*.log
|
||||
|
||||
**/bower_components
|
||||
**/node_modules
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -1,17 +1,17 @@
|
|||
# 7. Hola Mundo
|
||||
|
||||
## Scripts en Java-Script
|
||||
|
||||
### node 1-mi-script.js
|
||||
* puro JavaScript
|
||||
### node 2-javacript-normal.js
|
||||
* variables
|
||||
* funciones
|
||||
* expresiones
|
||||
### node 3-patrones.js
|
||||
* Closures con IIF
|
||||
* Sintáxis extricta
|
||||
### node 4-el-proceso.js
|
||||
* Directorios
|
||||
* Identificadores
|
||||
* Entorno
|
||||
# 7. Hola Mundo
|
||||
|
||||
## Scripts en Java-Script
|
||||
|
||||
### node 1-mi-script.js
|
||||
* puro JavaScript
|
||||
### node 2-javacript-normal.js
|
||||
* variables
|
||||
* funciones
|
||||
* expresiones
|
||||
### node 3-patrones.js
|
||||
* Closures con IIF
|
||||
* Sintáxis extricta
|
||||
### node 4-el-proceso.js
|
||||
* Directorios
|
||||
* Identificadores
|
||||
* Entorno
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
# 2. Consola
|
||||
|
||||
## Argumentos
|
||||
- process.argv[0] node
|
||||
- process.argv[1] script
|
||||
+ process.argv[2..n] argumentos
|
||||
## Interacción
|
||||
La respuesta del usuario es asíncrona
|
||||
|
||||
|
||||
|
||||
# 2. Consola
|
||||
|
||||
## Argumentos
|
||||
- process.argv[0] node
|
||||
- process.argv[1] script
|
||||
+ process.argv[2..n] argumentos
|
||||
## Interacción
|
||||
La respuesta del usuario es asíncrona
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
<section name="total">
|
||||
<h2>No se ha encontrado lo que buscabas</h2>
|
||||
</section>
|
||||
</section>
|
||||
|
|
|
@ -7,4 +7,4 @@
|
|||
<h1>El Blog de NodeJS</h1>
|
||||
<p>En construcción...</p>
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
body {
|
||||
background: #eeeeee;
|
||||
font-family: “Trebuchet MS”, Verdana, Arial, serif;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,4 +4,4 @@
|
|||
<body>
|
||||
Hola, soy muy simple :-(
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
# 9. Web
|
||||
|
||||
## http
|
||||
* escuchar en un puerto y responder
|
||||
## web
|
||||
* si respondemos enviando html... tenemos un web server
|
||||
## static server
|
||||
* podemos sacar el html a ficheros
|
||||
- localhost:3000
|
||||
- localhost:3000/blog
|
||||
- localhost:3000/static/blog
|
||||
## control caja
|
||||
- servidor web y apliacacion cliente
|
||||
- atención rutas locales con #
|
||||
# 9. Web
|
||||
|
||||
## http
|
||||
* escuchar en un puerto y responder
|
||||
## web
|
||||
* si respondemos enviando html... tenemos un web server
|
||||
## static server
|
||||
* podemos sacar el html a ficheros
|
||||
- localhost:3000
|
||||
- localhost:3000/blog
|
||||
- localhost:3000/static/blog
|
||||
## control caja
|
||||
- servidor web y apliacacion cliente
|
||||
- atención rutas locales con #
|
||||
|
|
|
@ -1,23 +1,23 @@
|
|||
# 4. Pro
|
||||
|
||||
## Herramientas
|
||||
- **nodemon**: sudo npm install -g nodemon
|
||||
|
||||
### Módulos externos
|
||||
- npm init
|
||||
- npm install q -save
|
||||
|
||||
## 1 Módulos
|
||||
- Clases para representar modelos
|
||||
- Bibliotecas de funciones
|
||||
|
||||
## 2 Operaciones lentas
|
||||
- por ejemplo llamadas externas http
|
||||
|
||||
### 2-1 Callbacks
|
||||
- Te pueden llevar al infierno
|
||||
- Al menos organízate y dales nombre
|
||||
|
||||
### 2-2 Promesas
|
||||
- El doctor Q al rescate
|
||||
|
||||
# 4. Pro
|
||||
|
||||
## Herramientas
|
||||
- **nodemon**: sudo npm install -g nodemon
|
||||
|
||||
### Módulos externos
|
||||
- npm init
|
||||
- npm install q -save
|
||||
|
||||
## 1 Módulos
|
||||
- Clases para representar modelos
|
||||
- Bibliotecas de funciones
|
||||
|
||||
## 2 Operaciones lentas
|
||||
- por ejemplo llamadas externas http
|
||||
|
||||
### 2-1 Callbacks
|
||||
- Te pueden llevar al infierno
|
||||
- Al menos organízate y dales nombre
|
||||
|
||||
### 2-2 Promesas
|
||||
- El doctor Q al rescate
|
||||
|
||||
|
|
|
@ -1,20 +1,20 @@
|
|||
# 5. Express
|
||||
|
||||
## Instalación
|
||||
* npm init
|
||||
* npm install express -save
|
||||
|
||||
## Hola Mundo
|
||||
un servidor web en 4 lineas
|
||||
## Middleware
|
||||
app.use()
|
||||
### Log de llamadas
|
||||
atención al 3º argumento, que llama a la siguiente función en la pila
|
||||
### Directorio estático
|
||||
configuración básica
|
||||
**atención al orden del middleware**
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# 5. Express
|
||||
|
||||
## Instalación
|
||||
* npm init
|
||||
* npm install express -save
|
||||
|
||||
## Hola Mundo
|
||||
un servidor web en 4 lineas
|
||||
## Middleware
|
||||
app.use()
|
||||
### Log de llamadas
|
||||
atención al 3º argumento, que llama a la siguiente función en la pila
|
||||
### Directorio estático
|
||||
configuración básica
|
||||
**atención al orden del middleware**
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -4,4 +4,4 @@
|
|||
<body>
|
||||
Hola, soy muy simple :-(
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
# 6. Rutas
|
||||
|
||||
## Enrutación básica
|
||||
- especificar cada función para cada ruta disponible
|
||||
## Parámetros
|
||||
- /:parametro/
|
||||
## Variantes con patrones de cadenas y expresiones regulares
|
||||
- se usan tando en las rutas como sobre todo en los parámetros
|
||||
|
||||
|
||||
# 6. Rutas
|
||||
|
||||
## Enrutación básica
|
||||
- especificar cada función para cada ruta disponible
|
||||
## Parámetros
|
||||
- /:parametro/
|
||||
## Variantes con patrones de cadenas y expresiones regulares
|
||||
- se usan tando en las rutas como sobre todo en los parámetros
|
||||
|
||||
|
||||
|
|
@ -1,15 +1,15 @@
|
|||
# 7 API-REST
|
||||
|
||||
## Sintaxis: verbos y sustantivos
|
||||
- CRUD : -> http verbs
|
||||
## Recursos y rutas
|
||||
- express router
|
||||
- recuros anidados
|
||||
## Documentación
|
||||
|
||||
## Organización
|
||||
|
||||
- Tener un módulo dónde se definen las rutas y se enlazan a las funciones de respuestas
|
||||
- Llevar las funciones de respuesta a sus propios módulos
|
||||
- llevar la configuración a su propio módulo
|
||||
- mantener el app.js tan limpio como sea posible
|
||||
# 7 API-REST
|
||||
|
||||
## Sintaxis: verbos y sustantivos
|
||||
- CRUD : -> http verbs
|
||||
## Recursos y rutas
|
||||
- express router
|
||||
- recuros anidados
|
||||
## Documentación
|
||||
|
||||
## Organización
|
||||
|
||||
- Tener un módulo dónde se definen las rutas y se enlazan a las funciones de respuestas
|
||||
- Llevar las funciones de respuesta a sus propios módulos
|
||||
- llevar la configuración a su propio módulo
|
||||
- mantener el app.js tan limpio como sea posible
|
||||
|
|
|
@ -9,4 +9,4 @@
|
|||
"body-parser": "^1.12.2",
|
||||
"express": "^4.12.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,12 +13,12 @@ angular.module('controlCajaApp').config(function ($stateProvider,$locationProvid
|
|||
templateUrl: 'nuevo.html'
|
||||
})
|
||||
.state('lista', {
|
||||
url: '/lista',
|
||||
url: '/lista',
|
||||
controller: 'CajaCtrl as caja',
|
||||
templateUrl: 'lista.html'
|
||||
}).state('not-found', {
|
||||
url: '*path',
|
||||
url: '*path',
|
||||
controller: 'CajaCtrl as caja',
|
||||
templateUrl: 'total.html'
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -60,4 +60,4 @@
|
|||
}
|
||||
}
|
||||
angular.module('controlCajaApp').controller('CajaCtrl', cajaCtrl);
|
||||
}());
|
||||
}());
|
||||
|
|
|
@ -23,4 +23,4 @@
|
|||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</section>
|
||||
</section>
|
||||
|
|
|
@ -5,4 +5,4 @@
|
|||
}
|
||||
}
|
||||
angular.module('controlCajaApp').controller('MenuCtrl',menuCtrl);
|
||||
}());
|
||||
}());
|
||||
|
|
|
@ -43,4 +43,4 @@
|
|||
};
|
||||
|
||||
angular.module('controlCajaApp').factory('movimientosFactory', movimientosFactory);
|
||||
}());
|
||||
}());
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
<section name="total">
|
||||
<h2>No se ha encontrado lo que buscabas</h2>
|
||||
</section>
|
||||
</section>
|
||||
|
|
|
@ -50,4 +50,4 @@
|
|||
</fieldset>
|
||||
</form>
|
||||
{{caja.movimientos}}
|
||||
</section>
|
||||
</section>
|
||||
|
|
|
@ -35,4 +35,4 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</section>
|
||||
|
|
|
@ -16,7 +16,7 @@ var total = {
|
|||
gastos: 0
|
||||
}
|
||||
|
||||
// API - REST
|
||||
// API - REST
|
||||
// verbos en protocolo, nombres de recurso en la ruta, parametros en segmentos o body
|
||||
|
||||
// ruta en el API que devolverá la lista de maestros
|
||||
|
@ -56,4 +56,4 @@ app.get('/api/priv/total', function (req, res, next) {
|
|||
|
||||
console.log('steady');
|
||||
app.listen(3000);
|
||||
console.log('go');
|
||||
console.log('go');
|
||||
|
|
|
@ -14,18 +14,18 @@ angular.module('controlCajaApp').config(function ($stateProvider,$locationProvid
|
|||
templateUrl: 'nuevo.html'
|
||||
})
|
||||
.state('lista', {
|
||||
url: '/lista',
|
||||
url: '/lista',
|
||||
controller: 'CajaCtrl as caja',
|
||||
templateUrl: 'lista.html'
|
||||
})
|
||||
.state('registro', {
|
||||
url: '/registro',
|
||||
url: '/registro',
|
||||
controller: 'RegistroCtrl as registro',
|
||||
templateUrl: 'registro.html'
|
||||
})
|
||||
.state('not-found', {
|
||||
url: '*path',
|
||||
url: '*path',
|
||||
controller: 'CajaCtrl as caja',
|
||||
templateUrl: 'total.html'
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
function funcionInterceptoraSeguridad($injector,$q, $cookieStore, $rootScope) {
|
||||
// la función interceptora devuelve un objeto que configura el interceptor
|
||||
var interceptor = {}; // Este objeto almacena funciones a llamar en ciertos momentos
|
||||
|
||||
|
||||
// Función que se ejecutarán antes de cada petición
|
||||
interceptor.request = function (request) {
|
||||
// Enviar en la cabecera el token de sesión previamente guardado en una cookie
|
||||
|
@ -38,10 +38,10 @@
|
|||
};
|
||||
return $q.reject(response);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
return interceptor;
|
||||
}
|
||||
|
||||
angular.module('controlCajaApp').config(configuradorInterceptores);
|
||||
}());
|
||||
}());
|
||||
|
|
|
@ -56,4 +56,4 @@
|
|||
}
|
||||
}
|
||||
angular.module('controlCajaApp').controller('CajaCtrl', cajaCtrl);
|
||||
}());
|
||||
}());
|
||||
|
|
|
@ -44,7 +44,7 @@
|
|||
<script src="registroCtrl.js"></script>
|
||||
<script src="menuCtrl.js"></script>
|
||||
<script src="cajaCtrl.js"></script>
|
||||
|
||||
|
||||
<script src="movimientosFactory.js"></script>
|
||||
<!-- Inluímos referencia al fichero para la carga de maestros -->
|
||||
<script src="maestrosFactory.js"></script>
|
||||
|
|
|
@ -23,4 +23,4 @@
|
|||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</section>
|
||||
</section>
|
||||
|
|
|
@ -4,16 +4,16 @@
|
|||
var maestrosFactory = function ($http) {
|
||||
// en este caso la ruta es pública, pero a este nivel no influye
|
||||
var urlBase = "http://localhost:3000/api/";
|
||||
|
||||
|
||||
var factory = {};
|
||||
|
||||
|
||||
factory.gettingMaestros = function () {
|
||||
return $http.get(urlBase+'pub/maestros');
|
||||
return $http.get(urlBase+'pub/maestros');
|
||||
};
|
||||
|
||||
return factory;
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
angular.module('controlCajaApp').factory('maestrosFactory', maestrosFactory);
|
||||
}());
|
||||
}());
|
||||
|
|
|
@ -5,4 +5,4 @@
|
|||
}
|
||||
}
|
||||
angular.module('controlCajaApp').controller('MenuCtrl',menuCtrl);
|
||||
}());
|
||||
}());
|
||||
|
|
|
@ -37,4 +37,4 @@
|
|||
};
|
||||
|
||||
angular.module('controlCajaApp').factory('movimientosFactory', movimientosFactory);
|
||||
}());
|
||||
}());
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
<section name="total">
|
||||
<h2>No se ha encontrado lo que buscabas</h2>
|
||||
</section>
|
||||
</section>
|
||||
|
|
|
@ -50,4 +50,4 @@
|
|||
</fieldset>
|
||||
</form>
|
||||
{{caja.movimientos}}
|
||||
</section>
|
||||
</section>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
// El rootScope mantiene un ViewModel al que se puede 'bindear' cualquier vista
|
||||
// Es cómodo usarlo para compartir datos de infraestructura
|
||||
// No conviene abusar, para reducir la posibilidad de conflictos y polución de la memoria
|
||||
// El servicio $cookieStore, viene en el módulo ngCookies
|
||||
// El servicio $cookieStore, viene en el módulo ngCookies
|
||||
var registroCtrl = function ( $state, $http, $cookieStore) {
|
||||
var urlBase = "http://localhost:3000/api/";
|
||||
var vm = this;
|
||||
|
@ -25,7 +25,7 @@
|
|||
$state.go("total");
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
angular.module('controlCajaApp').controller('RegistroCtrl', registroCtrl);
|
||||
}());
|
||||
}());
|
||||
|
|
|
@ -35,4 +35,4 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</section>
|
||||
|
|
|
@ -31,7 +31,7 @@ app.use('/api/priv/', function (req, res, next) {
|
|||
// Para que el resto de la pila sepa quien es el usuario actual
|
||||
req.usuario = sesion.email;
|
||||
} else {
|
||||
// La sesión ya está caducada
|
||||
// La sesión ya está caducada
|
||||
console.log('Sesión caducada:' + JSON.stringify(sesion));
|
||||
res.send(419, 'Sesión caducada');
|
||||
}
|
||||
|
@ -49,7 +49,7 @@ app.use('/api/priv/', function (req, res, next) {
|
|||
|
||||
|
||||
|
||||
// API - REST
|
||||
// API - REST
|
||||
// SECURITY
|
||||
// Gestión de usuarios: Lista y registro
|
||||
app.route('/api/usuarios')
|
||||
|
@ -76,11 +76,11 @@ app.route('/api/usuarios')
|
|||
app.route('/api/sesiones')
|
||||
.get(function (req, res, next) {
|
||||
// Esto devuelve la lista completa de sesiones
|
||||
// PELIGRO: Usar sólo a modo de debug mientras desarrollamos
|
||||
// PELIGRO: Usar sólo a modo de debug mientras desarrollamos
|
||||
res.json(sesiones);
|
||||
})
|
||||
.post(function (req, res, next) {
|
||||
// login
|
||||
// login
|
||||
var usuario = req.body;
|
||||
if (esUsuarioValido(usuario)) {
|
||||
console.log('aceptado:' + usuario.email);
|
||||
|
@ -147,7 +147,7 @@ app.route('/api/priv/movimientos')
|
|||
.post(function (req, res, next) {
|
||||
var movimiento = req.body;
|
||||
// Las funciones de negocio trabajan con la info de seguridad
|
||||
// esto es posible gracias que los parametrs se pssan de unas funiones a otras
|
||||
// esto es posible gracias que los parametrs se pssan de unas funiones a otras
|
||||
movimiento.usuario = req.usuario;
|
||||
movimientos.push(movimiento);
|
||||
// Tambien tenemos que totalizar adecuadamente
|
||||
|
@ -184,4 +184,4 @@ app.get('/api/priv/total', function (req, res, next) {
|
|||
|
||||
console.log('steady');
|
||||
app.listen(3000);
|
||||
console.log('go');
|
||||
console.log('go');
|
||||
|
|
|
@ -14,18 +14,18 @@ angular.module('controlCajaApp').config(function ($stateProvider,$locationProvid
|
|||
templateUrl: 'nuevo.html'
|
||||
})
|
||||
.state('lista', {
|
||||
url: '/lista',
|
||||
url: '/lista',
|
||||
controller: 'CajaCtrl as caja',
|
||||
templateUrl: 'lista.html'
|
||||
})
|
||||
.state('registro', {
|
||||
url: '/registro',
|
||||
url: '/registro',
|
||||
controller: 'RegistroCtrl as registro',
|
||||
templateUrl: 'registro.html'
|
||||
})
|
||||
.state('not-found', {
|
||||
url: '*path',
|
||||
url: '*path',
|
||||
controller: 'CajaCtrl as caja',
|
||||
templateUrl: 'total.html'
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
function funcionInterceptoraSeguridad($q, $injector, $cookieStore, $rootScope) {
|
||||
|
||||
var interceptor = {};
|
||||
var interceptor = {};
|
||||
interceptor.request = function (request) {
|
||||
request.headers["sessionId"] = $cookieStore.get("sessionId");
|
||||
return request || $q.when(request);
|
||||
|
@ -27,4 +27,4 @@
|
|||
}
|
||||
|
||||
angular.module('controlCajaApp').config(configuradorInterceptores);
|
||||
}());
|
||||
}());
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
var vm = this;
|
||||
|
||||
vm.titulo = "Controla tu Cash Flow";
|
||||
|
||||
|
||||
// Al usar recursos, la sintaxis se asemaja de nuevo al modelo síncrono
|
||||
// eso es posible porque AngularJS maneja internamente las promesas
|
||||
|
||||
|
@ -12,19 +12,19 @@
|
|||
vm.maestros = maestros;
|
||||
});
|
||||
//vm.maestros = maestrosFactory.get();
|
||||
|
||||
|
||||
vm.nuevoMovimiento = {
|
||||
esIngreso: 1,
|
||||
esGasto: 0,
|
||||
importe: 0,
|
||||
fecha: new Date()
|
||||
};
|
||||
|
||||
|
||||
// vm.nuevoMovimiento = new movimientosFactory.movimientos();
|
||||
// vm.nuevoMovimiento.esIngreso =1;
|
||||
// vm.nuevoMovimiento.fecha = new Date();
|
||||
|
||||
|
||||
|
||||
|
||||
movimientosFactory.gettingMovimientos()
|
||||
.success(function (movimientos) {
|
||||
vm.movimientos = movimientos;
|
||||
|
@ -32,7 +32,7 @@
|
|||
// Si el recurso devuelve un array, tenemos usar el método query en lugar de get que es para un elemnto
|
||||
// vm.movimientos = movimientosFactory.movimientos.query();
|
||||
|
||||
|
||||
|
||||
// movimientosFactory.gettingTotal()
|
||||
// .success(function (total) {
|
||||
// vm.total = total;
|
||||
|
@ -65,7 +65,7 @@
|
|||
// vm.nuevoMovimiento.importe = 0;
|
||||
// });
|
||||
|
||||
|
||||
|
||||
}
|
||||
vm.balance = function () {
|
||||
return vm.total.ingresos - vm.total.gastos
|
||||
|
@ -75,4 +75,4 @@
|
|||
}
|
||||
}
|
||||
angular.module('controlCajaApp').controller('CajaCtrl', cajaCtrl);
|
||||
}());
|
||||
}());
|
||||
|
|
|
@ -23,4 +23,4 @@
|
|||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</section>
|
||||
</section>
|
||||
|
|
|
@ -1,20 +1,20 @@
|
|||
(function () {
|
||||
var maestrosFactory = function ($resource) {
|
||||
|
||||
|
||||
// var urlBase = "http://localhost:3000/api/";
|
||||
//
|
||||
//
|
||||
// var factory = {};
|
||||
//
|
||||
//
|
||||
// factory.gettingMaestros = function () {
|
||||
// return $http.get(urlBase+'pub/maestros');
|
||||
// return $http.get(urlBase+'pub/maestros');
|
||||
// };
|
||||
//
|
||||
// return factory;
|
||||
|
||||
|
||||
|
||||
|
||||
// El uso de recursos simplifica mucho la sintaxis
|
||||
return $resource("/api/pub/maestros/");
|
||||
};
|
||||
|
||||
|
||||
angular.module('controlCajaApp').factory('maestrosFactory', maestrosFactory);
|
||||
}());
|
||||
}());
|
||||
|
|
|
@ -5,4 +5,4 @@
|
|||
}
|
||||
}
|
||||
angular.module('controlCajaApp').controller('MenuCtrl',menuCtrl);
|
||||
}());
|
||||
}());
|
||||
|
|
|
@ -13,15 +13,15 @@
|
|||
return $http.post(urlBase + 'priv/movimientos', movimiento);
|
||||
};
|
||||
|
||||
|
||||
|
||||
factory.total = $resource("/api/priv/total/");
|
||||
// una alternativa es devolver las promesas y ocultar las llamadas
|
||||
// pero genera más código del necesario
|
||||
factory.total.gettingTotal = $resource("/api/priv/total/").get().$promise;
|
||||
|
||||
|
||||
|
||||
return factory;
|
||||
};
|
||||
|
||||
angular.module('controlCajaApp').factory('movimientosFactory', movimientosFactory);
|
||||
}());
|
||||
}());
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
<section name="total">
|
||||
<h2>No se ha encontrado lo que buscabas</h2>
|
||||
</section>
|
||||
</section>
|
||||
|
|
|
@ -50,4 +50,4 @@
|
|||
</fieldset>
|
||||
</form>
|
||||
{{caja.movimientos}}
|
||||
</section>
|
||||
</section>
|
||||
|
|
|
@ -23,4 +23,4 @@
|
|||
}
|
||||
}
|
||||
angular.module('controlCajaApp').controller('RegistroCtrl', registroCtrl);
|
||||
}());
|
||||
}());
|
||||
|
|
|
@ -35,4 +35,4 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</section>
|
||||
|
|
|
@ -35,7 +35,7 @@ app.use('/api/priv/', function (req, res, next) {
|
|||
|
||||
|
||||
|
||||
// API - REST
|
||||
// API - REST
|
||||
// SECURITY
|
||||
app.route('/api/usuarios')
|
||||
.get(function (req, res, next) {
|
||||
|
@ -58,7 +58,7 @@ app.route('/api/usuarios')
|
|||
app.route('/api/sesiones')
|
||||
.get(function (req, res, next) {
|
||||
// Esto devuelve la lista completa de sesiones
|
||||
// PELIGRO: Usar sólo a modo de debug mientras desarrollamos
|
||||
// PELIGRO: Usar sólo a modo de debug mientras desarrollamos
|
||||
res.json(sesiones);
|
||||
})
|
||||
.post(function (req, res, next) {
|
||||
|
@ -159,4 +159,4 @@ app.get('/api/priv/total', function (req, res, next) {
|
|||
|
||||
console.log('steady');
|
||||
app.listen(3000);
|
||||
console.log('go');
|
||||
console.log('go');
|
||||
|
|
|
@ -13,23 +13,23 @@ angular.module('controlCajaApp').config(function ($stateProvider,$locationProvid
|
|||
templateUrl: 'nuevo.html'
|
||||
})
|
||||
.state('lista', {
|
||||
url: '/lista',
|
||||
url: '/lista',
|
||||
controller: 'CajaCtrl as caja',
|
||||
templateUrl: 'lista.html'
|
||||
})
|
||||
.state('movimiento', {
|
||||
url: '/movimiento/:id', // declaracion de parametros en rutas
|
||||
url: '/movimiento/:id', // declaracion de parametros en rutas
|
||||
controller: 'MovimientoCtrl as vm',
|
||||
templateUrl: 'movimiento.html'
|
||||
})
|
||||
.state('registro', {
|
||||
url: '/registro',
|
||||
url: '/registro',
|
||||
controller: 'RegistroCtrl as registro',
|
||||
templateUrl: 'registro.html'
|
||||
})
|
||||
.state('not-found', {
|
||||
url: '*path',
|
||||
url: '*path',
|
||||
controller: 'CajaCtrl as caja',
|
||||
templateUrl: 'total.html'
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -3,12 +3,12 @@
|
|||
function configuradorInterceptores($httpProvider) {
|
||||
$httpProvider.interceptors.push(funcionInterceptoraLog);
|
||||
}
|
||||
|
||||
// Esta función se especializa en escribir en la consola
|
||||
|
||||
// Esta función se especializa en escribir en la consola
|
||||
// información sobre llamadas http
|
||||
function funcionInterceptoraLog($log) {
|
||||
|
||||
var interceptor = {};
|
||||
var interceptor = {};
|
||||
interceptor.request = function (request) {
|
||||
$log.info('request:' + request.url);
|
||||
return request ;
|
||||
|
@ -20,4 +20,4 @@
|
|||
}
|
||||
|
||||
angular.module('controlCajaApp').config(configuradorInterceptores);
|
||||
}());
|
||||
}());
|
||||
|
|
|
@ -26,4 +26,4 @@
|
|||
}
|
||||
|
||||
angular.module('controlCajaApp').config(configuradorInterceptores);
|
||||
}());
|
||||
}());
|
||||
|
|
|
@ -3,13 +3,13 @@
|
|||
var vm = this;
|
||||
|
||||
vm.titulo = "Controla tu Cash Flow";
|
||||
|
||||
|
||||
vm.maestros = maestrosFactory.get();
|
||||
|
||||
|
||||
vm.nuevoMovimiento = new movimientosFactory.movimientos();
|
||||
vm.nuevoMovimiento.esIngreso =1;
|
||||
vm.nuevoMovimiento.fecha = new Date();
|
||||
|
||||
|
||||
vm.movimientos = movimientosFactory.movimientos.query();
|
||||
|
||||
vm.total = movimientosFactory.total.get();
|
||||
|
@ -31,4 +31,4 @@
|
|||
}
|
||||
}
|
||||
angular.module('controlCajaApp').controller('CajaCtrl', cajaCtrl);
|
||||
}());
|
||||
}());
|
||||
|
|
|
@ -28,4 +28,4 @@
|
|||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</section>
|
||||
</section>
|
||||
|
|
|
@ -4,6 +4,6 @@
|
|||
// Una de sus utilidades de 'fábrica' de una caché simple pero potente
|
||||
return $resource("/api/pub/maestros/",{},{get: {cache: true}});
|
||||
};
|
||||
|
||||
|
||||
angular.module('controlCajaApp').factory('maestrosFactory', maestrosFactory);
|
||||
}());
|
||||
}());
|
||||
|
|
|
@ -5,4 +5,4 @@
|
|||
}
|
||||
}
|
||||
angular.module('controlCajaApp').controller('MenuCtrl',menuCtrl);
|
||||
}());
|
||||
}());
|
||||
|
|
|
@ -38,4 +38,4 @@
|
|||
</div>
|
||||
</fieldset>
|
||||
</form>
|
||||
</section>
|
||||
</section>
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
(function () {
|
||||
// $stateParams es el servicio de ui-router para acceder a los parámetros de la ruta
|
||||
// $stateParams es el servicio de ui-router para acceder a los parámetros de la ruta
|
||||
var movimientoCtrl = function ($stateParams, movimientosFactory) {
|
||||
var vm = this;
|
||||
// El acceso es por nombre de parámetro
|
||||
var movId = $stateParams.id;
|
||||
// Se llama al recurso expuesto por la factoría de recursos
|
||||
// Se llama al recurso expuesto por la factoría de recursos
|
||||
// enviándole el objeto que sirve de consulta al método get
|
||||
vm.movimiento = movimientosFactory.movimientos.get({id:movId});
|
||||
}
|
||||
angular.module('controlCajaApp').controller('MovimientoCtrl', movimientoCtrl);
|
||||
}());
|
||||
}());
|
||||
|
|
|
@ -22,4 +22,4 @@
|
|||
};
|
||||
|
||||
angular.module('controlCajaApp').factory('movimientosFactory', movimientosFactory);
|
||||
}());
|
||||
}());
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
<section name="total">
|
||||
<h2>No se ha encontrado lo que buscabas</h2>
|
||||
</section>
|
||||
</section>
|
||||
|
|
|
@ -50,4 +50,4 @@
|
|||
</fieldset>
|
||||
</form>
|
||||
{{caja.movimientos}}
|
||||
</section>
|
||||
</section>
|
||||
|
|
|
@ -23,4 +23,4 @@
|
|||
}
|
||||
}
|
||||
angular.module('controlCajaApp').controller('RegistroCtrl', registroCtrl);
|
||||
}());
|
||||
}());
|
||||
|
|
|
@ -35,4 +35,4 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</section>
|
||||
|
|
|
@ -42,14 +42,14 @@ app.use('/api/priv/', function (req, res, next) {
|
|||
} else {
|
||||
res.status(401).send('Credencial inválida');
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// API - REST
|
||||
// API - REST
|
||||
// SECURITY
|
||||
app.route('/api/usuarios')
|
||||
.get(function (req, res, next) {
|
||||
|
@ -73,7 +73,7 @@ app.route('/api/usuarios')
|
|||
app.route('/api/sesiones')
|
||||
.get(function (req, res, next) {
|
||||
// Esto devuelve la lista completa de sesiones
|
||||
// PELIGRO: Usar sólo a modo de debug mientras desarrollamos
|
||||
// PELIGRO: Usar sólo a modo de debug mientras desarrollamos
|
||||
res.json(sesiones);
|
||||
})
|
||||
.post(function (req, res, next) {
|
||||
|
@ -193,4 +193,4 @@ function getTotalUsuario(usuario) {
|
|||
|
||||
console.log('steady');
|
||||
app.listen(3000);
|
||||
console.log('go');
|
||||
console.log('go');
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
// Usar Transclude para reutilizar el contenido del usuario y hacer la vista más dinámica
|
||||
function cabecera() {
|
||||
return {
|
||||
restrict: 'AE',
|
||||
restrict: 'EA',
|
||||
replace: 'true',
|
||||
transclude: true,
|
||||
templateUrl: '/tpl-cabecera.html'
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<section name="Lista">
|
||||
<!-- <p class="lead">Estos son tus movimientos recientes.</p>-->
|
||||
<ab-cabecera>Estos son tus movimientos recientes.</ab-cabecera>
|
||||
<div ab-cabecera>Estos son tus movimientos recientes.</div>
|
||||
<br>
|
||||
<label class="control-label" for="importe">Filtrar:</label>
|
||||
<input type="text" name="filtro" placeholder="qué buscas?" class="input" ng-model="valorBuscado">
|
||||
|
|
|
@ -1,46 +1,46 @@
|
|||
Directivas
|
||||
==========
|
||||
|
||||
- Se usan de forma **declarativa** en el HTML
|
||||
- Su función es extender y enriquecer el HTML encapsulando el **acceso al DOM**
|
||||
- Se definen como **objetos JS** con propiedades específicas
|
||||
|
||||
Propiedades
|
||||
-----------
|
||||
|
||||
### Restrict
|
||||
Sirve para determinar dónde se puede aplicar la directiva
|
||||
|
||||
Valores posibles:
|
||||
|
||||
- **A** – Attribute ` <div rating> `
|
||||
- **E** – Element ` <rating> `
|
||||
- **C** – Class ` <div class=”rating”> `
|
||||
- **M** – Comment ` <!– directive: rating –> `
|
||||
|
||||
### Replace
|
||||
Indica si el elemento al que se aplica debe ser sustituído por el resultado de la ejecución
|
||||
|
||||
### Transclude
|
||||
Indica si el elemento al que se aplicaca incluirá el resultado de la ejecución de la directiva en su interior
|
||||
|
||||
### Template y template URL
|
||||
Cadena de texto o enlace a fichero que contine el HTML que va a devolver la directiva
|
||||
|
||||
### Scope
|
||||
Intercambio de datos con el elemento que declara la directiva.
|
||||
Valores posibles:
|
||||
|
||||
- **@** Interpolating, para enlazar un texto dentro de la directiva. ` scope: { soloLectura: '@' } `
|
||||
- **=** Data bind, un objeto para doble-enlace que la directiva pueda cambiar ` scope: { valor: '=alias' } `
|
||||
- **&** Expression `scope: { onEvaluado: '&' } `
|
||||
|
||||
|
||||
### Link
|
||||
Una función que enlazará la directiva con el scope
|
||||
|
||||
### Compile
|
||||
Una función que podrá manipular el DOM creando una función link
|
||||
|
||||
### Controller
|
||||
Una función que actuará como contrlador para esta directiva
|
||||
Directivas
|
||||
==========
|
||||
|
||||
- Se usan de forma **declarativa** en el HTML
|
||||
- Su función es extender y enriquecer el HTML encapsulando el **acceso al DOM**
|
||||
- Se definen como **objetos JS** con propiedades específicas
|
||||
|
||||
Propiedades
|
||||
-----------
|
||||
|
||||
### Restrict
|
||||
Sirve para determinar dónde se puede aplicar la directiva
|
||||
|
||||
Valores posibles:
|
||||
|
||||
- **A** – Attribute ` <div rating> `
|
||||
- **E** – Element ` <rating> `
|
||||
- **C** – Class ` <div class=”rating”> `
|
||||
- **M** – Comment ` <!– directive: rating –> `
|
||||
|
||||
### Replace
|
||||
Indica si el elemento al que se aplica debe ser sustituído por el resultado de la ejecución
|
||||
|
||||
### Transclude
|
||||
Indica si el elemento al que se aplicaca incluirá el resultado de la ejecución de la directiva en su interior
|
||||
|
||||
### Template y template URL
|
||||
Cadena de texto o enlace a fichero que contine el HTML que va a devolver la directiva
|
||||
|
||||
### Scope
|
||||
Intercambio de datos con el elemento que declara la directiva.
|
||||
Valores posibles:
|
||||
|
||||
- **@** Interpolating, para enlazar un texto dentro de la directiva. ` scope: { soloLectura: '@' } `
|
||||
- **=** Data bind, un objeto para doble-enlace que la directiva pueda cambiar ` scope: { valor: '=alias' } `
|
||||
- **&** Expression `scope: { onEvaluado: '&' } `
|
||||
|
||||
|
||||
### Link
|
||||
Una función que enlazará la directiva con el scope
|
||||
|
||||
### Compile
|
||||
Una función que podrá manipular el DOM creando una función link
|
||||
|
||||
### Controller
|
||||
Una función que actuará como contrlador para esta directiva
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
https://angular-ui.github.io/
|
||||
http://ngmodules.org/c
|
||||
http://angular-js.in/
|
||||
http://www.directiv.es/
|
||||
|
||||
http://www.tamas.io/node-jsexpress-cors-implementation/
|
||||
https://angular-ui.github.io/
|
||||
http://ngmodules.org/c
|
||||
http://angular-js.in/
|
||||
http://www.directiv.es/
|
||||
|
||||
http://www.tamas.io/node-jsexpress-cors-implementation/
|
||||
http://stackoverflow.com/questions/23823010/how-to-enable-cors-in-angularjs
|
|
@ -0,0 +1,2 @@
|
|||
angular.module('controlCajaApp', ['ui.router','ngCookies', 'ngResource', 'abFiltros','abDirectivas']);
|
||||
|
|
@ -1,6 +1,4 @@
|
|||
angular.module('controlCajaApp', ['ui.router','ngCookies', 'ngResource', 'abFiltros','abDirectivas']);
|
||||
|
||||
angular.module('controlCajaApp').config(function ($stateProvider,$locationProvider) {
|
||||
angular.module('controlCajaApp').config(function ($stateProvider) {
|
||||
$stateProvider
|
||||
.state('total', {
|
||||
url: '/',
|
|
@ -41,18 +41,20 @@
|
|||
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular-cookies.min.js"></script>
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular-resource.min.js"></script>
|
||||
<script src="http://angular-ui.github.io/ui-router/release/angular-ui-router.min.js"></script>
|
||||
<script src="app.js"></script>
|
||||
<script src="appHttpLog.js"></script>
|
||||
<script src="appSecurity.js"></script>
|
||||
<script src="registroCtrl.js"></script>
|
||||
<script src="menuCtrl.js"></script>
|
||||
<script src="cajaCtrl.js"></script>
|
||||
<script src="movimientoCtrl.js"></script>
|
||||
<script src="movimientosFactory.js"></script>
|
||||
<script src="maestrosFactory.js"></script>
|
||||
<script src="filtros.js"></script>
|
||||
<script src="directivas.js"></script>
|
||||
<script src="valoracion.js"></script>
|
||||
<!-- reorganización de referencias-->
|
||||
<script src="_comun/app.js"></script>
|
||||
<script src="_comun/states.js"></script>
|
||||
<script src="_comun/appHttpLog.js"></script>
|
||||
<script src="_comun/appSecurity.js"></script>
|
||||
<script src="registro/registroCtrl.js"></script>
|
||||
<script src="_comun/menuCtrl.js"></script>
|
||||
<script src="controlcaja/cajaCtrl.js"></script>
|
||||
<script src="movimiento/movimientoCtrl.js"></script>
|
||||
<script src="data/movimientosFactory.js"></script>
|
||||
<script src="data/maestrosFactory.js"></script>
|
||||
<script src="filtros/filtros.js"></script>
|
||||
<script src="directivas/directivas.js"></script>
|
||||
<script src="directivas/valoracion/valoracion.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
|
|
@ -1,15 +0,0 @@
|
|||
{
|
||||
"name": "ControlCashFlow",
|
||||
"version": "0.0.0",
|
||||
"description": "Controla tu flujo de caja",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"author": "Alberto Basalo",
|
||||
"license": "BSD-2-Clause",
|
||||
"dependencies": {
|
||||
"express": "~4.12.1",
|
||||
"body-parser": "~1.0.2"
|
||||
}
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
https://angular-ui.github.io/
|
||||
http://ngmodules.org/c
|
||||
http://angular-js.in/
|
||||
http://www.directiv.es/
|
||||
|
||||
http://www.tamas.io/node-jsexpress-cors-implementation/
|
||||
http://stackoverflow.com/questions/23823010/how-to-enable-cors-in-angularjs
|
|
@ -1,187 +0,0 @@
|
|||
var express = require('express');
|
||||
var bodyParser = require('body-parser');
|
||||
|
||||
var app = express();
|
||||
app.use(bodyParser());
|
||||
app.use(express.static(__dirname + '/client'));
|
||||
|
||||
app.use(function (peticion, respuesta, siguiente) {
|
||||
console.log("recibida petición: " + peticion.url);
|
||||
if (peticion.body && Object.keys(peticion.body).length>0) {
|
||||
console.log("body: " + JSON.stringify(peticion.body));
|
||||
}
|
||||
siguiente();
|
||||
});
|
||||
|
||||
console.log('ready');
|
||||
|
||||
var maxId = 0;
|
||||
var movimientos = [];
|
||||
var totales = [];
|
||||
|
||||
var usuarios = [];
|
||||
var sesiones = [];
|
||||
|
||||
|
||||
app.use('/api/priv/', function (req, res, next) {
|
||||
var sessionId = req.get('sessionId');
|
||||
var sesion = getSesion(sessionId);
|
||||
if (sesion) {
|
||||
if (esSesionValida(sesion)) {
|
||||
sesion.timeStamp = new Date();
|
||||
req.usuario = sesion.email;
|
||||
next();
|
||||
} else {
|
||||
console.log('Sesión caducada:' + JSON.stringify(sesion));
|
||||
res.status(419).send('Sesión caducada');
|
||||
}
|
||||
} else {
|
||||
res.status(401).send('Credencial inválida');
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// API - REST
|
||||
// SECURITY
|
||||
app.route('/api/usuarios')
|
||||
.get(function (req, res, next) {
|
||||
// Esto devuelve la lista completa de usuarios y contraseñas
|
||||
// PELIGRO: Usar sólo a modo de debug mientras desarrollamos
|
||||
res.json(usuarios);
|
||||
})
|
||||
.post(function (req, res, next) {
|
||||
var usuario = req.body;
|
||||
if (existeUsuario(usuario)) {
|
||||
console.log('email ya registrado:' + usuario.email);
|
||||
res.status(409).send('email ' + usuario.email + ' ya registrado');
|
||||
} else {
|
||||
console.log('registrado:' + usuario.email);
|
||||
usuarios.push(usuario);
|
||||
res.json(newSession(usuario.email));
|
||||
}
|
||||
});
|
||||
|
||||
// Gestión de sesiones: listado y login
|
||||
app.route('/api/sesiones')
|
||||
.get(function (req, res, next) {
|
||||
// Esto devuelve la lista completa de sesiones
|
||||
// PELIGRO: Usar sólo a modo de debug mientras desarrollamos
|
||||
res.json(sesiones);
|
||||
})
|
||||
.post(function (req, res, next) {
|
||||
var usuario = req.body;
|
||||
if (esUsuarioValido(usuario)) {
|
||||
console.log('aceptado:' + usuario.email);
|
||||
res.json(newSession(usuario.email));
|
||||
} else {
|
||||
console.log('Credencial inválida:' + usuario.email);
|
||||
res.status(401).send('Credencial inválida');
|
||||
}
|
||||
});
|
||||
|
||||
function existeUsuario(usuario) {
|
||||
return usuarios.some(function (u) {
|
||||
return u.email == usuario.email;
|
||||
});
|
||||
}
|
||||
|
||||
function esUsuarioValido(usuario) {
|
||||
return usuarios.filter(function (u) {
|
||||
return u.email == usuario.email && u.password == usuario.password;
|
||||
})[0];
|
||||
}
|
||||
|
||||
function getSesion(sessionId) {
|
||||
return sesiones.filter(function (s) {
|
||||
return s.sessionId == sessionId;
|
||||
})[0]
|
||||
}
|
||||
|
||||
function esSesionValida(sesion) {
|
||||
return (new Date() - sesion.timeStamp) < 20 * 60 * 1000;
|
||||
}
|
||||
|
||||
function newSession(email) {
|
||||
var sessionId = Math.random() * (88888) + 11111;
|
||||
var timeStamp = new Date();
|
||||
sesiones.push({
|
||||
sessionId: sessionId,
|
||||
email: email,
|
||||
timeStamp: timeStamp
|
||||
});
|
||||
return sessionId;
|
||||
}
|
||||
|
||||
|
||||
// BUSINESS
|
||||
app.get('/api/pub/maestros', function (req, res, next) {
|
||||
var maestros = {
|
||||
categoriasIngresos: ['Nómina', 'Ventas', 'Intereses Depósitos'],
|
||||
categoriasGastos: ['Hipotéca', 'Compras', 'Impuestos']
|
||||
};
|
||||
res.json(maestros);
|
||||
});
|
||||
|
||||
app.route('/api/priv/movimientos')
|
||||
.get(function (req, res, next) {
|
||||
var movimientosUsuario = movimientos.filter(function (m) {
|
||||
return m.usuario = req.usuario;
|
||||
});
|
||||
res.json(movimientosUsuario);
|
||||
})
|
||||
.post(function (req, res, next) {
|
||||
var movimiento = req.body;
|
||||
movimiento.usuario = req.usuario;
|
||||
maxId++;
|
||||
movimiento.id = maxId;
|
||||
movimientos.push(movimiento);
|
||||
var totalUsuario = getTotalUsuario(req.usuario);
|
||||
if (movimiento.tipo == 'Ingreso')
|
||||
totalUsuario.ingresos += movimiento.importe;
|
||||
else
|
||||
totalUsuario.gastos += movimiento.importe;
|
||||
res.status(200).send();
|
||||
});
|
||||
|
||||
app.get('/api/priv/movimientos/:id', function (req, res, next) {
|
||||
var movId = req.params.id;
|
||||
movimientoBuscado = getMovimientoById(movId, req.usuario);
|
||||
res.json(movimientoBuscado);
|
||||
});
|
||||
|
||||
function getMovimientoById(id,usuario) {
|
||||
var movimientoBuscado = movimientos.filter(function (movimiento) {
|
||||
return movimiento.id == id && movimiento.usuario == usuario;
|
||||
})[0];
|
||||
return movimientoBuscado;
|
||||
}
|
||||
|
||||
app.get('/api/priv/total', function (req, res, next) {
|
||||
var totalUsuario = getTotalUsuario(req.usuario);
|
||||
res.json(totalUsuario);
|
||||
});
|
||||
|
||||
function getTotalUsuario(usuario) {
|
||||
if(usuario===undefined) return {};
|
||||
var totalUsuario = totales.filter(function (t) {
|
||||
return t.usuario == usuario;
|
||||
})[0];
|
||||
if (totalUsuario===undefined) {
|
||||
totalUsuario = {
|
||||
usuario : usuario,
|
||||
ingresos: 0,
|
||||
gastos: 0
|
||||
};
|
||||
totales.push(totalUsuario);
|
||||
}
|
||||
return totalUsuario;
|
||||
}
|
||||
|
||||
|
||||
console.log('steady');
|
||||
app.listen(3000);
|
||||
console.log('go');
|
|
@ -1,3 +1,4 @@
|
|||
"use strict";
|
||||
module.exports.routeMaestros = function (app) {
|
||||
app.get('/api/pub/maestros', function (req, res, next) {
|
||||
var maestros = {
|
|
@ -0,0 +1,26 @@
|
|||
"use strict";
|
||||
var movimientosData = require('../data/movimientosData.js');
|
||||
|
||||
module.exports.routeMovimientos = function (app) {
|
||||
|
||||
app.route('/api/priv/movimientos')
|
||||
.get(function (req, res, next) {
|
||||
res.json(movimientosData.getMovimientos(req.usuario));
|
||||
})
|
||||
.post(function (req, res, next) {
|
||||
var movimiento = req.body;
|
||||
movimiento.usuario = req.usuario;
|
||||
movimientosData.postMovimiento(movimiento);
|
||||
res.status(200).send();
|
||||
});
|
||||
|
||||
app.get('/api/priv/movimientos/:id', function (req, res, next) {
|
||||
res.json(movimientosData.getMovimiento(req.params.id, req.usuario));
|
||||
});
|
||||
|
||||
app.get('/api/priv/total', function (req, res, next) {
|
||||
res.json(movimientosData.getTotalUsuario(req.usuario));
|
||||
});
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
"use strict";
|
||||
var seguridadData = require('../data/seguridadData.js');
|
||||
|
||||
module.exports.seguridad = function (app) {
|
||||
|
||||
app.use('/api/priv/', function (req, res, next) {
|
||||
var sessionId = req.get('sessionId');
|
||||
var sesion = seguridadData.getSesion(sessionId);
|
||||
if (sesion) {
|
||||
if (sesion.timeStamp) {
|
||||
req.usuario = sesion.email;
|
||||
next();
|
||||
} else {
|
||||
res.status(419).send('Sesión caducada');
|
||||
}
|
||||
} else {
|
||||
res.status(401).send('Credencial inválida');
|
||||
}
|
||||
});
|
||||
|
||||
// API - REST
|
||||
// SECURITY
|
||||
app.route('/api/usuarios')
|
||||
.post(function (req, res, next) {
|
||||
var usuario = req.body;
|
||||
var sesion = seguridadData.postUsuario(usuario);
|
||||
if (sesion) {
|
||||
res.json(sesion);
|
||||
} else {
|
||||
res.status(409).send('email ' + usuario.email + ' ya registrado');
|
||||
}
|
||||
});
|
||||
|
||||
// Gestión de sesiones: listado y login
|
||||
app.route('/api/sesiones')
|
||||
.post(function (req, res, next) {
|
||||
var usuario = req.body;
|
||||
var sesion = seguridadData.postSesion(usuario);
|
||||
if (sesion) {
|
||||
res.json(sesion);
|
||||
} else {
|
||||
res.status(401).send('Credencial inválida');
|
||||
}
|
||||
});
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
"use strict";
|
||||
var settings = require("./settings.js");
|
||||
var app = require('./express.js').configApp();
|
||||
console.log('ready... settings ok', settings);
|
||||
|
||||
require('./api/seguridadAPI.js').seguridad(app);
|
||||
require('./api/maestrosAPI.js').routeMaestros(app);
|
||||
require('./api/movimientosAPI.js').routeMovimientos(app);
|
||||
console.log('steady... routes OK');
|
||||
|
||||
app.listen(settings.port);
|
||||
console.log('go... listening on port: ' + settings.port);
|
|
@ -0,0 +1,58 @@
|
|||
"use strict";
|
||||
var maxId = 0;
|
||||
var movimientos = [];
|
||||
var totales = [];
|
||||
|
||||
module.exports.getMovimientos = function (usuario) {
|
||||
var movimientosUsuario = movimientos.filter(function (m) {
|
||||
return m.usuario = usuario;
|
||||
});
|
||||
return movimientosUsuario;
|
||||
}
|
||||
|
||||
module.exports.getMovimiento = function (movId, usuario) {
|
||||
var movimientoBuscado = movimientos.filter(function (movimiento) {
|
||||
return movimiento.id == movId && movimiento.usuario == usuario;
|
||||
})[0];
|
||||
return movimientoBuscado;
|
||||
}
|
||||
|
||||
module.exports.getTotalUsuario = function (usuario) {
|
||||
var totalUsuario = getTotalUsuario(usuario);
|
||||
return totalUsuario;
|
||||
}
|
||||
|
||||
module.exports.postMovimiento = function (movimiento) {
|
||||
maxId++;
|
||||
movimiento.id = maxId;
|
||||
movimientos.push(movimiento);
|
||||
var totalUsuario = getTotalUsuario(movimiento.usuario);
|
||||
if (movimiento.tipo == 'Ingreso')
|
||||
totalUsuario.ingresos += movimiento.importe;
|
||||
else
|
||||
totalUsuario.gastos += movimiento.importe;
|
||||
return getMovimientosUsuario(movimiento.usuario);
|
||||
}
|
||||
|
||||
function getMovimientosUsuario(usuario) {
|
||||
var movimientosUsuario = movimientos.filter(function (m) {
|
||||
return m.usuario = usuario;
|
||||
});
|
||||
return movimientosUsuario;
|
||||
}
|
||||
|
||||
function getTotalUsuario(usuario) {
|
||||
if (usuario === undefined) return {};
|
||||
var totalUsuario = totales.filter(function (t) {
|
||||
return t.usuario == usuario;
|
||||
})[0];
|
||||
if (totalUsuario === undefined) {
|
||||
totalUsuario = {
|
||||
usuario: usuario,
|
||||
ingresos: 0,
|
||||
gastos: 0
|
||||
};
|
||||
totales.push(totalUsuario);
|
||||
}
|
||||
return totalUsuario;
|
||||
}
|
|
@ -0,0 +1,75 @@
|
|||
"use strict";
|
||||
var usuarios = [];
|
||||
var sesiones = [];
|
||||
|
||||
module.exports.postUsuario = function (usuario) {
|
||||
if (existeUsuario(usuario)) {
|
||||
console.log('email ya registrado:' + usuario.email);
|
||||
return null;
|
||||
} else {
|
||||
console.log('registrado:' + usuario.email);
|
||||
usuarios.push(usuario);
|
||||
return newSession(usuario.email);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports.postSesion = function (usuario) {
|
||||
if (esUsuarioValido(usuario)) {
|
||||
console.log('aceptado:' + usuario.email);
|
||||
return newSession(usuario.email);
|
||||
} else {
|
||||
console.log('Credencial inválida:' + usuario.email);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports.getSesion = function (sessionId) {
|
||||
var sesion = getSesion(sessionId);
|
||||
if (sesion) {
|
||||
if (esSesionValida(sesion)) {
|
||||
sesion.timeStamp = new Date();
|
||||
return sesion;
|
||||
} else {
|
||||
console.log('Sesión caducada:' + JSON.stringify(sesion));
|
||||
sesion.timeStamp = null;
|
||||
return sesion;
|
||||
}
|
||||
} else {
|
||||
console.log('Credencial inválida:' + sessionId);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function existeUsuario(usuario) {
|
||||
return usuarios.some(function (u) {
|
||||
return u.email == usuario.email;
|
||||
});
|
||||
}
|
||||
|
||||
function esUsuarioValido(usuario) {
|
||||
return usuarios.filter(function (u) {
|
||||
return u.email == usuario.email && u.password == usuario.password;
|
||||
})[0];
|
||||
}
|
||||
|
||||
function getSesion(sessionId) {
|
||||
return sesiones.filter(function (s) {
|
||||
return s.sessionId == sessionId;
|
||||
})[0]
|
||||
}
|
||||
|
||||
function esSesionValida(sesion) {
|
||||
return (new Date() - sesion.timeStamp) < 20 * 60 * 1000;
|
||||
}
|
||||
|
||||
function newSession(email) {
|
||||
var sessionId = Math.random() * (88888) + 11111;
|
||||
var timeStamp = new Date();
|
||||
sesiones.push({
|
||||
sessionId: sessionId,
|
||||
email: email,
|
||||
timeStamp: timeStamp
|
||||
});
|
||||
return sessionId;
|
||||
}
|
|
@ -1,3 +1,4 @@
|
|||
"use strict";
|
||||
module.exports.configApp = function () {
|
||||
|
||||
var express = require('express');
|
||||
|
@ -5,8 +6,12 @@ module.exports.configApp = function () {
|
|||
|
||||
var app = express();
|
||||
|
||||
app.use(bodyParser());
|
||||
app.use(bodyParser.urlencoded({
|
||||
extended: true
|
||||
}));
|
||||
app.use(bodyParser.json());
|
||||
app.use(express.static(__dirname + './../client'));
|
||||
console.log("bodyParser y servidor de ficheros estáticos en uso");
|
||||
|
||||
app.use(function (peticion, respuesta, siguiente) {
|
||||
console.log("recibida petición: " + peticion.url);
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче