From 48bef5287ffa4ff6a2b7954bf28b821828fa2819 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 31 Mar 2016 17:34:31 +0200 Subject: [PATCH] improve query interface --- src/vs/base/common/objects.ts | 5 +++++ .../parts/extensions/common/extensions.ts | 13 ++++++++++++- .../extensions/common/vsoGalleryService.ts | 19 +++++++++++-------- .../electron-browser/extensionsQuickOpen.ts | 6 +++--- 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/vs/base/common/objects.ts b/src/vs/base/common/objects.ts index 34c60ca46a9..9939af47e27 100644 --- a/src/vs/base/common/objects.ts +++ b/src/vs/base/common/objects.ts @@ -303,4 +303,9 @@ export function safeStringify(obj: any): string { } return value; }); +} + +export function getOrDefault(obj: T, fn: (obj: T) => R, defaultValue: R = null): R { + const result = fn(obj); + return typeof result === 'undefined' ? defaultValue : result; } \ No newline at end of file diff --git a/src/vs/workbench/parts/extensions/common/extensions.ts b/src/vs/workbench/parts/extensions/common/extensions.ts index 9f7f6eba63b..6232f2ea0b0 100644 --- a/src/vs/workbench/parts/extensions/common/extensions.ts +++ b/src/vs/workbench/parts/extensions/common/extensions.ts @@ -45,10 +45,21 @@ export interface IExtension extends IExtensionManifest { export const IExtensionsService = createDecorator('extensionsService'); export const IGalleryService = createDecorator('galleryService'); +export interface IQueryOptions { + text?: string; + pageNumber?: number; + pageSize?: number; +} + +export interface IQueryResult { + extensions: IExtension[]; + total: number; +} + export interface IGalleryService { serviceId: ServiceIdentifier; isEnabled(): boolean; - query(text?: string): TPromise<{ extensions: IExtension[]; total: number; }>; + query(options?: IQueryOptions): TPromise; } export interface IExtensionsService { diff --git a/src/vs/workbench/parts/extensions/common/vsoGalleryService.ts b/src/vs/workbench/parts/extensions/common/vsoGalleryService.ts index b11a6f608d0..971bf0b6b7e 100644 --- a/src/vs/workbench/parts/extensions/common/vsoGalleryService.ts +++ b/src/vs/workbench/parts/extensions/common/vsoGalleryService.ts @@ -4,9 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import { TPromise } from 'vs/base/common/winjs.base'; -import { IGalleryService, IExtension, IGalleryVersion } from 'vs/workbench/parts/extensions/common/extensions'; +import { IGalleryService, IGalleryVersion, IQueryOptions, IQueryResult } from 'vs/workbench/parts/extensions/common/extensions'; import { IXHRResponse } from 'vs/base/common/http'; -import { assign } from 'vs/base/common/objects'; +import { assign, getOrDefault } from 'vs/base/common/objects'; import { IRequestService } from 'vs/platform/request/common/request'; import { IWorkspaceContextService } from 'vs/workbench/services/workspace/common/contextService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -47,8 +47,6 @@ function getInstallCount(statistics: IGalleryExtensionStatistics[]): number { return result ? result.value : 0; } -// const FIVE_MINUTES = 1000 * 60 * 5; - export class GalleryService implements IGalleryService { serviceId = IGalleryService; @@ -74,12 +72,12 @@ export class GalleryService implements IGalleryService { return !!this.extensionsGalleryUrl; } - query(text: string = ''): TPromise<{ extensions: IExtension[]; total: number; }> { + query(options: IQueryOptions = {}): TPromise { if (!this.isEnabled()) { return TPromise.wrapError(new Error('No extension gallery service configured.')); } - return this.queryGallery(text) + return this.queryGallery(options) .then(r => JSON.parse(r.responseText).results[0]) .then<{ galleryExtensions: IGalleryExtension[]; total: number; }>(r => { const galleryExtensions = r.extensions; @@ -122,14 +120,19 @@ export class GalleryService implements IGalleryService { }); } - private queryGallery(text: string): TPromise { + private queryGallery(options: IQueryOptions): TPromise { + const text = getOrDefault(options, o => o.text, ''); + const pageNumber = getOrDefault(options, o => o.pageNumber, 1); + const pageSize = getOrDefault(options, o => o.pageNumber, 10); + const data = JSON.stringify({ filters: [{ criteria:[ { filterType: 8, value: 'Microsoft.VisualStudio.Code' }, { filterType: 10, value: text } ], - pageSize: 10 + pageNumber, + pageSize }], flags: 0x1 | 0x4 | 0x80 | 0x100 }); diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsQuickOpen.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsQuickOpen.ts index 87c6991b9b1..fe91c65313f 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsQuickOpen.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsQuickOpen.ts @@ -437,9 +437,9 @@ export class GalleryExtensionsHandler extends QuickOpenHandler { return nls.localize('galleryExtensionsHandlerAriaLabel', "Type to narrow down the list of extensions from the gallery"); } - getResults(input: string): TPromise> { - return this.delayer.trigger(() => TPromise.join([this.galleryService.query(input), this.extensionsService.getInstalled()])) - .then(result => this.instantiationService.createInstance(GalleryExtensionsModel, input, result[0].extensions, result[1])); + getResults(text: string): TPromise> { + return this.delayer.trigger(() => TPromise.join([this.galleryService.query({ text }), this.extensionsService.getInstalled()])) + .then(result => this.instantiationService.createInstance(GalleryExtensionsModel, text, result[0].extensions, result[1])); } getEmptyLabel(input: string): string { -- GitLab