Skip to content

Commit

Permalink
Merge pull request #21 from biigle/edit-quota
Browse files Browse the repository at this point in the history
Implement editable quota in admin area
  • Loading branch information
mzur authored Oct 24, 2023
2 parents 03eb7e1 + 0fcbc0d commit b9500b4
Show file tree
Hide file tree
Showing 4 changed files with 124 additions and 3 deletions.
40 changes: 40 additions & 0 deletions src/Http/Controllers/Api/StorageRequestUserController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

namespace Biigle\Modules\UserStorage\Http\Controllers\Api;

use Biigle\Http\Controllers\Api\Controller;
use Biigle\Modules\UserStorage\User;
use Illuminate\Http\Request;

class StorageRequestUserController extends Controller
{
/**
* Update the storage quota of a user
*
* @api {post} users/:id/storage-request-quota Update storage quota
* @apiGroup UserStorage
* @apiName StoreStorageQuota
* @apiPermission globalAdmin
*
* @param Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function store(Request $request, $id)
{
$request->validate([
'quota' => 'required|integer|min:0',
]);

$user = User::findOrFail($id);
$user->storage_quota_available = $request->input('quota');
$user->save();

if (!$this->isAutomatedRequest()) {
return $this->fuzzyRedirect('admin-users-show', ['id' => $id])
->with('message', 'Storage quota updated')
->with('messageType', 'success');
}

}
}
6 changes: 6 additions & 0 deletions src/Http/routes.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,12 @@
$router->post('storage-requests/{id}/reject', 'StorageRequestController@reject');
});

$router->group([
'middleware' => ['can:sudo'],
], function ($router) {
$router->post('users/{id}/storage-request-quota', 'StorageRequestUserController@store');
});

});

$router->group([
Expand Down
42 changes: 39 additions & 3 deletions src/resources/views/adminShowUser.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,48 @@
?>

<div class="col-xs-6">
<div class="panel panel-default">
<div id="storage-quota-panel" class="panel panel-default">
<div class="panel-heading">
Created {{Biigle\Modules\UserStorage\StorageRequest::where('user_id', $shownUser->id)->count()}} storage request(s). Quota:
<button class="btn btn-default btn-xs pull-right" title="Edit quota" v-on:click="toggleEditing" v-bind:class="classObj"><i class="fa fa-pen"></i></button>
Created {{Biigle\Modules\UserStorage\StorageRequest::where('user_id', $shownUser->id)->count()}} storage request(s).
</div>
<div class="panel-body text-center">
{!!size_for_humans($storageUser->storage_quota_used)!!} / {!!size_for_humans($storageUser->storage_quota_available)!!} ({{round($storageUser->storage_quota_used / $storageUser->storage_quota_available * 100, 2)}}%)
<span v-show="!editing">
Quota: {!!size_for_humans($storageUser->storage_quota_used)!!} / {!!size_for_humans($storageUser->storage_quota_available)!!} ({{round($storageUser->storage_quota_used / $storageUser->storage_quota_available * 100, 2)}}%)
</span>
<form v-cloak class="form-inline" v-if="editing" action="{{url("api/v1/users/{$shownUser->id}/storage-request-quota")}}" method="POST">
<div class="form-group">
<div class="input-group">
<input name="quota" type="number" class="form-control" value="{{$storageUser->storage_quota_available}}" min="0" step="1" list="defaultQuota">
<span class="input-group-addon">bytes</span>
</div>
</div>
<datalist id="defaultQuota">
<option value="{{config('user_storage.user_quota')}}" label="{{size_for_humans(config('user_storage.user_quota'))}}"></option>
</datalist>
<button type="submit" class="btn btn-success">Update</button>
@csrf
</form>
</div>
</div>
</div>

@push('scripts')
<script type="text/javascript">
biigle.$mount('storage-quota-panel', {
data: {
editing: false,
},
computed: {
classObj() {
return this.editing ? 'active' : '';
},
},
methods: {
toggleEditing() {
this.editing = !this.editing;
},
},
});
</script>
@endpush
39 changes: 39 additions & 0 deletions tests/Http/Controllers/Api/StorageRequestUserControllerTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php

namespace Biigle\Tests\Modules\UserStorage\Http\Controllers\Api;

use ApiTestCase;
use Biigle\User;
use Biigle\Modules\UserStorage\User as StorageUser;

class StorageRequestUserControllerTest extends ApiTestCase
{
public function testStore()
{
config(['user_storage.user_quota' => 100]);
$user = StorageUser::convert($this->user());

$this->doTestApiRoute('POST', "/api/v1/users/{$user->id}/storage-request-quota");

$this->beAdmin();
$this->postJson("/api/v1/users/{$user->id}/storage-request-quota")
->assertStatus(403);

$this->be($user);
$this->postJson("/api/v1/users/{$user->id}/storage-request-quota")
->assertStatus(403);

$this->beGlobalAdmin();
$this->postJson("/api/v1/users/{$user->id}/storage-request-quota")
->assertStatus(422);

$this->assertEquals(100, $user->storage_quota_available);
$this
->postJson("/api/v1/users/{$user->id}/storage-request-quota", [
'quota' => 200,
])
->assertStatus(200);

$this->assertEquals(200, $user->fresh()->storage_quota_available);
}
}

0 comments on commit b9500b4

Please sign in to comment.