This repository has been archived on 2024-02-08. You can view files and clone it, but cannot push or open issues or pull requests.
frontend/src/services/task.ts
kolaente 7746d39161
Some checks failed
continuous-integration/drone/push Build is failing
fix(task): remove wrong repeat types
Repeating "monthly" or "yearly" was never what people expected, only 30 or 365 days which is not always correct. This change removes these settings since the repeating modes will be re-done anyway.

Related to #3585 (comment)
2023-09-06 15:41:48 +02:00

115 lines
3.0 KiB
TypeScript

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, SECONDS_A_MONTH, SECONDS_A_YEAR} from '@/constants/date'
const parseDate = date => {
if (date) {
return new Date(date).toISOString()
}
return null
}
export default class TaskService extends AbstractService<ITask> {
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
}
}