2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  paginationToSql  from  './models/utils/paginationToSql' ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const  {  Database  }  =  require ( './database.js' ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const  uuid  =  require ( './uuid' ) . default ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const  time  =  require ( './time' ) . default ;  
						 
					
						
							
								
									
										
										
										
											2018-03-09 20:59:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  Mutex  =  require ( 'async-mutex' ) . Mutex ;  
						 
					
						
							
								
									
										
										
										
											2017-05-10 19:51:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// New code should make use of this enum
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								export  enum  ModelType  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Note  =  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Folder  =  2 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Setting  =  3 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Resource  =  4 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Tag  =  5 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									NoteTag  =  6 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Search  =  7 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Alarm  =  8 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									MasterKey  =  9 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ItemChange  =  10 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									NoteResource  =  11 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ResourceLocalState  =  12 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Revision  =  13 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Migration  =  14 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									SmartFilter  =  15 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Command  =  16 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-07 23:20:34 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								class  BaseModel  {  
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// TODO: This ancient part of Joplin about model types is a bit of a
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// mess and should be refactored properly.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  static  typeEnum_ :any [ ]  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										[ 'TYPE_NOTE' ,  ModelType . Note ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										[ 'TYPE_FOLDER' ,  ModelType . Folder ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										[ 'TYPE_SETTING' ,  ModelType . Setting ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										[ 'TYPE_RESOURCE' ,  ModelType . Resource ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										[ 'TYPE_TAG' ,  ModelType . Tag ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										[ 'TYPE_NOTE_TAG' ,  ModelType . NoteTag ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										[ 'TYPE_SEARCH' ,  ModelType . Search ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										[ 'TYPE_ALARM' ,  ModelType . Alarm ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										[ 'TYPE_MASTER_KEY' ,  ModelType . MasterKey ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										[ 'TYPE_ITEM_CHANGE' ,  ModelType . ItemChange ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										[ 'TYPE_NOTE_RESOURCE' ,  ModelType . NoteResource ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										[ 'TYPE_RESOURCE_LOCAL_STATE' ,  ModelType . ResourceLocalState ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										[ 'TYPE_REVISION' ,  ModelType . Revision ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										[ 'TYPE_MIGRATION' ,  ModelType . Migration ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										[ 'TYPE_SMART_FILTER' ,  ModelType . SmartFilter ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										[ 'TYPE_COMMAND' ,  ModelType . Command ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  static  TYPE_NOTE  =   ModelType . Note ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  static  TYPE_FOLDER  =   ModelType . Folder ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  static  TYPE_SETTING  =   ModelType . Setting ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  static  TYPE_RESOURCE  =   ModelType . Resource ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  static  TYPE_TAG  =   ModelType . Tag ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  static  TYPE_NOTE_TAG  =   ModelType . NoteTag ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  static  TYPE_SEARCH  =   ModelType . Search ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  static  TYPE_ALARM  =   ModelType . Alarm ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  static  TYPE_MASTER_KEY  =   ModelType . MasterKey ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  static  TYPE_ITEM_CHANGE  =   ModelType . ItemChange ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  static  TYPE_NOTE_RESOURCE  =   ModelType . NoteResource ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  static  TYPE_RESOURCE_LOCAL_STATE  =   ModelType . ResourceLocalState ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  static  TYPE_REVISION  =   ModelType . Revision ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  static  TYPE_MIGRATION  =   ModelType . Migration ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  static  TYPE_SMART_FILTER  =   ModelType . SmartFilter ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  static  TYPE_COMMAND  =   ModelType . Command ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									protected  static  dispatch :Function  =  function ( )  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									private  static  saveMutexes_ :any  =  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									private  static  db_ :any ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									static  modelType ( ) : ModelType  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-09 20:59:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										throw  new  Error ( 'Must be overriden' ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-03 21:38:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  tableName ( ) : string  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-09 20:59:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										throw  new  Error ( 'Must be overriden' ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-03 21:38:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  setDb ( db :any )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-16 13:30:54 +11:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										this . db_  =  db ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  addModelMd ( model :any ) : any  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-17 19:40:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! model )  return  model ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-29 15:43:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-06-17 19:40:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( Array . isArray ( model ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-13 23:46:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											const  output  =  [ ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-17 19:40:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											for  ( let  i  =  0 ;  i  <  model . length ;  i ++ )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												output . push ( this . addModelMd ( model [ i ] ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  output ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											model  =  Object . assign ( { } ,  model ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-03 20:50:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											model . type_  =  this . modelType ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-17 19:40:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  model ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-06-25 11:41:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  logger() { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  this . db ( ) . logger ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-12 19:54:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  useUuid() { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  byId ( items :any [ ] ,  id :string )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-15 19:10:00 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( let  i  =  0 ;  i  <  items . length ;  i ++ )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( items [ i ] . id  ==  id )  return  items [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  null ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  defaultValues ( fieldNames :string [ ] )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  output :any  =  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-02 22:27:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( const  n  of  fieldNames )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											output [ n ]  =  this . db ( ) . fieldDefaultValue ( this . tableName ( ) ,  n ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  output ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  modelIndexById ( items :any [ ] ,  id :string )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-01-25 19:59:36 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( let  i  =  0 ;  i  <  items . length ;  i ++ )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( items [ i ] . id  ==  id )  return  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  modelsByIds ( items :any [ ] ,  ids :string [ ] )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-01-26 15:33:45 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  output  =  [ ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( let  i  =  0 ;  i  <  items . length ;  i ++ )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ids . indexOf ( items [ i ] . id )  >=  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												output . push ( items [ i ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  output ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-09 09:53:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Prefer the use of this function to compare IDs as it handles the case where
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// one ID is null and the other is "", in which case they are actually considered to be the same.
 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  idsEqual ( id1 :string ,  id2 :string )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-09 09:53:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! id1  &&  ! id2 )  return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! id1  &&  ! ! id2 )  return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! ! id1  &&  ! id2 )  return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  id1  ===  id2 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  modelTypeToName ( type : number )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-02-27 20:51:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( let  i  =  0 ;  i  <  BaseModel . typeEnum_ . length ;  i ++ )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											const  e  =  BaseModel . typeEnum_ [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( e [ 1 ]  ===  type )  return  e [ 0 ] . substr ( 5 ) . toLowerCase ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-19 22:51:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										throw  new  Error ( ` Unknown model type:  ${ type } ` ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-02-27 20:51:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  modelNameToType ( name :string )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-20 02:19:57 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( let  i  =  0 ;  i  <  BaseModel . typeEnum_ . length ;  i ++ )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											const  e  =  BaseModel . typeEnum_ [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											const  eName  =  e [ 0 ] . substr ( 5 ) . toLowerCase ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( eName  ===  name )  return  e [ 1 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										throw  new  Error ( ` Unknown model name:  ${ name } ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  hasField ( name :string )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-13 23:46:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  fields  =  this . fieldNames ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-19 19:32:49 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  fields . indexOf ( name )  >=  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  fieldNames ( withPrefix :boolean  =  false )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-13 23:46:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  output  =  this . db ( ) . tableFieldNames ( this . tableName ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-16 13:53:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! withPrefix )  return  output ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-19 20:15:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-13 23:46:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  p  =  withPrefix  ===  true  ?  this . tableName ( )  :  withPrefix ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  temp  =  [ ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-16 13:53:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( let  i  =  0 ;  i  <  output . length ;  i ++ )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-19 22:51:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											temp . push ( ` ${ p } . ${ output [ i ] } ` ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-16 13:53:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-19 20:15:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-07-16 13:53:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  temp ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-18 19:58:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  fieldType ( name :string ,  defaultValue :any  =  null )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-13 23:46:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  fields  =  this . fields ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-15 19:18:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( let  i  =  0 ;  i  <  fields . length ;  i ++ )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( fields [ i ] . name  ==  name )  return  fields [ i ] . type ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-04 22:58:42 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( defaultValue  !==  null )  return  defaultValue ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-19 22:51:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										throw  new  Error ( ` Unknown field:  ${ name } ` ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-15 19:18:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-20 00:16:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  fields() { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  this . db ( ) . tableFields ( this . tableName ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  removeUnknownFields ( model :any )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  newModel :any  =  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-13 23:46:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( const  n  in  model )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-31 00:35:57 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! model . hasOwnProperty ( n ) )  continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! this . hasField ( n )  &&  n  !==  'type_' )  continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											newModel [ n ]  =  model [ n ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  newModel ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-20 00:16:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  new ( )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-13 23:46:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  fields  =  this . fields ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  output :any  =  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-20 00:16:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( let  i  =  0 ;  i  <  fields . length ;  i ++ )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-13 23:46:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											const  f  =  fields [ i ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-20 00:16:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											output [ f . name ]  =  f . default ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  output ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  modOptions ( options :any )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-18 22:31:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! options )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											options  =  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											options  =  Object . assign ( { } ,  options ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-09 20:59:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! ( 'isNew'  in  options ) )  options . isNew  =  'auto' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! ( 'autoTimestamp'  in  options ) )  options . autoTimestamp  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-24 00:45:15 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! ( 'userSideValidation'  in  options ) )  options . userSideValidation  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-18 22:31:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  options ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  count ( options :any  =  null )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-20 20:45:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! options )  options  =  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-19 22:51:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										let  sql  =  ` SELECT count(*) as total FROM  \` ${ this . tableName ( ) } \` ` ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( options . where )  sql  +=  `  WHERE  ${ options . where } ` ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-29 15:43:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  this . db ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											. selectOne ( sql ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											. then ( ( r :any )  = >  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-29 15:43:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												return  r  ?  r [ 'total' ]  :  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-24 18:40:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  load ( id :string ,  options :any  =  null )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-07 09:57:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  this . loadByField ( 'id' ,  id ,  options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-11 22:11:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  shortId ( id :string )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-21 19:56:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  id . substr ( 0 ,  5 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-17 18:46:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  loadByPartialId ( partialId :string )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-19 22:51:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  this . modelSelectAll ( ` SELECT * FROM  \` ${ this . tableName ( ) } \`  WHERE  \` id \`  LIKE ? ` ,  [ ` ${ partialId } % ` ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-10 20:47:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  applySqlOptions ( options :any ,  sql :string ,  params :any [ ]  =  null )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-25 10:00:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! options )  options  =  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-07-26 19:36:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( options . order  &&  options . order . length )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// const items = [];
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// for (let i = 0; i < options.order.length; i++) {
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// 	const o = options.order[i];
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// 	let item = `\`${o.by}\``;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// 	if (options.caseInsensitive === true) item += ' COLLATE NOCASE';
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// 	if (o.dir) item += ` ${o.dir}`;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// 	items.push(item);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// }
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											sql  +=  `  ORDER BY  ${ paginationToSql ( options ) } ` ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-25 10:00:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-29 15:43:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-19 22:51:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( options . limit )  sql  +=  `  LIMIT  ${ options . limit } ` ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-25 10:00:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  {  sql : sql ,  params : params  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  async  allIds ( options :any  =  null )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-13 23:46:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  q  =  this . applySqlOptions ( options ,  ` SELECT id FROM  \` ${ this . tableName ( ) } \` ` ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-20 16:29:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  rows  =  await  this . db ( ) . selectAll ( q . sql ,  q . params ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  rows . map ( ( r :any )  = >  r . id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-20 16:29:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  async  all ( options :any  =  null )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-26 15:46:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! options )  options  =  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! options . fields )  options . fields  =  '*' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-01-20 02:19:57 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										let  sql  =  ` SELECT  ${ this . db ( ) . escapeFields ( options . fields ) }  FROM  \` ${ this . tableName ( ) } \` ` ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										let  params :any [ ]  =  [ ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-20 02:19:57 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( options . where )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											sql  +=  `  WHERE  ${ options . where } ` ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( options . whereParams )  params  =  params . concat ( options . whereParams ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-13 23:46:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  q  =  this . applySqlOptions ( options ,  sql ,  params ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-20 02:19:57 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  this . modelSelectAll ( q . sql ,  q . params ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-25 10:00:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  async  byIds ( ids :string [ ] ,  options :any  =  null )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-08 17:14:17 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! ids . length )  return  [ ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! options )  options  =  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! options . fields )  options . fields  =  '*' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-19 22:51:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										let  sql  =  ` SELECT  ${ this . db ( ) . escapeFields ( options . fields ) }  FROM  \` ${ this . tableName ( ) } \` ` ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sql  +=  `  WHERE id IN (" ${ ids . join ( '","' ) } ") ` ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-13 23:46:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  q  =  this . applySqlOptions ( options ,  sql ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-08 17:14:17 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  this . modelSelectAll ( q . sql ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  async  search ( options :any  =  null )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-03 18:58:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! options )  options  =  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-09 20:59:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! options . fields )  options . fields  =  '*' ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-03 18:58:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-13 23:46:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  conditions  =  options . conditions  ?  options . conditions . slice ( 0 )  :  [ ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  params  =  options . conditionsParams  ?  options . conditionsParams . slice ( 0 )  :  [ ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-03 18:58:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( options . titlePattern )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-13 23:46:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											const  pattern  =  options . titlePattern . replace ( /\*/g ,  '%' ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-09 20:59:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											conditions . push ( 'title LIKE ?' ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-03 18:58:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											params . push ( pattern ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-03-09 20:59:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( 'limit'  in  options  &&  options . limit  <=  0 )  return  [ ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-20 10:16:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-19 22:51:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										let  sql  =  ` SELECT  ${ this . db ( ) . escapeFields ( options . fields ) }  FROM  \` ${ this . tableName ( ) } \` ` ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( conditions . length )  sql  +=  `  WHERE  ${ conditions . join ( ' AND ' ) } ` ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-03 18:58:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-13 23:46:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  query  =  this . applySqlOptions ( options ,  sql ,  params ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-03 18:58:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  this . modelSelectAll ( query . sql ,  query . params ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  modelSelectOne ( sql :string ,  params :any [ ]  =  null )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-17 19:12:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( params  ===  null )  params  =  [ ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-29 15:43:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  this . db ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											. selectOne ( sql ,  params ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											. then ( ( model :any )  = >  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-29 15:43:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												return  this . filter ( this . addModelMd ( model ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-17 19:12:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  modelSelectAll ( sql :string ,  params :any [ ]  =  null )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-17 19:12:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( params  ===  null )  params  =  [ ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-29 15:43:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  this . db ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											. selectAll ( sql ,  params ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											. then ( ( models :any [ ] )  = >  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-29 15:43:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												return  this . filterArray ( this . addModelMd ( models ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-17 19:12:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  loadByField ( fieldName :string ,  fieldValue :any ,  options :any  =  null )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-08 21:04:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! options )  options  =  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-09 20:59:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! ( 'caseInsensitive'  in  options ) )  options . caseInsensitive  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-07 09:57:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! options . fields )  options . fields  =  '*' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										let  sql  =  ` SELECT  ${ this . db ( ) . escapeFields ( options . fields ) }  FROM  \` ${ this . tableName ( ) } \`  WHERE  \` ${ fieldName } \`  = ? ` ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-09 20:59:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( options . caseInsensitive )  sql  +=  ' COLLATE NOCASE' ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-08 21:04:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  this . modelSelectOne ( sql ,  [ fieldValue ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-19 19:12:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  loadByFields ( fields :string [ ] ,  options :any  =  null )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-28 18:00:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! options )  options  =  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! ( 'caseInsensitive'  in  options ) )  options . caseInsensitive  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! options . fields )  options . fields  =  '*' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  whereSql  =  [ ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  params  =  [ ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( const  fieldName  in  fields )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											whereSql . push ( ` \` ${ fieldName } \`  = ? ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											params . push ( fields [ fieldName ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										let  sql  =  ` SELECT  ${ this . db ( ) . escapeFields ( options . fields ) }  FROM  \` ${ this . tableName ( ) } \`  WHERE  ${ whereSql . join ( ' AND ' ) } ` ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( options . caseInsensitive )  sql  +=  ' COLLATE NOCASE' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  this . modelSelectOne ( sql ,  params ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  loadByTitle ( fieldValue :any )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-19 22:51:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  this . modelSelectOne ( ` SELECT * FROM  \` ${ this . tableName ( ) } \`  WHERE  \` title \`  = ? ` ,  [ fieldValue ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-02 16:46:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  diffObjects ( oldModel :any ,  newModel :any )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  output :any  =  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-14 20:21:36 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  fields  =  this . diffObjectsFields ( oldModel ,  newModel ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( let  i  =  0 ;  i  <  fields . length ;  i ++ )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											output [ fields [ i ] ]  =  newModel [ fields [ i ] ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-09 20:59:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( 'type_'  in  newModel )  output . type_  =  newModel . type_ ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-14 20:21:36 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  output ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  diffObjectsFields ( oldModel :any ,  newModel :any )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-13 23:46:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  output  =  [ ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( const  n  in  newModel )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-03 23:06:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! newModel . hasOwnProperty ( n ) )  continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-09 20:59:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( n  ==  'type_' )  continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-23 20:36:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! ( n  in  oldModel )  ||  newModel [ n ]  !==  oldModel [ n ] )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-14 20:21:36 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												output . push ( n ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-23 20:36:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  output ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  modelsAreSame ( oldModel :any ,  newModel :any )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-03 23:06:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  diff  =  this . diffObjects ( oldModel ,  newModel ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										delete  diff . type_ ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ! Object . getOwnPropertyNames ( diff ) . length ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  saveMutex ( modelOrId :any )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-02-07 19:02:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  noLockMutex  =  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											acquire : function ( ) : any  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-29 15:43:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												return  null ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2018-02-07 19:02:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! modelOrId )  return  noLockMutex ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-13 23:46:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  modelId  =  typeof  modelOrId  ===  'string'  ?  modelOrId  : modelOrId.id ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-02-07 19:02:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! modelId )  return  noLockMutex ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										let  mutex  =  BaseModel . saveMutexes_ [ modelId ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( mutex )  return  mutex ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										mutex  =  new  Mutex ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										BaseModel . saveMutexes_ [ modelId ]  =  mutex ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  mutex ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  releaseSaveMutex ( modelOrId :any ,  release :Function )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-02-07 19:02:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! release )  return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! modelOrId )  return  release ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-13 23:46:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  modelId  =  typeof  modelOrId  ===  'string'  ?  modelOrId  : modelOrId.id ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-02-07 19:02:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! modelId )  return  release ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-13 23:46:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  mutex  =  BaseModel . saveMutexes_ [ modelId ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-02-07 19:02:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! mutex )  return  release ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										delete  BaseModel . saveMutexes_ [ modelId ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										release ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  saveQuery ( o :any ,  options :any )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										let  temp :any  =  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-13 23:46:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  fieldNames  =  this . fieldNames ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-20 00:16:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( let  i  =  0 ;  i  <  fieldNames . length ;  i ++ )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-13 23:46:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											const  n  =  fieldNames [ i ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-20 00:16:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( n  in  o )  temp [ n ]  =  o [ n ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-14 17:01:22 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Remove fields that are not in the `fields` list, if provided.
 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-16 19:37:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Note that things like update_time, user_updated_time will still
 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-14 17:01:22 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// be part of the final list of fields if autoTimestamp is on.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// id also will stay.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! options . isNew  &&  options . fields )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											const  filtered :any  =  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-13 23:46:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											for  ( const  k  in  temp )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-14 17:01:22 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( ! temp . hasOwnProperty ( k ) )  continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-09 20:59:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( k  !==  'id'  &&  options . fields . indexOf ( k )  <  0 )  continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-14 17:01:22 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												filtered [ k ]  =  temp [ k ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											temp  =  filtered ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-20 00:16:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										o  =  temp ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-01-14 17:11:44 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										let  modelId  =  temp . id ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										let  query :any  =  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-12 19:54:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-20 22:11:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  timeNow  =  time . unixMs ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-03-09 20:59:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( options . autoTimestamp  &&  this . hasField ( 'updated_time' ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-20 22:11:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											o . updated_time  =  timeNow ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-12-04 22:58:42 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// The purpose of user_updated_time is to allow the user to manually set the time of a note (in which case
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// options.autoTimestamp will be `false`). However note that if the item is later changed, this timestamp
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// will be set again to the current time.
 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-16 19:37:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										//
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// The technique to modify user_updated_time while keeping updated_time current (so that sync can happen) is to
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// manually set updated_time when saving and to set autoTimestamp to false, for example:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Note.save({ id: "...", updated_time: Date.now(), user_updated_time: 1436342618000 }, { autoTimestamp: false })
 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-09 20:59:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( options . autoTimestamp  &&  this . hasField ( 'user_updated_time' ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-20 22:11:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											o . user_updated_time  =  timeNow ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-19 19:32:49 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-06-18 00:49:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( options . isNew )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-19 19:12:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( this . useUuid ( )  &&  ! o . id )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-25 00:19:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												modelId  =  uuid . create ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												o . id  =  modelId ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-18 19:58:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-19 19:32:49 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-03-09 20:59:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! o . created_time  &&  this . hasField ( 'created_time' ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-20 22:11:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												o . created_time  =  timeNow ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-03-09 20:59:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! o . user_created_time  &&  this . hasField ( 'user_created_time' ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-22 18:12:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												o . user_created_time  =  o . created_time  ?  o.created_time  : timeNow ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-03-09 20:59:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! o . user_updated_time  &&  this . hasField ( 'user_updated_time' ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-22 18:12:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												o . user_updated_time  =  o . updated_time  ?  o.updated_time  : timeNow ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-19 19:32:49 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-12 19:54:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											query  =  Database . insertQuery ( this . tableName ( ) ,  o ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-11 20:14:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-13 23:46:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											const  where  =  {  id : o.id  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											const  temp  =  Object . assign ( { } ,  o ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-12 19:54:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											delete  temp . id ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-14 20:21:36 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-12 19:54:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											query  =  Database . updateQuery ( this . tableName ( ) ,  temp ,  where ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-11 20:14:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-12 19:54:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-06-25 00:19:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										query . id  =  modelId ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-16 17:06:05 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										query . modObject  =  o ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-18 19:58:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  query ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  userSideValidation ( o :any )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-05 00:07:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( o . id  &&  ! o . id . match ( /^[a-f0-9]{32}$/ ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-24 00:45:15 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											throw  new  Error ( 'Validation error: ID must a 32-characters lowercase hexadecimal string' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  timestamps  =  [ 'user_updated_time' ,  'user_created_time' ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( const  k  of  timestamps )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ( k  in  o )  &&  ( typeof  o [ k ]  !==  'number'  ||  isNaN ( o [ k ] )  ||  o [ k ]  <  0 ) )  throw  new  Error ( 'Validation error: user_updated_time and user_created_time must be numbers greater than 0' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  async  save ( o :any ,  options :any  =  null )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-02-07 19:02:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// When saving, there's a mutex per model ID. This is because the model returned from this function
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// is basically its input `o` (instead of being read from the database, for performance reasons).
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// This works well in general except if that model is saved simultaneously in two places. In that
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// case, the output won't be up-to-date and would cause for example display issues with out-dated
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// notes being displayed. This was an issue when notes were being synchronised while being decrypted
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// at the same time.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  mutexRelease  =  await  this . saveMutex ( o ) . acquire ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-18 22:31:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										options  =  this . modOptions ( options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-29 21:52:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										options . isNew  =  this . isNew ( o ,  options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-18 19:58:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-12-04 22:58:42 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Diff saving is an optimisation which takes a new version of the item and an old one,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// do a diff and save only this diff. IMPORTANT: When using this make sure that both
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// models have been normalised using ItemClass.filter()
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  isDiffSaving  =  options  &&  options . oldItem  &&  ! options . isNew ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( isDiffSaving )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											const  newObject  =  BaseModel . diffObjects ( options . oldItem ,  o ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											newObject . type_  =  o . type_ ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											newObject . id  =  o . id ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											o  =  newObject ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-06-24 18:40:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										o  =  this . filter ( o ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-07-24 00:45:15 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( options . userSideValidation )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											this . userSideValidation ( o ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-06-11 22:11:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										let  queries  =  [ ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-13 23:46:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  saveQuery  =  this . saveQuery ( o ,  options ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  modelId  =  saveQuery . id ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-18 19:58:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-06-11 22:11:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										queries . push ( saveQuery ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-07-16 13:53:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( options . nextQueries  &&  options . nextQueries . length )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											queries  =  queries . concat ( options . nextQueries ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-02-07 19:02:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										let  output  =  null ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										try  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											await  this . db ( ) . transactionExecBatch ( queries ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-18 19:58:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											o  =  Object . assign ( { } ,  o ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-27 22:50:46 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( modelId )  o . id  =  modelId ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-09 20:59:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( 'updated_time'  in  saveQuery . modObject )  o . updated_time  =  saveQuery . modObject . updated_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( 'created_time'  in  saveQuery . modObject )  o . created_time  =  saveQuery . modObject . created_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( 'user_updated_time'  in  saveQuery . modObject )  o . user_updated_time  =  saveQuery . modObject . user_updated_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( 'user_created_time'  in  saveQuery . modObject )  o . user_created_time  =  saveQuery . modObject . user_created_time ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-17 19:40:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											o  =  this . addModelMd ( o ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-04 22:58:42 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( isDiffSaving )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-13 23:46:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												for  ( const  n  in  options . oldItem )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-04 22:58:42 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( ! options . oldItem . hasOwnProperty ( n ) )  continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( n  in  o )  continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													o [ n ]  =  options . oldItem [ n ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-02-07 19:02:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											output  =  this . filter ( o ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-16 20:17:52 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  finally  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											this . releaseSaveMutex ( o ,  mutexRelease ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-02-07 19:02:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  output ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-10 19:51:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  isNew ( object : any ,  options :any )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-29 15:43:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( options  &&  'isNew'  in  options )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-29 21:52:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// options.isNew can be "auto" too
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( options . isNew  ===  true )  return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( options . isNew  ===  false )  return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ! object . id ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  filterArray ( models :any [ ] )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-13 23:46:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  output  =  [ ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-24 18:40:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( let  i  =  0 ;  i  <  models . length ;  i ++ )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											output . push ( this . filter ( models [ i ] ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  output ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  filter ( model :any )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-27 00:20:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! model )  return  model ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-13 23:46:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  output  =  Object . assign ( { } ,  model ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( const  n  in  output )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-27 00:20:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! output . hasOwnProperty ( n ) )  continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-04 22:58:42 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-06-27 00:20:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// The SQLite database doesn't have booleans so cast everything to int
 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-04 22:58:42 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( output [ n ]  ===  true )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												output [ n ]  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  if  ( output [ n ]  ===  false )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-29 15:43:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												output [ n ]  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-04 22:58:42 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												const  t  =  this . fieldType ( n ,  Database . TYPE_UNKNOWN ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( t  ===  Database . TYPE_INT )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													output [ n ]  =  ! n  ?  0  : parseInt ( output [ n ] ,  10 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-27 00:20:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-29 15:43:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-06-27 00:20:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  output ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-24 18:40:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  delete ( id :string )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-09 20:59:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! id )  throw  new  Error ( 'Cannot delete object without an ID' ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-19 22:51:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  this . db ( ) . exec ( ` DELETE FROM  ${ this . tableName ( ) }  WHERE id = ? ` ,  [ id ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-16 20:25:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  batchDelete ( ids :string [ ] ,  options :any  =  null )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-28 00:22:38 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! ids . length )  return ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-11 18:17:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										options  =  this . modOptions ( options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-13 00:45:08 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  idFieldName  =  options . idFieldName  ?  options . idFieldName  :  'id' ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-19 22:51:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  sql  =  ` DELETE FROM  ${ this . tableName ( ) }  WHERE  ${ idFieldName }  IN (" ${ ids . join ( '","' ) } ") ` ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-13 00:45:08 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  this . db ( ) . exec ( sql ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-29 15:43:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-11 18:17:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-10 19:51:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  db() { 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-09 20:59:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! this . db_ )  throw  new  Error ( 'Accessing database before it has been initialised' ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-29 15:43:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  this . db_ ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-10 19:51:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-07-25 19:36:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  isReady() { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ! ! this . db_ ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-07 23:20:34 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-02-27 20:51:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								for  ( let  i  =  0 ;  i  <  BaseModel . typeEnum_ . length ;  i ++ )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  e  =  BaseModel . typeEnum_ [ i ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									( BaseModel  as  any ) [ e [ 0 ] ]  =  e [ 1 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-02-27 20:51:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 16:58:23 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								export  default  BaseModel ;