check nick and email are unique

This commit is contained in:
zapashcanon 2021-11-07 00:54:35 +01:00
parent a951a7584a
commit 6f7a3c568c
No known key found for this signature in database
GPG key ID: 8981C3C62D1D28F1
2 changed files with 17 additions and 7 deletions

View file

@ -5,7 +5,7 @@ let f ?email ?nick ?password request =
% begin match User.register ~email ~nick ~password with % begin match User.register ~email ~nick ~password with
% | Error e -> % | Error e ->
Error: <%s e %> Error: <%s e %>
% | Ok _ -> % | Ok _ (* TODO: do not match on _ *) ->
User created ! User created !
% end; % end;
% | _ -> % | _ ->

View file

@ -48,14 +48,24 @@ let register ~email ~nick ~password =
if not valid then if not valid then
Error "Something is wrong" Error "Something is wrong"
else else
(* TODO: add check uniqueness of id *)
let open Sqlite3_utils in let open Sqlite3_utils in
let res = let unique =
Db.with_db (fun db -> Db.with_db (fun db ->
exec_raw_args db "INSERT INTO user VALUES (?, ?, ?);" exec_raw_args db
[| Data.TEXT nick; Data.TEXT password; Data.TEXT email |] "SELECT EXISTS(SELECT 1 FROM user WHERE nick=? OR email=?);"
[| Data.TEXT nick; Data.TEXT email |]
~f:Cursor.to_list ) ~f:Cursor.to_list )
in in
match res with match unique with
| Ok res -> Ok res | 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)) | Error e -> Error (Format.sprintf "db error: %s" (Rc.to_string e))