Skip to main content

Posts

Showing posts from 2022

Let's learn redux-saga

Greetings! In a previous article , I talked about redux architecture with reactjs a bit. In this article, I talk about handling side effects with redux-saga. The complete code for this article is here . What is redux-saga? Redux saga is a side effect manager using ES6 generators. Therefore it gives the added benefit of easy testability. What do we build? To demonstrate the architecture, let's create a simple GitHub user application where we fetch GitHub handle for a given username. For example, this gives my GitHub account information. https://api.github.com/users/slmanju Initialize the project create-react-app react-redux-saga-example cd react-redux-saga-example npm install redux react-redux reselect npm install redux-saga npm install axios Util to fetch actual data Let's create a little util for HTTP calls using axios. import axios from "axios"; const withError = (promise) => promise.then((data) => [null, data]).catch((err) => [err]); export const

Getting started with react-redux

Greetings! Redux is described as a predictable state container for JS Apps (in the docs) and a few more features. What we need to realize is that it gives a single source of truth for our JavaScript applications. Instead of saving our global states in multiple places, we manage them in a centralized location. That is it! Let's jump. Single source of truth Share data across multiple places The source code for this article can be found here . The redux architecture It is this redux architecture we need to understand. After that, it is how to accomplish it in reactjs way. view - any part of the user interface action - what sort of thing the user did in the user interface? reducer - this is where the data manipulation happens. It captures the action and acts upon that, updates the store store - this is where the all data is saved just like a database These are the main players we need to know, we need to understand. Next, we will use the react-redux

REST API Design In Practice

Greetings REST API designing and modeling is a beautiful art one can master. I was lucky to work in such an environment where we gave a lot of effort to design better APIs by following proper guidelines. Out of all the companies I worked for, it had the best guide on REST design. I thought to share my learning and some thoughts on REST API designing decisions one can take. The product domain is healthcare hence I am referring to the FHIR standard here as it is more generic and common for anyone. I choose the FHIR appointment as the discussion point. Challenges These are some of the challenges for any project that we will face. There is a lot of logic on the client and there are other structural problems after many years of development Complex logic and difficult to grasp Multiple modules are impacted Support new requirements while preserving the running system behavior Deliver on time Need to support multiple con

Design a scheduled report sender

Greetings! In one of my projects, I got an opportunity to design the architecture for a scheduled report processor and sender. As this is a legacy system, we used existing internal tools, and frameworks hence I'm not able to share the complete architecture but the general idea. This was one of those stressful but fun work. Existing system It can be represented as 3 tier architecture that is common for most of the applications. Design considerations As most of these kinds of architectures have similarities among them, what is important here is the thinking process as we are dealing with an existing system. No impact on the running application Independent development Asynchronous data processing Deploy separately Design I had to tweak the database a little bit but that is not important here. What is important is to expose a separate API for the data loader (ETL). ETL is triggered by a Cron job which eventually inserts into the queue for interested parties to use. Final notes This is

Designed a mini business rule engine, here is how

Greetings! When you are a passionate developer, you will always try to do better things, and experiments with new things. In this article, I will explain how we achieved a complex code cleanup by creating a mini business rule engine. Why is it? There is business logic depends on each other due to business behavior, mainly due to years of development. The business knowledge of the behavior is missing. Problem statement This legacy module has been developed a long ago and new codes are also a copy of those codes. I see numerous issues there. Business knowledge is missing (Logic is hidden everywhere) Unmanageable codes due to years of development Complex logic The main APIs (multiple) depend on this Two domains are coupled New joiners cannot understand the domain Error-prone due to fragile codes How to approach As there are higher-priority tickets in the backlog, it is difficult to prioritize this kind of work as it

How and why I designed a business validatoion framework

Greetings! Business validations are a crucial part of any application. We faced use cases with too many validations. It is hard to maintain and extend the solutions with such a number of validations. This is when I thought to try a solution even though there was no such task in the backlog. Hence I used my own personal time for this. Features Execute a larger number of validations in single use case Reusability by sharing the same validation in different use cases Skip non-mandatory validations by user choice (yes/no dialogs) Expose validations via REST API Extendability by adding/removing validations No performance impact Easy to use in future developments It all started with an Interface My quick solution was to introduce a common interface by utilizing Java generics and Java 8 new features. I did not have all the features in mind when introducing this. However, that is the power of having a proper interface. public interface Validator<T> { void vali

Design a meeting event scheduler

Greetings! I got a chance to work on a project where we had UIs for meeting schedules and later improved it to sync with external calendars as well. In this article, I am sharing my general ideas on that design. The main business requirement is to access meetings anywhere whether from our system or an external system. (It is a different domain, for the article's purpose I refer to these as meetings) Initial investigation I took a decision to make this a normal meeting request just like Google calendar as making this a meeting event would be more appropriate and user-friendly. My co-worker did the initial investigation on iCalendar format which is standard for calendar clients. We found that sending a meeting request is an email with the header "type=calendar". Initial investigation and the proof-of-concept is done! Let's define the main components. Main components We could complete this by adding simple classes/logic. However, that is not real engineering. Hence, I de

How and why I designed a meeting (iCalendar) library

Greetings! Have you ever thought about how to send a meeting event programmatically? In one of the projects I worked on, there was a requirement to send the appointment information to the user (in addition to visualizing it in our UIs). This is when I thought to do this as a meeting request. How can we do that? We learned that these calendar applications follow a standard format, that is "icalendar". Now my job is to create these .ics files. We investigated a few existing libraries as well but I was not happy with them as I wanted to send it as a meeting request but it did not work with existing libraries. At the same time, we have a lengthy process when introducing new libraries. Hence, why don't I build my own library 😉? What is iCalendar? The iCalendar is the standard specification for calendaring and scheduling events. It allows users to store and exchange calendaring and scheduling information such as events, to-dos, etc. According to the specification u

How and why I designed an email library

 Greetings! How do you send emails using Java? You would probably use a free library/framework like Spring or anything available. Or, you might write a simple email-sending class. However, when I needed an emailing functionality for one of the requirements, I decided to do more. Why? In larger projects, we always should think about the bigger picture. Adding a new library should be done with a lot of investigation Module-only features have no value for the product That is why I thought to give this an extra effort and designed an internal email library. General idea This is simple. Any team should be able to use this library without depending on any other external libraries. Also, the email API can have any implementation without impacting consumer modules. Existing libraries Initially, I thought to use Spring email but Spring core doesn't come with it. It looks like Spring should have separate jars for this. But anyway this will not help me now. There are other email libraries but

Let's solve (N+1) problem in GraphQL

Greetings! This is the fourth article of the GraphQL series and the second part of the Query where I am going to solve (N+1) problem in GraphQL. However, I will add complete codes as well to make it usable on its own. The complete code can be found here . Code with (N+1) problem unresolved is here . (N+1) in brief When we fetch relationships like we did in our movie server where we queried movies, there will be extra N queries to fetch the relationship (director). With the first query to find movies, there are (N+1) queries altogether. Had you run our example by adding a console.log you can see the problem clearly. export function findDirector(id) { console.log(`find director for {id}`); return directors.find(director => director.id === id); } This problem does not depend on the database we used. Whether it is a fake store like we use, MySql, or MongoDB, the problem is the same. Solving N+1 Facebook provides a solution for this using the library data-loa

Let's build a GraphQL server with Node.js and Express (2)

Greetings! In this third article of the GraphQL series, I would like to discuss the steps needed to create a GraphQL server using Node.js with a somewhat more advanced query than the previous one. The complete code can be found here . What do we build? Movie API where we can query movies and directors' information. Initializing the project npm init -y npm install express graphql express-graphql --save npm install @babel/core @babel/node @babel/preset-env --save-dev npm install nodemon --save-dev Enable ES6 modules in package.json and add a start command for nodemon. { "name": "nodejs-graphql-query", "version": "1.0.0", "description": "", "main": "index.js", "type": "module", "scripts": { "start": "nodemon --exec babel-node src/index", "test": "echo \"Error: no test specified\" && exit 1"

Let's build a GraphQL starter server with Node.js and Express

Greetings! This is the second article of the GraphQL series, I would like to discuss the steps needed to create a GraphQL server using Node.js. Have a look at the first article if haven't read it yet. The complete code can be found here .  What we build As the idea is to create a basic GraphQL server, we will expose the "Hello World" query. Initializing the project npm init -y npm install express graphql express-graphql --save npm install @babel/core @babel/node @babel/preset-env --save-dev npm install nodemon --save-dev Enable ES6 modules in package.json and add a start command for nodemon. { "name": "nodejs-graphql-starter", "version": "1.0.0", "description": "", "main": "index.js", "type": "module", "scripts": { "start": "nodemon --exec babel-node index", "test": "echo \"Error: no