|
|
(15 intermediate revisions by the same user not shown) |
Line 12: |
Line 12: |
|
| |
|
| It is similar to the [[SDSM:Historical_Changes|Historical Changes]] part | | It is similar to the [[SDSM:Historical_Changes|Historical Changes]] part |
| but that it describes work which was prepared and published in a Git branch | | but that it describes work which was prepared and published in Git feature |
| but it was deemed premature to merge it to the trunk, such as due to a
| | branches that are longer lived and not yet merged to the trunk; in |
| desire for more testing first, or because it was possibly unfinished; in
| |
| contrast, ''Historical'' is for work that ''was'' merged to trunk. | | contrast, ''Historical'' is for work that ''was'' merged to trunk. |
|
| |
|
| [[#top|RETURN]] | | [[#top|RETURN]] |
|
| |
|
| == SDS Laravel: Fixes to Broken Behavior == | | == SDS Laravel: Removed Application Functionality == |
|
| |
|
| === 2024 May 20: Timeout Feature Broken In Sub-Directory Hosted Apps === | | === 2024 Jun 25: Remove Screens For Application For Student Enrollment By Parents === |
|
| |
|
| ''SDS Laravel'' has a security feature such that if a user is inactive for | | This task removed the ''SDS Laravel'' screens that supported parents |
| a period of time, 15 minutes typically, they will be automatically logged
| | applications for student enrollment of their children directly in '''SDS'''. |
| out of the app. The app displays a countdown timer on the top right hand
| | The functionality became obsolete and unused when Blackbaud started being |
| corner of the screen that ticks for every second of activity. Javascript
| | used for applications instead, and applications were imported to '''SDS''' |
| code running in the client web browser will normally reset the countdown to
| | from Blackbaud by an automated process. |
| the full amount whenever a user interface (UI) event occurs that it
| |
| considers continued user activity, such as mouse movement over the screen.
| |
|
| |
|
| This feature is implemented partly by the web client invoking the
| | These 20 source files were simply removed: |
| <code>/session</code> endpoint on the server.
| |
|
| |
|
| That invocation fails on any ''SDS Laravel'' app instance that is hosted at
| | * app/Http/Controllers/Application/ApplicationController.php |
| a web address which is a sub-directory of the base url (meaning it is based
| | * app/Http/Controllers/Application/FamilyInfoController.php |
| at an address like <code>https://foo.com/bar</code> rather than at an
| | * app/Http/Controllers/Application/OtherController.php |
| address like just <code>https://foo.com</code>). This is because the web
| | * app/Http/Controllers/Application/ParentInfoController.php |
| client is trying to unconditionally treat every app instance as if it is
| | * app/Http/Controllers/Application/ParentQuestionController.php |
| hosted directly at the base url with respect to its attempts to invoke the
| | * app/Http/Controllers/Application/StudentInfoController.php |
| <code>/session</code> endpoint, and so it is invoking the wrong web address
| | * app/Http/Controllers/Application/StudentQuestionController.php |
| for instances that are at sub-directory urls.
| | * app/Http/Controllers/System/EditBoardingQuestionController.php |
| | * resources/js/components/application/AddressInfo.vue |
| | * resources/js/components/application/FamilyStatus.vue |
| | * resources/js/components/application/GuardianHolder.vue |
| | * resources/js/components/application/GuardianInfo.vue |
| | * resources/views/application/home.blade.php |
| | * resources/views/application/index.blade.php |
| | * resources/views/application/parentinfo/index.blade.php |
| | * resources/views/application/studentinfo/index.blade.php |
| | * resources/views/includes/application_menu.blade.php |
| | * resources/views/system/boarding_question/create.blade.php |
| | * resources/views/system/boarding_question/edit.blade.php |
| | * resources/views/system/boarding_question/index.blade.php |
|
| |
|
| As a result, for broken app instances, while the first UI activity
| | These 3 source files were updated to remove references to the removed ones: |
| indicating continued user activity will reset the countdown timer displayed
| |
| on screen to the user, all subsequent UI activity will have no effect on
| |
| the timer, and it will not reset, and the server will not be aware of this
| |
| activity. Only a full page load like clicking a link to a new page will
| |
| register as activity and reset the timer.
| |
|
| |
|
| This breakage affects all ''SDS Laravel'' instances at
| | * resources/js/app.js |
| https://sdsdev.smus.ca which are in sub-directories.
| | * resources/views/includes/menu.blade.php |
| | * routes/web.php |
|
| |
|
| The primary change of this task fixes the problem by making the web client
| | Note that Laravel Eloquent Models related to this functionality were |
| respect the actual location of the app when invoking <code>/session</code>.
| | explicitly left alone, so they can still thoroughly represent the actual |
| Mainly it is a 1-line change in the Laravel Blade template file
| | database structure, and they can still be used by other processes. |
| <code>resources/views/layouts/main.blade.php</code> to use
| | Likewise, references to student applications in other screens were left |
| <code><nowiki>url: '{{route('session')}}'</nowiki></code> rather than
| | alone as they may still be relevant to the Blackbaud process or for history. |
| <code>url: '/session'</code>.
| |
| | |
| An additional change of this task is to fix a problem where the
| |
| app's background image doesn't display for the same underlying reason. The
| |
| problem is that the web client is trying to load the image
| |
| <code>public/images/body.png</code> from the wrong location. The fix
| |
| updates 1 line in the CSS file <code>public/css/smus_custom.css</code> to
| |
| <code>background: url('../images/body.png')</code> from
| |
| <code>background: url('/images/body.png')</code>; the newly-relative url is
| |
| relative to the location of the CSS file itself.
| |
| | |
| There is still additional broken behavior related to static asset loading
| |
| like the background image example, affecting custom fonts for example, but
| |
| these references are in the generated file <code>public/css/app.css</code>
| |
| as parts of third-party dependencies, and so these were left alone.
| |
| | |
| == SDS Laravel: Internal Design Changes ==
| |
| | |
| === 2024 May 7: Replace model attrs "dates" with "casts" ===
| |
| | |
| 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:
| |
| | |
| * https://laravel.com/api/9.x/Illuminate/Database/Eloquent/Concerns/HasAttributes.html
| |
| * https://laravel.com/api/10.x/Illuminate/Database/Eloquent/Concerns/HasAttributes.html
| |
| | |
| 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
| |
| <code>Call to a member function format() on int</code>.
| |
| | |
| To fix this, any instances of <code>protected $dates = ['x',...]</code>
| |
| in model classes were replaced with
| |
| <code>protected $casts = ['x'=>'datetime',...]</code>
| |
| 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
| |
| <code>$casts</code> declarations, the replacements were merged with those.
| |
| | |
| The changes of this task were not merged to trunk yet because it was deemed
| |
| important to give each instance of the changed 51 model classes more
| |
| thorough testing before merging than they had received as of 2024 May 7.
| |
| One key reason for this is the idea that the fields in question might not
| |
| all be date+time, and rather may be date-only or time-only.
| |
| All ''SDS Laravel'' screens accessible from a main menu item were found to
| |
| load and at a glance seemed to display correctly, with these changes
| |
| included, but that is as far as any testing went as of 2024 May 7.
| |
| (There are 2 such screens that didn't load, but they didn't load prior to
| |
| these changes either, and that is a separate concern.)
| |
| | |
| As of 2024 May 7, the changes of this task have been bundled with the
| |
| changes of the task upgrading ''SDS Laravel'' from Laravel 8 to 10, so the
| |
| sum changes would receive the necessary thorough testing together before
| |
| being merged to trunk. However, since the changes of this task do not
| |
| depend on the upgrade, it is possible that a subset of them may be fully
| |
| tested and merged sooner when other changes using the same models occur.
| |
| | |
| [[#top|RETURN]]
| |
| | |
| == SDS Laravel: Changes to Third-Party Dependencies ==
| |
| | |
| === 2024 May 16: Stop requiring laravel-eloquent-uuid ===
| |
| | |
| ''SDS Laravel'' uses serially generated integers in most of its database
| |
| tables for their primary key fields, but for a small number of tables it
| |
| instead uses generated UUIDs for their primary key fields.
| |
| | |
| Prior to the performance of this task, the third-party PHP library
| |
| dependency <code>goldspecdigital/laravel-eloquent-uuid</code> version
| |
| <code>v8.0.1</code> was used to empower such UUID use, since Laravel
| |
| Eloquent itself did not support these prior to version 9.3. While we can
| |
| make use of equivalent functionality built-in to Laravel once we upgrade
| |
| to Laravel 10, we can't while we are on Laravel 8.
| |
| | |
| Fundamentally, the feature in question that we use is summed up by a single
| |
| very small PHP trait defined in a single file of a few dozen lines of code.
| |
| This is the case both for the <code>goldspecdigital</code> version used
| |
| prior to this task and the Laravel built-in that can be used later.
| |
| | |
| Here is a description of the built-in feature in Laravel 9.3+:
| |
| | |
| https://laravel.com/docs/11.x/eloquent#uuid-and-ulid-keys
| |
| | |
| Regardless of which of these options is used, most of core UUID-specific
| |
| functionality is provided by the third-party PHP library
| |
| <code>ramsey/uuid</code>, and Laravel 8+ itself already has this as its own
| |
| dependency for other reasons.
| |
| | |
| The primary change of this current task is to clone the single PHP file
| |
| from <code>goldspecdigital</code> that we actually use into ''SDS Laravel''
| |
| itself, as the new file <code>app/Models/Traits/Uuid.php</code>, and to
| |
| update <code>composer.json</code> to remove the explicit external
| |
| dependency on <code>goldspecdigital/laravel-eloquent-uuid</code>. In the
| |
| process, the fully-qualified PHP trait name was renamed to
| |
| <code>App\Models\Traits\Uuid</code> from
| |
| <code>GoldSpecDigital\LaravelEloquentUUID\Database\Eloquent\Uuid</code>,
| |
| but it had no other changes of any kind.
| |
| | |
| The only 5 other app PHP source files that directly used it were updated to
| |
| account for the new name:
| |
| | |
| * 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
| |
| | |
| Another change made by this current task was to delete the single PHP file
| |
| <code>app/Models/Traits/Uuids.php</code> as it appeared to be unused.
| |
| | |
| Note that <code>goldspecdigital/laravel-eloquent-uuid</code> had a newer
| |
| version <code>10.x</code> that was explicitly compatible with Laravel 10,
| |
| however a source comparison of the 2 versions found that they were actually
| |
| identical in every way aside from adding a half dozen PHP type annotations
| |
| in the source code and changing the <code>composer.json</code> to require
| |
| Laravel 10 instead of 8.
| |
| As such, it was actually the <code>Uuid.php</code> file from version 10
| |
| cloned by this task rather than the one from version 8, so we benefitted
| |
| from the added PHP type annotations, and the behavior should be identical.
| |
| | |
| The net effect of this task was to maintain exactly the same app behavior
| |
| while dropping a hard external dependency, this reducing our overall
| |
| complexity and simplifying the later task of upgrading to Laravel 10.
| |
| | |
| It is expected that the future upgrade to Laravel 10 will take the next
| |
| step and remove this cloned trait file, and its users will use the
| |
| Larvel 10 built-in instead.
| |
| | |
| [[#top|RETURN]]
| |
| | |
| === 2024 May 3: Upgrade Laravel from 8.x to 10.x ===
| |
| | |
| This task updated <code>composer.json</code> to require the latest
| |
| PHP-8.1-compatible major version of the PHP library dependency Laravel from
| |
| 8.x to 10.x.
| |
| | |
| To be more specific, it made these dependency changes:
| |
| | |
| * barryvdh/laravel-debugbar (^3.7 to ^3.13.5)
| |
| * directorytree/ldaprecord-laravel (^2.7.3 unchanged but upgrade exists)
| |
| * 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 to ^10.0)
| |
| * 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.10)
| |
| * laravel/helpers (^1.7 unchanged but possibly no longer needed)
| |
| * laravel/pint (^1.15.3 added but not yet used)
| |
| * laravel/sail (^1.29.1 added but not yet used)
| |
| * laravel/sanctum (^3.3.3 added but not yet used)
| |
| * laravel/tinker (^2.9 unchanged)
| |
| * laravel/ui (^3.4.6 to 4.5.1)
| |
| * mockery/mockery (^1.6.11 unchanged)
| |
| * nunomaduro/collision (^5.11 to ^7.10)
| |
| * phpunit/phpunit (^10.5.20 unchanged)
| |
| * spatie/laravel-ignition (^1.6.4 to ^2.7)
| |
| * staudenmeir/eloquent-has-many-deep (^1.14.4 to ^1.19.3)
| |
| | |
| Note that <code>juliomotol/laravel-auth-timeout</code> version 4.1 requires
| |
| Laravel version 9 or greater so it can not be upgraded from 3.1.1 prior to
| |
| the Laravel 10 upgrade.
| |
| | |
| This task also updated <code>app/Http/Middleware/TrustProxies.php</code> to
| |
| be compatible with the replacement of <code>fideloper/proxy</code> 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;
| |
| | |
| This task also updated
| |
| <code>app/Http/Middleware/AuthTimeoutMiddleware.php </code> to be
| |
| compatible with the <code>juliomotol/laravel-auth-timeout</code> upgrade.
| |
| | |
| There was this 1 substitution:
| |
| | |
| use JulioMotol\AuthTimeout\Middleware\AuthTimeoutMiddleware as BaseMiddleware;
| |
| | |
| use JulioMotol\AuthTimeout\Middlewares\CheckAuthTimeout as BaseMiddleware;
| |
| | |
| This task also explored upgrades to some other PHP library dependencies but
| |
| they were excluded due to requiring more substantial code changes for
| |
| compatibility, and will be returned to later.
| |
|
| |
|
| [[#top|RETURN]] | | [[#top|RETURN]] |