user-detail

This commit is contained in:
xiaomlove
2021-04-27 19:13:32 +08:00
parent d1b7561aae
commit d2e05c812e
20 changed files with 594 additions and 50 deletions

View File

@@ -44,8 +44,6 @@ class ExamController extends Controller
'name' => 'required|string',
'indexes' => 'required|array|min:1',
'status' => 'required|in:0,1',
// 'begin' => 'nullable|date',
// 'end' => 'nullable|date',
];
$request->validate($rules);
$result = $this->repository->store($request->all());
@@ -104,20 +102,4 @@ class ExamController extends Controller
return $this->success($result);
}
public function users(Request $request)
{
$result = $this->repository->listUser($request->all());
$resource = ExamUserResource::collection($result);
return $this->success($resource);
}
public function progress(Request $request)
{
$result = $this->repository->getUserExamProgress(Auth::id());
$resource = new ExamUserResource($result);
return $resource;
// dd($resource->response()->getData(true));
return $this->success($resource);
}
}

View File

@@ -0,0 +1,87 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\ExamResource;
use App\Http\Resources\ExamUserResource;
use App\Http\Resources\UserResource;
use App\Repositories\ExamRepository;
use App\Repositories\UserRepository;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class ExamUserController extends Controller
{
private $repository;
public function __construct(ExamRepository $repository)
{
$this->repository = $repository;
}
/**
* Display a listing of the resource.
*
* @param Request $request
* @return array
*/
public function index(Request $request)
{
$result = $this->repository->listUser($request->all());
$resource = ExamUserResource::collection($result);
return $this->success($resource);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function store(Request $request)
{
$rules = [
'uid' => 'required',
];
$request->validate($rules);
$result = $this->repository->assignToUser($request->uid, $request->exam_id, $request->begin, $request->end);
$resource = new ExamResource($result);
return $this->success($resource);
}
/**
* Display the specified resource.
*
* @param int $id
* @return array
*/
public function show($id)
{
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return array
*/
public function update(Request $request, $id)
{
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return array
*/
public function destroy($id)
{
$result = $this->repository->removeExamUser($id);
return $this->success($result, 'Remove user exam success!');
}
}

View File

@@ -56,11 +56,12 @@ class UserController extends Controller
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
* @return array
*/
public function show($id)
{
//
$result = $this->repository->getDetail($id);
return $this->success($result);
}
/**
@@ -113,7 +114,7 @@ class UserController extends Controller
return $this->success($resource);
}
public function exams()
public function matchExams()
{
$id = Auth::id();
$examRepository = new ExamRepository();

View File

@@ -25,8 +25,11 @@ class ExamUserResource extends JsonResource
'status_text' => $this->statusText,
'created_at' => formatDatetime($this->created_at),
'progress' => $this->when($this->progress, $this->progress),
'progress_formatted' => $this->when($this->progress_formatted, $this->progress_formatted),
'begin' => formatDatetime($this->begin),
'end' => formatDatetime($this->end),
'uid' => $this->uid,
'exam_id' => $this->exam_id,
'user' => new UserResource($this->whenLoaded('user')),
'exam' => new ExamResource($this->whenLoaded('exam')),
];

View File

@@ -100,6 +100,11 @@ class User extends Authenticatable
'added' => 'datetime',
];
public static $commonFields = [
'id', 'username', 'email', 'class', 'status', 'added', 'avatar',
'uploaded', 'downloaded', 'seedbonus', 'seedtime', 'leechtime'
];
public function checkIsNormal(array $fields = ['status', 'enabled'])
{
if (in_array('visible', $fields) && $this->getAttribute('status') != self::STATUS_CONFIRMED) {

View File

@@ -9,6 +9,7 @@ use App\Models\Torrent;
use App\Models\User;
use Carbon\Carbon;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
class ExamRepository extends BaseRepository
{
@@ -150,13 +151,13 @@ class ExamRepository extends BaseRepository
/**
* assign exam to user
*
* @param $uid
* @param int $examId
* @param int $uid
* @param null $examId
* @param null $begin
* @param null $end
* @return mixed
*/
public function assignToUser($uid, $examId = 0, $begin = null, $end = null)
public function assignToUser(int $uid, $examId = null, $begin = null, $end = null)
{
$logPrefix = "uid: $uid, examId: $examId, begin: $begin, end: $end";
if ($examId > 0) {
@@ -247,13 +248,16 @@ class ExamRepository extends BaseRepository
return $newProgress;
}
public function getUserExamProgress($uid, $status = null)
public function getUserExamProgress($uid, $status = null, $with = ['exam', 'user'])
{
$logPrefix = "uid: $uid";
$query = ExamUser::query()->with(['exam', 'user'])->where('uid', $uid)->orderBy('exam_id', 'desc');
$query = ExamUser::query()->where('uid', $uid)->orderBy('exam_id', 'desc');
if ($status) {
$query->where('status', $status);
}
if (!empty($with)) {
$query->with($with);
}
$examUsers = $query->get();
if ($examUsers->isEmpty()) {
return null;
@@ -262,9 +266,15 @@ class ExamRepository extends BaseRepository
do_log("$logPrefix, user exam more than 1.", 'warning');
}
$examUser = $examUsers->first();
$exam = $examUser->exam;
if (empty($examUser->begin) || empty($examUser->end)) {
$examUser->begin = $exam->begin;
$examUser->end = $exam->end;
}
$progress = $this->calculateProgress($examUser);
do_log("$logPrefix, progress: " . nexus_json_encode($progress));
$examUser->progress = $progress;
$examUser->progress_formatted = $this->getProgressFormatted($exam, $progress);
return $examUser;
}
@@ -305,6 +315,49 @@ class ExamRepository extends BaseRepository
}
private function getProgressFormatted(Exam $exam, array $progress, $locale = null)
{
$result = [];
foreach ($exam->indexes as $key => $index) {
if (!isset($index['checked']) || !$index['checked']) {
continue;
}
$currentValue = $progress[$index['index']] ?? 0;
$requireValue = $index['require_value'];
switch ($index['index']) {
case Exam::INDEX_UPLOADED:
case Exam::INDEX_DOWNLOADED:
$currentValueFormatted = mksize($currentValue);
$requireValueAtomic = $requireValue * 1024 * 1024 * 1024;
break;
case Exam::INDEX_SEED_TIME_AVERAGE:
$currentValueFormatted = mkprettytime($currentValue);
$requireValueAtomic = $requireValue * 3600;
break;
default:
$currentValueFormatted = $currentValue;
$requireValueAtomic = $requireValue;
}
$index['require_value_formatted'] = "$requireValue {$index['unit']}";
$index['current_value'] = $currentValue;
$index['current_value_formatted'] = $currentValueFormatted;
$index['passed'] = $currentValue >= $requireValueAtomic;
$result[] = $index;
}
return $result;
}
public function removeExamUser(int $examUserId)
{
$examUser = ExamUser::query()->findOrFail($examUserId);
$result = DB::transaction(function () use ($examUser) {
$examUser->progresses()->delete();
return $examUser->delete();
});
return $result;
}

View File

@@ -1,6 +1,9 @@
<?php
namespace App\Repositories;
use App\Http\Resources\ExamUserResource;
use App\Http\Resources\UserResource;
use App\Models\ExamUser;
use App\Models\Setting;
use App\Models\User;
@@ -20,6 +23,27 @@ class UserRepository extends BaseRepository
return $user;
}
public function getDetail($id)
{
$user = User::query()->findOrFail($id, User::$commonFields);
$userResource = new UserResource($user);
$baseInfo = $userResource->response()->getData(true)['data'];
$examRep = new ExamRepository();
$examProgress = $examRep->getUserExamProgress($id, ExamUser::STATUS_NORMAL, ['exam']);
if ($examProgress) {
$examResource = new ExamUserResource($examProgress);
$examInfo = $examResource->response()->getData(true)['data'];
} else {
$examInfo = null;
}
return [
'base_info' => $baseInfo,
'exam_info' => $examInfo,
];
}
public function store(array $params)
{
$password = $params['password'];