market/src/components/Publish/_utils.ts

144 lines
4.0 KiB
TypeScript
Raw Normal View History

import { mapTimeoutStringToSeconds } from '@utils/ddo'
import { getEncryptedFileUrls } from '@utils/provider'
2021-11-11 12:26:29 +01:00
import { sha256 } from 'js-sha256'
import slugify from 'slugify'
import { FormPublishData } from './_types'
export function getFieldContent(
fieldName: string,
fields: FormFieldContent[]
): FormFieldContent {
return fields.filter((field: FormFieldContent) => field.name === fieldName)[0]
}
function getUrlFileExtension(fileUrl: string): string {
const splittedFileUrl = fileUrl.split('.')
return splittedFileUrl[splittedFileUrl.length - 1]
}
function dateToStringNoMS(date: Date): string {
return date.toISOString().replace(/\.[0-9]{3}Z/, 'Z')
}
function transformTags(value: string): string[] {
const originalTags = value?.split(',')
const transformedTags = originalTags?.map((tag) => slugify(tag).toLowerCase())
return transformedTags
}
export async function transformPublishFormToDdo(
2021-11-11 12:26:29 +01:00
values: FormPublishData,
// Those 2 are only passed during actual publishing process
// so we can always assume if they are not passed, we are on preview.
datatokenAddress?: string,
nftAddress?: string
): Promise<DDO> {
const { metadata, services, user } = values
const { chainId, accountId } = user
const {
type,
name,
description,
tags,
author,
termsAndConditions,
dockerImageCustom,
dockerImageCustomTag,
dockerImageCustomEntrypoint
} = metadata
2021-11-23 16:34:43 +01:00
const { access, files, links, providerUrl, timeout } = services[0]
2021-11-26 11:35:41 +01:00
const did = nftAddress ? `0x${sha256(`${nftAddress}${chainId}`)}` : '0x...'
const currentTime = dateToStringNoMS(new Date())
2021-11-23 16:34:43 +01:00
// Transform from files[0].url to string[] assuming only 1 file
const filesTransformed = files?.length && files[0].valid && [files[0].url]
const linksTransformed = links?.length && links[0].valid && [links[0].url]
2021-11-11 10:22:22 +01:00
const newMetadata: Metadata = {
2021-11-11 10:22:22 +01:00
created: currentTime,
updated: currentTime,
type,
name,
description,
tags: transformTags(tags),
author,
license: 'https://market.oceanprotocol.com/terms',
2021-11-23 16:34:43 +01:00
links: linksTransformed,
2021-11-11 10:22:22 +01:00
additionalInformation: {
termsAndConditions
},
...(type === 'algorithm' && {
2021-11-26 11:35:41 +01:00
// TODO: This needs some set of predefined values for `container`,
// depending on user selection in the form.
2021-11-11 10:22:22 +01:00
algorithm: {
language: files?.length ? getUrlFileExtension(filesTransformed[0]) : '',
2021-11-11 10:22:22 +01:00
version: '0.1',
container: {
entrypoint: dockerImageCustomEntrypoint,
image: dockerImageCustom,
tag: dockerImageCustomTag,
checksum: '' // TODO: how to get? Is it user input?
2021-11-11 10:22:22 +01:00
}
}
})
}
2021-11-26 11:35:41 +01:00
// Encrypt just created string[] of urls
2021-11-23 16:34:43 +01:00
const filesEncrypted =
files?.length &&
files[0].valid &&
2021-11-25 15:20:00 +01:00
(await getEncryptedFileUrls(
filesTransformed,
providerUrl.url,
did,
accountId
))
2021-11-23 16:34:43 +01:00
const newService: Service = {
type: access,
2021-11-23 16:34:43 +01:00
files: filesEncrypted || '',
2021-11-11 12:26:29 +01:00
datatokenAddress,
2021-11-25 15:20:00 +01:00
serviceEndpoint: providerUrl.url,
timeout: mapTimeoutStringToSeconds(timeout),
2021-11-11 10:22:22 +01:00
...(access === 'compute' && {
2021-11-26 11:35:41 +01:00
// TODO: get all the default values we want to send here.
2021-11-11 10:22:22 +01:00
compute: {
namespace: 'ocean-compute',
2021-11-11 10:22:22 +01:00
cpu: 1,
gpu: 1,
gpuType: '',
memory: '',
volumeSize: '',
allowRawAlgorithm: false,
allowNetworkAccess: false,
publisherTrustedAlgorithmPublishers: null,
publisherTrustedAlgorithms: null
}
})
}
const newDdo: DDO = {
2021-11-11 09:55:35 +01:00
'@context': ['https://w3id.org/did/v1'],
2021-11-11 12:26:29 +01:00
id: did,
version: '4.0.0',
chainId,
metadata: newMetadata,
services: [newService],
2021-11-26 11:35:41 +01:00
// Only added for DDO preview, reflecting Asset response,
// again, we can assume if `datatokenAddress` is not passed,
// we are on preview.
...(!datatokenAddress && {
dataTokenInfo: {
name: values.services[0].dataTokenOptions.name,
symbol: values.services[0].dataTokenOptions.symbol
},
nft: {
owner: accountId
}
})
}
return newDdo
}