diff --git a/src/services/abstractService.ts b/src/services/abstractService.ts index 8f149aa90..1c8de4b6f 100644 --- a/src/services/abstractService.ts +++ b/src/services/abstractService.ts @@ -6,7 +6,7 @@ import AbstractModel from '@/models/abstractModel' import type {IAbstract} from '@/modelTypes/IAbstract' import type {Right} from '@/constants/rights' -interface Paths { +interface PathsAll { create : string get : string getAll : string @@ -14,6 +14,7 @@ interface Paths { delete : string reset?: string } +type PathsGeneric = Partial; function convertObject(o: Record) { if (o instanceof Date) { @@ -40,7 +41,39 @@ function prepareParams(params: Record) { return objectToSnakeCase(params) } -export default abstract class AbstractService { +type VarsFromPathTemplate

= P extends `${string}{${infer FirstKey}}${infer Rest}` + ? [FirstKey, ...VarsFromPathTemplate] + : []; +/** + * @example + * type T = ReplacerDictFromPath<'/teams/{teamId}/members/{username}'>; + * const dict: T = { + * teamId: 1, + * username: 'demo', + * } + */ +type ReplacerDictFromPath

= Record< + VarsFromPathTemplate

[number], + string | number +> +type ReplacerDictOrNeverFromPath

= + P extends string + ? ReplacerDictFromPath

+ : never; +/** + * Prohibit the use of `string` as values, i.e. require a more concrete type: + * string literal or template literal. + */ +type EnsureConst> = { + [P in keyof T]: string extends T[P] ? never : T[P]; +}; + +export default abstract class AbstractService< + Model extends IAbstract = IAbstract, + // Not sure if the default value makes sense here. Put it only because a non-optional + // param can't go after an optional one. + P extends PathsGeneric = EnsureConst, +> { ///////////////////////////// // Initial variable definitions @@ -49,13 +82,7 @@ export default abstract class AbstractService = {}) { + constructor(paths : EnsureConst

= ({} as const)) { this.http = AuthenticatedHTTPFactory() // Set the interceptors to process every request @@ -96,7 +123,7 @@ export default abstract class AbstractService( + model : ReplacerDictOrNeverFromPath, + params = {}, + ): Promise { + if (!this.paths.get) { throw new Error('This model is not able to get data.') } @@ -279,7 +311,11 @@ export default abstract class AbstractService = {}) { + async getM( + url : T, + model : ReplacerDictFromPath, + params: Record = {}, + ) { const cancel = this.setLoading() model = this.beforeGet(model) @@ -312,8 +348,14 @@ export default abstract class AbstractService { - if (this.paths.getAll === '') { + // TODO refactor: ensure that if `ReplacerDict` is an empty object type then you + // can't pass an arbitrary object literal as `model`. + async getAll( + model : ReplacerDictOrNeverFromPath = new AbstractModel({}), + params = {}, + page = 1, + ): Promise { + if (!this.paths.getAll) { throw new Error('This model is not able to get data.') } @@ -342,8 +384,10 @@ export default abstract class AbstractService} */ - async create(model : Model) { - if (this.paths.create === '') { + async create( + model : Model & ReplacerDictOrNeverFromPath, + ): Promise { + if (!this.paths.create) { throw new Error('This model is not able to create data.') } @@ -384,8 +428,10 @@ export default abstract class AbstractService( + model : Model & ReplacerDictOrNeverFromPath, + ): Promise { + if (!this.paths.update) { throw new Error('This model is not able to update data.') } @@ -396,8 +442,10 @@ export default abstract class AbstractService( + model : ReplacerDictOrNeverFromPath, + ) { + if (!this.paths.delete) { throw new Error('This model is not able to delete data.') } diff --git a/src/services/attachment.ts b/src/services/attachment.ts index e6d02def0..fca2b98bb 100644 --- a/src/services/attachment.ts +++ b/src/services/attachment.ts @@ -5,13 +5,15 @@ import type { IAttachment } from '@/modelTypes/IAttachment' import {downloadBlob} from '@/helpers/downloadBlob' -export default class AttachmentService extends AbstractService { +const paths = { + create: '/tasks/{taskId}/attachments', + getAll: '/tasks/{taskId}/attachments', + delete: '/tasks/{taskId}/attachments/{id}', +} as const + +export default class AttachmentService extends AbstractService { constructor() { - super({ - create: '/tasks/{taskId}/attachments', - getAll: '/tasks/{taskId}/attachments', - delete: '/tasks/{taskId}/attachments/{id}', - }) + super(paths) } processModel(model: IAttachment) { diff --git a/src/services/avatar.ts b/src/services/avatar.ts index 692ab5a37..d5eaa04e4 100644 --- a/src/services/avatar.ts +++ b/src/services/avatar.ts @@ -2,13 +2,15 @@ import AbstractService from './abstractService' import AvatarModel from '@/models/avatar' import type { IAvatar } from '@/modelTypes/IAvatar' -export default class AvatarService extends AbstractService { +const paths = { + get: '/user/settings/avatar', + update: '/user/settings/avatar', + create: '/user/settings/avatar/upload', +} as const + +export default class AvatarService extends AbstractService { constructor() { - super({ - get: '/user/settings/avatar', - update: '/user/settings/avatar', - create: '/user/settings/avatar/upload', - }) + super(paths) } modelFactory(data: Partial) { diff --git a/src/services/backgroundUnsplash.ts b/src/services/backgroundUnsplash.ts index eac4b7113..400023d98 100644 --- a/src/services/backgroundUnsplash.ts +++ b/src/services/backgroundUnsplash.ts @@ -3,12 +3,14 @@ import BackgroundImageModel from '../models/backgroundImage' import ProjectModel from '@/models/project' import type { IBackgroundImage } from '@/modelTypes/IBackgroundImage' -export default class BackgroundUnsplashService extends AbstractService { +const paths = { + getAll: '/backgrounds/unsplash/search', + update: '/projects/{projectId}/backgrounds/unsplash', +} as const + +export default class BackgroundUnsplashService extends AbstractService { constructor() { - super({ - getAll: '/backgrounds/unsplash/search', - update: '/projects/{projectId}/backgrounds/unsplash', - }) + super(paths) } modelFactory(data: Partial) { diff --git a/src/services/backgroundUpload.ts b/src/services/backgroundUpload.ts index f532c3626..27a1e0108 100644 --- a/src/services/backgroundUpload.ts +++ b/src/services/backgroundUpload.ts @@ -4,11 +4,13 @@ import ProjectModel from '@/models/project' import type { IProject } from '@/modelTypes/IProject' import type { IFile } from '@/modelTypes/IFile' -export default class BackgroundUploadService extends AbstractService { +const paths = { + create: '/projects/{projectId}/backgrounds/upload', +} as const + +export default class BackgroundUploadService extends AbstractService { constructor() { - super({ - create: '/projects/{projectId}/backgrounds/upload', - }) + super(paths) } useCreateInterceptor() { diff --git a/src/services/bucket.ts b/src/services/bucket.ts index 0ef42f876..540f843b1 100644 --- a/src/services/bucket.ts +++ b/src/services/bucket.ts @@ -3,14 +3,16 @@ import BucketModel from '../models/bucket' import TaskService from '@/services/task' import type { IBucket } from '@/modelTypes/IBucket' -export default class BucketService extends AbstractService { +const paths = { + getAll: '/projects/{projectId}/buckets', + create: '/projects/{projectId}/buckets', + update: '/projects/{projectId}/buckets/{id}', + delete: '/projects/{projectId}/buckets/{id}', +} as const + +export default class BucketService extends AbstractService { constructor() { - super({ - getAll: '/projects/{projectId}/buckets', - create: '/projects/{projectId}/buckets', - update: '/projects/{projectId}/buckets/{id}', - delete: '/projects/{projectId}/buckets/{id}', - }) + super(paths) } modelFactory(data: Partial) { diff --git a/src/services/caldavToken.ts b/src/services/caldavToken.ts index fba39724f..6e943ca4a 100644 --- a/src/services/caldavToken.ts +++ b/src/services/caldavToken.ts @@ -2,13 +2,15 @@ import CaldavTokenModel from '@/models/caldavToken' import type {ICaldavToken} from '@/modelTypes/ICaldavToken' import AbstractService from './abstractService' -export default class CaldavTokenService extends AbstractService { +const paths = { + getAll: '/user/settings/token/caldav', + create: '/user/settings/token/caldav', + delete: '/user/settings/token/caldav/{id}', +} as const + +export default class CaldavTokenService extends AbstractService { constructor() { - super({ - getAll: '/user/settings/token/caldav', - create: '/user/settings/token/caldav', - delete: '/user/settings/token/caldav/{id}', - }) + super(paths) } modelFactory(data) { diff --git a/src/services/emailUpdate.ts b/src/services/emailUpdate.ts index 3156ab0d1..e56cbed79 100644 --- a/src/services/emailUpdate.ts +++ b/src/services/emailUpdate.ts @@ -1,9 +1,12 @@ +import type { IAbstract } from '@/modelTypes/IAbstract' import AbstractService from './abstractService' -export default class EmailUpdateService extends AbstractService { +const paths = { + update: '/user/settings/email', +} as const + +export default class EmailUpdateService extends AbstractService { constructor() { - super({ - update: '/user/settings/email', - }) + super(paths) } } \ No newline at end of file diff --git a/src/services/label.ts b/src/services/label.ts index 084430341..31bb619fc 100644 --- a/src/services/label.ts +++ b/src/services/label.ts @@ -3,15 +3,17 @@ import LabelModel from '@/models/label' import type {ILabel} from '@/modelTypes/ILabel' import {colorFromHex} from '@/helpers/color/colorFromHex' -export default class LabelService extends AbstractService { +const paths = { + create: '/labels', + getAll: '/labels', + get: '/labels/{id}', + update: '/labels/{id}', + delete: '/labels/{id}', +} as const + +export default class LabelService extends AbstractService { constructor() { - super({ - create: '/labels', - getAll: '/labels', - get: '/labels/{id}', - update: '/labels/{id}', - delete: '/labels/{id}', - }) + super(paths) } processModel(label) { diff --git a/src/services/labelTask.ts b/src/services/labelTask.ts index 3e6740522..c6f1fea6d 100644 --- a/src/services/labelTask.ts +++ b/src/services/labelTask.ts @@ -2,13 +2,15 @@ import AbstractService from './abstractService' import LabelTask from '@/models/labelTask' import type {ILabelTask} from '@/modelTypes/ILabelTask' -export default class LabelTaskService extends AbstractService { +const paths = { + create: '/tasks/{taskId}/labels', + getAll: '/tasks/{taskId}/labels', + delete: '/tasks/{taskId}/labels/{labelId}', +} as const + +export default class LabelTaskService extends AbstractService { constructor() { - super({ - create: '/tasks/{taskId}/labels', - getAll: '/tasks/{taskId}/labels', - delete: '/tasks/{taskId}/labels/{labelId}', - }) + super(paths) } modelFactory(data) { diff --git a/src/services/linkShare.ts b/src/services/linkShare.ts index 03a4b2a5d..ab0dca769 100644 --- a/src/services/linkShare.ts +++ b/src/services/linkShare.ts @@ -2,14 +2,16 @@ import AbstractService from './abstractService' import LinkShareModel from '@/models/linkShare' import type {ILinkShare} from '@/modelTypes/ILinkShare' -export default class LinkShareService extends AbstractService { +const paths = { + getAll: '/projects/{projectId}/shares', + get: '/projects/{projectId}/shares/{id}', + create: '/projects/{projectId}/shares', + delete: '/projects/{projectId}/shares/{id}', +} as const + +export default class LinkShareService extends AbstractService { constructor() { - super({ - getAll: '/projects/{projectId}/shares', - get: '/projects/{projectId}/shares/{id}', - create: '/projects/{projectId}/shares', - delete: '/projects/{projectId}/shares/{id}', - }) + super(paths) } modelFactory(data) { diff --git a/src/services/migrator/abstractMigration.ts b/src/services/migrator/abstractMigration.ts index b3051c43b..34d2f3ac7 100644 --- a/src/services/migrator/abstractMigration.ts +++ b/src/services/migrator/abstractMigration.ts @@ -2,14 +2,18 @@ import AbstractService from '../abstractService' export type MigrationConfig = { code: string } +type Paths = { + update: `/migration/${string}/migrate` +} + // This service builds on top of the abstract service and basically just hides away method names. // It enables migration services to be created with minimal overhead and even better method names. -export default class AbstractMigrationService extends AbstractService { +export default class AbstractMigrationService extends AbstractService { serviceUrlKey = '' constructor(serviceUrlKey: string) { super({ - update: '/migration/' + serviceUrlKey + '/migrate', + update: `/migration/${serviceUrlKey}/migrate`, }) this.serviceUrlKey = serviceUrlKey } diff --git a/src/services/namespace.ts b/src/services/namespace.ts index dfc056bb1..64381a9ef 100644 --- a/src/services/namespace.ts +++ b/src/services/namespace.ts @@ -3,15 +3,17 @@ import NamespaceModel from '../models/namespace' import type {INamespace} from '@/modelTypes/INamespace' import {colorFromHex} from '@/helpers/color/colorFromHex' -export default class NamespaceService extends AbstractService { +const paths = { + create: '/namespaces', + get: '/namespaces/{id}', + getAll: '/namespaces', + update: '/namespaces/{id}', + delete: '/namespaces/{id}', +} as const + +export default class NamespaceService extends AbstractService { constructor() { - super({ - create: '/namespaces', - get: '/namespaces/{id}', - getAll: '/namespaces', - update: '/namespaces/{id}', - delete: '/namespaces/{id}', - }) + super(paths) } modelFactory(data) { diff --git a/src/services/notification.ts b/src/services/notification.ts index 6ac783f75..b35956b0a 100644 --- a/src/services/notification.ts +++ b/src/services/notification.ts @@ -2,12 +2,14 @@ import AbstractService from '@/services/abstractService' import NotificationModel from '@/models/notification' import type {INotification} from '@/modelTypes/INotification' -export default class NotificationService extends AbstractService { +const paths = { + getAll: '/notifications', + update: '/notifications/{id}', +} as const + +export default class NotificationService extends AbstractService { constructor() { - super({ - getAll: '/notifications', - update: '/notifications/{id}', - }) + super(paths) } modelFactory(data) { diff --git a/src/services/passwordReset.ts b/src/services/passwordReset.ts index 688dfb635..e55f11857 100644 --- a/src/services/passwordReset.ts +++ b/src/services/passwordReset.ts @@ -2,10 +2,11 @@ import AbstractService from './abstractService' import PasswordResetModel from '@/models/passwordReset' import type {IPasswordReset} from '@/modelTypes/IPasswordReset' -export default class PasswordResetService extends AbstractService { +const paths = {} as const +export default class PasswordResetService extends AbstractService { constructor() { - super({}) + super(paths) this.paths = { reset: '/user/password/reset', requestReset: '/user/password/token', diff --git a/src/services/passwordUpdateService.ts b/src/services/passwordUpdateService.ts index fa202afab..559d1b5f5 100644 --- a/src/services/passwordUpdateService.ts +++ b/src/services/passwordUpdateService.ts @@ -1,10 +1,12 @@ import AbstractService from './abstractService' import type {IPasswordUpdate} from '@/modelTypes/IPasswordUpdate' -export default class PasswordUpdateService extends AbstractService { +const paths = { + update: '/user/password', +} as const + +export default class PasswordUpdateService extends AbstractService { constructor() { - super({ - update: '/user/password', - }) + super(paths) } } \ No newline at end of file diff --git a/src/services/project.ts b/src/services/project.ts index 4bd4ae5bc..aaa31199a 100644 --- a/src/services/project.ts +++ b/src/services/project.ts @@ -4,15 +4,17 @@ import type {IProject} from '@/modelTypes/IProject' import TaskService from './task' import {colorFromHex} from '@/helpers/color/colorFromHex' -export default class ProjectService extends AbstractService { +const paths = { + create: '/namespaces/{namespaceId}/projects', + get: '/projects/{id}', + getAll: '/projects', + update: '/projects/{id}', + delete: '/projects/{id}', +} as const + +export default class ProjectService extends AbstractService { constructor() { - super({ - create: '/namespaces/{namespaceId}/projects', - get: '/projects/{id}', - getAll: '/projects', - update: '/projects/{id}', - delete: '/projects/{id}', - }) + super(paths) } modelFactory(data) { diff --git a/src/services/projectDuplicateService.ts b/src/services/projectDuplicateService.ts index 05513d655..c72cbdaa9 100644 --- a/src/services/projectDuplicateService.ts +++ b/src/services/projectDuplicateService.ts @@ -2,11 +2,13 @@ import AbstractService from './abstractService' import projectDuplicateModel from '@/models/projectDuplicateModel' import type {IProjectDuplicate} from '@/modelTypes/IProjectDuplicate' -export default class ProjectDuplicateService extends AbstractService { +const paths = { + create: '/projects/{projectId}/duplicate', +} as const + +export default class ProjectDuplicateService extends AbstractService { constructor() { - super({ - create: '/projects/{projectId}/duplicate', - }) + super(paths) } beforeCreate(model) { diff --git a/src/services/projectUsers.ts b/src/services/projectUsers.ts index 5dc28f132..ae8b169e6 100644 --- a/src/services/projectUsers.ts +++ b/src/services/projectUsers.ts @@ -1,11 +1,13 @@ import AbstractService from './abstractService' import UserModel from '../models/user' -export default class ProjectUserService extends AbstractService { +const paths = { + getAll: '/projects/{projectId}/projectusers', +} as const + +export default class ProjectUserService extends AbstractService { constructor() { - super({ - getAll: '/projects/{projectId}/projectusers', - }) + super(paths) } modelFactory(data) { diff --git a/src/services/savedFilter.ts b/src/services/savedFilter.ts index 94edbab71..047a45f25 100644 --- a/src/services/savedFilter.ts +++ b/src/services/savedFilter.ts @@ -43,14 +43,16 @@ export function isSavedFilter(project: IProject) { return getSavedFilterIdFromProjectId(project.id) > 0 } -export default class SavedFilterService extends AbstractService { +const paths = { + get: '/filters/{id}', + create: '/filters', + update: '/filters/{id}', + delete: '/filters/{id}', +} as const + +export default class SavedFilterService extends AbstractService { constructor() { - super({ - get: '/filters/{id}', - create: '/filters', - update: '/filters/{id}', - delete: '/filters/{id}', - }) + super(paths) } modelFactory(data) { diff --git a/src/services/subscription.ts b/src/services/subscription.ts index 96e835327..efc0862b4 100644 --- a/src/services/subscription.ts +++ b/src/services/subscription.ts @@ -2,12 +2,14 @@ import AbstractService from '@/services/abstractService' import SubscriptionModel from '@/models/subscription' import type {ISubscription} from '@/modelTypes/ISubscription' -export default class SubscriptionService extends AbstractService { +const paths = { + create: '/subscriptions/{entity}/{entityId}', + delete: '/subscriptions/{entity}/{entityId}', +} as const + +export default class SubscriptionService extends AbstractService { constructor() { - super({ - create: '/subscriptions/{entity}/{entityId}', - delete: '/subscriptions/{entity}/{entityId}', - }) + super(paths) } modelFactory(data) { diff --git a/src/services/task.ts b/src/services/task.ts index f40642b0c..ec867fd3f 100644 --- a/src/services/task.ts +++ b/src/services/task.ts @@ -15,15 +15,17 @@ const parseDate = date => { return null } -export default class TaskService extends AbstractService { +const paths = { + create: '/projects/{projectId}', + getAll: '/tasks/all', + get: '/tasks/{id}', + update: '/tasks/{id}', + delete: '/tasks/{id}', +} as const + +export default class TaskService extends AbstractService { constructor() { - super({ - create: '/projects/{projectId}', - getAll: '/tasks/all', - get: '/tasks/{id}', - update: '/tasks/{id}', - delete: '/tasks/{id}', - }) + super(paths) } modelFactory(data) { diff --git a/src/services/taskAssignee.ts b/src/services/taskAssignee.ts index ab89a413b..684f892b6 100644 --- a/src/services/taskAssignee.ts +++ b/src/services/taskAssignee.ts @@ -2,12 +2,14 @@ import AbstractService from './abstractService' import TaskAssigneeModel from '@/models/taskAssignee' import type {ITaskAssignee} from '@/modelTypes/ITaskAssignee' -export default class TaskAssigneeService extends AbstractService { +const paths = { + create: '/tasks/{taskId}/assignees', + delete: '/tasks/{taskId}/assignees/{userId}', +} as const + +export default class TaskAssigneeService extends AbstractService { constructor() { - super({ - create: '/tasks/{taskId}/assignees', - delete: '/tasks/{taskId}/assignees/{userId}', - }) + super(paths) } modelFactory(data) { diff --git a/src/services/taskCollection.ts b/src/services/taskCollection.ts index 71862481d..074ffa72a 100644 --- a/src/services/taskCollection.ts +++ b/src/services/taskCollection.ts @@ -14,11 +14,13 @@ export interface GetAllTasksParams { filter_include_nulls: boolean, } -export default class TaskCollectionService extends AbstractService { +const paths = { + getAll: '/projects/{projectId}/tasks', +} as const + +export default class TaskCollectionService extends AbstractService { constructor() { - super({ - getAll: '/projects/{projectId}/tasks', - }) + super(paths) } modelFactory(data) { diff --git a/src/services/taskComment.ts b/src/services/taskComment.ts index 040a212fa..e32c03154 100644 --- a/src/services/taskComment.ts +++ b/src/services/taskComment.ts @@ -2,15 +2,17 @@ import AbstractService from './abstractService' import TaskCommentModel from '@/models/taskComment' import type {ITaskComment} from '@/modelTypes/ITaskComment' -export default class TaskCommentService extends AbstractService { +const paths = { + create: '/tasks/{taskId}/comments', + getAll: '/tasks/{taskId}/comments', + get: '/tasks/{taskId}/comments/{id}', + update: '/tasks/{taskId}/comments/{id}', + delete: '/tasks/{taskId}/comments/{id}', +} as const + +export default class TaskCommentService extends AbstractService { constructor() { - super({ - create: '/tasks/{taskId}/comments', - getAll: '/tasks/{taskId}/comments', - get: '/tasks/{taskId}/comments/{id}', - update: '/tasks/{taskId}/comments/{id}', - delete: '/tasks/{taskId}/comments/{id}', - }) + super(paths) } modelFactory(data) { diff --git a/src/services/taskRelation.ts b/src/services/taskRelation.ts index 830144855..57c91cba5 100644 --- a/src/services/taskRelation.ts +++ b/src/services/taskRelation.ts @@ -2,12 +2,14 @@ import AbstractService from './abstractService' import TaskRelationModel from '@/models/taskRelation' import type {ITaskRelation} from '@/modelTypes/ITaskRelation' -export default class TaskRelationService extends AbstractService { +const paths = { + create: '/tasks/{taskId}/relations', + delete: '/tasks/{taskId}/relations/{relationKind}/{otherTaskId}', +} as const + +export default class TaskRelationService extends AbstractService { constructor() { - super({ - create: '/tasks/{taskId}/relations', - delete: '/tasks/{taskId}/relations/{relationKind}/{otherTaskId}', - }) + super(paths) } modelFactory(data) { diff --git a/src/services/team.ts b/src/services/team.ts index f02b99520..520ecd468 100644 --- a/src/services/team.ts +++ b/src/services/team.ts @@ -2,15 +2,17 @@ import AbstractService from './abstractService' import TeamModel from '@/models/team' import type {ITeam} from '@/modelTypes/ITeam' -export default class TeamService extends AbstractService { +const paths = { + create: '/teams', + get: '/teams/{id}', + getAll: '/teams', + update: '/teams/{id}', + delete: '/teams/{id}', +} as const + +export default class TeamService extends AbstractService { constructor() { - super({ - create: '/teams', - get: '/teams/{id}', - getAll: '/teams', - update: '/teams/{id}', - delete: '/teams/{id}', - }) + super(paths) } modelFactory(data) { diff --git a/src/services/teamMember.ts b/src/services/teamMember.ts index 0a6320df9..f63a7f1d5 100644 --- a/src/services/teamMember.ts +++ b/src/services/teamMember.ts @@ -2,13 +2,15 @@ import AbstractService from './abstractService' import TeamMemberModel from '@/models/teamMember' import type {ITeamMember} from '@/modelTypes/ITeamMember' -export default class TeamMemberService extends AbstractService { +const paths = { + create: '/teams/{teamId}/members', + delete: '/teams/{teamId}/members/{username}', + update: '/teams/{teamId}/members/{username}/admin', +} as const + +export default class TeamMemberService extends AbstractService { constructor() { - super({ - create: '/teams/{teamId}/members', - delete: '/teams/{teamId}/members/{username}', - update: '/teams/{teamId}/members/{username}/admin', - }) + super(paths) } modelFactory(data) { diff --git a/src/services/teamNamespace.ts b/src/services/teamNamespace.ts index 1547a3dfa..fcb10a528 100644 --- a/src/services/teamNamespace.ts +++ b/src/services/teamNamespace.ts @@ -3,14 +3,16 @@ import TeamNamespaceModel from '@/models/teamNamespace' import type {ITeamNamespace} from '@/modelTypes/ITeamNamespace' import TeamModel from '@/models/team' -export default class TeamNamespaceService extends AbstractService { +const paths = { + create: '/namespaces/{namespaceId}/teams', + getAll: '/namespaces/{namespaceId}/teams', + update: '/namespaces/{namespaceId}/teams/{teamId}', + delete: '/namespaces/{namespaceId}/teams/{teamId}', +} as const + +export default class TeamNamespaceService extends AbstractService { constructor() { - super({ - create: '/namespaces/{namespaceId}/teams', - getAll: '/namespaces/{namespaceId}/teams', - update: '/namespaces/{namespaceId}/teams/{teamId}', - delete: '/namespaces/{namespaceId}/teams/{teamId}', - }) + super(paths) } modelFactory(data) { diff --git a/src/services/teamProject.ts b/src/services/teamProject.ts index b4138a8c8..6ea3b97b4 100644 --- a/src/services/teamProject.ts +++ b/src/services/teamProject.ts @@ -3,14 +3,16 @@ import TeamProjectModel from '@/models/teamProject' import type {ITeamProject} from '@/modelTypes/ITeamProject' import TeamModel from '@/models/team' -export default class TeamProjectService extends AbstractService { +const paths = { + create: '/projects/{projectId}/teams', + getAll: '/projects/{projectId}/teams', + update: '/projects/{projectId}/teams/{teamId}', + delete: '/projects/{projectId}/teams/{teamId}', +} as const + +export default class TeamProjectService extends AbstractService { constructor() { - super({ - create: '/projects/{projectId}/teams', - getAll: '/projects/{projectId}/teams', - update: '/projects/{projectId}/teams/{teamId}', - delete: '/projects/{projectId}/teams/{teamId}', - }) + super(paths) } modelFactory(data) { diff --git a/src/services/totp.ts b/src/services/totp.ts index 531b9f8af..9c611ce41 100644 --- a/src/services/totp.ts +++ b/src/services/totp.ts @@ -2,13 +2,18 @@ import AbstractService from './abstractService' import TotpModel from '@/models/totp' import type {ITotp} from '@/modelTypes/ITotp' -export default class TotpService extends AbstractService { - urlPrefix = '/user/settings/totp' +const urlPrefix = '/user/settings/totp' as const +type Paths = { + get: typeof urlPrefix +} + +export default class TotpService extends AbstractService { + urlPrefix = urlPrefix constructor() { - super({}) - - this.paths.get = this.urlPrefix + super({ + get: urlPrefix, + }) } modelFactory(data) { diff --git a/src/services/user.ts b/src/services/user.ts index 3b92e9145..1d3e37d59 100644 --- a/src/services/user.ts +++ b/src/services/user.ts @@ -2,11 +2,13 @@ import AbstractService from './abstractService' import UserModel from '@/models/user' import type {IUser} from '@/modelTypes/IUser' -export default class UserService extends AbstractService { +const paths = { + getAll: '/users', +} as const + +export default class UserService extends AbstractService { constructor() { - super({ - getAll: '/users', - }) + super(paths) } modelFactory(data) { diff --git a/src/services/userNamespace.ts b/src/services/userNamespace.ts index 6011899c1..60e01d15f 100644 --- a/src/services/userNamespace.ts +++ b/src/services/userNamespace.ts @@ -3,14 +3,16 @@ import UserNamespaceModel from '@/models/userNamespace' import type {IUserNamespace} from '@/modelTypes/IUserNamespace' import UserModel from '@/models/user' -export default class UserNamespaceService extends AbstractService { +const paths = { + create: '/namespaces/{namespaceId}/users', + getAll: '/namespaces/{namespaceId}/users', + update: '/namespaces/{namespaceId}/users/{userId}', + delete: '/namespaces/{namespaceId}/users/{userId}', +} as const + +export default class UserNamespaceService extends AbstractService { constructor() { - super({ - create: '/namespaces/{namespaceId}/users', - getAll: '/namespaces/{namespaceId}/users', - update: '/namespaces/{namespaceId}/users/{userId}', - delete: '/namespaces/{namespaceId}/users/{userId}', - }) + super(paths) } modelFactory(data) { diff --git a/src/services/userProject.ts b/src/services/userProject.ts index cb35df213..012a342b7 100644 --- a/src/services/userProject.ts +++ b/src/services/userProject.ts @@ -3,14 +3,16 @@ import UserProjectModel from '@/models/userProject' import type {IUserProject} from '@/modelTypes/IUserProject' import UserModel from '@/models/user' -export default class UserProjectService extends AbstractService { +const paths = { + create: '/projects/{projectId}/users', + getAll: '/projects/{projectId}/users', + update: '/projects/{projectId}/users/{userId}', + delete: '/projects/{projectId}/users/{userId}', +} as const + +export default class UserProjectService extends AbstractService { constructor() { - super({ - create: '/projects/{projectId}/users', - getAll: '/projects/{projectId}/users', - update: '/projects/{projectId}/users/{userId}', - delete: '/projects/{projectId}/users/{userId}', - }) + super(paths) } modelFactory(data) { diff --git a/src/services/userSettings.ts b/src/services/userSettings.ts index 6628f43bc..85a637e97 100644 --- a/src/services/userSettings.ts +++ b/src/services/userSettings.ts @@ -1,10 +1,12 @@ import type {IUserSettings} from '@/modelTypes/IUserSettings' import AbstractService from './abstractService' -export default class UserSettingsService extends AbstractService { +const paths = { + update: '/user/settings/general', +} as const + +export default class UserSettingsService extends AbstractService { constructor() { - super({ - update: '/user/settings/general', - }) + super(paths) } } \ No newline at end of file