2017-12-14 20:12:14 +02:00
const BaseModel = require ( 'lib/BaseModel.js' ) ;
const Note = require ( 'lib/models/Note.js' ) ;
2017-11-28 00:50:46 +02:00
2020-10-09 19:35:46 +02:00
export interface Notification {
id : string ,
noteId : string ,
date : Date ,
title : string ,
body? : string ,
}
export default class Alarm extends BaseModel {
2017-11-28 00:50:46 +02:00
static tableName() {
return 'alarms' ;
}
static modelType() {
return BaseModel . TYPE_ALARM ;
}
2020-10-09 19:35:46 +02:00
static byNoteId ( noteId :string ) {
2017-11-28 00:50:46 +02:00
return this . modelSelectOne ( 'SELECT * FROM alarms WHERE note_id = ?' , [ noteId ] ) ;
}
2017-11-28 02:22:38 +02:00
static async deleteExpiredAlarms() {
return this . db ( ) . exec ( 'DELETE FROM alarms WHERE trigger_time <= ?' , [ Date . now ( ) ] ) ;
}
2017-11-28 00:50:46 +02:00
2017-11-28 02:22:38 +02:00
static async alarmIdsWithoutNotes() {
2017-11-28 00:50:46 +02:00
// https://stackoverflow.com/a/4967229/561309
2017-11-28 02:22:38 +02:00
const alarms = await this . db ( ) . selectAll ( 'SELECT alarms.id FROM alarms LEFT JOIN notes ON alarms.note_id = notes.id WHERE notes.id IS NULL' ) ;
2020-10-09 19:35:46 +02:00
return alarms . map ( ( a :any ) = > {
2019-07-29 15:43:53 +02:00
return a . id ;
} ) ;
2017-11-28 00:50:46 +02:00
}
2020-10-09 19:35:46 +02:00
static async makeNotification ( alarm :any , note :any = null ) : Promise < Notification > {
2018-12-08 01:42:29 +02:00
if ( ! note ) {
note = await Note . load ( alarm . note_id ) ;
} else if ( ! note . todo_due ) {
this . logger ( ) . warn ( 'Trying to create notification for note with todo_due property - reloading note object in case we are dealing with a partial note' ) ;
note = await Note . load ( alarm . note_id ) ;
this . logger ( ) . warn ( 'Reloaded note:' , note ) ;
}
2017-11-28 22:17:34 +02:00
2020-10-09 19:35:46 +02:00
const output :Notification = {
2017-11-28 22:17:34 +02:00
id : alarm.id ,
2020-10-09 19:35:46 +02:00
noteId : alarm.note_id ,
2017-11-28 22:17:34 +02:00
date : new Date ( note . todo_due ) ,
2019-07-29 15:43:53 +02:00
title : note.title.substr ( 0 , 128 ) ,
2017-11-28 22:17:34 +02:00
} ;
2019-07-29 15:43:53 +02:00
if ( note . body ) output . body = note . body . substr ( 0 , 512 ) ;
2017-11-28 22:17:34 +02:00
2019-07-29 15:43:53 +02:00
return output ;
2017-11-28 22:17:34 +02:00
}
2017-11-28 22:31:14 +02:00
static async allDue() {
return this . modelSelectAll ( 'SELECT * FROM alarms WHERE trigger_time >= ?' , [ Date . now ( ) ] ) ;
}
2017-11-28 00:50:46 +02:00
}