Skip to content

Commit 6957282

Browse files
committed
Add support for creating a user using the API
1 parent 3114c1f commit 6957282

File tree

5 files changed

+122
-20
lines changed

5 files changed

+122
-20
lines changed

app/Http/Controllers/API/AuthController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ public function postLogin(Request $request) {
115115
* @Post("/validate")
116116
* @Versions({"v1"})
117117
* @Request(headers={"Authorization": "Bearer <jwt-token>"})
118-
* @Response(204);
118+
* @Response(204)
119119
*/
120120
public function postValidate(Request $request) {
121121
return $this->response->noContent();

app/Http/Controllers/API/UserController.php

Lines changed: 84 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44

55
use Illuminate\Http\Request;
66

7+
use Dingo\Api\Exception\StoreResourceFailedException;
8+
79
use Pterodactyl\Transformers\UserTransformer;
810
use Pterodactyl\Models;
11+
use Pterodactyl\Repositories\UserRepository;
912

1013
/**
1114
* @Resource("Users", uri="/users")
@@ -21,7 +24,7 @@ class UserController extends BaseController
2124
* @Get("/{?page}")
2225
* @Versions({"v1"})
2326
* @Parameters({
24-
* @Parameter("page", type="integer", description="The page of results to view.", default=1)
27+
* @Parameter("page", type="integer", description="The page of results to view.", default=1)
2528
* })
2629
* @Response(200)
2730
*/
@@ -39,8 +42,8 @@ public function getUsers(Request $request)
3942
* @Get("/{id}/{fields}")
4043
* @Versions({"v1"})
4144
* @Parameters({
42-
* @Parameter("id", type="integer", required=true, description="The ID of the user to get information on."),
43-
* @Parameter("fields", type="string", required=false, description="A comma delimidated list of fields to include.")
45+
* @Parameter("id", type="integer", required=true, description="The ID of the user to get information on."),
46+
* @Parameter("fields", type="string", required=false, description="A comma delimidated list of fields to include.")
4447
* })
4548
* @Response(200)
4649
*/
@@ -59,4 +62,82 @@ public function getUserByID(Request $request, $id, $fields = null)
5962
return $query->first();
6063
}
6164

65+
/**
66+
* Create a New User
67+
*
68+
* @Post("/")
69+
* @Versions({"v1"})
70+
* @Transaction({
71+
* @Request({
72+
* "email": "foo@example.com",
73+
* "password": "foopassword",
74+
* "admin": false
75+
* }, headers={"Authorization": "Bearer <jwt-token>"}),
76+
* @Response(200, body={"id": 1}),
77+
* @Response(422, body{
78+
* "message": "A validation error occured.",
79+
* "errors": {
80+
* "email": ["The email field is required."],
81+
* "password": ["The password field is required."],
82+
* "admin": ["The admin field is required."]
83+
* },
84+
* "status_code": 422
85+
* })
86+
* })
87+
*/
88+
public function postUsers(Request $request)
89+
{
90+
try {
91+
$user = new UserRepository;
92+
$create = $user->create($request->input('email'), $request->input('password'), $request->input('admin'));
93+
return [ 'id' => $create ];
94+
} catch (\Pterodactyl\Exceptions\DisplayValidationException $ex) {
95+
throw new StoreResourceFailedException('A validation error occured.', json_decode($ex->getMessage(), true));
96+
} catch (\Exception $ex) {
97+
throw new StoreResourceFailedException('Unable to create a user on the system due to an error.');
98+
}
99+
}
100+
101+
/**
102+
* Update an Existing User
103+
*
104+
* The data sent in the request will be used to update the existing user on the system.
105+
*
106+
* @Patch("/{id}")
107+
* @Versions({"v1"})
108+
* @Transaction({
109+
* @Request({
110+
* "email": "new@email.com"
111+
* }, headers={"Authorization": "Bearer <jwt-token>"}),
112+
* @Response(200, body={"email": "new@email.com"}),
113+
* @Response(422)
114+
* })
115+
* @Parameters({
116+
* @Parameter("id", type="integer", required=true, description="The ID of the user to modify.")
117+
* })
118+
*/
119+
public function patchUser(Request $request, $id)
120+
{
121+
//
122+
}
123+
124+
/**
125+
* Delete a User
126+
*
127+
* @Delete("/{id}")
128+
* @Versions({"v1"})
129+
* @Transaction({
130+
* @Request(headers={"Authorization": "Bearer <jwt-token>"}),
131+
* @Response(204),
132+
* @Response(422)
133+
* })
134+
* @Parameters({
135+
* @Parameter("id", type="integer", required=true, description="The ID of the user to delete.")
136+
* })
137+
*/
138+
public function deleteUser(Request $request, $id)
139+
{
140+
//
141+
}
142+
62143
}

app/Http/Controllers/Admin/AccountsController.php

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -62,27 +62,18 @@ public function deleteView(Request $request, $id)
6262

6363
public function postNew(Request $request)
6464
{
65-
$this->validate($request, [
66-
'email' => 'required|email|unique:users,email',
67-
'password' => 'required|confirmed|regex:((?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,})'
68-
]);
69-
7065
try {
7166
$user = new UserRepository;
7267
$userid = $user->create($request->input('username'), $request->input('email'), $request->input('password'));
73-
74-
if (!$userid) {
75-
throw new \Exception('Unable to create user, response was not an integer.');
76-
}
77-
7868
Alert::success('Account has been successfully created.')->flash();
7969
return redirect()->route('admin.accounts.view', ['id' => $userid]);
80-
} catch (\Exception $e) {
81-
Log::error($e);
70+
} catch (\Pterodactyl\Exceptions\DisplayValidationException $ex) {
71+
return redirect()->route('admin.nodes.view', $id)->withErrors(json_decode($e->getMessage()))->withInput();
72+
} catch (\Exception $ex) {
73+
Log::error($ex);
8274
Alert::danger('An error occured while attempting to add a new user. ' . $e->getMessage())->flash();
8375
return redirect()->route('admin.accounts.new');
8476
}
85-
8677
}
8778

8879
public function postUpdate(Request $request)

app/Http/Routes/APIRoutes.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,16 @@ public function map(Router $router) {
3636
'uses' => 'Pterodactyl\Http\Controllers\API\UserController@getUsers'
3737
]);
3838

39+
$api->post('users', [
40+
'as' => 'api.users.post',
41+
'uses' => 'Pterodactyl\Http\Controllers\API\UserController@postUsers'
42+
]);
43+
3944
$api->get('users/{id}/{fields?}', [
4045
'as' => 'api.users.view',
4146
'uses' => 'Pterodactyl\Http\Controllers\API\UserController@getUserByID'
4247
]);
4348

44-
4549
});
4650
}
4751

app/Repositories/UserRepository.php

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@
22

33
namespace Pterodactyl\Repositories;
44

5+
use Validator;
56
use Hash;
67

78
use Pterodactyl\Models\User;
89
use Pterodactyl\Services\UuidService;
910

11+
use Pterodactyl\Exceptions\DisplayValidationException;
12+
1013
class UserRepository
1114
{
1215

@@ -22,16 +25,39 @@ public function __construct()
2225
* @param string $password An unhashed version of the user's password.
2326
* @return bool|integer
2427
*/
25-
public function create($email, $password)
28+
public function create($email, $password, $admin = false)
2629
{
30+
31+
$validator = Validator::make([
32+
'email' => $email,
33+
'password' => $password,
34+
'admin' => $admin
35+
], [
36+
'email' => 'required|email|unique:users,email',
37+
'password' => 'required|regex:((?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,})',
38+
'admin' => 'required|boolean'
39+
]);
40+
41+
// Run validator, throw catchable and displayable exception if it fails.
42+
// Exception includes a JSON result of failed validation rules.
43+
if ($validator->fails()) {
44+
throw new DisplayValidationException($validator->errors());
45+
}
46+
2747
$user = new User;
2848
$uuid = new UuidService;
2949

3050
$user->uuid = $uuid->generate('users', 'uuid');
3151
$user->email = $email;
3252
$user->password = Hash::make($password);
53+
$user->root_admin = ($admin) ? 1 : 0;
3354

34-
return ($user->save()) ? $user->id : false;
55+
try {
56+
$user->save();
57+
return $user->id;
58+
} catch (\Exception $ex) {
59+
throw $e;
60+
}
3561
}
3662

3763
/**

0 commit comments

Comments
 (0)