Browse Source

Add DataObject schema and change avatar representation

Leszek Wiesner 4 years ago
parent
commit
f82392c723

+ 5 - 5
metadata-protobuf/compiled/proto/Council_pb.d.ts

@@ -14,10 +14,10 @@ export class CouncilCandidacyNoteMetadata extends jspb.Message {
   setBulletPointsList(value: Array<string>): void;
   addBulletPoints(value: string, index?: number): string;
 
-  hasCoverImage(): boolean;
-  clearCoverImage(): void;
-  getCoverImage(): string | undefined;
-  setCoverImage(value: string): void;
+  hasBannerImageUri(): boolean;
+  clearBannerImageUri(): void;
+  getBannerImageUri(): string | undefined;
+  setBannerImageUri(value: string): void;
 
   hasDescription(): boolean;
   clearDescription(): void;
@@ -38,7 +38,7 @@ export namespace CouncilCandidacyNoteMetadata {
   export type AsObject = {
     header?: string,
     bulletPointsList: Array<string>,
-    coverImage?: string,
+    bannerImageUri?: string,
     description?: string,
   }
 }

+ 7 - 7
metadata-protobuf/compiled/proto/Council_pb.js

@@ -78,7 +78,7 @@ proto.CouncilCandidacyNoteMetadata.toObject = function(includeInstance, msg) {
   var f, obj = {
     header: (f = jspb.Message.getField(msg, 1)) == null ? undefined : f,
     bulletPointsList: (f = jspb.Message.getRepeatedField(msg, 2)) == null ? undefined : f,
-    coverImage: (f = jspb.Message.getField(msg, 3)) == null ? undefined : f,
+    bannerImageUri: (f = jspb.Message.getField(msg, 3)) == null ? undefined : f,
     description: (f = jspb.Message.getField(msg, 4)) == null ? undefined : f
   };
 
@@ -126,7 +126,7 @@ proto.CouncilCandidacyNoteMetadata.deserializeBinaryFromReader = function(msg, r
       break;
     case 3:
       var value = /** @type {string} */ (reader.readString());
-      msg.setCoverImage(value);
+      msg.setBannerImageUri(value);
       break;
     case 4:
       var value = /** @type {string} */ (reader.readString());
@@ -266,10 +266,10 @@ proto.CouncilCandidacyNoteMetadata.prototype.clearBulletPointsList = function()
 
 
 /**
- * optional string cover_image = 3;
+ * optional string banner_image_uri = 3;
  * @return {string}
  */
-proto.CouncilCandidacyNoteMetadata.prototype.getCoverImage = function() {
+proto.CouncilCandidacyNoteMetadata.prototype.getBannerImageUri = function() {
   return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
 };
 
@@ -278,7 +278,7 @@ proto.CouncilCandidacyNoteMetadata.prototype.getCoverImage = function() {
  * @param {string} value
  * @return {!proto.CouncilCandidacyNoteMetadata} returns this
  */
-proto.CouncilCandidacyNoteMetadata.prototype.setCoverImage = function(value) {
+proto.CouncilCandidacyNoteMetadata.prototype.setBannerImageUri = function(value) {
   return jspb.Message.setField(this, 3, value);
 };
 
@@ -287,7 +287,7 @@ proto.CouncilCandidacyNoteMetadata.prototype.setCoverImage = function(value) {
  * Clears the field making it undefined.
  * @return {!proto.CouncilCandidacyNoteMetadata} returns this
  */
-proto.CouncilCandidacyNoteMetadata.prototype.clearCoverImage = function() {
+proto.CouncilCandidacyNoteMetadata.prototype.clearBannerImageUri = function() {
   return jspb.Message.setField(this, 3, undefined);
 };
 
@@ -296,7 +296,7 @@ proto.CouncilCandidacyNoteMetadata.prototype.clearCoverImage = function() {
  * Returns whether this field is set.
  * @return {boolean}
  */
-proto.CouncilCandidacyNoteMetadata.prototype.hasCoverImage = function() {
+proto.CouncilCandidacyNoteMetadata.prototype.hasBannerImageUri = function() {
   return jspb.Message.getField(this, 3) != null;
 };
 

+ 5 - 5
metadata-protobuf/compiled/proto/Membership_pb.d.ts

@@ -9,10 +9,10 @@ export class MembershipMetadata extends jspb.Message {
   getName(): string | undefined;
   setName(value: string): void;
 
-  hasAvatarUri(): boolean;
-  clearAvatarUri(): void;
-  getAvatarUri(): string | undefined;
-  setAvatarUri(value: string): void;
+  hasAvatar(): boolean;
+  clearAvatar(): void;
+  getAvatar(): number | undefined;
+  setAvatar(value: number): void;
 
   hasAbout(): boolean;
   clearAbout(): void;
@@ -32,7 +32,7 @@ export class MembershipMetadata extends jspb.Message {
 export namespace MembershipMetadata {
   export type AsObject = {
     name?: string,
-    avatarUri?: string,
+    avatar?: number,
     about?: string,
   }
 }

+ 13 - 13
metadata-protobuf/compiled/proto/Membership_pb.js

@@ -70,7 +70,7 @@ proto.MembershipMetadata.prototype.toObject = function(opt_includeInstance) {
 proto.MembershipMetadata.toObject = function(includeInstance, msg) {
   var f, obj = {
     name: (f = jspb.Message.getField(msg, 1)) == null ? undefined : f,
-    avatarUri: (f = jspb.Message.getField(msg, 2)) == null ? undefined : f,
+    avatar: (f = jspb.Message.getField(msg, 2)) == null ? undefined : f,
     about: (f = jspb.Message.getField(msg, 3)) == null ? undefined : f
   };
 
@@ -113,8 +113,8 @@ proto.MembershipMetadata.deserializeBinaryFromReader = function(msg, reader) {
       msg.setName(value);
       break;
     case 2:
-      var value = /** @type {string} */ (reader.readString());
-      msg.setAvatarUri(value);
+      var value = /** @type {number} */ (reader.readUint32());
+      msg.setAvatar(value);
       break;
     case 3:
       var value = /** @type {string} */ (reader.readString());
@@ -156,9 +156,9 @@ proto.MembershipMetadata.serializeBinaryToWriter = function(message, writer) {
       f
     );
   }
-  f = /** @type {string} */ (jspb.Message.getField(message, 2));
+  f = /** @type {number} */ (jspb.Message.getField(message, 2));
   if (f != null) {
-    writer.writeString(
+    writer.writeUint32(
       2,
       f
     );
@@ -210,19 +210,19 @@ proto.MembershipMetadata.prototype.hasName = function() {
 
 
 /**
- * optional string avatar_uri = 2;
- * @return {string}
+ * optional uint32 avatar = 2;
+ * @return {number}
  */
-proto.MembershipMetadata.prototype.getAvatarUri = function() {
-  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
+proto.MembershipMetadata.prototype.getAvatar = function() {
+  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0));
 };
 
 
 /**
- * @param {string} value
+ * @param {number} value
  * @return {!proto.MembershipMetadata} returns this
  */
-proto.MembershipMetadata.prototype.setAvatarUri = function(value) {
+proto.MembershipMetadata.prototype.setAvatar = function(value) {
   return jspb.Message.setField(this, 2, value);
 };
 
@@ -231,7 +231,7 @@ proto.MembershipMetadata.prototype.setAvatarUri = function(value) {
  * Clears the field making it undefined.
  * @return {!proto.MembershipMetadata} returns this
  */
-proto.MembershipMetadata.prototype.clearAvatarUri = function() {
+proto.MembershipMetadata.prototype.clearAvatar = function() {
   return jspb.Message.setField(this, 2, undefined);
 };
 
@@ -240,7 +240,7 @@ proto.MembershipMetadata.prototype.clearAvatarUri = function() {
  * Returns whether this field is set.
  * @return {boolean}
  */
-proto.MembershipMetadata.prototype.hasAvatarUri = function() {
+proto.MembershipMetadata.prototype.hasAvatar = function() {
   return jspb.Message.getField(this, 2) != null;
 };
 

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

@@ -19,10 +19,10 @@ export class OpeningMetadata extends jspb.Message {
   getHiringLimit(): number | undefined;
   setHiringLimit(value: number): void;
 
-  hasExpectedDuration(): boolean;
-  clearExpectedDuration(): void;
-  getExpectedDuration(): number | undefined;
-  setExpectedDuration(value: number): void;
+  hasExpectedEndingTimestamp(): boolean;
+  clearExpectedEndingTimestamp(): void;
+  getExpectedEndingTimestamp(): number | undefined;
+  setExpectedEndingTimestamp(value: number): void;
 
   hasApplicationDetails(): boolean;
   clearApplicationDetails(): void;
@@ -49,7 +49,7 @@ export namespace OpeningMetadata {
     shortDescription?: string,
     description?: string,
     hiringLimit?: number,
-    expectedDuration?: number,
+    expectedEndingTimestamp?: number,
     applicationDetails?: string,
     applicationFormQuestionsList: Array<OpeningMetadata.ApplicationFormQuestion.AsObject>,
   }

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

@@ -146,7 +146,7 @@ proto.OpeningMetadata.toObject = function(includeInstance, msg) {
     shortDescription: (f = jspb.Message.getField(msg, 1)) == null ? undefined : f,
     description: (f = jspb.Message.getField(msg, 2)) == null ? undefined : f,
     hiringLimit: (f = jspb.Message.getField(msg, 3)) == null ? undefined : f,
-    expectedDuration: (f = jspb.Message.getField(msg, 4)) == null ? undefined : f,
+    expectedEndingTimestamp: (f = jspb.Message.getField(msg, 4)) == null ? undefined : f,
     applicationDetails: (f = jspb.Message.getField(msg, 5)) == null ? undefined : f,
     applicationFormQuestionsList: jspb.Message.toObjectList(msg.getApplicationFormQuestionsList(),
     proto.OpeningMetadata.ApplicationFormQuestion.toObject, includeInstance)
@@ -199,8 +199,8 @@ proto.OpeningMetadata.deserializeBinaryFromReader = function(msg, reader) {
       msg.setHiringLimit(value);
       break;
     case 4:
-      var value = /** @type {number} */ (reader.readUint32());
-      msg.setExpectedDuration(value);
+      var value = /** @type {number} */ (reader.readUint64());
+      msg.setExpectedEndingTimestamp(value);
       break;
     case 5:
       var value = /** @type {string} */ (reader.readString());
@@ -263,7 +263,7 @@ proto.OpeningMetadata.serializeBinaryToWriter = function(message, writer) {
   }
   f = /** @type {number} */ (jspb.Message.getField(message, 4));
   if (f != null) {
-    writer.writeUint32(
+    writer.writeUint64(
       4,
       f
     );
@@ -599,10 +599,10 @@ proto.OpeningMetadata.prototype.hasHiringLimit = function() {
 
 
 /**
- * required uint32 expected_duration = 4;
+ * required uint64 expected_ending_timestamp = 4;
  * @return {number}
  */
-proto.OpeningMetadata.prototype.getExpectedDuration = function() {
+proto.OpeningMetadata.prototype.getExpectedEndingTimestamp = function() {
   return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0));
 };
 
@@ -611,7 +611,7 @@ proto.OpeningMetadata.prototype.getExpectedDuration = function() {
  * @param {number} value
  * @return {!proto.OpeningMetadata} returns this
  */
-proto.OpeningMetadata.prototype.setExpectedDuration = function(value) {
+proto.OpeningMetadata.prototype.setExpectedEndingTimestamp = function(value) {
   return jspb.Message.setField(this, 4, value);
 };
 
@@ -620,7 +620,7 @@ proto.OpeningMetadata.prototype.setExpectedDuration = function(value) {
  * Clears the field making it undefined.
  * @return {!proto.OpeningMetadata} returns this
  */
-proto.OpeningMetadata.prototype.clearExpectedDuration = function() {
+proto.OpeningMetadata.prototype.clearExpectedEndingTimestamp = function() {
   return jspb.Message.setField(this, 4, undefined);
 };
 
@@ -629,7 +629,7 @@ proto.OpeningMetadata.prototype.clearExpectedDuration = function() {
  * Returns whether this field is set.
  * @return {boolean}
  */
-proto.OpeningMetadata.prototype.hasExpectedDuration = function() {
+proto.OpeningMetadata.prototype.hasExpectedEndingTimestamp = function() {
   return jspb.Message.getField(this, 4) != null;
 };
 

+ 1 - 1
metadata-protobuf/proto/Membership.proto

@@ -2,6 +2,6 @@ syntax = "proto2";
 
 message MembershipMetadata {
   optional string name = 1; // Member's real name
-  optional string avatar_uri = 2; // Member's avatar image uri
+  optional uint32 avatar = 2; // Member's avatar - index into external [assets array](#.Assets)
   optional string about = 3; // Member's md-formatted about text
 }

+ 2 - 4
query-node/mappings/mappings.ts

@@ -85,7 +85,7 @@ async function newMembershipFromParams(
   const metadataEntity = new MemberMetadata({
     name: metadata?.getName(),
     about: metadata?.getAbout(),
-    avatarUri: metadata?.getAvatarUri(),
+    // TODO: avatar
   })
 
   const member = new Membership({
@@ -156,9 +156,7 @@ export async function members_MemberProfileUpdated(db: DatabaseManager, event_:
   if (metadata?.hasAbout()) {
     member.metadata.about = metadata.getAbout()
   }
-  if (metadata?.hasAvatarUri()) {
-    member.metadata.avatarUri = metadata.getAvatarUri()
-  }
+  // TODO: avatar
   if (handle.isSome) {
     member.handle = bytesToString(handle.unwrap())
   }

+ 91 - 8
query-node/schema.graphql

@@ -5,12 +5,95 @@ enum Network {
   OLYMPIA
 }
 
-type Block @entity {
-  "Block number as a string"
-  id: ID!
-  block: Int!
-  executedAt: DateTime!
-  network: Network!
+"The decision of the storage provider when it acts as liaison"
+enum LiaisonJudgement {
+  "Content awaits for a judgment"
+  PENDING,
+
+  "Content accepted"
+  ACCEPTED,
+
+  "Content rejected"
+  REJECTED,
+}
+
+"Manages content ids, type and storage provider decision about it"
+type DataObject @entity {
+  "Content owner"
+  owner: DataObjectOwner!
+
+  "Content added at"
+  addedAt: Int!
+
+  "Content type id"
+  typeId: Int!
+
+  "Content size in bytes"
+  size: BigInt!
+
+  "Storage provider id of the liaison"
+  liaisonId: BigInt!
+
+  "Storage provider as liaison judgment"
+  liaisonJudgement: LiaisonJudgement!
+
+  "IPFS content id"
+  ipfsContentId: String!
+
+  "Joystream runtime content"
+  joystreamContentId: String!
+}
+
+"Owner type for storage object"
+union DataObjectOwner = DataObjectOwnerMember
+  | DataObjectOwnerChannel
+  | DataObjectOwnerDao
+  | DataObjectOwnerCouncil
+  | DataObjectOwnerWorkingGroup
+
+"Asset owned by a member"
+type DataObjectOwnerMember @variant {
+  # use `BigInt` instead of `Membership` before variant relations are featured in Hydra
+  #"Member identifier"
+  #memberId: Membership!
+  "Member identifier"
+  member: BigInt!
+
+  "Variant needs to have at least one property. This value is not used."
+  dummy: Int
+}
+
+"Asset owned by a channel"
+type DataObjectOwnerChannel @variant {
+  # use `BigInt` instead of `Channel` before variant relations are featured in Hydra
+  #"Channel identifier"
+  #channel: Channel!
+  "Channel identifier"
+  channel: BigInt!
+
+  "Variant needs to have at least one property. This value is not used."
+  dummy: Int
+}
+
+"Asset owned by a DAO"
+type DataObjectOwnerDao @variant {
+  "DAO identifier"
+  dao: BigInt!
+}
+
+"Asset owned by the Council"
+type DataObjectOwnerCouncil @variant {
+  "Variant needs to have at least one property. This value is not used."
+  dummy: Int
+}
+
+"Asset owned by a WorkingGroup"
+type DataObjectOwnerWorkingGroup @variant {
+  #"Working group identifier"
+  #workingGroup: BigInt!
+
+  "Variant needs to have at least one property. This value is not used."
+  dummy: Int
 }
 
 enum MembershipEntryMethod {
@@ -23,8 +106,8 @@ type MemberMetadata @entity {
   "Member's name"
   name: String
 
-  "A Url to member's Avatar image TODO: Storage asset"
-  avatarUri: String
+  "Avatar data object"
+  avatar: DataObject
 
   "Short text chosen by member to share information about themselves"
   about: String

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

@@ -74,7 +74,6 @@ export class QueryNodeApi {
           handle
           metadata {
             name
-            avatarUri
             about
           }
           controllerAccount
@@ -120,7 +119,6 @@ export class QueryNodeApi {
           handle
           metadata {
             name
-            avatarUri
             about
           }
           referrer {
@@ -156,7 +154,6 @@ export class QueryNodeApi {
           newHandle
           newMetadata {
             name
-            avatarUri
             about
           }
         }
@@ -224,7 +221,6 @@ export class QueryNodeApi {
           metadata {
             name
             about
-            avatarUri
           }
         }
       }

+ 11 - 12
tests/integration-tests/src/fixtures/membershipModule.ts

@@ -43,7 +43,7 @@ abstract class MembershipFixture extends BaseFixture {
     const metadata = new MembershipMetadata()
     metadata.setName(`name${accountId.substring(0, 14)}`)
     metadata.setAbout(`about${accountId.substring(0, 14)}`)
-    metadata.setAvatarUri(`avatarUri${accountId.substring(0, 14)}`)
+    // TODO: avatar
     return {
       root_account: accountId,
       controller_account: accountId,
@@ -96,7 +96,7 @@ export class BuyMembershipHappyCaseFixture extends MembershipFixture implements
       handle,
       rootAccount,
       controllerAccount,
-      metadata: { name, about, avatarUri },
+      metadata: { name, about },
       isVerified,
       entry,
     } = qMember as QueryNodeMembership
@@ -108,7 +108,7 @@ export class BuyMembershipHappyCaseFixture extends MembershipFixture implements
     assert.equal(controllerAccount, member.controller_account.toString())
     assert.equal(name, metadata.getName())
     assert.equal(about, metadata.getAbout())
-    assert.equal(avatarUri, metadata.getAvatarUri())
+    // TODO: avatar
     assert.equal(isVerified, false)
     assert.equal(entry, MembershipEntryMethod.Paid)
   }
@@ -133,7 +133,7 @@ export class BuyMembershipHappyCaseFixture extends MembershipFixture implements
     assert.equal(qEvent.controllerAccount, txParams.controller_account.toString())
     assert.equal(qEvent.metadata.name, metadata.getName())
     assert.equal(qEvent.metadata.about, metadata.getAbout())
-    assert.equal(qEvent.metadata.avatarUri, metadata.getAvatarUri())
+    // TODO: avatar
   }
 
   async execute(): Promise<void> {
@@ -235,7 +235,6 @@ export class UpdateProfileHappyCaseFixture extends MembershipFixture {
   // Update data
   private newName = 'New name'
   private newHandle = 'New handle'
-  private newAvatarUri = 'New avatar uri'
   private newAbout = 'New about'
 
   public constructor(api: Api, query: QueryNodeApi, memberContext: MemberContext) {
@@ -248,11 +247,11 @@ export class UpdateProfileHappyCaseFixture extends MembershipFixture {
     assert.isOk(qMember, 'Membership query result is empty')
     const {
       handle,
-      metadata: { name, avatarUri, about },
+      metadata: { name, about },
     } = qMember as QueryNodeMembership
     assert.equal(name, this.newName)
     assert.equal(handle, this.newHandle)
-    assert.equal(avatarUri, this.newAvatarUri)
+    // TODO: avatar
     assert.equal(about, this.newAbout)
   }
 
@@ -274,14 +273,14 @@ export class UpdateProfileHappyCaseFixture extends MembershipFixture {
     assert.equal(newHandle, this.newHandle)
     assert.equal(newMetadata.name, this.newName)
     assert.equal(newMetadata.about, this.newAbout)
-    assert.equal(newMetadata.avatarUri, this.newAvatarUri)
+    // TODO: avatar
   }
 
   async execute(): Promise<void> {
     const metadata = new MembershipMetadata()
     metadata.setName(this.newName)
     metadata.setAbout(this.newAbout)
-    metadata.setAvatarUri(this.newAvatarUri)
+    // TODO: avatar
     const tx = this.api.tx.members.updateProfile(
       this.memberContext.memberId,
       this.newHandle,
@@ -386,7 +385,7 @@ export class InviteMembersHappyCaseFixture extends MembershipFixture {
       handle,
       rootAccount,
       controllerAccount,
-      metadata: { name, about, avatarUri },
+      metadata: { name, about },
       isVerified,
       entry,
       invitedBy,
@@ -398,7 +397,7 @@ export class InviteMembersHappyCaseFixture extends MembershipFixture {
     assert.equal(controllerAccount, txParams.controller_account)
     assert.equal(name, metadata.getName())
     assert.equal(about, metadata.getAbout())
-    assert.equal(avatarUri, metadata.getAvatarUri())
+    // TODO: avatar
     assert.equal(isVerified, false)
     assert.equal(entry, MembershipEntryMethod.Invited)
     assert.isOk(invitedBy)
@@ -426,7 +425,7 @@ export class InviteMembersHappyCaseFixture extends MembershipFixture {
     assert.equal(qEvent.controllerAccount, txParams.controller_account)
     assert.equal(qEvent.metadata.name, metadata.getName())
     assert.equal(qEvent.metadata.about, metadata.getAbout())
-    assert.equal(qEvent.metadata.avatarUri, metadata.getAvatarUri())
+    // TODO: avatar
   }
 
   async execute(): Promise<void> {