-vers_version(2) ->
- mnesia:transform_table(
- user,
- fun({user, Id, Cookie, Pseudo, Date_creation, Date_derniere_connexion, Css}) ->
- {user, Id, Cookie, Pseudo, "", "", "", Date_creation, Date_derniere_connexion, Css}
- end,
- record_info(fields, user),
- user
- );
-vers_version(3) ->
- mnesia:transform_table(
- user,
- fun({user, Id, Cookie, Pseudo, Login, Password, Email, Date_creation, Date_derniere_connexion, Css}) ->
- {user, Id, Cookie, Pseudo, Login, Password, Email, Date_creation, Date_derniere_connexion, Css, 0}
- end,
- record_info(fields, user),
- user
- );
-vers_version(4) ->
- mnesia:transform_table(
- user,
- fun({user, Id, Cookie, Pseudo, Login, Password, Email, Date_creation, Date_derniere_connexion, Css, Indice_flood}) ->
- {user, Id, Cookie, Pseudo, Login, Password, Email, Date_creation, Date_derniere_connexion, Css, Indice_flood, []}
- end,
- record_info(fields, user),
- user
- );
-% Ajout du numéro de page de la conv principale
-vers_version(5) ->
- mnesia:transform_table(
- user,
- fun({user, Id, Cookie, Pseudo, Login, Password, Email, Date_creation, Date_derniere_connexion, Css, Indice_flood, Conversations}) ->
- {user, Id, Cookie, Pseudo, Login, Password, Email, Date_creation, Date_derniere_connexion, Css, Indice_flood, 1, Conversations}
+% Efface tous les users, minichat_reponse et minichat.\r
+reset() ->\r
+ mnesia:clear_table(counter),\r
+ mnesia:clear_table(user),\r
+ mnesia:clear_table(reponse_minichat),\r
+ mnesia:clear_table(minichat),\r
+ % crée l'utilisateur root\r
+ mnesia:transaction(fun() ->\r
+ User = #user{id = 0, pseudo = "Sys", login = "Sys", date_creation = now(), date_derniere_connexion = now()},\r
+ mnesia:write(User),\r
+ User\r
+ end).
+
+
+% Ajoute un nouveau user et le renvoie
+nouveau_user(Pseudo, Cookie) ->
+ F = fun() ->
+ Id = nouvel_id(user),
+ User = #user{id = Id, cookie = Cookie, pseudo = Pseudo, date_creation = now(), date_derniere_connexion = now()},
+ mnesia:write(User),
+ User
+ end,
+ resultat_transaction(mnesia:transaction(F)).
+
+
+% Ajoute un nouveau user et le renvoie
+nouveau_user(Login, Password, Cookie) ->
+ F = fun() ->
+ Id = nouvel_id(user),
+ User = #user{id = Id, cookie = Cookie, pseudo = Login, login = Login, password = Password, date_creation = now(), date_derniere_connexion = now()},
+ mnesia:write(User),
+ User
+ end,
+ resultat_transaction(mnesia:transaction(F)).
+
+
+% Mise à par Cookie les autres peuvent être undefined ce qui veut dire qu'ils ne seront pas modifié.
+set_profile(Cookie, Login, Password, Pseudo, Email, Css, Nick_format, Page_principale, Conversations) ->
+ if Nick_format =:= nick; Nick_format =:= login; Nick_format =:= nick_login ->
+ resultat_transaction(mnesia:transaction(
+ fun() ->
+ case user_by_cookie(Cookie) of
+ {ok, User} ->
+ case user_by_login(Login) of
+ {ok, U} when User#user.login =/= [], U#user.id =/= User#user.id ->
+ login_deja_pris;
+ _ ->
+ User_modifie = User#user{
+ % TODO : pourquoi ne pas tester avec la valeur "undefined" plutôt qu'avec "is_list" ?
+ % TODO : validation plus strict des données (pas de page négative dans les conv par exemple)
+ login = if is_list(Login) -> Login; true -> User#user.login end,
+ password = if is_list(Password) -> Password; true -> User#user.password end,
+ pseudo = if is_list(Pseudo) -> Pseudo; true -> User#user.pseudo end,
+ email = if is_list(Email) -> Email; true -> User#user.email end,
+ css = if is_list(Css) -> Css; true -> User#user.css end,
+ nick_format = Nick_format,
+ page_principale = if is_integer(Page_principale), Page_principale > 0 -> Page_principale; true -> User#user.page_principale end,
+ conversations = if is_list(Conversations) -> Conversations; true -> User#user.conversations end
+ },
+ mnesia:write(User_modifie),
+ ok
+ end;
+ _ -> erreur
+ end
+ end
+ ));
+ true ->
+ erreur
+ end.
+
+
+% Met à jour la date de la dernière connexion d'un utilisateur à maintenant
+update_date_derniere_connexion(User_id) ->
+ mnesia:transaction(
+ fun() ->
+ case mnesia:wread({user, User_id}) of
+ [User] ->
+ mnesia:write(User#user{date_derniere_connexion = now()});
+ _ ->
+ mnesia:abort("update_date_derniere_connexion: User inconnu")
+ end
+ end
+ ).
+
+
+% Met à jour l'ip d'un user
+update_ip(User_id, IP) ->
+ mnesia:transaction(
+ fun() ->
+ case mnesia:wread({user, User_id}) of
+ [User] ->
+ mnesia:write(User#user{last_ip = IP});
+ _ ->
+ mnesia:abort("update_ip: User inconnu")
+ end
+ end
+ ).
+
+
+% Met à jour le pseudo du user
+update_pseudo_user(UserId, Pseudo) ->
+ mnesia:transaction(
+ fun() ->
+ case mnesia:wread({user, UserId}) of
+ [User] when User#user.pseudo =/= Pseudo ->
+ mnesia:write(User#user{pseudo = Pseudo});
+ _ ->
+ mnesia:abort("update_pseudo_user: User inconnu ou pseudo deja à jour")
+ end
+ end
+ ).
+
+
+% Renvoie tous les users.
+users() ->
+ resultat_transaction(mnesia:transaction(fun() ->
+ qlc:e(qlc:q([E || E <- mnesia:table(user)]))
+ end)).
+
+
+% Est-ce qu'un utilisateur existe en fonction de son cookie ?
+% Renvoie {ok, User} ou erreur
+user_by_cookie(Cookie) ->
+ resultat_transaction(mnesia:transaction(
+ fun() ->
+ Users = qlc:e(qlc:q([E || E <- mnesia:table(user), E#user.cookie =:= Cookie])),
+ case Users of
+ [User] -> {ok, User};
+ _ -> erreur
+ end
+ end
+ )).
+
+
+user_by_id(ID) ->
+ resultat_transaction(mnesia:transaction(
+ fun() ->
+ Users = qlc:e(qlc:q([E || E <- mnesia:table(user), E#user.id =:= ID])),
+ case Users of
+ [User] -> {ok, User};
+ _ -> erreur
+ end
+ end
+ )).
+ \r
+ \r
+user_by_login(Login) ->\r
+ resultat_transaction(mnesia:transaction(\r
+ fun() ->\r
+ Users = qlc:e(qlc:q([E || E <- mnesia:table(user), E#user.login =:= Login])),\r
+ case Users of\r
+ [User] -> {ok, User};\r
+ _ -> erreur\r
+ end\r
+ end\r
+ )).\r
+
+
+toggle_ek_master(User_id) ->
+ resultat_transaction(mnesia:transaction(
+ fun() ->
+ Users = qlc:e(qlc:q([E || E <- mnesia:table(user), E#user.id =:= User_id])),
+ case Users of
+ [User] ->
+ mnesia:write(User#user{ek_master = not User#user.ek_master});
+ _ -> erreur
+ end
+ end
+ )).
+
+
+user_by_login_password(Login, Password) ->
+ resultat_transaction(mnesia:transaction(
+ fun() ->
+ Users = qlc:e(qlc:q([E || E <- mnesia:table(user), E#user.login =:= Login, E#user.password =:= Password])),
+ case Users of
+ [User] -> {ok, User};
+ _ -> erreur
+ end
+ end
+ )).
+
+
+% Renvoie {ok, User} où User est un #user possédant le message donné.
+user_by_mess(Id) ->
+ resultat_transaction(mnesia:transaction(
+ fun() ->
+ case qlc:e(qlc:q([U || U <- mnesia:table(user), M <- mnesia:table(minichat), M#minichat.id =:= Id, M#minichat.auteur_id =:= U#user.id])) of
+ [User] -> {ok, User};
+ _ -> erreur
+ end
+ end
+ )).\r
+ \r
+ \r
+% Renvoie l'utilisateur root\r
+root() ->\r
+ {ok, User} = user_by_id(0),\r
+ User.
+
+
+% Ajoute un message. Repond_A est une liste d'id auquel le message répond
+% retourne soit l'id du message soit erreur.
+nouveau_message(Mess, Auteur_id, Repond_A) ->
+ % regarde si les id 'Repond_A' existent
+ F = fun() ->
+ Nb_id_trouve = length(qlc:e(qlc:q([E#minichat.id || E <- mnesia:table(minichat), lists:member(E#minichat.id, Repond_A)]))),
+ % est-ce que l'auteur existe ?
+ Auteur = case qlc:e(qlc:q([E || E <- mnesia:table(user), E#user.id =:= Auteur_id])) of
+ [A] -> A;
+ _ -> throw("L'auteur du message est introuvable")