import { Client } from 'cozy-client' import { Account, Konnector, Trigger } from 'doctypes' import triggersMutations from 'cozy-harvest-lib/dist/connections/triggers' import { DateTime } from 'luxon' export interface TriggerAttributes { type: string arguments: string worker: string message: { account: string konnector: string } } export class TriggerService { private _trigger: Trigger private _triggerAttributes?: TriggerAttributes constructor( private _client: Client, private _account: Account, private _konnector: Konnector ) { this._trigger = { _id: '', type: '', worker: '', arguments: '', message: { account: '', konnector: '', }, } this._client = _client this._account = _account this._konnector = _konnector } get trigger(): Trigger { return this._trigger } createTriggerAttributes = () => { if (!(this._account._id && this._konnector.slug)) { throw new Error( 'TriggersServices : createTriggerAttribute - account _id or konnector slug not found' ) } const triggerAttributes: TriggerAttributes = { type: '@cron', arguments: '0 47 0 * * *', worker: 'konnector', message: { account: this._account._id, konnector: this._konnector.slug, }, } return triggerAttributes } createTrigger = async () => { this._triggerAttributes = this.createTriggerAttributes() if (!(this._triggerAttributes && this._client)) { throw new Error( 'TriggersServices : createTrigger - _triggerAttributes or _client not found' ) } this._trigger = await triggersMutations(this._client).createTrigger( this._triggerAttributes ) return this._trigger } setTrigger = (trigger: Trigger) => { this._trigger = trigger } launchTrigger = async () => { if (!this._trigger) { throw new Error('TriggersServices : createTrigger - trigger not found') } console.log( '%c Launched Trigger is : ' + this._trigger._id, 'background: #222; color: white' ) const job = await triggersMutations(this._client).launchTrigger( this._trigger ) return job } static fetchKonnectorAccountFromTrigger(trigger: any) { if (trigger == null || trigger.message.account == null) return '' return trigger.message } static fetchStateFromTrigger(trigger: any) { if (trigger == null || trigger.current_state == null) return '' const { current_state: state } = trigger return state } static fetchDateFromTrigger(trigger: any) { if (trigger == null || trigger.current_state == null) return '' return DateTime.fromISO( trigger.current_state.last_execution ).toLocaleString(DateTime.DATETIME_MED) } static async fetchTriggerFromAccount(client: Client, account: Account) { if (account == null) return null const query = client .find('io.cozy.triggers') .where({ 'message.account': account._id }) .sortBy([{ 'cozyMetadata.updatedAt': 'desc' }]) .limitBy(1) const result = await client.query(query) return result.data[0] ? result.data[0] : null } static async fetchTriggerState(client: Client, trigger: Trigger) { if (trigger == null) return null const triggerState = await client .getStackClient() .fetchJSON('GET', `/jobs/triggers/${trigger._id}`) return triggerState.data.attributes.current_state ? triggerState.data.attributes.current_state : null } }