Skip to content

Commit dfe9cc5

Browse files
committed
save 2 db
1 parent 9994a43 commit dfe9cc5

File tree

5 files changed

+97
-62
lines changed

5 files changed

+97
-62
lines changed

priv/repo/migrations/20160322075758_change_name_field_to_fullname_field.exs

-10
This file was deleted.

web/channels/room_channel.ex

+80-51
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ defmodule Backend.RoomChannel do
33
alias Backend.User
44
alias Backend.Plot
55
alias Backend.Repo
6+
alias Ecto.Date
67

78
import Ecto.Query
89

@@ -24,36 +25,21 @@ defmodule Backend.RoomChannel do
2425
{:error, %{reason: "unauthorized"}}
2526
end
2627

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+
#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
3331

3432
def handle_in("save_data", %{"body" => params}, socket) do
3533
#get user data
36-
IO.inspect params
34+
#IO.inspect params
3735

3836
%{"data" => data, "user" => user} = params
3937

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-
4638
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
5743
#return ok
5844
r = "ok"
5945
true ->
@@ -70,71 +56,114 @@ defmodule Backend.RoomChannel do
7056
{:noreply, socket}
7157
end
7258

73-
7459
def handle_out("save_data", payload, socket) do
7560
push socket, "save_data", payload
7661
{:noreply, socket}
7762
end
7863

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+
79111
#all incoming connections go here
80-
#
81112
def handle_in("new_msg", %{"body" => params}, socket) do
82113
#break into action and payload components
83114
%{"action" => action, "data" => data} = params
84-
85-
#I have been doing too much Elm recently...
115+
#I have been doing too much Elm...
86116
case action do
87117
"login" ->
88118
%{"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 )
93120
"register" ->
94-
#register user
95121
%{"fullname" => fullname, "username" => username, "password" => password} = data
96-
97122
#changesets are fine-grained validation objects based on what's specified in the User model
98123
changeset = User.registration_changeset(%User{},data)
99-
100124
#*reasons for problem
101125
response =
102126
case Repo.insert(changeset) do
103127
{: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)
108131
{:error, changeset } ->
109132
#*-name already taken
110133
#*-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}
112135
end
136+
#'null' reponse
137+
true ->
138+
response = %Response{}
113139
end
114-
115140
#response back down socket
116141
#use broadcast! for 'room-wide' messages
117142
push socket, "new_msg", %{body: response}
118-
119143
{:noreply, socket}
120144
end
121145

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
125148
user = Repo.get_by(Backend.User, username: username)
126149
cond do
127150
#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+
129161
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}
134164
true ->
135-
#?? take up time between tries?
136165
dummy_checkpw()
137-
%{response_text: "User Not Found", token: "", fullname: ""}
166+
%Response{response_text: "Wrong password user combination", action: "login"}
138167
end
139168
end
140169

web/elm/Main.elm

+4
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ port loginRequest : Signal LoginForm.LoginRequest
3232
port loginRequest = loginRequestMailBox.signal
3333

3434
--incoming login responses
35+
--now with data also
36+
--jump to analysis if OK
37+
--load config after jumping
38+
--load config means calling init
3539
port loginResponse : Signal LoginForm.ResponseMessage
3640

3741
incomingLoginActions : Signal (Router.Action)

web/elm/Router.elm

+6
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ defaultUser = User "" "" ""
4444
init : (Model, Effects Action)
4545
init =
4646
let
47+
--add inputs so that it can be loaded from db
48+
--initially static defaultUser
49+
--later call init using plot config from db
50+
--called when analysis.response comes thru
51+
--works like a reset
4752
(analysis, analysisFx) = AnalysisForm.init
4853
(login, loginFx) = LoginForm.init "" ""
4954
(register, registerFx) = RegisterForm.init "" "" ""
@@ -96,6 +101,7 @@ update action model =
96101
AnalysisForm.UpdateTicker i ->
97102
( model', Effects.map Analysis fx )
98103
_ ->
104+
--
99105
( model', Effects.batch [sd, Effects.map Analysis fx] )
100106
Register input ->
101107
let

web/static/js/socket.js

+7-1
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,15 @@ channel.on("save_data",
2323

2424
channel.on("new_msg",
2525
payload => {
26-
const {token: token, response_text: response_text, action: action, fullname: fullname} = payload.body;
26+
const {token: token, response_text: response_text, action: action, fullname: fullname, plots: plots} = payload.body;
2727
const message = {token: token, response: response_text, fullname: fullname};
2828

29+
console.log("message");
30+
console.log(message);
31+
32+
console.log('plots');
33+
console.log(plots);
34+
2935
action === "login" ?
3036
app.ports.loginResponse.send(message)
3137
: (action === "register" ?

0 commit comments

Comments
 (0)