0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-02-03 23:00:14 -05:00
ghost/core/server/data/export/index.js
Katharina Irrgang 1882278b5b 🎨 configurable logging with bunyan (#7431)
- 🛠  add bunyan and prettyjson, remove morgan

-   add logging module
  - GhostLogger class that handles setup of bunyan
  - PrettyStream for stdout

-   config for logging
  - @TODO: testing level fatal?

-   log each request via GhostLogger (express middleware)
  - @TODO: add errors to output

- 🔥  remove errors.updateActiveTheme
  - we can read the value from config

- 🔥  remove 15 helper functions in core/server/errors/index.js
  - all these functions get replaced by modules:
    1. logging
    2. error middleware handling for html/json
    3. error creation (which will be part of PR #7477)

-   add express error handler for html/json
  - one true error handler for express responses
  - contains still some TODO's, but they are not high priority for first implementation/integration
  - this middleware only takes responsibility of either rendering html responses or return json error responses

- 🎨  use new express error handler in middleware/index
  - 404 and 500 handling

- 🎨  return error instead of error message in permissions/index.js
  - the rule for error handling should be: if you call a unit, this unit should return a custom Ghost error

- 🎨  wrap serve static module
  - rule: if you call a module/unit, you should always wrap this error
  - it's always the same rule
  - so the caller never has to worry about what comes back
  - it's always a clear error instance
  - in this case: we return our notfounderror if serve static does not find the resource
  - this avoid having checks everywhere

- 🎨  replace usages of errors/index.js functions and adapt tests
  - use logging.error, logging.warn
  - make tests green
  - remove some usages of logging and throwing api errors -> because when a request is involved, logging happens automatically

- 🐛  return errorDetails to Ghost-Admin
  - errorDetails is used for Theme error handling

- 🎨  use 500er error for theme is missing error in theme-handler

- 🎨  extend file rotation to 1w
2016-10-04 16:33:43 +01:00

85 lines
2.4 KiB
JavaScript

var _ = require('lodash'),
Promise = require('bluebird'),
db = require('../../data/db'),
commands = require('../schema').commands,
versioning = require('../schema').versioning,
serverUtils = require('../../utils'),
errors = require('../../errors'),
logging = require('../../logging'),
settings = require('../../api/settings'),
i18n = require('../../i18n'),
excludedTables = ['accesstokens', 'refreshtokens', 'clients', 'client_trusted_domains'],
modelOptions = {context: {internal: true}},
// private
getVersionAndTables,
exportTable,
// public
doExport,
exportFileName;
exportFileName = function exportFileName() {
var datetime = (new Date()).toJSON().substring(0, 10),
title = '';
return settings.read(_.extend({}, {key: 'title'}, modelOptions)).then(function (result) {
if (result) {
title = serverUtils.safeString(result.settings[0].value) + '.';
}
return title + 'ghost.' + datetime + '.json';
}).catch(function (err) {
logging.error(err);
return 'ghost.' + datetime + '.json';
});
};
getVersionAndTables = function getVersionAndTables() {
var props = {
version: versioning.getDatabaseVersion(),
tables: commands.getTables()
};
return Promise.props(props);
};
exportTable = function exportTable(tableName) {
if (excludedTables.indexOf(tableName) < 0) {
return db.knex(tableName).select();
}
};
doExport = function doExport() {
var tables, version;
return getVersionAndTables().then(function exportAllTables(result) {
tables = result.tables;
version = result.version;
return Promise.mapSeries(tables, exportTable);
}).then(function formatData(tableData) {
var exportData = {
meta: {
exported_on: new Date().getTime(),
version: version
},
data: {
// Filled below
}
};
_.each(tables, function (name, i) {
exportData.data[name] = tableData[i];
});
return exportData;
}).catch(function (err) {
return Promise.reject(new errors.InternalServerError(err.message, i18n.t('errors.data.export.errorExportingData')));
});
};
module.exports = {
doExport: doExport,
fileName: exportFileName
};