<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: dgloriaweb</title>
    <description>The latest articles on DEV Community by dgloriaweb (@dgloriaweb).</description>
    <link>https://dev.to/dgloriaweb</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F278254%2Fd2fc9acc-f6c6-4d79-bc26-36dfe6ce23f2.jpg</url>
      <title>DEV Community: dgloriaweb</title>
      <link>https://dev.to/dgloriaweb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dgloriaweb"/>
    <language>en</language>
    <item>
      <title>ext.js</title>
      <dc:creator>dgloriaweb</dc:creator>
      <pubDate>Sat, 21 Jun 2025 11:12:15 +0000</pubDate>
      <link>https://dev.to/dgloriaweb/extjs-585j</link>
      <guid>https://dev.to/dgloriaweb/extjs-585j</guid>
      <description></description>
      <category>javascriptlibraries</category>
      <category>extremeprogramming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>My developer history. Ep 0 - Satyam office manager with curiosity (2006)</title>
      <dc:creator>dgloriaweb</dc:creator>
      <pubDate>Wed, 05 Mar 2025 11:12:36 +0000</pubDate>
      <link>https://dev.to/dgloriaweb/my-developer-history-ep-0-satyam-office-manager-with-curiosity-323b</link>
      <guid>https://dev.to/dgloriaweb/my-developer-history-ep-0-satyam-office-manager-with-curiosity-323b</guid>
      <description>&lt;h2&gt;
  
  
  The early years
&lt;/h2&gt;

&lt;p&gt;I was about 13 when my dad bought a C64 and signed up to a programmer course.&lt;br&gt;
He also signed up for all the available programmers' magazines, and quicly became a member of the Budapest hobby programmers' network. He brought home cassettes from all over the city, and was copying code heavily in all his free time from the magazines. All I saw was&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fskf7oqxka9qhu001kyvi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fskf7oqxka9qhu001kyvi.png" alt="Image description" width="372" height="229"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Office manager, admin assistant
&lt;/h2&gt;

&lt;p&gt;Luckily I got a job at an Indian IT company. This was a fully organised enterprise with about 50000 employees worldwide. And all that comes with it: free latest mobile phones (imagine my one touch easy alongside the Nokia N95 8GB, I thought I was in Star Trek), all access to MSDN resources, free coffee and a beautiful office in the best part of Budapest, the Infopark, with restaurants, bookstores and a lovely park. I've got familiar with the wonderful Indian culture, made lots of lifetime friends and started to do yoga. &lt;/p&gt;

&lt;h2&gt;
  
  
  Houston, we have a problem
&lt;/h2&gt;

&lt;p&gt;I needed an app to be able to report financial stuff to Germany management, so the developers wrote me one, but then they released it. For good. So I had to improve it and debug it, and all that comes with that. &lt;/p&gt;

&lt;h2&gt;
  
  
  And so it goes
&lt;/h2&gt;

&lt;p&gt;So I've started to examine the code in Visual Studio, and since MSDN had great tutorials, during 2 years I've made many modules to my little app. Some of these were an inventory app, that registered all the furniture and equipment in the office, generated inventory ID's, printed the beautiful labels, only it didn't stick them on. &lt;/p&gt;

&lt;h2&gt;
  
  
  The next steps, more problems to solve
&lt;/h2&gt;

&lt;p&gt;I've also implemented a tool for the employees, to manage their &lt;strong&gt;benefits&lt;/strong&gt;. Now back then this was very tricky and very important.&lt;/p&gt;

&lt;h3&gt;
  
  
  What we need - the importance
&lt;/h3&gt;

&lt;p&gt;The race among companies for developers is on, sometimes it's not the money that's matter the most. With us it was the benefits. &lt;/p&gt;

&lt;h3&gt;
  
  
  Why do we need it - the tricky bit
&lt;/h3&gt;

&lt;p&gt;We have offered a large amount that the employees could spread. Say you have 10,000 as benefits, that you can use for food vouchers (if any of you remember Sodexo, it was a company that offered food vouchers), there was the life insurance, the medical annual membership (which was an annual, one time fee), and pension. All of these had their recurrence, (annual, quarterly, monthly) which made it more complicated.&lt;/p&gt;

&lt;h3&gt;
  
  
  How - the solution
&lt;/h3&gt;

&lt;p&gt;Now manually it would have taken ages to count all the variations of the given sum, and also I've got a gross amount from the company, so I had to calculate the tax as well as to show the employee, what they get.&lt;br&gt;
This I've solved with a form full of tickboxes, dropdowns, sliders and whatnot. The app had a tickbox for medical (one time fee), sliders, where the steps have been predicted by the ticket vendor, dropdowns with minimum and maximum set, so no bad data could be input. And it showed the full detailed list for the user, what they get and when they get it, for me it showed what do I need to order, or book, and for the payroll it showed the taxes and invoices, with their payment statuses. Decent problem to solve with no university degree. &lt;/p&gt;

&lt;p&gt;I wish I had a copy of the screenshot, to show you, it was amazing. :)&lt;/p&gt;

</description>
    </item>
    <item>
      <title>My developer history. Ep 1 - My job at the car spare parts company (2013)</title>
      <dc:creator>dgloriaweb</dc:creator>
      <pubDate>Wed, 05 Mar 2025 10:20:45 +0000</pubDate>
      <link>https://dev.to/dgloriaweb/my-job-at-the-car-spare-parts-company-49b5</link>
      <guid>https://dev.to/dgloriaweb/my-job-at-the-car-spare-parts-company-49b5</guid>
      <description>&lt;h2&gt;
  
  
  Brief
&lt;/h2&gt;

&lt;p&gt;In 2013 I've joined my friend when he was approached to redesign and rebuild a webshop for a car spare parts vendor. &lt;br&gt;
Their goal was to beat the competitors by providing the best UX, &lt;a href="https://dev.tourl"&gt;improve the database&lt;/a&gt; by importing the global database for car spare parts, improve security, add filtering options. Without us knowing it, we have used a Kanban board, so we were already Agile before it was even a thing. :)&lt;/p&gt;

&lt;h2&gt;
  
  
  Stack
&lt;/h2&gt;

&lt;p&gt;Vanilla Php, HTML, CSS, JavaScript, MySql&lt;/p&gt;

&lt;h2&gt;
  
  
  Improving the database
&lt;/h2&gt;

&lt;p&gt;When you are provided with the ultimate database (around 10GB) of all the car parts ever built, first thing you do is sanitize. Select the columns that are irrelevant for your use. If you still end up with millions of entries, you go further. You repeat this until you end up with a reasonable, but necessary amount of data. Next you plan the dump import. Consider your internet speed (2013), PC config and frequest random data checks for data loss. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F70hvgv4wvci1q5jjx3mi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F70hvgv4wvci1q5jjx3mi.png" alt="Image description" width="668" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Improve security
&lt;/h2&gt;

&lt;p&gt;The other product that has been used had major Php injection issues, which we discovered, and implemented all available security solutions into the new build.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F459frcdmix7p96mefcma.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F459frcdmix7p96mefcma.png" alt="Image description" width="599" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Filtering options
&lt;/h2&gt;

&lt;p&gt;Products, like batteries, engine oils or tyres have been very hard to find for customers. We have implemented a simple filtering system for these, since we had all the information about the product in the database, products now could be found based on the make, type and year of the vehicle. (License plate search is a UK specific thing).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwxbgaukv4hinpwcrqy3i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwxbgaukv4hinpwcrqy3i.png" alt="Image description" width="631" height="213"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9mu6h3v7r9vi6ieedjpe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9mu6h3v7r9vi6ieedjpe.png" alt="Image description" width="745" height="229"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(The screenshots are from the latest version of the website)&lt;/p&gt;

&lt;h3&gt;
  
  
  Our days:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7093cy8n0v8rqdi5j0f7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7093cy8n0v8rqdi5j0f7.jpg" alt="Image description" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F55hr85f88o1zhp2a9csd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F55hr85f88o1zhp2a9csd.jpg" alt="Image description" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsccxk1gs9542aq7xv2fm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsccxk1gs9542aq7xv2fm.jpg" alt="Image description" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a&gt;&lt;/a&gt;...and our kanban board
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fde1ifrlcg6ip82e7t06d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fde1ifrlcg6ip82e7t06d.png" alt="Image description" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>portfolio</category>
    </item>
    <item>
      <title>Tutorial 1 - Laravel learning by doing with dGloria</title>
      <dc:creator>dgloriaweb</dc:creator>
      <pubDate>Sat, 09 Nov 2024 14:22:13 +0000</pubDate>
      <link>https://dev.to/dgloriaweb/tutorial-1-laravel-learning-by-doing-with-dgloria-3bo3</link>
      <guid>https://dev.to/dgloriaweb/tutorial-1-laravel-learning-by-doing-with-dgloria-3bo3</guid>
      <description>&lt;p&gt;Hi, &lt;br&gt;
the first task is about creating a new application and return data via an api endpoint.&lt;/p&gt;

&lt;p&gt;There is a json below, that you have to return from the database. Outline of the task: create a new laravel app, add an endpoint, make a test or a POSTMAN request to return the json structure with these or other data.&lt;br&gt;
For the test you may use the assertJsonStructure function.&lt;/p&gt;

&lt;p&gt;In a week or two (and if I get more than 0 viewing) I will share a repo of the solution. :) &lt;/p&gt;

&lt;p&gt;If you want to join but you have no previous Laravel experience, firstly follow the documentation, or leave a comment below, so that I can help you get through if you get stuck.&lt;/p&gt;

&lt;p&gt;Let's go!&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{&lt;br&gt;
    "menu": [&lt;br&gt;
        {&lt;br&gt;
            "hours_start": "06:00",&lt;br&gt;
            "hours_end": "12:00",&lt;br&gt;
            "hours_time_mode": "24",&lt;br&gt;
            "display_name": "Mega XL Breakfast",&lt;br&gt;
            "reference": "m12345",&lt;br&gt;
            "description": "6 Slices of Bread, 6 Slices of Bacon, 6 Eggs, 3 Jumbo Sausages and 1 Large Chips",&lt;br&gt;
            "allergens": "none",&lt;br&gt;
            "category": "food",&lt;br&gt;
            "price": "15.99",&lt;br&gt;
            "currency": "GBP"&lt;br&gt;
        },&lt;br&gt;
        {&lt;br&gt;
            "hours_start": "00:00",&lt;br&gt;
            "hours_end": "24:00",&lt;br&gt;
            "hours_time_mode": "24",&lt;br&gt;
            "display_name": "orange juice",&lt;br&gt;
            "reference": "d55345",&lt;br&gt;
            "description": "orange juice not from concentrate",&lt;br&gt;
            "allergens": "none",&lt;br&gt;
            "category": "drink",&lt;br&gt;
            "price": "6.15",&lt;br&gt;
            "currency": "GBP"&lt;br&gt;
        },&lt;br&gt;
        {&lt;br&gt;
            "hours_start": "10:00",&lt;br&gt;
            "hours_end": "24:00",&lt;br&gt;
            "hours_time_mode": "24",&lt;br&gt;
            "display_name": "chicken tikka",&lt;br&gt;
            "reference": "m58765",&lt;br&gt;
            "description": "chicken tikka",&lt;br&gt;
            "allergens": "none",&lt;br&gt;
            "category": "food",&lt;br&gt;
            "price": "24.60",&lt;br&gt;
            "currency": "GBP"&lt;br&gt;
        },&lt;br&gt;
        {&lt;br&gt;
            "hours_start": "10:00",&lt;br&gt;
            "hours_end": "24:00",&lt;br&gt;
            "hours_time_mode": "24",&lt;br&gt;
            "display_name": "cheesecake",&lt;br&gt;
            "reference": "s53788",&lt;br&gt;
            "description": "cheesecake",&lt;br&gt;
            "allergens": "none",&lt;br&gt;
            "category": "dessert",&lt;br&gt;
            "price": "7.88",&lt;br&gt;
            "currency": "GBP"&lt;br&gt;
        }&lt;br&gt;
    ]&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Laravel tutorial series for those who can learn by doing themselves</title>
      <dc:creator>dgloriaweb</dc:creator>
      <pubDate>Sat, 09 Nov 2024 14:18:10 +0000</pubDate>
      <link>https://dev.to/dgloriaweb/laravel-tutorial-series-for-those-who-can-learn-by-doing-themselves-4c2h</link>
      <guid>https://dev.to/dgloriaweb/laravel-tutorial-series-for-those-who-can-learn-by-doing-themselves-4c2h</guid>
      <description>&lt;p&gt;Hi, since I've learned much more about programming doing application tests for companies I've applied for, than by reading any documentation or following tutorial videos, I hereby start a series of tasks that you have to **work out yourself **if you want to learn Laravel.&lt;/p&gt;

&lt;p&gt;This series will add tasks step by step to the main simple case, hopefully help you and me practice working with the backend faster and learning the possibilities this wonderful framework provides out of the box.&lt;/p&gt;

&lt;p&gt;Disclaimer: I am a junior-mid level developer, and my solutions are just one of all the possible solutions, so if you find a better way, please let me know in the comments, or send me a dm.&lt;/p&gt;

&lt;p&gt;The first task is about creating a new application and return data via an api endpoint. It can be found here: &lt;a href="https://dev.to/dgloriaweb/tutorial-1-laravel-learning-by-doing-with-dgloria-3bo3"&gt;Tutorial 1&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Planning and creating a database before you start working on your backend can save you time</title>
      <dc:creator>dgloriaweb</dc:creator>
      <pubDate>Sat, 09 Nov 2024 14:14:49 +0000</pubDate>
      <link>https://dev.to/dgloriaweb/planning-and-creating-a-database-before-you-start-working-on-your-backend-can-save-you-time-5g1o</link>
      <guid>https://dev.to/dgloriaweb/planning-and-creating-a-database-before-you-start-working-on-your-backend-can-save-you-time-5g1o</guid>
      <description>&lt;p&gt;In many cases we start developing an api endpoint or an application before we knew what our database will contain and how we are going to use the data.&lt;br&gt;
We have to remember that the migration file has to be created, and later on the validation rules have to match the existing migration structure. Doing this while creating the controllers can result in a lot of back-and-forth between the database management and the actual controller/service coding of the endpoint.&lt;/p&gt;

&lt;p&gt;My best solution for this is: create the tables in any table management tool, eg. excel or google sheets.&lt;br&gt;
Add your mock data, that will show you if you have duplicates, which you can extract to a separate table and add the foreign key to your main table. (This will quickly show if your main table is the table you thought is the main, or it happens to be some other one. :) )&lt;/p&gt;

&lt;p&gt;Once you have filled your tables with all the data your endpoint will need, you can add a new worksheet, where you define the column names, type, length, default values, nullable, regex or any other criteria you want  to validate  the incoming request against. This you can use later in your development as a quick reference. &lt;br&gt;
This you can simply and quickly turn into a Laravel or any other migration code by using the =concatenate function, or create the sql INSERT code as well.&lt;br&gt;
This, as mentioned above, will also give you the validation rules you have to add to your endpoint.&lt;/p&gt;

&lt;p&gt;If you like this article and would like to learn more, write me in the comments below.&lt;/p&gt;

</description>
      <category>planning</category>
      <category>backenddevelopment</category>
      <category>data</category>
      <category>database</category>
    </item>
    <item>
      <title>Using Google Places (new) Api in your Laravel application</title>
      <dc:creator>dgloriaweb</dc:creator>
      <pubDate>Sat, 05 Oct 2024 06:26:30 +0000</pubDate>
      <link>https://dev.to/dgloriaweb/using-google-places-new-api-in-your-laravel-application-3i56</link>
      <guid>https://dev.to/dgloriaweb/using-google-places-new-api-in-your-laravel-application-3i56</guid>
      <description>&lt;p&gt;I have struggled a while to understand the setup of the new requests. This I needed because the responses I've got from the old api to my search for places were missing places I knew existed. Therefore I experimented with the new Places Api.&lt;br&gt;
The easiest way for me to start was to use my postman. However I didn't know how to use cURL in postman, but it was easy and quick. There is a button near "my workspace" on the left that says import. There I copied the example cURL from this page: &lt;a href="https://developers.google.com/maps/documentation/places/web-service/nearby-search" rel="noopener noreferrer"&gt;https://developers.google.com/maps/documentation/places/web-service/nearby-search&lt;/a&gt;&lt;br&gt;
It gave me the details, so I can see that most of the stuff goes into the header instead of the parameters, and the body is a normal json, where you can fiddle with the results. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbadla2ukrsh1pap3momd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbadla2ukrsh1pap3momd.png" alt="Image description" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd92t7ywi8jq7htk81ze2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd92t7ywi8jq7htk81ze2.png" alt="Image description" width="716" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now I am ready to use this request in my laravel app.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Article about lost/missed deliveries/parcels</title>
      <dc:creator>dgloriaweb</dc:creator>
      <pubDate>Sat, 31 Aug 2024 17:18:01 +0000</pubDate>
      <link>https://dev.to/dgloriaweb/article-about-lostmissed-deliveriesparcels-202m</link>
      <guid>https://dev.to/dgloriaweb/article-about-lostmissed-deliveriesparcels-202m</guid>
      <description>&lt;p&gt;Hi, I work as a driver since a while and here I collected some thoughts about my experience. Thank you.&lt;br&gt;
&lt;a href="http://localhost:5173/notdeliveredfaq" rel="noopener noreferrer"&gt;Dailydriver.info What to Do If Your Online Order Has Not Been Delivered: A Gentle Guide&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Laravel 10 API application with necessary functions pt 3.</title>
      <dc:creator>dgloriaweb</dc:creator>
      <pubDate>Mon, 27 May 2024 10:27:38 +0000</pubDate>
      <link>https://dev.to/dgloriaweb/laravel-10-api-application-with-necessary-functions-pt-3-4f6d</link>
      <guid>https://dev.to/dgloriaweb/laravel-10-api-application-with-necessary-functions-pt-3-4f6d</guid>
      <description>&lt;p&gt;&lt;strong&gt;Environment:&lt;/strong&gt; Windows 10&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Necessary prequisites (knowledge):&lt;/strong&gt; VS Code, Composer, Terminal, Git bash, GitHub, Postman, MarkDown, XAMPP (also serves my MySql database), environmental variables (or .env), Passport, TDD, Pest&lt;/p&gt;

&lt;p&gt;If you require further details, please feel free to add in comments.&lt;/p&gt;




&lt;h2&gt;
  
  
  User authentication, login, register
&lt;/h2&gt;

&lt;p&gt;I am using Laravel Passport (&lt;a href="https://laravel.com/docs/10.x/passport" rel="noopener noreferrer"&gt;https://laravel.com/docs/10.x/passport&lt;/a&gt;) for user authentication. &lt;br&gt;
&lt;code&gt;composer require laravel/passport&lt;/code&gt;&lt;br&gt;
then run the migrations &lt;br&gt;
&lt;code&gt;php artisan migrate&lt;/code&gt; (in my case it didn't do anything)&lt;br&gt;
Then install passport:&lt;br&gt;
&lt;code&gt;php artisan passport:install&lt;/code&gt;&lt;br&gt;
This generated the necessary tables in the database, that's connected to Oauth. Explore these. I have 10 tables now.&lt;br&gt;
In the User.php Model file, change the use Laravel\Sanctum\HasApiTokens; to use Laravel\Passport\HasApiTokens;&lt;br&gt;
(I've noticed that my oauth_clients table was actually empty, so I had to re-run the install and re-create these. Probably because the default RefreshDatabase in the test deletes everything that's in the database, so I've changed this)&lt;/p&gt;
&lt;h2&gt;
  
  
  Routing
&lt;/h2&gt;

&lt;p&gt;This is where you tell the app, where the incoming API requests should be redirected to. &lt;/p&gt;
&lt;h2&gt;
  
  
  TDD to create register API endpoint
&lt;/h2&gt;

&lt;p&gt;Run this to install Pest instead of phpunit&lt;br&gt;
&lt;code&gt;composer remove phpunit/phpunit&lt;/code&gt;&lt;br&gt;
&lt;code&gt;composer require pestphp/pest --dev --with-all-dependencies&lt;/code&gt;&lt;br&gt;
initialise&lt;br&gt;
&lt;code&gt;./vendor/bin/pest --init&lt;/code&gt;&lt;br&gt;
to run tests type:&lt;br&gt;
&lt;code&gt;./vendor/bin/pest&lt;/code&gt;&lt;br&gt;
Then create the test file: tests/Feature/UserManagementTest.php&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php

use Illuminate\Foundation\Testing\DatabaseTransactions;

uses(DatabaseTransactions::class);

it('allows a user to register', function () {
    $response = $this-&amp;gt;postJson('/api/register', [
        'name' =&amp;gt; 'John Doe',
        'email' =&amp;gt; 'john@example.com',
        'password' =&amp;gt; 'password',
        'password_confirmation' =&amp;gt; 'password',
    ]);

    $response-&amp;gt;assertStatus(200);
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We create the route in the routes/api.php file (I've deleted the sanctum route that was there):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Route::group(['middleware' =&amp;gt; ['cors', 'json.response']], function () {
    // public routes
    Route::post('/register', 'App\Http\Controllers\Auth\ApiAuthController@register')-&amp;gt;name('register.api');
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the test again: "Target class [cors] does not exist.". Run this to add Cors middleware:&lt;br&gt;
&lt;code&gt;php artisan make:middleware Cors&lt;/code&gt;&lt;br&gt;
Replace the handler:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; return $next($request)
            -&amp;gt;header('Access-Control-Allow-Origin', '*')
            -&amp;gt;header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
            -&amp;gt;header('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, X-Token-Auth, Authorization');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;php artisan make:middleware ForceJsonResponse&lt;/code&gt;&lt;br&gt;
Replace the handler:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; $request-&amp;gt;headers-&amp;gt;set('Accept', 'application/json');
        return $next($request);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then add these to the kernel.php file,&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feaeb9ecx0yl2frsknq4c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feaeb9ecx0yl2frsknq4c.png" alt="Image description" width="727" height="243"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffbspnpo6ftujn6pw3esq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffbspnpo6ftujn6pw3esq.png" alt="Image description" width="640" height="110"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then run the test again: "Expected response status code [200] but received 500."&lt;/p&gt;

&lt;p&gt;We don't have the controller yet, so create an Auth folder in Http/Controllers and add ApiAuthController.php file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Models\User;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Str;
use Illuminate\Auth\Events\Registered;



class ApiAuthController extends Controller
{
    public function register(Request $request)
    {
        $validator = Validator::make($request-&amp;gt;all(), [
            'name' =&amp;gt; 'required|string|max:255',
            'email' =&amp;gt; 'required|string|email|max:255|unique:users',
            'password' =&amp;gt; 'required|string|min:6|confirmed',
        ]);
        if ($validator-&amp;gt;fails()) {
            return response(['errors' =&amp;gt; $validator-&amp;gt;errors()-&amp;gt;all()], 422);
        }
        $request['password'] = Hash::make($request['password']);
        $request['remember_token'] = Str::random(10);
        $user = User::create($request-&amp;gt;toArray());

        try {
            $user-&amp;gt;save();
            event(new Registered($user));

        } catch (Exception $e) {
            report($e);
            return false;
        }
    }

    public function login(Request $request)
    {
        $validator = Validator::make($request-&amp;gt;all(), [
            'email' =&amp;gt; 'required|string|email|max:255',
            'password' =&amp;gt; 'required|string|min:6|confirmed',
        ]);
        if ($validator-&amp;gt;fails()) {
            return response(['errors' =&amp;gt; $validator-&amp;gt;errors()-&amp;gt;all()], 422);
        }
        $user = User::where('email', $request-&amp;gt;email)-&amp;gt;first();
        if ($user) {
            if (Hash::check($request-&amp;gt;password, $user-&amp;gt;password)) {
                $token = $user-&amp;gt;createToken('Laravel Password Grant Client')-&amp;gt;accessToken;
                return response([
                    'token' =&amp;gt; $token,
                    'userId' =&amp;gt; $user-&amp;gt;id,
                    'successMessage' =&amp;gt; "User successfully logged in"
                ], 200);
            } else {
                return response(['errors' =&amp;gt; "Password mismatch"], 422);
            }
        } else {
            return response(['errors' =&amp;gt; "User doesn't exist"], 422);
        }
    }

    public function logout(Request $request)
    {
        $token = $request-&amp;gt;user()-&amp;gt;token();
        $token-&amp;gt;revoke();
        return response(['successMessage' =&amp;gt; 'You have been successfully logged out!'], 200);
    }
    public function verifyEmail($id, $hash)
    {
        $user = User::find($id);
        if (!$user) {
            return response()-&amp;gt;json(['message' =&amp;gt; 'Invalid user'], 404);
        }
        if (!hash_equals($hash, sha1($user-&amp;gt;getEmailForVerification()))) {
            return response()-&amp;gt;json(['message' =&amp;gt; 'Invalid verification link'], 401);
        }
        if ($user-&amp;gt;hasVerifiedEmail()) {
            return redirect('/')-&amp;gt;with('message', 'Email already verified');
        }
        $user-&amp;gt;markEmailAsVerified();
        return redirect('/');
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the test should pass. If you run the request in postman, provide the body as in the test, you should be able to register. Make sure that php artisan serve is running.&lt;/p&gt;

&lt;h2&gt;
  
  
  Login endpoint
&lt;/h2&gt;

&lt;p&gt;Add this to UserManagementTest.php&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;it('allows a user to login', function () {
    // Create a user in the database
    $user = User::create([
        'name' =&amp;gt; 'John Doe',
        'email' =&amp;gt; 'john@example.com',
        'password' =&amp;gt; Hash::make('password'),
        'password_confirmation' =&amp;gt; Hash::make('password'),
    ]);

    // Attempt to log in with the created user's credentials
    $response = $this-&amp;gt;postJson('/api/login', [
        'email' =&amp;gt; 'john@example.com',
        'password' =&amp;gt; 'password',
        'password_confirmation' =&amp;gt; 'password',
    ]);

    // Assert the response status and structure
    $response-&amp;gt;assertStatus(200)
             -&amp;gt;assertJsonStructure(['token']);
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We need to add the router definition to fix the 404 error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; Route::post('/login', 'App\Http\Controllers\Auth\ApiAuthController@login')-&amp;gt;name('login.api');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>laravel</category>
      <category>php</category>
      <category>vscode</category>
    </item>
    <item>
      <title>Laravel 10 API application with necessary functions pt 2.</title>
      <dc:creator>dgloriaweb</dc:creator>
      <pubDate>Mon, 27 May 2024 10:27:32 +0000</pubDate>
      <link>https://dev.to/dgloriaweb/laravel-10-api-application-with-necessary-functions-pt-2-3dfo</link>
      <guid>https://dev.to/dgloriaweb/laravel-10-api-application-with-necessary-functions-pt-2-3dfo</guid>
      <description>&lt;p&gt;&lt;strong&gt;Environment:&lt;/strong&gt; Windows 10&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Necessary prequisites (knowledge):&lt;/strong&gt; VS Code, Composer, Terminal, Git bash, GitHub, Postman, MarkDown, XAMPP (also serves my MySql database), environmental variables (or .env), Blade, SPA, Sanctum, Passport&lt;/p&gt;

&lt;p&gt;If you require further details, please feel free to add in comments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nice to know:&lt;/strong&gt; If you don't see a change take effect, try stopping the server, and running this to clear cache and config:&lt;br&gt;
&lt;code&gt;php artisan config:cache&lt;/code&gt; &lt;br&gt;
When you've made changes in your .env file, you have to stop the server, run this and restart the server, for the changes to take effect.&lt;br&gt;
Same goes to route changes:&lt;br&gt;
&lt;code&gt;php artisan route:cache&lt;/code&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Project Settings
&lt;/h2&gt;

&lt;p&gt;There are plenty of knowledge on the Laravel documentation (&lt;a href="https://laravel.com/docs/11.x/configuration" rel="noopener noreferrer"&gt;https://laravel.com/docs/11.x/configuration&lt;/a&gt;), please feel free to explore. &lt;br&gt;
I have changed the language just for safety. &lt;br&gt;
&lt;code&gt;'faker_locale' =&amp;gt; 'en_UK',&lt;/code&gt;&lt;br&gt;
My default time zone is UTC, which is correct, you may change this in config/app.php&lt;br&gt;
You may change the .env APP_NAME, but don't use spaces or special characters.&lt;/p&gt;
&lt;h2&gt;
  
  
  Database
&lt;/h2&gt;

&lt;p&gt;I use mysql, and created a local database called L10Schema (case insensitive). I am going to connect the app to this database by editing my .env file like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=l10schema
DB_USERNAME=root
DB_PASSWORD=
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To be able to keep my database in sync at all times with my code, table schemas and fields/columns, I'm going to run &lt;br&gt;
&lt;code&gt;php artisan migrate&lt;/code&gt;&lt;br&gt;
and from now on, when there is a database schema change, I repeat this.&lt;br&gt;
(You can either ctrl+c to stop the php artisan serve code from running while you run this, or just open a new split command prompt and put it in there. )&lt;br&gt;
To check if the migration ran successfully, open your database and see the new tables that's been created by Laravel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current frontend page
&lt;/h2&gt;

&lt;p&gt;The page you see on &lt;a href="http://127.0.0.1:8000/" rel="noopener noreferrer"&gt;http://127.0.0.1:8000/&lt;/a&gt; is called a view. This is the resources\views\welcome.blade.php file, that shows where the blade frontend files should be stored if you decide to use blade for your frontend. We aren't doing frontend in this blog post.&lt;/p&gt;

&lt;p&gt;Don't forget to git commit and git push to store your working app. From this point it is recommended to create a new branch for changes, since what works for me might not work for you.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>windows</category>
      <category>github</category>
    </item>
    <item>
      <title>Laravel 10 API application with necessary functions pt 1.</title>
      <dc:creator>dgloriaweb</dc:creator>
      <pubDate>Mon, 27 May 2024 07:56:01 +0000</pubDate>
      <link>https://dev.to/dgloriaweb/laravel-10-installation-with-necessary-functions-pt-1-4ac2</link>
      <guid>https://dev.to/dgloriaweb/laravel-10-installation-with-necessary-functions-pt-1-4ac2</guid>
      <description>&lt;p&gt;Hi, this is a step by step Laravel installation and build guide for Windows 10 with XAMPP, made in 2024, using Laravel10. I have not brought this to sections, because some steps are not necessary to do in order, and some are dispensable. I will build this as a series since this is a huge work, and your comments/issues are much better understandable if I keep the content in a single part shorter. I haven't gone into detail explaining Laravel packages like Passport, I request you not to ask me to explain why stuff work as it works, but to read the documentation. It took me several years to build a working Laravel API with OAuth, you won't be able to understand all from a single blog post. But do comment, if my explanation or flow didn't work for you, I'll do my best to fill in the gaps. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;UPDATE:&lt;/em&gt; If you install Laravel Breeze package, it does most of this for you. However you still have to setup a mail provider to manage your password reset requests, which I will detail in another post.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Environment:&lt;/strong&gt; Windows 10&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Necessary prequisites (knowledge):&lt;/strong&gt; VS Code, Composer, Terminal, Git bash, GitHub, Postman, MarkDown&lt;/p&gt;

&lt;p&gt;If you require further details, please feel free to add in comments. &lt;/p&gt;




&lt;h2&gt;
  
  
  Project Local Installation
&lt;/h2&gt;

&lt;p&gt;Make sure that the latest composer package manager version is installed.&lt;br&gt;
In your command prompt navigate to the project containing folder, the composer will add a project folder to contain all the files here. Run this in the command line: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;composer create-project laravel/laravel Laravel10_Schema&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Replace Laravel10_Schema with your project name. &lt;br&gt;
After a long list of packages, this should appear and the cursor:    &lt;/p&gt;

&lt;p&gt;&lt;code&gt;INFO  Application key set successfully.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now your main app is ready to use. Go to the project folder: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;cd Laravel10_Schema&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;and run VS Code, or your favourite editor. I'm using VS Code.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;code .&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Open the terminal, I have two splitted windows: a command prompt for running the server, and a GitBash window for version control management.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First time test of the new project:&lt;/strong&gt; &lt;br&gt;
In command prompt type &lt;br&gt;
&lt;code&gt;php artisan serve&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Take note of the server url, you'll need this later when running API from Postman or other. Ctrl-click on the url, and this opens the website in your default browser. &lt;/p&gt;

&lt;h2&gt;
  
  
  Store the app in a GitHub repository:
&lt;/h2&gt;

&lt;p&gt;Open your GitHub, go to new repository, add a name and a description and leave all else untouched. This should take you to a quick setup page, look for this section: &lt;br&gt;
&lt;code&gt;…or create a new repository on the command line&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Click on the copy icon in the right corner, and paste everything into your VS Code terminal/GitBash command line. Easiest is to right click.&lt;br&gt;
When you see  git push -u origin main press enter once again to finish the initialisation. Now you are connected, and if you refresh GitHub, you'll se the Readme.md file contents, that is located in your project's root folder. Experiment with this, change it, once you push your changes in the main repo, this will update. Look for MarkDown to make nice Readme pages.&lt;br&gt;
To update and add all files to your main branch type these in the GitBash:&lt;br&gt;
&lt;code&gt;git add .&lt;/code&gt;&lt;br&gt;
&lt;code&gt;git commit -am 'first'&lt;/code&gt;&lt;br&gt;
&lt;code&gt;git push&lt;/code&gt;&lt;br&gt;
Now, when you refresh your GitHub once more, you can see the same file structure as in the VSCode navigation pane.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>composer</category>
      <category>windows</category>
    </item>
    <item>
      <title>Transition plan from legacy code to new stack</title>
      <dc:creator>dgloriaweb</dc:creator>
      <pubDate>Thu, 22 Feb 2024 12:33:33 +0000</pubDate>
      <link>https://dev.to/dgloriaweb/transition-plan-from-legacy-code-to-new-stack-20ip</link>
      <guid>https://dev.to/dgloriaweb/transition-plan-from-legacy-code-to-new-stack-20ip</guid>
      <description>&lt;p&gt;I don't have too much experience in software development, but I've worked in small companies which had a good product but was suffering with implementing the new user requirements to the old systems, or reskin the old product with fancy stuff that are common and easy to do with the latest Javascript frameworks.&lt;br&gt;
I have been thinking about this, and if the management decides that they need the product to be viable (and lovable) for many years more, they need to invest to the process. As I see it, most users of these companies were way more understanding (provided bug fixes are priority) and flexible than the management thinks. They were tolerant to UX I totally hated from the moment I saw the product. So informing them and asking their understanding for the reduced developer capacity and rollout of new features during the transition period would not stop them from using the product (most of these doesn't even have a competitor, so they don't really have a choice). &lt;br&gt;
I would put the two most junior developers of the team on the task. Why? Because the newly joined colleagues are better in the new tech, since as they apply for jobs, they research what the current market requirements are, and the senior coders often don't know these stacks, either because they aren't interested in them, or they are working on the current code overtime which burns them out from reading IT news, experimenting with new frameworks or do anything related to coding in their free time. Senior coders who spend time with the above during their working hours are few and far between.&lt;br&gt;
I would change the scrum meetings. Would not remove these two developers, because during the ceremonies they are kept up to date with the work the others do, but have a separate section on every ceremony to talk about the new stack. As a start I would setup a roadmap, and define these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;decsion about stack (frontend and backend)&lt;/li&gt;
&lt;li&gt;servers&lt;/li&gt;
&lt;li&gt;major 3rd party services that need to go with the app eg. payment service, &lt;/li&gt;
&lt;li&gt;user authentication&lt;/li&gt;
&lt;li&gt;frontend design (preferably following the current one with less possible alterations. Any improvement ideas that come up can be registered in the backlog under a new epic called frontend improvements) probably with mock data (that helps define the payloads that are required from the API endpoints) and components, or create a complete corporate style guide. I am not a frontend dev, but I'd build something that has all of the reusable components and their variations (buttons, checkboxes, etc) and a guide how to customize them and add JS functions eg. Vue slots.&lt;/li&gt;
&lt;li&gt;backend define API endpoints with time scheduling for API documentation writing and then development (after the fiddle with the mock data on frontend, it should be quite clear what data tables and structure needed)&lt;/li&gt;
&lt;li&gt;connecting frontend to backend replacing mock data&lt;/li&gt;
&lt;li&gt;start adding new features or changes parallel with the old system&lt;/li&gt;
&lt;li&gt;define when to start moving the dev team members one by one into the new stack&lt;/li&gt;
&lt;li&gt;Invite key customers to start using the new platform&lt;/li&gt;
&lt;li&gt;Move every customer to the new system.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'd say it can be done in 2 years, I wouldn't put too much pressure on the devs. As usual the roadmap has to be adjusted so if the team is just as good as it should be, they finish earlier and everybody's happy.&lt;br&gt;
I am fully aware what it costs to pay 2 full time software developers for 2 years "doing nothing". But I also participated on the roadmap meetings where management stated that they want to increase the number of developers (in spite of the annual fluctuation of 2 people), and trying to force them against their will to work on a code that is full of errors and nobody of the seniors wants to touch, afraid it might collapse. As it often does. So the juniors say "there's nothing to learn here" and leave. On the other hand, the juniors are eager to understand the old code so they spend time to read it, and often delete hundreds of lines of unnecessary code without breaking anything. So hire them, put them on the new stuff and watch with awe what they come up with. &lt;br&gt;
What do you think?&lt;/p&gt;

</description>
      <category>agile</category>
      <category>scrum</category>
    </item>
  </channel>
</rss>
