wordjelly-auth 1.1.7 → 1.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/javascripts/auth/application.js +1 -1
- data/app/controllers/auth/application_controller.rb +6 -0
- data/app/controllers/auth/concerns/devise_concern.rb +1 -1
- data/app/controllers/auth/concerns/work/communication_controller_concern.rb +82 -0
- data/app/controllers/auth/concerns/work/instruction_controller_concern.rb +6 -1
- data/app/controllers/auth/endpoints_controller.rb +41 -24
- data/app/controllers/auth/images_controller.rb +0 -4
- data/app/controllers/auth/profiles_controller.rb +2 -13
- data/app/controllers/auth/work/communications_controller.rb +18 -0
- data/app/controllers/auth/work/work_controller.rb +43 -0
- data/app/jobs/notification_job.rb +17 -0
- data/app/mailers/auth/send_mail.rb +15 -0
- data/app/models/auth/concerns/chief_model_concern.rb +4 -0
- data/app/models/auth/concerns/shopping/product_concern.rb +5 -3
- data/app/models/auth/concerns/user_concern.rb +2 -6
- data/app/models/auth/endpoint.rb +26 -3
- data/app/models/auth/image.rb +5 -0
- data/app/models/auth/work/communication.rb +109 -0
- data/app/models/auth/work/cycle.rb +8 -14
- data/app/models/auth/work/instruction.rb +1 -0
- data/app/models/auth/work/minute.rb +75 -52
- data/app/views/auth/images/_form.html.erb +1 -1
- data/app/views/auth/images/_image_concern.html.erb +3 -3
- data/app/views/auth/send_mail/send.html.erb +1 -0
- data/app/views/auth/shopping/products/show/_summary.html.erb +12 -0
- data/app/views/auth/work/communications/_form.html.erb +57 -0
- data/app/views/auth/work/instructions/_form.html.erb +7 -1
- data/app/views/auth/work/instructions/_image.html.erb +5 -0
- data/app/views/auth/work/instructions/new.html.erb +1 -0
- data/app/views/auth/work/instructions/show.html.erb +1 -0
- data/app/views/layouts/send_mail.html.erb +5 -0
- data/lib/auth/engine.rb +34 -4
- data/lib/auth/rails/routes.rb +11 -11
- data/lib/auth/version.rb +1 -1
- data/spec/dummy/app/assets/javascripts/application.js +0 -2
- data/spec/dummy/app/assets/javascripts/images.js +9 -19
- data/spec/dummy/app/assets/time_hashes.json +1 -1
- data/spec/dummy/app/views/layouts/application.html.erb +0 -1
- data/spec/dummy/app/views/new/notification.text.erb +1 -1
- data/spec/dummy/app/views/worms/new.html.erb +3 -0
- data/spec/dummy/config/cloudinary.yml +6 -6
- data/spec/dummy/config/initializers/preinitializer.rb +1 -4
- data/spec/models/auth/work/minute_spec.rb +43 -34
- data/spec/requests/user/amazon_sns_request_spec.rb +34 -2
- data/spec/support/work_support.rb +133 -0
- metadata +13 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c7ab725ad999f3946bd4ab7ba2cee07eb9b8cbd5
|
|
4
|
+
data.tar.gz: 76ba5387d53e18539441f2b3514988b4bb4adb6c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f2e71a5be7e81f2d8ad4006973f2d94306cce5bc5b3d69d42d6c8dfb97a8be775deb68fc177357496c83d92335c13b6963c9ef72fe3a136a4b592f9959d318ce
|
|
7
|
+
data.tar.gz: b363954188740ee6731b712e443950cf6e8e67f1a60e9af94c1ea8ed27d293db0c6ff1cea7da522a85c892e038b9aa9a39e2176899ed97b2c1fedcfc8256386c
|
|
@@ -12,6 +12,10 @@ module Auth
|
|
|
12
12
|
end
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
+
rescue_from ActionController::UnknownFormat do |e|
|
|
16
|
+
render status: 404, text: "Not Found"
|
|
17
|
+
end
|
|
18
|
+
|
|
15
19
|
|
|
16
20
|
######################################################################
|
|
17
21
|
##
|
|
@@ -39,6 +43,7 @@ module Auth
|
|
|
39
43
|
|
|
40
44
|
not_found("could not determine class name") unless class_name
|
|
41
45
|
|
|
46
|
+
puts "class name: #{class_name}"
|
|
42
47
|
|
|
43
48
|
|
|
44
49
|
return class_name
|
|
@@ -63,6 +68,7 @@ module Auth
|
|
|
63
68
|
|
|
64
69
|
|
|
65
70
|
def build_model_from_params
|
|
71
|
+
puts "params are: #{params.to_s}"
|
|
66
72
|
pp = permitted_params
|
|
67
73
|
puts "the permitted_params are:"
|
|
68
74
|
puts permitted_params.to_s
|
|
@@ -125,7 +125,7 @@ module Auth::Concerns::DeviseConcern
|
|
|
125
125
|
##should block any put action on the user
|
|
126
126
|
##and should render an error saying please do this on the server.
|
|
127
127
|
if is_json_request?
|
|
128
|
-
|
|
128
|
+
|
|
129
129
|
if action_name == "otp_verification_result"
|
|
130
130
|
##we let this action pass because, we make json ajax requests
|
|
131
131
|
##from the web ui to this endpoint, and anyway it does
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
module Auth::Concerns::Work::InstructionControllerConcern
|
|
2
|
+
|
|
3
|
+
extend ActiveSupport::Concern
|
|
4
|
+
|
|
5
|
+
included do
|
|
6
|
+
include Auth::Work::Instructions::InstructionsHelper
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
## at this stage all we will have is instantiations .
|
|
10
|
+
def get_parent_object(parent_object_class,parent_object_id)
|
|
11
|
+
|
|
12
|
+
parent_object = nil
|
|
13
|
+
|
|
14
|
+
begin
|
|
15
|
+
parent_object = parent_object_class.constantize.find(parent_object_id)
|
|
16
|
+
if params[:id]
|
|
17
|
+
@auth_work_communication = parent_object.communications.select{|c|
|
|
18
|
+
c.id.to_s == params[:id]
|
|
19
|
+
}
|
|
20
|
+
@auth_work_communication = @auth_work_communication.size > 0 ? @auth_work_communication[0] : Auth::Work::Communication.new(@auth_work_communication_params)
|
|
21
|
+
else
|
|
22
|
+
|
|
23
|
+
end
|
|
24
|
+
rescue Mongoid::Errors::DocumentNotFound
|
|
25
|
+
parent_object = parent_object_class.constantize.new
|
|
26
|
+
@auth_work_communication = Auth::Work::Communication.new(@auth_work_communication_params)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
parent_object
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def initialize_vars
|
|
34
|
+
|
|
35
|
+
instantiate_work_classes
|
|
36
|
+
|
|
37
|
+
@auth_work_communication_params = permitted_params.fetch(:communication,{})
|
|
38
|
+
|
|
39
|
+
@auth_work_cycle = nil
|
|
40
|
+
|
|
41
|
+
@auth_work_instruction = nil
|
|
42
|
+
|
|
43
|
+
if @auth_work_communication_params[:cycle_id]
|
|
44
|
+
@auth_work_cycle = get_parent_object(@auth_work_cycle_class,@auth_work_communication_params[:cycle_id])
|
|
45
|
+
elsif @auth_work_communication_params[:instruction_id]
|
|
46
|
+
@auth_work_instruction = get_parent_object(@auth_work_instruction_class,@auth_work_communication_params[:instruction_id])
|
|
47
|
+
else
|
|
48
|
+
not_found("please provide a cycle id or an instruction id")
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def create
|
|
54
|
+
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def new
|
|
58
|
+
## now new has to render this form.
|
|
59
|
+
## and it has to determine the url and the
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def index
|
|
63
|
+
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def update
|
|
67
|
+
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def show
|
|
71
|
+
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def destroy
|
|
75
|
+
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def permitted_params
|
|
79
|
+
pr = params.permit({:communication => [:send_email,:email_template_path,:method_to_determine_recipients,:repeat,:repeat_times,:method_to_determine_communication_timing,:enqueue_at_time]}, :id, :instruction_id,:cycle_id)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
end
|
|
@@ -6,6 +6,7 @@ module Auth::Concerns::Work::InstructionControllerConcern
|
|
|
6
6
|
include Auth::Work::Instructions::InstructionsHelper
|
|
7
7
|
end
|
|
8
8
|
|
|
9
|
+
|
|
9
10
|
def initialize_vars
|
|
10
11
|
instantiate_work_classes
|
|
11
12
|
not_found("no product id provided") unless params[:product_id]
|
|
@@ -19,13 +20,16 @@ module Auth::Concerns::Work::InstructionControllerConcern
|
|
|
19
20
|
if params[:id]
|
|
20
21
|
@auth_work_instruction = @auth_shopping_product.instructions.select{|c|
|
|
21
22
|
c.id.to_s == params[:id]
|
|
22
|
-
}
|
|
23
|
+
}
|
|
24
|
+
not_found("no such object") if @auth_work_instruction.empty?
|
|
25
|
+
@auth_work_instruction = @auth_work_instruction[0]
|
|
23
26
|
else
|
|
24
27
|
@auth_work_instruction = @auth_work_instruction_class.new(@auth_work_instruction_params)
|
|
25
28
|
end
|
|
26
29
|
end
|
|
27
30
|
rescue Mongoid::Errors::DocumentNotFound
|
|
28
31
|
@auth_shopping_product = @auth_shopping_product_class.new
|
|
32
|
+
@auth_work_instruction = @auth_work_instruction_class.new(@auth_work_instruction_params)
|
|
29
33
|
end
|
|
30
34
|
|
|
31
35
|
end
|
|
@@ -75,6 +79,7 @@ module Auth::Concerns::Work::InstructionControllerConcern
|
|
|
75
79
|
|
|
76
80
|
def show
|
|
77
81
|
instantiate_work_classes
|
|
82
|
+
## so i will have to pass the product id as well.
|
|
78
83
|
@auth_shopping_product = @auth_shopping_product_class.find(params[:product_id])
|
|
79
84
|
@auth_work_instruction = @auth_shopping_product.instructions.select{|c| c.id.to_s == params[:id]}[0]
|
|
80
85
|
end
|
|
@@ -2,6 +2,7 @@ class Auth::EndpointsController < Auth::ApplicationController
|
|
|
2
2
|
|
|
3
3
|
## responds only to json.
|
|
4
4
|
## got to add the thing to subscribe them to a topic as well.
|
|
5
|
+
respond_to :json
|
|
5
6
|
|
|
6
7
|
include Auth::Concerns::DeviseConcern
|
|
7
8
|
|
|
@@ -12,43 +13,59 @@ class Auth::EndpointsController < Auth::ApplicationController
|
|
|
12
13
|
before_filter :build_model_from_params
|
|
13
14
|
before_filter(:only => [:create]){|c| check_for_create(@model)}
|
|
14
15
|
|
|
15
|
-
## all i have to do now is set the routes
|
|
16
|
-
## and this should start saving endpoints automatically as needed.
|
|
17
|
-
## so now lets try to make a new endpoint.
|
|
18
|
-
## question is that what if that token already exists ?
|
|
19
|
-
## so i will do a find_one_and_update.
|
|
20
|
-
|
|
21
16
|
def create
|
|
17
|
+
|
|
18
|
+
|
|
22
19
|
or_clause = []
|
|
23
20
|
|
|
24
21
|
or_clause << {
|
|
25
|
-
"android_token" =>
|
|
26
|
-
} if
|
|
22
|
+
"android_token" => @model.android_token
|
|
23
|
+
} if @model.android_token
|
|
27
24
|
|
|
28
25
|
or_clause << {
|
|
29
|
-
"ios_token" =>
|
|
30
|
-
} if
|
|
26
|
+
"ios_token" => @model.ios_token
|
|
27
|
+
} if @model.ios_token
|
|
28
|
+
|
|
29
|
+
if or_clause.empty?
|
|
30
|
+
returned_document = nil
|
|
31
|
+
else
|
|
32
|
+
returned_document = @model.class.where({
|
|
33
|
+
"$or" => or_clause
|
|
34
|
+
}).find_one_and_update(
|
|
35
|
+
{
|
|
36
|
+
"$setOnInsert" => @model.attributes,
|
|
37
|
+
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
:upsert => true,
|
|
41
|
+
:return_document => :after
|
|
42
|
+
}
|
|
43
|
+
)
|
|
31
44
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
"$set" => self.attributes,
|
|
45
|
+
if returned_document
|
|
46
|
+
returned_document.set_android_endpoint
|
|
47
|
+
returned_document.set_ios_endpoint
|
|
48
|
+
end
|
|
37
49
|
|
|
38
|
-
|
|
39
|
-
{
|
|
40
|
-
:return_document => :after
|
|
41
|
-
}
|
|
42
|
-
)
|
|
50
|
+
end
|
|
43
51
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
52
|
+
respond_to do |format|
|
|
53
|
+
if returned_document
|
|
54
|
+
format.json do
|
|
55
|
+
render json: returned_document.to_json, status: 201
|
|
56
|
+
end
|
|
57
|
+
else
|
|
58
|
+
format.json do
|
|
59
|
+
render json: {
|
|
60
|
+
}.to_json, status: 422
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
47
64
|
|
|
48
65
|
end
|
|
49
66
|
|
|
50
67
|
def permitted_params
|
|
51
|
-
params.
|
|
68
|
+
params.permit({:endpoint => [:android_token,:ios_token]},:api_key,:current_app_id)
|
|
52
69
|
end
|
|
53
70
|
|
|
54
71
|
end
|
|
@@ -51,19 +51,8 @@ class Auth::ProfilesController < Auth::ApplicationController
|
|
|
51
51
|
|
|
52
52
|
check_for_update(@profile_resource)
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
#end
|
|
57
|
-
|
|
58
|
-
#if @resource_params[:created_by_admin]
|
|
59
|
-
# @profile_resource.created_by_admin = @resource_params[:created_by_admin]
|
|
60
|
-
#end
|
|
61
|
-
|
|
62
|
-
## so not only this but i need a basic endpoint as well
|
|
63
|
-
## to add endpoints.
|
|
64
|
-
## okay so will need another endpoint model for that purpose.
|
|
65
|
-
## so first let me finish this.
|
|
66
|
-
|
|
54
|
+
puts "going to assing attributes."
|
|
55
|
+
puts "resource params are: #{}"
|
|
67
56
|
@profile_resource.assign_attributes(@resource_params)
|
|
68
57
|
|
|
69
58
|
@profile_resource.m_client = self.m_client
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
class Auth::Work::CommunicationsController < Auth::Work::WorkController
|
|
2
|
+
|
|
3
|
+
include Auth::Concerns::Work::CommunicationControllerConcern
|
|
4
|
+
|
|
5
|
+
## only these actions need an authenticated user to be present for them to be executed.
|
|
6
|
+
CONDITIONS_FOR_TOKEN_AUTH = [:create,:update,:destroy,:edit,:new]
|
|
7
|
+
|
|
8
|
+
TCONDITIONS = {:only => CONDITIONS_FOR_TOKEN_AUTH}
|
|
9
|
+
##this ensures api access to this controller.
|
|
10
|
+
include Auth::Concerns::DeviseConcern
|
|
11
|
+
include Auth::Concerns::TokenConcern
|
|
12
|
+
before_filter :do_before_request , TCONDITIONS
|
|
13
|
+
before_filter :initialize_vars , TCONDITIONS
|
|
14
|
+
before_filter :is_admin_user , :only => [:create,:update,:destroy,:edit]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
end
|
|
@@ -38,9 +38,52 @@ class Auth::Work::WorkController < Auth::ApplicationController
|
|
|
38
38
|
|
|
39
39
|
end
|
|
40
40
|
|
|
41
|
+
def instantiate_communication_class
|
|
42
|
+
if @auth_work_communication_class = Auth.configuration.communication_class
|
|
43
|
+
begin
|
|
44
|
+
@auth_work_communication_class = @auth_work_communication_class.constantize
|
|
45
|
+
rescue => e
|
|
46
|
+
puts e.to_s
|
|
47
|
+
not_found("error instatiating class from communication class")
|
|
48
|
+
end
|
|
49
|
+
else
|
|
50
|
+
not_found("communication class not specified in configuration")
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def instantiate_communication_class
|
|
55
|
+
if @auth_work_communication_class = Auth.configuration.communication_class
|
|
56
|
+
begin
|
|
57
|
+
@auth_work_communication_class = @auth_work_communication_class.constantize
|
|
58
|
+
rescue => e
|
|
59
|
+
puts e.to_s
|
|
60
|
+
not_found("error instatiating class from communication class")
|
|
61
|
+
end
|
|
62
|
+
else
|
|
63
|
+
not_found("communication class not specified in configuration")
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def instantiate_cycle_class
|
|
68
|
+
if @auth_work_cycle_class = Auth.configuration.cycle_class
|
|
69
|
+
begin
|
|
70
|
+
@auth_work_cycle_class = @auth_work_cycle_class.constantize
|
|
71
|
+
rescue => e
|
|
72
|
+
puts e.to_s
|
|
73
|
+
not_found("error instatiating class from cycle class")
|
|
74
|
+
end
|
|
75
|
+
else
|
|
76
|
+
not_found("cycle class not specified in configuration")
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
## do we have a cycle class / controller, obviously are going to need this eventually.
|
|
80
|
+
## so let me now add that to the engine, add cycle class to engine.
|
|
81
|
+
|
|
41
82
|
def instantiate_work_classes
|
|
42
83
|
instantiate_instruction_class
|
|
43
84
|
instantiate_bullet_class
|
|
44
85
|
instantiate_product_class
|
|
86
|
+
instantiate_cycle_class
|
|
87
|
+
instantiate_communication_class
|
|
45
88
|
end
|
|
46
89
|
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
class NotificationJob < ActiveJob::Base
|
|
2
|
+
|
|
3
|
+
queue_as :default
|
|
4
|
+
self.queue_adapter = :delayed_job
|
|
5
|
+
|
|
6
|
+
##we currently log all exceptions to redis.
|
|
7
|
+
rescue_from(StandardError) do |exception|
|
|
8
|
+
puts exception.message
|
|
9
|
+
puts exception.backtrace.join("\n")
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def perform(cart_item,instruction_index,notification_index)
|
|
13
|
+
notification = cart_item.instructions[instruction_index].notifications[notification_index]
|
|
14
|
+
notification.deliver_all
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
class Auth::SendMail < ActionMailer::Base
|
|
2
|
+
default from: "bhargav.r.raut@gmail.com"
|
|
3
|
+
def send_email(opts)
|
|
4
|
+
@options = opts || {}
|
|
5
|
+
raise "no recipient address" unless @options[:to]
|
|
6
|
+
raise "no subject" unless @options[:to]
|
|
7
|
+
mail(to: @options[:to], subject: @options[:subject]) do |format|
|
|
8
|
+
format.html { render @options[:template] || "send" }
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
## okay so for this, we will pass it to otp job only.
|
|
12
|
+
## with some arguments.
|
|
13
|
+
## why not use whatever emailer i was using before ?
|
|
14
|
+
## okay so the next step is to send this whole notification into a delayed job.
|
|
15
|
+
end
|
|
@@ -14,7 +14,7 @@ module Auth::Concerns::Shopping::ProductConcern
|
|
|
14
14
|
|
|
15
15
|
embeds_many :cycles, :class_name => "Auth::Work::Cycle", :as => :product_cycles
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
|
|
18
18
|
INDEX_DEFINITION = {
|
|
19
19
|
index_options: {
|
|
20
20
|
settings: {
|
|
@@ -143,7 +143,9 @@ module Auth::Concerns::Shopping::ProductConcern
|
|
|
143
143
|
|
|
144
144
|
end
|
|
145
145
|
|
|
146
|
-
## minutes
|
|
146
|
+
## adds the relevant cycles to the minutes, and returns the hash that came in.
|
|
147
|
+
## does not save the minutes, after adding the cycles to them.
|
|
148
|
+
##@return[Hash] {epoch => minute object}
|
|
147
149
|
def schedule_cycles(minutes,location_id,conditions = {})
|
|
148
150
|
|
|
149
151
|
products = Auth.configuration.product_class.constantize.all if conditions.blank?
|
|
@@ -172,7 +174,7 @@ module Auth::Concerns::Shopping::ProductConcern
|
|
|
172
174
|
cycle_to_add.cycle_chain = cycle_chain
|
|
173
175
|
if minutes[epoch_at_which_to_add]
|
|
174
176
|
|
|
175
|
-
add_to_previous_rolling_n_minutes(minutes,epoch_at_which_to_add,cycle_to_add)
|
|
177
|
+
#add_to_previous_rolling_n_minutes(minutes,epoch_at_which_to_add,cycle_to_add)
|
|
176
178
|
|
|
177
179
|
|
|
178
180
|
minutes[epoch_at_which_to_add].cycles << cycle_to_add
|
|
@@ -821,17 +821,13 @@ module Auth::Concerns::UserConcern
|
|
|
821
821
|
###
|
|
822
822
|
####################################################################
|
|
823
823
|
def refresh_endpoints
|
|
824
|
-
|
|
825
|
-
puts self.android_token
|
|
824
|
+
|
|
826
825
|
if self.android_token_changed?
|
|
827
826
|
endpoint = Auth::Endpoint.new
|
|
828
827
|
endpoint.android_token = self.android_token
|
|
829
828
|
self.android_endpoint = endpoint.set_android_endpoint
|
|
830
829
|
end
|
|
831
|
-
|
|
830
|
+
|
|
832
831
|
end
|
|
833
832
|
|
|
834
|
-
## after this we have notification dispatch and scheduling logic based on the instructions and cycles.
|
|
835
|
-
## this has to also be finished today.
|
|
836
|
-
|
|
837
833
|
end
|
data/app/models/auth/endpoint.rb
CHANGED
|
@@ -7,15 +7,18 @@ class Auth::Endpoint
|
|
|
7
7
|
field :android_token, type: String
|
|
8
8
|
field :ios_token, type: String
|
|
9
9
|
|
|
10
|
-
before_save :set_android_endpoint
|
|
11
|
-
before_save :set_ios_endpoint
|
|
12
|
-
|
|
13
10
|
def set_android_endpoint
|
|
11
|
+
|
|
14
12
|
return unless self.android_token
|
|
13
|
+
|
|
14
|
+
return if self.android_endpoint
|
|
15
|
+
|
|
15
16
|
if response = $sns_client.create_platform_endpoint(platform_application_arn: ENV["ANDROID_ARN"], token: self.android_token, attributes: {})
|
|
16
17
|
self.android_endpoint = response.endpoint_arn
|
|
18
|
+
|
|
17
19
|
self.android_endpoint
|
|
18
20
|
else
|
|
21
|
+
|
|
19
22
|
nil
|
|
20
23
|
end
|
|
21
24
|
end
|
|
@@ -24,5 +27,25 @@ class Auth::Endpoint
|
|
|
24
27
|
return unless self.ios_token
|
|
25
28
|
end
|
|
26
29
|
|
|
30
|
+
## so i have to do what first ?
|
|
31
|
+
## notification objects.
|
|
32
|
+
## and their editing.
|
|
33
|
+
|
|
34
|
+
## so it comes down to a few simple things
|
|
35
|
+
## 1. the cart_item has a variables hash.
|
|
36
|
+
## 2. notiications are assigned to each instruction.
|
|
37
|
+
## 2a. they will carry an array of outlinks, as well as how the notification is to be sent.
|
|
38
|
+
## 3a. they will check the time in the variables hash before sending the notification
|
|
39
|
+
## 4a. they will rewire themselves if the time is later than what is in the notification itself.
|
|
40
|
+
## 5a. cycles can directly update cart items which they pertain to, chaning these notification variables.
|
|
41
|
+
## 3. when a cart item is created -> notifications are queued.
|
|
42
|
+
## 4. the time for queueing is defined based on the variables seen in that variables hash.
|
|
43
|
+
## but assume that a cart item is queued. and it is a part of several cycles.
|
|
44
|
+
## in that case, the timings can only be got from those cycles
|
|
45
|
+
## so the cart item has to build its variables from the cycles.
|
|
46
|
+
## where is the cycle going to update its images and videos ?
|
|
47
|
+
## to what ?
|
|
48
|
+
## and i need a place to edit the bullets, instructions, and notifications, and variables.
|
|
49
|
+
## and i have 2 days for all this :)
|
|
27
50
|
|
|
28
51
|
end
|
data/app/models/auth/image.rb
CHANGED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
class Auth::Work::Communication
|
|
2
|
+
include Auth::Concerns::ChiefModelConcern
|
|
3
|
+
|
|
4
|
+
## 1. it has been embedded, now let me create the ui to edit the communication, for email fields, and then we proceed to email, for this we will need routes and forms.
|
|
5
|
+
## so i need to see how the communications were made.
|
|
6
|
+
## 2. finish the surveys
|
|
7
|
+
## 3. finish two tradegenie tests
|
|
8
|
+
## 4. finish booking cycle.
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
###################################################################
|
|
12
|
+
##
|
|
13
|
+
##
|
|
14
|
+
## ACCESSORS FOR CYCLE AND PRODUCT IDS.
|
|
15
|
+
##
|
|
16
|
+
##
|
|
17
|
+
###################################################################
|
|
18
|
+
|
|
19
|
+
attr_accessor :cycle_id
|
|
20
|
+
attr_accessor :instruction_id
|
|
21
|
+
|
|
22
|
+
###################################################################
|
|
23
|
+
##
|
|
24
|
+
##
|
|
25
|
+
## RELATIONS.
|
|
26
|
+
##
|
|
27
|
+
##
|
|
28
|
+
###################################################################
|
|
29
|
+
|
|
30
|
+
## now give the view to show this
|
|
31
|
+
embedded_in :cycles, :class_name => "Auth::Work::Cycle", :polymorphic => true
|
|
32
|
+
|
|
33
|
+
## add embedded in products.
|
|
34
|
+
embedded_in :instructions, :class_name => "Auth::Work::Instruction", :polymorphic => true
|
|
35
|
+
|
|
36
|
+
###################################################################
|
|
37
|
+
##
|
|
38
|
+
##
|
|
39
|
+
## EMAIL
|
|
40
|
+
##
|
|
41
|
+
##
|
|
42
|
+
###################################################################
|
|
43
|
+
|
|
44
|
+
field :send_email, type: Boolean
|
|
45
|
+
|
|
46
|
+
field :email_template_path, type: String
|
|
47
|
+
|
|
48
|
+
###################################################################
|
|
49
|
+
##
|
|
50
|
+
##
|
|
51
|
+
## RECIPIENT DETERMINATION.
|
|
52
|
+
##
|
|
53
|
+
##
|
|
54
|
+
###################################################################
|
|
55
|
+
|
|
56
|
+
## this method is called on self.
|
|
57
|
+
## and the self id is passed as an argument.
|
|
58
|
+
## eg : self.send("instruction.cart_item.get_recipients",self.id.to_s)
|
|
59
|
+
field :method_to_determine_recipients, type: String
|
|
60
|
+
|
|
61
|
+
## this is got by calling the above method.
|
|
62
|
+
## this is not a permitted parameter.
|
|
63
|
+
field :recipients, type: Hash
|
|
64
|
+
|
|
65
|
+
###################################################################
|
|
66
|
+
##
|
|
67
|
+
##
|
|
68
|
+
## communication REPEATS
|
|
69
|
+
##
|
|
70
|
+
##
|
|
71
|
+
###################################################################
|
|
72
|
+
|
|
73
|
+
## "daily,weekly,monthly,yearly"
|
|
74
|
+
field :repeat, type: String
|
|
75
|
+
|
|
76
|
+
## how many times to repeat it.
|
|
77
|
+
field :repeat_times, type: Integer
|
|
78
|
+
|
|
79
|
+
## this is called to determine when to send this communication.
|
|
80
|
+
field :method_to_determine_communication_timing, type: String
|
|
81
|
+
|
|
82
|
+
## enqueue_at_time
|
|
83
|
+
## this is not a permitted parameters.
|
|
84
|
+
field :enqueue_at_time, type: Time
|
|
85
|
+
|
|
86
|
+
def set_recipients
|
|
87
|
+
self.recipients = self.send("#{self.method_to_determine_recipients}",self.id.to_s)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def set_enqueue_at_time
|
|
91
|
+
self.enqueue_at_time = self.send("#{self.method_to_determine_communication_timing}",self.id.to_s)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def repeat_options
|
|
95
|
+
[
|
|
96
|
+
["Daily","Daily"],
|
|
97
|
+
["Weekly","Weekly"],
|
|
98
|
+
["Monthly","Monthly"],
|
|
99
|
+
["Yearly","Yearly"],
|
|
100
|
+
["Half-Monthly","Half-Monthly"],
|
|
101
|
+
["Saturday","Saturday"],
|
|
102
|
+
["Sunday","Sunday"],
|
|
103
|
+
["Monday","Monday"],
|
|
104
|
+
["Tuesday","Tuesday"],
|
|
105
|
+
["Wednesday","Wednesday"]
|
|
106
|
+
]
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
end
|
|
@@ -18,8 +18,11 @@ class Auth::Work::Cycle
|
|
|
18
18
|
|
|
19
19
|
embeds_many :templates, :class_name => "Auth::Work::Template"
|
|
20
20
|
|
|
21
|
+
embeds_many :communications, :class_name => "Auth::Work::Communication", :as => :cycle_communications
|
|
22
|
+
|
|
21
23
|
## each cycle will have a limit
|
|
22
24
|
field :capacity, type: Integer, default: 0
|
|
25
|
+
## so this capacity is what has to be updated.
|
|
23
26
|
|
|
24
27
|
## there will have to be another field, saying workers who can do it, and entities who can do it.
|
|
25
28
|
field :workers_available, type: Array
|
|
@@ -62,6 +65,10 @@ class Auth::Work::Cycle
|
|
|
62
65
|
|
|
63
66
|
field :cycle_code, type: String
|
|
64
67
|
|
|
68
|
+
## every cycle should have a type.
|
|
69
|
+
## we search based on this type.
|
|
70
|
+
field :cycle_type, type: String
|
|
71
|
+
|
|
65
72
|
## the ids of the related cycles.
|
|
66
73
|
field :cycle_chain, type: Array, default: []
|
|
67
74
|
|
|
@@ -209,20 +216,7 @@ class Auth::Work::Cycle
|
|
|
209
216
|
after_book
|
|
210
217
|
end
|
|
211
218
|
|
|
212
|
-
|
|
213
|
-
## so the search criteria is
|
|
214
|
-
## where entity_ids == [n1,n2,n3], or worker_ids= [y1,y2,y3]
|
|
215
|
-
## range is such that
|
|
216
|
-
## if (end time or start time) of any cycle is (from this minute -> time of end of this cycle)
|
|
217
|
-
## or if start time <= this minute, and end time is >= minute of end of this cycle.
|
|
218
|
-
## for any of those cycles -> if priority is applicable, then block, and block all related chains.
|
|
219
|
-
## how to block the related chains ?
|
|
220
|
-
## a cycle has to store all its related chain ids, and also its 30 minute references.
|
|
221
|
-
## so that's it.
|
|
222
|
-
## this is something to execute tomorrow.
|
|
223
|
-
|
|
224
|
-
## so plan for today
|
|
225
|
-
##
|
|
219
|
+
|
|
226
220
|
|
|
227
221
|
end
|
|
228
222
|
|