azurite
Version:
A lightweight server clone of Azure Blob Storage that simulates most of the commands supported by it with minimal dependencies.
67 lines (60 loc) • 2.8 kB
JavaScript
;
const storageManager = require('./../StorageManager'),
js2xmlparser = require("js2xmlparser"),
model = require('./../model/ContainerList');
class ListContainers {
constructor(){
}
process(req, res) {
const prefix = req.query.prefix || '',
maxresults = req.query.maxresults || "5000",
includeMetadata = (req.query.include === 'metadata') ? true : false,
marker = req.query.marker || '';
storageManager.listContainer(prefix, maxresults)
.then((containers) => {
this._addResponseHeaders(res);
let transformedModel = this._transformContainerList(containers, includeMetadata, prefix, maxresults, marker);
let xmlDoc = js2xmlparser.parse('EnumerationResults', transformedModel);
res.status(200).send(xmlDoc);
})
.catch((e) => {
console.error('ListContainers operation failed.\n' + JSON.stringify(e));
res.status(500).send();
});
}
_transformContainerList(containers, includeMetadata, prefix, maxresults, marker) {
let xmlContainerListModel = new model.ContainerList();
(prefix === '') ? delete xmlContainerListModel.prefix : xmlContainerListModel.prefix = prefix;
(maxresults === '') ? delete xmlContainerListModel.maxResults : xmlContainerListModel.maxResults = maxresults;
(marker === '') ? delete xmlContainerListModel.marker : xmlContainerListModel.marker = marker;
// Fixme: We do not support markers yet
delete xmlContainerListModel.nextMarker;
for(let container of containers) {
let modelContainer = new model.Container(container.name);
xmlContainerListModel.containers.container.push(modelContainer);
if (!includeMetadata) {
delete modelContainer.metadata;
} else {
this._addMetadata(modelContainer, container.meta_props);
}
modelContainer.properties['Last-Modified'] = container.http_props.lastModified;
modelContainer.properties.ETag = container.http_props.ETag;
}
return xmlContainerListModel;
}
_addMetadata(modelContainer, metaProps) {
Object.keys(metaProps).forEach((key) => {
let value = metaProps[key];
key = key.replace('x-ms-meta-', '');
key = 'metadata-' + key;
modelContainer.metadata[key] = value;
});
}
_addResponseHeaders(res) {
res.set({
'Content-Type': 'application/xml',
'x-ms-version': '2013-08-15',
});
}
}
module.exports = new ListContainers;