diff --git a/package-lock.json b/package-lock.json index a23d0cc24..9d34e558b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@crowdin/crowdin-api-client", - "version": "1.12.2", + "version": "1.12.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index d09c47de9..f8dc23e32 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@crowdin/crowdin-api-client", - "version": "1.12.2", + "version": "1.12.3", "description": "JavaScript library for Crowdin API v2.", "main": "out/index.js", "types": "out/index.d.ts", diff --git a/src/sourceFiles/index.ts b/src/sourceFiles/index.ts index ac5301633..54387efc1 100644 --- a/src/sourceFiles/index.ts +++ b/src/sourceFiles/index.ts @@ -79,13 +79,29 @@ export class SourceFiles extends CrowdinApi { offset?: number, filter?: string, recursion?: string, + ): Promise>; + + listProjectDirectories( + projectId: number, + branchIdOrRequest?: number | SourceFilesModel.ListProjectDirectoriesRequest, + directoryId?: number, + limit?: number, + offset?: number, + filter?: string, + recursion?: string, ): Promise> { let url = `${this.url}/projects/${projectId}/directories`; - url = this.addQueryParam(url, 'branchId', branchId); - url = this.addQueryParam(url, 'directoryId', directoryId); - url = this.addQueryParam(url, 'filter', filter); - url = this.addQueryParam(url, 'recursion', recursion); - return this.getList(url, limit, offset); + let request: SourceFilesModel.ListProjectDirectoriesRequest; + if (branchIdOrRequest && typeof branchIdOrRequest === 'object') { + request = branchIdOrRequest; + } else { + request = { branchId: branchIdOrRequest, directoryId, limit, offset, recursion, filter }; + } + url = this.addQueryParam(url, 'branchId', request.branchId); + url = this.addQueryParam(url, 'directoryId', request.directoryId); + url = this.addQueryParam(url, 'filter', request.filter); + url = this.addQueryParam(url, 'recursion', request.recursion); + return this.getList(url, request.limit, request.offset); } /** @@ -353,6 +369,15 @@ export namespace SourceFilesModel { HIGH = 'high', } + export interface ListProjectDirectoriesRequest { + branchId?: number; + directoryId?: number; + limit?: number; + offset?: number; + filter?: string; + recursion?: string; + } + export interface Directory { id: number; projectId: number; diff --git a/src/stringTranslations/index.ts b/src/stringTranslations/index.ts index 30272e579..1187f2af3 100644 --- a/src/stringTranslations/index.ts +++ b/src/stringTranslations/index.ts @@ -18,13 +18,29 @@ export class StringTranslations extends CrowdinApi { limit?: number, offset?: number, fileId?: number, + ): Promise>; + + listTranslationApprovals( + projectId: number, + stringIdOrRequest?: number | StringTranslationsModel.ListTranslationApprovalsRequest, + languageId?: string, + translationId?: number, + limit?: number, + offset?: number, + fileId?: number, ): Promise> { let url = `${this.url}/projects/${projectId}/approvals`; - url = this.addQueryParam(url, 'stringId', stringId); - url = this.addQueryParam(url, 'languageId', languageId); - url = this.addQueryParam(url, 'translationId', translationId); - url = this.addQueryParam(url, 'fileId', fileId); - return this.getList(url, limit, offset); + let request: StringTranslationsModel.ListTranslationApprovalsRequest; + if (stringIdOrRequest && typeof stringIdOrRequest === 'object') { + request = stringIdOrRequest; + } else { + request = { stringId: stringIdOrRequest, languageId, translationId, limit, offset, fileId }; + } + url = this.addQueryParam(url, 'stringId', request.stringId); + url = this.addQueryParam(url, 'languageId', request.languageId); + url = this.addQueryParam(url, 'translationId', request.translationId); + url = this.addQueryParam(url, 'fileId', request.fileId); + return this.getList(url, request.limit, request.offset); } /** @@ -84,14 +100,46 @@ export class StringTranslations extends CrowdinApi { | StringTranslationsModel.PluralLanguageTranslation | StringTranslationsModel.IcuLanguageTranslation > + >; + + listLanguageTranslations( + projectId: number, + languageId: string, + stringIdsOrRequest?: string | StringTranslationsModel.ListLanguageTranslationsRequest, + fileId?: number, + limit?: number, + offset?: number, + labelIds?: string, + denormalizePlaceholders?: BooleanInt, + croql?: string, + ): Promise< + ResponseList< + | StringTranslationsModel.PlainLanguageTranslation + | StringTranslationsModel.PluralLanguageTranslation + | StringTranslationsModel.IcuLanguageTranslation + > > { let url = `${this.url}/projects/${projectId}/languages/${languageId}/translations`; - url = this.addQueryParam(url, 'stringIds', stringIds); - url = this.addQueryParam(url, 'fileId', fileId); - url = this.addQueryParam(url, 'labelIds', labelIds); - url = this.addQueryParam(url, 'denormalizePlaceholders', denormalizePlaceholders); - url = this.addQueryParam(url, 'croql', croql); - return this.getList(url, limit, offset); + let request: StringTranslationsModel.ListLanguageTranslationsRequest; + if (stringIdsOrRequest && typeof stringIdsOrRequest === 'object') { + request = stringIdsOrRequest; + } else { + request = { + stringIds: stringIdsOrRequest, + fileId, + limit, + offset, + labelIds, + denormalizePlaceholders, + croql, + }; + } + url = this.addQueryParam(url, 'stringIds', request.stringIds); + url = this.addQueryParam(url, 'fileId', request.fileId); + url = this.addQueryParam(url, 'labelIds', request.labelIds); + url = this.addQueryParam(url, 'denormalizePlaceholders', request.denormalizePlaceholders); + url = this.addQueryParam(url, 'croql', request.croql); + return this.getList(url, request.limit, request.offset); } /** @@ -189,12 +237,27 @@ export class StringTranslations extends CrowdinApi { translationId?: number, limit?: number, offset?: number, + ): Promise>; + + listTranslationVotes( + projectId: number, + stringIdOrRequest?: number | StringTranslationsModel.ListTranslationVotesRequest, + languageId?: string, + translationId?: number, + limit?: number, + offset?: number, ): Promise> { let url = `${this.url}/projects/${projectId}/votes`; - url = this.addQueryParam(url, 'stringId', stringId); - url = this.addQueryParam(url, 'languageId', languageId); - url = this.addQueryParam(url, 'translationId', translationId); - return this.getList(url, limit, offset); + let request: StringTranslationsModel.ListTranslationVotesRequest; + if (stringIdOrRequest && typeof stringIdOrRequest === 'object') { + request = stringIdOrRequest; + } else { + request = { stringId: stringIdOrRequest, languageId, translationId, limit, offset }; + } + url = this.addQueryParam(url, 'stringId', request.stringId); + url = this.addQueryParam(url, 'languageId', request.languageId); + url = this.addQueryParam(url, 'translationId', request.translationId); + return this.getList(url, request.limit, request.offset); } /** @@ -229,6 +292,15 @@ export class StringTranslations extends CrowdinApi { } export namespace StringTranslationsModel { + export interface ListTranslationApprovalsRequest { + stringId?: number; + languageId?: string; + translationId?: number; + limit?: number; + offset?: number; + fileId?: number; + } + export interface Approval { id: number; user: User; @@ -252,6 +324,16 @@ export namespace StringTranslationsModel { createdAt: string; } + export interface ListLanguageTranslationsRequest { + stringIds?: string; + fileId?: number; + limit?: number; + offset?: number; + labelIds?: string; + denormalizePlaceholders?: BooleanInt; + croql?: string; + } + export interface PlainLanguageTranslation { stringId: number; contentType: string; @@ -291,6 +373,14 @@ export namespace StringTranslationsModel { pluralCategoryName?: string; } + export interface ListTranslationVotesRequest { + stringId?: number; + languageId?: string; + translationId?: number; + limit?: number; + offset?: number; + } + export interface Vote { id: number; user: User; diff --git a/src/tasks/index.ts b/src/tasks/index.ts index c14eebc11..57c4a88d2 100644 --- a/src/tasks/index.ts +++ b/src/tasks/index.ts @@ -79,11 +79,24 @@ export class Tasks extends CrowdinApi { offset?: number, status?: TasksModel.Status, isArchived?: BooleanInt, + ): Promise>; + + listUserTasks( + limitOrRequest?: number | TasksModel.ListUserTasksRequest, + offset?: number, + status?: TasksModel.Status, + isArchived?: BooleanInt, ): Promise> { let url = `${this.url}/user/tasks`; - url = this.addQueryParam(url, 'status', status); - url = this.addQueryParam(url, 'isArchived', isArchived); - return this.getList(url, limit, offset); + let request: TasksModel.ListUserTasksRequest; + if (limitOrRequest && typeof limitOrRequest === 'object') { + request = limitOrRequest; + } else { + request = { limit: limitOrRequest, offset, status, isArchived }; + } + url = this.addQueryParam(url, 'status', request.status); + url = this.addQueryParam(url, 'isArchived', request.isArchived); + return this.getList(url, request.limit, request.offset); } /** @@ -132,6 +145,13 @@ export namespace TasksModel { updatedAt: string; } + export interface ListUserTasksRequest { + limit?: number; + offset?: number; + status?: Status; + isArchived?: BooleanInt; + } + export interface UserTask extends Task { isArchived: boolean; } diff --git a/src/translationStatus/index.ts b/src/translationStatus/index.ts index 33624e519..30be382a3 100644 --- a/src/translationStatus/index.ts +++ b/src/translationStatus/index.ts @@ -97,12 +97,27 @@ export class TranslationStatus extends CrowdinApi { category?: TranslationStatusModel.Category, validation?: TranslationStatusModel.Validation, languageIds?: string, + ): Promise>; + + listQaCheckIssues( + projectId: number, + limitOrRequest?: number | TranslationStatusModel.ListQaCheckIssuesRequest, + offset?: number, + category?: TranslationStatusModel.Category, + validation?: TranslationStatusModel.Validation, + languageIds?: string, ): Promise> { let url = `${this.url}/projects/${projectId}/qa-checks`; - url = this.addQueryParam(url, 'category', category); - url = this.addQueryParam(url, 'validation', validation); - url = this.addQueryParam(url, 'languageIds', languageIds); - return this.getList(url, limit, offset); + let request: TranslationStatusModel.ListQaCheckIssuesRequest; + if (limitOrRequest && typeof limitOrRequest === 'object') { + request = limitOrRequest; + } else { + request = { limit: limitOrRequest, offset, category, validation, languageIds }; + } + url = this.addQueryParam(url, 'category', request.category); + url = this.addQueryParam(url, 'validation', request.validation); + url = this.addQueryParam(url, 'languageIds', request.languageIds); + return this.getList(url, request.limit, request.offset); } } @@ -185,6 +200,14 @@ export namespace TranslationStatusModel { ICU_CHECK = 'icu_check', } + export interface ListQaCheckIssuesRequest { + limit?: number; + offset?: number; + category?: Category; + validation?: Validation; + languageIds?: string; + } + export interface QaCheck { stringId: number; languageId: string; diff --git a/src/users/index.ts b/src/users/index.ts index 5b11788c4..dfb1c7185 100644 --- a/src/users/index.ts +++ b/src/users/index.ts @@ -17,12 +17,27 @@ export class Users extends CrowdinApi { languageId?: string, limit?: number, offset?: number, + ): Promise>; + + listProjectMembers( + projectId: number, + searchOrRequest?: string | UsersModel.ListProjectMembersRequest, + role?: UsersModel.Role, + languageId?: string, + limit?: number, + offset?: number, ): Promise> { let url = `${this.url}/projects/${projectId}/members`; - url = this.addQueryParam(url, 'search', search); - url = this.addQueryParam(url, 'role', role); - url = this.addQueryParam(url, 'languageId', languageId); - return this.getList(url, limit, offset); + let request: UsersModel.ListProjectMembersRequest; + if (searchOrRequest && typeof searchOrRequest === 'object') { + request = searchOrRequest; + } else { + request = { search: searchOrRequest, role, languageId, limit, offset }; + } + url = this.addQueryParam(url, 'search', request.search); + url = this.addQueryParam(url, 'role', request.role); + url = this.addQueryParam(url, 'languageId', request.languageId); + return this.getList(url, request.limit, request.offset); } /** @@ -88,12 +103,26 @@ export class Users extends CrowdinApi { twoFactor?: UsersModel.TwoFactor, limit?: number, offset?: number, + ): Promise>; + + listUsers( + statusOrRequest?: UsersModel.Status | UsersModel.ListUsersRequest, + search?: string, + twoFactor?: UsersModel.TwoFactor, + limit?: number, + offset?: number, ): Promise> { let url = `${this.url}/users`; - url = this.addQueryParam(url, 'status', status); - url = this.addQueryParam(url, 'search', search); - url = this.addQueryParam(url, 'twoFactor', twoFactor); - return this.getList(url, limit, offset); + let request: UsersModel.ListUsersRequest; + if (statusOrRequest && typeof statusOrRequest === 'object') { + request = statusOrRequest; + } else { + request = { status: statusOrRequest, search, twoFactor, limit, offset }; + } + url = this.addQueryParam(url, 'status', request.status); + url = this.addQueryParam(url, 'search', request.search); + url = this.addQueryParam(url, 'twoFactor', request.twoFactor); + return this.getList(url, request.limit, request.offset); } /** @@ -111,6 +140,22 @@ export class Users extends CrowdinApi { } export namespace UsersModel { + export interface ListProjectMembersRequest { + search?: string; + role?: Role; + languageId?: string; + limit?: number; + offset?: number; + } + + export interface ListUsersRequest { + status?: Status; + search?: string; + twoFactor?: TwoFactor; + limit?: number; + offset?: number; + } + export interface User { id: number; username: string; diff --git a/src/workflows/index.ts b/src/workflows/index.ts index 17ffa5a3e..d446b538a 100644 --- a/src/workflows/index.ts +++ b/src/workflows/index.ts @@ -10,10 +10,22 @@ export class Workflows extends CrowdinApi { groupId?: number, limit?: number, offset?: number, + ): Promise>; + + listWorkflowTemplates( + groupIdOrRequest?: number | WorkflowModel.ListWorkflowTemplatesRequest, + limit?: number, + offset?: number, ): Promise> { let url = `${this.url}/workflow-templates`; - url = this.addQueryParam(url, 'groupId', groupId); - return this.getList(url, limit, offset); + let request: WorkflowModel.ListWorkflowTemplatesRequest; + if (groupIdOrRequest && typeof groupIdOrRequest === 'object') { + request = groupIdOrRequest; + } else { + request = { groupId: groupIdOrRequest, limit, offset }; + } + url = this.addQueryParam(url, 'groupId', request.groupId); + return this.getList(url, request.limit, request.offset); } /** @@ -26,6 +38,12 @@ export class Workflows extends CrowdinApi { } export namespace WorkflowModel { + export interface ListWorkflowTemplatesRequest { + groupId?: number; + limit?: number; + offset?: number; + } + export interface Workflow { id: number; title: string;