# Hämta relaterad information

Exempel på hur man kan hämta ut relaterad metadata från en nod och hantera de olika typerna av värden som kan förekomma.

**server/getRelatedMetadata.js**

```js
import ScriptUtil from '@sitevision/api/server/ScriptUtil';
import Properties from '@sitevision/api/server/Properties';
import MetadataUtil from '@sitevision/api/server/MetadataUtil';
import InstanceTypeUtil from '@sitevision/api/server/InstanceTypeUtil';
import NodeTypeUtil from '@sitevision/api/server/NodeTypeUtil';


function isLink(value) {
  return InstanceTypeUtil.isNode(value) && NodeTypeUtil.isLink(value);
}


function isUser(value) {
  return InstanceTypeUtil.isNode(value)
    && NodeTypeUtil.isTypeOf(value, [NodeTypeUtil.USER_TYPE, NodeTypeUtil.SIMPLE_USER_TYPE]);
}


function isFile(value) {
  return InstanceTypeUtil.isNode(value)
    && NodeTypeUtil.isLink(value)
    && ['FILE', 'IMAGE'].includes(Properties.get(value, 'linkType'));
}


function createLinkData(node) {
  const uri = Properties.get(node, 'rawURI');
  const isExternal = Properties.get(node, 'linkType') === 'EXTERNAL';
  const isNewWindow = Properties.get(node, 'openInNewWindow');


  return {
    id: node.getIdentifier(),
    name: Properties.get(node, 'displayName'),
    uri,
    isExternal,
    isNewWindow,
    assistiveText: [
      Properties.get(node, 'description'),
      isExternal && 'länk till annan webbplats',
      isNewWindow && 'öppnas i nytt fönster',
    ].filter(Boolean).join(', '),
    type: 'link',
  };
}


function createFileData(node) {
  const uri = Properties.get(node, 'rawURI');
  const fileName = Properties.get(uri, 'fileName') || Properties.get(uri, 'displayName');
  const isNewWindow = Properties.get(node, 'openInNewWindow');
  const extension = fileName?.split('.')?.pop();
  const size = ScriptUtil.getHumanPresentableSize(Properties.get(uri, 'length'))?.replace(' ', '');
  return {
    id: node.getIdentifier(),
    name: Properties.get(node, 'displayName'),
    uri: Properties.get(node, 'rawURI'),
    size,
    isNewWindow,
    assistiveText: [
      Properties.get(node, 'description'),
      extension,
      size,
      isNewWindow && 'öppnas i nytt fönster',
    ].filter(Boolean).join(', '),
    type: 'file',
  };
}


function createUserData(node) {
  return {
    id: node.getIdentifier(),
    name: Properties.get(node, 'displayName'),
    uri: `mailto:${Properties.get(node, 'mail')}`,
    icon: 'bi-person',
    type: 'user',
  };
}


function createData(value) {
  if (isUser(value)) {
    return createUserData(value);
  }
  if (isFile(value)) {
    return createFileData(value);
  }
  if (isLink(value)) {
    return createLinkData(value);
  }


  return { name: value };
}


export default function getRelatedMetadata(node, metadata) {
  return MetadataUtil
    .getRelatedMetadataPropertyValues(node, metadata)
    .toArray()
    .map(createData);
}
```

Exempel på användning:

**index.js**

```js
import router from '@sitevision/api/common/router';
import appData from '@sitevision/api/server/appData';
import PortletContextUtil from '@sitevision/api/server/PortletContextUtil';


import getRelatedMetadata from './server/getRelatedMetadata';


router.get('/', (req, res) => {
  const currentPage = PortletContextUtil.getCurrentPage();
  const metadata = appData.get('relatedMetadata', 'name');
  const relatedMetadata = getRelatedMetadata(currentPage, metadata);
  // Do something with relatedMetadata
});
```