Skip to content

Commit

Permalink
Merge pull request #3 from carboneio/manage_object_metadata
Browse files Browse the repository at this point in the history
Manage object metadata
  • Loading branch information
steevepay authored Apr 2, 2022
2 parents 4944fd3 + d97de9c commit 2202058
Show file tree
Hide file tree
Showing 6 changed files with 1,333 additions and 12 deletions.
6 changes: 5 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
### v0.2.0
- Add function `setFileMetadata` to create or replace object metadata
- Add function `getFileMetadata` to get an object metadata
- Update package `debug` to `4.3.4`
### v0.1.9
- Update `simple-get` node dep to `4.0.1`
- Update package `simple-get` to `4.0.1`

### v0.1.8
- Fix the `downloadFile` callback function, the third argument is now always returning the response header of the request.
Expand Down
40 changes: 40 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,46 @@ storage.listFiles('templates', { queries: { prefix: 'prefixName' }, headers: { A
});
```
### Get file metadata
```js
storage.getFileMetadata('templates', 'filename.jpg', (err, headers) => {
if (err) {
// handle error
}
/**
* Returned headers: {
* Content-Length: 14
* Accept-Ranges: bytes
* Last-Modified: Thu, 16 Jan 2014 21:12:31 GMT
* Etag: 451e372e48e0f6b1114fa0724aa79fa1
* X-Timestamp: 1389906751.73463
* X-Object-Meta-Book: GoodbyeColumbus
* Content-Type: application/octet-stream
* X-Trans-Id: tx37ea34dcd1ed48ca9bc7d-0052d84b6f
* X-Openstack-Request-Id: tx37ea34dcd1ed48ca9bc7d-0052d84b6f
* Date: Thu, 16 Jan 2014 21:13:19 GMT
* X-Object-Meta-Custom-Metadata-1: Value
* X-Object-Meta-Custom-Metadata-2: Value
* }
* // Details: https://docs.openstack.org/api-ref/object-store/?expanded=show-object-metadata-detail#show-object-metadata
*/
});
```
### Set file metadata
```js
storage.setFileMetadata('templates', 'filename.jpg', { headers: { 'Content-Type': 'image/jpeg', 'X-Object-Meta-LocationOrigin': 'Paris/France', 'X-Delete-At': 1440619048 }} (err, headers) => {
if (err) {
// handle error
}
// success
// console.log(headers['X-Object-Meta-name'])
// list of headers: https://docs.openstack.org/api-ref/object-store/?expanded=show-object-metadata-detail#show-object-metadata
});
```
### Log
The package uses debug to print logs into the terminal. To activate logs, you must pass the `DEBUG=*` environment variable.
Expand Down
116 changes: 116 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,114 @@ function deleteFile (container, filename, callback) {
});
}

/**
* @description Get object metadata
*
* @param {string} container Container name
* @param {string} filename filename to store
* @param {function} callback function(err, headers):void = The `err` argument is null by default, return an object if an error occurs.
* @returns {void}
*/
function getFileMetadata(container, filename, callback) {
const arrayArguments = [...arguments, { originStorage : _config.actifStorage }];

get.concat({
url : `${_config.endpoints.url}/${container}/${filename}`,
method : 'HEAD',
headers : {
'X-Auth-Token' : _config.token,
Accept : 'application/json'
},
timeout: _config.timeout
}, (err, res) => {

/** Manage special errors: timeouts, too many redirects or any unexpected behavior */
res = res || {};
res.error = err && err.toString().length > 0 ? err.toString() : null;

checkIsConnected(res, 'getFileMetadata', arrayArguments, (error) => {
if (error) {
return callback(error);
}

if (res && res.statusCode === 404) {
return callback(new Error('File does not exist'));
}

err = err || checkResponseError(res);

/** TODO: remove? it should never happen as every error switch to another storage */
if (err) {
return callback(err);
}

return callback(null, res.headers);
});
});
}

/**
* @description Create or update object metadata.
* @description To create or update custom metadata
* @description use the X-Object-Meta-name header,
* @description where name is the name of the metadata item.
*
* @param {string} container Container name
* @param {string} filename file to store
* @param {string|Buffer} localPathOrBuffer absolute path to the file
* @param {Object} options { headers: {}, queries: {} } List of query parameters and headers: https://docs.openstack.org/api-ref/object-store/?expanded=create-or-update-object-metadata-detail#create-or-update-object-metadata
* @param {function} callback function(err, headers):void = The `err` is null by default, return an object if an error occurs.
* @returns {void}
*/
function setFileMetadata (container, filename, options, callback) {

const arrayArguments = [...arguments];

if (callback === undefined) {
callback = options;
arrayArguments.push(options);
options = { headers: {}, queries: {} };
arrayArguments[3] = options;
}

arrayArguments.push({ originStorage : _config.actifStorage })

const { headers, queries } = getHeaderAndQueryParameters(options);
get.concat({
url : `${_config.endpoints.url}/${container}/${filename}${queries}`,
method : 'POST',
headers : {
'X-Auth-Token' : _config.token,
Accept : 'application/json',
...headers
},
timeout: _config.timeout
}, (err, res) => {

/** Manage special errors: timeouts, too many redirects or any unexpected behavior */
res = res || {};
res.error = err && err.toString().length > 0 ? err.toString() : null;

checkIsConnected(res, 'setFileMetadata', arrayArguments, (error) => {
if (error) {
return callback(error);
}

if (res && res.statusCode === 404) {
return callback(new Error('File does not exist'));
}

err = err || checkResponseError(res);

/** TODO: remove? it should never happen as every error switch to another storage */
if (err) {
return callback(err);
}
return callback(null, res.headers);
});
});
}

/**
* @description Check the response status code and return an Error.
*
Expand Down Expand Up @@ -374,6 +482,12 @@ function checkIsConnected (response, from, args, callback) {
case 'listFiles':
listFiles.apply(null, args);
break;
case 'getFileMetadata':
getFileMetadata.apply(null, args);
break;
case 'setFileMetadata':
setFileMetadata.apply(null, args);
break;
default:
/** TODO: remove? it should never happen */
callback(null);
Expand Down Expand Up @@ -474,6 +588,8 @@ module.exports = (config) => {
downloadFile,
deleteFile,
listFiles,
getFileMetadata,
setFileMetadata,
setTimeout,
setStorages,
getStorages,
Expand Down
18 changes: 9 additions & 9 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "high-availability-object-storage",
"version": "0.1.9",
"version": "0.2.0",
"description": "High available, performant, and tiny Node SDK for OpenStack Swift Object Storage",
"main": "index.js",
"scripts": {
Expand All @@ -22,7 +22,7 @@
"author": "Steevepay",
"license": "Apache-2.0",
"dependencies": {
"debug": "=4.3.3",
"debug": "=4.3.4",
"simple-get": "=4.0.1"
},
"devDependencies": {
Expand Down
Loading

0 comments on commit 2202058

Please sign in to comment.