@@ -3,6 +3,7 @@ defmodule Backend.RoomChannel do
3
3
alias Backend.User
4
4
alias Backend.Plot
5
5
alias Backend.Repo
6
+ alias Ecto.Date
6
7
7
8
import Ecto.Query
8
9
@@ -24,36 +25,21 @@ defmodule Backend.RoomChannel do
24
25
{ :error , % { reason: "unauthorized" } }
25
26
end
26
27
27
- #Response struct to send back to client
28
- #token is the auth required to pull down data
29
- defmodule Response do
30
- defstruct response_text: "" , token: "" , action: "" , fullname: ""
31
- end
32
-
28
+ #°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
29
+ #°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
30
+ #°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
33
31
34
32
def handle_in ( "save_data" , % { "body" => params } , socket ) do
35
33
#get user data
36
- IO . inspect params
34
+ # IO.inspect params
37
35
38
36
% { "data" => data , "user" => user } = params
39
37
40
- % { "source" => source , "frequency" => frequency , "y" => y , "ticker" => ticker , "startDate" => startDate , "endDate" => endDate , "newData" => newData } = data
41
- % { "username" => username , "fullname" => fullname , "token" => token } = user
42
-
43
- #check token against user and socket
44
- u = Repo . get_by ( Backend.User , username: username )
45
-
46
38
cond do
47
- Phoenix.Token . verify ( socket , "user" , token ) ->
48
- { :ok , sd } = Ecto.Date . cast ( startDate )
49
- { :ok , ed } = Ecto.Date . cast ( endDate )
50
-
51
- { f , _ } = Integer . parse ( frequency )
52
-
53
- #save report
54
- p = % Plot { source: source , ticker: ticker , frequency: f , startDate: sd , endDate: ed , y: y , deleted: false , user_id: u . id }
55
-
56
- Repo . insert p
39
+ #check that id is owned by user
40
+ Phoenix.Token . verify ( socket , "user" , user [ "token" ] ) ->
41
+ #save here not insert
42
+ #p = save_plot user data
57
43
#return ok
58
44
r = "ok"
59
45
true ->
@@ -70,71 +56,114 @@ defmodule Backend.RoomChannel do
70
56
{ :noreply , socket }
71
57
end
72
58
73
-
74
59
def handle_out ( "save_data" , payload , socket ) do
75
60
push socket , "save_data" , payload
76
61
{ :noreply , socket }
77
62
end
78
63
64
+
65
+ def save_plot ( user , data ) do
66
+ % { "source" => source , "frequency" => frequency , "y" => y , "ticker" => ticker , "startDate" => startDate , "endDate" => endDate , "newData" => newData } = data
67
+ % { "username" => username , "fullname" => fullname , "token" => token } = user
68
+
69
+ u = Repo . get_by ( Backend.User , username: username )
70
+
71
+ { :ok , sd } = Ecto.Date . cast ( startDate )
72
+ { :ok , ed } = Ecto.Date . cast ( endDate )
73
+
74
+ { f , _ } = Integer . parse ( frequency )
75
+
76
+ #save report
77
+ p = % Plot { source: source , ticker: ticker , frequency: f , startDate: sd , endDate: ed , y: y , deleted: false , user_id: u . id }
78
+
79
+ r = Repo . insert p
80
+
81
+ #return plot id
82
+ r [ "id" ]
83
+ end
84
+
85
+ #insert plot is always default
86
+ def insert_new_plot ( user ) do
87
+ { :ok , sd } = Ecto.Date . cast ( "1990-01-02" )
88
+ today = Date . utc ( )
89
+ Repo . insert ( user |> defaultPlot )
90
+ end
91
+
92
+ def defaultPlot ( user ) do
93
+ { :ok , sd } = Ecto.Date . cast ( "1990-01-02" )
94
+ today = Date . utc ( )
95
+ % Plot { source: "YAHOO" , ticker: "INDEX_VIX" , frequency: 21 , startDate: sd , endDate: today , y: false , deleted: false , user_id: user . id }
96
+ end
97
+
98
+ def defaultUser ( ) do
99
+ % User { fullname: "" , username: "" , password: "" , id: - 1 }
100
+ end
101
+
102
+ #°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
103
+ #°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
104
+
105
+ #Response struct to send back to client
106
+ #token is the auth required to pull down data
107
+ defmodule Response do
108
+ defstruct response_text: "" , token: "" , action: "" , fullname: "" , plots: [ ]
109
+ end
110
+
79
111
#all incoming connections go here
80
- #
81
112
def handle_in ( "new_msg" , % { "body" => params } , socket ) do
82
113
#break into action and payload components
83
114
% { "action" => action , "data" => data } = params
84
-
85
- #I have been doing too much Elm recently...
115
+ #I have been doing too much Elm...
86
116
case action do
87
117
"login" ->
88
118
% { "username" => username , "password" => password } = data
89
-
90
- #check password against user
91
- % { response_text: response , token: token , fullname: fullname } = login_by_username_and_pass ( socket , username , password )
92
- response = % Response { response_text: response , token: token , action: action , fullname: fullname }
119
+ response = login_by_username_and_pass ( socket , username , password )
93
120
"register" ->
94
- #register user
95
121
% { "fullname" => fullname , "username" => username , "password" => password } = data
96
-
97
122
#changesets are fine-grained validation objects based on what's specified in the User model
98
123
changeset = User . registration_changeset ( % User { } , data )
99
-
100
124
#*reasons for problem
101
125
response =
102
126
case Repo . insert ( changeset ) do
103
127
{ :ok , user } ->
104
- #regd means logged in here
105
- #no user data to send, fresh account
106
- % { response_text: response , token: token } = login_by_username_and_pass ( socket , username , password )
107
- % Response { response_text: response , token: token , action: action , fullname: fullname }
128
+ #insert new plot, login
129
+ { :ok , p } = insert_new_plot ( user )
130
+ login_by_username_and_pass ( socket , username , password )
108
131
{ :error , changeset } ->
109
132
#*-name already taken
110
133
#*-inputs blank or too small --implement client side check
111
- % Response { response_text: "Username already taken" , token: " ", action: action , fullname: fullname }
134
+ % Response { response_text: "Try another username " , action: action , fullname: fullname }
112
135
end
136
+ #'null' reponse
137
+ true ->
138
+ response = % Response { }
113
139
end
114
-
115
140
#response back down socket
116
141
#use broadcast! for 'room-wide' messages
117
142
push socket , "new_msg" , % { body: response }
118
-
119
143
{ :noreply , socket }
120
144
end
121
145
122
-
123
- #login logic
124
- def login_by_username_and_pass ( socket , username , given_pass ) do
146
+ #handles login auth
147
+ def login_by_username_and_pass ( socket , username , password ) do
125
148
user = Repo . get_by ( Backend.User , username: username )
126
149
cond do
127
150
#does user match the password and hashed pw?
128
- user && checkpw ( given_pass , user . password_hash ) ->
151
+ user && checkpw ( password , user . password_hash ) ->
152
+ plots = Plot
153
+ |> where ( [ a ] , a . user_id == ^ user . id )
154
+ |> Backend.Repo . all
155
+ #convert back into json-isable format
156
+ |> Enum . map (
157
+ fn ( p ) ->
158
+ % { source: p . source , ticker: p . ticker , frequency: p . frequency , startDate: p . startDate , endDate: p . endDate , y: p . y , deleted: p . deleted , user_id: p . user_id , id: p . id }
159
+ end )
160
+
129
161
token = Phoenix.Token . sign ( socket , "user" , user . id )
130
- % { response_text: "OK" , token: token , fullname: user . fullname }
131
- #no need to be so granular
132
- user ->
133
- % { response_text: "Password Not OK" , token: "" , fullname: "" }
162
+ #ok is magic word which brings user to login
163
+ % Response { response_text: "OK" , token: token , action: "login" , fullname: user . fullname , plots: plots }
134
164
true ->
135
- #?? take up time between tries?
136
165
dummy_checkpw ( )
137
- % { response_text: "User Not Found" , token: "" , fullname : "" }
166
+ % Response { response_text: "Wrong password user combination" , action : "login " }
138
167
end
139
168
end
140
169
0 commit comments