graphql: Implement `Authored` whenever possible

Quentin Gliech created

webui: Use a fragment for Authored nodes

Change summary

bug/bug.go                      |  3 ++
bug/op_add_comment.go           |  3 ++
bug/op_create.go                |  3 ++
bug/op_label_change.go          |  3 ++
bug/op_set_status.go            |  3 ++
bug/op_set_title.go             |  3 ++
bug/snapshot.go                 |  3 ++
graphql/graph/gen_graph.go      | 40 ++++++++++++++++++++++------------
graphql/schema/bug.graphql      |  3 -
graphql/schema/timeline.graphql | 10 ++++----
graphql/schema/types.graphql    |  2 
webui/src/Author.js             | 12 ++++++++++
webui/src/bug/Bug.js            |  7 +----
webui/src/bug/LabelChange.js    |  8 ++----
webui/src/bug/Message.js        | 18 +++++----------
webui/src/bug/SetStatus.js      |  8 ++----
webui/src/bug/SetTitle.js       |  8 ++----
webui/src/list/BugRow.js        |  8 +++---
18 files changed, 87 insertions(+), 58 deletions(-)

Detailed changes

bug/bug.go 🔗

@@ -681,3 +681,6 @@ func (bug *Bug) Compile() Snapshot {
 
 	return snap
 }
+
+// Sign post method for gqlgen
+func (bug *Bug) IsAuthored() {}

bug/op_add_comment.go 🔗

@@ -149,3 +149,6 @@ func AddCommentWithFiles(b Interface, author identity.Interface, unixTime int64,
 	b.Append(addCommentOp)
 	return addCommentOp, nil
 }
+
+// Sign post method for gqlgen
+func (item *AddCommentTimelineItem) IsAuthored() {}

bug/op_create.go 🔗

@@ -173,3 +173,6 @@ func CreateWithFiles(author identity.Interface, unixTime int64, title, message s
 
 	return newBug, createOp, nil
 }
+
+// Sign post method for gqlgen
+func (item *CreateTimelineItem) IsAuthored() {}

bug/op_label_change.go 🔗

@@ -303,3 +303,6 @@ func (l LabelChangeResult) String() string {
 		panic(fmt.Sprintf("unknown label change status %v", l.Status))
 	}
 }
+
+// Sign post method for gqlgen
+func (item *LabelChangeTimelineItem) IsAuthored() {}

bug/op_set_status.go 🔗

@@ -143,3 +143,6 @@ func Close(b Interface, author identity.Interface, unixTime int64) (*SetStatusOp
 	b.Append(op)
 	return op, nil
 }
+
+// Sign post method for gqlgen
+func (item *SetStatusTimelineItem) IsAuthored() {}

bug/op_set_title.go 🔗

@@ -178,3 +178,6 @@ func SetTitle(b Interface, author identity.Interface, unixTime int64, title stri
 	b.Append(setTitleOp)
 	return setTitleOp, nil
 }
+
+// Sign post method for gqlgen
+func (item *SetTitleTimelineItem) IsAuthored() {}

bug/snapshot.go 🔗

@@ -86,3 +86,6 @@ func (snap *Snapshot) addParticipant(participant identity.Interface) {
 
 	snap.Participants = append(snap.Participants, participant)
 }
+
+// Sign post method for gqlgen
+func (snap *Snapshot) IsAuthored() {}

graphql/graph/gen_graph.go 🔗

@@ -1601,7 +1601,7 @@ enum Status {
   CLOSED
 }
 
-type Bug {
+type Bug implements Authored {
   """The identifier for this bug"""
   id: String!
   """The human version (truncated) identifier for this bug"""
@@ -1690,7 +1690,6 @@ type BugEdge {
   """The item at the end of the edge."""
   node: Bug!
 }
-
 `},
 	&ast.Source{Name: "schema/identity.graphql", Input: `"""Represents an identity"""
 type Identity {
@@ -1911,7 +1910,7 @@ type TimelineItemEdge {
 # Items
 
 """CreateTimelineItem is a TimelineItem that represent the creation of a bug and its message edition history"""
-type CreateTimelineItem implements TimelineItem {
+type CreateTimelineItem implements TimelineItem & Authored {
     """The hash of the source operation"""
     hash: Hash!
     author: Identity!
@@ -1925,7 +1924,7 @@ type CreateTimelineItem implements TimelineItem {
 }
 
 """AddCommentTimelineItem is a TimelineItem that represent a Comment and its edition history"""
-type AddCommentTimelineItem implements TimelineItem {
+type AddCommentTimelineItem implements TimelineItem & Authored {
     """The hash of the source operation"""
     hash: Hash!
     author: Identity!
@@ -1939,7 +1938,7 @@ type AddCommentTimelineItem implements TimelineItem {
 }
 
 """LabelChangeTimelineItem is a TimelineItem that represent a change in the labels of a bug"""
-type LabelChangeTimelineItem implements TimelineItem {
+type LabelChangeTimelineItem implements TimelineItem & Authored {
     """The hash of the source operation"""
     hash: Hash!
     author: Identity!
@@ -1949,7 +1948,7 @@ type LabelChangeTimelineItem implements TimelineItem {
 }
 
 """SetStatusTimelineItem is a TimelineItem that represent a change in the status of a bug"""
-type SetStatusTimelineItem implements TimelineItem {
+type SetStatusTimelineItem implements TimelineItem & Authored {
     """The hash of the source operation"""
     hash: Hash!
     author: Identity!
@@ -1958,7 +1957,7 @@ type SetStatusTimelineItem implements TimelineItem {
 }
 
 """LabelChangeTimelineItem is a TimelineItem that represent a change in the title of a bug"""
-type SetTitleTimelineItem implements TimelineItem {
+type SetTitleTimelineItem implements TimelineItem & Authored {
     """The hash of the source operation"""
     hash: Hash!
     author: Identity!
@@ -2004,7 +2003,8 @@ type PageInfo {
 interface Authored {
     """The author of this object."""
     author: Identity!
-}`},
+}
+`},
 )
 
 // endregion ************************** generated!.gotpl **************************
@@ -7434,6 +7434,8 @@ func (ec *executionContext) _Authored(ctx context.Context, sel ast.SelectionSet,
 		return ec._Comment(ctx, sel, &obj)
 	case *bug.Comment:
 		return ec._Comment(ctx, sel, obj)
+	case *bug.Snapshot:
+		return ec._Bug(ctx, sel, obj)
 	case *bug.CreateOperation:
 		return ec._CreateOperation(ctx, sel, obj)
 	case *bug.SetTitleOperation:
@@ -7446,6 +7448,16 @@ func (ec *executionContext) _Authored(ctx context.Context, sel ast.SelectionSet,
 		return ec._SetStatusOperation(ctx, sel, obj)
 	case *bug.LabelChangeOperation:
 		return ec._LabelChangeOperation(ctx, sel, obj)
+	case *bug.CreateTimelineItem:
+		return ec._CreateTimelineItem(ctx, sel, obj)
+	case *bug.AddCommentTimelineItem:
+		return ec._AddCommentTimelineItem(ctx, sel, obj)
+	case *bug.LabelChangeTimelineItem:
+		return ec._LabelChangeTimelineItem(ctx, sel, obj)
+	case *bug.SetStatusTimelineItem:
+		return ec._SetStatusTimelineItem(ctx, sel, obj)
+	case *bug.SetTitleTimelineItem:
+		return ec._SetTitleTimelineItem(ctx, sel, obj)
 	default:
 		panic(fmt.Errorf("unexpected type %T", obj))
 	}
@@ -7557,7 +7569,7 @@ func (ec *executionContext) _AddCommentOperation(ctx context.Context, sel ast.Se
 	return out
 }
 
-var addCommentTimelineItemImplementors = []string{"AddCommentTimelineItem", "TimelineItem"}
+var addCommentTimelineItemImplementors = []string{"AddCommentTimelineItem", "TimelineItem", "Authored"}
 
 func (ec *executionContext) _AddCommentTimelineItem(ctx context.Context, sel ast.SelectionSet, obj *bug.AddCommentTimelineItem) graphql.Marshaler {
 	fields := graphql.CollectFields(ec.RequestContext, sel, addCommentTimelineItemImplementors)
@@ -7642,7 +7654,7 @@ func (ec *executionContext) _AddCommentTimelineItem(ctx context.Context, sel ast
 	return out
 }
 
-var bugImplementors = []string{"Bug"}
+var bugImplementors = []string{"Bug", "Authored"}
 
 func (ec *executionContext) _Bug(ctx context.Context, sel ast.SelectionSet, obj *bug.Snapshot) graphql.Marshaler {
 	fields := graphql.CollectFields(ec.RequestContext, sel, bugImplementors)
@@ -8143,7 +8155,7 @@ func (ec *executionContext) _CreateOperation(ctx context.Context, sel ast.Select
 	return out
 }
 
-var createTimelineItemImplementors = []string{"CreateTimelineItem", "TimelineItem"}
+var createTimelineItemImplementors = []string{"CreateTimelineItem", "TimelineItem", "Authored"}
 
 func (ec *executionContext) _CreateTimelineItem(ctx context.Context, sel ast.SelectionSet, obj *bug.CreateTimelineItem) graphql.Marshaler {
 	fields := graphql.CollectFields(ec.RequestContext, sel, createTimelineItemImplementors)
@@ -8591,7 +8603,7 @@ func (ec *executionContext) _LabelChangeOperation(ctx context.Context, sel ast.S
 	return out
 }
 
-var labelChangeTimelineItemImplementors = []string{"LabelChangeTimelineItem", "TimelineItem"}
+var labelChangeTimelineItemImplementors = []string{"LabelChangeTimelineItem", "TimelineItem", "Authored"}
 
 func (ec *executionContext) _LabelChangeTimelineItem(ctx context.Context, sel ast.SelectionSet, obj *bug.LabelChangeTimelineItem) graphql.Marshaler {
 	fields := graphql.CollectFields(ec.RequestContext, sel, labelChangeTimelineItemImplementors)
@@ -9033,7 +9045,7 @@ func (ec *executionContext) _SetStatusOperation(ctx context.Context, sel ast.Sel
 	return out
 }
 
-var setStatusTimelineItemImplementors = []string{"SetStatusTimelineItem", "TimelineItem"}
+var setStatusTimelineItemImplementors = []string{"SetStatusTimelineItem", "TimelineItem", "Authored"}
 
 func (ec *executionContext) _SetStatusTimelineItem(ctx context.Context, sel ast.SelectionSet, obj *bug.SetStatusTimelineItem) graphql.Marshaler {
 	fields := graphql.CollectFields(ec.RequestContext, sel, setStatusTimelineItemImplementors)
@@ -9149,7 +9161,7 @@ func (ec *executionContext) _SetTitleOperation(ctx context.Context, sel ast.Sele
 	return out
 }
 
-var setTitleTimelineItemImplementors = []string{"SetTitleTimelineItem", "TimelineItem"}
+var setTitleTimelineItemImplementors = []string{"SetTitleTimelineItem", "TimelineItem", "Authored"}
 
 func (ec *executionContext) _SetTitleTimelineItem(ctx context.Context, sel ast.SelectionSet, obj *bug.SetTitleTimelineItem) graphql.Marshaler {
 	fields := graphql.CollectFields(ec.RequestContext, sel, setTitleTimelineItemImplementors)

graphql/schema/bug.graphql 🔗

@@ -27,7 +27,7 @@ enum Status {
   CLOSED
 }
 
-type Bug {
+type Bug implements Authored {
   """The identifier for this bug"""
   id: String!
   """The human version (truncated) identifier for this bug"""
@@ -116,4 +116,3 @@ type BugEdge {
   """The item at the end of the edge."""
   node: Bug!
 }
-

graphql/schema/timeline.graphql 🔗

@@ -29,7 +29,7 @@ type TimelineItemEdge {
 # Items
 
 """CreateTimelineItem is a TimelineItem that represent the creation of a bug and its message edition history"""
-type CreateTimelineItem implements TimelineItem {
+type CreateTimelineItem implements TimelineItem & Authored {
     """The hash of the source operation"""
     hash: Hash!
     author: Identity!
@@ -43,7 +43,7 @@ type CreateTimelineItem implements TimelineItem {
 }
 
 """AddCommentTimelineItem is a TimelineItem that represent a Comment and its edition history"""
-type AddCommentTimelineItem implements TimelineItem {
+type AddCommentTimelineItem implements TimelineItem & Authored {
     """The hash of the source operation"""
     hash: Hash!
     author: Identity!
@@ -57,7 +57,7 @@ type AddCommentTimelineItem implements TimelineItem {
 }
 
 """LabelChangeTimelineItem is a TimelineItem that represent a change in the labels of a bug"""
-type LabelChangeTimelineItem implements TimelineItem {
+type LabelChangeTimelineItem implements TimelineItem & Authored {
     """The hash of the source operation"""
     hash: Hash!
     author: Identity!
@@ -67,7 +67,7 @@ type LabelChangeTimelineItem implements TimelineItem {
 }
 
 """SetStatusTimelineItem is a TimelineItem that represent a change in the status of a bug"""
-type SetStatusTimelineItem implements TimelineItem {
+type SetStatusTimelineItem implements TimelineItem & Authored {
     """The hash of the source operation"""
     hash: Hash!
     author: Identity!
@@ -76,7 +76,7 @@ type SetStatusTimelineItem implements TimelineItem {
 }
 
 """LabelChangeTimelineItem is a TimelineItem that represent a change in the title of a bug"""
-type SetTitleTimelineItem implements TimelineItem {
+type SetTitleTimelineItem implements TimelineItem & Authored {
     """The hash of the source operation"""
     hash: Hash!
     author: Identity!

webui/src/Author.js 🔗

@@ -1,3 +1,4 @@
+import gql from 'graphql-tag';
 import Tooltip from '@material-ui/core/Tooltip/Tooltip';
 import MAvatar from '@material-ui/core/Avatar';
 import React from 'react';
@@ -14,6 +15,17 @@ const Author = ({ author, ...props }) => {
   );
 };
 
+Author.fragment = gql`
+  fragment authored on Authored {
+    author {
+      name
+      email
+      displayName
+      avatarUrl
+    }
+  }
+`;
+
 export const Avatar = ({ author, ...props }) => {
   if (author.avatarUrl) {
     return <MAvatar src={author.avatarUrl} {...props} />;

webui/src/bug/Bug.js 🔗

@@ -94,13 +94,10 @@ Bug.fragment = gql`
       ...Label
     }
     createdAt
-    author {
-      email
-      name
-      displayName
-    }
+    ...authored
   }
   ${Label.fragment}
+  ${Author.fragment}
 `;
 
 export default Bug;

webui/src/bug/LabelChange.js 🔗

@@ -44,11 +44,7 @@ LabelChange.fragment = gql`
   fragment LabelChange on TimelineItem {
     ... on LabelChangeTimelineItem {
       date
-      author {
-        name
-        email
-        displayName
-      }
+      ...authored
       added {
         ...Label
       }
@@ -57,7 +53,9 @@ LabelChange.fragment = gql`
       }
     }
   }
+
   ${Label.fragment}
+  ${Author.fragment}
 `;
 
 export default LabelChange;

webui/src/bug/Message.js 🔗

@@ -70,32 +70,26 @@ Message.createFragment = gql`
   fragment Create on TimelineItem {
     ... on CreateTimelineItem {
       createdAt
-      author {
-        name
-        email
-        displayName
-        avatarUrl
-      }
+      ...authored
       edited
       message
     }
   }
+
+  ${Author.fragment}
 `;
 
 Message.commentFragment = gql`
   fragment AddComment on TimelineItem {
     ... on AddCommentTimelineItem {
       createdAt
-      author {
-        name
-        email
-        displayName
-        avatarUrl
-      }
+      ...authored
       edited
       message
     }
   }
+
+  ${Author.fragment}
 `;
 
 export default Message;

webui/src/bug/SetStatus.js 🔗

@@ -26,14 +26,12 @@ SetStatus.fragment = gql`
   fragment SetStatus on TimelineItem {
     ... on SetStatusTimelineItem {
       date
-      author {
-        name
-        email
-        displayName
-      }
+      ...authored
       status
     }
   }
+
+  ${Author.fragment}
 `;
 
 export default SetStatus;

webui/src/bug/SetTitle.js 🔗

@@ -32,15 +32,13 @@ SetTitle.fragment = gql`
   fragment SetTitle on TimelineItem {
     ... on SetTitleTimelineItem {
       date
-      author {
-        name
-        email
-        displayName
-      }
+      ...authored
       title
       was
     }
   }
+
+  ${Author.fragment}
 `;
 
 export default SetTitle;

webui/src/list/BugRow.js 🔗

@@ -9,6 +9,7 @@ import React from 'react';
 import { Link } from 'react-router-dom';
 import Date from '../Date';
 import Label from '../Label';
+import Author from '../Author';
 
 const Open = ({ className }) => (
   <Tooltip title="Open">
@@ -97,12 +98,11 @@ BugRow.fragment = gql`
     labels {
       ...Label
     }
-    author {
-      name
-      displayName
-    }
+    ...authored
   }
+
   ${Label.fragment}
+  ${Author.fragment}
 `;
 
 export default BugRow;