yariv / twoorl

The source code repository for twoorl.com

This URL has Read+Write access

twoorl / src / twoorl_app_controller.erl
100644 121 lines (110 sloc) 3.082 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
%% This file is part of Twoorl.
%%
%% Twoorl is free software: you can redistribute it and/or modify
%% it under the terms of the GNU General Public License as published by
%% the Free Software Foundation, either version 3 of the License, or
%% (at your option) any later version.
%%
%% Twoorl is distributed in the hope that it will be useful,
%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
%% GNU General Public License for more details.
%%
%% You should have received a copy of the GNU General Public License
%% along with Twoorl. If not, see <http://www.gnu.org/licenses/>.
%%
%% Copyright Yariv Sadan, 2008
%%
%% @author Yariv Sadan <yarivsblog@gmail.com> [http://yarivsblog.com]
%% @copyright Yariv Sadan, 2008
 
-module(twoorl_app_controller).
-export([hook/1]).
-include("twoorl.hrl").
 
hook(A) ->
    A1 = normalize_appmoddata(A),
    case erlyweb:get_initial_ewc({ewc, A1}) of
{page, "/"} -> start(A1);
{page, "/static" ++ _} = Ewc -> Ewc;
{page, "/favicon.ico"} -> {page, "/static/favicon.ico"};
{page, [$/ | Username] = Path} ->
A2 = yaws_arg:appmoddata(A1, "/users/" ++ Username),
A3 = yaws_arg:add_to_opaque(A2, {paging_path, Path}),
start(A3);
 
%% redirect user urls from "/users/[Username]" to "/[Username]"
{ewc, users_controller, users_view, catch_all,
[_, [Username]]} ->
{response, [{redirect_local, {any_path, [$/|Username]}, 301}]};
_Ewc ->
start(A1)
    end.
 
start(A) ->
    {A2, LoggedIn} = auth(A),
    Appmod = yaws_arg:appmoddata(A2),
    case Appmod of
"/api" ++ _ ->
{ewc, A2};
"/feeds" ++ _ ->
{ewc, A2};
"/" when LoggedIn == true ->
{ewr, home};
_ ->
Appmod1 = case Appmod of
"/" ->
"/main";
_ ->
Appmod
end,
A3 = yaws_arg:appmoddata(A2, Appmod1),
{phased, {ewc, A3},
fun(_Ewc, Data, PhasedVars) ->
{ewc, html_container,
[A3,
{ewc, layout, [A3, {data, Data}]},
PhasedVars]}
end}
    end.
 
%% Populate the arg's opaque field with {session, Session} if the
%% request's "key" cookie value could be found in mnesia.
auth(A) ->
    case erlyweb_util:get_cookie("key", A) of
undefined ->
{A, false};
Val ->
Key = list_to_binary(Val),
case lookup(Key) of
undefined ->
{A, false};
Session ->
{yaws_arg:add_all_to_opaque(
A,
[{key, Key}, {session, Session}]), true}
end
    end.
 
lookup(Key) ->
    case mnesia:dirty_read(session, Key) of
[] ->
case usr:find_first({session_key,'=',Key}) of
undefined ->
undefined;
Usr ->
Session = #session{key=Key, value=Usr},
mnesia:dirty_write(Session),
Session
end;
[Session] ->
Session;
Other ->
exit({unexpected_result, Other})
    end.
 
%% to avoid annoying Yaws inconsistencies
normalize_appmoddata(A) ->
    Val1 =
case yaws_arg:appmoddata(A) of
[] ->
"/";
Val = [$/ | _] ->
Val;
Val ->
[$/ | Val]
end,
    yaws_arg:appmoddata(A, Val1).