From 5f14a4f6cb698d4a59e063e5bdf8d4403785b375 Mon Sep 17 00:00:00 2001 From: absc Date: Sun, 15 Sep 2024 12:14:29 +0000 Subject: [PATCH] Start to split the back-end further in more minor processes. The back-end will expose only the public APIs to be consumed by the listeners. The new users server takes care of the users management. Other subsystems will follow (i.e. GUI, fedi, blog etc..). --- dudeswave_backend/src/Makefile | 1 - dudeswave_backend/src/dudeswave_backend.erl | 18 ++- dudeswave_users/Makefile | 7 + dudeswave_users/ebin/dudeswave_users.app | 10 ++ dudeswave_users/include/defines.hrl | 23 ++++ dudeswave_users/src/Makefile | 19 +++ dudeswave_users/src/dudeswave_users.erl | 125 ++++++++++++++++++ dudeswave_users/src/dudeswave_users_app.erl | 31 +++++ .../src/dudeswave_users_auth.erl | 4 +- .../src/dudeswave_users_supervisor.erl | 31 +++++ .../src/dudeswave_users_user.erl | 4 +- 11 files changed, 261 insertions(+), 12 deletions(-) create mode 100644 dudeswave_users/Makefile create mode 100644 dudeswave_users/ebin/dudeswave_users.app create mode 100644 dudeswave_users/include/defines.hrl create mode 100644 dudeswave_users/src/Makefile create mode 100644 dudeswave_users/src/dudeswave_users.erl create mode 100644 dudeswave_users/src/dudeswave_users_app.erl rename dudeswave_backend/src/dudeswave_backend_auth.erl => dudeswave_users/src/dudeswave_users_auth.erl (97%) create mode 100644 dudeswave_users/src/dudeswave_users_supervisor.erl rename dudeswave_backend/src/dudeswave_backend_user.erl => dudeswave_users/src/dudeswave_users_user.erl (97%) diff --git a/dudeswave_backend/src/Makefile b/dudeswave_backend/src/Makefile index 8dab13c..0088ead 100644 --- a/dudeswave_backend/src/Makefile +++ b/dudeswave_backend/src/Makefile @@ -7,7 +7,6 @@ ERLFLAGS= -I ../../ OBJS= dudeswave_backend.beam dudeswave_backend_app.beam OBJS+= dudeswave_backend_supervisor.beam -OBJS+= dudeswave_backend_auth.beam dudeswave_backend_user.beam all: ${OBJS} diff --git a/dudeswave_backend/src/dudeswave_backend.erl b/dudeswave_backend/src/dudeswave_backend.erl index e2a4879..b367303 100644 --- a/dudeswave_backend/src/dudeswave_backend.erl +++ b/dudeswave_backend/src/dudeswave_backend.erl @@ -43,6 +43,10 @@ init([]) -> % Public APIs % +% +% Users management +% + auth(cookie, User, Cookie) -> gen_server:call({local, ?MODULE}, {cookie, User, Cookie}); @@ -69,7 +73,7 @@ delete_user(User) -> % handle_call({cookie, User, Cookie}, _From, State) -> - case dudeswave_backend_auth:authenticate(cookie, User, Cookie) of + case dudeswave_users:authenticate(cookie, User, Cookie) of true -> {reply, true, State}; false -> @@ -79,7 +83,7 @@ handle_call({cookie, User, Cookie}, _From, State) -> end; handle_call({password, User, Password}, _From, State) -> - case dudeswave_backend_auth:authenticate(password, User, Password) of + case dudeswave_users:authenticate(password, User, Password) of {true, Cookie, Validity} -> {reply, {true, Cookie, Validity}, State}; false -> @@ -89,32 +93,32 @@ handle_call({password, User, Password}, _From, State) -> end; handle_call({logout, User, Cookie}, _From, State) -> - case dudeswave_backend_auth:logout(User, Cookie) of + case dudeswave_users:logout(User, Cookie) of ok -> {reply, ok, State}; {error, Reason} -> {reply, {error, Reason}, State} end; handle_call({user_details, User}, _From, State) -> - case dudeswave_backend_user:details(User) of + case dudeswave_users:details(User) of {error, not_found} -> {reply, not_found, State}; {error, Reason} -> {reply, {error, Reason}, State}; Val -> {reply, Val, State} end; handle_call({new_user, User, Password, Email}, _From, State) -> - case dudeswave_backend_user:new(User, Password, Email) of + case dudeswave_users:new(User, Password, Email) of ok -> {reply, ok, State}; {error, Reason} -> {reply, {error, Reason}, State} end; handle_call({update_user, User, Name, Email, Desc}, _From, State) -> - case dudeswave_backend_user:update(User, Name, Email, Desc) of + case dudeswave_users:update(User, Name, Email, Desc) of ok -> {reply, ok, State}; {error, Reason} -> {reply, {error, Reason}, State} end; handle_call({delete_user, User}, _From, State) -> - case dudeswave_backend_user:delete(User) of + case dudeswave_users:delete(User) of ok -> {reply, ok, State}; {error, Reason} -> {reply, {error, Reason}, State} end. diff --git a/dudeswave_users/Makefile b/dudeswave_users/Makefile new file mode 100644 index 0000000..160022d --- /dev/null +++ b/dudeswave_users/Makefile @@ -0,0 +1,7 @@ +.PHONY: all clean + +all: + ${MAKE} -C src + +clean: + ${MAKE} -C src clean diff --git a/dudeswave_users/ebin/dudeswave_users.app b/dudeswave_users/ebin/dudeswave_users.app new file mode 100644 index 0000000..5590616 --- /dev/null +++ b/dudeswave_users/ebin/dudeswave_users.app @@ -0,0 +1,10 @@ +{application,dudeswave_users, + [{description,"The dudeswave users management module"}, + {vsn,"1.0.0"}, + {modules,[dudeswave_users,dudeswave_users_app, + dudeswave_users_supervisor, + dudeswave_users_auth,dudeswave_users_user]}, + {registered,[]}, + {applications,[kernel,stdlib,erts,cowboy,ranch]}, + {mod,{dudeswave_users_app,[]}}, + {start_phases,[]}]}. diff --git a/dudeswave_users/include/defines.hrl b/dudeswave_users/include/defines.hrl new file mode 100644 index 0000000..48c12ba --- /dev/null +++ b/dudeswave_users/include/defines.hrl @@ -0,0 +1,23 @@ +% +% Copyright (c) 2024 Andrea Biscuola +% +% Permission to use, copy, modify, and distribute this software for any +% purpose with or without fee is hereby granted, provided that the above +% copyright notice and this permission notice appear in all copies. +% +% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +% + +-define(APPBUCK, dudeswave). +-define(USERSBUCK, dudes). +-define(COOKIESBUCK, cookies). +-define(RANDBYTES, 32). +-define(DEFVALIDITY, 365). +-define(DUDENAME, "dudename"). +-define(DUDEAUTH, "dudeauth"). diff --git a/dudeswave_users/src/Makefile b/dudeswave_users/src/Makefile new file mode 100644 index 0000000..296b5dd --- /dev/null +++ b/dudeswave_users/src/Makefile @@ -0,0 +1,19 @@ +.PHONY: all clean +.SUFFIXES: .erl .beam + +ERLC?= erlc -server + +ERLFLAGS= -I ../../ + +OBJS= dudeswave_users.beam dudeswave_users_app.beam +OBJS+= dudeswave_users_supervisor.beam +OBJS+= dudeswave_users_auth.beam dudeswave_users_user.beam + +all: ${OBJS} + +.erl.beam: + ${ERLC} ${ERLOPTS} ${ERLFLAGS} $< + +clean: + rm -f *.beam + diff --git a/dudeswave_users/src/dudeswave_users.erl b/dudeswave_users/src/dudeswave_users.erl new file mode 100644 index 0000000..317e686 --- /dev/null +++ b/dudeswave_users/src/dudeswave_users.erl @@ -0,0 +1,125 @@ +% +% Copyright (c) 2024 Andrea Biscuola +% +% Permission to use, copy, modify, and distribute this software for any +% purpose with or without fee is hereby granted, provided that the above +% copyright notice and this permission notice appear in all copies. +% +% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +% +-module(dudeswave_users). + +-behaviour(gen_server). + +% Server start function +-export([start_link/0]). + +% Module callbacks +-export([init/1, handle_call/3, handle_cast/2, terminate/2]). + +% Public API exports +-export([auth/3, logout/2, details/1, new/3, + update/4, delete/1]). + +% +% Startup functions +% + +start_link() -> + gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). + +init([]) -> + process_flag(trap_exit, true), + + {ok, 0}. + +% +% Public APIs +% + +auth(cookie, User, Cookie) -> + gen_server:call({local, ?MODULE}, {cookie, User, Cookie}); + +auth(password, User, Password) -> + gen_server:call({local, ?MODULE}, {password, User, Password}). + +logout(User, Cookie) -> + gen_server:call({local, ?MODULE}, {logout, User, Cookie}). + +details(User) -> + gen_server:call({local, ?MODULE}, {details, User}). + +new(User, Password, Email) -> + gen_server:call({local, ?MODULE}, {new, User, Password, Email}). + +update(User, Name, Email, Desc) -> + gen_server:call({local, ?MODULE}, {update, User, Name, Email, Desc}). + +delete(User) -> + gen_server:call({local, ?MODULE}, {delete, User}). + +% +% Callbacks +% + +handle_call({cookie, User, Cookie}, _From, State) -> + case dudeswave_users_auth:authenticate(cookie, User, Cookie) of + true -> + {reply, true, State}; + false -> + {reply, false, State}; + {error, Reason} -> + {reply, {error, Reason}, State} + end; + +handle_call({password, User, Password}, _From, State) -> + case dudeswave_users_auth:authenticate(password, User, Password) of + {true, Cookie, Validity} -> + {reply, {true, Cookie, Validity}, State}; + false -> + {reply, false, State}; + {error, Reason} -> + {reply, {error, Reason}, State} + end; + +handle_call({logout, User, Cookie}, _From, State) -> + case dudeswave_users_auth:logout(User, Cookie) of + ok -> {reply, ok, State}; + {error, Reason} -> {reply, {error, Reason}, State} + end; + +handle_call({details, User}, _From, State) -> + case dudeswave_users_user:details(User) of + {error, not_found} -> {reply, not_found, State}; + {error, Reason} -> {reply, {error, Reason}, State}; + Val -> {reply, Val, State} + end; + +handle_call({new, User, Password, Email}, _From, State) -> + case dudeswave_users_user:new(User, Password, Email) of + ok -> {reply, ok, State}; + {error, Reason} -> {reply, {error, Reason}, State} + end; + +handle_call({update, User, Name, Email, Desc}, _From, State) -> + case dudeswave_users_user:update(User, Name, Email, Desc) of + ok -> {reply, ok, State}; + {error, Reason} -> {reply, {error, Reason}, State} + end; + +handle_call({delete, User}, _From, State) -> + case dudeswave_users_user:delete(User) of + ok -> {reply, ok, State}; + {error, Reason} -> {reply, {error, Reason}, State} + end. + + +handle_cast(_Msg, State) -> {noreply, State}. + +terminate(_Reason, _N) -> ok. diff --git a/dudeswave_users/src/dudeswave_users_app.erl b/dudeswave_users/src/dudeswave_users_app.erl new file mode 100644 index 0000000..d3a0e0c --- /dev/null +++ b/dudeswave_users/src/dudeswave_users_app.erl @@ -0,0 +1,31 @@ +% +% Copyright (c) 2024 Andrea Biscuola +% +% Permission to use, copy, modify, and distribute this software for any +% purpose with or without fee is hereby granted, provided that the above +% copyright notice and this permission notice appear in all copies. +% +% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +% +-module(dudeswave_users_app). +-behaviour(application). + +-export([bootstrap/3, start/2, stop/1]). + +start(_Type, StartArgs) -> + crypto:rand_seed(), + + dudeswave_users_supervisor:start_link(StartArgs). + +stop(_State) -> ok. + +% +% Bootstrap procedure to be completed +% +bootstrap(_Admin, _Password, _Nodes) -> ok. diff --git a/dudeswave_backend/src/dudeswave_backend_auth.erl b/dudeswave_users/src/dudeswave_users_auth.erl similarity index 97% rename from dudeswave_backend/src/dudeswave_backend_auth.erl rename to dudeswave_users/src/dudeswave_users_auth.erl index c6b563a..6240fda 100644 --- a/dudeswave_backend/src/dudeswave_backend_auth.erl +++ b/dudeswave_users/src/dudeswave_users_auth.erl @@ -13,14 +13,14 @@ % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. % --module(dudeswave_backend_auth). +-module(dudeswave_users_auth). -moduledoc """ Dudes authentication module Here lives all the functions for the APIs needed to handle users authentication. """. --include_lib("dudeswave_backend/include/defines.hrl"). +-include_lib("dudeswave_users/include/defines.hrl"). -include_lib("storage/include/storage.hrl"). -export([authenticate/3, logout/2]). diff --git a/dudeswave_users/src/dudeswave_users_supervisor.erl b/dudeswave_users/src/dudeswave_users_supervisor.erl new file mode 100644 index 0000000..e3dcc9b --- /dev/null +++ b/dudeswave_users/src/dudeswave_users_supervisor.erl @@ -0,0 +1,31 @@ +% +% Copyright (c) 2024 Andrea Biscuola +% +% Permission to use, copy, modify, and distribute this software for any +% purpose with or without fee is hereby granted, provided that the above +% copyright notice and this permission notice appear in all copies. +% +% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +% +-module(dudeswave_users_supervisor). +-behaviour(supervisor). + +-export([start/0, + start_link/1, + init/1]). + +start() -> + spawn(fun() -> supervisor:start_link({local, ?MODULE}, ?MODULE, _Arg = []) end). + +start_link(Args) -> + supervisor:start_link({local, ?MODULE}, ?MODULE, Args). + +init([]) -> + {ok, {{one_for_one, 3, 10}, [{tag1, {dudeswave_users, start_link, []}, permanent, + 10000, worker, [dudeswave_users]}]}}. \ No newline at end of file diff --git a/dudeswave_backend/src/dudeswave_backend_user.erl b/dudeswave_users/src/dudeswave_users_user.erl similarity index 97% rename from dudeswave_backend/src/dudeswave_backend_user.erl rename to dudeswave_users/src/dudeswave_users_user.erl index 907a561..eeb6eae 100644 --- a/dudeswave_backend/src/dudeswave_backend_user.erl +++ b/dudeswave_users/src/dudeswave_users_user.erl @@ -13,9 +13,9 @@ % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. % --module(dudeswave_backend_user). +-module(dudeswave_users_user). --include_lib("dudeswave_backend/include/defines.hrl"). +-include_lib("dudeswave_users/include/defines.hrl"). -include_lib("storage/include/storage.hrl"). -export([details/1, new/3, update/4, delete/1]).