UNPKG

hatena-fotolife-api

Version:

Hatena::Fotolife API wrapper for Node.js (unofficial)

203 lines (182 loc) 5.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Fotolife = void 0; var _fs = _interopRequireDefault(require("fs")); var _mime = _interopRequireDefault(require("mime")); var _request = _interopRequireDefault(require("request")); var _wsse = _interopRequireDefault(require("wsse")); var _xml2js = _interopRequireDefault(require("xml2js")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const rejectE = s => Promise.reject(new Error(s)); const requestPromise = params => { return new Promise((resolve, reject) => { return (0, _request.default)(params, (error, response) => { if (error !== null) return reject(error);else return resolve(response); }); }); }; const xmlStringToObject = xmlString => { return new Promise((resolve, reject) => { const parser = new _xml2js.default.Parser({ explicitArray: false, explicitCharkey: true }); return parser.parseString(xmlString, (error, result) => { if (error !== null) return reject(error);else return resolve(result); }); }); }; const xmlObjectToXmlString = xmlObject => { try { const builder = new _xml2js.default.Builder(); const xmlString = builder.buildObject(xmlObject); return Promise.resolve(xmlString); } catch (error) { return Promise.reject(error); } }; class Fotolife { constructor(options) { this._type = typeof options.type !== "undefined" ? options.type : "wsse"; if (options.type === "oauth") { this._username = null; this._apikey = null; this._consumerKey = options.consumerKey; this._consumerSecret = options.consumerSecret; this._accessToken = options.accessToken; this._accessTokenSecret = options.accessTokenSecret; } else { this._username = options.username; this._apikey = options.apikey; this._consumerKey = null; this._consumerSecret = null; this._accessToken = null; this._accessTokenSecret = null; } } create({ file, folder: folderOrUndefined, generator: generatorOrUndefined, title: titleOrUndefined, type: typeOrUndefined }) { if (!_fs.default.existsSync(file)) return rejectE("options.file does not exist"); return this._request({ body: { entry: Object.assign(Object.assign({ $: { xmlns: "http://purl.org/atom/ns#" }, content: { $: { mode: "base64", type: typeof typeOrUndefined !== "undefined" ? typeOrUndefined : _mime.default.getType(file) }, _: _fs.default.readFileSync(file).toString("base64") }, title: { _: typeof titleOrUndefined !== "undefined" ? titleOrUndefined : "" } }, typeof folderOrUndefined !== "undefined" ? { "dc:subject": { _: folderOrUndefined } } : {}), typeof generatorOrUndefined !== "undefined" ? { generator: { _: generatorOrUndefined } } : {}) }, method: "post", path: "/atom/post", statusCode: 201 }); } update({ id, title }) { return this._request({ body: { entry: { $: { xmlns: "http://purl.org/atom/ns#" }, title: { _: title } } }, method: "put", path: "/atom/edit/" + id, statusCode: 200 }); } destroy({ id }) { return this._request({ method: "delete", path: "/atom/edit/" + id, statusCode: 200 }); } show({ id }) { return this._request({ method: "get", path: "/atom/edit/" + id, statusCode: 200 }); } index() { return this._request({ method: "get", path: "/atom/feed", statusCode: 200 }); } _request({ body, method, path, statusCode }) { const bodyOrNullPromise = typeof body !== "undefined" ? xmlObjectToXmlString(body) : Promise.resolve(null); return bodyOrNullPromise.then(bodyOrNull => { return requestPromise(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, bodyOrNull !== null ? { body: bodyOrNull } : {}), this._type !== "oauth" ? { headers: { Authorization: 'WSSE profile="UsernameToken"', "X-WSSE": (0, _wsse.default)({ password: this._apikey, username: this._username }).getWSSEHeader({ nonceBase64: true }) } } : {}), { method }), this._type === "oauth" ? { oauth: { consumer_key: this._consumerKey, consumer_secret: this._consumerSecret, token: this._accessToken, token_secret: this._accessTokenSecret } } : {}), { url: Fotolife.BASE_URL + path })); }).then(res => { if (res.statusCode !== statusCode) throw new Error("HTTP status code is " + res.statusCode); return xmlStringToObject(res.body); }); } } exports.Fotolife = Fotolife; Fotolife.BASE_URL = "https://f.hatena.ne.jp";