1:- module(bc_api_user, []).

User management API handlers */

    5:- use_module(library(arouter)).    6:- use_module(library(dict_schema)).    7
    8:- use_module(bc_api_io).    9:- use_module(bc_api_auth).   10:- use_module(bc_api_actor).   11:- use_module(bc_data_user).   12
   13% Creation of new users.
   14
   15:- route_post(api/user,
   16    bc_auth, user_save).   17
   18user_save:-
   19    bc_read_by_schema(bc_user, User),
   20    bc_actor(Actor),
   21    bc_user_save(Actor, User, Id),
   22    bc_reply_success(Id).
   23
   24% Updates given user.
   25
   26:- route_put(api/user/Id,
   27    bc_auth, user_update(Id)).   28
   29user_update(Id):-
   30    bc_read_by_schema(bc_user, User),
   31    put_dict('$id', User, Id, Update),
   32    bc_actor(Actor),
   33    bc_user_update(Actor, Update),
   34    bc_reply_success(Id).
   35
   36% Removes an user.
   37
   38:- route_del(api/user/Id,
   39    bc_auth, user_remove(Id)).   40
   41user_remove(Id):-
   42    bc_actor(Actor),
   43    bc_user_remove(Actor, Id),
   44    bc_reply_success(Id).
   45
   46% Sends list of users.
   47
   48:- route_get(api/users,
   49    bc_auth, users_list).   50
   51users_list:-
   52    bc_actor(Actor),
   53    bc_user_list(Actor, Users),
   54    bc_reply_success(Users).
   55
   56% Sends the given user.
   57
   58:- route_get(api/user/Id,
   59    bc_auth, user_get(Id)).   60
   61user_get(Id):-
   62    bc_actor(Actor),
   63    bc_user(Actor, Id, User),
   64    bc_reply_success(User).
   65
   66% Sends the given user information.
   67
   68:- route_get(api/user/info,
   69    bc_auth, user_info).   70
   71user_info:-
   72    bc_actor(User),
   73    bc_reply_success(_{
   74        '$id': User.'$id',
   75        type: User.type,
   76        username: User.username,
   77        fullname: User.fullname }).
   78
   79% Schema for user data.
   80
   81:- register_schema(bc_user, _{
   82    type: dict,
   83    tag: user,
   84    keys: _{
   85        fullname: _{ type: atom, min_length: 1 },
   86        username: _{ type: atom, min_length: 1 },
   87        password: _{ type: atom, min_length: 6 },
   88        comment_notifications: bool,
   89        type: _{ type: atom, min_length: 1, max_length: 100 },
   90        link: string
   91    },
   92    optional: [ password ]
   93}).