<?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: aidelojep</title>
    <description>The latest articles on DEV Community by aidelojep (@aidelojep).</description>
    <link>https://dev.to/aidelojep</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%2F578614%2F2a162de2-06c7-4e95-bb20-7e732d91c717.JPG</url>
      <title>DEV Community: aidelojep</title>
      <link>https://dev.to/aidelojep</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aidelojep"/>
    <language>en</language>
    <item>
      <title>Building a Task Management Application using Rest API, Spring Boot, Maven and Fauna</title>
      <dc:creator>aidelojep</dc:creator>
      <pubDate>Tue, 30 Nov 2021 06:48:00 +0000</pubDate>
      <link>https://dev.to/aidelojep/building-a-task-management-application-using-rest-api-spring-boot-maven-and-fauna-9b0</link>
      <guid>https://dev.to/aidelojep/building-a-task-management-application-using-rest-api-spring-boot-maven-and-fauna-9b0</guid>
      <description>&lt;p&gt;&lt;strong&gt;Written in connection with the &lt;a href="https://fauna.com/blog/write-with-fauna" rel="noopener noreferrer"&gt;Write with Fauna Program&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This article focuses on the tutorial steps in building a Rest API using the Java Programming framework (Spring Boot), Maven, and Fauna. We used Fauna as our database to save our information and integrated this into our Spring Boot project. We also outlined these steps to make it easy for beginners to follow through and implement the same using these steps when working on a similar project.&lt;br&gt;
The Rest API is more suitable for server-side API rendering. Hence, the REST API is a valuable architectural style for microservices because of its simplicity, scalability and flexibility. In microservice architecture, each application is designed as an independent service from the other. We recall that microservices rely on small teams to deploy and scale their respective services independently, this makes the REST API an invaluable resource to this architectural style.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;To fully understand this part of the tutorial, you are required to have the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fundamental knowledge of how to program with Java.&lt;/li&gt;
&lt;li&gt;At least fundamental knowledge of Spring Framework and Spring Boot.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.java.com/en/" rel="noopener noreferrer"&gt;Java Development Kit(JDK)&lt;/a&gt;installed.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.postman.com/downloads" rel="noopener noreferrer"&gt;Postman&lt;/a&gt; installed or click on the link to download and install.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://maven.apache.org/download.cgi" rel="noopener noreferrer"&gt;Maven&lt;/a&gt; installed or click on the link to download and install.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.jetbrains.com/idea/download/" rel="noopener noreferrer"&gt;IntelliJ&lt;/a&gt; installed or click on the link to install. You can use any other IDEA of choice.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What is an API?
&lt;/h3&gt;

&lt;p&gt;In the simplest form, an API is the acronym for application programming interface that allows for two or more different applications to talk to each other. Everytime you make use of these applications, the applications on your phone, gadgets or computer connect to the internet and send data to the server. This data retrieved by the server is then interpreted, and some actions are performed and a feedback is sent back to you in a human or readable format. The API also provides a level of security here since each communication entails a small packet of data, the data sharing here only entails that which is necessary. Another additional benefit of RESTful APIs is its Client-Server constraints. This constraint operates on the concept that the client and server side should be separated from each other. This is referred to as separation of concerns which guarantees more efficiency in our application. Therefore, I should be able to make changes on my client side without affecting my database design on the server and vice-versa. This makes our application to be loosely coupled and easily scalable .&lt;br&gt;
This article teaches how to create a SpringBoot and Restful API that performs CRUD (Create, Read, Update and Delete) operations by making a database call to a Fauna. The application we will be building in this tutorial is a “task-management app” for users to manage all their daily tasks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Takeaways
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;How to create and set up a Spring Boot application with a Tomcat Server.&lt;/li&gt;
&lt;li&gt;Fauna database configuration in a Spring Boot Project.&lt;/li&gt;
&lt;li&gt;Maven for Dependency management.&lt;/li&gt;
&lt;li&gt;Exception Handling in Java.&lt;/li&gt;
&lt;li&gt;How to document API using Swagger.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Project Setup
&lt;/h3&gt;

&lt;p&gt;To initialize the project we are going to use &lt;a href="https://start.spring.io/" rel="noopener noreferrer"&gt;&lt;em&gt;spring initializer&lt;/em&gt; &lt;/a&gt;.  Enter the maven project properties of the project including the dependencies as shown below and click on the generate button. This will generate a zip file and download it for you. Unzip it and open it in your favorite IDEA and sync the dependencies with Maven.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F7equkclt1ji3lo3w8dn9.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F7equkclt1ji3lo3w8dn9.PNG" alt="spring initializer image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For this project we are going to add two dependencies namely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Spring web&lt;/strong&gt;: This dependency makes your project a web application. The spring-boot-starter-web dependency transitively pulls in all dependencies related to Web development using Spring MVC, REST, and Tomcat as a default embedded server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spring Data JPA&lt;/strong&gt;: This allows us to persist data in SQL databases using Spring Data and Hibernate which is an implementation of the JPA. JPA stands for Java Persistent API, it is a specification that is part of Java EE (Enterprise Edition) and defines an API for Object-Relational Mappings (ORM) and for managing persistent objects and Relational Databases. It is considered a standard approach for Object Relational Mapping. Being that JPA is a specification, it does not perform any operation by itself, as such requires implementation. Hibernate is one of those ORM (Object Relational Mapping) tools that implements JPA. Others include TopLink, MyBatis.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The EntryPoint of the Application
&lt;/h3&gt;

&lt;p&gt;The beauty of  SpringBoot lies in how  easy  it is to create stand-alone, production-grade spring-based applications that you can "just run". If you open your TaskManagerApplication.java file.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;

&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.taskVentures.taskmanager&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.beans.factory.config.ConfigurableBeanFactory&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.boot.SpringApplication&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.boot.autoconfigure.SpringBootApplication&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.context.annotation.Bean&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.context.annotation.Scope&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@SpringBootApplication&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TaskmanagerApplication&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;SpringApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;TaskmanagerApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;SpringBoot applications should have an entry point class with the public static void main(String[] args) methods, which is annotated with the &lt;code&gt;@SpringBootApplication&lt;/code&gt; annotation and will be used to bootstrap the application. It is the main method which is the entry point of the JVM to run our application.&lt;br&gt;
The &lt;code&gt;@SpringBootApplication&lt;/code&gt; annotation informs the Spring framework, when launched, to scan for Spring components inside this package and register them. It also tells Spring Boot to enable Autoconfiguration, a process where beans are automatically created based on classpath settings, property settings, and other factors. The &lt;code&gt;@SpringBootApplication&lt;/code&gt; annotation has composed functionality from three annotations namely &lt;code&gt;@EnableAutoConfiguration&lt;/code&gt;,&lt;code&gt;@ComponentScan&lt;/code&gt;, and &lt;code&gt;@Configuration&lt;/code&gt;. So we can say it is the shortcut for the three annotations.&lt;/p&gt;

&lt;p&gt;Now, we can now run our application. We can do this by either clicking on the play button on our IDEA or running this command: mvn spring-boot:run on our command line. Navigate to the root of the project via the command line and execute the command. Boom! Tomcat started on port 8081 which is the port we configured our application to run.&lt;/p&gt;

&lt;h3&gt;
  
  
  Maven as a dependency management tool.
&lt;/h3&gt;

&lt;p&gt;The pom.xml file houses the dependencies, Maven plugins in our project.&lt;br&gt;
The dependency section simply contains the dependencies we added to our project namely  SpringWeb and springfox for documenting our api.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;

&lt;span class="o"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="n"&gt;xml&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"1.0"&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="o"&gt;?&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt; &lt;span class="n"&gt;xmlns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"http://maven.apache.org/POM/4.0.0"&lt;/span&gt; &lt;span class="nl"&gt;xmlns:&lt;/span&gt;&lt;span class="n"&gt;xsi&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2001/XMLSchema-instance"&lt;/span&gt;
    &lt;span class="nl"&gt;xsi:&lt;/span&gt;&lt;span class="n"&gt;schemaLocation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;modelVersion&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mf"&gt;4.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;modelVersion&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;groupId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;springframework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;boot&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;groupId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;artifactId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;spring&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;boot&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;starter&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;artifactId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mf"&gt;2.5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;relativePath&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;!--&lt;/span&gt; &lt;span class="n"&gt;lookup&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;repository&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;groupId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;taskVentures&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;groupId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;artifactId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;taskmanager&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;artifactId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="no"&gt;SNAPSHOT&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;taskmanager&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="no"&gt;A&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt; &lt;span class="n"&gt;application&lt;/span&gt; &lt;span class="n"&gt;that&lt;/span&gt; &lt;span class="n"&gt;individual&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;manage&lt;/span&gt; &lt;span class="n"&gt;their&lt;/span&gt; &lt;span class="n"&gt;daily&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="o"&gt;.&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;dependencies&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;dependency&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;groupId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;springfox&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;groupId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;artifactId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;springfox&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;boot&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;starter&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;artifactId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;dependency&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;dependency&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;groupId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;springframework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;boot&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;groupId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;artifactId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;spring&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;boot&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;starter&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;artifactId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;dependency&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;dependency&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;groupId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;springframework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;boot&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;groupId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;artifactId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;spring&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;boot&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;starter&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;artifactId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;dependency&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;dependencies&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; 
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;plugin&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;groupId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;springframework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;boot&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;groupId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;artifactId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;spring&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;boot&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;maven&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;plugin&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;artifactId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;plugin&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;


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

&lt;/div&gt;
&lt;h3&gt;
  
  
  Adding Additional Maven Dependencies
&lt;/h3&gt;

&lt;p&gt;In this section we are going to add additional deficiencies to the project. To do this, we navigate to &lt;a href="https://mvnrepository.com/" rel="noopener noreferrer"&gt;Maven Repository&lt;/a&gt;  and search for the Fauna dependency and add it to the dependencies section of the pom.xml file:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Faunadb:&lt;/strong&gt; A Fauna cloud database dependencies that connect our Java application to Fuana serverless database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lombok:&lt;/strong&gt; A lombok dependency helps us to reduce boiler plate codes.&lt;/li&gt;
&lt;li&gt;Sync the newly added dependencies to the application.&lt;/li&gt;
&lt;li&gt;The modified pom.xml should like this:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;

   &lt;span class="o"&gt;&amp;lt;!--&lt;/span&gt;&lt;span class="n"&gt;newly&lt;/span&gt; &lt;span class="n"&gt;added&lt;/span&gt; &lt;span class="n"&gt;dependencies&lt;/span&gt;&lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;

 &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;dependency&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;groupId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;faunadb&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;groupId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;artifactId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;faunadb&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;artifactId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mf"&gt;2.10&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;dependency&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;dependency&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;groupId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;projectlombok&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;groupId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;artifactId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;lombok&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;artifactId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mf"&gt;1.18&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;provided&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;dependency&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;Next, we can now proceed to create a database on the Fauna dashboard, and generate a server key and configure FaunaClient in the Spring Boot project. To create a database and server key for our SpringBoot project, we are going to register a Fauna account. To do this, click on this link &lt;a href="https://dashboard.fauna.com/accounts/register?utm_source=DevTo&amp;amp;utm_medium=referral&amp;amp;utm_campaign=WritewithFauna_SpringBootMavenFauna_PAideloje" rel="noopener noreferrer"&gt;sign up today&lt;/a&gt; and ignore if you have one already. After signup, you get a prompt to create a database like the image below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fzwtdrryktpbfp7u90you.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fzwtdrryktpbfp7u90you.PNG" alt="image shows Fauna sign-up page"&gt;&lt;/a&gt;&lt;br&gt;
Here, we named our database as taskmanager_db. In naming your database, always ensure to use a name that is descriptive. Next we are going to generate our Fauna secret key.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating a Fauna API Key
&lt;/h3&gt;

&lt;p&gt;To create a Fauna API Key, you would go to your settings on the Fauna sidebar (at the top left of the screen). This Fauna API key is required to connect the database to our Task_Management_App.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fho0mho9owq6dloizdxee.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fho0mho9owq6dloizdxee.PNG" alt="image showing Fauna API keys generation"&gt;&lt;/a&gt;&lt;br&gt;
The secret keys generated from Fauna are meant to be copied and stored somewhere safe that can be easily retrieved. &lt;/p&gt;

&lt;h3&gt;
  
  
  Configuring Fauna Client
&lt;/h3&gt;

&lt;p&gt;In the resources folder within the src/main folder, open application.properties file and add the secret key that you have generated.&lt;br&gt;
fauna-db.secret=”your api secret key should be here”&lt;br&gt;
Next we need to create a bean creates a single instance of the configuration with the help of the &lt;code&gt;@Scope&lt;/code&gt; annotation and inject our api key using the &lt;code&gt;@value&lt;/code&gt; annotation.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;

&lt;span class="nd"&gt;@Value&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"${fauna-db.secret}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;serverKey&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nd"&gt;@Bean&lt;/span&gt;
&lt;span class="nd"&gt;@Scope&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ConfigurableBeanFactory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SCOPE_SINGLETON&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;FaunaClient&lt;/span&gt; &lt;span class="nf"&gt;faunaConfiguration&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;FaunaClient&lt;/span&gt; &lt;span class="n"&gt;faunaClient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FaunaClient&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withSecret&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;serverKey&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;faunaClient&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;



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

&lt;/div&gt;
&lt;h3&gt;
  
  
  Project Structure
&lt;/h3&gt;

&lt;p&gt;Our project will be structured into four subpackages:&lt;br&gt;
Data: This subpackage will house our Data access layer, which will include our Domain and repository.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Service:&lt;/strong&gt; This is where our business logic will be.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web:&lt;/strong&gt; This package will house our controllers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exceptions:&lt;/strong&gt; This is where all our custom exceptions will be. Throwing exceptions is very important in building a resilient system.
This structure will ensure that when a client makes a call to access a resource in the application, such client does not have direct access to our database, rather a request is directed to our controller. Our controller calls the right service(the business logic) which then through our repository makes a call to our database. This architecture also ensures the separation of concerns.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Creating The Domain Class
&lt;/h3&gt;

&lt;p&gt;In the data package, create another package called models. Inside the models package, create a class called Task with the following code:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;

&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.taskVentures.taskmanager.data.models&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.faunadb.client.types.FaunaConstructor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.faunadb.client.types.FaunaField&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;lombok.Data&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;lombok.NoArgsConstructor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;


&lt;span class="nd"&gt;@Data&lt;/span&gt;
&lt;span class="nd"&gt;@NoArgsConstructor&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Task&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@FaunaField&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@FaunaField&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@FaunaField&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt;  &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;isCompleted&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@FaunaConstructor&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@FaunaField&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nd"&gt;@FaunaField&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nd"&gt;@FaunaField&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"description"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nd"&gt;@FaunaField&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"isCompleted"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;isCompleted&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isCompleted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;isCompleted&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;



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

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;@FaunaField&lt;/strong&gt; annotation Makes the  instance variable annotated as database column&lt;/li&gt;
&lt;li&gt;We have used the @FaunaConstructor  annotation to specify our create constructor and give our files values on creation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a class="mentioned-user" href="https://dev.to/data"&gt;@data&lt;/a&gt;&lt;/strong&gt; creates setters and getters for the class.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@NoArgsConstructor&lt;/strong&gt; annotation creates a no argument constructor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@AllArgsContructor&lt;/strong&gt; creates an all argument constructor.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Payloads
&lt;/h3&gt;

&lt;p&gt;Inside the data package, create a package with the name payloads. This package will have two sub-packages “request” and “response” to handle our request payloads and response payloads respectively.&lt;/p&gt;

&lt;h3&gt;
  
  
  Request payloads
&lt;/h3&gt;

&lt;p&gt;Inside the request package create an EmployeeRequest class with the following code:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;

&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.taskVentures.taskmanager.data.payloads.requests&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;lombok.Data&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.time.LocalDateTime&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Data&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TaskRequest&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@NotNull&lt;/span&gt;
    &lt;span class="nd"&gt;@NotBlank&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@NotNull&lt;/span&gt;
    &lt;span class="nd"&gt;@NotBlank&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt;  &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;isCompleted&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;



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

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;&lt;a class="mentioned-user" href="https://dev.to/notblank"&gt;@notblank&lt;/a&gt; and @NotNull :&lt;/strong&gt; These two annotation checks and validate the fields where they are mapped to ensure the values are not blank and null respectively.&lt;/p&gt;

&lt;h3&gt;
  
  
  Response payload
&lt;/h3&gt;

&lt;p&gt;Inside the response package create a &lt;strong&gt;TaskResponse class&lt;/strong&gt; with the following code:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;

&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.taskVentures.taskmanager.data.payloads.response&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;lombok.AllArgsConstructor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;lombok.Data&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Data&lt;/span&gt;
&lt;span class="nd"&gt;@AllArgsConstructor&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TaskResponse&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;


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

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;The above code is simply a POJO (Plain Old Java Object) with one instance variable, a constructor, a mutator(setters), and an accessor(getters).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Repository
&lt;/h3&gt;

&lt;p&gt;Inside the data package, create a sub-package called a repository. Then create an interface called “TaskRepository” that extends JpaRepository. The JpaRepository is generic so it takes a model class(Type) and the data type of the primary key. Write the following code in the TaskRepository interface.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;

&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.taskVentures.taskmanager.data.repository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.taskVentures.taskmanager.data.models.Task&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.stereotype.Repository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.List&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.concurrent.CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Repository&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TaskRepository&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;FaunaRepository&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;TaskRepository&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
        &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"todos"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"tasks"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;findAll&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;


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

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;@Repository&lt;/strong&gt; makes the interface a bean. It is treated identically to the &lt;strong&gt;@Component&lt;/strong&gt; annotation, therefore it is a specialization of the &lt;strong&gt;@Component&lt;/strong&gt; annotation. &lt;code&gt;Beans&lt;/code&gt; are simply Java classes that spring knows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next let’s create a class called FaunaRepository that will contain methods that will allow us to perform the &lt;strong&gt;CRUD&lt;/strong&gt; Operation. We are going to first create an interface that will contain these methods. Let's call the interface &lt;code&gt;Repository&lt;/code&gt;.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;

&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.taskVentures.taskmanager.data.repository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.taskVentures.taskmanager.data.models.Task&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.List&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.Optional&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.concurrent.CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Repository&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;T&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;T&lt;/span&gt; &lt;span class="n"&gt;entity&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;



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

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;We have defined an interface with methods that allow us to save, find, and update a task&lt;/strong&gt;.
```Java
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;package com.taskVentures.taskmanager.data.repository;&lt;/p&gt;

&lt;p&gt;import com.faunadb.client.FaunaClient;&lt;br&gt;
import com.faunadb.client.errors.NotFoundException;&lt;br&gt;
import com.faunadb.client.query.Expr;&lt;br&gt;
import com.faunadb.client.query.Language;&lt;br&gt;
import com.faunadb.client.types.Value;&lt;br&gt;
import com.taskVentures.taskmanager.data.models.Task;&lt;br&gt;
import org.springframework.beans.factory.annotation.Autowired;&lt;/p&gt;

&lt;p&gt;import java.util.Optional;&lt;br&gt;
import java.util.concurrent.CompletableFuture;&lt;br&gt;
import java.util.function.Function;&lt;/p&gt;

&lt;p&gt;import static com.faunadb.client.query.Language.*;&lt;/p&gt;

&lt;p&gt;import java.lang.Class;&lt;/p&gt;

&lt;p&gt;public abstract class FaunaRepository implements Repository, IdentityFactory {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Autowired
protected FaunaClient faunaClient;

protected final Class&amp;lt;T&amp;gt; entityType;
protected final String collectionName;
protected final String collectionIndexName;


protected FaunaRepository(Class&amp;lt;T&amp;gt; entityType, String collectionName, String collectionIndexName) {
    this.entityType = entityType;
    this.collectionName = collectionName;
    this.collectionIndexName = collectionIndexName;
}


@Override
public CompletableFuture&amp;lt;String&amp;gt; nextId() {

    CompletableFuture&amp;lt;String&amp;gt; result =
            faunaClient.query(
                    NewId()
            )
                    .thenApply(value -&amp;gt; value.to(String.class).get());

    return result;
}


@Override
public CompletableFuture&amp;lt;T&amp;gt; save(T entity) {
    CompletableFuture&amp;lt;T&amp;gt; result =
            faunaClient.query(
                    saveQuery(Language.Value(entity.getId()), Value(entity))
            )
                    .thenApply(this::toEntity);

    return result;
}

@Override
public CompletableFuture&amp;lt;Optional&amp;lt;T&amp;gt;&amp;gt; remove(String id) {
    CompletableFuture&amp;lt;T&amp;gt; result =
            faunaClient.query(
                    Select(
                            Value("data"),
                            Delete(Ref(Collection(collectionName), Value(id)))
                    )
            )
                    .thenApply(this::toEntity);

    CompletableFuture&amp;lt;Optional&amp;lt;T&amp;gt;&amp;gt; optionalResult = toOptionalResult(result);

    return optionalResult;
}


@Override
public CompletableFuture&amp;lt;Optional&amp;lt;T&amp;gt;&amp;gt; find(String id) {
    CompletableFuture&amp;lt;T&amp;gt; result =
            faunaClient.query(
                    Select(
                            Value("data"),
                            Get(Ref(Collection(collectionName), Value(id)))
                    )
            )
                    .thenApply(this::toEntity);

    CompletableFuture&amp;lt;Optional&amp;lt;T&amp;gt;&amp;gt; optionalResult = toOptionalResult(result);

    return optionalResult;
}




protected Expr saveQuery(Expr id, Expr data) {
    Expr query =
            Select(
                    Value("data"),
                    If(
                            Exists(Ref(Collection(collectionName), id)),
                            Replace(Ref(Collection(collectionName), id), Obj("data", data)),
                            Create(Ref(Collection(collectionName), id), Obj("data", data))
                    )
            );

    return query;
}

protected T toEntity(Value value) {
    return value.to(entityType).get();
}


protected CompletableFuture&amp;lt;Optional&amp;lt;T&amp;gt;&amp;gt; toOptionalResult(CompletableFuture&amp;lt;T&amp;gt; result) {
    CompletableFuture&amp;lt;Optional&amp;lt;T&amp;gt;&amp;gt; optionalResult =
            result.handle((v, t) -&amp;gt; {
                CompletableFuture&amp;lt;Optional&amp;lt;T&amp;gt;&amp;gt; r = new CompletableFuture&amp;lt;&amp;gt;();
                if(v != null) r.complete(Optional.of(v));
                else if(t != null &amp;amp;&amp;amp; t.getCause() instanceof NotFoundException) r.complete(Optional.empty());
                else r.completeExceptionally(t);
                return r;
            }).thenCompose(Function.identity());

    return optionalResult;
}    
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The above class provides an implementation to the methods defined on the interface.
You can look up the Fauna documentation for Java by clicking on this link: [Fauna/JVM doc](https://docs.fauna.com/fauna/current/drivers/jvm)

```Java


package com.taskVentures.taskmanager.data.repository;

import java.util.concurrent.CompletableFuture;

public interface IdentityFactory {

    CompletableFuture&amp;lt;String&amp;gt; nextId();
}



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

&lt;/div&gt;
&lt;h3&gt;
  
  
  The TaskService
&lt;/h3&gt;

&lt;p&gt;Create a service package under the taskmanager directory. This package is going to house the business logic. We have divided the service into two, an interface where the methods of our business logic will be declared and a concrete class that implements the interface. Create an interface with the name &lt;em&gt;“taskService"&lt;/em&gt; with the following code:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;

&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.taskVentures.taskmanager.services&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.taskVentures.taskmanager.data.models.Task&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.taskVentures.taskmanager.data.payloads.requests.TaskRequest&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.Optional&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.concurrent.CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@component&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;TaskService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;createTask&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;TaskRequest&lt;/span&gt; &lt;span class="n"&gt;taskRequest&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;updateTask&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;TaskRequest&lt;/span&gt; &lt;span class="n"&gt;taskRequest&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;deleteTask&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getTask&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;



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

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;@Component&lt;/strong&gt; annotation is a shorthand for the &lt;code&gt;@Bean&lt;/code&gt; annotation. It registers the TaskService interface as a bean in the application context and makes it accessible during classpath scanning.
We created five methods that allow us to create, update, get and delete tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next, create a TaskServiceImpl class that implements the TaskService interface. Write the following code:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;

&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.taskVentures.taskmanager.services&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.taskVentures.taskmanager.data.models.Task&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.taskVentures.taskmanager.data.payloads.requests.TaskRequest&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.taskVentures.taskmanager.data.repository.TaskRepository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;lombok.AllArgsConstructor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.stereotype.Service&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.Optional&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.concurrent.CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="nd"&gt;@AllArgsConstructor&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TaskServiceImpl&lt;/span&gt;  &lt;span class="kd"&gt;implements&lt;/span&gt;  &lt;span class="nc"&gt;TaskService&lt;/span&gt;  &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;TaskRepository&lt;/span&gt; &lt;span class="n"&gt;taskRepository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;createTask&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;TaskRequest&lt;/span&gt; &lt;span class="n"&gt;taskRequest&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;newTask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;taskRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nextId&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;thenApply&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;taskRequest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;taskRequest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDescription&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;taskRequest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isCompleted&lt;/span&gt;&lt;span class="o"&gt;())).&lt;/span&gt;&lt;span class="na"&gt;thenCompose&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;taskRepository:&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
     &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;newTask&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getTask&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;taskRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;find&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;updateTask&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;TaskRequest&lt;/span&gt; &lt;span class="n"&gt;taskRequest&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
                &lt;span class="n"&gt;taskRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;find&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;thenCompose&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;optionalTodoEntity&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
                                &lt;span class="n"&gt;optionalTodoEntity&lt;/span&gt;
                                        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;todoEntity&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;taskRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;save&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;taskRequest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;taskRequest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDescription&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;  &lt;span class="n"&gt;taskRequest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isCompleted&lt;/span&gt;&lt;span class="o"&gt;())).&lt;/span&gt;&lt;span class="na"&gt;thenApply&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;Optional:&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;of&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
                                        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;orElseGet&lt;/span&gt;&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;completedFuture&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;empty&lt;/span&gt;&lt;span class="o"&gt;())));&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;deleteTask&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;taskRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;remove&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;


&lt;span class="o"&gt;}&lt;/span&gt;



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

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;@Service&lt;/strong&gt; annotation is a specialized form of &lt;code&gt;@Component&lt;/code&gt;. With the &lt;strong&gt;@Service&lt;/strong&gt; annotation, the class that  is annotated is registered in the application context and accessible during classpath scanning.&lt;/p&gt;

&lt;p&gt;The TaskServiceImpl class implemented the TaskService interface by overriding the method and implementing them.&lt;br&gt;
The class throws an exception(ResourceNotFoundException- This is the custom exception class we created that extends RunTimeException) where the Id supplied to get a single task does not exist on the database.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Controller
&lt;/h3&gt;

&lt;p&gt;Create a package called &lt;strong&gt;web&lt;/strong&gt; under the &lt;strong&gt;taskmanager  package&lt;/strong&gt;. This package is going to house the APIs controller. Create an TaskController class with the following code:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;


&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.taskVentures.taskmanager.web&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.taskVentures.taskmanager.data.payloads.requests.TaskRequest&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.taskVentures.taskmanager.services.TaskService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.swagger.annotations.ApiResponses&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;lombok.AllArgsConstructor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.http.HttpStatus&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.http.ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.web.bind.annotation.*&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.concurrent.CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@RestController&lt;/span&gt;
&lt;span class="nd"&gt;@RequestMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/task"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@AllArgsConstructor&lt;/span&gt;
&lt;span class="nd"&gt;@ApiResponses&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nd"&gt;@io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;swagger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"This is a bad request, please follow the API documentation for the proper request format"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
        &lt;span class="nd"&gt;@io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;swagger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Due to security constraints, your access request cannot be authorized"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
        &lt;span class="nd"&gt;@io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;swagger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"The server is down. Please bear with us."&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
&lt;span class="o"&gt;})&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TaskController&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;TaskService&lt;/span&gt; &lt;span class="n"&gt;taskService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@PostMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/create"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;?&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;createTask&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@RequestBody&lt;/span&gt; &lt;span class="nc"&gt;TaskRequest&lt;/span&gt; &lt;span class="n"&gt;taskRequest&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;taskService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createTask&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;taskRequest&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;thenApply&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;todoEntity&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;todoEntity&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;HttpStatus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CREATED&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;


    &lt;span class="nd"&gt;@GetMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/get/{id}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;?&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;getTask&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@PathVariable&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
                &lt;span class="n"&gt;taskService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getTask&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;thenApply&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;optionalTodoEntity&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
                                &lt;span class="n"&gt;optionalTodoEntity&lt;/span&gt;
                                        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;todoEntity&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;todoEntity&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;HttpStatus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;OK&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
                                        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;orElseGet&lt;/span&gt;&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class="nc"&gt;HttpStatus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;NOT_FOUND&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
                        &lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;


    &lt;span class="nd"&gt;@PutMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/update/{id}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;?&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;updateTask&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@PathVariable&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nd"&gt;@RequestBody&lt;/span&gt; &lt;span class="nc"&gt;TaskRequest&lt;/span&gt; &lt;span class="n"&gt;taskRequest&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
                &lt;span class="n"&gt;taskService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;updateTask&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;taskRequest&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;thenApply&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;optionalTodoEntity&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
                                &lt;span class="n"&gt;optionalTodoEntity&lt;/span&gt;
                                        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;todoEntity&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;todoEntity&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;HttpStatus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;OK&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
                                        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;orElseGet&lt;/span&gt;&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class="nc"&gt;HttpStatus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;NOT_FOUND&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                                        &lt;span class="o"&gt;)&lt;/span&gt;
                        &lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@DeleteMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"/delete/{id}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;?&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;deleteTask&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@PathVariable&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
                &lt;span class="n"&gt;taskService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deleteTask&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;thenApply&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;optionalTodoEntity&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
                                &lt;span class="n"&gt;optionalTodoEntity&lt;/span&gt;
                                        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;todo&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;todo&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;HttpStatus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;OK&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
                                        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;orElseGet&lt;/span&gt;&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class="nc"&gt;HttpStatus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;NOT_FOUND&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                                        &lt;span class="o"&gt;)&lt;/span&gt;
                        &lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;


&lt;span class="o"&gt;}&lt;/span&gt;



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

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;@RestController:&lt;/strong&gt; This annotation marks the EmployeeController as an HTTP request handler and allows Spring to recognize it as a RESTful service.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@RequestMapping("/task")&lt;/strong&gt; annotation sets the base path to the resource endpoints in the controller as /task.
Next, we injected the TaskService class.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@GetMapping&lt;/strong&gt; is a shortcut for @RequestMapping(method = RequestMethod.GET), and is used to map HTTP GET requests to the mapped controller methods. We used it to return all the tasks and a single task.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@PathVariable&lt;/strong&gt; annotation shows that a method parameter should be bound to a URI template variable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@PostMapping&lt;/strong&gt; is a shorthand for @RequestMapping where the method is equal to POST. It is used to map HTTP POST requests to the mapped controller methods.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@RequestBody:&lt;/strong&gt; This annotation takes care of binding the web request body to the method parameter with the help of the registered HttpMessageConverters. So when you make a POST request to the “/task/add” URL with a Post JSON body, the HttpMessageConverters converts the JSON request body into a Post object and passes it to the createTask method.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@PutMapping&lt;/strong&gt; is a shorthand for @RequestMapping where the method is equal to PUT. It is used to map HTTP PUT requests to the mapped controller methods.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@DeleteMapping:&lt;/strong&gt; Using this annotation makes the Mapped controller method to be ready for a delete operation. is a shortcut for &lt;strong&gt;@RequestMapping&lt;/strong&gt; (method = RequestMethod.DELETE).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Documenting your API with Swagger
&lt;/h3&gt;

&lt;p&gt;We already added the io.springfox dependency to the pom.xml. With this dependency we will document the API so that it will be easy for other developers to use it. All is required is to add the following line of code at the class level of our controller as follows:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;

 &lt;span class="nd"&gt;@ApiResponses&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nd"&gt;@io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;swagger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"This is a bad request, please follow the API documentation for the proper request format"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
        &lt;span class="nd"&gt;@io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;swagger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Due to security constraints, your access request cannot be authorized"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
        &lt;span class="nd"&gt;@io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;swagger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"The server is down. Please bear with us."&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
&lt;span class="o"&gt;})&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;We added the &lt;strong&gt;@ApiResponse&lt;/strong&gt; annotation from swagger at the class level. As simple as this, our APIs are fully documented.&lt;br&gt;
Go to &lt;a href="http://localhost:8081/swagger-ui/" rel="noopener noreferrer"&gt;localhost:8081/swagger-ui&lt;/a&gt; to access the documentation and test that our APIs are still working properly.&lt;br&gt;
Use the Swagger API document at  &lt;a href="http://localhost:8900/swagger-ui/" rel="noopener noreferrer"&gt;localhost:8900/swagger-ui&lt;/a&gt; to add an employee, get, update and delete an employee.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fpzrh1ff8gxqysray6z7m.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fpzrh1ff8gxqysray6z7m.PNG" alt="image "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;In this article project, we successfully built a &lt;em&gt;Task Management Application&lt;/em&gt; using &lt;code&gt;SpringBoot&lt;/code&gt; framework and &lt;code&gt;Maven&lt;/code&gt; as our dependency management and build tools. We used &lt;code&gt;Fauna&lt;/code&gt; as our Cloud datastore. &lt;br&gt;
Additionally, we learned how to throw exceptions in our application which ensures that our application is fault-tolerant and resilient. We also learned how to document our API using &lt;code&gt;Swagger&lt;/code&gt;. You can clone the project from my &lt;em&gt;GitHub&lt;/em&gt; via this link:  &lt;a href="https://github.com/aidelojep/Task_Management_SpringBoot_Project" rel="noopener noreferrer"&gt;&lt;em&gt;Task_Management_SpringBoot_Project&lt;/em&gt;&lt;/a&gt;&lt;br&gt;
If you have any questions, don’t hesitate to contact me via any of my socials: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/peter-aideloje-64aab6116/" rel="noopener noreferrer"&gt;Peter Aideloje LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/PAideloje" rel="noopener noreferrer"&gt;Peter Aideloje Twitter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Implementing Bulk SMS Application with Django, Twilio, and Fauna</title>
      <dc:creator>aidelojep</dc:creator>
      <pubDate>Tue, 13 Jul 2021 00:48:00 +0000</pubDate>
      <link>https://dev.to/aidelojep/implementing-bulk-sms-application-with-django-twilio-and-fauna-1n66</link>
      <guid>https://dev.to/aidelojep/implementing-bulk-sms-application-with-django-twilio-and-fauna-1n66</guid>
      <description>&lt;p&gt;This article focuses on implementing Bulk SMS API in a web application built with Python framework (Django). We used Twilio to generate the Bulk SMS, and  Fauna as the database to save customer information. The value of bulk SMS in marketing campaigns and business cannot be overemphasized. Bulk SMS API’s  can be a very reliable means for most companies to reach out to its large pool of customers about  a new product, for a new campaign, or to keep them updated (major or minor changes made to) an already existing service/product.&lt;/p&gt;

&lt;p&gt;This article will include steps on how to integrate Fauna with your SMS API system. You could also visit &lt;a href="https://pyauth.github.io/pyotp/" rel="noopener noreferrer"&gt;Fauna documentation&lt;/a&gt; to find out more about systems that are supported.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Brief Introduction to Serverless database&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Serverless architecture refers to a system that affords users greater scalability, more flexibility, and quicker time to release, all at a reduced cost. Most developers prefer to use serverless architectures because of its broad range of advantages like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Freeing up developer resources and affords them the time to concentrate on projects that directly affects the business value as against spending that time on system maintenance&lt;/li&gt;
&lt;li&gt;Not having to worry about purchasing and managing traditional backend servers.&lt;/li&gt;
&lt;li&gt;It significantly results in a reduction in server cost, because you only pay as you go.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://fauna.com/" rel="noopener noreferrer"&gt;Fauna&lt;/a&gt; leads the serverless database as it is amongst the pioneering serverless databases and also the choice for many developers. &lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Your Fauna Database
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Create the Fauna Database
&lt;/h3&gt;

&lt;h3&gt;
  
  
  STEP 1: FAUNA SETUP
&lt;/h3&gt;

&lt;p&gt;The first thing to do is create the database for our  SMS API project in the Fauna dashboard. If you are new to Fauna and yet to create an account, you will be required to do so via the link attached here: &lt;a href="https://dashboard.fauna.com/accounts/register?utm_source=DevTo&amp;amp;utm_medium=referral&amp;amp;utm_campaign=WritewithFauna_SuggestiveApp_PAideloje" rel="noopener noreferrer"&gt;Fauna Account Signup&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the Fauna dashboard, click on the “NEW DATABASE” button, provide a database name and click on the “SAVE” button.&lt;br&gt;
&lt;a href="https://media.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%2F1hvcs3uiufgi3ru4flgj.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F1hvcs3uiufgi3ru4flgj.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.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%2Flu9ho930dnilzrwmc7v2.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Flu9ho930dnilzrwmc7v2.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.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%2Fdfz3thnn3o5u8468qgio.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fdfz3thnn3o5u8468qgio.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Collection indexes
&lt;/h3&gt;

&lt;p&gt;To create a collection index, you would need to navigate the collections tab on the Fauna sidebar, then click on the NEW “COLLECTION” button. Next, enter a name for the collection and click on the “SAVE” button. You can decide to rename the collection to any name of your choice. In this article, we named our collection ‘user’.&lt;br&gt;
&lt;a href="https://media.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%2Ft89u3q2zec7fogxa34ev.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Ft89u3q2zec7fogxa34ev.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.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%2F6m72w8zz08ip9dy1eht2.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F6m72w8zz08ip9dy1eht2.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Creating a Fauna API key
&lt;/h3&gt;

&lt;p&gt;To create a Fauna API key, you would have to navigate to security settings on the Fauna sidebar (located at the top left side of the screen). The Fauna API key helps to connect the database to our SMS API app. &lt;br&gt;
&lt;a href="https://media.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%2Fsyjqzrnf7orzhrpgkz1c.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fsyjqzrnf7orzhrpgkz1c.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.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%2Fl1gsukry2pnlljx7y5ul.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fl1gsukry2pnlljx7y5ul.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.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%2Fhthjftmu0ikh933rf085.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fhthjftmu0ikh933rf085.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The API keys generated from Fauna are secret keys. It is advisable to copy these keys safely and store them somewhere safe that you can easily retrieve back.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Integrating Fauna into Django project
&lt;/h3&gt;

&lt;p&gt;Here, we can now attempt to integrate our Python Library with Fauna from the pip. This can also be installed with a single line on the terminal.&lt;br&gt;
&lt;a href="https://media.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%2Ffy9xvwo9ha3tok65vwkm.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Ffy9xvwo9ha3tok65vwkm.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
After completing the installation of  Django and Fauna, the next step is to run a sample code that is in Fauna Python driver documentations: &lt;a href="https://docs.fauna.com/fauna/current/drivers/python.html" rel="noopener noreferrer"&gt;Fauna python driver documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fonzw4d1it14qykid219q.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fonzw4d1it14qykid219q.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
We can see from the code above how the Fauna driver connects with the database that generates its API keys.&lt;br&gt;
Let us consider the steps to follow to build our SMS API application in the following subheading.&lt;/p&gt;

&lt;h3&gt;
  
  
  BUILDING  OUR  SMS  API:
&lt;/h3&gt;

&lt;p&gt;STEPS TO BUILD THE SMS API IN DJANGO FRAMEWORK&lt;/p&gt;

&lt;h3&gt;
  
  
  The Project (Bulk SMS APP)
&lt;/h3&gt;

&lt;p&gt;This section will guide you to build a simple Bulk SMS sending web application using the Django web framework and implement the database with Fauna. This Bulk SMS app would allow admin users to add a customer and his phone number to the customers' list and select who to send already customized SMS. &lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;To fully understand this part of the tutorial, you are required to have the following in place:&lt;br&gt;
Python 3.8 or newer and Django 3.0 or newer (if you don’t have one, don’t worry I will walk you through on how to install Python and Django)&lt;br&gt;
Basic understanding of Fauna&lt;br&gt;
Basic understanding of Django&lt;br&gt;
A text editor e.g. PyCharm, Vscode&lt;/p&gt;

&lt;h3&gt;
  
  
  Install python
&lt;/h3&gt;

&lt;p&gt;To check if python is successfully installed on your system, run the command “python --version” if python is installed, you will get a response as shown below with the version of python installed. If you don’t have python installed go to &lt;a href="https://www.python.org/downloads/" rel="noopener noreferrer"&gt;https://www.python.org/downloads/&lt;/a&gt; select your operating system, and download.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F7y2040otrrgwb34i38f5.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F7y2040otrrgwb34i38f5.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating a virtual environment
&lt;/h3&gt;

&lt;p&gt;Before we start, we need to create an isolated virtual environment to not ship our entire system file and dependencies during deployment.This means that the dependencies of other projects will not be included in the dependencies of our current project even though they are all on the same local machine. To do that, we are going to type the following command. Note the name of the virtual environment is “env” and it's just a variable name that can be named anything.&lt;br&gt;
&lt;a href="https://media.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%2Frgidj6dqeitduf5tj4jd.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Frgidj6dqeitduf5tj4jd.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Next, activate the virtual environment by changing the directory to the virtual environment we just created with the name “env,” go into the Scripts folder and run the executable file “activate.”&lt;br&gt;
&lt;a href="https://media.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%2F750sla9lud46bhrn5dku.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F750sla9lud46bhrn5dku.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  INSTALL DJANGO
&lt;/h3&gt;

&lt;p&gt;For this project, we are going to use Django, a python web framework built to meet deadlines, while satisfying the tough software requirements.&lt;br&gt;
Django makes building web applications easy, it helps you build an entire Web application from scratch in a matter of hours. With Django you don’t have to struggle with the fuss of web development. It helps you focus on your business logic without needing to reinvent the wheel. It’s free and open source.&lt;br&gt;
 To install Django we are using a python package manager by simply running the command “pip install Django.” If Django is installed successfully, you will get the following output:&lt;br&gt;
&lt;a href="https://media.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%2Ft33097krqh1qtz1c1cnw.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Ft33097krqh1qtz1c1cnw.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  create a project (sms project)
&lt;/h2&gt;

&lt;p&gt;Next, we will create our project using the command “Django-admin startproject “ command then the name of the project as shown below. Here the name of our project is "smsproject" and it’s just a variable name, you can name it whatever you like, but make sure it is descriptive.&lt;br&gt;
&lt;a href="https://media.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%2Fxx24f0wg69mrc3foz9c2.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fxx24f0wg69mrc3foz9c2.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating an app
&lt;/h3&gt;

&lt;p&gt;Next, we create an app with the “python manage.py startapp [name of your app]” command. The name of the app for this tutorial is sms app. Again feel free to name it anything of your choice but should be self-descriptive. This helps other developers easily understand what you are working on. Make sure you change the directory to the sms project we created.&lt;br&gt;
&lt;a href="https://media.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%2Fjuzv9c8j2vwefdzk6kib.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fjuzv9c8j2vwefdzk6kib.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Now that we have successfully created our app, we need to add our app to the installed apps. Go to settings.py and add this: “smsapp.app.SmsappConfig”&lt;/p&gt;

&lt;p&gt;smsproject/settings.py&lt;/p&gt;

&lt;p&gt;Let us run our app to see if we have successfully installed and correctly set up our project. To run, you have to change the directory into your project and run the command “python manage.py runserver.”&lt;br&gt;
&lt;a href="https://media.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%2Fh87mwpo2b78zdbaaf5bu.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fh87mwpo2b78zdbaaf5bu.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
As you can see, we have started our development server at &lt;a href="http://127.0.01:8000/" rel="noopener noreferrer"&gt;http://127.0.01:8000/&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;Open your browser and try to access this URL. If everything works fine, you will see the screen below&lt;br&gt;
&lt;a href="https://media.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%2Fpz1b944cij6cfg5vslm1.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fpz1b944cij6cfg5vslm1.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Next, we install the python phone number fields package to help us hold the phone numbers. The command is: “pip install django-phonenumber-field[phone numbers].” If the installation works, you will get the following output:&lt;br&gt;
&lt;a href="https://media.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%2F9bftgftiejtlc13iekq8.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F9bftgftiejtlc13iekq8.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Having installed the Django phone number field, we need to add it to the list of our installed apps, and we do that in the settings.py as follows:&lt;/p&gt;

&lt;p&gt;Smsproject/settings.py&lt;br&gt;
&lt;a href="https://media.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%2F9aul07zomv8ys1rdzdsg.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F9aul07zomv8ys1rdzdsg.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Next, we will create a model in models.py to store the name and phone number of a customer.&lt;/p&gt;

&lt;p&gt;smsapp/models.py&lt;br&gt;
&lt;a href="https://media.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%2Ftadlmc5w8t1bf7id12kn.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Ftadlmc5w8t1bf7id12kn.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Migrations
&lt;/h3&gt;

&lt;p&gt;In Django, we use migrations to move changes you make to your models (adding a field, deleting a model, etc.) into your database schema. We need to make migrations to our database.&lt;br&gt;
&lt;a href="https://media.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%2Fyqxs1oq37h9h9bscbo8j.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fyqxs1oq37h9h9bscbo8j.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Run the command “python manage.py makemigrations.”  Makemigrations are used to create new migrations based on the changes made to the models in a project. The output is as shown below:&lt;br&gt;
&lt;a href="https://media.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%2Fvp9hcdw1htodex55dvk8.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fvp9hcdw1htodex55dvk8.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Next, we migrate with python manage.py migrate. Migrate is responsible for applying and reapplying migrations. &lt;br&gt;
&lt;a href="https://media.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%2Fvc96fxqbnzhz838k01kk.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fvc96fxqbnzhz838k01kk.PNG" alt="Alt Text"&gt;&lt;/a&gt; &lt;br&gt;
Next, we need to register our model in our admin:&lt;/p&gt;

&lt;p&gt;smsapp/admin.py&lt;br&gt;
&lt;a href="https://media.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%2Flcrqjr51m4qauzml0vic.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Flcrqjr51m4qauzml0vic.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
 Create an admin(a superuser) that will compose and send messages to the customer.&lt;br&gt;
Let's run our server. Go to localhost:8000/admin&lt;br&gt;
&lt;a href="https://media.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%2Flcrqjr51m4qauzml0vic.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Flcrqjr51m4qauzml0vic.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Then log in with our username and password. If you log in successfully, you see this:&lt;br&gt;
&lt;a href="https://media.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%2Fks2xrriikkrel2t0bj2s.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fks2xrriikkrel2t0bj2s.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Add a customer via the admin panel. Unlike the example below, enter a valid phone number so you can verify the message we will send. &lt;/p&gt;

&lt;p&gt;name: Peter&lt;br&gt;
phone number: +2347033622204 &lt;/p&gt;

&lt;h3&gt;
  
  
  Twilio Integration
&lt;/h3&gt;

&lt;p&gt;Twilio is a platform as a service company (PaaS) that provides Cloud communications services. With their services, software engineers can build applications that can make and receive calls and send and receive text messages. Their API makes it easy for software engineers to automate and schedule text messages to remind users on their platform of upcoming events etc.&lt;br&gt;
The next thing is for us to install Twilio using the command “pip install Twilio”. If the installation works, you will get the output below:&lt;br&gt;
&lt;a href="https://media.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%2F0sur4mi1nhgiri8hd8ly.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F0sur4mi1nhgiri8hd8ly.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Go to &lt;a href="http://www.twilio.com" rel="noopener noreferrer"&gt;www.twilio.com&lt;/a&gt; to create a free Twilio account, get your SID and Auth_token, and then click on get a trial phone number, as shown on the screen below.&lt;br&gt;
&lt;a href="https://media.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%2F27flsdc4klxlfjop7wli.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F27flsdc4klxlfjop7wli.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Add the Twilio account SID and Auth token from your Twilio dashboard to the settings.py of your project.&lt;/p&gt;

&lt;p&gt;settings.py&lt;br&gt;
&lt;a href="https://media.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%2F4xaq3560t2itb5ujygq7.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F4xaq3560t2itb5ujygq7.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
For this project, I want to authorize only the admin to send SMS to customers on the platform, so I will be creating the function that will enable us to send SMS in the admin.py instead of the views.py. In the Django admin panel, we will select which customers we want and then choose "Send text campaign" from the dropdown menu. To send a text message, we instantiate a client object with our account ID and authorization token. Then, for each customer selected in the admin, we create a message by specifying the "to" phone number, using our trial number as the "from" number, and finally inserting our message as the body.&lt;/p&gt;

&lt;p&gt;smsapp/admin.py  &lt;/p&gt;

&lt;p&gt;Next, we rerun our server with the command python manage.py run server. Then go to localhost:8000/admin and login into the admin dashboard. Send the customer’s name you want to send SMS to, from the action dropdown, select &lt;code&gt;send text campaign&lt;/code&gt; then click go. Wao! you just sent SMS to your customer on your platform. You can use the add customer button to add more customers and their phone numbers, and send them messages at a go. Note that, the phone numbers must be registered on Twilio if you are using a trial account. If you want to send unverified phone numbers, you will need to upgrade your Twilio account.&lt;br&gt;
&lt;a href="https://media.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%2F2fh78yhtiua8rh3k8nix.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F2fh78yhtiua8rh3k8nix.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  CONCLUSION
&lt;/h2&gt;

&lt;p&gt;In this article, we built a Bulk SMS application with Django (Python framework) integrated in Fauna. Fauna serves as the storage point for customer’s information. Then we implemented the SMS API with Twilio to generate SMS to our customers.&lt;br&gt;
If you have any questions, don't hesitate to contact me on my socials:&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/peter-aideloje-64aab6116/" rel="noopener noreferrer"&gt;My LinkedIn handle&lt;/a&gt;  &lt;a href="https://twitter.com/PAideloje" rel="noopener noreferrer"&gt;My twitter handle&lt;/a&gt; &lt;/p&gt;

</description>
    </item>
    <item>
      <title>USING “ELLIPSIS” IN YOUR CODE.</title>
      <dc:creator>aidelojep</dc:creator>
      <pubDate>Fri, 18 Jun 2021 21:11:48 +0000</pubDate>
      <link>https://dev.to/aidelojep/using-ellipsis-in-your-code-4fma</link>
      <guid>https://dev.to/aidelojep/using-ellipsis-in-your-code-4fma</guid>
      <description>&lt;p&gt;Hey! I'm Peter. I love to write tutorials and articles to help on some topics I find interesting in Java. If you have any questions about the article, leave a comment and I'll get back to you, or find me on twitter, LinkedIn or Github:&lt;br&gt;
&lt;strong&gt;&lt;em&gt;&lt;a href="https://twitter.com/PAideloje"&gt;TWITTER&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt; &lt;strong&gt;&lt;em&gt;&lt;a href="https://www.linkedin.com/in/peter-aideloje-64aab6116/"&gt;LINKEDIN&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt; &lt;strong&gt;&lt;em&gt;&lt;a href="https://github.com/aidelojep"&gt;GITHUB&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this article, we are going to discuss a feature in Java or more generally programming, the term &lt;strong&gt;&lt;em&gt;ellipsis&lt;/em&gt;&lt;/strong&gt; is denoted as &lt;strong&gt;(. . .)&lt;/strong&gt;, it is originally a mathematics concept that is used to denote  “....and so on.”&lt;br&gt;
So basically, when applying this concept to programming, it is used to instruct a method to receive an unspecified number of arguments. In this article, our example focuses on &lt;strong&gt;arrays&lt;/strong&gt;. Therefore, to use the concept of &lt;strong&gt;&lt;em&gt;ellipsis(. . .)&lt;/em&gt;&lt;/strong&gt; in &lt;strong&gt;array&lt;/strong&gt;, all we need to do is:&lt;br&gt;
specify the data type (int, double, string, boolean...),&lt;br&gt;
then, we declare our &lt;strong&gt;&lt;em&gt;ellipsis (. . .)&lt;/em&gt;&lt;/strong&gt; next in the method’s parameter.&lt;br&gt;
This indicates that the method receives an infinite number of variables with that particular data type.&lt;br&gt;
This approach makes our program more concise and precise.&lt;/p&gt;

&lt;h1&gt;
  
  
  Ellipsis expression:
&lt;/h1&gt;

&lt;p&gt;public class &lt;strong&gt;Varargs&lt;/strong&gt; {&lt;/p&gt;

&lt;p&gt;//calculating addition &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   public  static void addition (int . . .**numbers**)
        {
 int **total** = 0;

    //calculating total using enhanced for loop 

   for (int p : numbers)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;total += p;&lt;br&gt;
return total/numbers.length;&lt;br&gt;
}&lt;br&gt;
public static void main(String [] args) {&lt;br&gt;
int &lt;strong&gt;p1&lt;/strong&gt; = 10;&lt;br&gt;
int &lt;strong&gt;p2&lt;/strong&gt; = 20;&lt;br&gt;
int &lt;strong&gt;p3&lt;/strong&gt; = 30;&lt;/p&gt;

&lt;p&gt;//printing formatted data- ( initial values of p)&lt;/p&gt;

&lt;p&gt;System.out.printf(“ p1 =%d%np2 =%d%np3 =%d%n);&lt;/p&gt;

&lt;p&gt;//printing the sum p&lt;/p&gt;

&lt;p&gt;System.out.printf(“The addition of these values(p1, p2 and p3) are:” addition(p1,p2,p3)  );&lt;br&gt;
             }&lt;br&gt;
   }&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--L_E-Axi0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n94tqqdzvll82o9om4iw.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--L_E-Axi0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n94tqqdzvll82o9om4iw.PNG" alt="image of varargs" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NB&lt;/strong&gt;: &lt;br&gt;
// (double slash) indicates comments, comments in programming helps to explain the codes that we write so that they more readable.&lt;br&gt;
For the purpose of this article, we would make use of commenting but most seasoned developers argue that a well written code does not require any commenting except it is not clean enough.&lt;br&gt;
Commenting are not compiled with the source code, they only function to explain our code better.&lt;/p&gt;

&lt;h2&gt;
  
  
  CONCLUSION
&lt;/h2&gt;

&lt;p&gt;This article helped to explain what an &lt;strong&gt;&lt;em&gt;ellipsis&lt;/em&gt;&lt;/strong&gt; does in a (Java) methods. Thanks for reading this article. I hope you like this article feel free to like, comment or share this article with your friends.&lt;/p&gt;

&lt;p&gt;😄 Happy Coding…..&lt;strong&gt;&lt;em&gt;Wireless API&lt;/em&gt;&lt;/strong&gt; cares…&lt;/p&gt;

</description>
      <category>java</category>
      <category>beginners</category>
      <category>arrays</category>
    </item>
    <item>
      <title>ARRAYS- Let’s put some human touch to (this.concept).</title>
      <dc:creator>aidelojep</dc:creator>
      <pubDate>Mon, 14 Jun 2021 23:55:05 +0000</pubDate>
      <link>https://dev.to/aidelojep/arrays-let-s-put-some-human-touch-to-this-concept-5ca4</link>
      <guid>https://dev.to/aidelojep/arrays-let-s-put-some-human-touch-to-this-concept-5ca4</guid>
      <description>&lt;h1&gt;
  
  
  ARRAYS- Let’s put some human touch to (this.concept).
&lt;/h1&gt;

&lt;h2&gt;
  
  
  SERIES 1: BRIEF   INTRODUCTION  TO   ARRAY    CONCEPT.
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;E&lt;/strong&gt;arlier on, whenever the term “Array” popped up, I used to think to myself, there goes another &lt;strong&gt;buzz word, Programming terminology&lt;/strong&gt;. I struggled to relate this concept to real life scenarios because it felt totally strange and a bit abstract.&lt;br&gt;
Later on, after some level of study and familiarization with the concept of Array, I became more aware of  the subconscious application of array concepts in our daily lives. This reality made me look out for ways on how I could apply this new found knowledge to daily life. Simply put, &lt;strong&gt;&lt;em&gt;arrays are just variables containing values of similar datatypes&lt;/em&gt;&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Variables can be referred to as a container for holding objects or values. So, since we agreed on referring to Arrays as containers, it is safe to assume that these containers can be used as a storage unit for stuffs.&lt;br&gt;
Imagine using our refrigerator to store cool soft drinks of different varieties.&lt;br&gt;
I’m sure a cold drink in a hot weather(tropical) region in Sub-saharan Africa would always be a delight. &lt;br&gt;
Now back to our refrigerator, these drinks contain Coca-cola drinks, guinness drink, milk shakes and vodka at some different position or location in the refrigerator. The position or spot where each drink is located is what we refer to as &lt;strong&gt;&lt;em&gt;“INDEX”&lt;/em&gt;&lt;/strong&gt;. It helps us to determine where a particular array value lies in a wide variety of sets. Ofcourse, it becomes easier for me to locate a bottle of coca cola based on where it is positioned in the refrigerator set. Wow! Aren't Arrays just beautiful??!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--m9swKVX2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5f6p9yrknl19vxijkd6o.jp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--m9swKVX2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5f6p9yrknl19vxijkd6o.jp" alt="refrigerator example" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also, we must note that in numbering the index of an array, we must start our counting from zero. This is borrowed from a well established mathematics concept of counting. The concept of the number index counting system can be related to Ricci calculus.&lt;/p&gt;

&lt;p&gt;In programming, arrays can be symbolized with a set of open/close square brackets [ ]. This is because it serves as a container to hold items. Since, we already established that arrays are a set of variables for holding similar values, therefore, it makes total sense for these containers to hold these values. If you have something of value given to you, you would want to protect it and hold it tight from breaking or falling off. This is exactly what an array does with the values you give to them, they keep them safe and provide them to you whenever you want them to be rendered back. &lt;br&gt;
Also, one very important aspect of arrays that we should also consider is that: “Arrays hold values of similar data types”. &lt;br&gt;
A “data type” refers to the descriptive nature of how the values in a containers behave, it tells us more about their state-it answers questions like: Could these values you trying to store up in the arrays be numbers (integers) , alphabets (strings), or single letter/number/symbols (characters), true or false statements (boolean). &lt;br&gt;
Data types help variable or container objects to create a safe haven i.e a welcoming ground that will be suitable for the arrival of the value that you intend to keep inside of them. For instance, you do not expect to keep toiletries in the kitchen or your shoes in your parlour. A housing apartment is designed in such a manner , such that every item has it’s designated position. This would help to reduce the level of confusion and make things easier to coordinate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ARRAY LENGTH:&lt;/strong&gt;&lt;br&gt;
Arrays determine their length based on the number of items it contains. But the little trick to this is, an array length is different from number of items in an array. The array length is usually calculated by saying: Array length minus one. Remember we already established that an array numbers begins from zero, therefore the last item in an array would always be lessed than its length. This concept also helps us to avoid an error known as “ArrayIndexOutOfBound”. We would consider this concept later.&lt;/p&gt;

&lt;p&gt;The array length can be calculated by:&lt;br&gt;
arrayName.length which returns the array length.&lt;/p&gt;

&lt;p&gt;PS: ‘for loop’ uses array.length to determine the length of the array.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ARRAY INDEX:&lt;/strong&gt;&lt;br&gt;
The index of an array simply refers to the “position number” of the elements in the array(counting from zero).&lt;br&gt;
&lt;strong&gt;ARRAY DEFINITION:&lt;/strong&gt;&lt;br&gt;
Arrays are groups of variables (called elements/components) containing values that all have the same data types. ARRAYS are OBJECTS, so they are considered “reference types”. To refer to Array elements/values , we make reference to their index.&lt;br&gt;
&lt;strong&gt;ZEROth ELEMENT:&lt;/strong&gt;&lt;br&gt;
This refers to the first element of an array. Please note that an array index must not be negative i.e (non-negative integer).&lt;br&gt;
Please note that all array indexes must be an integer value. It is usually denoted with “int”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DECLARING AN ARRAY:&lt;/strong&gt;&lt;br&gt;
Array objects occupy space. Arrays are created using the keyword “new”.&lt;br&gt;
Therefore, to create an array object, you have to:&lt;br&gt;
i)  specify the type of array elements (data type).&lt;br&gt;
ii) specify the number of array elements (array length).&lt;br&gt;
  The array creation expression below explains better:&lt;/p&gt;

&lt;p&gt;int array firstName [ ] = new int [10 ];&lt;/p&gt;

&lt;p&gt;where  int =  refers to the datatype&lt;br&gt;
             firstName=  refers to the arrayName&lt;br&gt;
             new=  is the keyword used to create new array&lt;br&gt;
             [10]=   refers to the length of the array.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ARRAY VALUE:&lt;/strong&gt;&lt;br&gt;
Array values are denoted using array[counter] assuming counter is what is used in your array creation expression. &lt;br&gt;
&lt;strong&gt;ARRAY INITIALIZER:&lt;/strong&gt;&lt;br&gt;
You can decide to create or declare an array through various ways. You can create an array and initialize it’s elements with ‘array initializer’- a comma separated list of expressions (called an initializer list) enclosed in curly braces {}.&lt;/p&gt;

&lt;p&gt;NB: In this case, the array length will be determined by the number of elements in the initializer. E.g &lt;/p&gt;

&lt;p&gt;int [] = {2,4,6,8,10,12,14};&lt;br&gt;
The above expression is a 6-element array with index (0-5).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CONCLUSION&lt;/strong&gt;&lt;br&gt;
We have finally come to the end of our “Introduction to arrays” (series 1).&lt;br&gt;
So, there you go! You should be proud of the progress you’ve made so far on array. We were able to cover areas like: &lt;br&gt;
What is an array?&lt;br&gt;
Array length.&lt;br&gt;
Array initializer.&lt;br&gt;
Array declaration.&lt;br&gt;
How to create/declare an array.&lt;br&gt;
Trust me, you’ve been absolutely amazing! Next episode of the array series, we would look at other aspects of an array and array list like&lt;/p&gt;

&lt;p&gt;For now, cheers and goodluck!&lt;br&gt;
This article on array is going to be in three series, namely:&lt;/p&gt;

&lt;p&gt;Arrays series 1. (INTRODUCTION).    &lt;/p&gt;

&lt;p&gt;Array series 2.(INTERMEDIATE).   &lt;/p&gt;

&lt;p&gt;Arrays series 3. (ADVANCED).&lt;/p&gt;

&lt;p&gt;Watch out for this space for more engaging contents on array.&lt;/p&gt;

</description>
      <category>java</category>
      <category>indexcounting</category>
      <category>arraystudentblog</category>
      <category>arraysconcept</category>
    </item>
    <item>
      <title>How To Build An Educational Recommendation Application With Python and Fauna</title>
      <dc:creator>aidelojep</dc:creator>
      <pubDate>Tue, 13 Apr 2021 06:26:32 +0000</pubDate>
      <link>https://dev.to/aidelojep/how-to-build-an-educational-recommendation-application-with-python-and-fauna-4ba6</link>
      <guid>https://dev.to/aidelojep/how-to-build-an-educational-recommendation-application-with-python-and-fauna-4ba6</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/t/python"&gt;#Python&lt;/a&gt;  &lt;a href="https://dev.to/t/faunadb"&gt;#fauna&lt;/a&gt; &lt;a href="https://dev.to/t/serverless"&gt;#serverless&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  &lt;strong&gt;Authored in connection with the &lt;a href="https://fauna.com/blog/write-with-fauna" rel="noopener noreferrer"&gt;Write With Fauna&lt;/a&gt; program&lt;/strong&gt;
&lt;/h5&gt;

&lt;p&gt;In this article, we will explain the steps required to build an educational app (that recommends best learning materials to it’s users based on an algorithm that functions from the user’s history pattern). In building this application, &lt;a href="https://fauna.com/" rel="noopener noreferrer"&gt;Fauna&lt;/a&gt; serverless database, Python and  Recommendation Model were utilized.&lt;/p&gt;

&lt;p&gt;The educational app aims to assist users by suggesting choicest materials to aid their study. This article further explains how the user’s pattern is used to suggest better ways to source for these materials using a &lt;em&gt;recommendation model.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;+Some of the broad areas related to this work include the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://fauna.com/" rel="noopener noreferrer"&gt;Fauna&lt;/a&gt;&lt;/strong&gt; serverless Platform.&lt;/li&gt;
&lt;li&gt;Python platform. &lt;/li&gt;
&lt;li&gt;Machine Learning/Artificial Learning.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;GETTING STARTED WITH FAUNA&lt;/strong&gt;
&lt;/h2&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;STEP 1: FAUNA SETUP&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Here, the first thing to do is to create the database for our educational app in the Fauna dashboard. If you are new to Fauna and yet to create an account, you will be required to do so via the link attached here: &lt;br&gt;
&lt;a href="https://dashboard.fauna.com/accounts/register?utm_source=DevTo&amp;amp;utm_medium=referral&amp;amp;utm_campaign=WritewithFauna_SuggestiveApp_PAideloje" rel="noopener noreferrer"&gt;Fauna Acct Sign Up&lt;/a&gt;&lt;br&gt;
In the Fauna dashboard, click on the “NEW DATABASE” button, provide a database name and click on the save button. &lt;br&gt;
&lt;a href="https://media.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%2F895sqo7zdd8u6a5ap4k7.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F895sqo7zdd8u6a5ap4k7.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.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%2Fh5vrxb7ag9a54m1l9rqy.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fh5vrxb7ag9a54m1l9rqy.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;STEP 2: GENERATE  FAUNA APPLICATION PROGRAMMING INTERFACE (API) KEYS&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;In order to connect the database to our educational app, we need to generate a Fauna API. We do this by navigating to security settings on the Fauna sidebar (located at the top left-side of the screen).&lt;br&gt;
&lt;a href="https://media.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%2Fmwka39cupqmutzk02v1z.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fmwka39cupqmutzk02v1z.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.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%2Fv4n5nar17xvcxqoiuza4.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fv4n5nar17xvcxqoiuza4.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.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%2Fu0smyhpqa2a8httndcrv.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fu0smyhpqa2a8httndcrv.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once this has been done, you are presented with your API keys ( best to be kept a secret and copied in a place that is easy to retrieve).&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;STEP 3: INTEGRATE FAUNA INTO PYTHON&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;At this stage, we proceed to get the Python Library for Fauna. This is available on the pip and can be installed with a single line on the terminal.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fszw0mcaaz67tckasg44y.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fszw0mcaaz67tckasg44y.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
After installation is completed, we run the sample code provided in Fauna Python driver docs: &lt;br&gt;
&lt;a href="https://docs.fauna.com/fauna/current/drivers/python.html" rel="noopener noreferrer"&gt;https://docs.fauna.com/fauna/current/drivers/python.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fp2juc0e8sorz8xiuey6z.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fp2juc0e8sorz8xiuey6z.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The  above code provides further explanation on how the Fauna Python driver connects to a database with its API key and prints all its indexes. &lt;/p&gt;

&lt;p&gt;Now, let us consider the steps to follow to build our educational recommendation application from the Front-End.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;BUILDING OUR EDUCATIONAL RECOMMENDATION APPLICATION FRONT-END&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Brief Introduction to Machine Learning and Artificial Intelligence:&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;The term &lt;em&gt;Machine Learning&lt;/em&gt; and &lt;em&gt;Artificial Intelligence&lt;/em&gt; are used interchangeably very often. But in practice and theory, they do not mean the same thing. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;M&lt;/strong&gt;achine Learning involves application of &lt;em&gt;Artificial Intelligence&lt;/em&gt; to systems and thereby providing the ability for these systems to automatically learn and improve from experience without being programmed manually. It involves the ability for computers to be able to develop and explore data, then utilize these data sets for themselves by identifying patterns with very minimal human intervention.&lt;/p&gt;

&lt;p&gt;++Machine Learning(&lt;strong&gt;&lt;em&gt;ML&lt;/em&gt;&lt;/strong&gt;) can be grouped into three(3) broad categories:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reinforcement Learning.&lt;/li&gt;
&lt;li&gt;Supervised Learning.&lt;/li&gt;
&lt;li&gt;Unsupervised Learning.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Artificial Intelligence (&lt;strong&gt;&lt;em&gt;AI&lt;/em&gt;&lt;/strong&gt;) is an umbrella terminology that refers to any machine that performs a smart task. &lt;strong&gt;&lt;em&gt;AI&lt;/em&gt;&lt;/strong&gt; is a technology that enables machines to simulate human behaviour. In other words, we can refer to all Machine Learning as Artificial Intelligence but not all Artificial Intelligence are Machine Learning. &lt;/p&gt;

&lt;p&gt;Artificial Intelligence can also be grouped into four(4) types:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Self Awareness&lt;/li&gt;
&lt;li&gt;Reactive Machines.&lt;/li&gt;
&lt;li&gt;Limited Memories.&lt;/li&gt;
&lt;li&gt;Theory of Mind.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The goal of &lt;strong&gt;&lt;em&gt;AI&lt;/em&gt;&lt;/strong&gt; is to produce software that can reason on input and explain on output. Although, &lt;strong&gt;&lt;em&gt;AI&lt;/em&gt;&lt;/strong&gt; produces software that will provide human-like interaction and offer relevant supportive decisions but not to be a replacement to humans, not anytime soon.&lt;br&gt;&lt;br&gt;
Some of the mostly used machine learning application includes: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Medical Sector&lt;/li&gt;
&lt;li&gt;  Banking and stock markets&lt;/li&gt;
&lt;li&gt;  Speech and image recognition&lt;/li&gt;
&lt;li&gt;  Regression&lt;/li&gt;
&lt;li&gt;  Prediction&lt;/li&gt;
&lt;li&gt;  Product recommendation&lt;/li&gt;
&lt;li&gt;  Online fraud detection&lt;/li&gt;
&lt;li&gt;  Social media services.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Facial recognition and detection is an &lt;strong&gt;&lt;em&gt;AI&lt;/em&gt;&lt;/strong&gt; example that we use every day without realizing it. This technology works just like humans recognize the face and voice of other people.&lt;/p&gt;

&lt;p&gt;This machine learning process lets the &lt;strong&gt;&lt;em&gt;AI&lt;/em&gt;&lt;/strong&gt; learn the facial coordinates of a human face and save it in their program for detection. Government and security sectors use this technology for restricted areas to deter unwanted personnel from entering the premises.&lt;/p&gt;

&lt;p&gt;Now that we have successfully integrated our Python script to Fauna, let us list the steps to follow to create our Educational recommendation Application.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Educational Recommendation Model
&lt;/h2&gt;

&lt;p&gt;Getting alternatives or close substitutes for some certain educational material is an issue to a certain individual. This difficulty becomes more real when it involves a third party doing the purchase. Most parents who buy educational materials for their children solely rely on other people’s recommendation. But making such purchases online can be further enhanced using a Recommendation Model which is a machine learning algorithm that can be used to recommend educational movies, educational videos on youtube and reliable sources to access these materials. &lt;/p&gt;

&lt;p&gt;Basically, there are three basics of recommendation model which are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Simple recommender.&lt;/li&gt;
&lt;li&gt;Content-based recommender.&lt;/li&gt;
&lt;li&gt;Collaborative filtering engines.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In this article, I will be using the content-based recommendation model which suggests similar items based on a particular item. This system uses item metadata, such as genre, movie description, lead acts to make these recommendations. The general idea behind these recommender systems is that if a person likes a particular item, he or she will also like an item that is similar to it. And to recommend that, it will make use of the user's past item metadata. &lt;/p&gt;

&lt;p&gt;In building this algorithm (model), I am going to use the Python programming language because of its robust libraries and the fact that it is faster and more accurate and precise when it comes to scientific calculations. For building, this classification model is going to use the Cosine Similarity matrix which takes the distance between points let say point X1, X2, X3, X4...........Xn and check if the distance between two certain points is close if there are close, it will group them together as related (positive) but if there are far apart (negative) then it will group them as dissimilar or unrelated.&lt;/p&gt;

&lt;p&gt;I am going to be building these models with a movie data-set which I got from UCI which is a machine learning repository for the data source.&lt;/p&gt;

&lt;p&gt;Let’s go through the process of building the recommendation model in python, using some specific libraries.&lt;/p&gt;

&lt;p&gt;In building this model the first thing you have to do is to build your environment using this command Python -m venv venv, after that you install the following packages using pip install for windows user while for Linux user you use pip3 install:&lt;/p&gt;

&lt;p&gt;A. Sklearn&lt;/p&gt;

&lt;p&gt;B. Numpy&lt;/p&gt;

&lt;p&gt;C. Pandas&lt;/p&gt;

&lt;p&gt;D. Matplotlib&lt;/p&gt;

&lt;p&gt;E. Jupyter notebook/Jupyter lab&lt;/p&gt;

&lt;p&gt;The sklearn is used for scientific calculation, pandas are used for loading the data into the notebook in other for me to be able to work with, Matplotlib is used for plotting of graphs, Numpy is being used for mathematical computation while Jupyter notebook/jupyter lab is an environment where the python code will be written.&lt;/p&gt;

&lt;h4&gt;
  
  
  About Data-set
&lt;/h4&gt;

&lt;p&gt;The dataset files contain metadata for all 45,000 movies listed in the Full MovieLens Dataset. The dataset consists of movies released on or before July 2017. This dataset captures feature points like overview, plot, budget, revenue, posters, release dates, languages, production companies, countries, TMDB vote counts, and vote averages.&lt;/p&gt;

&lt;p&gt;These feature points could be potentially used to train machine learning models for content and collaborative filtering.&lt;/p&gt;

&lt;p&gt;This dataset consists of the following files:&lt;/p&gt;

&lt;p&gt;movies_metadata.csv: This file contains information on approximately 45,000 movies featured in the Full MovieLens dataset. Features include posters, backdrops, budget, genre, revenue, overview, release dates, languages, production countries, and companies.  And this will be the dataset I will be using for building the recommendation model.&lt;/p&gt;

&lt;p&gt;The Full MovieLens Dataset comprises 26 million ratings and 750,000 tag applications, from 270,000 users on all the 45,000 movies in this dataset. It can be accessed from &lt;a href="https://grouplens.org/datasets/movielens/latest/" rel="noopener noreferrer"&gt;GroupLens website&lt;/a&gt;.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                        **Snippet of libraries**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fgsn7420gvpp35enosmz4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fgsn7420gvpp35enosmz4.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;strong&gt;Fig 1.0: Importing Libraries&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;To load the dataset, I will be using the pandas DataFrame library. The panda’s library is mainly used for data manipulation and analysis. It represents your data in a row-column format. Pandas library is backed by the NumPy array for the implementation of pandas data objects. pandas offer off-the-shelf data structures and operations for manipulating numerical tables, time series, imagery, and natural language processing datasets. Basically, pandas are useful for those datasets which can be easily represented in a tabular fashion.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;            **Loading Dataset**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fhp3wslmgnx1rgdffdo3m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fhp3wslmgnx1rgdffdo3m.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Fig 1.1 Loading dataset&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Next, I check for missing values in my data-set in other to avoid bias in our models. From the code snippet below there are missing values in our dataset. In other to avoid the models not be bias we deal with the missing values by replacing them with the mean and mode of the column.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fvtpdevyg5j6yhdyg1zdt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fvtpdevyg5j6yhdyg1zdt.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fig 1.2: Checking for missing values&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F1syoqikw03em9k2pl3bm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F1syoqikw03em9k2pl3bm.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fig 1.3: Fixing missing values  the mean and mode&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Plot Description Based Recommender&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In this section, I will be building a system that recommends movies that are similar to a particular movie. To achieve this, I will compute pairwise cosine similarity scores for all movies based on their plot descriptions and recommend movies based on that similarity score threshold.&lt;/p&gt;

&lt;p&gt;The plot description is available as the overview feature in my movie dataset. Let's inspect the plots of a few movies:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fqlyfqw984pia5eqmaen5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fqlyfqw984pia5eqmaen5.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fig 1.4: Overview&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We have to deal with Natural Language Processing problem. And it is not possible to compute the similarity between any two overviews in their raw forms.** &lt;strong&gt;To do this I have to compute the word to vectors of each overview or document, as it will be called&lt;/strong&gt;. **&lt;/p&gt;

&lt;p&gt;As the name suggests, word vectors are vectorized representations of words in a document. The vectors carry a semantic meaning with them. For example, man &amp;amp; king will have vector representations close to each other while man &amp;amp; woman would have representation far from each other.&lt;/p&gt;

&lt;p&gt;I will be computing Term Frequency-Inverse Document Frequency (TF-IDF) vectors for each document. This will give you a matrix where each column represents a word in the overview vocabulary (all the words that appear in at least one document), and each column represents a movie, as before.&lt;/p&gt;

&lt;p&gt;The TF-IDF score is the frequency of a word occurring in a document, down-weighted by the number of documents in which it occurs. This is done to reduce the importance of words that frequently occur in plot overviews and, therefore, their significance in computing the final similarity score.&lt;/p&gt;

&lt;p&gt;In this case, am going to use the sci-kit-learn library which has a built-in TF-IDFVectorizer class that produces the TF-IDF matrix. In other to make the algorithm work properly without bias we remove words that are not relevant to the topic example of such words includes like, the, an, on, etc.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                                **A Snippet of TF-IDF Matrix**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fy304age022s0d8xy11nl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fy304age022s0d8xy11nl.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fig 1.5: TF-IDF matrix.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;From the above output, you observe that 22645 different vocabularies or words in your dataset have 5157 movies. With the TFI-DF matrix, it can now be easier for me to compute the cosine similarity. which calculates a numeric quantity that denotes the similarity between two movies.  Mathematically it can be express as &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fu6m70lbuo4tw2eavqm3t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fu6m70lbuo4tw2eavqm3t.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since I have used the TF-IDF vectorizer, calculating the dot product between each vector will directly give me the cosine similarity score. Therefore, I will use sklearn’s linear_kernel() instead of cosine_similarities() since it is faster. This as a result would return a matrix of shape 5157x5157, which means each movie overview cosine similarity score with every other movie overview. Hence, each movie will be a 1x5157 column vector where each column will be a similarity score with each movie.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fv2xyuih3ji76v9ef3nqu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fv2xyuih3ji76v9ef3nqu.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fig 1.6: Computation of TF-IDF matrix&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I am now going to define a function that takes in a movie title as an input and outputs a list of the 10 most similar movies. In order to do this, I need a reverse mapping of movie titles and DataFrame indices. In other words, I need a mechanism to identify the index of a movie in the Movie DataFrame, given its title. &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        **A snippet of the Recommendation model**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.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%2F0hc6nf0bdc49oinqyolh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F0hc6nf0bdc49oinqyolh.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fig 1.7: Recommendation model&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After getting the function, you then saved it using joblib and generate the requirements using the command pip freeze &amp;gt; requirements.txt. This will help in avoiding some environmental variable issues while deploying the model on any hosting site, also it will make it easier for other machine learning engineers to contribute and improve on the model. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this article, we built an educational recommendation application with Python and listed some steps to follow to install Fauna serverless database. We saw how easy it is to integrate Fauna into a Python application. We also gave a brief introduction to Machine Learning and Artificial Intelligence. &lt;/p&gt;

&lt;p&gt;If you have any questions, don't hesitate to contact me on Twitter: &lt;a href="https://twitter.com/Paideloje" rel="noopener noreferrer"&gt;@&lt;/a&gt;&lt;span&gt;PAideloje&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ng.linkedin.com/in/peter-aideloje-64aab6116?trk=profile-badge" rel="noopener noreferrer"&gt;Peter Aideloje&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Authored in connection with the Write With Fauna program&lt;/p&gt;

</description>
    </item>
    <item>
      <title>public class JavaIsBae { public static void main (String....args) System.out.println ("Java is Bae!") }</title>
      <dc:creator>aidelojep</dc:creator>
      <pubDate>Sun, 14 Feb 2021 21:48:22 +0000</pubDate>
      <link>https://dev.to/aidelojep/public-class-javaisbae-public-static-void-main-string-args-system-out-println-java-is-bae-1002</link>
      <guid>https://dev.to/aidelojep/public-class-javaisbae-public-static-void-main-string-args-system-out-println-java-is-bae-1002</guid>
      <description></description>
    </item>
  </channel>
</rss>
