@@ -3,11 +3,72 @@ class Api
33 params do
44 includes :basic_search
55 end
6+
67 get do
7- users = SEQUEL_DB [ :users ] . all
8- {
9- data : users
10- }
8+ users = Models ::User . all
9+ present :data , users , with : Models ::User ::Entity
10+ end
11+
12+
13+ desc 'Creates a new user' ,
14+ entity : Models ::User ::Entity ,
15+ params : Models ::User ::Input . documentation_in_body ,
16+ failure : [ { code : 422 , message : 'Invalid input' } ]
17+ post do
18+ result = UserValidator . new ( params ) . validate
19+
20+ if result . success?
21+ @user = Models ::User . create ( result . output )
22+ ConfirmNewUserJob . perform_async ( @user . email )
23+
24+ present @user
25+ else
26+ api_response ( error_type : :invalid , errors : result . messages )
27+ end
28+ end
29+
30+ route_param :id do
31+ before do
32+ @user = Models ::User . with_pk! ( params [ :id ] )
33+ end
34+
35+ desc "Resets a user's password" ,
36+ params : Models ::PasswordReset ::Input . documentation_in_body ,
37+ success : { code : 204 } ,
38+ failure : [ { code : 422 , message : 'Invalid input' } , { code : 401 , message : 'Invalid verification code' } ]
39+ patch :reset_password do
40+ result = ResetPasswordValidator . new ( params ) . validate
41+
42+ if !@user . valid_reset_password_code? ( result . output [ :verification_code ] )
43+ api_response ( error_type : :unauthorized , errors : [ "Invalid verification code" ] )
44+ elsif result . failure?
45+ api_response ( error_type : :invalid , errors : result . messages )
46+ else
47+ @user . update ( password : result . output [ :new_password ] )
48+ ConfirmResetPasswordJob . perform_async ( @user . email )
49+
50+ body false
51+ end
52+ end
53+
54+ desc 'Updates an existing user' ,
55+ entity : Models ::User ::Entity ,
56+ params : Models ::User ::Input . documentation_in_body ,
57+ failure : [ { code : 422 , message : 'Invalid input' } , { code : 403 , message : 'Unauthorized operation attempt' } ] ,
58+ headers : { 'Authorization' => { description : 'JWT Authorization Token' , required : true } }
59+ put do
60+ result = UserValidator . new ( params ) . validate
61+
62+ if current_user . nil? || current_user . cannot? ( :edit , @user )
63+ api_response ( error_type : :forbidden , errors : [ "Attempted to edit another user" ] )
64+ elsif result . failure?
65+ api_response ( error_type : :invalid , errors : result . messages )
66+ else
67+ @user . update ( result . output )
68+
69+ present @user
70+ end
71+ end
1172 end
1273 end
1374end
0 commit comments