Browse Source

Remove upcoming opening and set group metadata

Leszek Wiesner 3 years ago
parent
commit
847d3ac773

+ 30 - 30
metadata-protobuf/compiled/proto/WorkingGroups_pb.d.ts

@@ -152,7 +152,7 @@ export namespace ApplicationMetadata {
   }
 }
 
-export class WorkingGroupStatusMetadata extends jspb.Message {
+export class WorkingGroupMetadata extends jspb.Message {
   hasDescription(): boolean;
   clearDescription(): void;
   getDescription(): string | undefined;
@@ -174,16 +174,16 @@ export class WorkingGroupStatusMetadata extends jspb.Message {
   setStatusMessage(value: string): void;
 
   serializeBinary(): Uint8Array;
-  toObject(includeInstance?: boolean): WorkingGroupStatusMetadata.AsObject;
-  static toObject(includeInstance: boolean, msg: WorkingGroupStatusMetadata): WorkingGroupStatusMetadata.AsObject;
+  toObject(includeInstance?: boolean): WorkingGroupMetadata.AsObject;
+  static toObject(includeInstance: boolean, msg: WorkingGroupMetadata): WorkingGroupMetadata.AsObject;
   static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
   static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
-  static serializeBinaryToWriter(message: WorkingGroupStatusMetadata, writer: jspb.BinaryWriter): void;
-  static deserializeBinary(bytes: Uint8Array): WorkingGroupStatusMetadata;
-  static deserializeBinaryFromReader(message: WorkingGroupStatusMetadata, reader: jspb.BinaryReader): WorkingGroupStatusMetadata;
+  static serializeBinaryToWriter(message: WorkingGroupMetadata, writer: jspb.BinaryWriter): void;
+  static deserializeBinary(bytes: Uint8Array): WorkingGroupMetadata;
+  static deserializeBinaryFromReader(message: WorkingGroupMetadata, reader: jspb.BinaryReader): WorkingGroupMetadata;
 }
 
-export namespace WorkingGroupStatusMetadata {
+export namespace WorkingGroupMetadata {
   export type AsObject = {
     description?: string,
     about?: string,
@@ -193,10 +193,10 @@ export namespace WorkingGroupStatusMetadata {
 }
 
 export class SetGroupMetadata extends jspb.Message {
-  hasNewmetadata(): boolean;
-  clearNewmetadata(): void;
-  getNewmetadata(): WorkingGroupStatusMetadata;
-  setNewmetadata(value?: WorkingGroupStatusMetadata): void;
+  hasNewMetadata(): boolean;
+  clearNewMetadata(): void;
+  getNewMetadata(): WorkingGroupMetadata;
+  setNewMetadata(value?: WorkingGroupMetadata): void;
 
   serializeBinary(): Uint8Array;
   toObject(includeInstance?: boolean): SetGroupMetadata.AsObject;
@@ -210,7 +210,7 @@ export class SetGroupMetadata extends jspb.Message {
 
 export namespace SetGroupMetadata {
   export type AsObject = {
-    newmetadata: WorkingGroupStatusMetadata.AsObject,
+    newMetadata: WorkingGroupMetadata.AsObject,
   }
 }
 
@@ -259,20 +259,20 @@ export namespace RemoveUpcomingOpening {
 }
 
 export class WorkingGroupMetadataAction extends jspb.Message {
-  hasSetgroupmetadata(): boolean;
-  clearSetgroupmetadata(): void;
-  getSetgroupmetadata(): SetGroupMetadata | undefined;
-  setSetgroupmetadata(value?: SetGroupMetadata): void;
+  hasSetGroupMetadata(): boolean;
+  clearSetGroupMetadata(): void;
+  getSetGroupMetadata(): SetGroupMetadata | undefined;
+  setSetGroupMetadata(value?: SetGroupMetadata): void;
 
-  hasAddupcomingopening(): boolean;
-  clearAddupcomingopening(): void;
-  getAddupcomingopening(): AddUpcomingOpening | undefined;
-  setAddupcomingopening(value?: AddUpcomingOpening): void;
+  hasAddUpcomingOpening(): boolean;
+  clearAddUpcomingOpening(): void;
+  getAddUpcomingOpening(): AddUpcomingOpening | undefined;
+  setAddUpcomingOpening(value?: AddUpcomingOpening): void;
 
-  hasRemoveupcomingopening(): boolean;
-  clearRemoveupcomingopening(): void;
-  getRemoveupcomingopening(): RemoveUpcomingOpening | undefined;
-  setRemoveupcomingopening(value?: RemoveUpcomingOpening): void;
+  hasRemoveUpcomingOpening(): boolean;
+  clearRemoveUpcomingOpening(): void;
+  getRemoveUpcomingOpening(): RemoveUpcomingOpening | undefined;
+  setRemoveUpcomingOpening(value?: RemoveUpcomingOpening): void;
 
   getActionCase(): WorkingGroupMetadataAction.ActionCase;
   serializeBinary(): Uint8Array;
@@ -287,16 +287,16 @@ export class WorkingGroupMetadataAction extends jspb.Message {
 
 export namespace WorkingGroupMetadataAction {
   export type AsObject = {
-    setgroupmetadata?: SetGroupMetadata.AsObject,
-    addupcomingopening?: AddUpcomingOpening.AsObject,
-    removeupcomingopening?: RemoveUpcomingOpening.AsObject,
+    setGroupMetadata?: SetGroupMetadata.AsObject,
+    addUpcomingOpening?: AddUpcomingOpening.AsObject,
+    removeUpcomingOpening?: RemoveUpcomingOpening.AsObject,
   }
 
   export enum ActionCase {
     ACTION_NOT_SET = 0,
-    SETGROUPMETADATA = 1,
-    ADDUPCOMINGOPENING = 2,
-    REMOVEUPCOMINGOPENING = 3,
+    SET_GROUP_METADATA = 1,
+    ADD_UPCOMING_OPENING = 2,
+    REMOVE_UPCOMING_OPENING = 3,
   }
 }
 

+ 88 - 88
metadata-protobuf/compiled/proto/WorkingGroups_pb.js

@@ -23,9 +23,9 @@ goog.exportSymbol('proto.OpeningMetadata.ApplicationFormQuestion.InputType', nul
 goog.exportSymbol('proto.RemoveUpcomingOpening', null, global);
 goog.exportSymbol('proto.SetGroupMetadata', null, global);
 goog.exportSymbol('proto.UpcomingOpeningMetadata', null, global);
+goog.exportSymbol('proto.WorkingGroupMetadata', null, global);
 goog.exportSymbol('proto.WorkingGroupMetadataAction', null, global);
 goog.exportSymbol('proto.WorkingGroupMetadataAction.ActionCase', null, global);
-goog.exportSymbol('proto.WorkingGroupStatusMetadata', null, global);
 /**
  * Generated by JsPbCodeGenerator.
  * @param {Array=} opt_data Optional initial data array, typically from a
@@ -120,16 +120,16 @@ if (goog.DEBUG && !COMPILED) {
  * @extends {jspb.Message}
  * @constructor
  */
-proto.WorkingGroupStatusMetadata = function(opt_data) {
+proto.WorkingGroupMetadata = function(opt_data) {
   jspb.Message.initialize(this, opt_data, 0, -1, null, null);
 };
-goog.inherits(proto.WorkingGroupStatusMetadata, jspb.Message);
+goog.inherits(proto.WorkingGroupMetadata, jspb.Message);
 if (goog.DEBUG && !COMPILED) {
   /**
    * @public
    * @override
    */
-  proto.WorkingGroupStatusMetadata.displayName = 'proto.WorkingGroupStatusMetadata';
+  proto.WorkingGroupMetadata.displayName = 'proto.WorkingGroupMetadata';
 }
 /**
  * Generated by JsPbCodeGenerator.
@@ -1286,8 +1286,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) {
  *     http://goto/soy-param-migration
  * @return {!Object}
  */
-proto.WorkingGroupStatusMetadata.prototype.toObject = function(opt_includeInstance) {
-  return proto.WorkingGroupStatusMetadata.toObject(opt_includeInstance, this);
+proto.WorkingGroupMetadata.prototype.toObject = function(opt_includeInstance) {
+  return proto.WorkingGroupMetadata.toObject(opt_includeInstance, this);
 };
 
 
@@ -1296,11 +1296,11 @@ proto.WorkingGroupStatusMetadata.prototype.toObject = function(opt_includeInstan
  * @param {boolean|undefined} includeInstance Deprecated. Whether to include
  *     the JSPB instance for transitional soy proto support:
  *     http://goto/soy-param-migration
- * @param {!proto.WorkingGroupStatusMetadata} msg The msg instance to transform.
+ * @param {!proto.WorkingGroupMetadata} msg The msg instance to transform.
  * @return {!Object}
  * @suppress {unusedLocalVariables} f is only used for nested messages
  */
-proto.WorkingGroupStatusMetadata.toObject = function(includeInstance, msg) {
+proto.WorkingGroupMetadata.toObject = function(includeInstance, msg) {
   var f, obj = {
     description: (f = jspb.Message.getField(msg, 1)) == null ? undefined : f,
     about: (f = jspb.Message.getField(msg, 2)) == null ? undefined : f,
@@ -1319,23 +1319,23 @@ proto.WorkingGroupStatusMetadata.toObject = function(includeInstance, msg) {
 /**
  * Deserializes binary data (in protobuf wire format).
  * @param {jspb.ByteSource} bytes The bytes to deserialize.
- * @return {!proto.WorkingGroupStatusMetadata}
+ * @return {!proto.WorkingGroupMetadata}
  */
-proto.WorkingGroupStatusMetadata.deserializeBinary = function(bytes) {
+proto.WorkingGroupMetadata.deserializeBinary = function(bytes) {
   var reader = new jspb.BinaryReader(bytes);
-  var msg = new proto.WorkingGroupStatusMetadata;
-  return proto.WorkingGroupStatusMetadata.deserializeBinaryFromReader(msg, reader);
+  var msg = new proto.WorkingGroupMetadata;
+  return proto.WorkingGroupMetadata.deserializeBinaryFromReader(msg, reader);
 };
 
 
 /**
  * Deserializes binary data (in protobuf wire format) from the
  * given reader into the given message object.
- * @param {!proto.WorkingGroupStatusMetadata} msg The message object to deserialize into.
+ * @param {!proto.WorkingGroupMetadata} msg The message object to deserialize into.
  * @param {!jspb.BinaryReader} reader The BinaryReader to use.
- * @return {!proto.WorkingGroupStatusMetadata}
+ * @return {!proto.WorkingGroupMetadata}
  */
-proto.WorkingGroupStatusMetadata.deserializeBinaryFromReader = function(msg, reader) {
+proto.WorkingGroupMetadata.deserializeBinaryFromReader = function(msg, reader) {
   while (reader.nextField()) {
     if (reader.isEndGroup()) {
       break;
@@ -1371,9 +1371,9 @@ proto.WorkingGroupStatusMetadata.deserializeBinaryFromReader = function(msg, rea
  * Serializes the message to binary data (in protobuf wire format).
  * @return {!Uint8Array}
  */
-proto.WorkingGroupStatusMetadata.prototype.serializeBinary = function() {
+proto.WorkingGroupMetadata.prototype.serializeBinary = function() {
   var writer = new jspb.BinaryWriter();
-  proto.WorkingGroupStatusMetadata.serializeBinaryToWriter(this, writer);
+  proto.WorkingGroupMetadata.serializeBinaryToWriter(this, writer);
   return writer.getResultBuffer();
 };
 
@@ -1381,11 +1381,11 @@ proto.WorkingGroupStatusMetadata.prototype.serializeBinary = function() {
 /**
  * Serializes the given message to binary data (in protobuf wire
  * format), writing to the given BinaryWriter.
- * @param {!proto.WorkingGroupStatusMetadata} message
+ * @param {!proto.WorkingGroupMetadata} message
  * @param {!jspb.BinaryWriter} writer
  * @suppress {unusedLocalVariables} f is only used for nested messages
  */
-proto.WorkingGroupStatusMetadata.serializeBinaryToWriter = function(message, writer) {
+proto.WorkingGroupMetadata.serializeBinaryToWriter = function(message, writer) {
   var f = undefined;
   f = /** @type {string} */ (jspb.Message.getField(message, 1));
   if (f != null) {
@@ -1422,25 +1422,25 @@ proto.WorkingGroupStatusMetadata.serializeBinaryToWriter = function(message, wri
  * optional string description = 1;
  * @return {string}
  */
-proto.WorkingGroupStatusMetadata.prototype.getDescription = function() {
+proto.WorkingGroupMetadata.prototype.getDescription = function() {
   return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
 };
 
 
 /**
  * @param {string} value
- * @return {!proto.WorkingGroupStatusMetadata} returns this
+ * @return {!proto.WorkingGroupMetadata} returns this
  */
-proto.WorkingGroupStatusMetadata.prototype.setDescription = function(value) {
+proto.WorkingGroupMetadata.prototype.setDescription = function(value) {
   return jspb.Message.setField(this, 1, value);
 };
 
 
 /**
  * Clears the field making it undefined.
- * @return {!proto.WorkingGroupStatusMetadata} returns this
+ * @return {!proto.WorkingGroupMetadata} returns this
  */
-proto.WorkingGroupStatusMetadata.prototype.clearDescription = function() {
+proto.WorkingGroupMetadata.prototype.clearDescription = function() {
   return jspb.Message.setField(this, 1, undefined);
 };
 
@@ -1449,7 +1449,7 @@ proto.WorkingGroupStatusMetadata.prototype.clearDescription = function() {
  * Returns whether this field is set.
  * @return {boolean}
  */
-proto.WorkingGroupStatusMetadata.prototype.hasDescription = function() {
+proto.WorkingGroupMetadata.prototype.hasDescription = function() {
   return jspb.Message.getField(this, 1) != null;
 };
 
@@ -1458,25 +1458,25 @@ proto.WorkingGroupStatusMetadata.prototype.hasDescription = function() {
  * optional string about = 2;
  * @return {string}
  */
-proto.WorkingGroupStatusMetadata.prototype.getAbout = function() {
+proto.WorkingGroupMetadata.prototype.getAbout = function() {
   return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
 };
 
 
 /**
  * @param {string} value
- * @return {!proto.WorkingGroupStatusMetadata} returns this
+ * @return {!proto.WorkingGroupMetadata} returns this
  */
-proto.WorkingGroupStatusMetadata.prototype.setAbout = function(value) {
+proto.WorkingGroupMetadata.prototype.setAbout = function(value) {
   return jspb.Message.setField(this, 2, value);
 };
 
 
 /**
  * Clears the field making it undefined.
- * @return {!proto.WorkingGroupStatusMetadata} returns this
+ * @return {!proto.WorkingGroupMetadata} returns this
  */
-proto.WorkingGroupStatusMetadata.prototype.clearAbout = function() {
+proto.WorkingGroupMetadata.prototype.clearAbout = function() {
   return jspb.Message.setField(this, 2, undefined);
 };
 
@@ -1485,7 +1485,7 @@ proto.WorkingGroupStatusMetadata.prototype.clearAbout = function() {
  * Returns whether this field is set.
  * @return {boolean}
  */
-proto.WorkingGroupStatusMetadata.prototype.hasAbout = function() {
+proto.WorkingGroupMetadata.prototype.hasAbout = function() {
   return jspb.Message.getField(this, 2) != null;
 };
 
@@ -1494,25 +1494,25 @@ proto.WorkingGroupStatusMetadata.prototype.hasAbout = function() {
  * optional string status = 3;
  * @return {string}
  */
-proto.WorkingGroupStatusMetadata.prototype.getStatus = function() {
+proto.WorkingGroupMetadata.prototype.getStatus = function() {
   return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
 };
 
 
 /**
  * @param {string} value
- * @return {!proto.WorkingGroupStatusMetadata} returns this
+ * @return {!proto.WorkingGroupMetadata} returns this
  */
-proto.WorkingGroupStatusMetadata.prototype.setStatus = function(value) {
+proto.WorkingGroupMetadata.prototype.setStatus = function(value) {
   return jspb.Message.setField(this, 3, value);
 };
 
 
 /**
  * Clears the field making it undefined.
- * @return {!proto.WorkingGroupStatusMetadata} returns this
+ * @return {!proto.WorkingGroupMetadata} returns this
  */
-proto.WorkingGroupStatusMetadata.prototype.clearStatus = function() {
+proto.WorkingGroupMetadata.prototype.clearStatus = function() {
   return jspb.Message.setField(this, 3, undefined);
 };
 
@@ -1521,7 +1521,7 @@ proto.WorkingGroupStatusMetadata.prototype.clearStatus = function() {
  * Returns whether this field is set.
  * @return {boolean}
  */
-proto.WorkingGroupStatusMetadata.prototype.hasStatus = function() {
+proto.WorkingGroupMetadata.prototype.hasStatus = function() {
   return jspb.Message.getField(this, 3) != null;
 };
 
@@ -1530,25 +1530,25 @@ proto.WorkingGroupStatusMetadata.prototype.hasStatus = function() {
  * optional string status_message = 4;
  * @return {string}
  */
-proto.WorkingGroupStatusMetadata.prototype.getStatusMessage = function() {
+proto.WorkingGroupMetadata.prototype.getStatusMessage = function() {
   return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, ""));
 };
 
 
 /**
  * @param {string} value
- * @return {!proto.WorkingGroupStatusMetadata} returns this
+ * @return {!proto.WorkingGroupMetadata} returns this
  */
-proto.WorkingGroupStatusMetadata.prototype.setStatusMessage = function(value) {
+proto.WorkingGroupMetadata.prototype.setStatusMessage = function(value) {
   return jspb.Message.setField(this, 4, value);
 };
 
 
 /**
  * Clears the field making it undefined.
- * @return {!proto.WorkingGroupStatusMetadata} returns this
+ * @return {!proto.WorkingGroupMetadata} returns this
  */
-proto.WorkingGroupStatusMetadata.prototype.clearStatusMessage = function() {
+proto.WorkingGroupMetadata.prototype.clearStatusMessage = function() {
   return jspb.Message.setField(this, 4, undefined);
 };
 
@@ -1557,7 +1557,7 @@ proto.WorkingGroupStatusMetadata.prototype.clearStatusMessage = function() {
  * Returns whether this field is set.
  * @return {boolean}
  */
-proto.WorkingGroupStatusMetadata.prototype.hasStatusMessage = function() {
+proto.WorkingGroupMetadata.prototype.hasStatusMessage = function() {
   return jspb.Message.getField(this, 4) != null;
 };
 
@@ -1594,7 +1594,7 @@ proto.SetGroupMetadata.prototype.toObject = function(opt_includeInstance) {
  */
 proto.SetGroupMetadata.toObject = function(includeInstance, msg) {
   var f, obj = {
-    newmetadata: (f = msg.getNewmetadata()) && proto.WorkingGroupStatusMetadata.toObject(includeInstance, f)
+    newMetadata: (f = msg.getNewMetadata()) && proto.WorkingGroupMetadata.toObject(includeInstance, f)
   };
 
   if (includeInstance) {
@@ -1632,9 +1632,9 @@ proto.SetGroupMetadata.deserializeBinaryFromReader = function(msg, reader) {
     var field = reader.getFieldNumber();
     switch (field) {
     case 1:
-      var value = new proto.WorkingGroupStatusMetadata;
-      reader.readMessage(value,proto.WorkingGroupStatusMetadata.deserializeBinaryFromReader);
-      msg.setNewmetadata(value);
+      var value = new proto.WorkingGroupMetadata;
+      reader.readMessage(value,proto.WorkingGroupMetadata.deserializeBinaryFromReader);
+      msg.setNewMetadata(value);
       break;
     default:
       reader.skipField();
@@ -1665,32 +1665,32 @@ proto.SetGroupMetadata.prototype.serializeBinary = function() {
  */
 proto.SetGroupMetadata.serializeBinaryToWriter = function(message, writer) {
   var f = undefined;
-  f = message.getNewmetadata();
+  f = message.getNewMetadata();
   if (f != null) {
     writer.writeMessage(
       1,
       f,
-      proto.WorkingGroupStatusMetadata.serializeBinaryToWriter
+      proto.WorkingGroupMetadata.serializeBinaryToWriter
     );
   }
 };
 
 
 /**
- * required WorkingGroupStatusMetadata newMetadata = 1;
- * @return {!proto.WorkingGroupStatusMetadata}
+ * required WorkingGroupMetadata new_metadata = 1;
+ * @return {!proto.WorkingGroupMetadata}
  */
-proto.SetGroupMetadata.prototype.getNewmetadata = function() {
-  return /** @type{!proto.WorkingGroupStatusMetadata} */ (
-    jspb.Message.getWrapperField(this, proto.WorkingGroupStatusMetadata, 1, 1));
+proto.SetGroupMetadata.prototype.getNewMetadata = function() {
+  return /** @type{!proto.WorkingGroupMetadata} */ (
+    jspb.Message.getWrapperField(this, proto.WorkingGroupMetadata, 1, 1));
 };
 
 
 /**
- * @param {!proto.WorkingGroupStatusMetadata} value
+ * @param {!proto.WorkingGroupMetadata} value
  * @return {!proto.SetGroupMetadata} returns this
 */
-proto.SetGroupMetadata.prototype.setNewmetadata = function(value) {
+proto.SetGroupMetadata.prototype.setNewMetadata = function(value) {
   return jspb.Message.setWrapperField(this, 1, value);
 };
 
@@ -1699,7 +1699,7 @@ proto.SetGroupMetadata.prototype.setNewmetadata = function(value) {
  * Clears the field making it undefined.
  * @return {!proto.SetGroupMetadata} returns this
  */
-proto.SetGroupMetadata.prototype.clearNewmetadata = function() {
+proto.SetGroupMetadata.prototype.clearNewMetadata = function() {
   return jspb.Message.setField(this, 1, undefined);
 };
 
@@ -1708,7 +1708,7 @@ proto.SetGroupMetadata.prototype.clearNewmetadata = function() {
  * Returns whether this field is set.
  * @return {boolean}
  */
-proto.SetGroupMetadata.prototype.hasNewmetadata = function() {
+proto.SetGroupMetadata.prototype.hasNewMetadata = function() {
   return jspb.Message.getField(this, 1) != null;
 };
 
@@ -2028,9 +2028,9 @@ proto.WorkingGroupMetadataAction.oneofGroups_ = [[1,2,3]];
  */
 proto.WorkingGroupMetadataAction.ActionCase = {
   ACTION_NOT_SET: 0,
-  SETGROUPMETADATA: 1,
-  ADDUPCOMINGOPENING: 2,
-  REMOVEUPCOMINGOPENING: 3
+  SET_GROUP_METADATA: 1,
+  ADD_UPCOMING_OPENING: 2,
+  REMOVE_UPCOMING_OPENING: 3
 };
 
 /**
@@ -2071,9 +2071,9 @@ proto.WorkingGroupMetadataAction.prototype.toObject = function(opt_includeInstan
  */
 proto.WorkingGroupMetadataAction.toObject = function(includeInstance, msg) {
   var f, obj = {
-    setgroupmetadata: (f = msg.getSetgroupmetadata()) && proto.SetGroupMetadata.toObject(includeInstance, f),
-    addupcomingopening: (f = msg.getAddupcomingopening()) && proto.AddUpcomingOpening.toObject(includeInstance, f),
-    removeupcomingopening: (f = msg.getRemoveupcomingopening()) && proto.RemoveUpcomingOpening.toObject(includeInstance, f)
+    setGroupMetadata: (f = msg.getSetGroupMetadata()) && proto.SetGroupMetadata.toObject(includeInstance, f),
+    addUpcomingOpening: (f = msg.getAddUpcomingOpening()) && proto.AddUpcomingOpening.toObject(includeInstance, f),
+    removeUpcomingOpening: (f = msg.getRemoveUpcomingOpening()) && proto.RemoveUpcomingOpening.toObject(includeInstance, f)
   };
 
   if (includeInstance) {
@@ -2113,17 +2113,17 @@ proto.WorkingGroupMetadataAction.deserializeBinaryFromReader = function(msg, rea
     case 1:
       var value = new proto.SetGroupMetadata;
       reader.readMessage(value,proto.SetGroupMetadata.deserializeBinaryFromReader);
-      msg.setSetgroupmetadata(value);
+      msg.setSetGroupMetadata(value);
       break;
     case 2:
       var value = new proto.AddUpcomingOpening;
       reader.readMessage(value,proto.AddUpcomingOpening.deserializeBinaryFromReader);
-      msg.setAddupcomingopening(value);
+      msg.setAddUpcomingOpening(value);
       break;
     case 3:
       var value = new proto.RemoveUpcomingOpening;
       reader.readMessage(value,proto.RemoveUpcomingOpening.deserializeBinaryFromReader);
-      msg.setRemoveupcomingopening(value);
+      msg.setRemoveUpcomingOpening(value);
       break;
     default:
       reader.skipField();
@@ -2154,7 +2154,7 @@ proto.WorkingGroupMetadataAction.prototype.serializeBinary = function() {
  */
 proto.WorkingGroupMetadataAction.serializeBinaryToWriter = function(message, writer) {
   var f = undefined;
-  f = message.getSetgroupmetadata();
+  f = message.getSetGroupMetadata();
   if (f != null) {
     writer.writeMessage(
       1,
@@ -2162,7 +2162,7 @@ proto.WorkingGroupMetadataAction.serializeBinaryToWriter = function(message, wri
       proto.SetGroupMetadata.serializeBinaryToWriter
     );
   }
-  f = message.getAddupcomingopening();
+  f = message.getAddUpcomingOpening();
   if (f != null) {
     writer.writeMessage(
       2,
@@ -2170,7 +2170,7 @@ proto.WorkingGroupMetadataAction.serializeBinaryToWriter = function(message, wri
       proto.AddUpcomingOpening.serializeBinaryToWriter
     );
   }
-  f = message.getRemoveupcomingopening();
+  f = message.getRemoveUpcomingOpening();
   if (f != null) {
     writer.writeMessage(
       3,
@@ -2182,10 +2182,10 @@ proto.WorkingGroupMetadataAction.serializeBinaryToWriter = function(message, wri
 
 
 /**
- * optional SetGroupMetadata setGroupMetadata = 1;
+ * optional SetGroupMetadata set_group_metadata = 1;
  * @return {?proto.SetGroupMetadata}
  */
-proto.WorkingGroupMetadataAction.prototype.getSetgroupmetadata = function() {
+proto.WorkingGroupMetadataAction.prototype.getSetGroupMetadata = function() {
   return /** @type{?proto.SetGroupMetadata} */ (
     jspb.Message.getWrapperField(this, proto.SetGroupMetadata, 1));
 };
@@ -2195,7 +2195,7 @@ proto.WorkingGroupMetadataAction.prototype.getSetgroupmetadata = function() {
  * @param {?proto.SetGroupMetadata|undefined} value
  * @return {!proto.WorkingGroupMetadataAction} returns this
 */
-proto.WorkingGroupMetadataAction.prototype.setSetgroupmetadata = function(value) {
+proto.WorkingGroupMetadataAction.prototype.setSetGroupMetadata = function(value) {
   return jspb.Message.setOneofWrapperField(this, 1, proto.WorkingGroupMetadataAction.oneofGroups_[0], value);
 };
 
@@ -2204,8 +2204,8 @@ proto.WorkingGroupMetadataAction.prototype.setSetgroupmetadata = function(value)
  * Clears the message field making it undefined.
  * @return {!proto.WorkingGroupMetadataAction} returns this
  */
-proto.WorkingGroupMetadataAction.prototype.clearSetgroupmetadata = function() {
-  return this.setSetgroupmetadata(undefined);
+proto.WorkingGroupMetadataAction.prototype.clearSetGroupMetadata = function() {
+  return this.setSetGroupMetadata(undefined);
 };
 
 
@@ -2213,16 +2213,16 @@ proto.WorkingGroupMetadataAction.prototype.clearSetgroupmetadata = function() {
  * Returns whether this field is set.
  * @return {boolean}
  */
-proto.WorkingGroupMetadataAction.prototype.hasSetgroupmetadata = function() {
+proto.WorkingGroupMetadataAction.prototype.hasSetGroupMetadata = function() {
   return jspb.Message.getField(this, 1) != null;
 };
 
 
 /**
- * optional AddUpcomingOpening addUpcomingOpening = 2;
+ * optional AddUpcomingOpening add_upcoming_opening = 2;
  * @return {?proto.AddUpcomingOpening}
  */
-proto.WorkingGroupMetadataAction.prototype.getAddupcomingopening = function() {
+proto.WorkingGroupMetadataAction.prototype.getAddUpcomingOpening = function() {
   return /** @type{?proto.AddUpcomingOpening} */ (
     jspb.Message.getWrapperField(this, proto.AddUpcomingOpening, 2));
 };
@@ -2232,7 +2232,7 @@ proto.WorkingGroupMetadataAction.prototype.getAddupcomingopening = function() {
  * @param {?proto.AddUpcomingOpening|undefined} value
  * @return {!proto.WorkingGroupMetadataAction} returns this
 */
-proto.WorkingGroupMetadataAction.prototype.setAddupcomingopening = function(value) {
+proto.WorkingGroupMetadataAction.prototype.setAddUpcomingOpening = function(value) {
   return jspb.Message.setOneofWrapperField(this, 2, proto.WorkingGroupMetadataAction.oneofGroups_[0], value);
 };
 
@@ -2241,8 +2241,8 @@ proto.WorkingGroupMetadataAction.prototype.setAddupcomingopening = function(valu
  * Clears the message field making it undefined.
  * @return {!proto.WorkingGroupMetadataAction} returns this
  */
-proto.WorkingGroupMetadataAction.prototype.clearAddupcomingopening = function() {
-  return this.setAddupcomingopening(undefined);
+proto.WorkingGroupMetadataAction.prototype.clearAddUpcomingOpening = function() {
+  return this.setAddUpcomingOpening(undefined);
 };
 
 
@@ -2250,16 +2250,16 @@ proto.WorkingGroupMetadataAction.prototype.clearAddupcomingopening = function()
  * Returns whether this field is set.
  * @return {boolean}
  */
-proto.WorkingGroupMetadataAction.prototype.hasAddupcomingopening = function() {
+proto.WorkingGroupMetadataAction.prototype.hasAddUpcomingOpening = function() {
   return jspb.Message.getField(this, 2) != null;
 };
 
 
 /**
- * optional RemoveUpcomingOpening removeUpcomingOpening = 3;
+ * optional RemoveUpcomingOpening remove_upcoming_opening = 3;
  * @return {?proto.RemoveUpcomingOpening}
  */
-proto.WorkingGroupMetadataAction.prototype.getRemoveupcomingopening = function() {
+proto.WorkingGroupMetadataAction.prototype.getRemoveUpcomingOpening = function() {
   return /** @type{?proto.RemoveUpcomingOpening} */ (
     jspb.Message.getWrapperField(this, proto.RemoveUpcomingOpening, 3));
 };
@@ -2269,7 +2269,7 @@ proto.WorkingGroupMetadataAction.prototype.getRemoveupcomingopening = function()
  * @param {?proto.RemoveUpcomingOpening|undefined} value
  * @return {!proto.WorkingGroupMetadataAction} returns this
 */
-proto.WorkingGroupMetadataAction.prototype.setRemoveupcomingopening = function(value) {
+proto.WorkingGroupMetadataAction.prototype.setRemoveUpcomingOpening = function(value) {
   return jspb.Message.setOneofWrapperField(this, 3, proto.WorkingGroupMetadataAction.oneofGroups_[0], value);
 };
 
@@ -2278,8 +2278,8 @@ proto.WorkingGroupMetadataAction.prototype.setRemoveupcomingopening = function(v
  * Clears the message field making it undefined.
  * @return {!proto.WorkingGroupMetadataAction} returns this
  */
-proto.WorkingGroupMetadataAction.prototype.clearRemoveupcomingopening = function() {
-  return this.setRemoveupcomingopening(undefined);
+proto.WorkingGroupMetadataAction.prototype.clearRemoveUpcomingOpening = function() {
+  return this.setRemoveUpcomingOpening(undefined);
 };
 
 
@@ -2287,7 +2287,7 @@ proto.WorkingGroupMetadataAction.prototype.clearRemoveupcomingopening = function
  * Returns whether this field is set.
  * @return {boolean}
  */
-proto.WorkingGroupMetadataAction.prototype.hasRemoveupcomingopening = function() {
+proto.WorkingGroupMetadataAction.prototype.hasRemoveUpcomingOpening = function() {
   return jspb.Message.getField(this, 3) != null;
 };
 

+ 5 - 5
metadata-protobuf/proto/WorkingGroups.proto

@@ -30,7 +30,7 @@ message ApplicationMetadata {
 
 // set_status_text extrinsic messages:
 
-message WorkingGroupStatusMetadata {
+message WorkingGroupMetadata {
   optional string description = 1; // Full status description (md-formatted)
   optional string about = 2; // Status about text (md-formatted)
   optional string status = 3; // The status itself (expected to be 1-3 words)
@@ -38,7 +38,7 @@ message WorkingGroupStatusMetadata {
 }
 
 message SetGroupMetadata {
-  required WorkingGroupStatusMetadata newMetadata = 1; // New working group metadata to set (can be a partial update)
+  required WorkingGroupMetadata new_metadata = 1; // New working group metadata to set (can be a partial update)
 }
 
 message AddUpcomingOpening {
@@ -51,8 +51,8 @@ message RemoveUpcomingOpening {
 
 message WorkingGroupMetadataAction {
   oneof action {
-    SetGroupMetadata setGroupMetadata = 1;
-    AddUpcomingOpening addUpcomingOpening = 2;
-    RemoveUpcomingOpening removeUpcomingOpening = 3;
+    SetGroupMetadata set_group_metadata = 1;
+    AddUpcomingOpening add_upcoming_opening = 2;
+    RemoveUpcomingOpening remove_upcoming_opening = 3;
   }
 }

+ 98 - 15
query-node/mappings/workingGroups.ts

@@ -8,6 +8,8 @@ import {
   AddUpcomingOpening,
   ApplicationMetadata,
   OpeningMetadata,
+  RemoveUpcomingOpening,
+  SetGroupMetadata,
   WorkingGroupMetadataAction,
 } from '@joystream/metadata-protobuf'
 import { Bytes } from '@polkadot/types'
@@ -42,6 +44,12 @@ import {
   ApplicationStatusWithdrawn,
   UpcomingWorkingGroupOpening,
   StatusTextChangedEvent,
+  WorkingGroupMetadata,
+  WorkingGroupMetadataSet,
+  UpcomingOpeningRemoved,
+  InvalidActionMetadata,
+  WorkingGroupMetadataActionResult,
+  UpcomingOpeningAdded,
 } from 'query-node/dist/model'
 import { createType } from '@joystream/types'
 import _ from 'lodash'
@@ -51,9 +59,13 @@ type InputTypeMap = OpeningMetadata.ApplicationFormQuestion.InputTypeMap
 const InputType = OpeningMetadata.ApplicationFormQuestion.InputType
 
 // Reusable functions
-async function getWorkingGroup(db: DatabaseManager, event_: SubstrateEvent): Promise<WorkingGroup> {
+async function getWorkingGroup(
+  db: DatabaseManager,
+  event_: SubstrateEvent,
+  relations: string[] = []
+): Promise<WorkingGroup> {
   const [groupName] = event_.name.split('.')
-  const group = await db.get(WorkingGroup, { where: { name: groupName } })
+  const group = await db.get(WorkingGroup, { where: { name: groupName }, relations })
   if (!group) {
     throw new Error(`Working group ${groupName} not found!`)
   }
@@ -217,7 +229,7 @@ async function handleAddUpcomingOpeningAction(
   event_: SubstrateEvent,
   statusChangedEvent: StatusTextChangedEvent,
   action: AddUpcomingOpening
-) {
+): Promise<UpcomingOpeningAdded> {
   const upcomingOpeningMeta = action.getMetadata().toObject()
   const group = await getWorkingGroup(db, event_)
   const eventTime = new Date(event_.blockTimestamp.toNumber())
@@ -240,6 +252,60 @@ async function handleAddUpcomingOpeningAction(
     createdAtBlock: await getOrCreateBlock(db, event_),
   })
   await db.save<UpcomingWorkingGroupOpening>(upcomingOpening)
+
+  const result = new UpcomingOpeningAdded()
+  result.upcomingOpeningId = upcomingOpening.id
+
+  return result
+}
+
+async function handleRemoveUpcomingOpeningAction(
+  db: DatabaseManager,
+  action: RemoveUpcomingOpening
+): Promise<UpcomingOpeningRemoved | InvalidActionMetadata> {
+  const id = action.getId()
+  const upcomingOpening = await db.get(UpcomingWorkingGroupOpening, { where: { id } })
+  let result: UpcomingOpeningRemoved | InvalidActionMetadata
+  if (upcomingOpening) {
+    result = new UpcomingOpeningRemoved()
+    result.upcomingOpeningId = upcomingOpening.id
+    await db.remove<UpcomingWorkingGroupOpening>(upcomingOpening)
+  } else {
+    const error = `Cannot remove upcoming opening: Entity by id ${id} not found!`
+    console.error(error)
+    result = new InvalidActionMetadata()
+    result.reason = error
+  }
+  return result
+}
+
+async function handleSetWorkingGroupMetadataAction(
+  db: DatabaseManager,
+  event_: SubstrateEvent,
+  action: SetGroupMetadata
+): Promise<WorkingGroupMetadataSet> {
+  const { newMetadata } = action.toObject()
+  const group = await getWorkingGroup(db, event_, ['metadata'])
+  const groupMetadata = group.metadata!
+  const eventTime = new Date(event_.blockTimestamp.toNumber())
+
+  const newGroupMetadata = new WorkingGroupMetadata({
+    ...groupMetadata,
+    ...newMetadata,
+    createdAt: eventTime,
+    updatedAt: eventTime,
+    setAtBlock: await getOrCreateBlock(db, event_),
+  })
+  await db.save<WorkingGroupMetadata>(newGroupMetadata)
+
+  group.metadata = newGroupMetadata
+  group.updatedAt = eventTime
+  await db.save<WorkingGroup>(group)
+
+  const result = new WorkingGroupMetadataSet()
+  result.metadataId = newGroupMetadata.id
+
+  return result
 }
 
 async function handleWorkingGroupMetadataAction(
@@ -247,21 +313,21 @@ async function handleWorkingGroupMetadataAction(
   event_: SubstrateEvent,
   statusChangedEvent: StatusTextChangedEvent,
   action: WorkingGroupMetadataAction
-) {
+): Promise<typeof WorkingGroupMetadataActionResult> {
   switch (action.getActionCase()) {
-    case WorkingGroupMetadataAction.ActionCase.ADDUPCOMINGOPENING: {
-      await handleAddUpcomingOpeningAction(db, event_, statusChangedEvent, action.getAddupcomingopening()!)
-      break
+    case WorkingGroupMetadataAction.ActionCase.ADD_UPCOMING_OPENING: {
+      return handleAddUpcomingOpeningAction(db, event_, statusChangedEvent, action.getAddUpcomingOpening()!)
     }
-    case WorkingGroupMetadataAction.ActionCase.REMOVEUPCOMINGOPENING: {
-      // TODO
-      break
+    case WorkingGroupMetadataAction.ActionCase.REMOVE_UPCOMING_OPENING: {
+      return handleRemoveUpcomingOpeningAction(db, action.getRemoveUpcomingOpening()!)
     }
-    case WorkingGroupMetadataAction.ActionCase.SETGROUPMETADATA: {
-      // TODO:
-      break
+    case WorkingGroupMetadataAction.ActionCase.SET_GROUP_METADATA: {
+      return handleSetWorkingGroupMetadataAction(db, event_, action.getSetGroupMetadata()!)
     }
   }
+  const result = new InvalidActionMetadata()
+  result.reason = 'Unexpected action type'
+  return result
 }
 
 // Mapping functions
@@ -555,24 +621,41 @@ export async function workingGroups_StatusTextChanged(db: DatabaseManager, event
   const group = await getWorkingGroup(db, event_)
   const eventTime = new Date(event_.blockTimestamp.toNumber())
 
+  // Since result cannot be empty at this point, but we already need to have an existing StatusTextChangedEvent
+  // in order to be able to create UpcomingOpening.createdInEvent relation, we use a temporary "mock" result
+  const mockResult = new InvalidActionMetadata()
+  mockResult.reason = 'Metadata not yet processed'
   const statusTextChangedEvent = new StatusTextChangedEvent({
     createdAt: eventTime,
     updatedAt: eventTime,
     group,
     event: await createEvent(db, event_, EventType.StatusTextChanged),
     metadata: optBytes.isSome ? optBytes.unwrap().toString() : undefined,
+    result: mockResult,
   })
 
   await db.save<StatusTextChangedEvent>(statusTextChangedEvent)
 
+  let result: typeof WorkingGroupMetadataActionResult
+
   if (optBytes.isSome) {
     const metadata = deserializeMetadata(WorkingGroupMetadataAction, optBytes.unwrap())
     if (metadata) {
-      handleWorkingGroupMetadataAction(db, event_, statusTextChangedEvent, metadata)
+      result = await handleWorkingGroupMetadataAction(db, event_, statusTextChangedEvent, metadata)
+    } else {
+      result = new InvalidActionMetadata()
+      result.reason = 'Invalid metadata: Cannot deserialize metadata binary'
     }
   } else {
-    console.warn('StatusTextChanged event: no metadata provided')
+    const error = 'No encoded metadata was provided'
+    console.error(`StatusTextChanged event: ${error}`)
+    result = new InvalidActionMetadata()
+    result.reason = error
   }
+
+  // Now we can set the "real" result
+  statusTextChangedEvent.result = result
+  await db.save<StatusTextChangedEvent>(statusTextChangedEvent)
 }
 
 export async function workingGroups_WorkerRoleAccountUpdated(

+ 7 - 12
query-node/schemas/workingGroups.graphql

@@ -73,11 +73,11 @@ type Worker @entity {
 }
 
 type WorkingGroupMetadata @entity {
-  "Status name"
-  name: String!
+  "Working group status"
+  status: String
 
-  "Status message"
-  message: String
+  "Working group status message"
+  statusMessage: String
 
   "Working group about text"
   about: String
@@ -85,19 +85,16 @@ type WorkingGroupMetadata @entity {
   "Working group description text"
   description: String
 
-  "Block the status was set at"
+  "Block the metadata was set at"
   setAtBlock: Block!
-
-  "The time at which status was set"
-  setAtTime: DateTime!
 }
 
 type WorkingGroup @entity {
   "Working group name"
-  name: String!
+  name: String! @unique
 
   "Working group current metadata"
-  status: WorkingGroupMetadata
+  metadata: WorkingGroupMetadata
 
   "Current working group leader"
   leader: Worker
@@ -110,8 +107,6 @@ type WorkingGroup @entity {
 
   "Current working group budget (JOY)"
   budget: BigInt!
-
-  # ...
 }
 
 type OpeningStatusCancelled @variant {

+ 27 - 1
query-node/schemas/workingGroupsEvents.graphql

@@ -242,7 +242,30 @@ type WorkerRewardAmountUpdatedEvent @entity {
   newRewardPerBlock: BigInt!
 }
 
-# TODO: Should we rename the event/extrinsic in the runtime?
+type UpcomingOpeningAdded @variant {
+  upcomingOpeningId: ID!
+}
+
+type UpcomingOpeningRemoved @variant {
+  upcomingOpeningId: ID!
+}
+
+type WorkingGroupMetadataSet @variant {
+  # TODO: Variant relationships
+  metadataId: ID!
+}
+
+type InvalidActionMetadata @variant {
+  "Reason why the action metadata was considered invalid"
+  reason: String!
+}
+
+union WorkingGroupMetadataActionResult =
+    UpcomingOpeningAdded
+  | UpcomingOpeningRemoved
+  | WorkingGroupMetadataSet
+  | InvalidActionMetadata
+
 type StatusTextChangedEvent @entity {
   "Generic event data"
   event: Event!
@@ -252,6 +275,9 @@ type StatusTextChangedEvent @entity {
 
   "Original action metadata as hex string"
   metadata: String
+
+  "Event result depeding on the metadata action type"
+  result: WorkingGroupMetadataActionResult!
 }
 
 type BudgetSpendingEvent @entity {

+ 82 - 0
tests/integration-tests/src/QueryNodeApi.ts

@@ -14,6 +14,8 @@ import {
   ReferralCutUpdatedEvent,
   StatusTextChangedEvent,
   UpcomingWorkingGroupOpening,
+  WorkingGroup,
+  WorkingGroupMetadata,
 } from './QueryNodeApiSchema.generated'
 import Debugger from 'debug'
 import { ApplicationId, OpeningId } from '@joystream/types/working-group'
@@ -797,6 +799,20 @@ export class QueryNodeApi {
             name
           }
           metadata
+          result {
+            ... on UpcomingOpeningAdded {
+              upcomingOpeningId
+            }
+            ... on UpcomingOpeningRemoved {
+              upcomingOpeningId
+            }
+            ... on WorkingGroupMetadataSet {
+              metadataId
+            }
+            ... on InvalidActionMetadata {
+              reason
+            }
+          }
         }
       }
     `
@@ -816,6 +832,7 @@ export class QueryNodeApi {
     const UPCOMING_OPENING_BY_ID = gql`
       query($eventId: ID!) {
         upcomingWorkingGroupOpenings(where: { createdInEventId_eq: $eventId }) {
+          id
           group {
             name
           }
@@ -853,4 +870,69 @@ export class QueryNodeApi {
       })
     ).data.upcomingWorkingGroupOpenings[0]
   }
+
+  public async getWorkingGroup(name: WorkingGroupModuleName): Promise<WorkingGroup | undefined> {
+    const GROUP_BY_NAME = gql`
+      query($name: String!) {
+        workingGroupByUniqueInput(where: { name: $name }) {
+          name
+          metadata {
+            id
+            status
+            statusMessage
+            about
+            description
+            setAtBlock {
+              number
+            }
+          }
+          leader {
+            id
+          }
+          budget
+        }
+      }
+    `
+
+    this.queryDebug(`Executing getWorkingGroup(${name})`)
+
+    return (
+      (
+        await this.queryNodeProvider.query<Pick<Query, 'workingGroupByUniqueInput'>>({
+          query: GROUP_BY_NAME,
+          variables: { name },
+        })
+      ).data.workingGroupByUniqueInput || undefined
+    )
+  }
+
+  // FIXME: Use blockheights once possible
+  public async getGroupMetaSnapshot(
+    timestamp: number,
+    matchType: 'eq' | 'lt' | 'lte' | 'gt' | 'gte' = 'eq'
+  ): Promise<WorkingGroupMetadata | undefined> {
+    const GROUP_META_SNAPSHOT_BY_TIMESTAMP = gql`
+      query($timestamp: DateTime!) {
+        workingGroupMetadata(where: { createdAt_${matchType}: $timestamp, createdAt_lte: $toTime }, orderBy: createdAt_DESC, limit: 1) {
+          id
+          status
+          statusMessage
+          about
+          description
+          setAtBlock {
+            number
+          }
+        }
+      }
+    `
+
+    this.queryDebug(`Executing getGroupMetaSnapshot(${timestamp}, ${matchType})`)
+
+    return (
+      await this.queryNodeProvider.query<Pick<Query, 'workingGroupMetadata'>>({
+        query: GROUP_META_SNAPSHOT_BY_TIMESTAMP,
+        variables: { timestamp: new Date(timestamp) },
+      })
+    ).data.workingGroupMetadata[0]
+  }
 }

+ 249 - 51
tests/integration-tests/src/QueryNodeApiSchema.generated.ts

@@ -1873,6 +1873,56 @@ export type InitialInvitationCountUpdatedEventWhereUniqueInput = {
   id: Scalars['ID']
 }
 
+export type InvalidActionMetadata = {
+  __typename?: 'InvalidActionMetadata'
+  /** Reason why the action metadata was considered invalid */
+  reason: Scalars['String']
+}
+
+export type InvalidActionMetadataCreateInput = {
+  reason: Scalars['String']
+}
+
+export type InvalidActionMetadataUpdateInput = {
+  reason?: Maybe<Scalars['String']>
+}
+
+export type InvalidActionMetadataWhereInput = {
+  id_eq?: Maybe<Scalars['ID']>
+  id_in?: Maybe<Array<Scalars['ID']>>
+  createdAt_eq?: Maybe<Scalars['DateTime']>
+  createdAt_lt?: Maybe<Scalars['DateTime']>
+  createdAt_lte?: Maybe<Scalars['DateTime']>
+  createdAt_gt?: Maybe<Scalars['DateTime']>
+  createdAt_gte?: Maybe<Scalars['DateTime']>
+  createdById_eq?: Maybe<Scalars['ID']>
+  createdById_in?: Maybe<Array<Scalars['ID']>>
+  updatedAt_eq?: Maybe<Scalars['DateTime']>
+  updatedAt_lt?: Maybe<Scalars['DateTime']>
+  updatedAt_lte?: Maybe<Scalars['DateTime']>
+  updatedAt_gt?: Maybe<Scalars['DateTime']>
+  updatedAt_gte?: Maybe<Scalars['DateTime']>
+  updatedById_eq?: Maybe<Scalars['ID']>
+  updatedById_in?: Maybe<Array<Scalars['ID']>>
+  deletedAt_all?: Maybe<Scalars['Boolean']>
+  deletedAt_eq?: Maybe<Scalars['DateTime']>
+  deletedAt_lt?: Maybe<Scalars['DateTime']>
+  deletedAt_lte?: Maybe<Scalars['DateTime']>
+  deletedAt_gt?: Maybe<Scalars['DateTime']>
+  deletedAt_gte?: Maybe<Scalars['DateTime']>
+  deletedById_eq?: Maybe<Scalars['ID']>
+  deletedById_in?: Maybe<Array<Scalars['ID']>>
+  reason_eq?: Maybe<Scalars['String']>
+  reason_contains?: Maybe<Scalars['String']>
+  reason_startsWith?: Maybe<Scalars['String']>
+  reason_endsWith?: Maybe<Scalars['String']>
+  reason_in?: Maybe<Array<Scalars['String']>>
+}
+
+export type InvalidActionMetadataWhereUniqueInput = {
+  id: Scalars['ID']
+}
+
 export type InvitesTransferredEvent = BaseGraphQlObject & {
   __typename?: 'InvitesTransferredEvent'
   id: Scalars['ID']
@@ -5891,6 +5941,8 @@ export type StatusTextChangedEvent = BaseGraphQlObject & {
   groupId: Scalars['String']
   /** Original action metadata as hex string */
   metadata?: Maybe<Scalars['String']>
+  /** Event result depeding on metadata action type */
+  result?: Maybe<WorkingGroupMetadataActionResult>
   upcomingworkinggroupopeningcreatedInEvent?: Maybe<Array<UpcomingWorkingGroupOpening>>
 }
 
@@ -5905,6 +5957,7 @@ export type StatusTextChangedEventCreateInput = {
   eventId: Scalars['ID']
   groupId: Scalars['ID']
   metadata?: Maybe<Scalars['String']>
+  result: Scalars['JSONObject']
 }
 
 export type StatusTextChangedEventEdge = {
@@ -5932,6 +5985,7 @@ export type StatusTextChangedEventUpdateInput = {
   eventId?: Maybe<Scalars['ID']>
   groupId?: Maybe<Scalars['ID']>
   metadata?: Maybe<Scalars['String']>
+  result?: Maybe<Scalars['JSONObject']>
 }
 
 export type StatusTextChangedEventWhereInput = {
@@ -5968,6 +6022,7 @@ export type StatusTextChangedEventWhereInput = {
   metadata_startsWith?: Maybe<Scalars['String']>
   metadata_endsWith?: Maybe<Scalars['String']>
   metadata_in?: Maybe<Array<Scalars['String']>>
+  result_json?: Maybe<Scalars['JSONObject']>
 }
 
 export type StatusTextChangedEventWhereUniqueInput = {
@@ -6215,6 +6270,104 @@ export type TerminatedWorkerEventWhereUniqueInput = {
   id: Scalars['ID']
 }
 
+export type UpcomingOpeningAdded = {
+  __typename?: 'UpcomingOpeningAdded'
+  upcomingOpeningId: Scalars['String']
+}
+
+export type UpcomingOpeningAddedCreateInput = {
+  upcomingOpeningId: Scalars['String']
+}
+
+export type UpcomingOpeningAddedUpdateInput = {
+  upcomingOpeningId?: Maybe<Scalars['String']>
+}
+
+export type UpcomingOpeningAddedWhereInput = {
+  id_eq?: Maybe<Scalars['ID']>
+  id_in?: Maybe<Array<Scalars['ID']>>
+  createdAt_eq?: Maybe<Scalars['DateTime']>
+  createdAt_lt?: Maybe<Scalars['DateTime']>
+  createdAt_lte?: Maybe<Scalars['DateTime']>
+  createdAt_gt?: Maybe<Scalars['DateTime']>
+  createdAt_gte?: Maybe<Scalars['DateTime']>
+  createdById_eq?: Maybe<Scalars['ID']>
+  createdById_in?: Maybe<Array<Scalars['ID']>>
+  updatedAt_eq?: Maybe<Scalars['DateTime']>
+  updatedAt_lt?: Maybe<Scalars['DateTime']>
+  updatedAt_lte?: Maybe<Scalars['DateTime']>
+  updatedAt_gt?: Maybe<Scalars['DateTime']>
+  updatedAt_gte?: Maybe<Scalars['DateTime']>
+  updatedById_eq?: Maybe<Scalars['ID']>
+  updatedById_in?: Maybe<Array<Scalars['ID']>>
+  deletedAt_all?: Maybe<Scalars['Boolean']>
+  deletedAt_eq?: Maybe<Scalars['DateTime']>
+  deletedAt_lt?: Maybe<Scalars['DateTime']>
+  deletedAt_lte?: Maybe<Scalars['DateTime']>
+  deletedAt_gt?: Maybe<Scalars['DateTime']>
+  deletedAt_gte?: Maybe<Scalars['DateTime']>
+  deletedById_eq?: Maybe<Scalars['ID']>
+  deletedById_in?: Maybe<Array<Scalars['ID']>>
+  upcomingOpeningId_eq?: Maybe<Scalars['String']>
+  upcomingOpeningId_contains?: Maybe<Scalars['String']>
+  upcomingOpeningId_startsWith?: Maybe<Scalars['String']>
+  upcomingOpeningId_endsWith?: Maybe<Scalars['String']>
+  upcomingOpeningId_in?: Maybe<Array<Scalars['String']>>
+}
+
+export type UpcomingOpeningAddedWhereUniqueInput = {
+  id: Scalars['ID']
+}
+
+export type UpcomingOpeningRemoved = {
+  __typename?: 'UpcomingOpeningRemoved'
+  upcomingOpeningId: Scalars['String']
+}
+
+export type UpcomingOpeningRemovedCreateInput = {
+  upcomingOpeningId: Scalars['String']
+}
+
+export type UpcomingOpeningRemovedUpdateInput = {
+  upcomingOpeningId?: Maybe<Scalars['String']>
+}
+
+export type UpcomingOpeningRemovedWhereInput = {
+  id_eq?: Maybe<Scalars['ID']>
+  id_in?: Maybe<Array<Scalars['ID']>>
+  createdAt_eq?: Maybe<Scalars['DateTime']>
+  createdAt_lt?: Maybe<Scalars['DateTime']>
+  createdAt_lte?: Maybe<Scalars['DateTime']>
+  createdAt_gt?: Maybe<Scalars['DateTime']>
+  createdAt_gte?: Maybe<Scalars['DateTime']>
+  createdById_eq?: Maybe<Scalars['ID']>
+  createdById_in?: Maybe<Array<Scalars['ID']>>
+  updatedAt_eq?: Maybe<Scalars['DateTime']>
+  updatedAt_lt?: Maybe<Scalars['DateTime']>
+  updatedAt_lte?: Maybe<Scalars['DateTime']>
+  updatedAt_gt?: Maybe<Scalars['DateTime']>
+  updatedAt_gte?: Maybe<Scalars['DateTime']>
+  updatedById_eq?: Maybe<Scalars['ID']>
+  updatedById_in?: Maybe<Array<Scalars['ID']>>
+  deletedAt_all?: Maybe<Scalars['Boolean']>
+  deletedAt_eq?: Maybe<Scalars['DateTime']>
+  deletedAt_lt?: Maybe<Scalars['DateTime']>
+  deletedAt_lte?: Maybe<Scalars['DateTime']>
+  deletedAt_gt?: Maybe<Scalars['DateTime']>
+  deletedAt_gte?: Maybe<Scalars['DateTime']>
+  deletedById_eq?: Maybe<Scalars['ID']>
+  deletedById_in?: Maybe<Array<Scalars['ID']>>
+  upcomingOpeningId_eq?: Maybe<Scalars['String']>
+  upcomingOpeningId_contains?: Maybe<Scalars['String']>
+  upcomingOpeningId_startsWith?: Maybe<Scalars['String']>
+  upcomingOpeningId_endsWith?: Maybe<Scalars['String']>
+  upcomingOpeningId_in?: Maybe<Array<Scalars['String']>>
+}
+
+export type UpcomingOpeningRemovedWhereUniqueInput = {
+  id: Scalars['ID']
+}
+
 export type UpcomingWorkingGroupOpening = BaseGraphQlObject & {
   __typename?: 'UpcomingWorkingGroupOpening'
   id: Scalars['ID']
@@ -6227,6 +6380,8 @@ export type UpcomingWorkingGroupOpening = BaseGraphQlObject & {
   version: Scalars['Int']
   createdInEvent: StatusTextChangedEvent
   createdInEventId: Scalars['String']
+  createdAtBlock: Block
+  createdAtBlockId: Scalars['String']
   group: WorkingGroup
   groupId: Scalars['String']
   /** Expected opening start time */
@@ -6235,8 +6390,6 @@ export type UpcomingWorkingGroupOpening = BaseGraphQlObject & {
   stakeAmount: Scalars['BigInt']
   /** Expected reward per block */
   rewardPerBlock: Scalars['BigInt']
-  createdAtBlock: Block
-  createdAtBlockId: Scalars['String']
   metadata: WorkingGroupOpeningMetadata
   metadataId: Scalars['String']
 }
@@ -6250,11 +6403,11 @@ export type UpcomingWorkingGroupOpeningConnection = {
 
 export type UpcomingWorkingGroupOpeningCreateInput = {
   createdInEventId: Scalars['ID']
+  createdAtBlockId: Scalars['ID']
   groupId: Scalars['ID']
   expectedStart: Scalars['DateTime']
   stakeAmount: Scalars['BigInt']
   rewardPerBlock: Scalars['BigInt']
-  createdAtBlockId: Scalars['ID']
   metadataId: Scalars['ID']
 }
 
@@ -6273,6 +6426,8 @@ export enum UpcomingWorkingGroupOpeningOrderByInput {
   DeletedAtDesc = 'deletedAt_DESC',
   CreatedInEventIdAsc = 'createdInEventId_ASC',
   CreatedInEventIdDesc = 'createdInEventId_DESC',
+  CreatedAtBlockIdAsc = 'createdAtBlockId_ASC',
+  CreatedAtBlockIdDesc = 'createdAtBlockId_DESC',
   GroupIdAsc = 'groupId_ASC',
   GroupIdDesc = 'groupId_DESC',
   ExpectedStartAsc = 'expectedStart_ASC',
@@ -6281,19 +6436,17 @@ export enum UpcomingWorkingGroupOpeningOrderByInput {
   StakeAmountDesc = 'stakeAmount_DESC',
   RewardPerBlockAsc = 'rewardPerBlock_ASC',
   RewardPerBlockDesc = 'rewardPerBlock_DESC',
-  CreatedAtBlockIdAsc = 'createdAtBlockId_ASC',
-  CreatedAtBlockIdDesc = 'createdAtBlockId_DESC',
   MetadataIdAsc = 'metadataId_ASC',
   MetadataIdDesc = 'metadataId_DESC',
 }
 
 export type UpcomingWorkingGroupOpeningUpdateInput = {
   createdInEventId?: Maybe<Scalars['ID']>
+  createdAtBlockId?: Maybe<Scalars['ID']>
   groupId?: Maybe<Scalars['ID']>
   expectedStart?: Maybe<Scalars['DateTime']>
   stakeAmount?: Maybe<Scalars['BigInt']>
   rewardPerBlock?: Maybe<Scalars['BigInt']>
-  createdAtBlockId?: Maybe<Scalars['ID']>
   metadataId?: Maybe<Scalars['ID']>
 }
 
@@ -6324,6 +6477,8 @@ export type UpcomingWorkingGroupOpeningWhereInput = {
   deletedById_in?: Maybe<Array<Scalars['ID']>>
   createdInEventId_eq?: Maybe<Scalars['ID']>
   createdInEventId_in?: Maybe<Array<Scalars['ID']>>
+  createdAtBlockId_eq?: Maybe<Scalars['ID']>
+  createdAtBlockId_in?: Maybe<Array<Scalars['ID']>>
   groupId_eq?: Maybe<Scalars['ID']>
   groupId_in?: Maybe<Array<Scalars['ID']>>
   expectedStart_eq?: Maybe<Scalars['DateTime']>
@@ -6343,8 +6498,6 @@ export type UpcomingWorkingGroupOpeningWhereInput = {
   rewardPerBlock_lt?: Maybe<Scalars['BigInt']>
   rewardPerBlock_lte?: Maybe<Scalars['BigInt']>
   rewardPerBlock_in?: Maybe<Array<Scalars['BigInt']>>
-  createdAtBlockId_eq?: Maybe<Scalars['ID']>
-  createdAtBlockId_in?: Maybe<Array<Scalars['ID']>>
   metadataId_eq?: Maybe<Scalars['ID']>
   metadataId_in?: Maybe<Array<Scalars['ID']>>
 }
@@ -7268,8 +7421,8 @@ export type WorkingGroup = BaseGraphQlObject & {
   version: Scalars['Int']
   /** Working group name */
   name: Scalars['String']
-  status?: Maybe<WorkingGroupMetadata>
-  statusId?: Maybe<Scalars['String']>
+  metadata?: Maybe<WorkingGroupMetadata>
+  metadataId?: Maybe<Scalars['String']>
   leader?: Maybe<Worker>
   leaderId?: Maybe<Scalars['String']>
   workers: Array<Worker>
@@ -7480,7 +7633,7 @@ export type WorkingGroupConnection = {
 
 export type WorkingGroupCreateInput = {
   name: Scalars['String']
-  statusId?: Maybe<Scalars['ID']>
+  metadataId?: Maybe<Scalars['ID']>
   leaderId?: Maybe<Scalars['ID']>
   budget: Scalars['BigInt']
 }
@@ -7501,21 +7654,25 @@ export type WorkingGroupMetadata = BaseGraphQlObject & {
   deletedAt?: Maybe<Scalars['DateTime']>
   deletedById?: Maybe<Scalars['String']>
   version: Scalars['Int']
-  /** Status name */
-  name: Scalars['String']
-  /** Status message */
-  message?: Maybe<Scalars['String']>
+  /** Working group status */
+  status?: Maybe<Scalars['String']>
+  /** Working group status message */
+  statusMessage?: Maybe<Scalars['String']>
   /** Working group about text */
   about?: Maybe<Scalars['String']>
   /** Working group description text */
   description?: Maybe<Scalars['String']>
   setAtBlock: Block
   setAtBlockId: Scalars['String']
-  /** The time at which status was set */
-  setAtTime: Scalars['DateTime']
-  workinggroupstatus?: Maybe<Array<WorkingGroup>>
+  workinggroupmetadata?: Maybe<Array<WorkingGroup>>
 }
 
+export type WorkingGroupMetadataActionResult =
+  | UpcomingOpeningAdded
+  | UpcomingOpeningRemoved
+  | WorkingGroupMetadataSet
+  | InvalidActionMetadata
+
 export type WorkingGroupMetadataConnection = {
   __typename?: 'WorkingGroupMetadataConnection'
   totalCount: Scalars['Int']
@@ -7524,12 +7681,11 @@ export type WorkingGroupMetadataConnection = {
 }
 
 export type WorkingGroupMetadataCreateInput = {
-  name: Scalars['String']
-  message?: Maybe<Scalars['String']>
+  status?: Maybe<Scalars['String']>
+  statusMessage?: Maybe<Scalars['String']>
   about?: Maybe<Scalars['String']>
   description?: Maybe<Scalars['String']>
   setAtBlockId: Scalars['ID']
-  setAtTime: Scalars['DateTime']
 }
 
 export type WorkingGroupMetadataEdge = {
@@ -7545,27 +7701,73 @@ export enum WorkingGroupMetadataOrderByInput {
   UpdatedAtDesc = 'updatedAt_DESC',
   DeletedAtAsc = 'deletedAt_ASC',
   DeletedAtDesc = 'deletedAt_DESC',
-  NameAsc = 'name_ASC',
-  NameDesc = 'name_DESC',
-  MessageAsc = 'message_ASC',
-  MessageDesc = 'message_DESC',
+  StatusAsc = 'status_ASC',
+  StatusDesc = 'status_DESC',
+  StatusMessageAsc = 'statusMessage_ASC',
+  StatusMessageDesc = 'statusMessage_DESC',
   AboutAsc = 'about_ASC',
   AboutDesc = 'about_DESC',
   DescriptionAsc = 'description_ASC',
   DescriptionDesc = 'description_DESC',
   SetAtBlockIdAsc = 'setAtBlockId_ASC',
   SetAtBlockIdDesc = 'setAtBlockId_DESC',
-  SetAtTimeAsc = 'setAtTime_ASC',
-  SetAtTimeDesc = 'setAtTime_DESC',
+}
+
+export type WorkingGroupMetadataSet = {
+  __typename?: 'WorkingGroupMetadataSet'
+  metadataId: Scalars['String']
+}
+
+export type WorkingGroupMetadataSetCreateInput = {
+  metadataId: Scalars['String']
+}
+
+export type WorkingGroupMetadataSetUpdateInput = {
+  metadataId?: Maybe<Scalars['String']>
+}
+
+export type WorkingGroupMetadataSetWhereInput = {
+  id_eq?: Maybe<Scalars['ID']>
+  id_in?: Maybe<Array<Scalars['ID']>>
+  createdAt_eq?: Maybe<Scalars['DateTime']>
+  createdAt_lt?: Maybe<Scalars['DateTime']>
+  createdAt_lte?: Maybe<Scalars['DateTime']>
+  createdAt_gt?: Maybe<Scalars['DateTime']>
+  createdAt_gte?: Maybe<Scalars['DateTime']>
+  createdById_eq?: Maybe<Scalars['ID']>
+  createdById_in?: Maybe<Array<Scalars['ID']>>
+  updatedAt_eq?: Maybe<Scalars['DateTime']>
+  updatedAt_lt?: Maybe<Scalars['DateTime']>
+  updatedAt_lte?: Maybe<Scalars['DateTime']>
+  updatedAt_gt?: Maybe<Scalars['DateTime']>
+  updatedAt_gte?: Maybe<Scalars['DateTime']>
+  updatedById_eq?: Maybe<Scalars['ID']>
+  updatedById_in?: Maybe<Array<Scalars['ID']>>
+  deletedAt_all?: Maybe<Scalars['Boolean']>
+  deletedAt_eq?: Maybe<Scalars['DateTime']>
+  deletedAt_lt?: Maybe<Scalars['DateTime']>
+  deletedAt_lte?: Maybe<Scalars['DateTime']>
+  deletedAt_gt?: Maybe<Scalars['DateTime']>
+  deletedAt_gte?: Maybe<Scalars['DateTime']>
+  deletedById_eq?: Maybe<Scalars['ID']>
+  deletedById_in?: Maybe<Array<Scalars['ID']>>
+  metadataId_eq?: Maybe<Scalars['String']>
+  metadataId_contains?: Maybe<Scalars['String']>
+  metadataId_startsWith?: Maybe<Scalars['String']>
+  metadataId_endsWith?: Maybe<Scalars['String']>
+  metadataId_in?: Maybe<Array<Scalars['String']>>
+}
+
+export type WorkingGroupMetadataSetWhereUniqueInput = {
+  id: Scalars['ID']
 }
 
 export type WorkingGroupMetadataUpdateInput = {
-  name?: Maybe<Scalars['String']>
-  message?: Maybe<Scalars['String']>
+  status?: Maybe<Scalars['String']>
+  statusMessage?: Maybe<Scalars['String']>
   about?: Maybe<Scalars['String']>
   description?: Maybe<Scalars['String']>
   setAtBlockId?: Maybe<Scalars['ID']>
-  setAtTime?: Maybe<Scalars['DateTime']>
 }
 
 export type WorkingGroupMetadataWhereInput = {
@@ -7593,16 +7795,16 @@ export type WorkingGroupMetadataWhereInput = {
   deletedAt_gte?: Maybe<Scalars['DateTime']>
   deletedById_eq?: Maybe<Scalars['ID']>
   deletedById_in?: Maybe<Array<Scalars['ID']>>
-  name_eq?: Maybe<Scalars['String']>
-  name_contains?: Maybe<Scalars['String']>
-  name_startsWith?: Maybe<Scalars['String']>
-  name_endsWith?: Maybe<Scalars['String']>
-  name_in?: Maybe<Array<Scalars['String']>>
-  message_eq?: Maybe<Scalars['String']>
-  message_contains?: Maybe<Scalars['String']>
-  message_startsWith?: Maybe<Scalars['String']>
-  message_endsWith?: Maybe<Scalars['String']>
-  message_in?: Maybe<Array<Scalars['String']>>
+  status_eq?: Maybe<Scalars['String']>
+  status_contains?: Maybe<Scalars['String']>
+  status_startsWith?: Maybe<Scalars['String']>
+  status_endsWith?: Maybe<Scalars['String']>
+  status_in?: Maybe<Array<Scalars['String']>>
+  statusMessage_eq?: Maybe<Scalars['String']>
+  statusMessage_contains?: Maybe<Scalars['String']>
+  statusMessage_startsWith?: Maybe<Scalars['String']>
+  statusMessage_endsWith?: Maybe<Scalars['String']>
+  statusMessage_in?: Maybe<Array<Scalars['String']>>
   about_eq?: Maybe<Scalars['String']>
   about_contains?: Maybe<Scalars['String']>
   about_startsWith?: Maybe<Scalars['String']>
@@ -7615,11 +7817,6 @@ export type WorkingGroupMetadataWhereInput = {
   description_in?: Maybe<Array<Scalars['String']>>
   setAtBlockId_eq?: Maybe<Scalars['ID']>
   setAtBlockId_in?: Maybe<Array<Scalars['ID']>>
-  setAtTime_eq?: Maybe<Scalars['DateTime']>
-  setAtTime_lt?: Maybe<Scalars['DateTime']>
-  setAtTime_lte?: Maybe<Scalars['DateTime']>
-  setAtTime_gt?: Maybe<Scalars['DateTime']>
-  setAtTime_gte?: Maybe<Scalars['DateTime']>
 }
 
 export type WorkingGroupMetadataWhereUniqueInput = {
@@ -7944,8 +8141,8 @@ export enum WorkingGroupOrderByInput {
   DeletedAtDesc = 'deletedAt_DESC',
   NameAsc = 'name_ASC',
   NameDesc = 'name_DESC',
-  StatusIdAsc = 'statusId_ASC',
-  StatusIdDesc = 'statusId_DESC',
+  MetadataIdAsc = 'metadataId_ASC',
+  MetadataIdDesc = 'metadataId_DESC',
   LeaderIdAsc = 'leaderId_ASC',
   LeaderIdDesc = 'leaderId_DESC',
   BudgetAsc = 'budget_ASC',
@@ -7954,7 +8151,7 @@ export enum WorkingGroupOrderByInput {
 
 export type WorkingGroupUpdateInput = {
   name?: Maybe<Scalars['String']>
-  statusId?: Maybe<Scalars['ID']>
+  metadataId?: Maybe<Scalars['ID']>
   leaderId?: Maybe<Scalars['ID']>
   budget?: Maybe<Scalars['BigInt']>
 }
@@ -7989,8 +8186,8 @@ export type WorkingGroupWhereInput = {
   name_startsWith?: Maybe<Scalars['String']>
   name_endsWith?: Maybe<Scalars['String']>
   name_in?: Maybe<Array<Scalars['String']>>
-  statusId_eq?: Maybe<Scalars['ID']>
-  statusId_in?: Maybe<Array<Scalars['ID']>>
+  metadataId_eq?: Maybe<Scalars['ID']>
+  metadataId_in?: Maybe<Array<Scalars['ID']>>
   leaderId_eq?: Maybe<Scalars['ID']>
   leaderId_in?: Maybe<Array<Scalars['ID']>>
   budget_eq?: Maybe<Scalars['BigInt']>
@@ -8002,5 +8199,6 @@ export type WorkingGroupWhereInput = {
 }
 
 export type WorkingGroupWhereUniqueInput = {
-  id: Scalars['ID']
+  id?: Maybe<Scalars['ID']>
+  name?: Maybe<Scalars['String']>
 }

+ 205 - 2
tests/integration-tests/src/fixtures/workingGroupsModule.ts

@@ -19,13 +19,18 @@ import {
   StatusTextChangedEvent,
   UpcomingWorkingGroupOpening,
   WorkingGroupOpeningMetadata,
+  WorkingGroup,
+  WorkingGroupMetadata as QWorkingGroupMetadata,
 } from '../QueryNodeApiSchema.generated'
 import {
   AddUpcomingOpening,
   ApplicationMetadata,
   OpeningMetadata,
+  RemoveUpcomingOpening,
   UpcomingOpeningMetadata,
   WorkingGroupMetadataAction,
+  WorkingGroupMetadata,
+  SetGroupMetadata,
 } from '@joystream/metadata-protobuf'
 import {
   WorkingGroupModuleName,
@@ -689,6 +694,7 @@ export class CreateUpcomingOpeningFixture extends BaseCreateOpeningFixture {
 
   private tx?: SubmittableExtrinsic<'promise'>
   private event?: EventDetails
+  private createdUpcomingOpeningId?: string
 
   public constructor(
     api: Api,
@@ -702,6 +708,13 @@ export class CreateUpcomingOpeningFixture extends BaseCreateOpeningFixture {
     this.expectedStartTs = expectedStartTs || Date.now() + 3600
   }
 
+  public getCreatedUpcomingOpeningId() {
+    if (!this.createdUpcomingOpeningId) {
+      throw new Error('Trying to get created UpcomingOpening id before it is known')
+    }
+    return this.createdUpcomingOpeningId
+  }
+
   private getActionMetadata(): WorkingGroupMetadataAction {
     const actionMeta = new WorkingGroupMetadataAction()
     const addUpcomingOpeningMeta = new AddUpcomingOpening()
@@ -714,7 +727,7 @@ export class CreateUpcomingOpeningFixture extends BaseCreateOpeningFixture {
     upcomingOpeningMeta.setRewardPerBlock(this.openingParams.reward.toNumber())
 
     addUpcomingOpeningMeta.setMetadata(upcomingOpeningMeta)
-    actionMeta.setAddupcomingopening(addUpcomingOpeningMeta)
+    actionMeta.setAddUpcomingOpening(addUpcomingOpeningMeta)
 
     return actionMeta
   }
@@ -751,6 +764,10 @@ export class CreateUpcomingOpeningFixture extends BaseCreateOpeningFixture {
     assert.equal(qEvent.event.type, EventType.StatusTextChanged)
     assert.equal(qEvent.group.name, this.group)
     assert.equal(qEvent.metadata, Utils.metadataToBytes(this.getActionMetadata()).toString())
+    if (!qEvent.result) {
+      throw new Error('StatusTextChangedEvent: No result found')
+    }
+    assert.equal(qEvent.result.__typename, 'UpcomingOpeningAdded')
   }
 
   async runQueryNodeChecks(): Promise<void> {
@@ -761,9 +778,195 @@ export class CreateUpcomingOpeningFixture extends BaseCreateOpeningFixture {
     const qEvent = (await this.query.tryQueryWithTimeout(
       () => this.query.getStatusTextChangedEvent(event.blockNumber, event.indexInBlock),
       (qEvent) => this.assertQueriedStatusTextChangedEventIsValid(tx.hash.toString(), qEvent)
-    )) as OpeningCanceledEvent
+    )) as StatusTextChangedEvent
     // Query the opening
     const qUpcomingOpening = await this.query.getUpcomingOpeningByCreatedInEventId(qEvent.id)
     this.assertQueriedUpcomingOpeningIsValid(event, qUpcomingOpening)
+    if (qEvent.result && qEvent.result.__typename === 'UpcomingOpeningAdded') {
+      assert.equal(qEvent.result.upcomingOpeningId, qUpcomingOpening!.id)
+    }
+    this.createdUpcomingOpeningId = qUpcomingOpening!.id
+  }
+}
+
+export class RemoveUpcomingOpeningFixture extends BaseFixture {
+  private query: QueryNodeApi
+  private group: WorkingGroupModuleName
+  private upcomingOpeningId: string
+  private debug: Debugger.Debugger
+
+  private tx?: SubmittableExtrinsic<'promise'>
+  private event?: EventDetails
+
+  public constructor(api: Api, query: QueryNodeApi, group: WorkingGroupModuleName, upcomingOpeningId: string) {
+    super(api)
+    this.query = query
+    this.group = group
+    this.upcomingOpeningId = upcomingOpeningId
+    this.debug = Debugger(`fixture:RemoveUpcomingOpeningFixture:${group}`)
+  }
+
+  private getActionMetadata(): WorkingGroupMetadataAction {
+    const actionMeta = new WorkingGroupMetadataAction()
+    const removeUpcomingOpeningMeta = new RemoveUpcomingOpening()
+    removeUpcomingOpeningMeta.setId(this.upcomingOpeningId)
+    actionMeta.setRemoveUpcomingOpening(removeUpcomingOpeningMeta)
+
+    return actionMeta
+  }
+
+  async execute() {
+    const account = await this.api.getLeadRoleKey(this.group)
+    this.tx = this.api.tx[this.group].setStatusText(Utils.metadataToBytes(this.getActionMetadata()))
+    const txFee = await this.api.estimateTxFee(this.tx, account)
+    await this.api.treasuryTransferBalance(account, txFee)
+    const result = await this.api.signAndSend(this.tx, account)
+    this.event = await this.api.retrieveWorkingGroupsEventDetails(result, this.group, 'StatusTextChanged')
+  }
+
+  private assertQueriedStatusTextChangedEventIsValid(txHash: string, qEvent?: StatusTextChangedEvent) {
+    if (!qEvent) {
+      throw new Error('Query node: StatusTextChangedEvent not found!')
+    }
+    assert.equal(qEvent.event.inExtrinsic, txHash)
+    assert.equal(qEvent.event.type, EventType.StatusTextChanged)
+    assert.equal(qEvent.group.name, this.group)
+    assert.equal(qEvent.metadata, Utils.metadataToBytes(this.getActionMetadata()).toString())
+    if (!qEvent.result) {
+      throw new Error('StatusTextChangedEvent: No result found')
+    }
+    assert.equal(qEvent.result.__typename, 'UpcomingOpeningRemoved')
+    if (qEvent.result.__typename === 'UpcomingOpeningRemoved') {
+      assert.equal(qEvent.result.upcomingOpeningId, this.upcomingOpeningId)
+    }
+  }
+
+  async runQueryNodeChecks(): Promise<void> {
+    await super.runQueryNodeChecks()
+    const tx = this.tx!
+    const event = this.event!
+    // Query the event
+    const qEvent = (await this.query.tryQueryWithTimeout(
+      () => this.query.getStatusTextChangedEvent(event.blockNumber, event.indexInBlock),
+      (qEvent) => this.assertQueriedStatusTextChangedEventIsValid(tx.hash.toString(), qEvent)
+    )) as StatusTextChangedEvent
+    // Query the opening and make sure it doesn't exist
+    if (qEvent.result && qEvent.result.__typename === 'UpcomingOpeningRemoved') {
+      const qUpcomingOpening = await this.query.getUpcomingOpeningByCreatedInEventId(qEvent.result.upcomingOpeningId)
+      assert.isUndefined(qUpcomingOpening)
+    }
+  }
+}
+
+export class UpdateGroupStatusFixture extends BaseFixture {
+  private query: QueryNodeApi
+  private group: WorkingGroupModuleName
+  private metadata: WorkingGroupMetadata.AsObject
+  private debug: Debugger.Debugger
+
+  private tx?: SubmittableExtrinsic<'promise'>
+  private event?: EventDetails
+
+  public constructor(
+    api: Api,
+    query: QueryNodeApi,
+    group: WorkingGroupModuleName,
+    metadata: WorkingGroupMetadata.AsObject
+  ) {
+    super(api)
+    this.query = query
+    this.group = group
+    this.metadata = metadata
+    this.debug = Debugger(`fixture:UpdateGroupStatusFixture:${group}`)
+  }
+
+  private getActionMetadata(): WorkingGroupMetadataAction {
+    const actionMeta = new WorkingGroupMetadataAction()
+    const setGroupMeta = new SetGroupMetadata()
+    const newGroupMeta = new WorkingGroupMetadata()
+
+    newGroupMeta.setAbout(this.metadata.about!)
+    newGroupMeta.setDescription(this.metadata.description!)
+    newGroupMeta.setStatus(this.metadata.status!)
+    newGroupMeta.setStatusMessage(this.metadata.statusMessage!)
+
+    setGroupMeta.setNewMetadata(newGroupMeta)
+    actionMeta.setSetGroupMetadata(setGroupMeta)
+
+    return actionMeta
+  }
+
+  async execute() {
+    const account = await this.api.getLeadRoleKey(this.group)
+    this.tx = this.api.tx[this.group].setStatusText(Utils.metadataToBytes(this.getActionMetadata()))
+    const txFee = await this.api.estimateTxFee(this.tx, account)
+    await this.api.treasuryTransferBalance(account, txFee)
+    const result = await this.api.signAndSend(this.tx, account)
+    this.event = await this.api.retrieveWorkingGroupsEventDetails(result, this.group, 'StatusTextChanged')
+  }
+
+  private assertQueriedStatusTextChangedEventIsValid(txHash: string, qEvent?: StatusTextChangedEvent) {
+    if (!qEvent) {
+      throw new Error('Query node: StatusTextChangedEvent not found!')
+    }
+    assert.equal(qEvent.event.inExtrinsic, txHash)
+    assert.equal(qEvent.event.type, EventType.StatusTextChanged)
+    assert.equal(qEvent.group.name, this.group)
+    assert.equal(qEvent.metadata, Utils.metadataToBytes(this.getActionMetadata()).toString())
+    if (!qEvent.result) {
+      throw new Error('StatusTextChangedEvent: No result found')
+    }
+    assert.equal(qEvent.result.__typename, 'WorkingGroupMetadataSet')
+  }
+
+  private assertQueriedGroupIsValid(qGroup: WorkingGroup | undefined, qMeta: QWorkingGroupMetadata) {
+    if (!qGroup) {
+      throw new Error(`Query node: Group ${this.group} not found!`)
+    }
+    if (!qGroup.metadata) {
+      throw new Error(`Query node: Group metadata is empty!`)
+    }
+    assert.equal(qGroup.metadata.id, qMeta.id)
+  }
+
+  private assertQueriedMetadataSnapshotsAreValid(
+    eventDetails: EventDetails,
+    beforeSnapshot?: QWorkingGroupMetadata,
+    afterSnapshot?: QWorkingGroupMetadata
+  ) {
+    if (!afterSnapshot) {
+      throw new Error('Query node: WorkingGroupMetadata snapshot not found!')
+    }
+    const expectedMeta = _.merge(this.metadata, beforeSnapshot)
+    assert.equal(afterSnapshot.status, expectedMeta.status)
+    assert.equal(afterSnapshot.statusMessage, expectedMeta.statusMessage)
+    assert.equal(afterSnapshot.description, expectedMeta.description)
+    assert.equal(afterSnapshot.about, expectedMeta.about)
+    assert.equal(afterSnapshot.setAtBlock.number, eventDetails.blockNumber)
+  }
+
+  async runQueryNodeChecks(): Promise<void> {
+    await super.runQueryNodeChecks()
+    const tx = this.tx!
+    const event = this.event!
+    // Query & check the event
+    const qEvent = (await this.query.tryQueryWithTimeout(
+      () => this.query.getStatusTextChangedEvent(event.blockNumber, event.indexInBlock),
+      (qEvent) => this.assertQueriedStatusTextChangedEventIsValid(tx.hash.toString(), qEvent)
+    )) as StatusTextChangedEvent
+
+    // Query & check the metadata snapshots
+    const beforeSnapshot = await this.query.getGroupMetaSnapshot(event.blockTimestamp, 'lt')
+    const afterSnapshot = await this.query.getGroupMetaSnapshot(event.blockTimestamp, 'eq')
+    this.assertQueriedMetadataSnapshotsAreValid(event, beforeSnapshot, afterSnapshot)
+
+    // Query & check the group
+    const qGroup = await this.query.getWorkingGroup(this.group)
+    this.assertQueriedGroupIsValid(qGroup, afterSnapshot!)
+
+    // Check event relation
+    if (qEvent.result && qEvent.result.__typename === 'WorkingGroupMetadataSet') {
+      assert.equal(qEvent.result.metadataId, afterSnapshot!.id)
+    }
   }
 }

+ 52 - 0
tests/integration-tests/src/flows/working-groups/groupStatus.ts

@@ -0,0 +1,52 @@
+import { FlowProps } from '../../Flow'
+import { UpdateGroupStatusFixture } from '../../fixtures/workingGroupsModule'
+
+import Debugger from 'debug'
+import { FixtureRunner } from '../../Fixture'
+import { workingGroups } from '../../types'
+import { WorkingGroupMetadata } from '@joystream/metadata-protobuf'
+import _ from 'lodash'
+
+export default async function upcomingOpenings({ api, query, env }: FlowProps): Promise<void> {
+  await Promise.all(
+    workingGroups.map(async (group) => {
+      const updates: WorkingGroupMetadata.AsObject[] = [
+        { description: `${_.startCase(group)} Test Description`, about: `${_.startCase(group)} Test About Text` },
+        {
+          status: 'Testing',
+          statusMessage: `${_.startCase(group)} is beeing tested`,
+        },
+        {
+          description: `${_.startCase(group)} New Test Description`,
+        },
+        {
+          status: 'Testing continues',
+          statusMessage: `${_.startCase(group)} testing continues`,
+        },
+        {
+          about: `${_.startCase(group)} New Test About`,
+        },
+        {},
+        {
+          status: 'Testing finished',
+          statusMessage: '',
+          description: `${_.startCase(group)} Test Description`,
+          about: `${_.startCase(group)} Test About Text`,
+        },
+      ]
+
+      const debug = Debugger(`flow:group-status:${group}`)
+      debug('Started')
+      api.enableDebugTxLogs()
+
+      // Run fixtures one-by-one (otherwise the checks may break)
+      // FIXME
+      for (const update of updates) {
+        const updateGroupStatusFixture = new UpdateGroupStatusFixture(api, query, group, update)
+        await new FixtureRunner(updateGroupStatusFixture).runWithQueryNodeChecks()
+      }
+
+      debug('Done')
+    })
+  )
+}

+ 5 - 1
tests/integration-tests/src/flows/working-groups/upcomingOpenings.ts

@@ -1,5 +1,5 @@
 import { FlowProps } from '../../Flow'
-import { CreateUpcomingOpeningFixture } from '../../fixtures/workingGroupsModule'
+import { CreateUpcomingOpeningFixture, RemoveUpcomingOpeningFixture } from '../../fixtures/workingGroupsModule'
 
 import Debugger from 'debug'
 import { FixtureRunner } from '../../Fixture'
@@ -14,6 +14,10 @@ export default async function upcomingOpenings({ api, query, env }: FlowProps):
 
       const createUpcomingOpeningFixture = new CreateUpcomingOpeningFixture(api, query, group)
       await new FixtureRunner(createUpcomingOpeningFixture).runWithQueryNodeChecks()
+      const createdUpcomingOpeningId = createUpcomingOpeningFixture.getCreatedUpcomingOpeningId()
+
+      const removeUpcomingOpeningFixture = new RemoveUpcomingOpeningFixture(api, query, group, createdUpcomingOpeningId)
+      await new FixtureRunner(removeUpcomingOpeningFixture).runWithQueryNodeChecks()
 
       debug('Done')
     })

+ 2 - 0
tests/integration-tests/src/scenarios/workingGroups.ts

@@ -1,10 +1,12 @@
 import leadOpening from '../flows/working-groups/leadOpening'
 import openingAndApplicationStatus from '../flows/working-groups/openingAndApplicationStatus'
 import upcomingOpenings from '../flows/working-groups/upcomingOpenings'
+import groupStatus from '../flows/working-groups/groupStatus'
 import { scenario } from '../Scenario'
 
 scenario(async ({ job }) => {
   const sudoHireLead = job('sudo lead opening', leadOpening)
   job('opening and application status', openingAndApplicationStatus).requires(sudoHireLead)
   job('upcoming openings', upcomingOpenings).requires(sudoHireLead)
+  job('group status', groupStatus).requires(sudoHireLead)
 })