SDSM:Pending Changes: Difference between revisions

From SMUSwiki
Jump to navigation Jump to search
(Move item about timeout fix on sub-dir sites from Pending to Historical.)
(Add subsection Changes For directorytree/ldaprecord-laravel Upgrade.)
 
(3 intermediate revisions by the same user not shown)
Line 21: Line 21:
== SDS Laravel: Changes to Third-Party Dependencies ==
== SDS Laravel: Changes to Third-Party Dependencies ==


=== 2024 May 21: Upgrade Laravel from 8.x to 10.x ===
=== 2024 Jun 12: Upgrade To Laravel 10 and Vue 3 ===
 
==== Summary of PHP Dependency Upgrades or Removals ====


This task updated <code>composer.json</code> to require the latest
This task updated <code>composer.json</code> to require the latest
PHP-8.1-compatible major version of the PHP library dependency Laravel,
PHP-8.1-compatible versions of all PHP library dependencies,
thus taking it from <code>8.x</code> to <code>10.x</code>.
in particular taking Laravel from <code>8.x</code> to <code>10.x</code>.


To be more specific, it made these dependency changes:
To be specific, it made these dependency changes:


* barryvdh/laravel-debugbar (^3.7 to ^3.13.5)
* barryvdh/laravel-debugbar (^3.7 to ^3.13.5)
* directorytree/ldaprecord-laravel (^2.7.3 unchanged but upgrade exists)
* directorytree/ldaprecord-laravel (^2.7.3 to ^3.3.2)
* etern8ty/beanstream (dev-master unchanged but upgrade exists)
* etern8ty/beanstream (dev-master unchanged but upgrade exists)
* fakerphp/faker (^1.23.1 unchanged)
* fakerphp/faker (^1.23.1 unchanged)
Line 39: Line 41:
* juliomotol/laravel-auth-timeout (^3.1.1 to ^4.1)
* juliomotol/laravel-auth-timeout (^3.1.1 to ^4.1)
* lab404/laravel-impersonate (^1.7.5)
* lab404/laravel-impersonate (^1.7.5)
* laravel/framework (^8.83.27 to ^10.48.11)
* laravel/framework (^8.83.27 to ^10.48.12)
* laravel/helpers (^1.7 unchanged but possibly no longer needed)
* laravel/helpers (^1.7 unchanged but possibly no longer needed)
* laravel/tinker (^2.9 unchanged)
* laravel/tinker (^2.9 unchanged)
Line 46: Line 48:
* nunomaduro/collision (^5.11 to ^7.10)
* nunomaduro/collision (^5.11 to ^7.10)
* phpunit/phpunit (^10.5.20 unchanged)
* phpunit/phpunit (^10.5.20 unchanged)
* spatie/laravel-ignition (^1.6.4 to ^2.7)
* spatie/laravel-ignition (^1.6.4 to ^2.8)
* staudenmeir/eloquent-has-many-deep (^1.14.4 to ^1.19.3)
* staudenmeir/eloquent-has-many-deep (^1.14.4 to ^1.19.4)
 
==== Summary of JavaScript Dependency Upgrades or Removals ====
 
This task updated <code>package.json</code> to require the latest
versions of all JavaScript library dependencies,
in particular taking Vue from <code>2.x</code> to <code>3.x</code>.
 
To be specific, it made these dependency changes:
 
* @fortawesome/fontawesome-free (^5.15.4 unchanged)
* axios (^0.27.2 unchanged)
* bootstrap (^4.6.2 unchanged)
* bootstrap-select (^1.13.18 unchanged)
* cross-env (^7.0.3 unchanged)
* font-awesome (^4.7.0 unchanged)
* jquery (^3.7.1 unchanged)
* jquery-ui (^1.13.3 unchanged)
* laravel-mix (^5.0.9 unchanged)
* lodash (^4.17.21 unchanged)
* moment (^2.30.1 unchanged)
* popper.js (^1.16.1 unchanged)
* resolve-url-loader (^3.1.5 unchanged)
* sass (^1.77.4 unchanged)
* sass-loader (^8.0.2 unchanged)
* tempusdominus-bootstrap-4 (^5.39.2 unchanged)
* tempusdominus-core (^5.19.3 unchanged)
* vue (^2.7.16 unchanged)
* vue-bootstrap-datetimepicker (^5.0.1 unchanged)
* vue-template-compiler (^2.7.16 unchanged)
 
==== Changes For goldspecdigital/laravel-eloquent-uuid Removal ====


This task also updated these 5 PHP source files to be compatible with the
This task also updated these 5 PHP source files to be compatible with the
Line 85: Line 118:
This task also deleted the single PHP file
This task also deleted the single PHP file
<code>app/Models/Traits/Uuids.php</code> as it appeared to be unused.
<code>app/Models/Traits/Uuids.php</code> as it appeared to be unused.
==== Changes For fideloper/proxy Removal ====


This task also updated <code>app/Http/Middleware/TrustProxies.php</code> to
This task also updated <code>app/Http/Middleware/TrustProxies.php</code> to
Line 106: Line 141:
         Request::HEADER_X_FORWARDED_PROTO |
         Request::HEADER_X_FORWARDED_PROTO |
         Request::HEADER_X_FORWARDED_AWS_ELB;
         Request::HEADER_X_FORWARDED_AWS_ELB;
==== Changes For juliomotol/laravel-auth-timeout Upgrade ====


This task also updated
This task also updated
Line 123: Line 160:
See https://github.com/juliomotol/laravel-auth-timeout/blob/master/CHANGELOG.md
See https://github.com/juliomotol/laravel-auth-timeout/blob/master/CHANGELOG.md
for more change details and upgrade notes on that.
for more change details and upgrade notes on that.
==== Changes For directorytree/ldaprecord-laravel Upgrade ====
This task also made 3 distinct sets of changes to be compatible with the
<code>directorytree/ldaprecord-laravel</code> upgrade.
See also for context:
* https://ldaprecord.com/docs/laravel/v3/upgrading/
* https://ldaprecord.com/docs/laravel/v3/release-notes/
* https://github.com/DirectoryTree/LdapRecord-Laravel/releases
The first set of changes...
This task updated the 1 PHP config source file <code>config/ldap.php</code>
to account for <code>logging</code> now being an array. There was this 1
substitution:
    'logging' => env('LDAP_LOGGING', true),
    'logging' => [
        'enabled' => env('LDAP_LOGGING', true),
    ],
The second set of changes...
For context, <code>directorytree/ldaprecord-laravel</code> had a PHP trait
named <code>LdapRecord\Laravel\Auth\MultiDomainAuthentication</code> which
was deprecated before version <code>2.7.3</code> and removed in version
<code>3.0.0</code>. The 1 SDS PHP source file
<code>app/Http/Controllers/Auth/LoginController.php</code> used that trait.
This task updated <code>LoginController</code> to clone into itself the
used portions of <code>MultiDomainAuthentication</code>, thus removing the
external dependency of the former on the latter.
As the removed trait was itself a sub-trait of
<code>LdapRecord\Laravel\Auth\CreatesUserProvider</code>,
<code>LoginController</code> now composed that directly and not indirectly.
Also <code>LoginController</code> gained the new protected function
<code>getLdapGuard</code> cloned from the removed trait.
Note that the function <code>getLdapGuardFromRequest</code> was ''not''
cloned from the removed trait since <code>LoginController</code> already
had its own version that overrode it.
The third set of changes...
For context, each of these 5 SDS classes composed one of the 2 classes
<code>LdapRecord\Models\Model</code> or <code>LdapRecord\Models\Scope</code>:
* app/Ldap/ExternalUser.php
* app/Ldap/Scopes/OnlyStaffUsers.php
* app/Ldap/Scopes/OnlyStudents.php
* app/Ldap/SmusStudents.php
* app/Ldap/SmusUser.php
For each of those 5, it was updated such that for any property or method it
contained which overrode or implemented a same-named one from
<code>Model</code> or <code>Scope</code>, that property or method had
explicit type annotations added to match the originals. This was required
for the SDS code to satisfy a PHP or Laravel stricture so the code runs.
==== Changes For Laravel 10 Removal of "dates" Model Attribute ====


This task also updated 51 PHP source files to be compatible with a breaking
This task also updated 51 PHP source files to be compatible with a breaking
Line 154: Line 256:
was combined with the latter to streamline testing, as both had potential
was combined with the latter to streamline testing, as both had potential
impacts over a large fraction of the app.
impacts over a large fraction of the app.
==== Excluded Upgrades ====


This task excluded upgrades to 3 PHP library dependencies for whom major
This task excluded upgrades to 3 PHP library dependencies for whom major

Latest revision as of 19:04, 12 June 2024


This document consists of multiple parts; for a directory to all of the parts, see SDSM:Index.

Description

This part of the SDS Modernization (SDSM) document enumerates a not necessarily exhaustive list of pending changes or improvements that were made to SDS, made by Darren Duncan if by whom is not otherwise specified.

It is similar to the Historical Changes part but that it describes work which was prepared and published in a Git branch but it was deemed premature to merge it to the trunk, such as due to a desire for more testing first, or because it was possibly unfinished; in contrast, Historical is for work that was merged to trunk.

RETURN

SDS Laravel: Changes to Third-Party Dependencies

2024 Jun 12: Upgrade To Laravel 10 and Vue 3

Summary of PHP Dependency Upgrades or Removals

This task updated composer.json to require the latest PHP-8.1-compatible versions of all PHP library dependencies, in particular taking Laravel from 8.x to 10.x.

To be specific, it made these dependency changes:

  • barryvdh/laravel-debugbar (^3.7 to ^3.13.5)
  • directorytree/ldaprecord-laravel (^2.7.3 to ^3.3.2)
  • etern8ty/beanstream (dev-master unchanged but upgrade exists)
  • fakerphp/faker (^1.23.1 unchanged)
  • fideloper/proxy (^4.4.2 removed as Laravel has its upgrade built-in)
  • goldspecdigital/laravel-eloquent-uuid (^8.0.1 removed as Laravel has its upgrade built-in)
  • guzzlehttp/guzzle (^7.8.1 unchanged)
  • intervention/image (^2.7.2 unchanged but upgrade exists)
  • juliomotol/laravel-auth-timeout (^3.1.1 to ^4.1)
  • lab404/laravel-impersonate (^1.7.5)
  • laravel/framework (^8.83.27 to ^10.48.12)
  • laravel/helpers (^1.7 unchanged but possibly no longer needed)
  • laravel/tinker (^2.9 unchanged)
  • laravel/ui (^3.4.6 to 4.5.2)
  • mockery/mockery (^1.6.12 unchanged)
  • nunomaduro/collision (^5.11 to ^7.10)
  • phpunit/phpunit (^10.5.20 unchanged)
  • spatie/laravel-ignition (^1.6.4 to ^2.8)
  • staudenmeir/eloquent-has-many-deep (^1.14.4 to ^1.19.4)

Summary of JavaScript Dependency Upgrades or Removals

This task updated package.json to require the latest versions of all JavaScript library dependencies, in particular taking Vue from 2.x to 3.x.

To be specific, it made these dependency changes:

  • @fortawesome/fontawesome-free (^5.15.4 unchanged)
  • axios (^0.27.2 unchanged)
  • bootstrap (^4.6.2 unchanged)
  • bootstrap-select (^1.13.18 unchanged)
  • cross-env (^7.0.3 unchanged)
  • font-awesome (^4.7.0 unchanged)
  • jquery (^3.7.1 unchanged)
  • jquery-ui (^1.13.3 unchanged)
  • laravel-mix (^5.0.9 unchanged)
  • lodash (^4.17.21 unchanged)
  • moment (^2.30.1 unchanged)
  • popper.js (^1.16.1 unchanged)
  • resolve-url-loader (^3.1.5 unchanged)
  • sass (^1.77.4 unchanged)
  • sass-loader (^8.0.2 unchanged)
  • tempusdominus-bootstrap-4 (^5.39.2 unchanged)
  • tempusdominus-core (^5.19.3 unchanged)
  • vue (^2.7.16 unchanged)
  • vue-bootstrap-datetimepicker (^5.0.1 unchanged)
  • vue-template-compiler (^2.7.16 unchanged)

Changes For goldspecdigital/laravel-eloquent-uuid Removal

This task also updated these 5 PHP source files to be compatible with the replacement of goldspecdigital/laravel-eloquent-uuid with a Laravel built-in:

  • app/Models/Application/Application.php
  • app/Models/User.php
  • app/Models/User/Student.php
  • app/Models/User/Teacher.php
  • app/Models/User/UserContract.php

These further 3 files also referenced the trait but commented out, so not current users but possible past or future users:

  • app/Models/Application/AppUser.php
  • app/Models/User/Address.php
  • app/Models/User/Guardian.php

For each of the above 8 files, there were these 2 line subsitutions:

   use GoldSpecDigital\LaravelEloquentUUID\Database\Eloquent\Uuid;
   use Uuid;
   use Illuminate\Database\Eloquent\Concerns\HasUuids;
   use HasUuids;

Here is a description of the above built-in feature in Laravel 9.3+:

https://laravel.com/docs/11.x/eloquent#uuid-and-ulid-keys

The purpose of that reimplemented functionality was to empower use of generated UUIDs for primary key fields of some database tables instead of the serially generated integers that SDS Laravel more typically uses; Laravel Eloquent only gained built-in support for UUIDs with version 9.3.

This task also deleted the single PHP file app/Models/Traits/Uuids.php as it appeared to be unused.

Changes For fideloper/proxy Removal

This task also updated app/Http/Middleware/TrustProxies.php to be compatible with the replacement of fideloper/proxy with a Laravel built-in. The changes were in 2 spots.

First was this substitution:

   use Fideloper\Proxy\TrustProxies as Middleware;
   use Illuminate\Http\Middleware\TrustProxies as Middleware;

Second was this substitution:

   protected $headers = Request::HEADER_X_FORWARDED_ALL;
   protected $headers =
       Request::HEADER_X_FORWARDED_FOR |
       Request::HEADER_X_FORWARDED_HOST |
       Request::HEADER_X_FORWARDED_PORT |
       Request::HEADER_X_FORWARDED_PROTO |
       Request::HEADER_X_FORWARDED_AWS_ELB;

Changes For juliomotol/laravel-auth-timeout Upgrade

This task also updated app/Http/Middleware/AuthTimeoutMiddleware.php to be compatible with the juliomotol/laravel-auth-timeout upgrade.

There was this 1 substitution:

   use JulioMotol\AuthTimeout\Middleware\AuthTimeoutMiddleware as BaseMiddleware;
   use JulioMotol\AuthTimeout\Middlewares\CheckAuthTimeout as BaseMiddleware;

Note that juliomotol/laravel-auth-timeout must be upgraded simultaneously with Laravel since the former's versions 3.1.1 and 4.1 respectively require Laravel 8 and 10 respectively.

See https://github.com/juliomotol/laravel-auth-timeout/blob/master/CHANGELOG.md for more change details and upgrade notes on that.

Changes For directorytree/ldaprecord-laravel Upgrade

This task also made 3 distinct sets of changes to be compatible with the directorytree/ldaprecord-laravel upgrade.

See also for context:

The first set of changes...

This task updated the 1 PHP config source file config/ldap.php to account for logging now being an array. There was this 1 substitution:

   'logging' => env('LDAP_LOGGING', true),
   'logging' => [
       'enabled' => env('LDAP_LOGGING', true),
   ],

The second set of changes...

For context, directorytree/ldaprecord-laravel had a PHP trait named LdapRecord\Laravel\Auth\MultiDomainAuthentication which was deprecated before version 2.7.3 and removed in version 3.0.0. The 1 SDS PHP source file app/Http/Controllers/Auth/LoginController.php used that trait.

This task updated LoginController to clone into itself the used portions of MultiDomainAuthentication, thus removing the external dependency of the former on the latter.

As the removed trait was itself a sub-trait of LdapRecord\Laravel\Auth\CreatesUserProvider, LoginController now composed that directly and not indirectly.

Also LoginController gained the new protected function getLdapGuard cloned from the removed trait.

Note that the function getLdapGuardFromRequest was not cloned from the removed trait since LoginController already had its own version that overrode it.

The third set of changes...

For context, each of these 5 SDS classes composed one of the 2 classes LdapRecord\Models\Model or LdapRecord\Models\Scope:

  • app/Ldap/ExternalUser.php
  • app/Ldap/Scopes/OnlyStaffUsers.php
  • app/Ldap/Scopes/OnlyStudents.php
  • app/Ldap/SmusStudents.php
  • app/Ldap/SmusUser.php

For each of those 5, it was updated such that for any property or method it contained which overrode or implemented a same-named one from Model or Scope, that property or method had explicit type annotations added to match the originals. This was required for the SDS code to satisfy a PHP or Laravel stricture so the code runs.

Changes For Laravel 10 Removal of "dates" Model Attribute

This task also updated 51 PHP source files to be compatible with a breaking change made by Laravel itself with version 10.

Laravel supported a "dates" model attribute through version 9, and then Laravel 10 removed it. The function of this was to enumerate database/model fields that were supposed to be automatically converted to Carbon DateTime objects; so under Laravel 8, any "dates" declarations would be respected, while under Laravel 10 they would be ignored.

Compare:

As a result, simply upgrading SDS Laravel from Laravel 8 to 10 resulted in many parts of the app breaking in various ways including when simply visiting the post-login home screen, as PHP died with errors like Call to a member function format() on int.

To fix this, any instances of protected $dates = ['x',...] in model classes were replaced with protected $casts = ['x'=>'datetime',...] which was the more modern way to get the same functionality, which exists in both Laravel 8 and 10. For the few model classes that already had other $casts declarations, the replacements were merged with those.

While the "dates" change could have been its own task that was merged to trunk prior to and separately from the current Laravel 10 upgrade task, it was combined with the latter to streamline testing, as both had potential impacts over a large fraction of the app.

Excluded Upgrades

This task excluded upgrades to 3 PHP library dependencies for whom major upgrades existed, and upgrading those is left to separate tasks following the Laravel 8 to 10 upgrade.

RETURN