1
0

feat: improve store and model typing

This commit is contained in:
Dominik Pschenitschni
2022-07-21 00:42:36 +02:00
parent c9e85cb52b
commit 3766b5e51b
98 changed files with 1050 additions and 507 deletions

View File

@ -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)
}

View File

@ -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

View File

@ -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',

View File

@ -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',

View File

@ -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,

View 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',

View File

@ -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)),

View File

@ -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',

View File

@ -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',

View File

@ -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',

View File

@ -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
}
}

View File

@ -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',