GSoC 2022 CircuitVerse | 11주 및 12주 보고서

설명



지난 2주 동안 저는 CircuitVerse에 대한 알림 관련 필드를 완성하는 작업을 했습니다.

새로운 알림 버전/UI를 배포했습니다. 각 사용자에 대한 이전 알림을 모두 마이그레이션할 데이터 마이그레이션 작업이 아직 보류 중입니다.

웹 푸시 구현



나는 우리 사이트에 있지 않은 동안 사용자가 알림을 받을 수 있도록 하는 Webpush 기능을 추가하는 작업을 하고 있습니다. 내비게이션 바의 모바일 알림에서 보는 것처럼!

기본적으로 사용자 브라우저에서 등록service-worker.js을 해야 합니다.

if (navigator.serviceWorker) {
    navigator.serviceWorker.register('/serviceworker.js.erb', { scope: '/' });
}


따라서 Rails 앱에 webpush 기능을 추가하기 위한 gemwebpush이 있습니다. 우리는 이미 Push_subscription라는 모델로 webpush를 구현했습니다. 기본적으로 각 webpush 알림에 대해 구독 시 사용자 브라우저를 트리거한 데이터베이스에 레코드가 있으며 사용자는 웹에서 알림을 볼 수 있습니다.

알림에 대한 사용자 정의 전달 방법을 갖는 정말 멋진 기능이 있는 것을 알아차린 gem이 있으므로 사용자 정의 전달 방법Webpush을 만들었습니다.

class DeliveryMethods::Webpush < Noticed::DeliveryMethods::Base
  def deliver
    # Logic for sending the notification
    user = User.find(params[:user_id])
    project = Project.find(params[:project_id])
    url = "/users/#{recipient.id}/notifications"
    recipient.push_subscriptions.each do |sub|
      if params[:webpush_type] == "star"
        sub.send_push_notification("#{user.name} starred your project #{project.name}!", url)
      else
        sub.send_push_notification("#{user.name} forked your project #{project.name}!", url)
      end
    end
  end
end


알림에 전달 방법을 각각 추가합니다.

# app/notifications/fork_notification.rb
class ForkNotification < Noticed::Base
  deliver_by :webpush, class: "DeliveryMethods::Webpush"
end


버그: 'id'가 있는 프로젝트를 찾을 수 없습니다.



처음에는 모든 알림에 대해 프로젝트 및 사용자(알림을 트리거한 사람)의 ids를 저장했습니다. 이로 인해 프로젝트 종속 알림이 삭제되지 않아 오류가 발생했습니다.

Aboobacker는 버그를 찾는 데 도움을 주었고 마침내 params에 객체를 저장하는 접근 방식을 만들었으므로 프로젝트를 파괴하면 종속 알림 객체도 파괴됩니다. 그러나 여기에서 문제가 발생했습니다. 새 알림 버전은 1.5주 전에 릴리스되었으며 그동안 project_id에서 user_idparams를 의미하는 이전 매개 변수 버전이 포함된 많은 알림이 저장되었습니다. 그래서 올바른 방법으로 매개변수를 업데이트할 파일data_migration을 만들기로 결정했습니다. 한번 보세요:

class PopulateNoticedNotificationWithValidParams < ActiveRecord::DataMigration
  def up
    NoticedNotification.find_each do |notification|
      if Project.where(id: notification.params[:project_id]).exists?
        project = Project.find(notification.params[:project_id])
        notification.params[:user] = User.find(notification.params[:user_id])
        notification.params[:project] = project
        notification.save
      else
        notification.destroy!
      end
    end
  end
end


홍보


  • 검토 중: Webpush notification
  • 합병: fix: dependent notifications on project while destroy

  • 다음 작업:


  • 전체 알림 API.
  • 프로젝트에 대해 제안된 태그입니다.

  • 결론



    SIH와 건강 문제로 인해 3-4일 동안 일하지 못했습니다. 하지만 언제나처럼 많이 배웠습니다!

    좋은 웹페이지 즐겨찾기