Files
study-system/server/src/subject_server.erl

61 lines
1.8 KiB
Erlang

% Copyright (c) Camden Dixie O'Brien
% SPDX-License-Identifier: AGPL-3.0-only
-module(subject_server).
-behaviour(gen_server).
-export([start_link/1, get_subject/1, get_activities/1, log_session/4]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
start_link(Subject) ->
gen_server:start_link(?MODULE, Subject, []).
get_subject(Pid) ->
gen_server:call(Pid, get_subject).
get_activities(Pid) ->
gen_server:call(Pid, get_activities).
log_session(Pid, Type, Timestamp, Minutes) ->
gen_server:call(Pid, {log_session, {Type, Timestamp, Minutes}}).
init(Subject) ->
pg:join(study_system_server, subject_servers, self()),
{ok, #{subject => Subject,
priorities => #{reading => rand:uniform(),
exercises => rand:uniform()}}}.
handle_call(get_subject, _From, State = #{subject := Subject}) ->
{reply, {subject, Subject}, State};
handle_call(get_activities, _From,
State = #{subject := Subject,
priorities := #{reading := ReadingPriority,
exercises := ExercisesPriority}}) ->
Reading = {Subject, reading, ReadingPriority},
Exercises = {Subject, exercises, ExercisesPriority},
{reply, [Reading, Exercises], State};
handle_call({log_session, {Type, Timestamp, Minutes}}, _From,
State = #{subject := Subject, priorities := Priorities}) ->
case Priorities of
#{Type := Priority} ->
UpdatedPriorities = Priorities#{Type := Priority * 0.667},
{reply, ok, State#{priorities := UpdatedPriorities}};
_ ->
{reply, {error, invalid_type}, State}
end;
handle_call(_Request, _From, State) ->
{reply, ok, State}.
handle_cast(_Msg, State) ->
{noreply, State}.
handle_info(_Info, State) ->
{noreply, State}.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.