From 46fdb975c5337561072a1462aceb2d43104172a8 Mon Sep 17 00:00:00 2001 From: Timothy Farrell Date: Sun, 19 Nov 2017 22:52:35 -0600 Subject: [PATCH] Deleting images deletes companion files. and cleaner logging. --- packages/gallery/src/data/image.js | 69 ++++++++++++++++----------- packages/gallery/src/services/db.js | 4 +- packages/gallery/src/utils/watcher.js | 6 ++- 3 files changed, 47 insertions(+), 32 deletions(-) diff --git a/packages/gallery/src/data/image.js b/packages/gallery/src/data/image.js index 8e4789c..3943474 100644 --- a/packages/gallery/src/data/image.js +++ b/packages/gallery/src/data/image.js @@ -6,7 +6,7 @@ import { FileType } from './file.js'; class ImageSpec extends TypeSpec { static async upload(blob) { const f = await FileType.upload(blob, false); - return await ImageType.getOrCreate({ + const doc = await ImageType.getOrCreate({ digest: f.digest, originalDate: f.lastModified, importing: true, @@ -16,6 +16,8 @@ class ImageSpec extends TypeSpec { full: FileType.getURL(f) } }); + processImportables(doc); + return doc; } static getUniqueID(doc) { @@ -25,6 +27,16 @@ class ImageSpec extends TypeSpec { static getSequence(doc) { return new Date(doc.originalDate).getTime(); } + + async delete(cascade = true) { + if (cascade) { + Object.keys(this.sizes).forEach(async key => { + const f = await FileType.getDocFromURL(this.sizes[key]); + f.delete(); + }); + } + return await this.update({ _deleted: true }); + } // // static validate(doc) { // // TODO actually validate perhaps against a JSON schema @@ -63,12 +75,7 @@ class ImageSpec extends TypeSpec { // } } -const processImportables = backgroundTask(async function _processImportables(importables) { - if (!importables.length) { - return; - } - - const image = importables[0]; +const processImportables = backgroundTask(async function _processImportables(image) { const { _id, _rev } = image; const imageData = await FileType.getFromURL(image.sizes.full); @@ -79,35 +86,39 @@ const processImportables = backgroundTask(async function _processImportables(imp const exifData = ExifParser.create(buffer).parse(); const { tags, imageSize } = exifData; const { width, height } = imageSize; + const { sizes, digest } = image; const originalDate = new Date( tags.DateTimeOriginal ? new Date(tags.DateTimeOriginal * 1000).toISOString() : image.originalDate ).toISOString(); - const img = await ImageType.getOrCreate({ - originalDate, - width, - height, - orientation: tags.Orientation, - digest: image.digest, - make: tags.Make, - model: tags.Model, - flash: !!tags.Flash, - iso: tags.ISO, - sizes: image.sizes, - gps: { - latitude: tags.GPSLatitude, - longitude: tags.GPSLongitude, - altitude: tags.GPSAltitude, - heading: tags.GPSImgDirection - } - }); - - image.delete(); + await image.update( + { + originalDate, + width, + height, + orientation: tags.Orientation, + digest, + make: tags.Make, + model: tags.Model, + flash: !!tags.Flash, + iso: tags.ISO, + sizes, + gps: { + latitude: tags.GPSLatitude, + longitude: tags.GPSLongitude, + altitude: tags.GPSAltitude, + heading: tags.GPSImgDirection + } + }, + false + ); + delete image.importing; + await image.save(); const module = await import('../context/generateThumbnails'); - await module.generateThumbnailForImage(img); + module.generateThumbnailForImage(image); }, false); export const ImageType = PouchDB.registerType('Image', ImageSpec); -ImageType.find({ importing: true }, true).then(fw => fw.subscribe(processImportables)); +ImageType.find({ importing: true }).then(results => results.forEach(processImportables)); diff --git a/packages/gallery/src/services/db.js b/packages/gallery/src/services/db.js index 23493a6..faa5fd1 100644 --- a/packages/gallery/src/services/db.js +++ b/packages/gallery/src/services/db.js @@ -132,7 +132,9 @@ export function PouchORM(PouchDB) { Object.defineProperties(cls, { getOrCreate: { value: getOrCreate }, - find: { value: find } + find: { value: find }, + db: { value: _db }, + name: { value: name } }); return cls; diff --git a/packages/gallery/src/utils/watcher.js b/packages/gallery/src/utils/watcher.js index d72b514..7b56c1d 100644 --- a/packages/gallery/src/utils/watcher.js +++ b/packages/gallery/src/utils/watcher.js @@ -8,7 +8,7 @@ export function Watcher(db, selector, include_docs) { subscribers.add(fn); if (subscribers.size === 1 && !changes) { - log('Watching:', db, selector); + log(`Watching "${db.name}" for ${JSON.stringify(selector)}`); changes = db .changes({ since: 'now', @@ -17,8 +17,10 @@ export function Watcher(db, selector, include_docs) { selector }) .on('change', change => { - log('changed:', change); const { id, deleted, doc } = change; + log( + `Change from "${db.name}" for ${JSON.stringify(selector)} ${id} ${deleted ? 'deleted' : ''}` + ); subscribers.forEach(s => s(id, !!deleted, doc)); }) .on('error', err => {