123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
- module Gql::Mutations
- class OnlineNotification::Seen < BaseMutation
- description 'Mark an online notification as seen'
- argument :object_id, GraphQL::Types::ID, description: 'ID of the object the notification is about.'
- field :success, Boolean, null: false, description: 'Did we successfully set the online notification to seen?'
- def authorized?(object_id:)
- relevant_notifications(object_id).all? do |notification|
- Pundit.authorize(context.current_user, notification, :update?)
- end
- end
- def resolve(object_id:)
- relevant_notifications(object_id).each do |notification|
- notification.update!(seen: true)
- end
- { success: true }
- end
- private
- def relevant_notifications(object_id)
- ::OnlineNotification.list_by_object(
- object_name(object_id),
- online_notification_object(object_id).id
- )
- .reject(&:seen?)
- .select { |notification| notification.user_id == context.current_user.id }
- end
- def object_name(object_id)
- @object_name ||= GlobalID::Locator.locate(object_id)&.class&.name
- end
- def online_notification_object(object_id)
- @online_notification_object ||= Gql::ZammadSchema.authorized_object_from_id(
- object_id,
- type: object_name(object_id).constantize,
- user: context.current_user,
- )
- end
- end
- end
|