[api] torrents add tags + promotion + pick

This commit is contained in:
xiaomlove
2022-03-13 21:45:48 +08:00
parent 367588528b
commit c611372ed8
11 changed files with 173 additions and 44 deletions

View File

@@ -33,9 +33,16 @@ class TorrentResource extends JsonResource
'seeders' => $this->seeders,
'times_completed' => $this->times_completed,
'numfiles' => $this->numfiles,
'sp_state' => $this->sp_state,
'sp_state_real' => $this->sp_state_real,
'sp_state_real_text' => $this->spStateRealText,
'hr' => $this->hr,
'pick_type' => $this->picktype,
'pick_time' => $this->picktime,
'download_url' => $this->download_url,
'user' => new UserResource($this->whenLoaded('user')),
'basic_category' => new CategoryResource($this->whenLoaded('basic_category')),
'tags' => TagResource::collection($this->whenLoaded('tags')),
];
$descriptionArr = format_description($this->descr);
$out['cover'] = get_image_from_description($descriptionArr, true);

View File

@@ -2,6 +2,8 @@
namespace App\Models;
use App\Repositories\TagRepository;
class Torrent extends NexusModel
{
protected $fillable = [
@@ -9,9 +11,11 @@ class Torrent extends NexusModel
'category', 'source', 'medium', 'codec', 'standard', 'processing', 'team', 'audiocodec',
'size', 'added', 'type', 'numfiles', 'owner', 'nfo', 'sp_state', 'promotion_time_type',
'promotion_until', 'anonymous', 'url', 'pos_state', 'cache_stamp', 'picktype', 'picktime',
'last_reseed', 'pt_gen', 'tags', 'technical_info'
'last_reseed', 'pt_gen', 'technical_info'
];
private static $globalPromotionState;
const VISIBLE_YES = 'yes';
const VISIBLE_NO = 'no';
@@ -49,6 +53,59 @@ class Torrent extends NexusModel
self::HR_YES => ['text' => 'YES'],
];
const PROMOTION_NORMAL = 1;
const PROMOTION_FREE = 2;
const PROMOTION_TWO_TIMES_UP = 3;
const PROMOTION_FREE_TWO_TIMES_UP = 4;
const PROMOTION_HALF_DOWN = 5;
const PROMOTION_HALF_DOWN_TWO_TIMES_UP = 6;
const PROMOTION_ONE_THIRD_DOWN = 7;
public static $promotionTypes = [
self::PROMOTION_NORMAL => ['text' => 'Normal', 'up_multiplier' => 1, 'down_multiplier' => 1],
self::PROMOTION_FREE => ['text' => 'Free', 'up_multiplier' => 1, 'down_multiplier' => 0],
self::PROMOTION_TWO_TIMES_UP => ['text' => '2X', 'up_multiplier' => 2, 'down_multiplier' => 1],
self::PROMOTION_FREE_TWO_TIMES_UP => ['text' => '2X Free', 'up_multiplier' => 2, 'down_multiplier' => 0],
self::PROMOTION_HALF_DOWN => ['text' => '50%', 'up_multiplier' => 1, 'down_multiplier' => 0.5],
self::PROMOTION_HALF_DOWN_TWO_TIMES_UP => ['text' => '2X 50%', 'up_multiplier' => 2, 'down_multiplier' => 0.5],
self::PROMOTION_ONE_THIRD_DOWN => ['text' => '30%', 'up_multiplier' => 1, 'down_multiplier' => 0.3],
];
public function getSpStateRealTextAttribute()
{
$spStateReal = $this->sp_state_real;
return self::$promotionTypes[$spStateReal]['text'] ?? '';
}
public function getSpStateRealAttribute()
{
$spState = $this->sp_state;
$global = self::getGlobalPromotionState();
$log = sprintf('torrent: %s sp_state: %s, global sp state: %s', $this->id, $spState, $global);
if ($global != self::PROMOTION_NORMAL) {
$spState = $global;
$log .= sprintf(", global != %s, set sp_state to global: %s", self::PROMOTION_NORMAL, $global);
}
if (!isset(self::$promotionTypes[$spState])) {
$log .= ", but now sp_state: $spState, is invalid, reset to: " . self::PROMOTION_NORMAL;
$spState = self::PROMOTION_NORMAL;
}
do_log($log, 'debug');
return $spState;
}
public static function getGlobalPromotionState()
{
if (is_null(self::$globalPromotionState)) {
$result = TorrentState::query()->first(['global_sp_state']);
if (!$result) {
do_log("global sp state no value", 'error');
}
self::$globalPromotionState = $result->global_sp_state ?? false;
}
return self::$globalPromotionState;
}
public function getHrAttribute(): string
{
$hrMode = Setting::get('hr.mode');
@@ -208,6 +265,7 @@ class Torrent extends NexusModel
public function tags(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
{
return $this->belongsToMany(Tag::class, 'torrent_tags', 'torrent_id', 'tag_id');
return $this->belongsToMany(Tag::class, 'torrent_tags', 'torrent_id', 'tag_id')
->orderByRaw(sprintf("field(`tags`.`id`,%s)", TagRepository::getOrderByFieldIdString()));
}
}

View File

@@ -0,0 +1,11 @@
<?php
namespace App\Models;
class TorrentState extends NexusModel
{
public $incrementing = false;
protected $table = 'torrents_state';
}

View File

@@ -116,7 +116,7 @@ class User extends Authenticatable
*/
protected $fillable = [
'username', 'email', 'passhash', 'secret', 'stylesheet', 'editsecret', 'added', 'modcomment', 'enabled', 'status',
'leechwarn', 'leechwarnuntil', 'page'
'leechwarn', 'leechwarnuntil', 'page', 'class'
];
/**

View File

@@ -9,6 +9,8 @@ use Nexus\Database\NexusDB;
class TagRepository extends BaseRepository
{
private static $orderByFieldIdString;
public function getList(array $params)
{
$query = $this->createBasicQuery();
@@ -41,7 +43,7 @@ class TagRepository extends BaseRepository
return $result;
}
public function createBasicQuery()
public static function createBasicQuery()
{
return Tag::query()->orderBy('priority', 'desc')->orderBy('id', 'desc');
}
@@ -127,5 +129,14 @@ class TagRepository extends BaseRepository
return count($values);
}
public static function getOrderByFieldIdString()
{
if (is_null(self::$orderByFieldIdString)) {
$results = self::createBasicQuery()->get(['id']);
self::$orderByFieldIdString = $results->isEmpty() ? '0' : $results->implode('id', ',');
}
return self::$orderByFieldIdString;
}
}

View File

@@ -82,7 +82,7 @@ class TorrentRepository extends BaseRepository
$query = $this->handleGetListSort($query, $params);
$with = ['user'];
$with = ['user', 'tags'];
$torrents = $query->with($with)->paginate();
$userArr = $user->toArray();
foreach($torrents as &$item) {

View File

@@ -66,27 +66,61 @@ class UserRepository extends BaseRepository
];
}
/**
* create user
*
* @param array $params must: username, email, password, password_confirmation. optional: id, class
* @return User
*/
public function store(array $params)
{
$password = $params['password'];
if ($password != $params['password_confirmation']) {
throw new \InvalidArgumentException("password confirmation != password");
}
$username = $params['username'];
if (!validusername($username)) {
throw new \InvalidArgumentException("Innvalid username: $username");
}
$email = htmlspecialchars(trim($params['email']));
$email = safe_email($email);
if (!check_email($email)) {
throw new \InvalidArgumentException("Innvalid email: $email");
}
if (User::query()->where('email', $email)->exists()) {
throw new \InvalidArgumentException("The email address: $email is already in use");
}
if (mb_strlen($password) < 6 || mb_strlen($password) > 40) {
throw new \InvalidArgumentException("Innvalid password: $password, it should be more than 6 character and less than 40 character");
}
$class = !empty($params['class']) ? intval($params['class']) : User::CLASS_USER;
if (!isset(User::$classes[$class])) {
throw new \InvalidArgumentException("Invalid user class: $class");
}
$setting = Setting::get('main');
$secret = mksecret();
$passhash = md5($secret . $password . $secret);
$data = [
'username' => $params['username'],
'email' => $params['email'],
'username' => $username,
'email' => $email,
'secret' => $secret,
'editsecret' => '',
'passhash' => $passhash,
'stylesheet' => $setting['defstylesheet'],
'added' => now()->toDateTimeString(),
'status' => User::STATUS_CONFIRMED,
'class' => $class
];
$user = User::query()->create($data);
$user = new User($data);
if ($params['id']) {
if (User::query()->where('id', $params['id'])->exists()) {
throw new \InvalidArgumentException("uid: {$params['id']} already exists.");
}
do_log("[CREATE_USER], specific id: " . $params['id']);
$user->id = $params['id'];
}
$user->save();
return $user;
}