Browse Source

storage-node-v2: Update upload method.

Shamil Gadelshin 3 years ago
parent
commit
dea7215388

+ 3 - 4
storage-node-v2/src/api-spec/openapi.yaml

@@ -35,7 +35,7 @@ paths:
               required:
                 - dataObjectId
                 - storageBucketId
-                - workerId
+                - bagId
               properties:
                 file:
                   description: Data file
@@ -49,10 +49,9 @@ paths:
                   description: Storage bucket ID
                   type: string
                   pattern: '^\d+$' #integer
-                workerId:
-                  description: Storage provider worker ID
+                bagId:
+                  description: Bag ID
                   type: string
-                  pattern: '^\d+$' #integer
         required: true
       responses:
         201:

+ 7 - 1
storage-node-v2/src/commands/server.ts

@@ -9,6 +9,11 @@ export default class Server extends ApiCommandBase {
   static description = 'Starts the storage node server.'
 
   static flags = {
+    worker: flags.integer({
+      char: 'w',
+      required: true, // TODO: for dev
+      description: 'Storage provider worker ID',
+    }),
     uploads: flags.string({
       char: 'u',
       required: true,
@@ -36,7 +41,8 @@ export default class Server extends ApiCommandBase {
 
     try {
       const port = flags.port
-      const app = await createApp(api, account, flags.uploads)
+      const workerId = flags.worker ?? 0 // TODO: don't require on dev???
+      const app = await createApp(api, account, workerId, flags.uploads)
       console.info(`Listening on http://localhost:${port}`)
       app.listen(port)
     } catch (err) {

+ 1 - 1
storage-node-v2/src/services/runtime/nonceKeeper.ts

@@ -22,7 +22,7 @@ export async function getNonce(
     lock.release()
   }
 
-  console.log(`Last nonce:${nonce}`)
+  console.debug(`Last nonce:${nonce}`)
 
   return nonce as Index
 }

+ 11 - 2
storage-node-v2/src/services/webApi/app.ts

@@ -8,6 +8,7 @@ import { KeyringPair } from '@polkadot/keyring/types'
 import { ApiPromise } from '@polkadot/api'
 import { TokenRequest, verifyTokenSignature } from '../helpers/auth'
 import { createStorageBucket } from '../runtime/extrinsics'
+import { parseBagId } from '../../services/helpers/bagIdParser'
 
 // TODO: custom errors (including validation errors)
 // TODO: custom authorization errors
@@ -15,6 +16,7 @@ import { createStorageBucket } from '../runtime/extrinsics'
 export async function createApp(
   api: ApiPromise,
   account: KeyringPair,
+  workerId: number,
   uploadsDir: string
 ): Promise<Express> {
   const spec = path.join(__dirname, './../../api-spec/openapi.yaml')
@@ -37,6 +39,7 @@ export async function createApp(
     // Set parameters for each request.
     (req: express.Request, res: express.Response, next: NextFunction) => {
       res.locals.storageProviderAccount = account
+      res.locals.workerId = workerId
       res.locals.api = api
       next()
     },
@@ -52,7 +55,7 @@ export async function createApp(
       fileUploader: { dest: uploadsDir },
       validateSecurity: {
         handlers: {
-          UploadAuth: validateUpload(account),
+          UploadAuth: validateUpload(api, account),
         },
       },
     })
@@ -67,7 +70,10 @@ type ValidateUploadFunction = (
   schema: OpenAPIV3.SecuritySchemeObject
 ) => boolean | Promise<boolean>
 
-function validateUpload(account: KeyringPair): ValidateUploadFunction {
+function validateUpload(
+  api: ApiPromise,
+  account: KeyringPair
+): ValidateUploadFunction {
   // We don't use these variables yet.
   /* eslint-disable @typescript-eslint/no-unused-vars */
   return (
@@ -77,6 +83,9 @@ function validateUpload(account: KeyringPair): ValidateUploadFunction {
   ) => {
     const tokenSignature = req.headers['x-api-key'] as string
 
+    // Validate bagId.
+    parseBagId(api, req.body.bagId)
+
     // TODO: token construction
     const sourceTokenRequest: TokenRequest = {
       dataObjectId: parseInt(req.body.dataObjectId),

+ 9 - 7
storage-node-v2/src/services/webApi/controllers/publicApi.ts

@@ -8,14 +8,10 @@ import { parseBagId } from '../../../services/helpers/bagIdParser'
 import fs from 'fs'
 const fsPromises = fs.promises
 
-// TODO: test api connection?
 // TODO: error handling
-// TODO: convert to JSON
-// TODO: validate bagId
 interface UploadRequest {
   dataObjectId: number
   storageBucketId: number
-  workerId: number
   bagId: string
 }
 
@@ -25,8 +21,6 @@ export async function upload(
 ): Promise<void> {
   const uploadRequest: UploadRequest = req.body
 
-  console.log(uploadRequest)
-
   try {
     const fileObj = getFileObject(req)
 
@@ -42,7 +36,7 @@ export async function upload(
       api,
       bagId,
       getAccount(res),
-      uploadRequest.workerId,
+      getWorkerId(res),
       uploadRequest.storageBucketId,
       [uploadRequest.dataObjectId]
     )
@@ -82,6 +76,14 @@ function getFileObject(req: express.Request): Express.Multer.File {
   throw new Error('No file uploaded')
 }
 
+function getWorkerId(res: express.Response): number {
+  if (res.locals.workerId || res.locals.workerId === 0) {
+    return res.locals.workerId
+  }
+
+  throw new Error('No Joystream worker ID loaded.')
+}
+
 function getAccount(res: express.Response): KeyringPair {
   if (res.locals.storageProviderAccount) {
     return res.locals.storageProviderAccount