UNPKG

@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
"use strict"; 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