mirror of
https://github.com/oceanprotocol-archive/squid-js.git
synced 2024-02-02 15:31:51 +01:00
more DDO structure updates
This commit is contained in:
parent
b15022a4c1
commit
e253e4c0bb
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
)
|
||||
|
@ -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
|
||||
)
|
||||
|
@ -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)}`,
|
||||
|
@ -12,11 +12,13 @@ const metadata: Partial<MetaData> = {
|
||||
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'
|
||||
}
|
||||
|
@ -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<any> {
|
||||
const args = {
|
||||
did,
|
||||
serviceAgreementId,
|
||||
serviceDefinitionId,
|
||||
serviceIndex,
|
||||
signature,
|
||||
consumerAddress
|
||||
}
|
||||
|
@ -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<T extends ServiceType>(
|
||||
serviceDefinitionId: string
|
||||
index: number
|
||||
): Service<T> {
|
||||
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<T>
|
||||
@ -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()
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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 {
|
||||
|
@ -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 [
|
||||
|
@ -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<AgreementPrepareResult>} Agreement ID and signaturee.
|
||||
*/
|
||||
public async prepare(
|
||||
did: string,
|
||||
serviceDefinitionId: string,
|
||||
index: number,
|
||||
consumer: Account
|
||||
): Promise<AgreementPrepareResult> {
|
||||
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<void>}
|
||||
*/
|
||||
public async send(
|
||||
did: string,
|
||||
agreementId: string,
|
||||
serviceDefinitionId: string,
|
||||
index: number,
|
||||
signature: string,
|
||||
consumer: Account
|
||||
): Promise<void> {
|
||||
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<any>}
|
||||
*/
|
||||
|
@ -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<string | true> {
|
||||
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<string>} Returns Agreement ID
|
||||
*/
|
||||
public order(
|
||||
did: string,
|
||||
serviceDefinitionId: string,
|
||||
index: number,
|
||||
consumer: Account
|
||||
): SubscribablePromise<OrderProgressStep, string> {
|
||||
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
|
||||
|
@ -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<string> {
|
||||
const service = ddo.findServiceById<'access'>(serviceDefinitionId)
|
||||
const service = ddo.findServiceById<'access'>(index)
|
||||
const timelockValues: number[] = this.getTimeValuesFromService(
|
||||
service,
|
||||
'timelock'
|
||||
|
@ -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':
|
||||
|
@ -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: ''
|
||||
|
@ -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<any> {
|
||||
|
10
test/testdata/ddo.json
vendored
10
test/testdata/ddo.json
vendored
@ -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",
|
||||
|
Loading…
x
Reference in New Issue
Block a user