Browse Source

storage-node-v2: Run ‘acceptPendingDataObjects’ extrinsic on uploading.

Shamil Gadelshin 3 years ago
parent
commit
0f4669476d

+ 15 - 0
storage-node-v2/src/api-spec/openapi.yaml

@@ -31,11 +31,26 @@ paths:
               type: object
               required:
                 - recfile
+                - dataObjectId
+                - storageBucketId
+                - workerId
               properties:
                 file:
                   description: Data file
                   type: string
                   format: binary
+                dataObjectId: #TODO: convert to JSON
+                  description: Data object runtime ID
+                  type: string
+                  pattern: '^\d+$' #integer
+                storageBucketId: #TODO: convert to JSON
+                  description: Data object runtime ID
+                  type: string
+                  pattern: '^\d+$' #integer
+                workerId: #TODO: convert to JSON
+                  description: Data object runtime ID
+                  type: string
+                  pattern: '^\d+$' #integer
         required: true
       responses:
         200:

+ 35 - 5
storage-node-v2/src/services/api/controllers/publicApi.ts

@@ -1,10 +1,40 @@
 import * as express from 'express'
+import { acceptPendingDataObjects } from '../../../services/extrinsics'
+import { getAlicePair } from '../../../services/runtimeApi'
 
-export function upload(req: express.Request, res: express.Response): void {
-  console.log(req.body)
+//TODO: error handling
+//TODO: convert to JSON
+//TODO: bagId
+interface UploadRequest {
+  dataObjectId: number //TODO: to array
+  storageBucketId: number
+  workerId: number
+}
+
+export async function upload(
+  req: express.Request,
+  res: express.Response
+): Promise<void> {
+  const uploadRequest: UploadRequest = req.body
+
+  //TODO: remove
+  console.log(uploadRequest)
   console.log(req.files)
 
-  res.json({
-    file: 'received',
-  })
+  try {
+    //TODO: account
+    await acceptPendingDataObjects(
+      getAlicePair(),
+      uploadRequest.workerId,
+      uploadRequest.storageBucketId,
+      [uploadRequest.dataObjectId]
+    )
+    res.status(200).json({ 
+      file: 'received',
+    })
+  } catch (err) {
+    res.status(500).json({
+      errorMsg: err.toString(),
+    })
+  }
 }

+ 7 - 4
storage-node-v2/src/services/api/server.ts

@@ -22,11 +22,14 @@ export async function createServer(
           <body>
             <form method="POST" enctype="multipart/form-data" action="/api/v1/upload">
               <h2>Api development form (upload)</h2>
-              <input type="file" name="recfile"><br />
-              <input type="submit">
+              <table>
+                <tr><td>DataObjectId</td><td><input name="dataObjectId" value="0"</td></tr>
+                <tr><td>WorkerId</td><td><input name="workerId" value="0"></td></tr>
+                <tr><td>StorageBucketId</td><td><input name="storageBucketId" value="0"></td></tr>
+                <tr><td><input type="file" name="recfile"><br /></td><td><input type="submit"></td></tr>
             </form>
-          </body><
-        /html>`
+          </body>
+        </html>`
       )
       res.end()
     })

+ 29 - 0
storage-node-v2/src/services/extrinsics.ts

@@ -115,3 +115,32 @@ export async function uploadDataObjects(
     console.error(`Api Error: ${err}`)
   }
 }
+
+export async function acceptPendingDataObjects(
+  account: KeyringPair,
+  workerId: number,
+  storageBucketId: number,
+  dataObjects: number[]
+): Promise<void> {
+  try {
+    const api = await createApi()
+
+    const bagId = { 'Static': 'Council' }
+
+    const dataObjectSet: CodecArg = api.createType(
+      'DataObjectIdSet',
+      dataObjects
+    )
+
+    await sendAndFollowNamedTx(
+      api,
+      account,
+      'storage',
+      'acceptPendingDataObjects',
+      [workerId, storageBucketId, bagId, dataObjectSet]
+    )
+  } catch (err) {
+    console.error(`Api Error: ${err}`)
+    throw err
+  }
+}

+ 12 - 9
storage-node-v2/src/services/hireLead.ts

@@ -19,16 +19,16 @@ export async function hireStorageWorkingGroupLead(): Promise<void> {
   const SudoKeyPair = getAlicePair()
   const LeadKeyPair = getAlicePair()
 
-  const nullValue = (null as unknown) as CodecArg
+  const nullValue = null as unknown as CodecArg
 
   // Create membership if not already created
   const members = (await api.query.members.memberIdsByControllerAccountId(
     LeadKeyPair.address
   )) as Vec<MemberId>
 
-  let memberId:
-    | bigint
-    | undefined = (members.toArray()[0] as MemberId)?.toBigInt()
+  let memberId: bigint | undefined = (
+    members.toArray()[0] as MemberId
+  )?.toBigInt()
 
   if (memberId === undefined) {
     console.log('Preparing member account creation extrinsic...')
@@ -42,9 +42,8 @@ export async function hireStorageWorkingGroupLead(): Promise<void> {
   }
 
   // Create a new lead opening.
-  const currentLead = (await api.query.storageWorkingGroup.currentLead()) as Option<
-    WorkerId
-  >
+  const currentLead =
+    (await api.query.storageWorkingGroup.currentLead()) as Option<WorkerId>
   if (currentLead.isSome) {
     console.log('Storage lead already exists, skipping...')
     return
@@ -52,8 +51,12 @@ export async function hireStorageWorkingGroupLead(): Promise<void> {
 
   console.log(`Making member id: ${memberId} the content lead.`)
 
-  const newOpeningId = ((await api.query.storageWorkingGroup.nextOpeningId()) as OpeningId).toBigInt()
-  const newApplicationId = ((await api.query.storageWorkingGroup.nextApplicationId()) as ApplicationId).toBigInt()
+  const newOpeningId = (
+    (await api.query.storageWorkingGroup.nextOpeningId()) as OpeningId
+  ).toBigInt()
+  const newApplicationId = (
+    (await api.query.storageWorkingGroup.nextApplicationId()) as ApplicationId
+  ).toBigInt()
 
   // Create curator lead opening
   console.log('Preparing Create Storage Lead Opening extrinsic...')

File diff suppressed because it is too large
+ 1 - 1
types/augment-codec/all.ts


File diff suppressed because it is too large
+ 0 - 0
types/augment-codec/augment-types.ts


+ 2 - 1
types/augment/all/defs.json

@@ -1019,5 +1019,6 @@
         "objectCreationList": "Vec<DataObjectCreationParameters>",
         "deletionPrizeSourceAccountId": "GenericAccountId"
     },
-    "StorageBucketIdSet": "BTreeSet<StorageBucketId>"
+    "StorageBucketIdSet": "BTreeSet<StorageBucketId>",
+    "DataObjectIdSet": "BTreeSet<DataObjectId>"
 }

+ 3 - 0
types/augment/all/types.ts

@@ -406,6 +406,9 @@ export interface DataObjectCreationParameters extends Struct {
 /** @name DataObjectId */
 export interface DataObjectId extends u64 {}
 
+/** @name DataObjectIdSet */
+export interface DataObjectIdSet extends BTreeSet<DataObjectId> {}
+
 /** @name DataObjectsMap */
 export interface DataObjectsMap extends BTreeMap<ContentId, DataObject> {}
 

File diff suppressed because it is too large
+ 0 - 0
types/augment/augment-types.ts


+ 3 - 0
types/src/storage.ts

@@ -59,6 +59,8 @@ export class Voucher
 
 export class StorageBucketIdSet extends JoyBTreeSet(StorageBucketId) {}
 
+export class DataObjectIdSet extends JoyBTreeSet(DataObjectId) {}
+
 export class BagIdType extends u64 {}
 
 export type DataObjectCreationParametersType = {
@@ -108,5 +110,6 @@ export const storageTypes: RegistryTypes = {
     BagIdType,
     UploadParameters,
     StorageBucketIdSet,
+    DataObjectIdSet,
 }
 export default storageTypes

Some files were not shown because too many files changed in this diff