33namespace ArieTimmerman \Laravel \SCIMServer ;
44
55use ArieTimmerman \Laravel \SCIMServer \Middleware \SCIMHeaders ;
6- use Illuminate \Support \Facades \Route ;
76use Illuminate \Routing \Middleware \SubstituteBindings ;
7+ use Illuminate \Support \Facades \Route ;
88
99/**
10- * Helper class for the URL shortener
10+ * Registers SCIM routes with configurable prefix, domain and middleware.
1111 */
1212class RouteProvider
1313{
14- protected static $ prefix = 'scim ' ;
1514
1615 public static function routes (array $ options = [])
1716 {
18-
17+ $ config = static ::getRoutingConfig ($ options );
18+
1919 if (!isset ($ options ['public_routes ' ]) || $ options ['public_routes ' ] === true ) {
20- static ::publicRoutes ($ options );
20+ static ::publicRoutes ([
21+ 'prefix ' => $ config ['prefix ' ],
22+ 'middleware ' => $ config ['public_middleware ' ],
23+ 'domain ' => $ config ['domain ' ],
24+ ]);
2125 }
2226
23- Route::prefix (static ::$ prefix )->group (
24- function () use ($ options ) {
25- Route::prefix ('v2 ' )->middleware ([
26- SubstituteBindings::class,
27- SCIMHeaders::class,
28- ])->group (
29- function () use ($ options ) {
30- static ::allRoutes ($ options );
31- }
32- );
33-
34- Route::get ('v1 ' , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \ResourceController::class, 'wrongVersion ' ]);
35- Route::prefix ('v1 ' )->group (
36- function () {
37- Route::fallback ([\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \ResourceController::class, 'wrongVersion ' ]);
38- }
39- );
40- }
41- );
27+ $ group = static ::buildRouteGroup ($ config , 'middleware ' );
28+
29+ Route::group ($ group , function () use ($ options ) {
30+ Route::prefix ('v2 ' )->middleware ([
31+ SubstituteBindings::class,
32+ SCIMHeaders::class,
33+ ])->group (function () use ($ options ) {
34+ static ::allRoutes ($ options );
35+ });
36+
37+ Route::get ('v1 ' , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \ResourceController::class, 'wrongVersion ' ]);
38+ Route::prefix ('v1 ' )->group (function () {
39+ Route::fallback ([\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \ResourceController::class, 'wrongVersion ' ]);
40+ });
41+ });
4242 }
4343
4444 public static function meRoutes (array $ options = [])
4545 {
46- Route::prefix (static ::$ prefix )->group (function () {
47- Route::get ("/v2/Me " , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \MeController::class, 'getMe ' ])->name ('scim.me.get ' );
46+ $ config = static ::getRoutingConfig ($ options );
47+ $ group = static ::buildRouteGroup ($ config , 'middleware ' );
48+
49+ Route::group ($ group , function () {
50+ Route::get ('/v2/Me ' , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \MeController::class, 'getMe ' ])->name ('scim.me.get ' );
4851 Route::put ('/v2/Me ' , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \MeController::class, 'replaceMe ' ])->name ('scim.me.put ' );
4952 });
5053 }
5154
5255 public static function meRoutePost (array $ options = [])
5356 {
54- Route::prefix (static ::$ prefix )->group (function () {
57+ $ config = static ::getRoutingConfig ($ options );
58+ $ group = static ::buildRouteGroup ($ config , 'middleware ' );
59+
60+ Route::group ($ group , function () {
5561 Route::post ('/v2/Me ' , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \MeController::class, 'createMe ' ])->name ('scim.me.post ' );
5662 });
5763 }
5864
5965 public static function publicRoutes (array $ options = [])
6066 {
61- Route::prefix (static ::$ prefix )->group (function () {
62- Route::get ("/v2/ServiceProviderConfig " , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \ServiceProviderController::class, 'index ' ])->name ('scim.serviceproviderconfig ' );
67+ if (isset ($ options ['prefix ' ]) && isset ($ options ['middleware ' ])) {
68+ $ config = $ options ;
69+ } else {
70+ $ config = static ::getRoutingConfig ($ options );
71+ $ config ['middleware ' ] = $ config ['public_middleware ' ];
72+ }
73+
74+ $ group = static ::buildRouteGroup ($ config , 'middleware ' );
6375
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 ' );
76+ Route::group ( $ group , function () {
77+ Route::get (' /v2/ServiceProviderConfig ' , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \ServiceProviderController ::class, 'index ' ])->name ('scim.serviceproviderconfig ' );
6678
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 ' );
79+ Route::get ('/v2/Schemas ' , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \SchemaController::class, 'index ' ]);
80+ Route::get ('/v2/Schemas/{id} ' , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \SchemaController::class, 'show ' ])->name ('scim.schemas ' );
81+
82+ Route::get ('/v2/ResourceTypes ' , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \ResourceTypesController::class, 'index ' ]);
83+ Route::get ('/v2/ResourceTypes/{id} ' , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \ResourceTypesController::class, 'show ' ])->name ('scim.resourcetype ' );
6984 });
7085 }
7186
@@ -75,18 +90,67 @@ private static function allRoutes(array $options = [])
7590 Route::get ('' , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \ResourceController::class, 'crossResourceIndex ' ]);
7691 Route::post ('.search ' , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \ResourceController::class, 'crossResourceSearch ' ]);
7792
78- Route::post (" /Bulk " , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \BulkController::class, 'processBulkRequest ' ]);
93+ Route::post (' /Bulk ' , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \BulkController::class, 'processBulkRequest ' ]);
7994
8095 // TODO: Use the attributes parameters ?attributes=userName, excludedAttributes=asdg,asdg (respect "returned" settings "always")
8196 Route::get ('/{resourceType}/{resourceObject} ' , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \ResourceController::class, 'show ' ])->name ('scim.resource ' );
82- Route::get (" /{resourceType} " , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \ResourceController::class, 'index ' ])->name ('scim.resources ' );
83- Route::post (" /{resourceType}/.search " , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \ResourceController::class, 'search ' ]);
84- Route::post (" /{resourceType} " , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \ResourceController::class, 'create ' ]);
97+ Route::get (' /{resourceType} ' , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \ResourceController::class, 'index ' ])->name ('scim.resources ' );
98+ Route::post (' /{resourceType}/.search ' , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \ResourceController::class, 'search ' ]);
99+ Route::post (' /{resourceType} ' , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \ResourceController::class, 'create ' ]);
85100
86- Route::put (" /{resourceType}/{resourceObject} " , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \ResourceController::class, 'replace ' ]);
87- Route::patch (" /{resourceType}/{resourceObject} " , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \ResourceController::class, 'update ' ]);
88- Route::delete (" /{resourceType}/{resourceObject} " , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \ResourceController::class, 'delete ' ]);
101+ Route::put (' /{resourceType}/{resourceObject} ' , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \ResourceController::class, 'replace ' ]);
102+ Route::patch (' /{resourceType}/{resourceObject} ' , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \ResourceController::class, 'update ' ]);
103+ Route::delete (' /{resourceType}/{resourceObject} ' , [\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \ResourceController::class, 'delete ' ]);
89104
90105 Route::fallback ([\ArieTimmerman \Laravel \SCIMServer \Http \Controllers \ResourceController::class, 'notImplemented ' ]);
91106 }
107+
108+ private static function getRoutingConfig (array $ options = []): array
109+ {
110+ $ path = $ options ['path ' ] ?? config ('scim.path ' , '/scim ' );
111+ $ domain = $ options ['domain ' ] ?? config ('scim.domain ' );
112+ $ protectedMiddleware = static ::normalizeMiddleware ($ options ['middleware ' ] ?? config ('scim.middleware ' , []));
113+ $ publicMiddleware = static ::normalizeMiddleware ($ options ['public_middleware ' ] ?? config ('scim.public_middleware ' , []));
114+
115+ $ prefix = trim ($ path , '/ ' );
116+ if (empty ($ prefix )) {
117+ $ prefix = 'scim ' ;
118+ }
119+
120+ return [
121+ 'prefix ' => $ prefix ,
122+ 'domain ' => $ domain ,
123+ 'middleware ' => $ protectedMiddleware ,
124+ 'public_middleware ' => $ publicMiddleware ,
125+ ];
126+ }
127+
128+ private static function buildRouteGroup (array $ config , string $ middlewareKey = 'middleware ' ): array
129+ {
130+ $ group = ['prefix ' => $ config ['prefix ' ]];
131+
132+ $ middleware = $ config [$ middlewareKey ] ?? [];
133+ if (!empty ($ middleware )) {
134+ $ group ['middleware ' ] = $ middleware ;
135+ }
136+
137+ if (!empty ($ config ['domain ' ])) {
138+ $ group ['domain ' ] = $ config ['domain ' ];
139+ }
140+
141+ return $ group ;
142+ }
143+
144+ private static function normalizeMiddleware ($ middleware ): array
145+ {
146+ if (empty ($ middleware )) {
147+ return [];
148+ }
149+
150+ if (is_string ($ middleware )) {
151+ $ middleware = array_filter (array_map ('trim ' , explode (', ' , $ middleware )));
152+ }
153+
154+ return is_array ($ middleware ) ? $ middleware : [$ middleware ];
155+ }
92156}
0 commit comments