From 365ba978c029b69413d7bb387cec8f20f0bb099d Mon Sep 17 00:00:00 2001 From: Vari Date: Sun, 26 May 2024 04:11:40 +0200 Subject: [PATCH] Implemented Model,logic and response for inbox messages. --- .../Gamenews/Messages.bru | 14 ++++++- Deathgarden Rebirth Bruno/Login.bru | 5 +-- .../Player/Inbox/Message Count.bru | 15 ++++++++ .../Player/Inbox/Message List.bru | 15 ++++++++ Deathgarden Rebirth Bruno/bruno.json | 6 ++- .../Api/Player/InboxController.php | 38 ++++++++++++++++++- .../Responses/Api/Player/Inbox/Message.php | 21 ++++++++++ .../Api/Player/Inbox/MessagePayload.php | 29 ++++++++++++++ dist/app/Models/Game/Inbox/InboxMessage.php | 35 +++++++++++++++++ dist/app/Models/User/User.php | 6 +++ ..._20_024342_create_inbox_messages_table.php | 5 ++- dist/routes/deathgardenApi.php | 4 ++ 12 files changed, 185 insertions(+), 8 deletions(-) create mode 100644 Deathgarden Rebirth Bruno/Player/Inbox/Message Count.bru create mode 100644 Deathgarden Rebirth Bruno/Player/Inbox/Message List.bru create mode 100644 dist/app/Http/Responses/Api/Player/Inbox/Message.php create mode 100644 dist/app/Http/Responses/Api/Player/Inbox/MessagePayload.php diff --git a/Deathgarden Rebirth Bruno/Gamenews/Messages.bru b/Deathgarden Rebirth Bruno/Gamenews/Messages.bru index c93dbad..f6af6b5 100644 --- a/Deathgarden Rebirth Bruno/Gamenews/Messages.bru +++ b/Deathgarden Rebirth Bruno/Gamenews/Messages.bru @@ -6,6 +6,18 @@ meta { get { url: {{base_url}}/gamenews/messages - body: none + body: json auth: none } + +body:json { + { + "sortDesc": "true", + "gameVersion": "4417255", + "platform": "PC", + "language": "EN", + "messageType": "InGameNews", + "faction": "None", + "playerLevel": "1" + } +} diff --git a/Deathgarden Rebirth Bruno/Login.bru b/Deathgarden Rebirth Bruno/Login.bru index b244c5c..b4ae6c9 100644 --- a/Deathgarden Rebirth Bruno/Login.bru +++ b/Deathgarden Rebirth Bruno/Login.bru @@ -5,18 +5,17 @@ meta { } post { - url: {{base_url}}/api/v1/auth/provider/steam/login?token=14000000505f0d0530affc4cea13c01001001001f0625166180000000100000002000000ca33154d000000001f00000001000000be0000003e00000004000000ea13c01001001001b0790800ca33154d0df0adba000000000de743668d965f660100bb510600020042510d00000096f70d00000000001fed861443dc55d79afecdc5f3477acbc5bb923a42f3fc26384234870ad68a9c3ece15de481008470661c07686b127ef7315434ae8a1052b8a81dbc180b54399ec24d68c078d640bd7b2e36091c6e175be46ccd88f8161b67172504f7d8e6524091aa87d73f31f8e81bc61c6e7d85bd9f4b24c7abbe5a4e9f3c324b9d7cab73c + url: {{base_url}}/api/v1/auth/provider/steam/login?token=140000004377651d957f6b7cea13c0100100100131905266180000000100000002000000ca33154d000000001d00000001000000be0000003e00000004000000ea13c01001001001b0790800ca33154d0df0adba000000000de743668d965f660100bb510600020042510d00000096f70d00000000001fed861443dc55d79afecdc5f3477acbc5bb923a42f3fc26384234870ad68a9c3ece15de481008470661c07686b127ef7315434ae8a1052b8a81dbc180b54399ec24d68c078d640bd7b2e36091c6e175be46ccd88f8161b67172504f7d8e6524091aa87d73f31f8e81bc61c6e7d85bd9f4b24c7abbe5a4e9f3c324b9d7cab73c body: multipartForm auth: none } query { - token: 14000000505f0d0530affc4cea13c01001001001f0625166180000000100000002000000ca33154d000000001f00000001000000be0000003e00000004000000ea13c01001001001b0790800ca33154d0df0adba000000000de743668d965f660100bb510600020042510d00000096f70d00000000001fed861443dc55d79afecdc5f3477acbc5bb923a42f3fc26384234870ad68a9c3ece15de481008470661c07686b127ef7315434ae8a1052b8a81dbc180b54399ec24d68c078d640bd7b2e36091c6e175be46ccd88f8161b67172504f7d8e6524091aa87d73f31f8e81bc61c6e7d85bd9f4b24c7abbe5a4e9f3c324b9d7cab73c + token: 140000004377651d957f6b7cea13c0100100100131905266180000000100000002000000ca33154d000000001d00000001000000be0000003e00000004000000ea13c01001001001b0790800ca33154d0df0adba000000000de743668d965f660100bb510600020042510d00000096f70d00000000001fed861443dc55d79afecdc5f3477acbc5bb923a42f3fc26384234870ad68a9c3ece15de481008470661c07686b127ef7315434ae8a1052b8a81dbc180b54399ec24d68c078d640bd7b2e36091c6e175be46ccd88f8161b67172504f7d8e6524091aa87d73f31f8e81bc61c6e7d85bd9f4b24c7abbe5a4e9f3c324b9d7cab73c } headers { Content-Type: multipart/form-data - User-Agent: {{user_agent}} XDEBUG_SESSION: start } diff --git a/Deathgarden Rebirth Bruno/Player/Inbox/Message Count.bru b/Deathgarden Rebirth Bruno/Player/Inbox/Message Count.bru new file mode 100644 index 0000000..406a640 --- /dev/null +++ b/Deathgarden Rebirth Bruno/Player/Inbox/Message Count.bru @@ -0,0 +1,15 @@ +meta { + name: Message Count + type: http + seq: 1 +} + +get { + url: {{base_url}}/api/v1/messages/count?flag=NEW + body: none + auth: none +} + +query { + flag: NEW +} diff --git a/Deathgarden Rebirth Bruno/Player/Inbox/Message List.bru b/Deathgarden Rebirth Bruno/Player/Inbox/Message List.bru new file mode 100644 index 0000000..aaa04ee --- /dev/null +++ b/Deathgarden Rebirth Bruno/Player/Inbox/Message List.bru @@ -0,0 +1,15 @@ +meta { + name: Message List + type: http + seq: 1 +} + +get { + url: {{base_url}}/api/v1/messages/list + body: none + auth: none +} + +query { + limit: 100 +} \ No newline at end of file diff --git a/Deathgarden Rebirth Bruno/bruno.json b/Deathgarden Rebirth Bruno/bruno.json index cb526fa..9088b8d 100644 --- a/Deathgarden Rebirth Bruno/bruno.json +++ b/Deathgarden Rebirth Bruno/bruno.json @@ -5,5 +5,9 @@ "ignore": [ "node_modules", ".git" - ] + ], + "presets": { + "requestType": "http", + "requestUrl": "{{base_url}}/api/v1/" + } } \ No newline at end of file diff --git a/dist/app/Http/Controllers/Api/Player/InboxController.php b/dist/app/Http/Controllers/Api/Player/InboxController.php index 6c0959d..f3b508c 100644 --- a/dist/app/Http/Controllers/Api/Player/InboxController.php +++ b/dist/app/Http/Controllers/Api/Player/InboxController.php @@ -3,8 +3,11 @@ namespace App\Http\Controllers\Api\Player; use App\Http\Controllers\Controller; +use App\Models\Game\Inbox\InboxMessage; use Auth; use Illuminate\Http\Request; +use Illuminate\Pagination\LengthAwarePaginator; +use Illuminate\Support\Collection; class InboxController extends Controller { @@ -13,9 +16,42 @@ public function count(Request $request) { abort(403, 'You are not logged in'); $flag = $request->input('flag'); + $user = Auth::user(); //TODO: Add Model Retrieving logic + $query = $user->inboxMessages(); - return ['count' => 0]; + if($flag !== null) + $query->where('flag', '=', $flag); + + $count = $query->count(); + return ['count' => $count]; + } + + public function list(Request $request) { + if (!Auth::check()) + abort(403, 'You are not logged in'); + + $limit = $request->input('limit', 100); + $user = Auth::user(); + + /** @var InboxMessage[]|Collection|LengthAwarePaginator $messages */ + $messages = $user->inboxMessages()->paginate($limit); + + $result = [ + 'messages' => [], + ]; + + foreach ($messages as $message) { + $result['messages'][] = $message->toMessageResponse(); + $message->flag = 'READ'; + $message->save(); + } + + if($messages->currentPage() < $messages->lastPage()) { + $result['nextPage'] = $messages->currentPage() + 1; + } + + return $result; } } diff --git a/dist/app/Http/Responses/Api/Player/Inbox/Message.php b/dist/app/Http/Responses/Api/Player/Inbox/Message.php new file mode 100644 index 0000000..f46048e --- /dev/null +++ b/dist/app/Http/Responses/Api/Player/Inbox/Message.php @@ -0,0 +1,21 @@ + $this->title, + 'body' => $this->body, + ]; + + if($this->claimable !== null) + $data['claimable'] = $this->claimable; + + return $data; + } +} \ No newline at end of file diff --git a/dist/app/Models/Game/Inbox/InboxMessage.php b/dist/app/Models/Game/Inbox/InboxMessage.php index 382031b..92fe627 100644 --- a/dist/app/Models/Game/Inbox/InboxMessage.php +++ b/dist/app/Models/Game/Inbox/InboxMessage.php @@ -2,10 +2,45 @@ namespace App\Models\Game\Inbox; +use App\Http\Responses\Api\Player\Inbox\Message; +use App\Http\Responses\Api\Player\Inbox\MessagePayload; +use App\Models\User\User; +use Carbon\Carbon; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsTo; +/** + * @mixin IdeHelperInboxMessage + */ class InboxMessage extends Model { use HasFactory; + + protected $casts = [ + 'claimable' => 'array', + ]; + + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } + + public function toMessageResponse(): Message { + $message = new Message(); + + $message->received = $this->id; + $message->flag = $this->flag; + $message->message = new MessagePayload( + $this->title, + $this->body, + $this->claimable + ); + $message->tag = $this->tag; + $message->expireAt = $this->expire_at; + $message->origin = $this->origin; + $message->recipientId = $this->user->id; + + return $message; + } } diff --git a/dist/app/Models/User/User.php b/dist/app/Models/User/User.php index c8c5aa0..b136eae 100644 --- a/dist/app/Models/User/User.php +++ b/dist/app/Models/User/User.php @@ -3,6 +3,7 @@ namespace App\Models\User; use App\Enums\Game\Matchmaking\MatchStatus; +use App\Models\Game\Inbox\InboxMessage; use App\Models\Game\Matchmaking\Game; use Cache; use Illuminate\Contracts\Cache\LockTimeoutException; @@ -66,6 +67,11 @@ public function activeGames(): BelongsToMany ->whereIn('status', [MatchStatus::Created->value, MatchStatus::Opened->value])->withTimestamps(); } + public function inboxMessages(): HasMany + { + return $this->hasMany(InboxMessage::class); + } + public static function findBySteamID(int $steamId): User|null { return static::where('steam_id', $steamId)->first(); diff --git a/dist/database/migrations/2024_05_20_024342_create_inbox_messages_table.php b/dist/database/migrations/2024_05_20_024342_create_inbox_messages_table.php index a695977..ca6b0d8 100644 --- a/dist/database/migrations/2024_05_20_024342_create_inbox_messages_table.php +++ b/dist/database/migrations/2024_05_20_024342_create_inbox_messages_table.php @@ -13,13 +13,14 @@ public function up(): void { Schema::create('inbox_messages', function (Blueprint $table) { $table->id(); + $table->foreignUuid('user_id')->constrained(); $table->text('title'); $table->text('body'); $table->string('flag', 10); $table->string('tag', 30); - $table->datetime('expire_at'); + $table->datetime('expire_at')->nullable(); $table->string('origin')->nullable()->default(null); - $table->json('claimables')->nullable()->default(null); + $table->json('claimable')->nullable(); $table->timestamps(); }); diff --git a/dist/routes/deathgardenApi.php b/dist/routes/deathgardenApi.php index 61ae1db..534b443 100644 --- a/dist/routes/deathgardenApi.php +++ b/dist/routes/deathgardenApi.php @@ -5,6 +5,7 @@ use App\Http\Controllers\Api\Matchmaking\MatchmakingController; use App\Http\Controllers\Api\Player\ChallengeController; use App\Http\Controllers\Api\Player\CurrencyController; +use App\Http\Controllers\Api\Player\InboxController; use App\Http\Controllers\Api\Player\MetadataController; use App\Http\Controllers\Api\Player\ModifierCenterController; use App\Http\Controllers\Api\Player\PlayerController; @@ -43,6 +44,9 @@ Route::get('players/ban/status', [PlayerController::class, 'getBanStatus']); Route::get('modifierCenter/modifiers/me', [ModifierCenterController::class, 'modifiersMe']); + Route::get('messages/count', [InboxController::class, 'count']); + Route::get('messages/list', [InboxController::class, 'list']); + Route::post('extensions/progression/initOrGetGroups', [MetadataController::class, 'initOrGetGroups']); Route::post('extensions/progression/updateMetadataGroup', [MetadataController::class, 'updateMetadataGroup']);