Skip to content

Commit 00f6208

Browse files
Merge pull request #18 from luadotsh/mobile-links
feat: added link targeting for ios and android
2 parents 8cffde4 + 271ce2d commit 00f6208

File tree

24 files changed

+639
-270
lines changed

24 files changed

+639
-270
lines changed

.env.ci

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
APP_ENV=testing
2+
APP_URL=https://lua.sh
3+
APP_KEY=base64:Zfo+2dkSaHvem5LCiZS/baYHv2Pv1vrSc0F2NaF29Ec=
4+
5+
LOG_CHANNEL=stack
6+
LOG_DEPRECATIONS_CHANNEL=null
7+
LOG_LEVEL=debug
8+
9+
BROADCAST_DRIVER=log
10+
CACHE_DRIVER=file
11+
FILESYSTEM_DISK=local
12+
QUEUE_CONNECTION=sync
13+
SESSION_DRIVER=file
14+
SESSION_LIFETIME=1440
15+
16+
MAIL_MAILER=log
17+
18+
# Stripe
19+
STRIPE_KEY=
20+
STRIPE_SECRET=
21+
STRIPE_WEBHOOK_SECRET=
22+
23+
# Sentry
24+
SENTRY_LARAVEL_DSN=
25+
SENTRY_TRACES_SAMPLE_RATE=1.0
26+
SENTRY_AUTH_TOKEN=
27+
SENTRY_ENVIRONMENT=
28+
29+
TELESCOPE_ENABLED=false
30+
31+
# Vite
32+
VITE_STRIPE_KEY="${STRIPE_KEY}"
33+
VITE_SENTRY_AUTH_TOKEN="${SENTRY_AUTH_TOKEN}"
34+
VITE_SENTRY_DSN_PUBLIC="${SENTRY_LARAVEL_DSN}"
35+
VITE_SENTRY_ENVIRONMENT="${SENTRY_ENVIRONMENT}"
36+
VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
37+
VITE_PUSHER_HOST="${PUSHER_HOST}"
38+
VITE_PUSHER_PORT="${PUSHER_PORT}"
39+
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
40+
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

.github/workflows/backend-tests.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,13 +69,13 @@ jobs:
6969
run: php artisan config:clear
7070

7171
- name: Run Migration
72-
run: php artisan migrate -v
72+
run: php artisan migrate:fresh --seed -v
7373
env:
7474
DB_PORT: ${{ job.services.mysql.ports['3306'] }}
7575
REDIS_PORT: ${{ job.services.redis.ports['6379'] }}
7676

7777
- name: Run PHP Unit Tests
78-
run: vendor/bin/phpunit
78+
run: vendor/bin/pest
7979
env:
8080
DB_PORT: ${{ job.services.mysql.ports['3306'] }}
8181
REDIS_PORT: ${{ job.services.redis.ports['6379'] }}

.github/workflows/commitlint.yml

Lines changed: 0 additions & 14 deletions
This file was deleted.

app/Enums/Link/Os.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Enums\Link;
6+
7+
enum Os: string
8+
{
9+
case ANDROID = 'Android';
10+
case IOS = 'iOS';
11+
case WINDOWS = 'Windows';
12+
case MACOS = 'MacOS';
13+
case LINUX = 'Linux';
14+
case UNKNOWN = 'Unknown OS';
15+
}

app/Http/Controllers/Api/LinkController.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ public function store(CreateRequest $request)
4949
'key' => $request->key,
5050
'url' => $request->url,
5151
'link' => "https://{$request->domain}/{$request->key}",
52+
'ios' => $request->ios,
53+
'android' => $request->android,
5254
'utm_source' => $request->utm_source,
5355
'utm_medium' => $request->utm_medium,
5456
'utm_campaign' => $request->utm_campaign,
@@ -75,6 +77,8 @@ public function update($id, UpdateRequest $request)
7577
'key' => $request->key,
7678
'url' => $request->url,
7779
'link' => "https://{$request->domain}/{$request->key}",
80+
'ios' => $request->ios,
81+
'android' => $request->android,
7882
'utm_source' => $request->utm_source,
7983
'utm_medium' => $request->utm_medium,
8084
'utm_campaign' => $request->utm_campaign,

app/Http/Controllers/LinkController.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ public function store(CreateRequest $request)
7878
'domain' => $request->domain,
7979
'key' => $key,
8080
'url' => $request->url,
81+
'ios' => $request->ios,
82+
'android' => $request->android,
8183
'link' => "https://{$request->domain}/{$key}",
8284
'utm_source' => $request->utm_source,
8385
'utm_medium' => $request->utm_medium,
@@ -108,6 +110,8 @@ public function update($id, UpdateRequest $request)
108110
'key' => $key,
109111
'url' => $request->url,
110112
'link' => "https://{$request->domain}/{$key}",
113+
'ios' => $request->ios,
114+
'android' => $request->android,
111115
'utm_source' => $request->utm_source,
112116
'utm_medium' => $request->utm_medium,
113117
'utm_campaign' => $request->utm_campaign,

app/Http/Controllers/RedirectController.php

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@
44

55
namespace App\Http\Controllers;
66

7+
use App\Services\UserAgentService;
8+
79
use Illuminate\Support\Facades\Gate;
810
use Illuminate\Http\RedirectResponse;
911
use Illuminate\Http\Request;
1012

13+
use App\Enums\Link\Os;
14+
1115
use App\Jobs\ProcessLinkStat;
1216

1317
use App\Models\Link;
@@ -20,7 +24,6 @@ public function __invoke($key, Request $request): RedirectResponse
2024
->with('workspace')
2125
->firstOrFail();
2226

23-
2427
$reachEventLimit = Gate::inspect('reached-event-limit', $link->workspace);
2528

2629
ProcessLinkStat::dispatchIf(
@@ -32,6 +35,24 @@ public function __invoke($key, Request $request): RedirectResponse
3235
$request->input('qr') ? true : false,
3336
$request->header('Referer')
3437
);
38+
39+
/**
40+
* If the link has an iOS or Android redirect URL, we need to check the user's OS
41+
* and redirect to the appropriate URL.
42+
*/
43+
if ($link->ios || $link->android) {
44+
$service = new UserAgentService();
45+
$os = $service->getOS($request->userAgent());
46+
47+
if ($os === Os::IOS->value && $link->ios) {
48+
return redirect($link->ios, 302);
49+
}
50+
51+
if ($os === Os::ANDROID->value && $link->android) {
52+
return redirect($link->android, 302);
53+
}
54+
}
55+
3556
return redirect($link->url, 302);
3657
}
3758
}

app/Http/Requests/Link/CreateRequest.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ public function rules(): array
4040
Rule::unique('links')->where('key', $this->key)->ignore($this->route('id')),
4141
],
4242
'url' => ['required', 'url', 'max:255', 'min:2'],
43-
43+
'ios' => ['nullable', 'url', 'max:255', 'min:2'],
44+
'android' => ['nullable', 'url', 'max:255', 'min:2'],
4445
'utm_source' => Rule::when(
4546
fn() => $this->utm_source,
4647
['required', 'string', 'max:255', 'min:2']

app/Http/Requests/Link/UpdateRequest.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ public function rules(): array
4040
Rule::unique('links')->where('key', $this->key)->ignore($this->route('id')),
4141
],
4242
'url' => ['required', 'url', 'max:255', 'min:2'],
43-
43+
'ios' => ['nullable', 'url', 'max:255', 'min:2'],
44+
'android' => ['nullable', 'url', 'max:255', 'min:2'],
4445
'utm_source' => Rule::when(
4546
fn() => $this->utm_source,
4647
['required', 'string', 'max:255', 'min:2']

app/Http/Resources/Api/LinkResource.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ public function toArray(Request $request): array
2020
'domain' => $this->domain,
2121
'key' => $this->key,
2222
'url' => $this->url,
23+
'ios' => $this->ios,
24+
'android' => $this->android,
2325
'link' => $this->link,
2426
'utm_source' => $this->utm_source,
2527
'utm_medium' => $this->utm_medium,

0 commit comments

Comments
 (0)