Opetushallitus/eperusteet-frontend-utils

View on GitHub
vue/src/plugins/oikeustarkastelu.ts

Summary

Maintainability
A
1 hr
Test Coverage
import Vue from 'vue';
import _ from 'lodash';
import { Oikeus } from '../tyypit';
import { Computed } from '../utils/interfaces';

const DisableTags = ['input', 'button'];

export interface IOikeusProvider {
  hasOikeus: (oikeus: Oikeus, kohde?: any) => boolean;
  isAdmin?: Computed<boolean>;
  hasOphCrud?: Computed<boolean>;
  casKayttaja: Computed<any>;
  sovellusOikeudet: Computed<SovellusOikeus[]>;
  logoutUrl?: Computed<string>;
}

export interface OikeustarkasteluConfig {
  oikeusProvider: IOikeusProvider;
}

declare module 'vue/types/vue' {
  interface Vue {
    $hasOikeus: (oikeus: Oikeus, kohde?: any) => boolean;
    $isAdmin: () => boolean;
    $hasOphCrud: () => boolean;
  }
}

export class Oikeustarkastelu {
  public static install(vue: typeof Vue, config: OikeustarkasteluConfig) {
    vue.prototype.$isAdmin = () => config.oikeusProvider.isAdmin?.value || false;
    vue.prototype.$hasOphCrud = () => config.oikeusProvider.hasOphCrud?.value || false;

    vue.prototype.$hasOikeus = function(oikeus: Oikeus, kohde?: any) {
      return config.oikeusProvider.hasOikeus(oikeus, kohde);
    };

    // Sisällön kääntäminen
    vue.directive('oikeustarkastelu', (el: any, binding) => {
      // Hide the element before rights have been resolved
      if (!el.oldDisplayValue && el.style.display !== 'none') {
        el.oldDisplayValue = el.style.display;
      }

      el.style.display = 'none';

      let value = binding.value || 'luku';
      let kohde: any;
      if (_.isObject(value)) {
        kohde = (value as any).kohde;
        value = (value as any).oikeus;
      }

      if (config.oikeusProvider.hasOikeus(value, kohde)) {
        el.style.display = el.oldDisplayValue;
      }
      else {
        const { tagName } = el;
        if (_.includes(DisableTags, _.toLower(tagName))) {
          (el as HTMLInputElement).disabled = true;
          el.style.display = el.oldDisplayValue;
        }
      }
    });
  }
}

export interface SovellusOikeus {
  eperusteSovellus: EperusteSovellus;
  valittu: boolean;
}

export interface EperusteSovellus {
  sovellus: string;
  url: string;
}

export const EPERUSTEET_SOVELLUKSET = [
  {
    sovellus: 'APP_EPERUSTEET',
    url: '/eperusteet-service/ui',
  },
  {
    sovellus: 'APP_EPERUSTEET_YLOPS',
    url: '/eperusteet-ylops-service/ui',
  },
  {
    sovellus: 'APP_EPERUSTEET_AMOSAA',
    url: '/eperusteet-amosaa-service/ui/#/ammatillinen',
  },
  {
    sovellus: 'APP_EPERUSTEET_VST',
    url: '/eperusteet-amosaa-service/ui/#/vapaasivistystyo',
  },
  {
    sovellus: 'APP_EPERUSTEET_TUVA',
    url: '/eperusteet-amosaa-service/ui/#/tutkintoonvalmentava',
  },
  {
    sovellus: 'APP_EPERUSTEET_KOTO',
    url: '/eperusteet-amosaa-service/ui/#/kotoutumiskoulutus',
  },
];

export function getSovellusoikeudet(casRoles: string[], valittuSovellus: string): SovellusOikeus[] {
  const toSovellusOikeus = (eperusteSovellus) => ({
    eperusteSovellus,
    valittu: valittuSovellus === eperusteSovellus.sovellus,
  });

  const origin = window.location.origin;
  if (_.includes(origin, 'localhost')) {
    return _.map(EPERUSTEET_SOVELLUKSET, eperusteSovellus => toSovellusOikeus(eperusteSovellus));
  }
  else {
    return _.chain(casRoles)
      .filter(casRole => _.includes(_.map(EPERUSTEET_SOVELLUKSET, 'sovellus'), casRole))
      .map(sovellus => _.find(EPERUSTEET_SOVELLUKSET, eSovellus => eSovellus.sovellus === sovellus))
      .map(sovellus => toSovellusOikeus(sovellus))
      .value();
  }
}

export const OIKEUS_KAANNOT = {
  'READ': 'luku',
  'READ_UPDATE': 'muokkaus',
  'CRUD': 'luonti',
  'ADMIN': 'hallinta',
};

export const EPERUSTEET_KOULUTUSTYYPPI_PAIKALLISET_SOVELLUKSET = {
  'koulutustyyppi_1': 'APP_EPERUSTEET_AMOSAA', // ammatillinen perustutkinto
  'koulutustyyppi_2': 'APP_EPERUSTEET_YLOPS', // lukiokoulutus
  'koulutustyyppi_5': 'APP_EPERUSTEET_AMOSAA', // telma
  'koulutustyyppi_6': 'APP_EPERUSTEET_YLOPS', // lisaopetus
  'koulutustyyppi_11': 'APP_EPERUSTEET_AMOSAA', // ammattitutkinto
  'koulutustyyppi_12': 'APP_EPERUSTEET_AMOSAA', // erikoisammattitutkinto
  'koulutustyyppi_14': 'APP_EPERUSTEET_YLOPS', // aikuisten lukiokoulutus
  'koulutustyyppi_15': 'APP_EPERUSTEET_YLOPS', // esiopetus
  'koulutustyyppi_16': 'APP_EPERUSTEET_YLOPS', // perusopetus
  'koulutustyyppi_17': 'APP_EPERUSTEET_YLOPS', // aikuisten perusopetus
  'koulutustyyppi_18': 'APP_EPERUSTEET_AMOSAA', // valma
  'koulutustyyppi_20': 'APP_EPERUSTEET_YLOPS', // varhaiskasvatus
  'koulutustyyppi_22': 'APP_EPERUSTEET_YLOPS', // perusopetuksen valmistava
  'koulutustyyppi_23': 'APP_EPERUSTEET_YLOPS', // valmistava lukiokoulutus
  'koulutustyyppi_999907': 'APP_EPERUSTEET_YLOPS', // taiteen perusopetus,
  'koulutustyyppi_10': 'APP_EPERUSTEET_VST', // vapaa sivistystyo
  'koulutustyyppi_30': 'APP_EPERUSTEET_KOTO', // aikuisten maahanmuuttajien kotoutumiskoulutus
  'koulutustyyppi_35': 'APP_EPERUSTEET_VST', // vapaa sivistystyo lukutaito
  'koulutustyyppi_40': 'APP_EPERUSTEET_TUVA', // tutkintoon valmentava
};