Skip to content

Commit

Permalink
Merge pull request #1153 from shikorism/develop
Browse files Browse the repository at this point in the history
Release 2024.1.0
  • Loading branch information
shibafu528 authored Jan 6, 2024
2 parents 7ed5e91 + 28eda85 commit d684ce9
Show file tree
Hide file tree
Showing 49 changed files with 5,317 additions and 2,961 deletions.
3 changes: 2 additions & 1 deletion app/CheckinWebhook.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@

namespace App;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Str;

class CheckinWebhook extends Model
{
use SoftDeletes;
use SoftDeletes, HasFactory;

/** @var int ユーザーごとの作成数制限 */
const PER_USER_LIMIT = 10;
Expand Down
3 changes: 3 additions & 0 deletions app/ContentProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,13 @@

namespace App;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class ContentProvider extends Model
{
use HasFactory;

public $incrementing = false;
protected $primaryKey = 'host';
protected $keyType = 'string';
Expand Down
3 changes: 2 additions & 1 deletion app/Ejaculation.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@

use App\Utilities\Formatter;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Staudenmeir\EloquentEagerLimit\HasEagerLimit;

class Ejaculation extends Model
{
use HasEagerLimit;
use HasEagerLimit, HasFactory;

const SOURCE_WEB = 'web';
const SOURCE_CSV = 'csv';
Expand Down
3 changes: 3 additions & 0 deletions app/Http/Controllers/Api/V1/UserCheckinController.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ public function index(Request $request, User $user)
SQL
))
->where('user_id', $user->id);
if ($request->boolean('has_link')) {
$query = $query->where('link', '<>', '');
}
if (!Auth::check() || $user->id !== Auth::id()) {
$query = $query->where('is_private', false);
}
Expand Down
53 changes: 53 additions & 0 deletions app/Http/Controllers/Api/V1/UserStats/DailyCheckinSummary.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<?php
declare(strict_types=1);

namespace App\Http\Controllers\Api\V1\UserStats;

use App\Http\Controllers\Controller;
use App\Queries\EjaculationCountByDay;
use App\User;
use Carbon\CarbonImmutable;
use Illuminate\Http\Request;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;

class DailyCheckinSummary extends Controller
{
public function __invoke(Request $request, User $user)
{
if (!$user->isMe() && $user->is_protected) {
throw new AccessDeniedHttpException('このユーザはチェックイン履歴を公開していません');
}

$validated = $request->validate([
'since' => 'nullable|date_format:Y-m-d|after_or_equal:2000-01-01|before_or_equal:2099-12-31',
'until' => 'nullable|date_format:Y-m-d|after_or_equal:2000-01-01|before_or_equal:2099-12-31',
]);

if (!empty($validated['since']) && !empty($validated['until'])) {
$since = CarbonImmutable::createFromFormat('Y-m-d', $validated['since'])->startOfDay();
$until = CarbonImmutable::createFromFormat('Y-m-d', $validated['until'])->startOfDay()->addDay();
if ($until->isBefore($since)) {
[$since, $until] = [$until, $since];
}
} elseif (!empty($validated['since'])) {
$since = CarbonImmutable::createFromFormat('Y-m-d', $validated['since'])->startOfDay();
$until = null;
} elseif (!empty($validated['until'])) {
$since = null;
$until = CarbonImmutable::createFromFormat('Y-m-d', $validated['until'])->startOfDay()->addDay();
} else {
$since = null;
$until = null;
}

$countByDay = (new EjaculationCountByDay($user))->query();
if ($since !== null) {
$countByDay = $countByDay->where('ejaculated_date', '>=', $since);
}
if ($until !== null) {
$countByDay = $countByDay->where('ejaculated_date', '<', $until);
}

return response()->json($countByDay->get());
}
}
76 changes: 76 additions & 0 deletions app/Http/Controllers/Api/V1/UserStats/HourlyCheckinSummary.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
<?php
declare(strict_types=1);

namespace App\Http\Controllers\Api\V1\UserStats;

use App\Ejaculation;
use App\Http\Controllers\Controller;
use App\User;
use Carbon\CarbonImmutable;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;

class HourlyCheckinSummary extends Controller
{
public function __invoke(Request $request, User $user)
{
if (!$user->isMe() && $user->is_protected) {
throw new AccessDeniedHttpException('このユーザはチェックイン履歴を公開していません');
}

$validated = $request->validate([
'since' => 'nullable|date_format:Y-m-d|after_or_equal:2000-01-01|before_or_equal:2099-12-31',
'until' => 'nullable|date_format:Y-m-d|after_or_equal:2000-01-01|before_or_equal:2099-12-31',
]);

if (!empty($validated['since']) && !empty($validated['until'])) {
$since = CarbonImmutable::createFromFormat('Y-m-d', $validated['since'])->startOfDay();
$until = CarbonImmutable::createFromFormat('Y-m-d', $validated['until'])->startOfDay()->addDay();
if ($until->isBefore($since)) {
[$since, $until] = [$until, $since];
}
} elseif (!empty($validated['since'])) {
$since = CarbonImmutable::createFromFormat('Y-m-d', $validated['since'])->startOfDay();
$until = null;
} elseif (!empty($validated['until'])) {
$since = null;
$until = CarbonImmutable::createFromFormat('Y-m-d', $validated['until'])->startOfDay()->addDay();
} else {
$since = null;
$until = null;
}

$dateCondition = [];
if ($since !== null) {
$dateCondition[] = ['ejaculated_date', '>=', $since];
}
if ($until !== null) {
$dateCondition[] = ['ejaculated_date', '<', $until];
}

$groupByHour = Ejaculation::select(DB::raw(
<<<'SQL'
to_char(ejaculated_date, 'HH24') AS "hour",
count(*) AS "count"
SQL
))
->where('user_id', $user->id)
->where($dateCondition)
->groupBy(DB::raw("to_char(ejaculated_date, 'HH24')"))
->orderBy(DB::raw('1'))
->get();

$results = [];
for ($hour = 0; $hour < 24; $hour++) {
if (!empty($groupByHour) && (int)($groupByHour->first()->hour) === $hour) {
$data = $groupByHour->shift();
$results[] = ['hour' => $hour, 'count' => $data->count];
} else {
$results[] = ['hour' => $hour, 'count' => 0];
}
}

return response()->json($results);
}
}
52 changes: 52 additions & 0 deletions app/Http/Controllers/Api/V1/UserStats/MostlyUsedCheckinTags.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<?php
declare(strict_types=1);

namespace App\Http\Controllers\Api\V1\UserStats;

use App\Http\Controllers\Controller;
use App\Queries\CountUsedTags;
use App\User;
use Carbon\CarbonImmutable;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;

class MostlyUsedCheckinTags extends Controller
{
public function __invoke(Request $request, User $user)
{
if (!$user->isMe() && $user->is_protected) {
throw new AccessDeniedHttpException('このユーザはチェックイン履歴を公開していません');
}

$validated = $request->validate([
'since' => 'nullable|date_format:Y-m-d|after_or_equal:2000-01-01|before_or_equal:2099-12-31',
'until' => 'nullable|date_format:Y-m-d|after_or_equal:2000-01-01|before_or_equal:2099-12-31',
]);

if (!empty($validated['since']) && !empty($validated['until'])) {
$since = CarbonImmutable::createFromFormat('Y-m-d', $validated['since'])->startOfDay();
$until = CarbonImmutable::createFromFormat('Y-m-d', $validated['until'])->startOfDay()->addDay();
if ($until->isBefore($since)) {
[$since, $until] = [$until, $since];
}
} elseif (!empty($validated['since'])) {
$since = CarbonImmutable::createFromFormat('Y-m-d', $validated['since'])->startOfDay();
$until = null;
} elseif (!empty($validated['until'])) {
$since = null;
$until = CarbonImmutable::createFromFormat('Y-m-d', $validated['until'])->startOfDay()->addDay();
} else {
$since = null;
$until = null;
}

$result = (new CountUsedTags(Auth::user(), $user))
->since($since)
->until($until)
->setIncludesMetadata($request->boolean('includesMetadata'))
->query();

return response()->json($result);
}
}
74 changes: 74 additions & 0 deletions app/Http/Controllers/Api/V1/UserStats/MostlyUsedLinks.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
<?php
declare(strict_types=1);

namespace App\Http\Controllers\Api\V1\UserStats;

use App\Http\Controllers\Controller;
use App\User;
use Carbon\CarbonImmutable;
use Carbon\CarbonInterface;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;

class MostlyUsedLinks extends Controller
{
public function __invoke(Request $request, User $user)
{
if (!$user->isMe() && $user->is_protected) {
throw new AccessDeniedHttpException('このユーザはチェックイン履歴を公開していません');
}

$validated = $request->validate([
'since' => 'nullable|date_format:Y-m-d|after_or_equal:2000-01-01|before_or_equal:2099-12-31',
'until' => 'nullable|date_format:Y-m-d|after_or_equal:2000-01-01|before_or_equal:2099-12-31',
]);

if (!empty($validated['since']) && !empty($validated['until'])) {
$since = CarbonImmutable::createFromFormat('Y-m-d', $validated['since'])->startOfDay();
$until = CarbonImmutable::createFromFormat('Y-m-d', $validated['until'])->startOfDay()->addDay();
if ($until->isBefore($since)) {
[$since, $until] = [$until, $since];
}

if ($until->diffInYears($since) >= 1) {
$until = $since->addYear();
}
} elseif (!empty($validated['since'])) {
$since = CarbonImmutable::createFromFormat('Y-m-d', $validated['since'])->startOfDay();
$until = $since->addYear();
} elseif (!empty($validated['until'])) {
$until = CarbonImmutable::createFromFormat('Y-m-d', $validated['until'])->startOfDay()->addDay();
$since = $until->subYear();
} else {
$since = CarbonImmutable::now()->startOfDay()->firstOfYear();
$until = CarbonImmutable::now()->startOfDay()->firstOfYear()->addYear();
}

return response()->json($this->countMostFrequentlyUsedOkazu($user, $since, $until));
}

private function countMostFrequentlyUsedOkazu(User $user, CarbonInterface $dateSince = null, CarbonInterface $dateUntil = null)
{
$sql = <<<SQL
SELECT normalized_link as link, count(*) as count
FROM ejaculations e
WHERE user_id = ? AND is_private IN (?, ?) AND ejaculated_date >= ? AND ejaculated_date < ? AND normalized_link <> ''
GROUP BY normalized_link HAVING count(*) >= 2
ORDER BY count DESC, normalized_link
LIMIT 10
SQL;

if ($dateSince === null) {
$dateSince = CarbonImmutable::minValue();
}
if ($dateUntil === null) {
$dateUntil = now()->addMonth()->startOfMonth();
}

return DB::select(DB::raw($sql), [
$user->id, false, Auth::check() && $user->id === Auth::id(), $dateSince, $dateUntil
]);
}
}
3 changes: 2 additions & 1 deletion app/Like.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@

namespace App;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Staudenmeir\EloquentEagerLimit\HasEagerLimit;

class Like extends Model
{
use HasEagerLimit;
use HasEagerLimit, HasFactory;

protected $fillable = ['user_id', 'ejaculation_id'];

Expand Down
2 changes: 1 addition & 1 deletion app/MetadataResolver/FanzaResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public function resolve(string $url): Metadata
$metadata->title = trim($crawler->filter('#title')->text(''));
$metadata->description = trim(strip_tags(str_replace('【FANZA(ファンザ)】', '', $crawler->filter('meta[name="description"]')->attr('content'))));
$metadata->image = preg_replace("~(pr|ps)\.jpg$~", 'pl.jpg', $crawler->filter('meta[property="og:image"]')->attr('content'));
$metadata->tags = $this->array_finish($crawler->filter('.box-rank+table a[href*="list/=/article="]')->extract(['_text']));
$metadata->tags = $this->array_finish($crawler->filter('.box-rank+table a[href*="list/?"]')->extract(['_text']));

return $metadata;
}
Expand Down
Loading

0 comments on commit d684ce9

Please sign in to comment.