feat: improve store and model typing
This commit is contained in:
@ -2,9 +2,9 @@ import {AuthenticatedHTTPFactory} from '@/http-common'
|
||||
import type {Method} from 'axios'
|
||||
|
||||
import {objectToSnakeCase} from '@/helpers/case'
|
||||
import AbstractModel from '@/models/abstractModel'
|
||||
import AbstractModel, { type IAbstract } from '@/models/abstractModel'
|
||||
import type { Right } from '@/models/constants/rights'
|
||||
import type FileModel from '@/models/file'
|
||||
import type { IFile } from '@/models/file'
|
||||
|
||||
interface Paths {
|
||||
create : string
|
||||
@ -12,6 +12,7 @@ interface Paths {
|
||||
getAll : string
|
||||
update : string
|
||||
delete : string
|
||||
reset?: string
|
||||
}
|
||||
|
||||
function convertObject(o: Record<string, unknown>) {
|
||||
@ -39,7 +40,7 @@ function prepareParams(params: Record<string, unknown | unknown[]>) {
|
||||
return objectToSnakeCase(params)
|
||||
}
|
||||
|
||||
export default class AbstractService<Model extends AbstractModel = AbstractModel> {
|
||||
export default class AbstractService<Model extends IAbstract = IAbstract> {
|
||||
|
||||
/////////////////////////////
|
||||
// Initial variable definitions
|
||||
@ -269,7 +270,7 @@ export default class AbstractService<Model extends AbstractModel = AbstractModel
|
||||
* This is a more abstract implementation which only does a get request.
|
||||
* Services which need more flexibility can use this.
|
||||
*/
|
||||
async getM(url : string, model = new AbstractModel({}) as Model, params: Record<string, unknown> = {}) {
|
||||
async getM(url : string, model : Model = new AbstractModel({}), params: Record<string, unknown> = {}) {
|
||||
const cancel = this.setLoading()
|
||||
|
||||
model = this.beforeGet(model)
|
||||
@ -285,7 +286,7 @@ export default class AbstractService<Model extends AbstractModel = AbstractModel
|
||||
}
|
||||
}
|
||||
|
||||
async getBlobUrl(url : string, method = 'GET' as Method, data = {}) {
|
||||
async getBlobUrl(url : string, method : Method = 'GET', data = {}) {
|
||||
const response = await this.http({
|
||||
url,
|
||||
method,
|
||||
@ -302,7 +303,7 @@ export default class AbstractService<Model extends AbstractModel = AbstractModel
|
||||
* @param params Optional query parameters
|
||||
* @param page The page to get
|
||||
*/
|
||||
async getAll(model : Model = new AbstractModel({}) as Model, params = {}, page = 1) {
|
||||
async getAll(model : Model = new AbstractModel({}), params = {}, page = 1) {
|
||||
if (this.paths.getAll === '') {
|
||||
throw new Error('This model is not able to get data.')
|
||||
}
|
||||
@ -408,10 +409,10 @@ export default class AbstractService<Model extends AbstractModel = AbstractModel
|
||||
/**
|
||||
* Uploads a file to a url.
|
||||
* @param url
|
||||
* @param file {FileModel}
|
||||
* @param file {IFile}
|
||||
* @param fieldName The name of the field the file is uploaded to.
|
||||
*/
|
||||
uploadFile(url : string, file: FileModel, fieldName : string) {
|
||||
uploadFile(url : string, file: IFile, fieldName : string) {
|
||||
return this.uploadBlob(url, new Blob([file]), fieldName, file.name)
|
||||
}
|
||||
|
||||
|
@ -1,8 +1,8 @@
|
||||
import AbstractService from './abstractService'
|
||||
import AttachmentModel from '../models/attachment'
|
||||
import AttachmentModel, { type IAttachment } from '../models/attachment'
|
||||
import {formatISO} from 'date-fns'
|
||||
import {downloadBlob} from '@/helpers/downloadBlob'
|
||||
import type FileModel from '@/models/file'
|
||||
import type { IFile } from '@/models/file'
|
||||
|
||||
export default class AttachmentService extends AbstractService<AttachmentModel> {
|
||||
constructor() {
|
||||
@ -13,7 +13,7 @@ export default class AttachmentService extends AbstractService<AttachmentModel>
|
||||
})
|
||||
}
|
||||
|
||||
processModel(model: AttachmentModel) {
|
||||
processModel(model: IAttachment) {
|
||||
model.created = formatISO(new Date(model.created))
|
||||
return model
|
||||
}
|
||||
@ -34,11 +34,11 @@ export default class AttachmentService extends AbstractService<AttachmentModel>
|
||||
return data
|
||||
}
|
||||
|
||||
getBlobUrl(model: AttachmentModel) {
|
||||
getBlobUrl(model: IAttachment) {
|
||||
return AbstractService.prototype.getBlobUrl.call(this, '/tasks/' + model.taskId + '/attachments/' + model.id)
|
||||
}
|
||||
|
||||
async download(model: AttachmentModel) {
|
||||
async download(model: IAttachment) {
|
||||
const url = await this.getBlobUrl(model)
|
||||
return downloadBlob(url, model.file.name)
|
||||
}
|
||||
@ -48,7 +48,7 @@ export default class AttachmentService extends AbstractService<AttachmentModel>
|
||||
* @param files
|
||||
* @returns {Promise<any|never>}
|
||||
*/
|
||||
create(model: AttachmentModel, files: FileModel[]) {
|
||||
create(model: IAttachment, files: IFile[]) {
|
||||
const data = new FormData()
|
||||
for (let i = 0; i < files.length; i++) {
|
||||
// TODO: Validation of file size
|
||||
|
@ -1,7 +1,7 @@
|
||||
import AbstractService from './abstractService'
|
||||
import AvatarModel from '../models/avatar'
|
||||
import AvatarModel, { type IAvatar } from '../models/avatar'
|
||||
|
||||
export default class AvatarService extends AbstractService {
|
||||
export default class AvatarService extends AbstractService<IAvatar> {
|
||||
constructor() {
|
||||
super({
|
||||
get: '/user/settings/avatar',
|
||||
|
@ -1,8 +1,8 @@
|
||||
import AbstractService from './abstractService'
|
||||
import BackgroundImageModel from '../models/backgroundImage'
|
||||
import ListModel from '../models/list'
|
||||
import BackgroundImageModel, { type IBackgroundImage } from '../models/backgroundImage'
|
||||
import ListModel from '@/models/list'
|
||||
|
||||
export default class BackgroundUnsplashService extends AbstractService {
|
||||
export default class BackgroundUnsplashService extends AbstractService<IBackgroundImage> {
|
||||
constructor() {
|
||||
super({
|
||||
getAll: '/backgrounds/unsplash/search',
|
||||
|
@ -1,6 +1,6 @@
|
||||
import AbstractService from './abstractService'
|
||||
import ListModel from '../models/list'
|
||||
import type FileModel from '@/models/file'
|
||||
import ListModel, { type IList } from '../models/list'
|
||||
import type { IFile } from '@/models/file'
|
||||
|
||||
export default class BackgroundUploadService extends AbstractService {
|
||||
constructor() {
|
||||
@ -22,7 +22,7 @@ export default class BackgroundUploadService extends AbstractService {
|
||||
* @param file
|
||||
* @returns {Promise<any|never>}
|
||||
*/
|
||||
create(listId: ListModel['id'], file: FileModel) {
|
||||
create(listId: IList['id'], file: IFile) {
|
||||
return this.uploadFile(
|
||||
this.getReplacedRoute(this.paths.create, {listId}),
|
||||
file,
|
||||
|
@ -1,8 +1,8 @@
|
||||
import AbstractService from './abstractService'
|
||||
import BucketModel from '../models/bucket'
|
||||
import BucketModel, { type IBucket } from '../models/bucket'
|
||||
import TaskService from '@/services/task'
|
||||
|
||||
export default class BucketService extends AbstractService {
|
||||
export default class BucketService extends AbstractService<IBucket> {
|
||||
constructor() {
|
||||
super({
|
||||
getAll: '/lists/{listId}/buckets',
|
||||
|
@ -1,8 +1,8 @@
|
||||
import {formatISO} from 'date-fns'
|
||||
import CaldavTokenModel from '../models/caldavToken'
|
||||
import CaldavTokenModel, {type ICaldavToken} from '../models/caldavToken'
|
||||
import AbstractService from './abstractService'
|
||||
|
||||
export default class CaldavTokenService extends AbstractService {
|
||||
export default class CaldavTokenService extends AbstractService<ICaldavToken> {
|
||||
constructor() {
|
||||
super({
|
||||
getAll: '/user/settings/token/caldav',
|
||||
@ -11,7 +11,7 @@ export default class CaldavTokenService extends AbstractService {
|
||||
})
|
||||
}
|
||||
|
||||
processModel(model: Partial<CaldavTokenModel>) {
|
||||
processModel(model: Partial<ICaldavToken>) {
|
||||
return {
|
||||
...model,
|
||||
created: formatISO(new Date(model.created)),
|
||||
|
@ -1,9 +1,9 @@
|
||||
import AbstractService from './abstractService'
|
||||
import LabelModel from '../models/label'
|
||||
import LabelModel, { type ILabel } from '@/models/label'
|
||||
import {formatISO} from 'date-fns'
|
||||
import {colorFromHex} from '@/helpers/color/colorFromHex'
|
||||
|
||||
export default class LabelService extends AbstractService {
|
||||
export default class LabelService extends AbstractService<ILabel> {
|
||||
constructor() {
|
||||
super({
|
||||
create: '/labels',
|
||||
|
@ -1,10 +1,10 @@
|
||||
import AbstractService from './abstractService'
|
||||
import ListModel from '../models/list'
|
||||
import ListModel, { type IList } from '@/models/list'
|
||||
import TaskService from './task'
|
||||
import {formatISO} from 'date-fns'
|
||||
import {colorFromHex} from '@/helpers/color/colorFromHex'
|
||||
|
||||
export default class ListService extends AbstractService {
|
||||
export default class ListService extends AbstractService<IList> {
|
||||
constructor() {
|
||||
super({
|
||||
create: '/namespaces/{namespaceId}/lists',
|
||||
|
@ -1,9 +1,9 @@
|
||||
import AbstractService from './abstractService'
|
||||
import NamespaceModel from '../models/namespace'
|
||||
import NamespaceModel, { type INamespace } from '../models/namespace'
|
||||
import {formatISO} from 'date-fns'
|
||||
import {colorFromHex} from '@/helpers/color/colorFromHex'
|
||||
|
||||
export default class NamespaceService extends AbstractService {
|
||||
export default class NamespaceService extends AbstractService<INamespace> {
|
||||
constructor() {
|
||||
super({
|
||||
create: '/namespaces',
|
||||
|
@ -1,5 +1,5 @@
|
||||
import AbstractService from './abstractService'
|
||||
import TaskModel from '../models/task'
|
||||
import TaskModel, { type ITask } from '../models/task'
|
||||
import AttachmentService from './attachment'
|
||||
import LabelService from './label'
|
||||
|
||||
@ -113,7 +113,7 @@ export default class TaskService extends AbstractService {
|
||||
model.labels = model.labels.map(l => labelService.processModel(l))
|
||||
}
|
||||
|
||||
return model as TaskModel
|
||||
return model as ITask
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,8 +1,8 @@
|
||||
import AbstractService from './abstractService'
|
||||
import TaskCommentModel from '../models/taskComment'
|
||||
import TaskCommentModel, { type ITaskComment } from '../models/taskComment'
|
||||
import {formatISO} from 'date-fns'
|
||||
|
||||
export default class TaskCommentService extends AbstractService {
|
||||
export default class TaskCommentService extends AbstractService<ITaskComment> {
|
||||
constructor() {
|
||||
super({
|
||||
create: '/tasks/{taskId}/comments',
|
||||
|
Reference in New Issue
Block a user