ublog

Знайомство з erlang: подружимо n2o та cowboy rest

programming [41]erlang [39]n2o [20]

Вітаю!

маємо задачу подружити n2o та cowboy rest -
точніше - отримати сесії n2o в cowboy rest page module

розглянемо на прикладі коду цього блогу -
у нас є два роутери - роутер n2o https://github.com/221V/ublog/blob/c998dd07ff5c1153de8fe3b5ec064adb34cf8fdb/apps/ublog/src/routes.erl
та роутер cowboy https://github.com/221V/ublog/blob/c998dd07ff5c1153de8fe3b5ec064adb34cf8fdb/apps/ublog/src/ublog.erl

як ви могли догадатись, на сторінках першого - з коробки працюють сесії,
на сторінках другого- ні

спробуємо отримати сесію користувача в cowboy rest page module
по-замовчуванню кука сесії в n2o має імя site-sid, вона нам і потрібна

крім того, сесії в n2o зберігаються в ets таблиці та дозволяють зберігати key-value структури
при логіні в n2o ми записує в сесію значення uid користувача під ключем uid
https://github.com/221V/ublog/blob/c998dd07ff5c1153de8fe3b5ec064adb34cf8fdb/apps/ublog/src/login.erl#L35

це значення ми зараз і дістанемо
напишемо функцію, котра дістає з сесії значення по ключу, за наявності сесії, звязаної з кукою

get_session_value(Key,Req) ->
  SessionCookie = n2o_cowboy:cookie(<<"site-sid">>, Req),
  ?MODULE:get_session_value2(n2o_session:lookup_ets({SessionCookie, Key})).

%helper
get_session_value2({_, _, _, _, A}) -> A;
get_session_value2(_) -> undefined.


ця функція в коді цього блогу -
https://github.com/221V/ublog/blob/c998dd07ff5c1153de8fe3b5ec064adb34cf8fdb/apps/ublog/src/hm.erl#L138

виклик цієї функції в коді цього блогу -
https://github.com/221V/ublog/blob/c998dd07ff5c1153de8fe3b5ec064adb34cf8fdb/apps/ublog/src/main_rest.erl#L64

результати роботи цієї функції -
hm:get_session_value(<<"auth">>,Req), % new|undefined % logged|not logged
hm:get_session_value(<<"user">>,Req), % <<"binary">>|undefined
hm:get_session_value(uid,Req), % integer|<<"binary">>|undefined % integer or binary if we put there integer or binary


пояснення -
виклик з ключем <<"auth">> - ми перевіряємо чи існує сесія
виклик з ключем <<"user">> - отримати імя користувача сесії
виклик з ключем uid - отримати збережене значення по заданому нами раніше ключу uid

оце й все :)