import AbstractService from './abstractService' import TaskModel from '@/models/task' import type {ITask} from '@/modelTypes/ITask' import AttachmentService from './attachment' import LabelService from './label' import {colorFromHex} from '@/helpers/color/colorFromHex' import {SECONDS_A_DAY, SECONDS_A_HOUR, SECONDS_A_WEEK} from '@/constants/date' const parseDate = date => { if (date) { return new Date(date).toISOString() } return null } export default class TaskService extends AbstractService { constructor() { super({ create: '/projects/{projectId}/tasks', getAll: '/tasks/all', get: '/tasks/{id}', update: '/tasks/{id}', delete: '/tasks/{id}', }) } modelFactory(data) { return new TaskModel(data) } beforeUpdate(model) { return this.processModel(model) } beforeCreate(model) { return this.processModel(model) } processModel(updatedModel) { const model = { ...updatedModel } model.title = model.title?.trim() // Ensure that projectId is an int model.projectId = Number(model.projectId) // Convert dates into an iso string model.dueDate = parseDate(model.dueDate) model.startDate = parseDate(model.startDate) model.endDate = parseDate(model.endDate) model.doneAt = parseDate(model.doneAt) model.created = new Date(model.created).toISOString() model.updated = new Date(model.updated).toISOString() model.reminderDates = null // remove all nulls, these would create empty reminders for (const index in model.reminders) { if (model.reminders[index] === null) { model.reminders.splice(index, 1) } } // Make normal timestamps from js dates if (model.reminders.length > 0) { model.reminders.forEach(r => { r.reminder = new Date(r.reminder).toISOString() }) } // Make the repeating amount to seconds let repeatAfterSeconds = 0 if (model.repeatAfter !== null && (model.repeatAfter.amount !== null || model.repeatAfter.amount !== 0)) { switch (model.repeatAfter.type) { case 'hours': repeatAfterSeconds = model.repeatAfter.amount * SECONDS_A_HOUR break case 'days': repeatAfterSeconds = model.repeatAfter.amount * SECONDS_A_DAY break case 'weeks': repeatAfterSeconds = model.repeatAfter.amount * SECONDS_A_WEEK break } } model.repeatAfter = repeatAfterSeconds model.hexColor = colorFromHex(model.hexColor) // Do the same for all related tasks Object.keys(model.relatedTasks).forEach(relationKind => { model.relatedTasks[relationKind] = model.relatedTasks[relationKind].map(t => { return this.processModel(t) }) }) // Process all attachments to preven parsing errors if (model.attachments.length > 0) { const attachmentService = new AttachmentService() model.attachments.map(a => { return attachmentService.processModel(a) }) } // Preprocess all labels if (model.labels.length > 0) { const labelService = new LabelService() model.labels = model.labels.map(l => labelService.processModel(l)) } return model as ITask } }