Skip to content

Commit f6f94a4

Browse files
Docker image improvements (limosa-io#122)
1 parent b2f41b8 commit f6f94a4

File tree

7 files changed

+177
-43
lines changed

7 files changed

+177
-43
lines changed

.github/workflows/ci.yml

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,8 @@ jobs:
99
strategy:
1010
matrix:
1111
php: [8.0, 8.1, 8.2]
12-
laravel: [8.*, 9.*, 10.*, 11.*, 12.*]
12+
laravel: [10.*, 11.*, 12.*]
1313
exclude:
14-
- laravel: 8.*
15-
php: 8.2
1614
- laravel: 10.*
1715
php: 8.0
1816
- laravel: 11.*
@@ -46,4 +44,24 @@ jobs:
4644
composer require "illuminate/console:${{ matrix.laravel }}" "illuminate/database:${{ matrix.laravel }}" "illuminate/support:${{ matrix.laravel }}" --no-interaction --no-update
4745
composer update
4846
- name: Run tests
49-
run: vendor/bin/phpunit
47+
run: vendor/bin/phpunit
48+
49+
docker:
50+
runs-on: ubuntu-latest
51+
needs: tests
52+
if: github.event_name == 'push' || github.event_name == 'pull_request'
53+
steps:
54+
- name: Checkout code
55+
uses: actions/checkout@v2
56+
- name: Log in to the Container registry
57+
uses: docker/login-action@v3
58+
with:
59+
registry: ghcr.io
60+
username: ${{ github.actor }}
61+
password: ${{ secrets.GITHUB_TOKEN }}
62+
- name: Build and push Docker image
63+
uses: docker/build-push-action@v5
64+
with:
65+
context: .
66+
push: true
67+
tags: ghcr.io/${{ github.repository }}:latest

Dockerfile

Lines changed: 116 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,122 @@ RUN jq '.repositories=[{"type": "path","url": "/laravel-scim-server"}]' ./compos
2020
RUN composer require arietimmerman/laravel-scim-server @dev && \
2121
composer require laravel/tinker
2222

23-
RUN touch ./.database.sqlite && \
24-
echo "DB_CONNECTION=sqlite" >> ./.env && \
25-
echo "DB_DATABASE=/.database.sqlite" >> ./.env && \
26-
echo "APP_URL=http://localhost:18123" >> ./.env
23+
RUN touch /example/database.sqlite && \
24+
echo "DB_CONNECTION=sqlite" >> /example/.env && \
25+
echo "DB_DATABASE=/example/database.sqlite" >> /example/.env && \
26+
echo "APP_URL=http://localhost:18123" >> /example/.env
2727

28+
29+
# Add migration for groups table using heredoc
30+
RUN cat > /example/database/migrations/2021_01_01_000001_create_groups_table.php <<'EOM'
31+
<?php
32+
33+
use Illuminate\Database\Migrations\Migration;
34+
use Illuminate\Database\Schema\Blueprint;
35+
use Illuminate\Support\Facades\Schema;
36+
37+
return new class extends Migration {
38+
public function up(): void
39+
{
40+
Schema::create('groups', function (Blueprint $table) {
41+
$table->id();
42+
$table->string('displayName')->unique();
43+
$table->timestamps();
44+
});
45+
}
46+
47+
public function down(): void
48+
{
49+
Schema::dropIfExists('groups');
50+
}
51+
};
52+
EOM
53+
54+
# Add Group model
55+
RUN cat > app/Models/Group.php <<'EOM'
56+
<?php
57+
58+
namespace App\Models;
59+
60+
use Illuminate\Database\Eloquent\Model;
61+
use Illuminate\Database\Eloquent\Factories\HasFactory;
62+
63+
class Group extends Model
64+
{
65+
use HasFactory;
66+
67+
protected $fillable = ['displayName'];
68+
}
69+
EOM
70+
71+
# Add Custom SCIM Config overriding Group model class
72+
RUN mkdir -p app/SCIM && cat > app/SCIM/CustomSCIMConfig.php <<'EOM'
73+
<?php
74+
75+
namespace App\SCIM;
76+
77+
use ArieTimmerman\Laravel\SCIMServer\SCIMConfig as BaseSCIMConfig;
78+
79+
class CustomSCIMConfig extends BaseSCIMConfig
80+
{
81+
public function getGroupConfig()
82+
{
83+
$config = parent::getGroupConfig();
84+
// Force the group model to the example app's Group model
85+
$config['class'] = \App\Models\Group::class;
86+
return $config;
87+
}
88+
}
89+
EOM
90+
91+
# Override AppServiceProvider to register custom SCIMConfig binding
92+
RUN cat > app/Providers/AppServiceProvider.php <<'EOM'
93+
<?php
94+
95+
namespace App\Providers;
96+
97+
use Illuminate\Support\ServiceProvider;
98+
use ArieTimmerman\Laravel\SCIMServer\SCIMConfig as BaseSCIMConfig;
99+
use App\SCIM\CustomSCIMConfig;
100+
101+
class AppServiceProvider extends ServiceProvider
102+
{
103+
public function register(): void
104+
{
105+
$this->app->singleton(BaseSCIMConfig::class, CustomSCIMConfig::class);
106+
}
107+
108+
public function boot(): void
109+
{
110+
// Additional boot logic if needed
111+
}
112+
}
113+
EOM
114+
115+
# Add Group factory
116+
RUN cat > database/factories/GroupFactory.php <<'EOM'
117+
<?php
118+
119+
namespace Database\Factories;
120+
121+
use App\Models\Group;
122+
use Illuminate\Database\Eloquent\Factories\Factory;
123+
124+
class GroupFactory extends Factory
125+
{
126+
protected $model = Group::class;
127+
128+
public function definition(): array
129+
{
130+
return [
131+
'displayName' => $this->faker->unique()->company(),
132+
];
133+
}
134+
}
135+
EOM
136+
137+
# Run migrations and seed demo data
28138
RUN php artisan migrate && \
29-
echo "User::factory()->count(100)->create();" | php artisan tinker
139+
echo "User::factory()->count(100)->create(); App\\Models\\Group::factory()->count(10)->create();" | php artisan tinker
30140
31-
CMD php artisan serve --host=0.0.0.0 --port=8000
141+
CMD ["php","artisan","serve","--host=0.0.0.0","--port=8000"]

composer.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
],
1212
"require": {
1313
"php": "^8.0",
14-
"illuminate/database": "^8.0|^9.0|^10.0|^11.0|^12.0",
15-
"illuminate/support": "^8.0|^9.0|^10.0|^11.0|^12.0",
16-
"illuminate/console": "^8.0|^9.0|^10.0|^11.0|^12.0",
14+
"illuminate/database": "^10.0|^11.0|^12.0",
15+
"illuminate/support": "^10.0|^11.0|^12.0",
16+
"illuminate/console": "^10.0|^11.0|^12.0",
1717
"tmilos/scim-schema": "^0.1.0",
1818
"tmilos/scim-filter-parser": "^1.3"
1919
},

docker-compose.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ services:
55
ports:
66
# forward xdebug ports
77
- "127.0.0.1:18123:8000"
8-
working_dir: /laravel-scim-server
8+
working_dir: /example
99
environment:
1010
- XDEBUG_MODE=debug
1111
- XDEBUG_SESSION=1

src/RouteProvider.php

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
<?php
2+
23
namespace ArieTimmerman\Laravel\SCIMServer;
34

5+
use ArieTimmerman\Laravel\SCIMServer\Middleware\SCIMHeaders;
46
use Illuminate\Support\Facades\Route;
7+
use Illuminate\Routing\Middleware\SubstituteBindings;
58

69
/**
710
* Helper class for the URL shortener
@@ -19,22 +22,19 @@ public static function routes(array $options = [])
1922

2023
Route::prefix(static::$prefix)->group(
2124
function () use ($options) {
22-
Route::prefix('v2')->middleware(
23-
[
24-
// TODO: Not loading this middleware introduces resolve issues. But having it, might slow things down.
25-
\Illuminate\Routing\Middleware\SubstituteBindings::class,
26-
'ArieTimmerman\Laravel\SCIMServer\Middleware\SCIMHeaders'
27-
]
28-
)->group(
25+
Route::prefix('v2')->middleware([
26+
SubstituteBindings::class,
27+
SCIMHeaders::class,
28+
])->group(
2929
function () use ($options) {
3030
static::allRoutes($options);
3131
}
3232
);
3333

34-
Route::get('v1', '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController@wrongVersion');
34+
Route::get('v1', [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController::class, 'wrongVersion']);
3535
Route::prefix('v1')->group(
3636
function () {
37-
Route::fallback('\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController@wrongVersion');
37+
Route::fallback([\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController::class, 'wrongVersion']);
3838
}
3939
);
4040
}
@@ -44,47 +44,47 @@ function () {
4444
public static function meRoutes(array $options = [])
4545
{
4646
Route::prefix(static::$prefix)->group(function () {
47-
Route::get("/v2/Me", '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\MeController@getMe')->name('scim.me.get');
48-
Route::put('/v2/Me', '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\MeController@replaceMe')->name('scim.me.put');
47+
Route::get("/v2/Me", [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\MeController::class, 'getMe'])->name('scim.me.get');
48+
Route::put('/v2/Me', [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\MeController::class, 'replaceMe'])->name('scim.me.put');
4949
});
5050
}
5151

5252
public static function meRoutePost(array $options = [])
5353
{
5454
Route::prefix(static::$prefix)->group(function () {
55-
Route::post('/v2/Me', '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\MeController@createMe')->name('scim.me.post');
55+
Route::post('/v2/Me', [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\MeController::class, 'createMe'])->name('scim.me.post');
5656
});
5757
}
5858

5959
public static function publicRoutes(array $options = [])
6060
{
6161
Route::prefix(static::$prefix)->group(function () {
62-
Route::get("/v2/ServiceProviderConfig", '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ServiceProviderController@index')->name('scim.serviceproviderconfig');
62+
Route::get("/v2/ServiceProviderConfig", [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ServiceProviderController::class, 'index'])->name('scim.serviceproviderconfig');
6363

64-
Route::get("/v2/Schemas", '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\SchemaController@index');
65-
Route::get("/v2/Schemas/{id}", '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\SchemaController@show')->name('scim.schemas');
64+
Route::get("/v2/Schemas", [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\SchemaController::class, 'index']);
65+
Route::get("/v2/Schemas/{id}", [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\SchemaController::class, 'show'])->name('scim.schemas');
6666

67-
Route::get("/v2/ResourceTypes", '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceTypesController@index');
68-
Route::get("/v2/ResourceTypes/{id}", '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceTypesController@show')->name('scim.resourcetype');
67+
Route::get("/v2/ResourceTypes", [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceTypesController::class, 'index']);
68+
Route::get("/v2/ResourceTypes/{id}", [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceTypesController::class, 'show'])->name('scim.resourcetype');
6969
});
7070
}
7171

7272
private static function allRoutes(array $options = [])
7373
{
74-
Route::post('.search', '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController@notImplemented');
74+
Route::post('.search', [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController::class, 'notImplemented']);
7575

76-
Route::post("/Bulk", '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\BulkController@processBulkRequest');
76+
Route::post("/Bulk", [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\BulkController::class, 'processBulkRequest']);
7777

7878
// TODO: Use the attributes parameters ?attributes=userName, excludedAttributes=asdg,asdg (respect "returned" settings "always")
79-
Route::get('/{resourceType}/{resourceObject}', '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController@show')->name('scim.resource');
80-
Route::get("/{resourceType}", '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController@index')->name('scim.resources');
81-
Route::post("/{resourceType}/.search", '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController@search');
82-
Route::post("/{resourceType}", '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController@create');
79+
Route::get('/{resourceType}/{resourceObject}', [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController::class, 'show'])->name('scim.resource');
80+
Route::get("/{resourceType}", [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController::class, 'index'])->name('scim.resources');
81+
Route::post("/{resourceType}/.search", [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController::class, 'search']);
82+
Route::post("/{resourceType}", [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController::class, 'create']);
8383

84-
Route::put("/{resourceType}/{resourceObject}", '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController@replace');
85-
Route::patch("/{resourceType}/{resourceObject}", '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController@update');
86-
Route::delete("/{resourceType}/{resourceObject}", '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController@delete');
84+
Route::put("/{resourceType}/{resourceObject}", [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController::class, 'replace']);
85+
Route::patch("/{resourceType}/{resourceObject}", [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController::class, 'update']);
86+
Route::delete("/{resourceType}/{resourceObject}", [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController::class, 'delete']);
8787

88-
Route::fallback('\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController@notImplemented');
88+
Route::fallback([\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController::class, 'notImplemented']);
8989
}
9090
}

src/SCIMConfig.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ public function getConfigForResource($name)
4444
return @$result[$name];
4545
}
4646

47+
public function getGroupClass()
48+
{
49+
return Group::class;
50+
}
51+
4752
public function getUserConfig()
4853
{
4954
return [

src/ServiceProvider.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
<?php
2+
23
/**
34
* Laravel service provider for registering the routes and publishing the configuration.
45
*/
@@ -14,7 +15,7 @@ public function boot(\Illuminate\Routing\Router $router)
1415
$this->loadMigrationsFrom(__DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'database' . DIRECTORY_SEPARATOR . 'migrations');
1516

1617
$this->publishes([
17-
__DIR__.'/../config/scim.php' => config_path('scim.php'),
18+
__DIR__ . '/../config/scim.php' => config_path('scim.php'),
1819
], 'laravel-scim');
1920

2021
// Match everything, except the Me routes
@@ -79,7 +80,7 @@ function ($id, $route) {
7980
public function register()
8081
{
8182
$this->mergeConfigFrom(
82-
__DIR__.'/../config/scim.php',
83+
__DIR__ . '/../config/scim.php',
8384
'scim'
8485
);
8586
}

0 commit comments

Comments
 (0)