<?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>Forem: Taiwo Momoh</title>
    <description>The latest articles on Forem by Taiwo Momoh (@tylerjusfly).</description>
    <link>https://forem.com/tylerjusfly</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%2F738935%2Fdb1f4467-0558-4b3b-95c1-e974977511f6.jpeg</url>
      <title>Forem: Taiwo Momoh</title>
      <link>https://forem.com/tylerjusfly</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/tylerjusfly"/>
    <language>en</language>
    <item>
      <title>The Transactional outbox pattern</title>
      <dc:creator>Taiwo Momoh</dc:creator>
      <pubDate>Sat, 21 Jun 2025 08:26:07 +0000</pubDate>
      <link>https://forem.com/tylerjusfly/the-transactional-outbox-pattern-54a4</link>
      <guid>https://forem.com/tylerjusfly/the-transactional-outbox-pattern-54a4</guid>
      <description>&lt;p&gt;&lt;u&gt;Problem statement&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Your company runs a distributed system that handles user data. When a user is created or updated, two things are supposed to happen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The system writes the changes to the user database (the source of truth).&lt;/li&gt;
&lt;li&gt;It then publishes an event to Kafka, notifying downstream services so they can update their read-optimized tables.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The system successfully writes to the database. Immediately after, before it can send the Kafka event, the service crashes due to a bug, an out-of-memory error, or a sudden shutdown. 😢😢&lt;/p&gt;

&lt;p&gt;Your write database has the correct user information but the read-optimized table has no idea this change happened. &lt;/p&gt;

&lt;p&gt;This failure results in inconsistent data. This, right here, is what we call the &lt;u&gt;Dual Write Operations Issue&lt;/u&gt;.&lt;/p&gt;

&lt;p&gt;There are several ways to solve this issue, one of them is using&lt;br&gt;
&lt;code&gt;Transactional outbox pattern&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What is transactional outbox pattern
&lt;/h2&gt;

&lt;p&gt;A design pattern used in distributed systems to reliably publish events/messages to other systems only if the corresponding database transaction succeeds.&lt;/p&gt;

&lt;p&gt;In a normal database transaction, you can’t directly publish an event to Kafka because if the transaction fails, rollback is impossible. Database transactions can be undone if something goes wrong, but Kafka messages are fire-and-forget.&lt;/p&gt;

&lt;p&gt;So Instead of sending the event directly to Kafka, you insert the event into an outbox table in the same database transaction , This ensures that either both the user data and the event is saved, or neither is (thanks to ACID transactions).&lt;/p&gt;

&lt;p&gt;This event is later published to Kafka by a relay process. This ensures our read-optimized tables stay in sync with the main database.&lt;/p&gt;

&lt;p&gt;A nodejs example that insert user in the user table and inserts an event in the outbox&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; try {
    // Start transaction
    await client.query('BEGIN');

    // 1. Insert user
    const userResult = await client.query(
      'INSERT INTO users (name, email) VALUES ($1, $2) RETURNING id',
      ["test", "test@email.com"]
    );
    const userId = userResult.rows[0].id;

    // 2. Insert into outbox (same transaction)
    const eventPayload = {
      userId,
      email: "test@email.com",
      timestamp: new Date().toISOString()
    };

    await client.query(
      'INSERT INTO outbox (event_type, payload) VALUES ($1, $2)',
      ['UserCreated', eventPayload]
    );

    // 3. Commit if both succeed
    await client.query('COMMIT');
    console.log('User and event saved!');

    return userId;
  } catch (error) {
    // Rollback on any error
    await client.query('ROLLBACK');
    console.error('Transaction failed:', error);
    throw error;
  }

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Relay Process
&lt;/h2&gt;

&lt;p&gt;The message relay runs in the background, constantly checking the outbox table for unpublished events. When it finds this unpublished records , it sends them to Kafka and are marked as processed or deleted from the outbox.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ways to implement the Relay Process
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Polling Service&lt;/u&gt;&lt;/strong&gt; is a background process that constantly checks the outbox table for new or unpublished events. While it gets the job done, it can add unnecessary load to your database, especially if you're scanning large parts of the table without proper indexing or batching, and it gets worse if it runs too frequently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Change Data Capture&lt;/u&gt;&lt;/strong&gt; (CDC) can be used in conjunction with the Transactional Outbox pattern to efficiently capture changes made to the outbox table and publish them to kafka.&lt;/p&gt;

&lt;h2&gt;
  
  
  Few Drawbacks
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Kafka might deliver the same message multiple times. The receiving service needs to handle this gracefully by implementing idempotency, which is basically making sure that processing the same event twice doesn't break anything.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Event ordering is something you really need to watch out for too. If you're doing event sourcing, those events hitting Kafka better be in the exact same sequence as your database updates, otherwise you're going to reconstruct the wrong state.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When Should you use transactional outbox pattern
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You're building an event-driven application where a database update initiates an event notification.&lt;/li&gt;
&lt;li&gt;You want to ensure atomicity in operations that involve two services.&lt;/li&gt;
&lt;li&gt;Mostly valid for microservice architecture, for monolith it adds unnecessary complexity and performance overhead.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;u&gt;Additional articles&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/prescriptive-guidance/latest/cloud-design-patterns/transactional-outbox.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/prescriptive-guidance/latest/cloud-design-patterns/transactional-outbox.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>The Saga Pattern</title>
      <dc:creator>Taiwo Momoh</dc:creator>
      <pubDate>Mon, 09 Jun 2025 09:18:28 +0000</pubDate>
      <link>https://forem.com/tylerjusfly/the-saga-pattern-3lf</link>
      <guid>https://forem.com/tylerjusfly/the-saga-pattern-3lf</guid>
      <description>&lt;p&gt;This article provides an overview of what I learned about the Saga pattern.&lt;/p&gt;

&lt;p&gt;A Saga is a sequence of local transactions. Each local transaction updates the database and publishes a message or an event (either success or failure message) to the next transaction in the Saga.&lt;/p&gt;

&lt;p&gt;It ensures atomicity. This means the transaction either completes fully or not at all. If one of the service fails, it undoes all previous changes (e.g., an update made to the database) made by other service. This process is known as a compensating transaction.&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%2Fdozuzd7r5ywhgdliziqn.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%2Fdozuzd7r5ywhgdliziqn.png" alt="saga explanation" width="695" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In saga we have two primary coordination style&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Orchestrator&lt;/li&gt;
&lt;li&gt;Choreography&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;Orchestrator&lt;/code&gt; is like a central brain. It directs each step of the Saga, telling services when to perform their operations and what to do next.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Orchestrator
async function bookTripSaga() {
  console.log("🧠 Starting trip booking saga...");

  try {
    await reserveFlight();
    try {
      await bookHotel();
      try {
        await rentCar();
        console.log("✅ Trip booked successfully!");
      } catch (err) {
        console.error("❌ Car rental failed:", err.message);
        await cancelHotel();
        await cancelFlight();
      }
    } catch (err) {
      console.error("❌ Hotel booking failed:", err.message);
      await cancelFlight();
    }
  } catch (err) {
    console.error("❌ Flight reservation failed:", err.message);
  }

  console.log("🧠 Saga finished.");
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;This example demonstrates the basic concept of a saga orchestrator with compensating transactions for failures, and less than ideal for production use.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In the &lt;code&gt;Choreography&lt;/code&gt; coordination style, services publish events that trigger a local transaction in other services.&lt;/p&gt;

&lt;p&gt;Instead of a central orchestrator telling a service what to do, each service listens for events and reacts accordingly.&lt;/p&gt;

&lt;p&gt;This Javascript example gives you a taste of the Choreography coordination style. 👇&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const { EventEmitter } = require('events');

const eventBus = new EventEmitter();

// ======================
// Simulated Services
// ======================

eventBus.on('TripRequested', async () =&amp;gt; {
  console.log("✈️  [FlightService] Reserving flight...");
  try {
    await Promise.resolve("FlightReserved");
    console.log("✅ [FlightService] Flight reserved");
    eventBus.emit('FlightReserved');
  } catch (err) {
    console.error("❌ [FlightService] Flight reservation failed:", err.message);
  }
});

eventBus.on('FlightReserved', async () =&amp;gt; {
  console.log("🏨 [HotelService] Booking hotel...");
  try {
    await Promise.resolve("HotelBooked");
    console.log("✅ [HotelService] Hotel booked");
    eventBus.emit('HotelBooked');
  } catch (err) {
    console.error("❌ [HotelService] Hotel booking failed:", err.message);
    eventBus.emit('HotelBookingFailed');
  }
});

eventBus.on('HotelBooked', async () =&amp;gt; {
  console.log("🚗 [CarService] Renting car...");
  try {
    await Promise.reject(new Error("Vehicle not available")); // simulate failure
    console.log("✅ [CarService] Car rented");
    eventBus.emit('TripCompleted');
  } catch (err) {
    console.error("❌ [CarService] Car rental failed:", err.message);
    eventBus.emit('CarRentalFailed');
  }
});

// Compensation handlers
eventBus.on('CarRentalFailed', async () =&amp;gt; {
  console.log("❌ [HotelService] Canceling hotel...");
  await Promise.resolve("HotelCanceled");

  console.log("❌ [FlightService] Canceling flight...");
  await Promise.resolve("FlightCanceled");

  console.log("🧠 Trip saga compensated.");
});

eventBus.on('HotelBookingFailed', async () =&amp;gt; {
  console.log("❌ [FlightService] Canceling flight...");
  await Promise.resolve("FlightCanceled");

  console.log("🧠 Trip saga compensated.");
});

eventBus.on('TripCompleted', () =&amp;gt; {
  console.log("🎉 Trip booking completed successfully!");
});

// ======================
// Start Saga
// ======================
function bookTripChoreographySaga() {
  console.log("🧠 Starting trip booking (choreography saga)...");
  eventBus.emit('TripRequested');
}

bookTripChoreographySaga();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Isolation Challenge in Sagas
&lt;/h2&gt;

&lt;p&gt;In a Saga, especially a distributed saga where each service manages its own database. If multiple sagas run concurrently, they might:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Interfere with each other&lt;/li&gt;
&lt;li&gt;See partially updated data&lt;/li&gt;
&lt;li&gt;Trigger inconsistent business data &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sagas lacks built-in isolation. Imagine two users are trying to &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Book the last room in a hotel&lt;/li&gt;
&lt;li&gt;Both check availability → see it's free&lt;/li&gt;
&lt;li&gt;Both try to reserve it → race condition&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without isolation, both might believe they succeeded, leading to overbooking.&lt;/p&gt;

&lt;p&gt;So in this case developers must implement it isolation explicitly&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementing Countermeasures 🪖🪖.
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pessimistic Concurrency (Reservation Pattern)&lt;/strong&gt; : Temporarily “locks” a resource by marking it as reserved. So other sagas see it as unavailable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;async function bookTripSaga(userId, hotelId, flightDetails ) {

  try {
    // Step 1: Reserve the hotel
    const hotelReserved = await reserveHotel(hotelId, userId);

    // If a saga is currenntly running, hotel is marked as reserved
   //  So other sagas see it as unavailable
    if (!hotelReserved) throw new Error("Hotel unavailable");

    // Step 2: Book the flight
    const flightBooked = await bookFlight(flightDetails, userId);
    if (!flightBooked) throw new Error("Flight booking failed");

    // Step 3: Mark hotel as booked
    await confirmHotel(hotelId, userId);

    return { success: true, message: "Trip booked successfully" };

  } catch (error) {
    // Compensation to marked hotel as available
    await releaseHotel(hotelId, userId);
    return { success: false, message: error.message };
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Other issues and considerations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Increased Latency&lt;/strong&gt; :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If the transaction makes synchronous calls (e.g., using the Orchestrator approach), each service call waits for a response before continuing.&lt;/li&gt;
&lt;li&gt;Compensatory transactions can also add latency to the overall response time. For example, if step 5 of a 6-step Saga fails, all previous steps must be rolled back, which adds additional latency.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Idempotency&lt;/strong&gt;: Failures during a Saga (or during compensation) can be tricky to recover from. They require retry logic, and this is where idempotency becomes crucial.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Read more on idempotency: &lt;a href="https://resend.com/blog/engineering-idempotency-keys" rel="noopener noreferrer"&gt;Engineering Idempotency Keys&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dual writes issue&lt;/strong&gt;: The dual-write issue occurs when two external systems has to atomically update the database and publish an event. The failure of either operation might lead to an inconsistent state. One way to solve this is to use the &lt;code&gt;transactional outbox pattern&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Glossary&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Transactions:
&lt;code&gt;In the context of databases and data storage systems, a transaction is any operation that is treated as a single unit of work, which either completes fully or does not complete at all.&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>designpatterns</category>
      <category>tutorial</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How to set up path Alias in react.</title>
      <dc:creator>Taiwo Momoh</dc:creator>
      <pubDate>Fri, 29 Sep 2023 23:19:09 +0000</pubDate>
      <link>https://forem.com/tylerjusfly/how-to-set-up-alias-for-files-in-react-3gok</link>
      <guid>https://forem.com/tylerjusfly/how-to-set-up-alias-for-files-in-react-3gok</guid>
      <description>&lt;p&gt;I'm not sure if this is the right title for this, but it took me a while to find a solution for this, So i'm keeping this here.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: I'm assuming you are using react with vite.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Add this to the tsconfig.json file under the compilerOptions object.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"baseUrl": ".",
"paths": {
  "@/*": ["./src/*"]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install @types/node to dev dependency for type safety for importing from the path module.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn add -d @types/node
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And change the vite.config.ts to understand the @ sign as well as an alias of the "src" folder.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import path from 'path'
import react from '@vitejs/plugin-react'
import { defineConfig } from 'vite'

export default defineConfig({
  plugins: [react()],
  resolve: {
    alias: {
      '@': path.resolve(__dirname, './src'),
    },
  },
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Solution was extracted from &lt;a href="https://linkb.hashnode.dev/bunsh-with-react-typescript-tailwindcss-and-storybook" rel="noopener noreferrer"&gt;Borris&lt;/a&gt; article.&lt;/p&gt;

&lt;p&gt;End.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Food Library- Using azure app service, NodeJs, Pug</title>
      <dc:creator>Taiwo Momoh</dc:creator>
      <pubDate>Sun, 06 Mar 2022 11:57:47 +0000</pubDate>
      <link>https://forem.com/tylerjusfly/food-library-using-azure-app-service-nodejs-pug-15e0</link>
      <guid>https://forem.com/tylerjusfly/food-library-using-azure-app-service-nodejs-pug-15e0</guid>
      <description>&lt;h3&gt;
  
  
  Overview of My Submission
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Food Library&lt;/strong&gt; is a nodejs, expressJs out of the blue idea, the main focus of this project is making use and learning all the functions available in the app service category. like first deploying with Vscode then later implemented the CI/CD with Github, creating an alert rule and lots more. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Food Library&lt;/strong&gt; Aims to promote your country culture through its wide variety of foods and dishes, Post your dishes and hype your country.&lt;/p&gt;

&lt;h3&gt;
  
  
  Submission Category:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Computing Captains&lt;/strong&gt; Category &lt;/p&gt;

&lt;h3&gt;
  
  
  Link to Code on GitHub
&lt;/h3&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/tylerjusfly" rel="noopener noreferrer"&gt;
        tylerjusfly
      &lt;/a&gt; / &lt;a href="https://github.com/tylerjusfly/azure-devto-hackathon" rel="noopener noreferrer"&gt;
        azure-devto-hackathon
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      This an API though with PUG as its templating engine.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Hello World, Behold My Dev.To Azure Hackathon (runners up project)&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;This an API though with PUG as its templating engine.&lt;/h1&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Fuctionalities&lt;/h2&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;SignUp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SignIn&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Visit Dashboard&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Add a dish that exist in your country to database &lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;view dishes without creating any account&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Search for dishes&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Future Functions&lt;/h2&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Edit Button&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Delete Dish Button&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pagination&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rewriting&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;visit us&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a href="https://food-library-azure.herokuapp.com/" rel="nofollow noopener noreferrer"&gt;https://food-library-azure.herokuapp.com/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/tylerjusfly/azure-devto-hackathon" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;The Functionalities and how to find your way around is in the README.md file.&lt;br&gt;
The MIT license can be found in the LICENSE file and is part of the repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  Additional Resources / Info
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Created my alert rule from azure app
&lt;/h4&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%2F7wfc5axxoqoczqi876c9.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%2F7wfc5axxoqoczqi876c9.PNG" alt="Image description" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  The HomePage where a User can SignIn and Signup
&lt;/h4&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%2F5op6uyd308qrmx5gnrbc.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%2F5op6uyd308qrmx5gnrbc.PNG" alt="Image description" width="800" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  My Triggered alert when i have &amp;gt; 2 code 200 request
&lt;/h4&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%2Fl9wcp96t1jqehgf7dzt4.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%2Fl9wcp96t1jqehgf7dzt4.PNG" alt="Image description" width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  View various dishes and add yours to it
&lt;/h4&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%2Ffxge2pmhxfo6m6sxor6l.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%2Ffxge2pmhxfo6m6sxor6l.PNG" alt="Image description" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Visit us at &lt;a href="https://store-api.azurewebsites.net/" rel="noopener noreferrer"&gt;https://store-api.azurewebsites.net/&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  There were no other developers involved in this work.
&lt;/h4&gt;

</description>
      <category>azuretrialhack</category>
      <category>azure</category>
      <category>microsoft</category>
    </item>
  </channel>
</rss>
