Browse Source

Merge pull request #118 from JonStargaryen/modelserverfixes

ModelServer: filename parameter
David Sehnal 4 years ago
parent
commit
9f440f68e0

+ 1 - 0
src/mol-io/writer/mol/encoder.ts

@@ -90,6 +90,7 @@ export class MolEncoder extends LigandEncoder {
         const { instance, source } = getCategoryInstanceData(category, context);
         const fields = instance.fields;
         const src = source[0];
+        if (!src) return;
         const data = src.data;
 
         const it = src.keys();

+ 1 - 0
src/mol-io/writer/mol2/encoder.ts

@@ -289,6 +289,7 @@ export class Mol2Encoder extends LigandEncoder {
         const { instance, source } = getCategoryInstanceData(category, context);
         const fields = instance.fields;
         const src = source[0];
+        if (!src) return;
         const data = src.data;
 
         const it = src.keys();

+ 2 - 1
src/servers/model/server/api-web-multiple.ts

@@ -19,7 +19,8 @@ export interface MultipleQuerySpec {
     queries: MultipleQueryEntry[],
     encoding?: Encoding,
     asTarGz?: boolean,
-    download?: boolean
+    download?: boolean,
+    filename?: string
 }
 
 export function getMultiQuerySpecFilename() {

+ 3 - 3
src/servers/model/server/api-web.ts

@@ -49,14 +49,14 @@ export function createResultWriter(response: express.Response, params: ResultWri
     const filenameBase = params.entryId && params.queryName
         ? `${params.entryId}_${splitCamelCase(params.queryName.replace(/\s/g, '_'), '-').toLowerCase()}`
         : `result`;
-    return new SimpleResponseResultWriter(`${filenameBase}.${params.encoding}`, response, params.encoding === 'bcif', params.download);
+    return new SimpleResponseResultWriter(params.filename || `${filenameBase}.${params.encoding}`, response, params.encoding === 'bcif', params.download);
 }
 
 function mapQuery(app: express.Express, queryName: string, queryDefinition: QueryDefinition) {
     function createJob(queryParams: any, req: express.Request, res: express.Response) {
         const entryId = req.params.id;
         const commonParams = normalizeRestCommonParams(req.query);
-        const resultWriterParams = { encoding: commonParams.encoding!, download: !!commonParams.download, entryId, queryName };
+        const resultWriterParams = { encoding: commonParams.encoding!, download: !!commonParams.download, filename: commonParams.filename!, entryId, queryName };
         const jobId = JobManager.add({
             entries: [JobEntry({
                 sourceId: commonParams.data_source || ModelServerConfig.defaultSource,
@@ -123,7 +123,7 @@ function serveStatic(req: express.Request, res: express.Response) {
 function createMultiJob(spec: MultipleQuerySpec, res: express.Response) {
     const writer = spec.asTarGz
         ? new TarballResponseResultWriter(getMultiQuerySpecFilename(), res)
-        : createResultWriter(res, { encoding: spec.encoding!, download: !!spec.download });
+        : createResultWriter(res, { encoding: spec.encoding!, download: !!spec.download, filename: spec.filename });
 
     if (spec.queries.length > ModelServerConfig.maxQueryManyQueries) {
         writer.doError(400, `query-many queries limit (${ModelServerConfig.maxQueryManyQueries}) exceeded.`);

+ 6 - 3
src/servers/model/server/api.ts

@@ -49,7 +49,8 @@ export const CommonQueryParamsInfo: QueryParamInfo[] = [
     { name: 'copy_all_categories', type: QueryParamType.Boolean, defaultValue: false, description: 'If true, copy all categories from the input file.' },
     { name: 'data_source', type: QueryParamType.String, defaultValue: '', description: 'Allows to control how the provided data source ID maps to input file (as specified by the server instance config).' },
     { name: 'transform', type: QueryParamType.String, description: `Transformation to apply to coordinates in '_atom_site'. Accepts a 4x4 transformation matrix, provided as array of 16 float values.` },
-    { name: 'download', type: QueryParamType.Boolean, defaultValue: false, description: 'If true, browser will download text files.' }
+    { name: 'download', type: QueryParamType.Boolean, defaultValue: false, description: 'If true, browser will download text files.' },
+    { name: 'filename', type: QueryParamType.String, defaultValue: '', description: `Controls the filename for downloaded files. Will force download if specified.` }
 ];
 
 export type Encoding = 'cif' | 'bcif' | 'sdf' | 'mol' | 'mol2';
@@ -59,7 +60,8 @@ export interface CommonQueryParamsInfo {
     copy_all_categories?: boolean
     data_source?: string,
     transform?: Mat4,
-    download?: boolean
+    download?: boolean,
+    filename?: string
 }
 
 export const AtomSiteSchemaElement = {
@@ -295,7 +297,8 @@ export function normalizeRestCommonParams(params: any): CommonQueryParamsInfo {
         copy_all_categories: isTrue(params.copy_all_categories),
         encoding: mapEncoding(('' + params.encoding).toLocaleLowerCase()),
         transform: params.transform ? ('' + params.transform).split(',').map(n => n.trim()).map(n => +n) as Mat4 : Mat4.identity(),
-        download: isTrue(params.download)
+        download: isTrue(params.download) || !!params.filename,
+        filename: params.filename
     };
 }
 

+ 1 - 0
src/servers/model/server/jobs.ts

@@ -59,6 +59,7 @@ interface JobEntryDefinition<Name extends QueryName> {
 export interface ResultWriterParams {
     encoding: Encoding,
     download: boolean,
+    filename?: string,
     entryId?: string,
     queryName?: string
 }