diff --git a/src/register.eml.html b/src/register.eml.html
index ff1fbb4..0cc46f0 100644
--- a/src/register.eml.html
+++ b/src/register.eml.html
@@ -5,7 +5,7 @@ let f ?email ?nick ?password request =
% begin match User.register ~email ~nick ~password with
% | Error e ->
Error: <%s e %>
-% | Ok _ ->
+% | Ok _ (* TODO: do not match on _ *) ->
User created !
% end;
% | _ ->
diff --git a/src/user.ml b/src/user.ml
index 056750e..1ce3507 100644
--- a/src/user.ml
+++ b/src/user.ml
@@ -48,14 +48,24 @@ let register ~email ~nick ~password =
if not valid then
Error "Something is wrong"
else
- (* TODO: add check uniqueness of id *)
let open Sqlite3_utils in
- let res =
+ let unique =
Db.with_db (fun db ->
- exec_raw_args db "INSERT INTO user VALUES (?, ?, ?);"
- [| Data.TEXT nick; Data.TEXT password; Data.TEXT email |]
+ exec_raw_args db
+ "SELECT EXISTS(SELECT 1 FROM user WHERE nick=? OR email=?);"
+ [| Data.TEXT nick; Data.TEXT email |]
~f:Cursor.to_list )
in
- match res with
- | Ok res -> Ok res
+ match unique with
+ | Ok [ [| Data.INT 0L |] ] -> (
+ let res =
+ Db.with_db (fun db ->
+ exec_raw_args db "INSERT INTO user VALUES (?, ?, ?);"
+ [| Data.TEXT nick; Data.TEXT password; Data.TEXT email |]
+ ~f:Cursor.to_list )
+ in
+ match res with
+ | Ok res -> Ok res
+ | Error e -> Error (Format.sprintf "db error: %s" (Rc.to_string e)) )
+ | Ok _ -> Error "nick or email already exists"
| Error e -> Error (Format.sprintf "db error: %s" (Rc.to_string e))