the browser-facing portion of osu!
at master 2.3 kB view raw
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}