@ngageoint/mage.image.service
Version:
Orient images attached to MAGE observations according to EXIF meta-data and generate configurable size thumbnails.
103 lines • 5.99 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
const plugins_api_1 = require("@ngageoint/mage.service/lib/plugins.api");
const plugins_api_observations_1 = require("@ngageoint/mage.service/lib/plugins.api/plugins.api.observations");
const plugins_api_events_1 = require("@ngageoint/mage.service/lib/plugins.api/plugins.api.events");
const plugins_api_db_1 = require("@ngageoint/mage.service/lib/plugins.api/plugins.api.db");
const entities_permissions_1 = require("@ngageoint/mage.service/lib/entities/authorization/entities.permissions");
const processor_1 = require("./processor");
const express_1 = __importDefault(require("express"));
const adapters_db_mongo_1 = require("./adapters.db.mongo");
const adapters_images_sharp_1 = require("./adapters.images.sharp");
const logPrefix = '[mage.image]';
const logMethods = ['log', 'debug', 'info', 'warn', 'error'];
const consoleOverrides = logMethods.reduce((overrides, fn) => {
return Object.assign(Object.assign({}, overrides), { [fn]: {
writable: false,
value: (...args) => {
globalThis.console[fn](new Date().toISOString(), '-', logPrefix, ...args);
}
} });
}, {});
const console = Object.create(globalThis.console, consoleOverrides);
const InjectedServices = {
stateRepo: plugins_api_1.PluginStateRepositoryToken,
eventRepo: plugins_api_events_1.MageEventRepositoryToken,
obsRepoForEvent: plugins_api_observations_1.ObservationRepositoryToken,
attachmentStore: plugins_api_observations_1.AttachmentStoreToken,
getDbConn: plugins_api_db_1.MongooseDbConnectionToken
};
/**
* The MAGE Image Plugin finds images attached to MAGE observations, generates
* thumbnail previews at configurable sizes, and optionally auto-orients the
* images by rotating them based on the EXIF orientation tag so all clients
* display the images correctly.
*/
const imagePluginHooks = {
inject: {
stateRepo: plugins_api_1.PluginStateRepositoryToken,
eventRepo: plugins_api_events_1.MageEventRepositoryToken,
obsRepoForEvent: plugins_api_observations_1.ObservationRepositoryToken,
attachmentStore: plugins_api_observations_1.AttachmentStoreToken,
getDbConn: plugins_api_db_1.MongooseDbConnectionToken,
},
init: (services) => __awaiter(void 0, void 0, void 0, function* () {
console.info('intializing image plugin ...');
const { stateRepo, eventRepo, obsRepoForEvent, attachmentStore, getDbConn } = services;
const queryAttachments = (0, adapters_db_mongo_1.FindUnprocessedAttachments)(getDbConn, console);
const imageService = (0, adapters_images_sharp_1.SharpImageService)();
const control = yield (0, processor_1.createImagePluginControl)(stateRepo, eventRepo, obsRepoForEvent, attachmentStore, queryAttachments, imageService, console);
control.start();
return {
webRoutes: {
protected(requestContext) {
// TODO: add api routes to save image processing settings
const routes = express_1.default.Router()
.use(express_1.default.json())
.use((req, res, next) => __awaiter(this, void 0, void 0, function* () {
const context = requestContext(req);
const user = context.requestingPrincipal();
if (!user.role.permissions.find(x => x === entities_permissions_1.SettingPermission.UPDATE_SETTINGS)) {
return res.status(403).json({ message: 'unauthorized' });
}
next();
}));
routes.route('/config')
.get((req, res, next) => __awaiter(this, void 0, void 0, function* () {
const config = yield control.getConfig();
res.json(config);
}))
.put((req, res, next) => __awaiter(this, void 0, void 0, function* () {
const bodyConfig = req.body;
const configPatch = {
enabled: typeof bodyConfig.enabled === 'boolean' ? bodyConfig.enabled : undefined,
intervalBatchSize: typeof bodyConfig.intervalBatchSize === 'number' ? bodyConfig.intervalBatchSize : undefined,
intervalSeconds: typeof bodyConfig.intervalSeconds === 'number' ? bodyConfig.intervalSeconds : undefined,
thumbnailSizes: Array.isArray(bodyConfig.thumbnailSizes) ?
bodyConfig.thumbnailSizes.reduce((sizes, size) => {
return typeof size === 'number' ? [...sizes, size] : sizes;
}, [])
: []
};
const config = yield control.applyConfig(configPatch);
res.json(config);
}));
return routes;
}
}
};
})
};
module.exports = imagePluginHooks;
//# sourceMappingURL=index.js.map