n4u_cx.erl 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. -module(n4u_cx).
  2. -include_lib("n4u/include/n4u.hrl").
  3. -export([context/2, context/3, add_action/1, cookies/0, add_cookie/4,
  4. fold/3, init_context/1 ]).
  5. % N4U Process Context
  6. context(Cx, Proto) -> lists:keyfind(Proto, 1, Cx#cx.state).
  7. context(Cx, Proto, UserCx) ->
  8. NewCx = Cx#cx{state=setkey(Proto, 1, Cx#cx.state, {Proto, UserCx})},
  9. erlang:put(context, NewCx),
  10. NewCx.
  11. setkey(Name, Pos, List, New) ->
  12. case lists:keyfind(Name, Pos, List) of
  13. false -> [New|List];
  14. _Element -> lists:keyreplace(Name, Pos, List, New)
  15. end.
  16. add_action(Action) ->
  17. Actions = case erlang:get(actions) of
  18. undefined -> [];
  19. E -> E
  20. end,
  21. erlang:put(actions, Actions ++ [Action]).
  22. %clear_actions() -> erlang:put(actions, []).
  23. cookies() ->
  24. C = erlang:get(cookies),
  25. case erlang:is_list(C) of
  26. true -> C;
  27. _ -> []
  28. end.
  29. add_cookie(Name, Value, Path, TTL) ->
  30. C = cookies(),
  31. Cookies = case lists:keyfind(Name, 1, C) of
  32. {Name, _, _, _} ->
  33. lists:keyreplace(Name, 1, C, {Name, Value, Path, TTL});
  34. false ->
  35. [{Name, Value, Path, TTL}|C]
  36. end,
  37. erlang:put(cookies, Cookies).
  38. fold(Fun, Handlers, Ctx) ->
  39. lists:foldl(
  40. fun({_, Module}, Ctx1) ->
  41. {ok, _, NewCtx} = Module:Fun([], Ctx1),
  42. NewCtx
  43. end, Ctx, Handlers).
  44. init_context(Req) ->
  45. #cx{actions=[], module=index, path=[], req=Req, params=[],
  46. handlers= [ {'query', application:get_env(n4u, 'query', n4u_query)},
  47. {session, application:get_env(n4u, session, n4u_session)},
  48. {route, application:get_env(n4u, route, n2o_dynroute)} ]}.