src/app/manage-learn/core/services/db.service.ts
        
                        Properties | 
                
                        Methods | 
                
constructor(appGlobalService: AppGlobalService)
                     | 
                ||||||
| 
                             
                                    Parameters :
                                     
                    
  | 
                
| bulkCreate | ||||
bulkCreate(data)
                 | 
            ||||
| 
                     
                        Parameters :
                        
                         
                    
 
                        Returns :      
                    Promise<any>
                     | 
            
| create | ||||||
create(entry: any)
                 | 
            ||||||
| 
                     
                        Parameters :
                        
                         
                    
 
                        Returns :      
                    Promise<any>
                     | 
            
| createDb | 
createDb()
                 | 
            
| 
                     
                        Returns :          
                any
                     | 
            
| createPouchDB | ||||||
createPouchDB(dbName: string)
                 | 
            ||||||
| 
                     
                        Parameters :
                        
                         
                    
 
                        Returns :          
                    void
                     | 
            
| customQuery | ||||
customQuery(query)
                 | 
            ||||
| 
                     
                        Parameters :
                        
                         
                    
 
                        Returns :          
                    any
                     | 
            
| delete | ||||||
delete(id, rev)
                 | 
            ||||||
| 
                     
                        Parameters :
                        
                         
                    
 
                        Returns :      
                    Promise<any>
                     | 
            
| dropDb | 
dropDb()
                 | 
            
| 
                     
                        Returns :      
                Promise<any>
                     | 
            
| formatDataForBulkCreate | ||||
formatDataForBulkCreate(data)
                 | 
            ||||
| 
                     
                        Parameters :
                        
                         
                    
 
                        Returns :          
                    any
                     | 
            
| getAllDocs | 
getAllDocs()
                 | 
            
| 
                     
                        Returns :      
                Promise<any>
                     | 
            
| getById | ||||
getById(id)
                 | 
            ||||
| 
                     
                        Parameters :
                        
                         
                    
 
                        Returns :      
                    Promise<any>
                     | 
            
| query | 
query(selector: any, limit: number)
                 | 
            
| 
                    
                     
                        Returns :      
                    Promise<any>
                     | 
            
| read | ||||||||
read(limit: number)
                 | 
            ||||||||
| 
                     
                        Parameters :
                        
                         
                    
 
                        Returns :      
                    Promise<any>
                     | 
            
| update | ||||
update(data)
                 | 
            ||||
| 
                     
                        Parameters :
                        
                         
                    
 
                        Returns :      
                    Promise<any>
                     | 
            
| isDbInitialized | 
                        Type :         boolean
                     | 
                
                        Default value : false
                     | 
                
| pdb | 
                        Type :         any
                     | 
                
import { Injectable } from '@angular/core';
import { AppGlobalService } from '@app/services';
import PouchDB from 'pouchdb';
import cordovaSqlitePlugin from 'pouchdb-adapter-cordova-sqlite';
import PouchDBFind from 'pouchdb-find';
@Injectable({
  providedIn: 'root',
})
export class DbService {
  pdb: any;
  isDbInitialized:boolean = false;
  constructor(private appGlobalService: AppGlobalService) {
  }
  createDb() {
    return new Promise(async(resolve, reject) => {
      if(this.isDbInitialized){
        resolve(true)
      } else {
        PouchDB.plugin(cordovaSqlitePlugin);
        PouchDB.plugin(PouchDBFind);
        const db = await new PouchDB('projects', {
          adapter: 'cordova-sqlite',
          location: 'default',
        });
        const dbInfo = await db.info()
        let oldData;
        if (dbInfo.doc_count) {
          oldData = await db.find({
            selector: {_id:{$ne:null}},
          });
    
          await db.destroy()
    
          oldData.docs= oldData.docs.map(d => {
            delete d._rev
            return d
          })
        }
        this.appGlobalService.getActiveProfileUid().then((userId) => {
          let dbName= userId + 'projects';
          this.pdb = new PouchDB(dbName, {
            adapter: 'cordova-sqlite',
            location: 'default',
          });
        }).then(res => {
          if (oldData && oldData.docs && oldData.docs.length) {
            this.bulkCreate(oldData.docs)
          }
          this.isDbInitialized = true;
          resolve(true)
        })
      }
    })
  }
  createPouchDB(dbName: string) {
  }
  create(entry: any): Promise<any> {
    return new Promise((resolve, reject) => {
      this.createDb().then(isInitialized => {
        if(isInitialized) {
          this.pdb.post(entry).then(success => {
            success.ok ? resolve(success) : reject()
          }).catch(error => {
            reject(error)
          })
        }
      })
    })
  }
  update(data): Promise<any> {
    delete data.__v;
    data.updatedAt = new Date();
    return new Promise((resolve, reject) => {
      this.createDb().then(isInitialized => {
        if(isInitialized) {
          this.pdb.put(data).then(success => {
            console.log(success, "success in update");
            success.ok ? resolve(success) : reject()
          }).catch(error => {
            console.log(error, "error in update");
            reject(error)
          })
        }
      })
    })
  }
  delete(id, rev): Promise<any> {
    const obj = {
      _id: id,
      _rev: rev
    }
    return new Promise((resolve, reject) => {
      this.createDb().then(isInitialized => {
        if(isInitialized) {
          this.pdb.remove(id, rev).then(success => {
            success.ok ? resolve(success) : reject()
          }).catch(error => {
            reject(error)
          })
        }
      })
    })
  }
  read(limit: number = 20): Promise<any> {
    return new Promise((resolve, reject) => {
      this.createDb().then(isInitialized => {
        if(isInitialized) {
          this.pdb.allDocs({ include_docs: true, limit: limit })
          .then(docs => {
            let data = [];
            docs.rows.forEach(element => {
              data.push(element.doc)
            });
            resolve(data);
          }).catch(error => {
            reject(error);
          })
        }
      })
    })
  }
  bulkCreate(data): Promise<any> {
    const entries = this.formatDataForBulkCreate(data);
    return new Promise((resolve, reject) => {
          this.pdb.bulkDocs(entries).then(success => {
            // success.ok ? resolve(success) : reject()
            resolve(success);
          }).catch(error => {
            reject()
          })
    })
  }
  formatDataForBulkCreate(data) {
    for (const item of data) {
      delete item.__v
    }
    return data
  }
  // update(): Promise<any> {
  //   return new Promise((resolve, reject) => {
  //   })
  // }
  // delete() : Promise<any> {
  //   return new Promise((resolve, reject) => {
  //   })
  // }
  query(selector: any, limit: number = 20): Promise<any> {
    return new Promise((resolve, reject) => {
      this.createDb().then(isInitialized => {
        if(isInitialized) {
          this.pdb.find({
            selector: selector,
            limit: limit
          }).then(success => {
            console.log(success, 'success of query')
            resolve(success);
          }).catch(error => {
            reject(error)
          })
        }
      })
    })
  }
  customQuery(query) {
    return new Promise((resolve, reject) => {
      this.createDb().then(isInitialized => {
        if(isInitialized) {
          this.pdb.find(query).then(success => {
            console.log(success, 'success of query')
            resolve(success);
          }).catch(error => {
            reject(error)
          })
        }
      })
    })
  }
  dropDb(): Promise<any> {
    return new Promise((resolve, reject) => {
      this.createDb().then(isInitialized => {
        if(isInitialized) {
          this.pdb.destroy().then(success => {
            success.ok ? resolve(success) : reject()
          })
        }
      })
    })
  }
  getById(id): Promise<any> {
    return new Promise((resolve, reject) => {
      this.createDb().then(isInitialized => {
        if(isInitialized) {
          this.pdb.get(id).then(success => {
            resolve(success);
          }).catch(error => {
            reject(error)
          })
        }
      })
    })
  }
  getAllDocs(): Promise<any> {
    return new Promise((resolve, reject) => {
      this.createDb().then(isInitialized => {
        if(isInitialized) {
          this.pdb.allDocs({ include_docs: true })
        .then(docs => {
          console.log(docs,"docs rrr");
          resolve(docs);
        }).catch(error => {
          reject(error);
        })
        }
      })
    })
  }
}