Browse Source

fix missing columnsin cli

david 8 hours ago
parent
commit
cd713697e0

+ 57 - 14
arp_cli/cmd/message.go

@@ -123,14 +123,15 @@ Use this command to create, list, update, and delete messages. You can also watc
 }
 
 type Message struct {
-	ID        string   `json:"id"`
-	SenderID  string   `json:"senderId"`
-	Sender    *User    `json:"sender"`
-	Content   string   `json:"content"`
-	SentAt    string   `json:"sentAt"`
-	Receivers []string `json:"receivers"`
-	CreatedAt string   `json:"createdAt"`
-	UpdatedAt string   `json:"updatedAt"`
+	ID              string   `json:"id"`
+	SenderID        string   `json:"senderId"`
+	Sender          *User    `json:"sender"`
+	Content         string   `json:"content"`
+	SentAt          string   `json:"sentAt"`
+	Receivers       []string `json:"receivers"`
+	ReceiverObjects []*User  `json:"receiverObjects"`
+	CreatedAt       string   `json:"createdAt"`
+	UpdatedAt       string   `json:"updatedAt"`
 }
 
 func messageList(ctx context.Context, cmd *cli.Command) error {
@@ -145,7 +146,7 @@ func messageList(ctx context.Context, cmd *cli.Command) error {
 	c := client.New(cfg.ServerURL)
 	c.SetToken(cfg.Token)
 
-	query := "query Messages { messages { id sender { id email } content sentAt receivers createdAt } }"
+	query := "query Messages { messages { id sender { id email } content sentAt receivers receiverObjects { id email } createdAt } }"
 
 	resp, err := c.Query(query, nil)
 	if err != nil {
@@ -182,7 +183,21 @@ func messageList(ctx context.Context, cmd *cli.Command) error {
 		if len(content) > 50 {
 			content = content[:47] + "..."
 		}
-		receivers := strings.Join(m.Receivers, ", ")
+
+		// Build receiver emails string
+		var receiverEmails []string
+		if len(m.ReceiverObjects) > 0 {
+			for _, receiver := range m.ReceiverObjects {
+				if receiver != nil {
+					receiverEmails = append(receiverEmails, receiver.Email)
+				}
+			}
+		} else {
+			// Fallback to IDs if objects aren't available
+			receiverEmails = m.Receivers
+		}
+		receivers := strings.Join(receiverEmails, ", ")
+
 		table.Append([]string{m.ID, sender, content, receivers, m.SentAt})
 	}
 
@@ -203,7 +218,7 @@ func messageGet(ctx context.Context, cmd *cli.Command) error {
 	c.SetToken(cfg.Token)
 
 	id := cmd.String("id")
-	query := "query Message($id: ID!) { message(id: $id) { id sender { id email } content sentAt receivers createdAt updatedAt } }"
+	query := "query Message($id: ID!) { message(id: $id) { id sender { id email } content sentAt receivers receiverObjects { id email } createdAt updatedAt } }"
 
 	resp, err := c.Query(query, map[string]interface{}{"id": id})
 	if err != nil {
@@ -235,7 +250,21 @@ func messageGet(ctx context.Context, cmd *cli.Command) error {
 		fmt.Printf("Sender ID: %s\n", m.SenderID)
 	}
 	fmt.Printf("Content: %s\n", m.Content)
-	fmt.Printf("Receivers: %s\n", strings.Join(m.Receivers, ", "))
+
+	// Display receiver emails
+	var receiverEmails []string
+	if len(m.ReceiverObjects) > 0 {
+		for _, receiver := range m.ReceiverObjects {
+			if receiver != nil {
+				receiverEmails = append(receiverEmails, receiver.Email)
+			}
+		}
+	} else {
+		// Fallback to IDs if objects aren't available
+		receiverEmails = m.Receivers
+	}
+	fmt.Printf("Receivers: %s\n", strings.Join(receiverEmails, ", "))
+
 	fmt.Printf("Sent At: %s\n", m.SentAt)
 	fmt.Printf("Created At: %s\n", m.CreatedAt)
 	fmt.Printf("Updated At: %s\n", m.UpdatedAt)
@@ -425,7 +454,7 @@ func messageWatch(ctx context.Context, cmd *cli.Command) error {
 	}
 	defer wsClient.Close()
 
-	subscription := `subscription MessageAdded { messageAdded { id sender { id email } content sentAt receivers createdAt } }`
+	subscription := `subscription MessageAdded { messageAdded { id sender { id email } content sentAt receivers receiverObjects { id email } createdAt } }`
 
 	if err := wsClient.Subscribe("1", subscription, nil); err != nil {
 		return fmt.Errorf("failed to subscribe: %w", err)
@@ -450,11 +479,25 @@ func messageWatch(ctx context.Context, cmd *cli.Command) error {
 				if m.Sender != nil {
 					sender = m.Sender.Email
 				}
+
+				// Build receiver emails string
+				var receiverEmails []string
+				if len(m.ReceiverObjects) > 0 {
+					for _, receiver := range m.ReceiverObjects {
+						if receiver != nil {
+							receiverEmails = append(receiverEmails, receiver.Email)
+						}
+					}
+				} else {
+					// Fallback to IDs if objects aren't available
+					receiverEmails = m.Receivers
+				}
+
 				fmt.Printf("\n--- New Message ---\n")
 				fmt.Printf("ID: %s\n", m.ID)
 				fmt.Printf("From: %s\n", sender)
 				fmt.Printf("Content: %s\n", m.Content)
-				fmt.Printf("Receivers: %s\n", strings.Join(m.Receivers, ", "))
+				fmt.Printf("Receivers: %s\n", strings.Join(receiverEmails, ", "))
 				fmt.Printf("Sent At: %s\n", m.SentAt)
 				fmt.Println("--------------------")
 			}

BIN
arp_server


+ 11 - 8
graph/converters.go

@@ -239,18 +239,21 @@ func convertTasks(tasks []models.Task) []*model.Task {
 // convertMessage converts models.Message to model.Message
 func convertMessage(m models.Message) *model.Message {
 	receivers := make([]string, len(m.Receivers))
+	receiverObjects := make([]*model.User, len(m.Receivers))
 	for i, r := range m.Receivers {
 		receivers[i] = strconv.FormatUint(uint64(r.ID), 10)
+		receiverObjects[i] = convertUser(r)
 	}
 	return &model.Message{
-		ID:        strconv.FormatUint(uint64(m.ID), 10),
-		SenderID:  strconv.FormatUint(uint64(m.SenderID), 10),
-		Sender:    convertUser(m.Sender),
-		Content:   m.Content,
-		SentAt:    m.SentAt.String(),
-		Receivers: receivers,
-		CreatedAt: m.CreatedAt.String(),
-		UpdatedAt: m.UpdatedAt.String(),
+		ID:              strconv.FormatUint(uint64(m.ID), 10),
+		SenderID:        strconv.FormatUint(uint64(m.SenderID), 10),
+		Sender:          convertUser(m.Sender),
+		Content:         m.Content,
+		SentAt:          m.SentAt.String(),
+		Receivers:       receivers,
+		ReceiverObjects: receiverObjects,
+		CreatedAt:       m.CreatedAt.String(),
+		UpdatedAt:       m.UpdatedAt.String(),
 	}
 }
 

+ 71 - 73
graph/generated.go

@@ -43,14 +43,15 @@ type ComplexityRoot struct {
 	}
 
 	Message struct {
-		Content   func(childComplexity int) int
-		CreatedAt func(childComplexity int) int
-		ID        func(childComplexity int) int
-		Receivers func(childComplexity int) int
-		Sender    func(childComplexity int) int
-		SenderID  func(childComplexity int) int
-		SentAt    func(childComplexity int) int
-		UpdatedAt func(childComplexity int) int
+		Content         func(childComplexity int) int
+		CreatedAt       func(childComplexity int) int
+		ID              func(childComplexity int) int
+		ReceiverObjects func(childComplexity int) int
+		Receivers       func(childComplexity int) int
+		Sender          func(childComplexity int) int
+		SenderID        func(childComplexity int) int
+		SentAt          func(childComplexity int) int
+		UpdatedAt       func(childComplexity int) int
 	}
 
 	Mutation struct {
@@ -175,7 +176,6 @@ type ComplexityRoot struct {
 		CreatedAt func(childComplexity int) int
 		Email     func(childComplexity int) int
 		ID        func(childComplexity int) int
-		Password  func(childComplexity int) int
 		Roles     func(childComplexity int) int
 		UpdatedAt func(childComplexity int) int
 	}
@@ -278,6 +278,12 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin
 		}
 
 		return e.ComplexityRoot.Message.ID(childComplexity), true
+	case "Message.receiverObjects":
+		if e.ComplexityRoot.Message.ReceiverObjects == nil {
+			break
+		}
+
+		return e.ComplexityRoot.Message.ReceiverObjects(childComplexity), true
 	case "Message.receivers":
 		if e.ComplexityRoot.Message.Receivers == nil {
 			break
@@ -1047,12 +1053,6 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin
 		}
 
 		return e.ComplexityRoot.User.ID(childComplexity), true
-	case "User.password":
-		if e.ComplexityRoot.User.Password == nil {
-			break
-		}
-
-		return e.ComplexityRoot.User.Password(childComplexity), true
 	case "User.roles":
 		if e.ComplexityRoot.User.Roles == nil {
 			break
@@ -1729,8 +1729,6 @@ func (ec *executionContext) fieldContext_AuthPayload_user(_ context.Context, fie
 				return ec.fieldContext_User_id(ctx, field)
 			case "email":
 				return ec.fieldContext_User_email(ctx, field)
-			case "password":
-				return ec.fieldContext_User_password(ctx, field)
 			case "roles":
 				return ec.fieldContext_User_roles(ctx, field)
 			case "createdAt":
@@ -1830,8 +1828,6 @@ func (ec *executionContext) fieldContext_Message_sender(_ context.Context, field
 				return ec.fieldContext_User_id(ctx, field)
 			case "email":
 				return ec.fieldContext_User_email(ctx, field)
-			case "password":
-				return ec.fieldContext_User_password(ctx, field)
 			case "roles":
 				return ec.fieldContext_User_roles(ctx, field)
 			case "createdAt":
@@ -1932,6 +1928,47 @@ func (ec *executionContext) fieldContext_Message_receivers(_ context.Context, fi
 	return fc, nil
 }
 
+func (ec *executionContext) _Message_receiverObjects(ctx context.Context, field graphql.CollectedField, obj *model.Message) (ret graphql.Marshaler) {
+	return graphql.ResolveField(
+		ctx,
+		ec.OperationContext,
+		field,
+		ec.fieldContext_Message_receiverObjects,
+		func(ctx context.Context) (any, error) {
+			return obj.ReceiverObjects, nil
+		},
+		nil,
+		ec.marshalNUser2ᚕᚖgogsᚗdmscᚗdevᚋarpᚋgraphᚋmodelᚐUserᚄ,
+		true,
+		true,
+	)
+}
+
+func (ec *executionContext) fieldContext_Message_receiverObjects(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
+	fc = &graphql.FieldContext{
+		Object:     "Message",
+		Field:      field,
+		IsMethod:   false,
+		IsResolver: false,
+		Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
+			switch field.Name {
+			case "id":
+				return ec.fieldContext_User_id(ctx, field)
+			case "email":
+				return ec.fieldContext_User_email(ctx, field)
+			case "roles":
+				return ec.fieldContext_User_roles(ctx, field)
+			case "createdAt":
+				return ec.fieldContext_User_createdAt(ctx, field)
+			case "updatedAt":
+				return ec.fieldContext_User_updatedAt(ctx, field)
+			}
+			return nil, fmt.Errorf("no field named %q was found under type User", field.Name)
+		},
+	}
+	return fc, nil
+}
+
 func (ec *executionContext) _Message_createdAt(ctx context.Context, field graphql.CollectedField, obj *model.Message) (ret graphql.Marshaler) {
 	return graphql.ResolveField(
 		ctx,
@@ -2066,8 +2103,6 @@ func (ec *executionContext) fieldContext_Mutation_createUser(ctx context.Context
 				return ec.fieldContext_User_id(ctx, field)
 			case "email":
 				return ec.fieldContext_User_email(ctx, field)
-			case "password":
-				return ec.fieldContext_User_password(ctx, field)
 			case "roles":
 				return ec.fieldContext_User_roles(ctx, field)
 			case "createdAt":
@@ -2121,8 +2156,6 @@ func (ec *executionContext) fieldContext_Mutation_updateUser(ctx context.Context
 				return ec.fieldContext_User_id(ctx, field)
 			case "email":
 				return ec.fieldContext_User_email(ctx, field)
-			case "password":
-				return ec.fieldContext_User_password(ctx, field)
 			case "roles":
 				return ec.fieldContext_User_roles(ctx, field)
 			case "createdAt":
@@ -3171,6 +3204,8 @@ func (ec *executionContext) fieldContext_Mutation_createMessage(ctx context.Cont
 				return ec.fieldContext_Message_sentAt(ctx, field)
 			case "receivers":
 				return ec.fieldContext_Message_receivers(ctx, field)
+			case "receiverObjects":
+				return ec.fieldContext_Message_receiverObjects(ctx, field)
 			case "createdAt":
 				return ec.fieldContext_Message_createdAt(ctx, field)
 			case "updatedAt":
@@ -3230,6 +3265,8 @@ func (ec *executionContext) fieldContext_Mutation_updateMessage(ctx context.Cont
 				return ec.fieldContext_Message_sentAt(ctx, field)
 			case "receivers":
 				return ec.fieldContext_Message_receivers(ctx, field)
+			case "receiverObjects":
+				return ec.fieldContext_Message_receiverObjects(ctx, field)
 			case "createdAt":
 				return ec.fieldContext_Message_createdAt(ctx, field)
 			case "updatedAt":
@@ -3437,8 +3474,6 @@ func (ec *executionContext) fieldContext_Note_user(_ context.Context, field grap
 				return ec.fieldContext_User_id(ctx, field)
 			case "email":
 				return ec.fieldContext_User_email(ctx, field)
-			case "password":
-				return ec.fieldContext_User_password(ctx, field)
 			case "roles":
 				return ec.fieldContext_User_roles(ctx, field)
 			case "createdAt":
@@ -3703,8 +3738,6 @@ func (ec *executionContext) fieldContext_Query_users(_ context.Context, field gr
 				return ec.fieldContext_User_id(ctx, field)
 			case "email":
 				return ec.fieldContext_User_email(ctx, field)
-			case "password":
-				return ec.fieldContext_User_password(ctx, field)
 			case "roles":
 				return ec.fieldContext_User_roles(ctx, field)
 			case "createdAt":
@@ -3747,8 +3780,6 @@ func (ec *executionContext) fieldContext_Query_user(ctx context.Context, field g
 				return ec.fieldContext_User_id(ctx, field)
 			case "email":
 				return ec.fieldContext_User_email(ctx, field)
-			case "password":
-				return ec.fieldContext_User_password(ctx, field)
 			case "roles":
 				return ec.fieldContext_User_roles(ctx, field)
 			case "createdAt":
@@ -4437,6 +4468,8 @@ func (ec *executionContext) fieldContext_Query_messages(_ context.Context, field
 				return ec.fieldContext_Message_sentAt(ctx, field)
 			case "receivers":
 				return ec.fieldContext_Message_receivers(ctx, field)
+			case "receiverObjects":
+				return ec.fieldContext_Message_receiverObjects(ctx, field)
 			case "createdAt":
 				return ec.fieldContext_Message_createdAt(ctx, field)
 			case "updatedAt":
@@ -4485,6 +4518,8 @@ func (ec *executionContext) fieldContext_Query_message(ctx context.Context, fiel
 				return ec.fieldContext_Message_sentAt(ctx, field)
 			case "receivers":
 				return ec.fieldContext_Message_receivers(ctx, field)
+			case "receiverObjects":
+				return ec.fieldContext_Message_receiverObjects(ctx, field)
 			case "createdAt":
 				return ec.fieldContext_Message_createdAt(ctx, field)
 			case "updatedAt":
@@ -4883,8 +4918,6 @@ func (ec *executionContext) fieldContext_Service_createdBy(_ context.Context, fi
 				return ec.fieldContext_User_id(ctx, field)
 			case "email":
 				return ec.fieldContext_User_email(ctx, field)
-			case "password":
-				return ec.fieldContext_User_password(ctx, field)
 			case "roles":
 				return ec.fieldContext_User_roles(ctx, field)
 			case "createdAt":
@@ -4926,8 +4959,6 @@ func (ec *executionContext) fieldContext_Service_participants(_ context.Context,
 				return ec.fieldContext_User_id(ctx, field)
 			case "email":
 				return ec.fieldContext_User_email(ctx, field)
-			case "password":
-				return ec.fieldContext_User_password(ctx, field)
 			case "roles":
 				return ec.fieldContext_User_roles(ctx, field)
 			case "createdAt":
@@ -5279,6 +5310,8 @@ func (ec *executionContext) fieldContext_Subscription_messageAdded(_ context.Con
 				return ec.fieldContext_Message_sentAt(ctx, field)
 			case "receivers":
 				return ec.fieldContext_Message_receivers(ctx, field)
+			case "receiverObjects":
+				return ec.fieldContext_Message_receiverObjects(ctx, field)
 			case "createdAt":
 				return ec.fieldContext_Message_createdAt(ctx, field)
 			case "updatedAt":
@@ -5434,8 +5467,6 @@ func (ec *executionContext) fieldContext_Task_createdBy(_ context.Context, field
 				return ec.fieldContext_User_id(ctx, field)
 			case "email":
 				return ec.fieldContext_User_email(ctx, field)
-			case "password":
-				return ec.fieldContext_User_password(ctx, field)
 			case "roles":
 				return ec.fieldContext_User_roles(ctx, field)
 			case "createdAt":
@@ -5506,8 +5537,6 @@ func (ec *executionContext) fieldContext_Task_updatedBy(_ context.Context, field
 				return ec.fieldContext_User_id(ctx, field)
 			case "email":
 				return ec.fieldContext_User_email(ctx, field)
-			case "password":
-				return ec.fieldContext_User_password(ctx, field)
 			case "roles":
 				return ec.fieldContext_User_roles(ctx, field)
 			case "createdAt":
@@ -5578,8 +5607,6 @@ func (ec *executionContext) fieldContext_Task_assignee(_ context.Context, field
 				return ec.fieldContext_User_id(ctx, field)
 			case "email":
 				return ec.fieldContext_User_email(ctx, field)
-			case "password":
-				return ec.fieldContext_User_password(ctx, field)
 			case "roles":
 				return ec.fieldContext_User_roles(ctx, field)
 			case "createdAt":
@@ -6045,35 +6072,6 @@ func (ec *executionContext) fieldContext_User_email(_ context.Context, field gra
 	return fc, nil
 }
 
-func (ec *executionContext) _User_password(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) {
-	return graphql.ResolveField(
-		ctx,
-		ec.OperationContext,
-		field,
-		ec.fieldContext_User_password,
-		func(ctx context.Context) (any, error) {
-			return obj.Password, nil
-		},
-		nil,
-		ec.marshalNString2string,
-		true,
-		true,
-	)
-}
-
-func (ec *executionContext) fieldContext_User_password(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
-	fc = &graphql.FieldContext{
-		Object:     "User",
-		Field:      field,
-		IsMethod:   false,
-		IsResolver: false,
-		Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
-			return nil, errors.New("field of type String does not have child fields")
-		},
-	}
-	return fc, nil
-}
-
 func (ec *executionContext) _User_roles(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) {
 	return graphql.ResolveField(
 		ctx,
@@ -8392,6 +8390,11 @@ func (ec *executionContext) _Message(ctx context.Context, sel ast.SelectionSet,
 			if out.Values[i] == graphql.Null {
 				out.Invalids++
 			}
+		case "receiverObjects":
+			out.Values[i] = ec._Message_receiverObjects(ctx, field, obj)
+			if out.Values[i] == graphql.Null {
+				out.Invalids++
+			}
 		case "createdAt":
 			out.Values[i] = ec._Message_createdAt(ctx, field, obj)
 			if out.Values[i] == graphql.Null {
@@ -9483,11 +9486,6 @@ func (ec *executionContext) _User(ctx context.Context, sel ast.SelectionSet, obj
 			if out.Values[i] == graphql.Null {
 				out.Invalids++
 			}
-		case "password":
-			out.Values[i] = ec._User_password(ctx, field, obj)
-			if out.Values[i] == graphql.Null {
-				out.Invalids++
-			}
 		case "roles":
 			out.Values[i] = ec._User_roles(ctx, field, obj)
 			if out.Values[i] == graphql.Null {

+ 9 - 9
graph/model/models_gen.go

@@ -8,14 +8,15 @@ type AuthPayload struct {
 }
 
 type Message struct {
-	ID        string   `json:"id"`
-	SenderID  string   `json:"senderId"`
-	Sender    *User    `json:"sender"`
-	Content   string   `json:"content"`
-	SentAt    string   `json:"sentAt"`
-	Receivers []string `json:"receivers"`
-	CreatedAt string   `json:"createdAt"`
-	UpdatedAt string   `json:"updatedAt"`
+	ID              string   `json:"id"`
+	SenderID        string   `json:"senderId"`
+	Sender          *User    `json:"sender"`
+	Content         string   `json:"content"`
+	SentAt          string   `json:"sentAt"`
+	Receivers       []string `json:"receivers"`
+	ReceiverObjects []*User  `json:"receiverObjects"`
+	CreatedAt       string   `json:"createdAt"`
+	UpdatedAt       string   `json:"updatedAt"`
 }
 
 type Mutation struct {
@@ -196,7 +197,6 @@ type UpdateUserInput struct {
 type User struct {
 	ID        string  `json:"id"`
 	Email     string  `json:"email"`
-	Password  string  `json:"password"`
 	Roles     []*Role `json:"roles"`
 	CreatedAt string  `json:"createdAt"`
 	UpdatedAt string  `json:"updatedAt"`

+ 1 - 0
graph/schema.graphqls

@@ -94,6 +94,7 @@ type Message {
   content: String!
   sentAt: String!
   receivers: [ID!]!
+  receiverObjects: [User!]!
   createdAt: String!
   updatedAt: String!
 }

+ 3 - 3
graph/schema.resolvers.go

@@ -959,7 +959,7 @@ func (r *queryResolver) Users(ctx context.Context) ([]*model.User, error) {
 	}
 
 	var users []models.User
-	if err := r.DB.Find(&users).Error; err != nil {
+	if err := r.DB.Preload("Roles").Find(&users).Error; err != nil {
 		return nil, fmt.Errorf("failed to fetch users: %w", err)
 	}
 	logging.LogQuery(ctx, "USERS", "all")
@@ -1211,7 +1211,7 @@ func (r *queryResolver) Messages(ctx context.Context) ([]*model.Message, error)
 	}
 
 	var messages []models.Message
-	if err := r.DB.Preload("Sender").Find(&messages).Error; err != nil {
+	if err := r.DB.Preload("Sender").Preload("Receivers").Find(&messages).Error; err != nil {
 		return nil, fmt.Errorf("failed to fetch messages: %w", err)
 	}
 	logging.LogQuery(ctx, "MESSAGES", "all")
@@ -1231,7 +1231,7 @@ func (r *queryResolver) Message(ctx context.Context, id string) (*model.Message,
 	}
 
 	var message models.Message
-	if err := r.DB.Preload("Sender").First(&message, messageID).Error; err != nil {
+	if err := r.DB.Preload("Sender").Preload("Receivers").First(&message, messageID).Error; err != nil {
 		return nil, fmt.Errorf("message not found: %w", err)
 	}
 

+ 17 - 5
graph/testdata/snapshots/TestIntegration_Bootstrap-CreateMessages

@@ -3,23 +3,35 @@ messages
   "messages": [
     {
       "content": "Welcome to the project channel!",
-      "receivers": []
+      "receivers": [
+        "2"
+      ]
     },
     {
       "content": "Thanks! Excited to get started.",
-      "receivers": []
+      "receivers": [
+        "1"
+      ]
     },
     {
       "content": "Hey, let us discuss the API documentation.",
-      "receivers": []
+      "receivers": [
+        "3"
+      ]
     },
     {
       "content": "Sure, I will start drafting it today.",
-      "receivers": []
+      "receivers": [
+        "2"
+      ]
     },
     {
       "content": "Team announcement: Sprint review tomorrow at 2pm.",
-      "receivers": []
+      "receivers": [
+        "2",
+        "3",
+        "4"
+      ]
     }
   ]
 }

+ 20 - 4
graph/testdata/snapshots/TestIntegration_Bootstrap-CreateUsers

@@ -3,19 +3,35 @@ users
   "users": [
     {
       "email": "admin@example.com",
-      "roles": []
+      "roles": [
+        {
+          "name": "admin"
+        }
+      ]
     },
     {
       "email": "member1@example.com",
-      "roles": []
+      "roles": [
+        {
+          "name": "member"
+        }
+      ]
     },
     {
       "email": "member2@example.com",
-      "roles": []
+      "roles": [
+        {
+          "name": "member"
+        }
+      ]
     },
     {
       "email": "viewer@example.com",
-      "roles": []
+      "roles": [
+        {
+          "name": "viewer"
+        }
+      ]
     }
   ]
 }

+ 20 - 4
graph/testdata/snapshots/TestIntegration_Update-UpdateUser

@@ -3,19 +3,35 @@ users_after_update
   "users": [
     {
       "email": "admin-updated@example.com",
-      "roles": []
+      "roles": [
+        {
+          "name": "admin"
+        }
+      ]
     },
     {
       "email": "member1@example.com",
-      "roles": []
+      "roles": [
+        {
+          "name": "member"
+        }
+      ]
     },
     {
       "email": "member2@example.com",
-      "roles": []
+      "roles": [
+        {
+          "name": "member"
+        }
+      ]
     },
     {
       "email": "viewer@example.com",
-      "roles": []
+      "roles": [
+        {
+          "name": "viewer"
+        }
+      ]
     }
   ]
 }