Skip to content
Snippets Groups Projects
Unverified Commit 32dd9ab4 authored by Jack Reed's avatar Jack Reed Committed by GitHub
Browse files

Merge pull request #3254 from ProjectMirador/auth-refactor

Consolidate IIIF auth behaviors
parents b15cbb61 6653ec3d
No related branches found
No related tags found
No related merge requests found
import { createSelector } from 'reselect';
import { Utils } from 'manifesto.js/dist-esmodule/Utils';
import flatten from 'lodash/flatten';
import CanvasGroupings from '../../lib/CanvasGroupings';
import MiradorCanvas from '../../lib/MiradorCanvas';
......@@ -206,100 +205,3 @@ export const selectInfoResponse = createSelector(
&& infoResponses[iiifServiceId];
},
);
const authServiceProfiles = {
clickthrough: true, external: true, kiosk: true, login: true,
};
/**
*
*/
export function selectNextAuthService({ auth }, resource, filter = authServiceProfiles) {
const orderedAuthServiceProfiles = [
'http://iiif.io/api/auth/1/external',
'http://iiif.io/api/auth/1/kiosk',
'http://iiif.io/api/auth/1/clickthrough',
'http://iiif.io/api/auth/1/login',
];
const mapFilterToProfiles = {
'http://iiif.io/api/auth/1/clickthrough': 'clickthrough',
'http://iiif.io/api/auth/1/external': 'external',
'http://iiif.io/api/auth/1/kiosk': 'kiosk',
'http://iiif.io/api/auth/1/login': 'login',
};
for (const profile of orderedAuthServiceProfiles) {
const services = getServices(resource, profile);
for (const service of services) {
if (!auth[service.id]) {
return filter[mapFilterToProfiles[profile]] && service;
}
if (auth[service.id].isFetching || auth[service.id].ok) return null;
}
}
return null;
}
/** */
export function selectActiveAuthService(state, resource) {
const orderedAuthServiceProfiles = [
'http://iiif.io/api/auth/1/login',
'http://iiif.io/api/auth/1/clickthrough',
'http://iiif.io/api/auth/1/kiosk',
'http://iiif.io/api/auth/1/external',
];
for (const profile of orderedAuthServiceProfiles) {
const services = getServices(resource, profile);
const service = services.find(s => selectAuthStatus(state, s));
if (service) return service;
}
return null;
}
export const selectCanvasAuthService = createSelector(
[
selectInfoResponse,
state => state,
],
(infoResponse, state) => {
const resource = infoResponse && infoResponse.json;
if (!resource) return undefined;
return selectNextAuthService(state, resource)
|| selectActiveAuthService(state, resource);
},
);
export const selectLogoutAuthService = createSelector(
[
selectInfoResponse,
state => state,
],
(infoResponse, state) => {
if (!infoResponse) return undefined;
const authService = selectActiveAuthService(state, infoResponse.json);
if (!authService) return undefined;
return authService.getService('http://iiif.io/api/auth/1/logout');
},
);
/** */
export function selectAuthStatus({ auth }, service) {
if (!service) return null;
if (!auth[service.id]) return null;
if (auth[service.id].isFetching) return 'fetching';
if (auth[service.id].ok) return 'ok';
return 'failed';
}
/** Get all the services that match a profile */
function getServices(resource, profile) {
const services = Utils.getServices({ ...resource, options: {} });
return services.filter(service => service.getProfile() === profile);
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment