Browse Source

login redesigned for JSONRPC

robert2206 8 years ago
parent
commit
5197683c57

+ 10 - 1
src/app/app.module.ts

@@ -14,6 +14,9 @@ import { OdooRPCService } from "angular2-odoo-jsonrpc";
 import { AuthService } from "../services/auth-service";
 import { OdooService } from "../services/odoo-service";
 import { PouchService } from "../services/pouch-service";
+import { SyncService } from "../services/sync-service";
+import { DownloadService } from "../services/download-service";
+import { UploadService } from "../services/upload-service";
 
 // Pipes
 import { MenuPipe } from "../pipes/menu";
@@ -46,7 +49,13 @@ import { MenuPipe } from "../pipes/menu";
         AuthService,
         OdooService,
         PouchService,
-        { provide: ErrorHandler, useClass: IonicErrorHandler }
+        SyncService,
+        DownloadService,
+        UploadService,
+        {
+            provide: ErrorHandler,
+            useClass: IonicErrorHandler
+        }
     ]
 })
 export class AppModule {}

+ 6 - 0
src/models/credential.ts

@@ -0,0 +1,6 @@
+export interface Credential {
+    host: string,
+    database: string,
+    username: string,
+    password: string
+}

+ 16 - 0
src/models/product.ts

@@ -0,0 +1,16 @@
+function OdooType (type: string) {
+    return function (target: Function) {
+        target.prototype.getRemoteModel = function () {
+            return type;
+        }
+
+        target.prototype.getLocalModel = function () {
+            return type.replace(/./g, '_');
+        }
+    }
+}
+
+@OdooType('product.template')
+export class Product {
+
+}

+ 5 - 0
src/pages/home/home.html

@@ -1,6 +1,11 @@
 <ion-header>
 
     <ion-navbar>
+
+        <button ion-button menuToggle>
+            <ion-icon name="menu"></ion-icon>
+        </button>
+
         <ion-title>Home</ion-title>
     </ion-navbar>
 

+ 13 - 15
src/pages/home/home.ts

@@ -1,22 +1,20 @@
 import { Component } from '@angular/core';
-import { NavController, NavParams } from 'ionic-angular';
+import { NavController, NavParams, MenuController } from 'ionic-angular';
 
-/*
-  Generated class for the Home page.
-
-  See http://ionicframework.com/docs/v2/components/#navigation for more info on
-  Ionic pages and navigation.
-*/
 @Component({
-  selector: 'page-home',
-  templateUrl: 'home.html'
+	selector: 'page-home',
+  	templateUrl: 'home.html'
 })
 export class HomePage {
+  	
+	constructor(
+		public navCtrl: NavController,
+		public navParams: NavParams,
+		public menuCtrl: MenuController
+	) { }
 
-  constructor(public navCtrl: NavController, public navParams: NavParams) {}
-
-  ionViewDidLoad() {
-    console.log('ionViewDidLoad HomePage');
-  }
-
+  	ionViewDidLoad() {
+		console.log('ionViewDidLoad HomePage');
+		this.menuCtrl.enable(true);
+  	}
 }

+ 36 - 24
src/pages/login/login.ts

@@ -1,15 +1,19 @@
-import { Component, OnInit } from '@angular/core';
+import { Component } from '@angular/core';
 import { NavController, MenuController, LoadingController, Loading, AlertController, NavParams } from 'ionic-angular';
 import { Validators, FormGroup, FormBuilder } from "@angular/forms";
 
 import { AuthService } from "../../services/auth-service";
 import { PouchService } from "../../services/pouch-service";
 
+import { Credential } from "../../models/credential";
+
+import { HomePage } from "../home/home";
+
 @Component({
   	selector: 'page-login',
   	templateUrl: 'login.html'
 })
-export class LoginPage implements OnInit {
+export class LoginPage {
 	
 	loader: Loading;
 	loginForm: FormGroup;
@@ -37,38 +41,46 @@ export class LoginPage implements OnInit {
 	 */
 	ionViewDidLoad() {
 		this.menuCtrl.enable(false);
-	}
 
-	/**
-	 *
-	 */
-	ngOnInit() {
-		console.log('init');
+		this.auth.skipSignin().subscribe(result => { 
+			if (result.count > 0) {
+				this.navCtrl.setRoot(HomePage);
+			}
+		}, error => console.log(error));
 	}
 	
 	/**
 	 *
 	 */
-	signin(login): void {
+	signin(loginInformation): void {
 		this.loader = this.loadingCtrl.create({
 			content: "Identificando usuario, espere..."
 		});
 		this.loader.present();
+		this.auth.signin(loginInformation).subscribe(result => this.signinSuccess(result), error => this.signinError(error));
+	}
 
-		this.auth.initialize(login.host);
-		this.auth.login(login.database, login.username, login.password).subscribe(response => {
-			this.loader.dismiss();
-			console.log(response);
-		}, error => { 
-			this.loader.dismiss();
-
-			this.alertCtrl.create({
-				title: 'Atención',
-				message: 'No se puede conectar al servidor',
-				buttons: [
-					'Aceptar'
-				]
-			}).present();
-		});
+	/**
+	 *
+	 */
+	signinSuccess(data: any): void {
+		this.loader.dismiss();
+		console.log(data);
 	}
+
+	/**
+	 *
+	 */
+	signinError(error: any): void {
+		console.log(error);
+		
+		this.loader.dismiss();
+		this.alertCtrl.create({
+			title: 'Atención',
+			message: 'No se puede conectar al servidor',
+			buttons: [
+				'Aceptar'
+			]
+		}).present();
+	} 
 }

+ 2 - 6
src/pages/page1/page1.ts

@@ -17,18 +17,14 @@ export class Page1 {
         public odoo: OdooService,
         public pouch: PouchService
     ) { 
-        auth.initialize("http://localhost", 8100);
+      
     }
 
     /**
      *
      */
     testLogin(e) {
-        this.auth.login("odoo", "admin", "admin").subscribe(data => { 
-            console.log(data);
-        }, err => { 
-            console.log(err);
-        });
+     
     }
 
     /**

+ 48 - 6
src/services/auth-service.ts

@@ -1,22 +1,27 @@
 import { Injectable } from "@angular/core";
 import { Observable } from "rxjs/Observable";
 import { Observer } from "rxjs/Observer";
+
 import { OdooRPCService } from "angular2-odoo-jsonrpc";
+import { PouchService } from "./pouch-service";
+import { SyncService } from "./sync-service";
 
-import 'rxjs/add/observable/throw'
 import "rxjs/add/observable/fromPromise";
+import "rxjs/add/operator/concatMap";
 
 @Injectable()
 export class AuthService {
 
     constructor(
-        public odooRPC: OdooRPCService
+        public odooRPC: OdooRPCService,
+        public pouch: PouchService,
+        public sync: SyncService
     ) { }
 
     /**
      *
      */
-    initialize(url: string, port?: number) {
+    private initialize(url: string, port?: number) {
         let host = url;
 
         if (port) {
@@ -32,14 +37,51 @@ export class AuthService {
     /**
      *
      */
-    login(database: string, username: string, password: string): Observable<any> {
-        return Observable.fromPromise(this.odooRPC.login(database, username, password));
+    signin(loginInformation: any): Observable<any> {
+        this.initialize(loginInformation.host);
+
+        return Observable.fromPromise(this.odooRPC.login(loginInformation.database, loginInformation.username, loginInformation.password))
+            .concatMap(response => this.normalizeUserInformation(response, loginInformation.password))
+            .concatMap(userInformation => this.storeUserInformation(userInformation));
     }
 
+    skipSignin(): Observable<any> {
+        return this.pouch.getAll('user').concatMap(result => this.playUsersInformations(result));
+    }
     /**
      *
      */
-    logout(): Observable<any> {
+    signout(): Observable<any> {
         return Observable.fromPromise(this.odooRPC.logout());
     }
+
+    /**
+     *
+     */
+    private normalizeUserInformation(response: any, password: string): Observable<any> {
+        return Observable.create((observer: Observer<any>) => { 
+            observer.next(Object.assign(response, { password: password }));
+        });
+    }
+
+    /**
+     *
+     */
+    private storeUserInformation(userInformation: any): Observable<any> {
+        return this.pouch.save(Object.assign(userInformation, { type: 'user' }));
+    }
+
+    /**
+     *
+     */
+    private playUsersInformations(result: any): Observable<any> {
+        let users: any = {
+            count: result.docs.length,
+            users: result.docs
+        }
+
+        return Observable.create((observer: Observer<any>) => { 
+            observer.next(users);
+        });
+    }
 }

+ 4 - 13
src/services/odoo-service.ts

@@ -1,7 +1,8 @@
 import { Injectable } from "@angular/core";
 import { OdooRPCService } from "angular2-odoo-jsonrpc";
 import { Observable } from "rxjs/Observable";
-import { Observer } from "rxjs/Observer";
+
+import "rxjs/add/observable/fromPromise";
 
 @Injectable()
 export class OdooService {
@@ -15,12 +16,7 @@ export class OdooService {
      * instance.searchRead('res.partner', [[['is_company', '=', true], ['customer', '=', true]]], { 'fields': ['name', 'comment']})
      */
     searchRead(model: string, domain: any, fields: any): Observable<any> {
-        return Observable.create((observer: Observer<any>) => { 
-            this.odooRPC.searchRead(model, domain, fields).then(response => { 
-                observer.next(response);
-                observer.complete();
-            }).catch(error => observer.error(error));
-        });
+        return Observable.fromPromise(this.odooRPC.searchRead(model, domain, fields));
     }
 
     /**
@@ -28,12 +24,7 @@ export class OdooService {
      * instance.call('res.partner', 'search', [[['customer', '=', true], ['is_company', '=', false]]], { 'limit': 1})
      */
     call(model: string, method: string, args: any, kwargs?: any): Observable<any> {
-        return Observable.create((observer: Observer<any>) => {
-            this.odooRPC.call(model, method, args, kwargs).then(response => { 
-                observer.next(response);
-                observer.complete();
-            }).then(error => observer.error(error));
-        });
+        return Observable.fromPromise(this.odooRPC.call(model, method, args, kwargs));
     }
 
     /**

+ 13 - 31
src/services/pouch-service.ts

@@ -1,9 +1,12 @@
 import { Injectable } from "@angular/core";
 import { Observable } from "rxjs/Observable";
-import { Observer } from "rxjs/Observer";
 import PouchDB from "pouchdb";
+
 import * as PouchFind from "pouchdb-find";
 
+import "rxjs/add/observable/throw";
+import "rxjs/add/observable/fromPromise";
+
 PouchDB.plugin(PouchFind);
 
 @Injectable()
@@ -37,12 +40,7 @@ export class PouchService {
             return Observable.throw("Error: Cannot save data without type");
         }
 
-        return Observable.create((observer: Observer<any>) => {
-            this.pouchDB.put(data).then(response => {
-                observer.next(response);
-                observer.complete();
-            }).catch(error => observer.error(error));
-        });
+        return Observable.fromPromise(this.pouchDB.post(data));
     }
 
     /**
@@ -53,12 +51,7 @@ export class PouchService {
             return Observable.throw("Error: Cannot remove data without id or rev");
         }
 
-        return Observable.create((observer: Observer<any>) => {
-            this.pouchDB.remove(data).then(response => {
-                observer.next(response);
-                observer.complete();
-            }).catch(error => observer.error(error));
-        });
+        return Observable.fromPromise(this.pouchDB.remove(data));
     }
 
     /**
@@ -69,30 +62,19 @@ export class PouchService {
             return Observable.throw("Error: Cannot get data without id");
         }
 
-        return Observable.create((observer: Observer<any>) => {
-            this.pouchDB.get(data._id).then(response => {
-                observer.next(response);
-                observer.complete();
-            }).catch(error => observer.error(error));
-        });
-
+        return Observable.fromPromise(this.pouchDB.get(data._id));
     }
 
     /**
      *
      */
     getAll(type: string): Observable<any> {
-        return Observable.create((observer: Observer<any>) => {
-            this.pouchDB.find({
-                selector: {
-                    name: {
-                        $eq: type
-                    }
+        return Observable.fromPromise(this.pouchDB.find({
+            selector: {
+                type: {
+                    $eq: type
                 }
-            }).then(response => {
-                observer.next(response);
-                observer.complete();
-            }).catch(error => observer.error(error));
-        });
+            }
+        }));
     }
 }

+ 0 - 1
src/services/sync-service.ts

@@ -1,6 +1,5 @@
 import { Injectable } from "@angular/core";
 import { Observable } from "rxjs/Observable";
-import { Observer } from "rxjs/Observer";
 
 import { UploadService } from "../services/upload-service";
 import { DownloadService } from "../services/download-service";