mirror of https://github.com/docusealco/docuseal
				
				
				
			
							parent
							
								
									62cea05084
								
							
						
					
					
						commit
						8cabe31827
					
				| @ -0,0 +1,17 @@ | |||||||
|  | # frozen_string_literal: true | ||||||
|  | 
 | ||||||
|  | module Api | ||||||
|  |   class SubmitterEmailClicksController < ApiBaseController | ||||||
|  |     skip_before_action :authenticate_user! | ||||||
|  | 
 | ||||||
|  |     def create | ||||||
|  |       submitter = Submitter.find_by!(slug: params[:submitter_slug]) | ||||||
|  | 
 | ||||||
|  |       if params[:t] == SubmissionEvents.build_tracking_param(submitter, 'click_email') | ||||||
|  |         SubmissionEvents.create_with_tracking_data(submitter, 'click_email', request) | ||||||
|  |       end | ||||||
|  | 
 | ||||||
|  |       render json: {} | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
| @ -0,0 +1,15 @@ | |||||||
|  | # frozen_string_literal: true | ||||||
|  | 
 | ||||||
|  | module Api | ||||||
|  |   class SubmitterFormViewsController < ApiBaseController | ||||||
|  |     skip_before_action :authenticate_user! | ||||||
|  | 
 | ||||||
|  |     def create | ||||||
|  |       submitter = Submitter.find_by!(slug: params[:submitter_slug]) | ||||||
|  | 
 | ||||||
|  |       SubmissionEvents.create_with_tracking_data(submitter, 'view_form', request) | ||||||
|  | 
 | ||||||
|  |       render json: {} | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
| @ -0,0 +1,53 @@ | |||||||
|  | # frozen_string_literal: true | ||||||
|  | 
 | ||||||
|  | # == Schema Information | ||||||
|  | # | ||||||
|  | # Table name: submission_events | ||||||
|  | # | ||||||
|  | #  id              :bigint           not null, primary key | ||||||
|  | #  data            :text             not null | ||||||
|  | #  event_timestamp :datetime         not null | ||||||
|  | #  event_type      :string           not null | ||||||
|  | #  created_at      :datetime         not null | ||||||
|  | #  updated_at      :datetime         not null | ||||||
|  | #  submission_id   :bigint           not null | ||||||
|  | #  submitter_id    :bigint | ||||||
|  | # | ||||||
|  | # Indexes | ||||||
|  | # | ||||||
|  | #  index_submission_events_on_submission_id  (submission_id) | ||||||
|  | #  index_submission_events_on_submitter_id   (submitter_id) | ||||||
|  | # | ||||||
|  | # Foreign Keys | ||||||
|  | # | ||||||
|  | #  fk_rails_...  (submission_id => submissions.id) | ||||||
|  | #  fk_rails_...  (submitter_id => submitters.id) | ||||||
|  | # | ||||||
|  | class SubmissionEvent < ApplicationRecord | ||||||
|  |   belongs_to :submission | ||||||
|  |   belongs_to :submitter, optional: true | ||||||
|  | 
 | ||||||
|  |   attribute :data, :string, default: -> { {} } | ||||||
|  |   attribute :event_timestamp, :datetime, default: -> { Time.current } | ||||||
|  | 
 | ||||||
|  |   serialize :data, JSON | ||||||
|  | 
 | ||||||
|  |   before_validation :set_submission_id, on: :create | ||||||
|  | 
 | ||||||
|  |   enum :event_type, { | ||||||
|  |     send_email: 'send_email', | ||||||
|  |     send_sms: 'send_sms', | ||||||
|  |     open_email: 'open_email', | ||||||
|  |     click_email: 'click_email', | ||||||
|  |     click_sms: 'click_sms', | ||||||
|  |     start_form: 'start_form', | ||||||
|  |     view_form: 'view_form', | ||||||
|  |     complete_form: 'complete_form' | ||||||
|  |   }, scope: false | ||||||
|  | 
 | ||||||
|  |   private | ||||||
|  | 
 | ||||||
|  |   def set_submission_id | ||||||
|  |     self.submission_id = submitter&.submission_id | ||||||
|  |   end | ||||||
|  | end | ||||||
| @ -0,0 +1,15 @@ | |||||||
|  | # frozen_string_literal: true | ||||||
|  | 
 | ||||||
|  | class CreateSubmissionEvents < ActiveRecord::Migration[7.0] | ||||||
|  |   def change | ||||||
|  |     create_table :submission_events do |t| | ||||||
|  |       t.references :submission, null: false, foreign_key: true, index: true | ||||||
|  |       t.references :submitter, null: true, foreign_key: true, index: true | ||||||
|  |       t.text :data, null: false | ||||||
|  |       t.string :event_type, null: false | ||||||
|  |       t.datetime :event_timestamp, null: false | ||||||
|  | 
 | ||||||
|  |       t.timestamps | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
| @ -0,0 +1,22 @@ | |||||||
|  | # frozen_string_literal: true | ||||||
|  | 
 | ||||||
|  | module SubmissionEvents | ||||||
|  |   TRACKING_PARAM_LENGTH = 6 | ||||||
|  | 
 | ||||||
|  |   module_function | ||||||
|  | 
 | ||||||
|  |   def build_tracking_param(submitter, event_type = 'click_email') | ||||||
|  |     Base64.urlsafe_encode64( | ||||||
|  |       [submitter.slug, event_type, Rails.application.secrets.secret_key_base].join(':') | ||||||
|  |     ).first(TRACKING_PARAM_LENGTH) | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   def create_with_tracking_data(submitter, event_type, request) | ||||||
|  |     SubmissionEvent.create!(submitter:, event_type:, data: { | ||||||
|  |       ip: request.remote_ip, | ||||||
|  |       ua: request.user_agent, | ||||||
|  |       sid: request.session.id.to_s, | ||||||
|  |       uid: request.env['warden'].user(:user)&.id | ||||||
|  |     }.compact_blank) | ||||||
|  |   end | ||||||
|  | end | ||||||
					Loading…
					
					
				
		Reference in new issue