Browse Source

CLI: working-groups:updateGroupMetadata

Leszek Wiesner 3 years ago
parent
commit
dd3ff74fa7

+ 6 - 0
cli/examples/working-groups/UpdateMetadata.json

@@ -0,0 +1,6 @@
+{
+  "description": "Example working group description",
+  "about": "Example working group about text",
+  "status": "Example status",
+  "statusMessage": "Example status message"
+}

+ 3 - 0
cli/src/Types.ts

@@ -16,6 +16,7 @@ import {
   IVideoCategoryMetadata,
   IChannelCategoryMetadata,
   IOpeningMetadata,
+  IWorkingGroupMetadata,
 } from '@joystream/metadata-protobuf'
 import { DataObjectCreationParameters } from '@joystream/types/storage'
 import {
@@ -204,6 +205,8 @@ export type WorkingGroupOpeningInputParameters = Omit<IOpeningMetadata, 'applica
   }[]
 }
 
+export type WorkingGroupUpdateStatusInputParameters = IWorkingGroupMetadata
+
 type AnyPrimitive = string | number | boolean | Long
 
 // JSONSchema utility types

+ 54 - 0
cli/src/commands/working-groups/updateGroupMetadata.ts

@@ -0,0 +1,54 @@
+import WorkingGroupsCommandBase from '../../base/WorkingGroupsCommandBase'
+import { WorkingGroupUpdateStatusInputParameters } from '../../Types'
+import { WorkingGroupUpdateStatusInputSchema } from '../../schemas/WorkingGroups'
+import chalk from 'chalk'
+import { apiModuleByGroup } from '../../Api'
+import { getInputJson } from '../../helpers/InputOutput'
+import { flags } from '@oclif/command'
+import { IWorkingGroupMetadataAction, WorkingGroupMetadataAction } from '@joystream/metadata-protobuf'
+import { metadataToBytes } from '../../helpers/serialization'
+
+export default class WorkingGroupsUpdateMetadata extends WorkingGroupsCommandBase {
+  static description =
+    'Update working group metadata (description, status etc.). The update will be atomic (just like video / channel metadata updates)'
+
+  static flags = {
+    input: flags.string({
+      char: 'i',
+      required: true,
+      description: `Path to JSON file to use as input`,
+    }),
+    ...WorkingGroupsCommandBase.flags,
+  }
+
+  async run(): Promise<void> {
+    // lead-only gate
+    const lead = await this.getRequiredLeadContext()
+
+    const {
+      flags: { input: inputFilePath },
+    } = this.parse(WorkingGroupsUpdateMetadata)
+
+    const input = await getInputJson<WorkingGroupUpdateStatusInputParameters>(
+      inputFilePath,
+      WorkingGroupUpdateStatusInputSchema
+    )
+    const actionMetadata: IWorkingGroupMetadataAction = {
+      'setGroupMetadata': {
+        newMetadata: input,
+      },
+    }
+
+    this.jsonPrettyPrint(JSON.stringify(actionMetadata))
+
+    await this.requireConfirmation('Do you confirm the provided input?')
+
+    await this.sendAndFollowTx(
+      await this.getDecodedPair(lead.roleAccount),
+      this.getOriginalApi().tx[apiModuleByGroup[this.group]].setStatusText(
+        metadataToBytes(WorkingGroupMetadataAction, actionMetadata)
+      )
+    )
+    this.log(chalk.green(`Working group metadata successfully updated!`))
+  }
+}

+ 12 - 1
cli/src/schemas/WorkingGroups.ts

@@ -1,4 +1,4 @@
-import { WorkingGroupOpeningInputParameters, JsonSchema } from '../Types'
+import { WorkingGroupOpeningInputParameters, WorkingGroupUpdateStatusInputParameters, JsonSchema } from '../Types'
 
 export const WorkingGroupOpeningInputSchema: JsonSchema<WorkingGroupOpeningInputParameters> = {
   type: 'object',
@@ -55,3 +55,14 @@ export const WorkingGroupOpeningInputSchema: JsonSchema<WorkingGroupOpeningInput
     },
   },
 }
+
+export const WorkingGroupUpdateStatusInputSchema: JsonSchema<WorkingGroupUpdateStatusInputParameters> = {
+  type: 'object',
+  additionalProperties: false,
+  properties: {
+    about: { type: 'string' },
+    description: { type: 'string' },
+    status: { type: 'string' },
+    statusMessage: { type: 'string' },
+  },
+}