Skip to content

Commit

Permalink
refactored iiif helper methods and hooks
Browse files Browse the repository at this point in the history
  • Loading branch information
theorm committed Jan 29, 2025
1 parent a810670 commit dbae313
Show file tree
Hide file tree
Showing 10 changed files with 164 additions and 211 deletions.
105 changes: 0 additions & 105 deletions src/hooks/iiif.js

This file was deleted.

70 changes: 70 additions & 0 deletions src/hooks/iiif.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import type { HookContext } from '@feathersjs/feathers'
import Debug from 'debug'
import { ProxyConfig } from '../models/generated/common'
import type { ImpressoApplication } from '../types'

const debug = Debug('impresso/hooks:iiif')

const iiifMapper = (d: Record<string, any>, proxyConfig: ProxyConfig) => {
const _d = {
...d,
}
const host = proxyConfig?.host ?? ''

if (d.pageUid && Array.isArray(d.coords)) {
// fragments matches from SOLR
_d.iiif_fragment = `${host}/proxy/iiif/${d.pageUid}/${d.coords.join(',')}/full/0/default.png`
_d.iiifFragment = _d.iiif_fragment
} else if (!d.labels) {
// non canonical neo4j objects, ignore...
} else if (d.labels.indexOf('issue') !== -1 && d.cover && d.cover.uid) {
// issue with cover page ;)
_d.iiif = `${host}/proxy/iiif/${d.cover.uid}`
_d.iiifThumbnail = `${host}/proxy/iiif/${d.cover.uid}/full/350,/0/default.png`
_d.cover.iiif = `${host}/proxy/iiif/${d.cover.uid}`
_d.cover.iiifThumbnail = `${host}/proxy/iiif/${d.cover.uid}/full/150,/0/default.png`
} else if (d.labels.indexOf('page') !== -1) {
_d.iiif = `${host}/proxy/iiif/${d.uid}`
_d.iiifThumbnail = `${host}/proxy/iiif/${d.uid}/full/150,/0/default.png`
} else if (d.labels.indexOf('iassignIIIFssue') !== -1 && typeof d.cover === 'string') {
_d.iiif = `${host}/proxy/iiif/${d.cover}`
_d.iiifThumbnail = `${host}/proxy/iiif/${d.cover}/full/350,/0/default.png`
}
return _d
}

/**
* @deprecated Not used in any working code.
*/
export const assignIIIF =
(...resultProperties: string[]) =>
async (context: HookContext<ImpressoApplication>) => {
if (!context.result) throw new Error("The 'assignIIIF' hook should only be used with a defined context.result")
if (context.type != 'after') throw new Error("The 'assignIIIF' hook should be used as an after hook only")

const proxyConfig = context.app.get('proxy') ?? {}

const _recursiveReplace = (d: Record<string, any>) => {
const _d = iiifMapper(d, proxyConfig)

resultProperties.forEach(key => {
if (_d[key]) {
if (Array.isArray(_d[key])) {
_d[key] = _d[key].map(item => iiifMapper(item, proxyConfig))
} else if (_d[key].constructor.name === 'Object') {
_d[key] = iiifMapper(_d[key], proxyConfig)
}
}
})
return _d
}
if (context.method === 'find' && context.result.data && context.result.data.length) {
debug(
`proxy: <n. results>: ${context.result.data.length} <host>: ${proxyConfig.host}, <keys>: ${resultProperties}`
)
context.result.data = context.result.data.map(_recursiveReplace)
} else if (context.method === 'get' && typeof context.result.uid !== 'undefined') {
debug(`proxy: <uid>: ${context.result.uid} <host>: ${proxyConfig.host}, <keys>: ${resultProperties}`)
context.result = _recursiveReplace(context.result)
}
}
40 changes: 0 additions & 40 deletions src/hooks/iiifs.js

This file was deleted.

23 changes: 3 additions & 20 deletions src/models/articles.model.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { OpenPermissions } from '../util/bigint'
import { getExternalFragmentUrl } from '../util/iiif'

const { DataTypes } = require('sequelize')
const lodash = require('lodash')
Expand All @@ -14,8 +15,6 @@ const ArticleTopic = require('./articles-topics.model')
const { toHierarchy, sliceAtSplitpoints, render, annotate, toExcerpt } = require('../helpers')
const { getRegionCoordinatesFromDocument } = require('../util/solr')

const { getExternalFragment } = require('../hooks/iiif')

export const ACCESS_RIGHT_NOT_SPECIFIED = 'na'
export const ACCESS_RIGHT_OPEN_PRIVATE = 'OpenPrivate'
export const ACCESS_RIGHT_CLOSED = 'Closed'
Expand Down Expand Up @@ -472,31 +471,15 @@ class Article extends BaseArticle {
//
}

assignIIIF(props = ['regions', 'matches']) {
// get iiif of pages
const pagesIndex = lodash.keyBy(this.pages, 'uid') // d => d.iiif);
props.forEach(prop => {
if (Array.isArray(this[prop])) {
this[prop].forEach((d, i) => {
if (pagesIndex[this[prop][i].pageUid]) {
this[prop][i].iiifFragment = getExternalFragment(pagesIndex[this[prop][i].pageUid].iiif, {
coords: d.coords,
})
}
})
}
})
}

static assignIIIF(article, props = ['regions', 'matches']) {
// get iiif of pages
const pagesIndex = lodash.keyBy(article.pages, 'uid') // d => d.iiif);
props.forEach(prop => {
if (Array.isArray(article[prop])) {
article[prop].forEach((d, i) => {
if (pagesIndex[article[prop][i].pageUid]) {
article[prop][i].iiifFragment = getExternalFragment(pagesIndex[article[prop][i].pageUid].iiif, {
coords: d.coords,
article[prop][i].iiifFragment = getExternalFragmentUrl(pagesIndex[article[prop][i].pageUid].iiif, {
coordinates: d.coords,
})
}
})
Expand Down
4 changes: 2 additions & 2 deletions src/models/images.model.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { OpenPermissions } from '../util/bigint'
import { getExternalFragmentUrl } from '../util/iiif'
import Article from './articles.model'

const Page = require('./pages.model')
const Issue = require('./issues.model')
const Newspaper = require('./newspapers.model')
const { getExternalFragment } = require('../hooks/iiif.js')

class Image {
constructor({
Expand Down Expand Up @@ -63,7 +63,7 @@ class Image {
this.regions = this.pages.map(page => ({
pageUid: page.uid,
coords: this.coords,
iiifFragment: getExternalFragment(page.iiif, { coords: this.coords, dim: '250,' }),
iiifFragment: getExternalFragmentUrl(page.iiif, { coordinates: this.coords, dimension: 250 }),
}))
}

Expand Down
9 changes: 5 additions & 4 deletions src/models/pages.model.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { getJSONUrl, getThumbnailUrl, getExternalThumbnailUrl } from '../util/iiif'
const { DataTypes } = require('sequelize')
const Issue = require('./issues.model')
const ArticleEntity = require('./articles-entities.model')
const ArticleTag = require('./articles-tags.model')
const { getJSON, getThumbnail, getExternalThumbnail } = require('../hooks/iiif.js')
const config = require('@feathersjs/configuration')()()

class Page {
constructor(
Expand Down Expand Up @@ -42,11 +43,11 @@ class Page {

// if any iiif is provided
if (!iiif.length) {
this.iiif = getJSON(this.uid)
this.iiifThumbnail = getThumbnail(this.uid)
this.iiif = getJSONUrl(this.uid, config.proxy)
this.iiifThumbnail = getThumbnailUrl(this.uid, config.proxy)
} else {
this.iiif = String(iiif)
this.iiifThumbnail = getExternalThumbnail(this.iiif)
this.iiifThumbnail = getExternalThumbnailUrl(this.iiif, config.proxy)
}

this.accessRights = accessRights
Expand Down
6 changes: 2 additions & 4 deletions src/services/articles/articles.class.ts
Original file line number Diff line number Diff line change
Expand Up @@ -150,8 +150,7 @@ export class Service {
if (pageUids.length === 1) {
article.regions = article?.regions?.filter((r: { pageUid: string }) => pageUids.indexOf(r.pageUid) !== -1)
}
article.assignIIIF()
return article
return Article.assignIIIF(article)
}),
}))
}
Expand Down Expand Up @@ -207,8 +206,7 @@ export class Service {
}
article.pages = addons.pages.map((d: any) => d.toJSON())
}
article?.assignIIIF?.()
return article
return article != null ? Article.assignIIIF(article) : undefined
})
.catch(err => {
console.error(err)
Expand Down
Loading

0 comments on commit dbae313

Please sign in to comment.