ptgen api point support parameter & default user

This commit is contained in:
xiaomlove
2022-02-28 23:20:42 +08:00
parent 5ed80ed637
commit b9d5df232b
51 changed files with 447 additions and 51 deletions
@@ -0,0 +1,63 @@
<?php
namespace App\Console\Commands;
use App\Models\User;
use Carbon\Carbon;
use Illuminate\Console\Command;
use Laravel\Sanctum\PersonalAccessToken;
class DeleteExpiredToken extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'user:delete_expired_token {--uid=} {--days=}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Delete user expired token, options: --uid, --days';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
$uid = $this->option('uid');
$days = $this->option('days');
if (!is_numeric($days)) {
$days = 60;
}
$query = PersonalAccessToken::query()->where('tokenable_type', User::class);
if ($uid) {
$query->where('tokenable_id', $uid);
}
$log = sprintf('uid: %s, days: %s', $uid, $days);
$this->info($log);
do_log($log);
$query->where('last_used_at', '<', Carbon::now()->subDays($days));
$result = $query->delete();
$log = sprintf('[%s], %s, result: %s, query: %s', REQUEST_ID, __METHOD__, var_export($result, true), last_query());
$this->info($log);
do_log($log);
return 0;
}
}
+1 -2
View File
@@ -60,8 +60,7 @@ class Test extends Command
*/
public function handle()
{
$now = Carbon::today();
dd($now->toDateTimeString());
}
}
+1
View File
@@ -28,6 +28,7 @@ class Kernel extends ConsoleKernel
$schedule->command('exam:checkout_cronjob')->everyMinute();
$schedule->command('backup:cronjob')->everyMinute();
$schedule->command('hr:update_status')->everyMinute();
$schedule->command('user:delete_expired_token')->dailyAt('04:00');
}
/**
@@ -0,0 +1,26 @@
<?php
namespace App\Http\Controllers;
use App\Repositories\AttendanceRepository;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class AttendanceController extends Controller
{
private $repository;
public function __construct(AttendanceRepository $repository)
{
$this->repository = $repository;
}
public function attend()
{
$uid = Auth::id();
$attendance = $this->repository->attend($uid);
return $this->success($attendance->toArray());
}
}
@@ -4,6 +4,7 @@ namespace App\Http\Controllers;
use App\Http\Resources\ExamResource;
use App\Http\Resources\UserResource;
use App\Models\Setting;
use App\Repositories\AuthenticateRepository;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
@@ -25,6 +26,13 @@ class AuthenticateController extends Controller
'password' => 'required',
]);
$result = $this->repository->login($request->username, $request->password);
$includes = explode(',', $request->get('include', ''));
if (in_array('site_info', $includes)) {
$basic = Setting::get('basic');
$result['site_info'] = [
'site_name' => $basic['SITENAME'],
];
}
return $this->success($result);
}
+96
View File
@@ -0,0 +1,96 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\NewsResource;
use App\Models\News;
use App\Repositories\NewsRepository;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
class NewsController extends Controller
{
private $repository;
public function __construct(NewsRepository $repository)
{
$this->repository = $repository;
}
private function getRules(): array
{
return [
'family_id' => 'required|numeric',
'name' => 'required|string',
'peer_id' => 'required|string',
'agent' => 'required|string',
'comment' => 'required|string',
];
}
/**
* Display a listing of the resource.
*
* @return array
*/
public function index(Request $request)
{
$result = $this->repository->getList($request->all());
$resource = NewsResource::collection($result);
return $this->success($resource);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$request->validate($this->getRules());
$result = $this->repository->store($request->all());
$resource = new NewsResource($result);
return $this->success($resource);
}
/**
* Display the specified resource.
*
* @param int $id
* @return array
*/
public function show($id)
{
$result = News::query()->findOrFail($id);
$resource = new NewsResource($result);
return $this->success($resource);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return array
*/
public function update(Request $request, $id)
{
$request->validate($this->getRules());
$result = $this->repository->update($request->all(), $id);
$resource = new NewsResource($result);
return $this->success($resource);
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return array
*/
public function destroy($id)
{
$result = $this->repository->delete($id);
return $this->success($result);
}
}
+1
View File
@@ -66,5 +66,6 @@ class Kernel extends HttpKernel
'permission' => \App\Http\Middleware\Permission::class,
'admin' => \App\Http\Middleware\Admin::class,
'locale' => \App\Http\Middleware\Locale::class,
'user' => \App\Http\Middleware\User::class,
];
}
+1
View File
@@ -29,4 +29,5 @@ class Locale
App::setLocale($locale);
return $next($request);
}
}
+40
View File
@@ -0,0 +1,40 @@
<?php
namespace App\Http\Middleware;
use Carbon\Carbon;
use Closure;
use Illuminate\Http\Request;
class User
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
return $next($request);
}
/**
* 在响应发送到浏览器后处理任务。
*
* @param \Illuminate\Http\Request $request
* @param \Illuminate\Http\Response $response
* @return void
*/
public function terminate($request, $response)
{
$user = $request->user();
$update = [
'last_access' => Carbon::now()
];
do_log("[ACTIVE] {$user->id}: " . nexus_json_encode($update));
$user->update($update);
}
}
+25
View File
@@ -0,0 +1,25 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class NewsResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'title' => $this->title,
'body' => $this->body,
'added' => $this->added,
'user' => new UserResource($this->whenLoaded('user'))
];
}
}
+2 -2
View File
@@ -17,11 +17,11 @@ class Comment extends NexusModel
public function create_user()
{
return $this->belongsTo(User::class, 'user');
return $this->belongsTo(User::class, 'user')->withDefault(User::getDefaultUserAttributes());
}
public function update_user()
{
return $this->belongsTo(User::class, 'editedby');
return $this->belongsTo(User::class, 'editedby')->withDefault(User::getDefaultUserAttributes());
}
}
+23
View File
@@ -0,0 +1,23 @@
<?php
namespace App\Models;
class News extends NexusModel
{
protected $table = 'news';
protected $fillable = [
'userid', 'added', 'title', 'body', 'notify',
];
protected $casts = [
'added' => 'datetime',
];
public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo
{
return $this->belongsTo(User::class, 'userid');
}
}
+1 -1
View File
@@ -108,7 +108,7 @@ class Torrent extends NexusModel
public function user()
{
return $this->belongsTo(User::class, 'owner');
return $this->belongsTo(User::class, 'owner')->withDefault(User::getDefaultUserAttributes());
}
public function thanks()
+25
View File
@@ -143,6 +143,31 @@ class User extends Authenticatable
'invited_by', 'enabled', 'seed_points',
];
public static function getDefaultUserAttributes(): array
{
return [
'id' => 0,
'username' => nexus_trans('user.deleted_username'),
'class' => self::CLASS_PEASANT,
'email' => '',
'status' => self::STATUS_CONFIRMED,
'added' => '1970-01-01 08:00:00',
'avatar' => '',
'uploaded' => 0,
'downloaded' => 0,
'seedbonus' => 0,
'seedtime' => 0,
'leechtime' => 0,
'enabled' => self::ENABLED_NO,
'seed_points' => 0
];
}
public static function defaultUser()
{
return new static(self::getDefaultUserAttributes());
}
public function checkIsNormal(array $fields = ['status', 'enabled'])
{
if (in_array('status', $fields) && $this->getAttribute('status') != self::STATUS_CONFIRMED) {
@@ -57,6 +57,7 @@ class AttendanceRepository extends BaseRepository
$attendance->update($update);
}
}
$attendance->added_time = $now->toTimeString();
$attendance->is_updated = $isUpdated;
do_log("[FINAL_ATTENDANCE]: " . $attendance->toJson());
return $attendance;
+2 -1
View File
@@ -3,6 +3,7 @@ namespace App\Repositories;
use App\Http\Resources\UserResource;
use App\Models\User;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\UnauthorizedException;
@@ -22,7 +23,7 @@ class AuthenticateRepository extends BaseRepository
$user->checkIsNormal();
$tokenName = __METHOD__ . __LINE__;
$token = DB::transaction(function () use ($user, $tokenName) {
$user->tokens()->delete();
$user->update(['last_login' => Carbon::now()]);
$tokenResult = $user->createToken($tokenName);
return $tokenResult->plainTextToken;
});
+44
View File
@@ -0,0 +1,44 @@
<?php
namespace App\Repositories;
use App\Models\News;
class NewsRepository extends BaseRepository
{
public function getList(array $params)
{
$query = News::query()->with(['user']);
if (!empty($params['userid'])) {
$query->where('userid', $params['userid']);
}
list($sortField, $sortType) = $this->getSortFieldAndType($params);
$query->orderBy($sortField, $sortType);
return $query->paginate();
}
public function store(array $params)
{
$model = News::query()->create($params);
return $model;
}
public function update(array $params, $id)
{
$model = News::query()->findOrFail($id);
$model->update($params);
return $model;
}
public function getDetail($id)
{
$model = News::query()->findOrFail($id);
return $model;
}
public function delete($id)
{
$model = News::query()->findOrFail($id);
$result = $model->delete();
return $result;
}
}
+12 -6
View File
@@ -80,17 +80,23 @@ class TorrentRepository extends BaseRepository
});
}
list($sortField, $sortType) = $this->getSortFieldAndType($params);
$query->orderBy($sortField, $sortType);
$query = $this->handleGetListSort($query, $params);
$with = ['user'];
$torrents = $query->with($with)
->orderBy('pos_state', 'desc')
->orderBy('id', 'desc')
->paginate();
$torrents = $query->with($with)->paginate();
return $torrents;
}
private function handleGetListSort(Builder $query, array $params)
{
if (empty($params['sort_field']) && empty($params['sort_type'])) {
//the default torrent list sort
return $query->orderBy('pos_state', 'desc')->orderBy('id', 'desc');
}
list($sortField, $sortType) = $this->getSortFieldAndType($params);
return $query->orderBy($sortField, $sortType);
}
public function getSearchBox($id = null)
{
if (is_null($id)) {