Using lists instead of atoms for things being turned into JSON.
This commit is contained in:
		@@ -32,7 +32,7 @@ out(YArg) ->
 | 
				
			|||||||
% ================================== %
 | 
					% ================================== %
 | 
				
			||||||
 | 
					
 | 
				
			||||||
%% Entry point to the TimeStamper API dispatch system
 | 
					%% Entry point to the TimeStamper API dispatch system
 | 
				
			||||||
dispatch_request(YArg, _Session, []) -> make_json_404(YArg, [{see_docs, "/ts_api_doc"}]);
 | 
					dispatch_request(YArg, _Session, []) -> make_json_404(YArg, [{"see_docs", "/ts_api_doc"}]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dispatch_request(YArg, Session, [H|T]) ->
 | 
					dispatch_request(YArg, Session, [H|T]) ->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -41,13 +41,13 @@ dispatch_request(YArg, Session, [H|T]) ->
 | 
				
			|||||||
        {_, "logout"} -> do_logout(YArg);
 | 
					        {_, "logout"} -> do_logout(YArg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        {not_logged_in, _} -> make_json_401(YArg);
 | 
					        {not_logged_in, _} -> make_json_401(YArg);
 | 
				
			||||||
        {session_expired, _} -> make_json_401(YArg, [{error, "session expired"}]);
 | 
					        {session_expired, _} -> make_json_401(YArg, [{"error", "session expired"}]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        {_S, "app"}       -> dispatch_app(YArg, Session, T);
 | 
					        {_S, "app"}       -> dispatch_app(YArg, Session, T);
 | 
				
			||||||
        {_S, "users"}     -> dispatch_user(YArg, Session, T);
 | 
					        {_S, "users"}     -> dispatch_user(YArg, Session, T);
 | 
				
			||||||
        {_S, "timelines"} -> dispatch_timeline(YArg, Session, T);
 | 
					        {_S, "timelines"} -> dispatch_timeline(YArg, Session, T);
 | 
				
			||||||
        {_S, "entries"}   -> dispatch_entry(YArg, Session, T);
 | 
					        {_S, "entries"}   -> dispatch_entry(YArg, Session, T);
 | 
				
			||||||
        {_S, _Other}    -> make_json_404(YArg, [{see_docs, "/ts_api_doc/"}])
 | 
					        {_S, _Other}    -> make_json_404(YArg, [{"see_docs", "/ts_api_doc/"}])
 | 
				
			||||||
    end.
 | 
					    end.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
% -------- Dispatch for /app -------- %
 | 
					% -------- Dispatch for /app -------- %
 | 
				
			||||||
@@ -68,9 +68,9 @@ dispatch_app(YArg, Session, Params) ->
 | 
				
			|||||||
            end;
 | 
					            end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        {_BadMethod, ["user_summary", _UsernameStr]} ->
 | 
					        {_BadMethod, ["user_summary", _UsernameStr]} ->
 | 
				
			||||||
            make_json_405(YArg, [{see_docs, "/ts_api_docs/app.html"}]);
 | 
					            make_json_405(YArg, [{"see_docs", "/ts_api_docs/app.html"}]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        _Other -> make_json_404(YArg, [{see_docs, "/ts_api_docs/app.html"}])
 | 
					        _Other -> make_json_404(YArg, [{"see_docs", "/ts_api_docs/app.html"}])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    end.
 | 
					    end.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -90,21 +90,21 @@ dispatch_user(YArg, Session, [Username]) ->
 | 
				
			|||||||
        {'PUT', Username}     -> put_user(YArg, Username);
 | 
					        {'PUT', Username}     -> put_user(YArg, Username);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        {_BadMethod, Username} ->
 | 
					        {_BadMethod, Username} ->
 | 
				
			||||||
            make_json_405(YArg, [{see_docs, "/ts_api_doc/users.html"}]);
 | 
					            make_json_405(YArg, [{"see_docs", "/ts_api_doc/users.html"}]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        _Other -> make_json_401(YArg, [{see_docs, "/ts_api_doc/users.html"}])
 | 
					        _Other -> make_json_401(YArg, [{"see_docs", "/ts_api_doc/users.html"}])
 | 
				
			||||||
    end.
 | 
					    end.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
% -------- Dispatch for /timeline -------- %
 | 
					% -------- Dispatch for /timeline -------- %
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dispatch_timeline(YArg, _Session, []) ->
 | 
					dispatch_timeline(YArg, _Session, []) ->
 | 
				
			||||||
    make_json_404(YArg, [{see_docs, "/ts_api_doc/timelines.html"}]);
 | 
					    make_json_404(YArg, [{"see_docs", "/ts_api_doc/timelines.html"}]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dispatch_timeline(YArg, Session, [Username|_T] = PathElements) ->
 | 
					dispatch_timeline(YArg, Session, [Username|_T] = PathElements) ->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case Session#ts_api_session.username of
 | 
					    case Session#ts_api_session.username of
 | 
				
			||||||
        Username -> dispatch_timeline(YArg, PathElements);
 | 
					        Username -> dispatch_timeline(YArg, PathElements);
 | 
				
			||||||
        _Other   -> make_json_404(YArg, [{see_docs, "/ts_api_doc/users.html"}])
 | 
					        _Other   -> make_json_404(YArg, [{"see_docs", "/ts_api_doc/users.html"}])
 | 
				
			||||||
    end.
 | 
					    end.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
% just username, list timelines
 | 
					% just username, list timelines
 | 
				
			||||||
@@ -114,7 +114,7 @@ dispatch_timeline(YArg, [Username]) ->
 | 
				
			|||||||
    case HTTPMethod of
 | 
					    case HTTPMethod of
 | 
				
			||||||
        'OPTIONS' -> make_CORS_options(YArg, "GET");
 | 
					        'OPTIONS' -> make_CORS_options(YArg, "GET");
 | 
				
			||||||
        'GET'     -> list_timelines(YArg, Username);
 | 
					        'GET'     -> list_timelines(YArg, Username);
 | 
				
			||||||
        _Other    -> make_json_405(YArg, [{see_docs, "/ts_api_doc/timelines.html"}])
 | 
					        _Other    -> make_json_405(YArg, [{"see_docs", "/ts_api_doc/timelines.html"}])
 | 
				
			||||||
    end;
 | 
					    end;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
dispatch_timeline(YArg, [Username, TimelineId]) ->
 | 
					dispatch_timeline(YArg, [Username, TimelineId]) ->
 | 
				
			||||||
@@ -125,22 +125,22 @@ dispatch_timeline(YArg, [Username, TimelineId]) ->
 | 
				
			|||||||
        'GET'    -> get_timeline(YArg, Username, TimelineId);
 | 
					        'GET'    -> get_timeline(YArg, Username, TimelineId);
 | 
				
			||||||
        'PUT'    -> put_timeline(YArg, Username, TimelineId);
 | 
					        'PUT'    -> put_timeline(YArg, Username, TimelineId);
 | 
				
			||||||
        'DELETE' -> delete_timeline(YArg, Username, TimelineId);
 | 
					        'DELETE' -> delete_timeline(YArg, Username, TimelineId);
 | 
				
			||||||
        _Other   -> make_json_405(YArg, [{see_docs, "/ts_api_doc/timelines.html"}])
 | 
					        _Other   -> make_json_405(YArg, [{"see_docs", "/ts_api_doc/timelines.html"}])
 | 
				
			||||||
    end;
 | 
					    end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dispatch_timeline(YArg, _Other) ->
 | 
					dispatch_timeline(YArg, _Other) ->
 | 
				
			||||||
    make_json_404(YArg, [{see_docs, "/ts_api_doc/timelines.html"}]).
 | 
					    make_json_404(YArg, [{"see_docs", "/ts_api_doc/timelines.html"}]).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
% -------- Dispatch for /entry -------- %
 | 
					% -------- Dispatch for /entry -------- %
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dispatch_entry(YArg, _Session, []) ->
 | 
					dispatch_entry(YArg, _Session, []) ->
 | 
				
			||||||
    make_json_404(YArg, [{see_docs, "/ts_aip_doc/entries.html"}]);
 | 
					    make_json_404(YArg, [{"see_docs", "/ts_aip_doc/entries.html"}]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dispatch_entry(YArg, Session, [Username|_T] = PathElements) ->
 | 
					dispatch_entry(YArg, Session, [Username|_T] = PathElements) ->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case Session#ts_api_session.username of
 | 
					    case Session#ts_api_session.username of
 | 
				
			||||||
        Username -> dispatch_entry(YArg, PathElements);
 | 
					        Username -> dispatch_entry(YArg, PathElements);
 | 
				
			||||||
        _Other   -> make_json_404(YArg, [{see_docs, "/ts_api_doc/entries.html"}])
 | 
					        _Other   -> make_json_404(YArg, [{"see_docs", "/ts_api_doc/entries.html"}])
 | 
				
			||||||
    end.
 | 
					    end.
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
dispatch_entry(YArg, [Username, TimelineId]) ->
 | 
					dispatch_entry(YArg, [Username, TimelineId]) ->
 | 
				
			||||||
@@ -150,7 +150,7 @@ dispatch_entry(YArg, [Username, TimelineId]) ->
 | 
				
			|||||||
        'OPTIONS' -> make_CORS_options(YArg, "GET, POST");
 | 
					        'OPTIONS' -> make_CORS_options(YArg, "GET, POST");
 | 
				
			||||||
        'GET'     -> list_entries(YArg, Username, TimelineId);
 | 
					        'GET'     -> list_entries(YArg, Username, TimelineId);
 | 
				
			||||||
        'POST'    -> post_entry(YArg, Username, TimelineId);
 | 
					        'POST'    -> post_entry(YArg, Username, TimelineId);
 | 
				
			||||||
        _Other    -> make_json_405(YArg, [{see_docs, "/ts_api_doc/entries.html"}])
 | 
					        _Other    -> make_json_405(YArg, [{"see_docs", "/ts_api_doc/entries.html"}])
 | 
				
			||||||
    end;
 | 
					    end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dispatch_entry(YArg, [Username, TimelineId, UrlEntryId]) ->
 | 
					dispatch_entry(YArg, [Username, TimelineId, UrlEntryId]) ->
 | 
				
			||||||
@@ -162,11 +162,11 @@ dispatch_entry(YArg, [Username, TimelineId, UrlEntryId]) ->
 | 
				
			|||||||
        'GET'    -> get_entry(YArg, Username, TimelineId, EntryId);
 | 
					        'GET'    -> get_entry(YArg, Username, TimelineId, EntryId);
 | 
				
			||||||
        'PUT'    -> put_entry(YArg, Username, TimelineId, EntryId);
 | 
					        'PUT'    -> put_entry(YArg, Username, TimelineId, EntryId);
 | 
				
			||||||
        'DELETE' -> delete_entry(YArg, Username, TimelineId, EntryId);
 | 
					        'DELETE' -> delete_entry(YArg, Username, TimelineId, EntryId);
 | 
				
			||||||
        _Other   -> make_json_405(YArg, [{see_docs, "/ts_api_doc/entries.html"}])
 | 
					        _Other   -> make_json_405(YArg, [{"see_docs", "/ts_api_doc/entries.html"}])
 | 
				
			||||||
    end;
 | 
					    end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dispatch_entry(YArg, _Other) ->
 | 
					dispatch_entry(YArg, _Other) ->
 | 
				
			||||||
    make_json_404(YArg, [{see_docs, "/ts_api_doc/entries.html"}]).
 | 
					    make_json_404(YArg, [{"see_docs", "/ts_api_doc/entries.html"}]).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
% ============================== %
 | 
					% ============================== %
 | 
				
			||||||
% ======== IMPLEMENTATION ====== %
 | 
					% ======== IMPLEMENTATION ====== %
 | 
				
			||||||
@@ -195,14 +195,14 @@ do_login(YArg) ->
 | 
				
			|||||||
                     {header, ["Access-Control-Allow-Origin: ", get_origin_header(YArg)]},
 | 
					                     {header, ["Access-Control-Allow-Origin: ", get_origin_header(YArg)]},
 | 
				
			||||||
                     {header, ["Access-Control-Allow-Credentials: ", "true"]},
 | 
					                     {header, ["Access-Control-Allow-Credentials: ", "true"]},
 | 
				
			||||||
                     {content, "application/json",
 | 
					                     {content, "application/json",
 | 
				
			||||||
                        json:encode({struct, [{status, "ok"}]})}];
 | 
					                        json:encode({struct, [{"status", "ok"}]})}];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                % they are not good
 | 
					                % they are not good
 | 
				
			||||||
                false -> make_json_401(YArg, [{error,
 | 
					                false -> make_json_401(YArg, [{"error",
 | 
				
			||||||
                    "bad username/password combination"}])
 | 
					                    "bad username/password combination"}])
 | 
				
			||||||
            end;
 | 
					            end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        _Other -> make_json_400(YArg, [{see_docs, "/ts_api_doc/login.html"}])
 | 
					        _Other -> make_json_400(YArg, [{"see_docs", "/ts_api_doc/login.html"}])
 | 
				
			||||||
    end.
 | 
					    end.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
do_logout(YArg) ->
 | 
					do_logout(YArg) ->
 | 
				
			||||||
@@ -310,7 +310,7 @@ get_timeline(YArg, Username, TimelineId) ->
 | 
				
			|||||||
    % look for timeline
 | 
					    % look for timeline
 | 
				
			||||||
    case ts_timeline:lookup(Username, TimelineId) of
 | 
					    case ts_timeline:lookup(Username, TimelineId) of
 | 
				
			||||||
        % no such timeline, return 404
 | 
					        % no such timeline, return 404
 | 
				
			||||||
        no_record -> make_json_404(YArg, [{error, "no such timeline"}]);
 | 
					        no_record -> make_json_404(YArg, [{"error", "no such timeline"}]);
 | 
				
			||||||
        % return the timeline data
 | 
					        % return the timeline data
 | 
				
			||||||
        Timeline -> make_json_200_record(YArg, Timeline)
 | 
					        Timeline -> make_json_200_record(YArg, Timeline)
 | 
				
			||||||
    end.
 | 
					    end.
 | 
				
			||||||
@@ -347,8 +347,8 @@ list_entries(YArg, Username, TimelineId) ->
 | 
				
			|||||||
          lists:keyfind("byDate", 1, QueryData)} of
 | 
					          lists:keyfind("byDate", 1, QueryData)} of
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        {no_record, _ByDateField} -> make_json_404(
 | 
					        {no_record, _ByDateField} -> make_json_404(
 | 
				
			||||||
            [{error, "no such timeline"},
 | 
					            [{"error", "no such timeline"},
 | 
				
			||||||
             {see_docs, "/ts_api_doc/entries.html#LIST"}]);
 | 
					             {"see_docs", "/ts_api_doc/entries.html#LIST"}]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        % listing by date range
 | 
					        % listing by date range
 | 
				
			||||||
        {Timeline, {"byDate", "true"}} -> 
 | 
					        {Timeline, {"byDate", "true"}} -> 
 | 
				
			||||||
@@ -425,7 +425,7 @@ list_entries(YArg, Username, TimelineId) ->
 | 
				
			|||||||
get_entry(YArg, Username, TimelineId, EntryId) ->
 | 
					get_entry(YArg, Username, TimelineId, EntryId) ->
 | 
				
			||||||
    case ts_entry:lookup(Username, TimelineId, EntryId) of
 | 
					    case ts_entry:lookup(Username, TimelineId, EntryId) of
 | 
				
			||||||
        % no such entry
 | 
					        % no such entry
 | 
				
			||||||
        no_record -> make_json_404(YArg, [{error, "no such entry"}]);
 | 
					        no_record -> make_json_404(YArg, [{"error", "no such entry"}]);
 | 
				
			||||||
        % return the entry data
 | 
					        % return the entry data
 | 
				
			||||||
        Entry -> make_json_200_record(YArg, Entry)
 | 
					        Entry -> make_json_200_record(YArg, Entry)
 | 
				
			||||||
    end.
 | 
					    end.
 | 
				
			||||||
@@ -539,7 +539,7 @@ make_json_200_record(YArg, Record) ->
 | 
				
			|||||||
make_json_400(YArg) -> make_json_400(YArg, []).
 | 
					make_json_400(YArg) -> make_json_400(YArg, []).
 | 
				
			||||||
make_json_400(YArg, Fields) ->
 | 
					make_json_400(YArg, Fields) ->
 | 
				
			||||||
    F1 = case lists:keyfind(status, 1, Fields) of
 | 
					    F1 = case lists:keyfind(status, 1, Fields) of
 | 
				
			||||||
        false -> Fields ++ [{status, "bad request"}];
 | 
					        false -> Fields ++ [{"status", "bad request"}];
 | 
				
			||||||
        _Else -> Fields
 | 
					        _Else -> Fields
 | 
				
			||||||
    end,
 | 
					    end,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -551,7 +551,7 @@ make_json_401(YArg) -> make_json_401(YArg, []).
 | 
				
			|||||||
make_json_401(YArg, Fields) ->
 | 
					make_json_401(YArg, Fields) ->
 | 
				
			||||||
    % add default status if not provided
 | 
					    % add default status if not provided
 | 
				
			||||||
    F1 = case lists:keyfind(status, 1, Fields) of
 | 
					    F1 = case lists:keyfind(status, 1, Fields) of
 | 
				
			||||||
        false -> Fields ++ [{status, "unauthorized"}];
 | 
					        false -> Fields ++ [{"status", "unauthorized"}];
 | 
				
			||||||
        _Else -> Fields
 | 
					        _Else -> Fields
 | 
				
			||||||
    end,
 | 
					    end,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -565,7 +565,7 @@ make_json_404(YArg) -> make_json_404(YArg, []).
 | 
				
			|||||||
make_json_404(YArg, Fields) ->
 | 
					make_json_404(YArg, Fields) ->
 | 
				
			||||||
    % add default status if not provided
 | 
					    % add default status if not provided
 | 
				
			||||||
    F1 = case lists:keyfind(status, 1, Fields) of
 | 
					    F1 = case lists:keyfind(status, 1, Fields) of
 | 
				
			||||||
        false -> Fields ++ [{status, "not found"}];
 | 
					        false -> Fields ++ [{"status", "not found"}];
 | 
				
			||||||
        _Else -> Fields
 | 
					        _Else -> Fields
 | 
				
			||||||
    end,
 | 
					    end,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -580,7 +580,7 @@ make_json_405(YArg) -> make_json_405(YArg, []).
 | 
				
			|||||||
make_json_405(YArg, Fields) ->
 | 
					make_json_405(YArg, Fields) ->
 | 
				
			||||||
    % add default status if not provided
 | 
					    % add default status if not provided
 | 
				
			||||||
    F1 = case lists:keyfind(status, 1, Fields) of
 | 
					    F1 = case lists:keyfind(status, 1, Fields) of
 | 
				
			||||||
        false -> Fields ++ [{status, "method not allowed"}];
 | 
					        false -> Fields ++ [{"status", "method not allowed"}];
 | 
				
			||||||
        _Else -> Fields
 | 
					        _Else -> Fields
 | 
				
			||||||
    end,
 | 
					    end,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -594,15 +594,15 @@ make_json_405(YArg, Fields) ->
 | 
				
			|||||||
make_json_500(YArg, Error) ->
 | 
					make_json_500(YArg, Error) ->
 | 
				
			||||||
    io:format("Error: ~n~p", [Error]),
 | 
					    io:format("Error: ~n~p", [Error]),
 | 
				
			||||||
    EJSON = {struct, [
 | 
					    EJSON = {struct, [
 | 
				
			||||||
        {status, "internal server error"},
 | 
					        {"status", "internal server error"},
 | 
				
			||||||
        {error, lists:flatten(io_lib:format("~p", [Error]))}]},
 | 
					        {"error", lists:flatten(io_lib:format("~p", [Error]))}]},
 | 
				
			||||||
    [{status, 500}, {content, "application/json", json:encode(EJSON)},
 | 
					    [{status, 500}, {content, "application/json", json:encode(EJSON)},
 | 
				
			||||||
     {header, ["Access-Control-Allow-Origin: ", get_origin_header(YArg)]},
 | 
					     {header, ["Access-Control-Allow-Origin: ", get_origin_header(YArg)]},
 | 
				
			||||||
     {header, ["Access-Control-Allow-Credentials: ", "true"]}].
 | 
					     {header, ["Access-Control-Allow-Credentials: ", "true"]}].
 | 
				
			||||||
 | 
					
 | 
				
			||||||
make_json_500(YArg) ->
 | 
					make_json_500(YArg) ->
 | 
				
			||||||
    EJSON = {struct, [
 | 
					    EJSON = {struct, [
 | 
				
			||||||
        {status, "internal server error"}]},
 | 
					        {"status", "internal server error"}]},
 | 
				
			||||||
    [{status, 500}, {content, "application/json", json:encode(EJSON)},
 | 
					    [{status, 500}, {content, "application/json", json:encode(EJSON)},
 | 
				
			||||||
     {header, ["Access-Control-Allow-Origin: ", get_origin_header(YArg)]},
 | 
					     {header, ["Access-Control-Allow-Origin: ", get_origin_header(YArg)]},
 | 
				
			||||||
     {header, ["Access-Control-Allow-Credentials: ", "true"]}].
 | 
					     {header, ["Access-Control-Allow-Credentials: ", "true"]}].
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user