import { Map as ImmutableMap, List as ImmutableList, Set as ImmutableSet, fromJS, } from 'immutable'; import trimStart from 'lodash/trimStart'; export type Config = ImmutableMap; export type Policy = ImmutableMap; const find = ( configs: ImmutableList, group: string, key: string, ): Config | undefined => { return configs.find(config => config.isSuperset(ImmutableMap({ group, key })), ); }; const toSimplePolicy = (configs: ImmutableList): Policy => { const config = find(configs, ':pleroma', ':mrf_simple'); const reducer = (acc: ImmutableMap, curr: ImmutableMap) => { const key = curr.getIn(['tuple', 0]) as string; const hosts = curr.getIn(['tuple', 1]) as ImmutableList; return acc.set(trimStart(key, ':'), ImmutableSet(hosts)); }; if (config?.get) { const value = config.get('value', ImmutableList()); return value.reduce(reducer, ImmutableMap()); } else { return ImmutableMap(); } }; const fromSimplePolicy = (simplePolicy: Policy): ImmutableList => { const mapper = (hosts: ImmutableList, key: string) => fromJS({ tuple: [`:${key}`, hosts.toJS()] }); const value = simplePolicy.map(mapper).toList(); return ImmutableList([ ImmutableMap({ group: ':pleroma', key: ':mrf_simple', value, }), ]); }; export const ConfigDB = { find, toSimplePolicy, fromSimplePolicy, }; export default ConfigDB;