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