diff --git a/integration/ocean/AssetOwners.test.ts b/integration/ocean/AssetOwners.test.ts index cef85a5..01c73be 100644 --- a/integration/ocean/AssetOwners.test.ts +++ b/integration/ocean/AssetOwners.test.ts @@ -77,9 +77,11 @@ describe('Asset Owners', () => { ) } catch {} + const accessService = ddo.findServiceByType('access') + await ocean.assets.order( ddo.id, - ddo.findServiceByType('access').serviceDefinitionId, + accessService.index, account2 ) // Access granted diff --git a/integration/ocean/ConsumeAsset.test.ts b/integration/ocean/ConsumeAsset.test.ts index 105d72b..debfdf5 100644 --- a/integration/ocean/ConsumeAsset.test.ts +++ b/integration/ocean/ConsumeAsset.test.ts @@ -68,7 +68,7 @@ describe('Consume Asset', () => { serviceAgreementSignatureResult = await ocean.agreements.prepare( ddo.id, - accessService.serviceDefinitionId, + accessService.index, consumer ) @@ -91,7 +91,7 @@ describe('Consume Asset', () => { const success = await ocean.agreements.create( ddo.id, serviceAgreementSignatureResult.agreementId, - accessService.serviceDefinitionId, + accessService.index, serviceAgreementSignatureResult.signature, consumer, publisher @@ -115,7 +115,7 @@ describe('Consume Asset', () => { it('should lock the payment by the consumer', async () => { const paid = await ocean.agreements.conditions.lockReward( serviceAgreementSignatureResult.agreementId, - ddo.findServiceByType('metadata').metadata.main.price, + ddo.findServiceByType('metadata').attributes.main.price, consumer ) @@ -162,7 +162,7 @@ describe('Consume Asset', () => { const path = await ocean.assets.consume( serviceAgreementSignatureResult.agreementId, ddo.id, - accessService.serviceDefinitionId, + accessService.index, consumer, folder ) @@ -189,7 +189,7 @@ describe('Consume Asset', () => { const path = await ocean.assets.consume( serviceAgreementSignatureResult.agreementId, ddo.id, - accessService.serviceDefinitionId, + accessService.index, consumer, folder, 1 diff --git a/integration/ocean/ConsumeAssetBrizo.test.ts b/integration/ocean/ConsumeAssetBrizo.test.ts index 4d48411..c2beb4f 100644 --- a/integration/ocean/ConsumeAssetBrizo.test.ts +++ b/integration/ocean/ConsumeAssetBrizo.test.ts @@ -61,7 +61,7 @@ describe('Consume Asset (Brizo)', () => { const steps = [] agreementId = await ocean.assets - .order(ddo.id, accessService.serviceDefinitionId, consumer) + .order(ddo.id, accessService.index, consumer) .next(step => steps.push(step)) assert.isDefined(agreementId) @@ -75,7 +75,7 @@ describe('Consume Asset (Brizo)', () => { const path = await ocean.assets.consume( agreementId, ddo.id, - accessService.serviceDefinitionId, + accessService.index, consumer, folder ) diff --git a/integration/ocean/ConsumeBigAsset.test.ts b/integration/ocean/ConsumeBigAsset.test.ts index 3210409..7522aa0 100644 --- a/integration/ocean/ConsumeBigAsset.test.ts +++ b/integration/ocean/ConsumeBigAsset.test.ts @@ -59,7 +59,7 @@ xdescribe('Consume Asset (Large size)', () => { agreementId = await ocean.assets.order( ddo.id, - accessService.serviceDefinitionId, + accessService.index, consumer ) @@ -73,7 +73,7 @@ xdescribe('Consume Asset (Large size)', () => { const path = await ocean.assets.consume( agreementId, ddo.id, - accessService.serviceDefinitionId, + accessService.index, consumer, folder ) diff --git a/integration/ocean/Signature.test.ts b/integration/ocean/Signature.test.ts index 9a46c52..6a66394 100644 --- a/integration/ocean/Signature.test.ts +++ b/integration/ocean/Signature.test.ts @@ -46,7 +46,6 @@ describe('Signature', () => { const did = `did:op:${'c'.repeat(64)}` const templateId = `0x${'f'.repeat(40)}` const agreementId = `0x${'e'.repeat(64)}` - const serviceDefinitionId = '0' const serviceAgreementTemplate = await templates.escrowAccessSecretStoreTemplate.getServiceAgreementTemplate() @@ -55,15 +54,16 @@ describe('Signature', () => { service: [ { type: 'access', + index: 0, purchaseEndpoint: undefined, serviceEndpoint: undefined, - serviceDefinitionId, templateId, serviceAgreementTemplate } as any, { type: 'metadata', - metadata: { + index: 1, + attributes: { main: { price: 10 } @@ -74,7 +74,7 @@ describe('Signature', () => { const signature = await ocean.utils.agreements.signServiceAgreement( ddo, - serviceDefinitionId, + 0, agreementId, [ `0x${'1'.repeat(64)}`, diff --git a/integration/utils/ddo-metadata-generator.ts b/integration/utils/ddo-metadata-generator.ts index 57311d2..c1d9af2 100644 --- a/integration/utils/ddo-metadata-generator.ts +++ b/integration/utils/ddo-metadata-generator.ts @@ -12,11 +12,13 @@ const metadata: Partial = { files: [ { index: 0, + contentType: 'application/json', url: 'https://raw.githubusercontent.com/oceanprotocol/squid-js/master/package.json' }, { index: 1, + contentType: 'text/plain', url: 'https://raw.githubusercontent.com/oceanprotocol/squid-js/master/README.md' } diff --git a/src/brizo/Brizo.ts b/src/brizo/Brizo.ts index 62628d7..6251e35 100644 --- a/src/brizo/Brizo.ts +++ b/src/brizo/Brizo.ts @@ -37,7 +37,7 @@ export class Brizo extends Instantiable { public getComputeEndpoint( pubKey: string, - serviceId: string, + serviceIndex: number, _notUsed: string, container: string ) { @@ -47,14 +47,14 @@ export class Brizo extends Instantiable { public async initializeServiceAgreement( did: string, serviceAgreementId: string, - serviceDefinitionId: string, + serviceIndex: number, signature: string, consumerAddress: string ): Promise { const args = { did, serviceAgreementId, - serviceDefinitionId, + serviceIndex, signature, consumerAddress } diff --git a/src/ddo/DDO.ts b/src/ddo/DDO.ts index 3010933..11d2271 100644 --- a/src/ddo/DDO.ts +++ b/src/ddo/DDO.ts @@ -63,19 +63,19 @@ export class DDO { } /** - * Finds a service of a DDO by ID. - * @param {string} serviceDefinitionId Service ID. + * Finds a service of a DDO by index. + * @param {number} Service index. * @return {Service} Service. */ public findServiceById( - serviceDefinitionId: string + index: number ): Service { - if (!serviceDefinitionId) { - throw new Error('serviceDefinitionId not set') + if (!index) { + throw new Error('index is not set') } const service = this.service.find( - s => s.serviceDefinitionId === serviceDefinitionId + s => s.index === index ) return service as Service @@ -101,8 +101,8 @@ export class DDO { * @return {string[]} DDO checksum. */ public getChecksum(): string { - const { metadata } = this.findServiceByType('metadata') - const { files, name, author, license } = metadata.main + const { attributes } = this.findServiceByType('metadata') + const { files, name, author, license } = attributes.main const values = [ ...(files || []).map(({ checksum }) => checksum).filter(_ => !!_), @@ -150,11 +150,11 @@ export class DDO { */ public addChecksum(): void { const metadataService = this.findServiceByType('metadata') - if (metadataService.metadata.main.checksum) { + if (metadataService.attributes.main.checksum) { LoggerInstance.log('Checksum already exists') return } - metadataService.metadata.main.checksum = this.getChecksum() + metadataService.attributes.main.checksum = this.getChecksum() } /** diff --git a/src/ddo/Service.ts b/src/ddo/Service.ts index f463464..8d28a5b 100644 --- a/src/ddo/Service.ts +++ b/src/ddo/Service.ts @@ -12,7 +12,7 @@ export type ServiceType = export interface ServiceCommon { type: ServiceType - serviceDefinitionId?: string + index: number serviceEndpoint?: string } @@ -23,7 +23,7 @@ export interface ServiceAuthorization extends ServiceCommon { export interface ServiceMetadata extends ServiceCommon { type: 'metadata' - metadata: MetaData + attributes: MetaData } export interface ServiceAccess extends ServiceCommon { diff --git a/src/keeper/contracts/templates/EscrowAccessSecretStoreTemplate.ts b/src/keeper/contracts/templates/EscrowAccessSecretStoreTemplate.ts index 1aa7164..c7adcac 100644 --- a/src/keeper/contracts/templates/EscrowAccessSecretStoreTemplate.ts +++ b/src/keeper/contracts/templates/EscrowAccessSecretStoreTemplate.ts @@ -59,7 +59,7 @@ export class EscrowAccessSecretStoreTemplate extends AgreementTemplate { ) { return !!(await this.createFullAgreement( ddo.shortId(), - ddo.findServiceByType('metadata').metadata.main.price, + ddo.findServiceByType('metadata').attributes.main.price, consumer, from, agreementId @@ -79,7 +79,7 @@ export class EscrowAccessSecretStoreTemplate extends AgreementTemplate { } = await this.createFullAgreementData( agreementId, ddo.shortId(), - ddo.findServiceByType('metadata').metadata.main.price, + ddo.findServiceByType('metadata').attributes.main.price, consumer ) return [ diff --git a/src/ocean/OceanAgreements.ts b/src/ocean/OceanAgreements.ts index 71b5b42..3fc8dce 100644 --- a/src/ocean/OceanAgreements.ts +++ b/src/ocean/OceanAgreements.ts @@ -42,13 +42,13 @@ export class OceanAgreements extends Instantiable { /** * Creates a consumer signature for the specified asset service. * @param {string} did Decentralized ID. - * @param {string} serviceDefinitionId Service definition ID. + * @param {number} index Service index. * @param {Account} consumer Consumer account. * @return {Promise} Agreement ID and signaturee. */ public async prepare( did: string, - serviceDefinitionId: string, + index: number, consumer: Account ): Promise { const d: DID = DID.parse(did as string) @@ -68,7 +68,7 @@ export class OceanAgreements extends Instantiable { const signature = await this.ocean.utils.agreements.signServiceAgreement( ddo, - serviceDefinitionId, + index, agreementId, agreementConditionsIds, consumer @@ -80,21 +80,21 @@ export class OceanAgreements extends Instantiable { /** * Submit a service agreement to the publisher to create the agreement on-chain. * @param {string} did Decentralized ID. - * @param {string} serviceDefinitionId Service definition ID. + * @param {number} index Service index. * @param {Account} consumer Consumer account. * @return {Promise} */ public async send( did: string, agreementId: string, - serviceDefinitionId: string, + index: number, signature: string, consumer: Account ): Promise { const result = await this.ocean.brizo.initializeServiceAgreement( didPrefixed(did), zeroX(agreementId), - serviceDefinitionId, + index, zeroX(signature), consumer.getId() ) @@ -112,7 +112,7 @@ export class OceanAgreements extends Instantiable { * in this method before submitting on-chain. * @param {string} did Decentralized ID. * @param {string} agreementId Service agreement ID. - * @param {string} serviceDefinitionId Service definition ID. + * @param {number} index Service index. * @param {string} signature Service agreement signature. * @param {Account} consumer Consumer account. * @param {Account} publisher Publisher account. @@ -121,7 +121,7 @@ export class OceanAgreements extends Instantiable { public async create( did: string, agreementId: string, - serviceDefinitionId: string, + index: number, signature: string, consumer: Account, publisher: Account @@ -129,7 +129,7 @@ export class OceanAgreements extends Instantiable { const d: DID = DID.parse(did) const ddo = await this.ocean.aquarius.retrieveDDO(d) - const templateName = ddo.findServiceById<'access'>(serviceDefinitionId) + const templateName = ddo.findServiceById<'access'>(index) .serviceAgreementTemplate.contractName await this.ocean.keeper .getTemplateByName(templateName) @@ -145,9 +145,7 @@ export class OceanAgreements extends Instantiable { /** * Get the status of a service agreement. - * @param {string} did Decentralized ID. * @param {string} agreementId Service agreement ID. - * @param {string} serviceDefinitionId Service definition ID. * @param {boolean} extended Returns a complete status with dependencies. * @return {Promise} */ diff --git a/src/ocean/OceanAssets.ts b/src/ocean/OceanAssets.ts index dc0d3e3..fe39dca 100644 --- a/src/ocean/OceanAssets.ts +++ b/src/ocean/OceanAssets.ts @@ -91,7 +91,7 @@ export class OceanAssets extends Instantiable { const serviceEndpoint = this.ocean.aquarius.getServiceEndpoint(did) - let serviceDefinitionIdCount = 0 + let indexCount = 0 // create ddo itself const ddo: DDO = new DDO({ id: did.getDid(), @@ -126,7 +126,7 @@ export class OceanAssets extends Instantiable { { type: 'metadata', serviceEndpoint, - metadata: { + attributes: { // Default values curation: { rating: 0, @@ -158,10 +158,10 @@ export class OceanAssets extends Instantiable { list.findIndex(({ type: t }) => t === type) === i ) .reverse() - // Adding ID + // Adding index .map(_ => ({ ..._, - serviceDefinitionId: String(serviceDefinitionIdCount++) + index: indexCount++ })) as Service[] }) @@ -206,7 +206,7 @@ export class OceanAssets extends Instantiable { public async consume( agreementId: string, did: string, - serviceDefinitionId: string, + serviceIndex: number, consumerAccount: Account, resultPath: string, index?: number, @@ -216,7 +216,7 @@ export class OceanAssets extends Instantiable { public async consume( agreementId: string, did: string, - serviceDefinitionId: string, + serviceIndex: number, consumerAccount: Account, resultPath?: undefined | null, index?: number, @@ -226,18 +226,18 @@ export class OceanAssets extends Instantiable { public async consume( agreementId: string, did: string, - serviceDefinitionId: string, + serviceIndex: number, consumerAccount: Account, resultPath?: string, index: number = -1, useSecretStore?: boolean ): Promise { const ddo = await this.resolve(did) - const { metadata } = ddo.findServiceByType('metadata') + const { attributes } = ddo.findServiceByType('metadata') - const accessService = ddo.findServiceById(serviceDefinitionId) + const accessService = ddo.findServiceById(serviceIndex) - const { files } = metadata.main + const { files } = attributes.main const { serviceEndpoint } = accessService @@ -250,7 +250,7 @@ export class OceanAssets extends Instantiable { this.logger.log('Consuming files') resultPath = resultPath - ? `${resultPath}/datafile.${ddo.shortId()}.${serviceDefinitionId}/` + ? `${resultPath}/datafile.${ddo.shortId()}.${serviceIndex}/` : undefined if (!useSecretStore) { @@ -265,7 +265,7 @@ export class OceanAssets extends Instantiable { } else { const files = await this.ocean.secretStore.decrypt( did, - ddo.findServiceByType('metadata').metadata.main.encryptedFiles, + ddo.findServiceByType('metadata').attributes.main.encryptedFiles, consumerAccount, ddo.findServiceByType('authorization').serviceEndpoint ) @@ -288,13 +288,13 @@ export class OceanAssets extends Instantiable { * Start the purchase/order of an asset's service. Starts by signing the service agreement * then sends the request to the publisher via the service endpoint (Brizo http service). * @param {string} did Decentralized ID. - * @param {string} serviceDefinitionId Service definition ID. + * @param {number} index Service index. * @param {Account} consumer Consumer account. * @return {Promise} Returns Agreement ID */ public order( did: string, - serviceDefinitionId: string, + index: number, consumer: Account ): SubscribablePromise { return new SubscribablePromise(async observer => { @@ -316,7 +316,7 @@ export class OceanAssets extends Instantiable { this.logger.log('Agreement initialized') observer.next(OrderProgressStep.AgreementInitialized) - const { metadata } = ddo.findServiceByType('metadata') + const { attributes } = ddo.findServiceByType('metadata') this.logger.log('Locking payment') @@ -327,7 +327,7 @@ export class OceanAssets extends Instantiable { observer.next(OrderProgressStep.LockingPayment) const paid = await oceanAgreements.conditions.lockReward( agreementId, - metadata.main.price, + attributes.main.price, consumer ) observer.next(OrderProgressStep.LockedPayment) @@ -352,7 +352,7 @@ export class OceanAssets extends Instantiable { await oceanAgreements.create( did, agreementId, - serviceDefinitionId, + index, undefined, consumer, consumer diff --git a/src/ocean/utils/ServiceAgreement.ts b/src/ocean/utils/ServiceAgreement.ts index b520a34..c634aed 100644 --- a/src/ocean/utils/ServiceAgreement.ts +++ b/src/ocean/utils/ServiceAgreement.ts @@ -13,12 +13,12 @@ export class ServiceAgreement extends Instantiable { public async signServiceAgreement( ddo: DDO, - serviceDefinitionId: string, + index: number, serviceAgreementId: string, agreementConditionsIds: string[], consumer: Account ): Promise { - const service = ddo.findServiceById<'access'>(serviceDefinitionId) + const service = ddo.findServiceById<'access'>(index) const timelockValues: number[] = this.getTimeValuesFromService( service, 'timelock' diff --git a/src/utils/DDOHelpers.ts b/src/utils/DDOHelpers.ts index 67a2475..a326825 100644 --- a/src/utils/DDOHelpers.ts +++ b/src/utils/DDOHelpers.ts @@ -13,7 +13,7 @@ function fillParameterWithDDO( case 'amount': case 'price': return String( - ddo.findServiceByType('metadata').metadata.main.price + ddo.findServiceByType('metadata').attributes.main.price ) case 'assetId': case 'documentId': diff --git a/test/ddo/DDO.test.ts b/test/ddo/DDO.test.ts index bb7e248..ee4a134 100644 --- a/test/ddo/DDO.test.ts +++ b/test/ddo/DDO.test.ts @@ -88,9 +88,10 @@ describe('DDO', () => { }, { type: 'metadata', + index: 0, serviceEndpoint: 'http://myaquarius.org/api/v1/provider/assets/metadata/{did}', - metadata: { + attributes: { main: { name: 'UK Weather information 2011', type: 'dataset', @@ -104,16 +105,19 @@ describe('DDO', () => { index: 0, checksum: 'efb2c764274b745f5fc37f97c6b0e761', contentLength: 4535431, + contentType: 'application/json', resourceId: 'access-log2018-02-13-15-17-29-18386C502CAEA932' }, { index: 1, checksum: '085340abffh21495345af97c6b0e761', - contentLength: 12324 + contentLength: 12324, + contentType: 'application/json' }, { - index: 2 + index: 2, + contentType: '' } ], checksum: '' diff --git a/test/mocks/Brizo.mock.ts b/test/mocks/Brizo.mock.ts index da8f96e..7efe47b 100644 --- a/test/mocks/Brizo.mock.ts +++ b/test/mocks/Brizo.mock.ts @@ -4,7 +4,7 @@ export default class BrizoMock extends Brizo { public async initializeServiceAgreement( did: string, serviceAgreementId: string, - serviceDefinitionId: string, + index: number, signature: string, consumerPublicKey: string ): Promise { diff --git a/test/testdata/ddo.json b/test/testdata/ddo.json index fd48c2e..2e75886 100644 --- a/test/testdata/ddo.json +++ b/test/testdata/ddo.json @@ -40,7 +40,7 @@ "service": [ { "type": "access", - "serviceDefinitionId": "0", + "index": 0, "serviceEndpoint": "http://mybrizo.org/api/v1/brizo/services/consume?pubKey=${pubKey}&serviceId={serviceId}&url={url}", "purchaseEndpoint": "http://mybrizo.org/api/v1/brizo/services/access/purchase?", "templateId": "044852b2a670ade5407e78fb2863c51000000000000000000000000000000000", @@ -145,16 +145,16 @@ }, { "type": "compute", - "serviceDefinitionId": "1", + "index": 1, "serviceEndpoint": "http://mybrizo.org/api/v1/brizo/services/compute?pubKey=${pubKey}&serviceId={serviceId}&algo={algo}&container={container}", "templateId": "044852b2a670ade5407e78fb2863c51000000000000000000000000000000002" }, { "type": "metadata", - "serviceDefinitionId": "2", + "index": 2, "serviceEndpoint": "http://myaquarius.org/api/v1/provider/assets/metadata/{did}", - "metadata": { - "base": { + "attributes": { + "main": { "name": "UK Weather information 2011", "type": "dataset", "dateCreated": "2012-10-10T17:00:000Z",