Search code examples
graphqlapollotypeorm

TypeORM - Retrieve data through relation query in resolver


So I'm trying to retrieve elements out of a join relation in an Apollo resolver.

I've got a User table, a Notification table. And a Relation table named:

notification_recipients_user defined by a ManyToMany relation on both entity but hosted on Notification :

//entity/Notification.ts
  @ManyToMany(type => User, recipient => recipient.notifications)
  @JoinTable()
  recipients: User[];

I can create relation without problem through this mutation :

    addNotificationForUser: async (_, { id, data }) => {
      const user = await User.findOne({ id });
      if (user) {
        const notification = await Notification.create({
          template: data,
          recipients: [user]
        }).save()
        return notification;
      } else {
        throw new Error("User does not exists!");
      }
    }

However I'm totally not succeeding in retrieving data for a specific User.

    allNotificationsOfUser: (_, { user }, ___) => {
      return Notification.find({
        where: { userId: user },
        relations: ['recipients'],
      })

enter image description here

The method find is one of TypeORM native methods.

However I must be doing something wrong because it react as if there wasn't any filter.


Solution

  • Okay so the best way of doing it is by using relation between entity.

    So to get Notification you'll go by User.notifications

    allUnseenNotificationsOfUser: async (_, { userId }, __) => {
      const user = await User.findOne({
        relations: ["notifications"],
        where: { id: userId }
      });
      if (user) {
        const notifications = user.notifications.filter(notification => !notification.seen)
        return notifications;
      }
      return null;
    }
    

    And for the record for anyone stumbeling upon this you can use filter on your result to do a query like resolver.

    const notifications = user.notifications.filter(notification => !notification.seen)

    It feels tricky but works like a charm.