1<?php
2
3// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0.
4// See the LICENCE file in the repository root for full licence text.
5
6namespace App\Models;
7
8use App\Casts\LegacyFilename;
9use App\Libraries\Uploader;
10use DB;
11use Illuminate\Database\Eloquent\SoftDeletes;
12use Illuminate\Http\UploadedFile;
13
14/**
15 * @property Contest $contest
16 * @property int|null $contest_id
17 * @property \Carbon\Carbon|null $created_at
18 * @property \Carbon\Carbon|null $deleted_at
19 * @property string|null $ext
20 * @property int|null $filesize
21 * @property string|null $hash
22 * @property int $id
23 * @property string|null $original_filename
24 * @property \Carbon\Carbon|null $updated_at
25 * @property User $user
26 * @property int|null $user_id
27 */
28class UserContestEntry extends Model
29{
30 use SoftDeletes;
31
32 protected $casts = [
33 'filename' => LegacyFilename::class,
34 ];
35
36 private Uploader $file;
37
38 public static function upload(UploadedFile $file, $user, $contest = null)
39 {
40 $entry = new static();
41
42 DB::transaction(function () use ($entry, $file, $user, $contest) {
43 $entry->save(); // get id
44
45 $entry->filesize = $file->getSize();
46 $entry->original_filename = $file->getClientOriginalName();
47 $entry->user()->associate($user);
48 $entry->contest()->associate($contest);
49 $entry->file()->store($file->getRealPath(), $file->getClientOriginalExtension());
50 $entry->save();
51 });
52
53 return $entry;
54 }
55
56 public function user()
57 {
58 return $this->belongsTo(User::class, 'user_id');
59 }
60
61 public function contest()
62 {
63 return $this->belongsTo(Contest::class);
64 }
65
66 public function delete()
67 {
68 $this->file()->delete();
69
70 return parent::delete();
71 }
72
73 public function file(): Uploader
74 {
75 return $this->file ??= new Uploader('user-contest-entries', $this, 'filename');
76 }
77
78 // file generated by process separate from osu-web
79 public function seasonalUrl(): ?string
80 {
81 $url = $this->file()->url();
82
83 return $url === null
84 ? null
85 : preg_replace('#(\.[^/.]+)$#', '', $url).'_opt.jpg';
86 }
87}