<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[P3 Programmer]]></title>
  <link href="http://blog.tamizhvendan.in/atom.xml" rel="self"/>
  <link href="http://blog.tamizhvendan.in/"/>
  <updated>2017-07-28T08:29:53+05:30</updated>
  <id>http://blog.tamizhvendan.in/</id>
  <author>
    <name><![CDATA[Tamizhvendan S]]></name>
    <email><![CDATA[tamizh88@gmail.com]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Managing Data in Golang Using Gorm - Part 2]]></title>
    <link href="http://blog.tamizhvendan.in/blog/2017/07/26/managing-data-in-golang-using-gorm-part-2/"/>
    <updated>2017-07-26T07:09:17+05:30</updated>
    <id>http://blog.tamizhvendan.in/blog/2017/07/26/managing-data-in-golang-using-gorm-part-2</id>
    <content type="html"><![CDATA[<p>In my previous <a href="http://blog.tamizhvendan.in/blog/2017/07/23/managing-data-in-golang-using-gorm-part-1/">blog post</a>, we have seen how to use the create and find function in gorm along with use-case driven approach. In this blog post, we will be extending our blogging platform <strong>gomidway</strong> by implementing an another interesting use case. </p>

<h2 id="use-case-3---publishing-a-new-blog-post">Use Case #3 - Publishing a new blog post</h2>

<p>Publishing a new blog post use case involves the following</p>

<ul>
  <li>
    <p>A user can publish a new blog post by providing a title, body of the post and a set of tags.</p>
  </li>
  <li>
    <p>If the title already exists we need to let the user know about it.</p>
  </li>
  <li>
    <p>We also need to let him know if publish went well. </p>
  </li>
</ul>

<p>Though the requirement looks simple on paper, there are some complexities regarding organizing the code and orchestrating the entire operation. </p>

<p>Let’s dig up and see how we can solve it!</p>

<h2 id="the-database-schema">The Database Schema</h2>

<p>As a first step, let’s add some new tables to our existing schema which has only the <code>users</code> table.</p>

<p>The first one is the <code>posts</code> table</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="sql"><span class="line"><span class="k">CREATE</span> <span class="k">TABLE</span> <span class="n">posts</span><span class="p">(</span>
</span><span class="line">  <span class="n">id</span> <span class="nb">SERIAL</span> <span class="k">PRIMARY</span> <span class="k">KEY</span><span class="p">,</span>
</span><span class="line">  <span class="n">title</span> <span class="nb">VARCHAR</span><span class="p">(</span><span class="mi">50</span><span class="p">)</span> <span class="k">UNIQUE</span> <span class="k">NOT</span> <span class="k">NULL</span><span class="p">,</span>
</span><span class="line">  <span class="n">body</span> <span class="nb">TEXT</span> <span class="k">NOT</span> <span class="k">NULL</span><span class="p">,</span>
</span><span class="line">  <span class="n">published_at</span> <span class="k">TIMESTAMP</span> <span class="k">NOT</span> <span class="k">NULL</span><span class="p">,</span>
</span><span class="line">  <span class="n">author_id</span> <span class="nb">INTEGER</span> <span class="k">NOT</span> <span class="k">NULL</span> <span class="k">REFERENCES</span> <span class="n">users</span><span class="p">(</span><span class="n">id</span><span class="p">)</span>
</span><span class="line"><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Then we need to have an another table for <code>tags</code></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="sql"><span class="line"><span class="k">CREATE</span> <span class="k">TABLE</span> <span class="n">tags</span><span class="p">(</span>
</span><span class="line">  <span class="n">id</span> <span class="nb">SERIAL</span> <span class="k">PRIMARY</span> <span class="k">KEY</span><span class="p">,</span>
</span><span class="line">  <span class="n">name</span> <span class="nb">VARCHAR</span><span class="p">(</span><span class="mi">50</span><span class="p">)</span> <span class="k">NOT</span> <span class="k">NULL</span>
</span><span class="line"><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>And finally, a bridge table to associate <code>posts</code> and <code>tags</code></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="sql"><span class="line"><span class="k">CREATE</span> <span class="k">TABLE</span> <span class="n">posts_tags</span><span class="p">(</span>
</span><span class="line">  <span class="n">tag_id</span> <span class="nb">INTEGER</span> <span class="k">REFERENCES</span> <span class="n">tags</span><span class="p">(</span><span class="n">id</span><span class="p">),</span>
</span><span class="line">  <span class="n">post_id</span> <span class="nb">INTEGER</span> <span class="k">REFERENCES</span> <span class="n">posts</span><span class="p">(</span><span class="n">id</span><span class="p">)</span>
</span><span class="line"><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p><em>Note: a blog post can have multiple tags, and a tag can have multiple blog posts associated with it</em></p>

<h2 id="model-definitions---post-and-tag">Model Definitions - Post and Tag</h2>

<p>The next step is defining equivalent models for <code>Post</code> and <code>Tag</code> in golang. </p>

<p>Let’s create a new folder called <code>tag</code> and define the <code>Tag</code> model.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// tag/model.go</span>
</span><span class="line"><span class="kn">package</span> <span class="nx">tag</span>
</span><span class="line">
</span><span class="line"><span class="kd">type</span> <span class="nx">Tag</span> <span class="kd">struct</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">ID</span>   <span class="kt">uint</span>
</span><span class="line">  <span class="nx">Name</span> <span class="kt">string</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Then define the <code>Post</code> model in an another new folder <code>post</code></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// post/model.go</span>
</span><span class="line"><span class="kn">package</span> <span class="nx">post</span>
</span><span class="line">
</span><span class="line"><span class="kn">import</span> <span class="p">(</span>
</span><span class="line">  <span class="s">&quot;time&quot;</span>
</span><span class="line">
</span><span class="line">  <span class="s">&quot;github.com/tamizhvendan/gomidway/tag&quot;</span>
</span><span class="line"><span class="p">)</span>
</span><span class="line">
</span><span class="line"><span class="kd">const</span> <span class="p">(</span>
</span><span class="line">  <span class="nx">UniqueConstraintTitle</span> <span class="p">=</span> <span class="s">&quot;posts_title_key&quot;</span>
</span><span class="line"><span class="p">)</span>
</span><span class="line">
</span><span class="line"><span class="kd">type</span> <span class="nx">Post</span> <span class="kd">struct</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">ID</span>          <span class="kt">uint</span>
</span><span class="line">  <span class="nx">Title</span>       <span class="kt">string</span>
</span><span class="line">  <span class="nx">Body</span>        <span class="kt">string</span>
</span><span class="line">  <span class="nx">AuthorID</span>    <span class="kt">uint</span>
</span><span class="line">  <span class="nx">Tags</span>        <span class="p">[]</span><span class="nx">tag</span><span class="p">.</span><span class="nx">Tag</span> <span class="s">`gorm:&quot;many2many:posts_tags;&quot;`</span>
</span><span class="line">  <span class="nx">PublishedAt</span> <span class="nx">time</span><span class="p">.</span><span class="nx">Time</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="kd">type</span> <span class="nx">TitleDuplicateError</span> <span class="kd">struct</span><span class="p">{}</span>
</span><span class="line">
</span><span class="line"><span class="kd">func</span> <span class="p">(</span><span class="nx">e</span> <span class="o">*</span><span class="nx">TitleDuplicateError</span><span class="p">)</span> <span class="nx">Error</span><span class="p">()</span> <span class="kt">string</span> <span class="p">{</span>
</span><span class="line">  <span class="k">return</span> <span class="s">&quot;title already exists&quot;</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>As we have seen in <a href="https://github.com/tamizhvendan/gomidway/blob/part-1/user/create.go#L11-#L16">the previous blog post</a>, the constant <code>UniqueConstraintTitle</code> and the <code>TitleDuplicateError</code> are required for doing unique constraint violation error check on the <code>title</code> column and to communicate it to the application respectively. </p>

<p>The important thing to notice in this model definition is the <code>Tags</code> field</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="kd">type</span> <span class="nx">Post</span> <span class="kd">struct</span> <span class="p">{</span>
</span><span class="line">  <span class="c1">// ...</span>
</span><span class="line">  <span class="nx">Tags</span>        <span class="p">[]</span><span class="nx">tag</span><span class="p">.</span><span class="nx">Tag</span> <span class="s">`gorm:&quot;many2many:posts_tags;&quot;`</span>
</span><span class="line">  <span class="c1">// ..</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <code>Tags</code> field has a <a href="https://golang.org/ref/spec#Tag">golang struct tag</a> <code>gorm</code> defining the association type <code>many2many</code> and the name of the bridge table <code>posts_tags</code>.</p>

<h2 id="implementing-new-blog-post-use-case">Implementing new blog post use case</h2>

<p>Now we have all the models required to enable publishing a new blog post, and it’s time to have to go at its implementation.</p>

<p>Let’s start by creating a new folder <code>publish</code> under <code>post</code> and add the scaffolding for the handler </p>

<p><em>As we have seen earlier, the folder structure represent the use case, and the handler orchestrate the use case</em></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// post/publish/handler.go</span>
</span><span class="line"><span class="kn">package</span> <span class="nx">publish</span>
</span><span class="line">
</span><span class="line"><span class="kn">import</span> <span class="p">(</span>
</span><span class="line">  <span class="s">&quot;github.com/jinzhu/gorm&quot;</span>
</span><span class="line"><span class="p">)</span>
</span><span class="line">
</span><span class="line"><span class="kd">type</span> <span class="nx">Request</span> <span class="kd">struct</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">Title</span>    <span class="kt">string</span>
</span><span class="line">  <span class="nx">Body</span>     <span class="kt">string</span>
</span><span class="line">  <span class="nx">AuthorID</span> <span class="kt">uint</span>
</span><span class="line">  <span class="nx">Tags</span>     <span class="p">[]</span><span class="kt">string</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="kd">type</span> <span class="nx">Response</span> <span class="kd">struct</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">PostId</span> <span class="kt">uint</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="kd">func</span> <span class="nx">NewPost</span><span class="p">(</span><span class="nx">db</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">Request</span><span class="p">)</span> <span class="p">(</span><span class="o">*</span><span class="nx">Response</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="c1">// TODO</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The implementation of publishing a new post involves the following steps</p>

<ol>
  <li>
    <p>For all the <code>Tags</code> that are part of the request, we need to create an entry in the <code>tags</code> table. If it is already there, we don’t need to create.</p>
  </li>
  <li>
    <p>The next step is creating a new entry in the <code>posts</code> table with the given details. </p>
  </li>
  <li>
    <p>Finally, we need to associate the <code>Tags</code> with the newly created <code>Post</code> via the bridge table. </p>
  </li>
</ol>

<p>Since it involves multiple inserts on the database side, all the three steps should happen inside a transaction.</p>

<p><em>The first two steps can be executed in any order as they are independent of each other</em></p>

<h3 id="code-organization-aka-responsibility-separation">Code Organization (aka Responsibility Separation)</h3>

<p>We discussed a little bit about code organization in the <a href="http://blog.tamizhvendan.in/blog/2017/07/23/managing-data-in-golang-using-gorm-part-1/">last blog post</a>. One important thing which can help us, in the long run is having proper separation of concern in the code base. </p>

<p>There are multiple ways we can separate the concern. In our case, we are organizing by use cases with <code>handler</code> driving the implementation. The handler may access the <code>data</code> layer if the use case requires. </p>

<p>To keep things simple, we are not discussing dependency injection in <code>handler</code> and <code>data</code> layer interaction here. I am planning to cover this in my future blog posts.</p>

<p>Back to our business, the data access logic of the three steps will be in their respective packages and the <code>publish</code> handler coordinate the entire use case logic. </p>

<p><img class="center" src="http://blog.tamizhvendan.in/images/gomidway/part2/code_org.png" /></p>

<h4 id="step-1-create-a-tag-if-not-exists">Step 1: Create a Tag if not exists</h4>

<p>The first step is creating a tag if it is not there in the database. For the both new tags and the existing tags we need to get its <code>id</code> from the database to associate it with the <code>posts</code>.</p>

<p>Gorm has a method called <a href="https://godoc.org/github.com/jinzhu/gorm#DB.FirstOrCreate">FirstOrCreate</a> to help us to implement this step. </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// tag/create.go</span>
</span><span class="line"><span class="kn">package</span> <span class="nx">tag</span>
</span><span class="line">
</span><span class="line"><span class="kn">import</span> <span class="s">&quot;github.com/jinzhu/gorm&quot;</span>
</span><span class="line">
</span><span class="line"><span class="kd">func</span> <span class="nx">CreateIfNotExists</span><span class="p">(</span><span class="nx">db</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">,</span> <span class="nx">tagName</span> <span class="kt">string</span><span class="p">)</span> <span class="p">(</span><span class="o">*</span><span class="nx">Tag</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="kd">var</span> <span class="nx">tag</span> <span class="nx">Tag</span>
</span><span class="line">  <span class="nx">res</span> <span class="o">:=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">FirstOrCreate</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">tag</span><span class="p">,</span> <span class="nx">Tag</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="nx">tagName</span><span class="p">})</span>
</span><span class="line">  <span class="k">if</span> <span class="nx">res</span><span class="p">.</span><span class="nx">Error</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line">    <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="nx">res</span><span class="p">.</span><span class="nx">Error</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="k">return</span> <span class="o">&amp;</span><span class="nx">tag</span><span class="p">,</span> <span class="kc">nil</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <em>FirstOrCreate</em> method populates the <code>Id</code> field of the tag.</p>

<h4 id="step-2-creating-a-new-post">Step 2: Creating a new Post</h4>

<p>It is similar to creating a new user that we saw in the last blog post</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// post/create.go</span>
</span><span class="line"><span class="kn">package</span> <span class="nx">post</span>
</span><span class="line">
</span><span class="line"><span class="kn">import</span> <span class="p">(</span>
</span><span class="line">  <span class="s">&quot;github.com/jinzhu/gorm&quot;</span>
</span><span class="line">  <span class="s">&quot;github.com/tamizhvendan/gomidway/postgres&quot;</span>
</span><span class="line"><span class="p">)</span>
</span><span class="line">
</span><span class="line"><span class="kd">func</span> <span class="nx">Create</span><span class="p">(</span><span class="nx">db</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">,</span> <span class="nx">post</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="p">(</span><span class="kt">uint</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">res</span> <span class="o">:=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">Create</span><span class="p">(</span><span class="nx">post</span><span class="p">)</span>
</span><span class="line">  <span class="k">if</span> <span class="nx">res</span><span class="p">.</span><span class="nx">Error</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line">    <span class="k">if</span> <span class="nx">postgres</span><span class="p">.</span><span class="nx">IsUniqueConstraintError</span><span class="p">(</span><span class="nx">res</span><span class="p">.</span><span class="nx">Error</span><span class="p">,</span> <span class="nx">UniqueConstraintTitle</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">      <span class="k">return</span> <span class="mi">0</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">TitleDuplicateError</span><span class="p">{}</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line">    <span class="k">return</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">res</span><span class="p">.</span><span class="nx">Error</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="k">return</span> <span class="nx">post</span><span class="p">.</span><span class="nx">ID</span><span class="p">,</span> <span class="kc">nil</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h4 id="step-3-associating-tag-with-post">Step 3: Associating Tag with Post</h4>

<p>The final step is associating the tag with the post in the database. Gorm has a decent support for <a href="http://jinzhu.me/gorm/associations.html">Associations</a>. The one that we needed from gorm to carry out the current step is its <a href="https://godoc.org/github.com/jinzhu/gorm#Association.Append">Append</a> method.</p>

<p>Let’s define a <code>constant</code> in <code>Post</code> model which holds the AssociationTag</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// post/model.go</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="kd">const</span> <span class="p">(</span>
</span><span class="line">  <span class="c1">// ...</span>
</span><span class="line">  <span class="nx">AssociationTags</span> <span class="p">=</span> <span class="s">&quot;Tags&quot;</span>
</span><span class="line"><span class="p">)</span>
</span><span class="line"><span class="c1">// ...</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Then add a new file <em>tag.go</em> in the <em>post</em> folder and implement the third step as below</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// post/tag.go</span>
</span><span class="line"><span class="kn">package</span> <span class="nx">post</span>
</span><span class="line">
</span><span class="line"><span class="kn">import</span> <span class="p">(</span>
</span><span class="line">	<span class="s">&quot;github.com/jinzhu/gorm&quot;</span>
</span><span class="line">	<span class="s">&quot;github.com/tamizhvendan/gomidway/tag&quot;</span>
</span><span class="line"><span class="p">)</span>
</span><span class="line">
</span><span class="line"><span class="kd">func</span> <span class="nx">AddTag</span><span class="p">(</span><span class="nx">db</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">,</span> <span class="nx">post</span> <span class="o">*</span><span class="nx">Post</span><span class="p">,</span> <span class="nx">tag</span> <span class="o">*</span><span class="nx">tag</span><span class="p">.</span><span class="nx">Tag</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">res</span> <span class="o">:=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">Model</span><span class="p">(</span><span class="nx">post</span><span class="p">).</span><span class="nx">Association</span><span class="p">(</span><span class="nx">AssociationTags</span><span class="p">).</span><span class="nx">Append</span><span class="p">(</span><span class="nx">tag</span><span class="p">)</span>
</span><span class="line">  <span class="k">return</span> <span class="nx">res</span><span class="p">.</span><span class="nx">Error</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h3 id="publishing-new-blog-post">Publishing New Blog Post</h3>

<p>Now we have all the individual database layer functions ready for all the three steps, and it’s time to focus on the implementation of publishing a new blog post.</p>

<p>We already have the scaffolding in place</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// publish/handler.go</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="kd">func</span> <span class="nx">NewPost</span><span class="p">(</span><span class="nx">db</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">Request</span><span class="p">)</span> <span class="p">(</span><span class="o">*</span><span class="nx">Response</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="c1">// TODO</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>As a first step, let’s begin a new transaction using gorm’s <a href="https://godoc.org/github.com/jinzhu/gorm#DB.Begin">Begin</a> method. </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="kd">func</span> <span class="nx">NewPost</span><span class="p">(</span><span class="nx">db</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">Request</span><span class="p">)</span> <span class="p">(</span><span class="o">*</span><span class="nx">Response</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">tx</span> <span class="o">:=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">Begin</span><span class="p">()</span>
</span><span class="line">  <span class="k">if</span> <span class="nx">tx</span><span class="p">.</span><span class="nx">Error</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line">    <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="nx">tx</span><span class="p">.</span><span class="nx">Error</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="c1">// TODO</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Then call the <code>Create</code> function in <code>post</code> package to create a new blog post</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="kd">func</span> <span class="nx">NewPost</span><span class="p">(</span><span class="nx">db</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">Request</span><span class="p">)</span> <span class="p">(</span><span class="o">*</span><span class="nx">Response</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="c1">// ...</span>
</span><span class="line">  <span class="nx">newPost</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="nx">post</span><span class="p">.</span><span class="nx">Post</span><span class="p">{</span>
</span><span class="line">    <span class="nx">AuthorID</span><span class="p">:</span>    <span class="nx">req</span><span class="p">.</span><span class="nx">AuthorId</span><span class="p">,</span>
</span><span class="line">    <span class="nx">Title</span><span class="p">:</span>       <span class="nx">req</span><span class="p">.</span><span class="nx">Title</span><span class="p">,</span>
</span><span class="line">    <span class="nx">Body</span><span class="p">:</span>        <span class="nx">req</span><span class="p">.</span><span class="nx">Body</span><span class="p">,</span>
</span><span class="line">    <span class="nx">PublishedAt</span><span class="p">:</span> <span class="nx">time</span><span class="p">.</span><span class="nx">Now</span><span class="p">().</span><span class="nx">UTC</span><span class="p">(),</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="nx">_</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">post</span><span class="p">.</span><span class="nx">Create</span><span class="p">(</span><span class="nx">tx</span><span class="p">,</span> <span class="nx">newPost</span><span class="p">)</span>
</span><span class="line">  <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line">    <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="nx">err</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="c1">// TODO</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Then for all the tags in the request, call the <code>CreateIfNotExists</code> function in <code>tag</code> package to get its respective <em>Ids</em> and associate it with the newly created post using the <code>AddTag</code> function in the <code>post</code> package.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="kd">func</span> <span class="nx">NewPost</span><span class="p">(</span><span class="nx">db</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">Request</span><span class="p">)</span> <span class="p">(</span><span class="o">*</span><span class="nx">Response</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="c1">// ...</span>
</span><span class="line">  <span class="k">for</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">tagName</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">req</span><span class="p">.</span><span class="nx">Tags</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">t</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">tag</span><span class="p">.</span><span class="nx">CreateIfNotExists</span><span class="p">(</span><span class="nx">tx</span><span class="p">,</span> <span class="nx">tagName</span><span class="p">)</span>
</span><span class="line">    <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line">      <span class="nx">tx</span><span class="p">.</span><span class="nx">Rollback</span><span class="p">()</span>
</span><span class="line">      <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="nx">err</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line">    <span class="nx">err</span> <span class="p">=</span> <span class="nx">post</span><span class="p">.</span><span class="nx">AddTag</span><span class="p">(</span><span class="nx">tx</span><span class="p">,</span> <span class="nx">newPost</span><span class="p">,</span> <span class="nx">t</span><span class="p">)</span>
</span><span class="line">    <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line">      <span class="nx">tx</span><span class="p">.</span><span class="nx">Rollback</span><span class="p">()</span>
</span><span class="line">      <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="nx">err</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="c1">// TODO</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>A thing to note here is we are rolling back the transaction using the <a href="https://godoc.org/github.com/jinzhu/gorm#DB.Rollback">RollBack</a> method in case of error. </p>

<p>The final step is committing the transaction and returning the newly created post id as response</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="kd">func</span> <span class="nx">NewPost</span><span class="p">(</span><span class="nx">db</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">Request</span><span class="p">)</span> <span class="p">(</span><span class="o">*</span><span class="nx">Response</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="c1">// ...</span>
</span><span class="line">  <span class="nx">res</span> <span class="o">:=</span> <span class="nx">tx</span><span class="p">.</span><span class="nx">Commit</span><span class="p">()</span>
</span><span class="line">  <span class="k">if</span> <span class="nx">res</span><span class="p">.</span><span class="nx">Error</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line">    <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="nx">res</span><span class="p">.</span><span class="nx">Error</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="k">return</span> <span class="o">&amp;</span><span class="nx">Response</span><span class="p">{</span><span class="nx">PostId</span><span class="p">:</span> <span class="nx">newPost</span><span class="p">.</span><span class="nx">ID</span><span class="p">},</span> <span class="kc">nil</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h3 id="test-driving-publish-new-blog-post">Test Driving Publish New Blog Post</h3>

<p>Let’s test drive our implementation from the <code>main</code> function with some hard coded value</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
<span class="line-number">32</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// main.go</span>
</span><span class="line"><span class="kn">package</span> <span class="nx">main</span>
</span><span class="line">
</span><span class="line"><span class="kn">import</span> <span class="p">(</span>
</span><span class="line">  <span class="c1">// ...</span>
</span><span class="line">  <span class="s">&quot;github.com/tamizhvendan/gomidway/post&quot;</span>
</span><span class="line">  <span class="s">&quot;github.com/tamizhvendan/gomidway/post/publish&quot;</span>
</span><span class="line"><span class="p">)</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="kd">func</span> <span class="nx">main</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">  <span class="c1">// ...</span>
</span><span class="line">  <span class="nx">publishPost</span><span class="p">(</span><span class="nx">db</span><span class="p">)</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line">
</span><span class="line"><span class="kd">func</span> <span class="nx">publishPost</span><span class="p">(</span><span class="nx">db</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">res</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">publish</span><span class="p">.</span><span class="nx">NewPost</span><span class="p">(</span><span class="nx">db</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">publish</span><span class="p">.</span><span class="nx">Request</span><span class="p">{</span>
</span><span class="line">    <span class="nx">AuthorId</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
</span><span class="line">    <span class="nx">Body</span><span class="p">:</span>     <span class="s">&quot;Golang rocks!&quot;</span><span class="p">,</span>
</span><span class="line">    <span class="nx">Title</span><span class="p">:</span>    <span class="s">&quot;My first gomidway post&quot;</span><span class="p">,</span>
</span><span class="line">    <span class="nx">Tags</span><span class="p">:</span>     <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="s">&quot;intro&quot;</span><span class="p">,</span> <span class="s">&quot;golang&quot;</span><span class="p">},</span>
</span><span class="line">  <span class="p">})</span>
</span><span class="line">  <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line">    <span class="k">if</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">ok</span> <span class="o">:=</span> <span class="nx">err</span><span class="p">.(</span><span class="o">*</span><span class="nx">post</span><span class="p">.</span><span class="nx">TitleDuplicateError</span><span class="p">);</span> <span class="nx">ok</span> <span class="p">{</span>
</span><span class="line">      <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">&quot;Bad Request: &quot;</span><span class="p">,</span> <span class="nx">err</span><span class="p">.</span><span class="nx">Error</span><span class="p">())</span>
</span><span class="line">      <span class="k">return</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line">    <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">&quot;Internal Server Error: &quot;</span><span class="p">,</span> <span class="nx">err</span><span class="p">.</span><span class="nx">Error</span><span class="p">())</span>
</span><span class="line">    <span class="k">return</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">&quot;Created: &quot;</span><span class="p">,</span> <span class="nx">res</span><span class="p">.</span><span class="nx">PostId</span><span class="p">)</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>if we run the program with these hard coded values, we will get the following output</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line">Created: 1
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>if we rerun the program without changing anything, we will get the bad request error as expected</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line">Bad Request: title already exists
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h2 id="summary">Summary</h2>

<p>In this blog post, we have seen how to perform, create operation of a model having many to many relationship using gorm. The source code is available in my <a href="https://github.com/tamizhvendan/gomidway/tree/part-2">GitHub repository</a>. </p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Managing Data in golang using gorm - Part 1]]></title>
    <link href="http://blog.tamizhvendan.in/blog/2017/07/23/managing-data-in-golang-using-gorm-part-1/"/>
    <updated>2017-07-23T07:55:59+05:30</updated>
    <id>http://blog.tamizhvendan.in/blog/2017/07/23/managing-data-in-golang-using-gorm-part-1</id>
    <content type="html"><![CDATA[<p><a href="www.ajira.tech">We</a> have been using <a href="jinzhu.me/gorm/">gorm</a> as a primary tool to interact with <a href="https://www.PostgreSQL.org">PostgreSQL</a> from <a href="https://golang.org">golang</a> for almost a year now. </p>

<p>Gorm does an excellent job as an <a href="https://en.wikipedia.org/wiki/Object-relational_mapping">ORM</a> library, and we enjoyed using it in our projects. </p>

<p>Through this blog post series, I will be sharing our experiences on how we leveraged gorm to solve our client’s needs.</p>

<h2 id="the-domain">The Domain</h2>

<p>In this blog post series, we will be implementing the data persistence side of a blogging platform similar to <a href="https://medium.com">medium</a>, called <strong>gomidway</strong>.  </p>

<h2 id="part-1-introduction">Part-1 Introduction</h2>

<p>In this blog post, we will be working on defining the backend for signing up a new user and providing a provision for user login.</p>

<h2 id="the-user-model">The User Model</h2>

<p>Let’s start our modeling from the User table. </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="sql"><span class="line"><span class="k">CREATE</span> <span class="k">TABLE</span> <span class="n">users</span><span class="p">(</span>
</span><span class="line">  <span class="n">id</span> <span class="nb">SERIAL</span> <span class="k">PRIMARY</span> <span class="k">KEY</span><span class="p">,</span>
</span><span class="line">  <span class="n">username</span> <span class="nb">VARCHAR</span><span class="p">(</span><span class="mi">50</span><span class="p">)</span> <span class="k">UNIQUE</span> <span class="k">NOT</span> <span class="k">NULL</span><span class="p">,</span>
</span><span class="line">  <span class="n">email</span> <span class="nb">VARCHAR</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span> <span class="k">UNIQUE</span> <span class="k">NOT</span> <span class="k">NULL</span><span class="p">,</span>
</span><span class="line">  <span class="n">password_hash</span> <span class="nb">TEXT</span> <span class="k">NOT</span> <span class="k">NULL</span>
</span><span class="line"><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Then define an equivalent model in golang.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="kd">type</span> <span class="nx">User</span> <span class="kd">struct</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">ID</span>           <span class="kt">uint</span> <span class="s">`gorm:&quot;primary_key&quot;`</span>
</span><span class="line">  <span class="nx">Username</span>     <span class="kt">string</span>
</span><span class="line">  <span class="nx">Email</span>        <span class="kt">string</span>
</span><span class="line">  <span class="nx">PasswordHash</span> <span class="kt">string</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Before taking the next steps, let me spend some time on explaining where to put this <code>User</code> <em>struct</em></p>

<h3 id="the-folder-structure">The Folder Structure</h3>

<p>There are two common ways to organize the models in golang. </p>

<p>One approach is defining a folder called <code>models</code> and put all the models here</p>

<p><img class="center" src="http://blog.tamizhvendan.in/images/gomidway/part1/models.png" /></p>

<p>The another approach is an invert of this structure. In this design, we will have a separate folder for each model. </p>

<p><img class="center" src="http://blog.tamizhvendan.in/images/gomidway/part1/domain.png" /></p>

<p>Both the approaches have pros and cons. Choosing one over the other is entirely opinionated, and my preference is the second one.</p>

<p>IMHO, the folder structure has <a href="https://8thlight.com/blog/uncle-bob/2011/09/30/Screaming-Architecture.html">to represent the domain</a> and the code associated a domain model should coexist with proper separation of concern. </p>

<p><img class="center" src="http://blog.tamizhvendan.in/images/gomidway/part1/folder_structure.png" /></p>

<blockquote>
  <p>Software architectures are structures that support the use cases of the system - <a href="https://www.amazon.com/Object-Oriented-Software-Engineering-Driven-Approach/dp/0201403471">Ivar Jacobson</a></p>
</blockquote>

<p>In this gorm blog post series, I will be following the <code>domain</code> based folder structure. </p>

<h2 id="use-case-1---user-signup">Use Case #1 - User Signup</h2>

<p>The Signup use case of a user is defined as </p>

<ul>
  <li>A user should sign up himself by providing his email, username, and password</li>
  <li>If the username or the email already exists, we need to let him now </li>
  <li>We also need to let him know if there is any error while persisting his signup details</li>
  <li>If signup succeeds, he should be getting a unique identifier in the system</li>
</ul>

<p>To keep things simple and the focus of this series is on the data persistence side, we are not going to discuss/implement the HTTP portion of the application. Instead, we will be driving our implementation with some hard code values during the application bootstrap. </p>

<h3 id="defining-the-signup-handler">Defining the Signup handler</h3>

<p>Like many terms in software engineering, the term <strong>handler</strong> has different meanings. So, let me start by explaining what I mean by a handler here. </p>

<p>A handler is a function that represents an use-case. It takes its dependency(ies) and its input(s) as parameters and returns the outcome of the use case. </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// user/signup/handler.go</span>
</span><span class="line"><span class="kn">package</span> <span class="nx">signup</span>
</span><span class="line">
</span><span class="line"><span class="kd">type</span> <span class="nx">Request</span> <span class="kd">struct</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">Username</span> <span class="kt">string</span>
</span><span class="line">  <span class="nx">Email</span>    <span class="kt">string</span>
</span><span class="line">  <span class="nx">Password</span> <span class="kt">string</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="kd">type</span> <span class="nx">Response</span> <span class="kd">struct</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">Id</span> <span class="kt">uint</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="kd">func</span> <span class="nx">Signup</span><span class="p">(</span><span class="nx">db</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">Request</span><span class="p">)</span> <span class="p">(</span><span class="o">*</span><span class="nx">Response</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="c1">// ...</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>One important thing to notice here is, the <code>Request</code> and the <code>Response</code> are golang structs. How the request is being populated from user’s request (JSON Post / HTML form Post / command from a message queue) and how the response communicated to the user (JSON response / HTML view / event in the message queue) are left up to the application boundary. </p>

<p>In the Signup function, as a first step, we need to create the hash for the password using <a href="https://godoc.org/golang.org/x/crypto/bcrypt">bcrypt</a> and then create the new user. </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="kd">func</span> <span class="nx">Signup</span><span class="p">(</span><span class="nx">db</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">Request</span><span class="p">)</span> <span class="p">(</span><span class="o">*</span><span class="nx">Response</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">passwordHash</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">bcrypt</span><span class="p">.</span><span class="nx">GenerateFromPassword</span><span class="p">([]</span><span class="nb">byte</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">Password</span><span class="p">),</span> <span class="nx">bcrypt</span><span class="p">.</span><span class="nx">DefaultCost</span><span class="p">)</span>
</span><span class="line">  <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line">    <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="nx">err</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="nx">newUser</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="nx">user</span><span class="p">.</span><span class="nx">User</span><span class="p">{</span>
</span><span class="line">    <span class="nx">Username</span><span class="p">:</span>     <span class="nx">req</span><span class="p">.</span><span class="nx">Username</span><span class="p">,</span>
</span><span class="line">    <span class="nx">Email</span><span class="p">:</span>        <span class="nx">req</span><span class="p">.</span><span class="nx">Email</span><span class="p">,</span>
</span><span class="line">    <span class="nx">PasswordHash</span><span class="p">:</span> <span class="nb">string</span><span class="p">(</span><span class="nx">passwordHash</span><span class="p">),</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="c1">// ????</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The next step is persisting this newly created user</p>

<h3 id="adding-user-create-function">Adding User Create function</h3>

<p>The create user function is straight forward. We just need to call the <a href="https://godoc.org/github.com/jinzhu/gorm#DB.Create">Create</a> method in gorm</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// user/create.go</span>
</span><span class="line"><span class="kn">package</span> <span class="nx">user</span>
</span><span class="line">
</span><span class="line"><span class="kd">func</span> <span class="nx">Create</span><span class="p">(</span><span class="nx">db</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">,</span> <span class="nx">user</span> <span class="o">*</span><span class="nx">User</span><span class="p">)</span> <span class="p">(</span><span class="kt">uint</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">err</span> <span class="o">:=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">Create</span><span class="p">(</span><span class="nx">user</span><span class="p">).</span><span class="nx">Error</span>
</span><span class="line">  <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line">    <span class="k">return</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">err</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="k">return</span> <span class="nx">user</span><span class="p">.</span><span class="nx">ID</span><span class="p">,</span> <span class="kc">nil</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>But the work is not done yet!</p>

<p>As per our use case, We need to let the handler to know if the username or the email already exists. </p>

<p>We already have unique constraints in place in the <code>users</code> table. </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line"><span class="nv">gomidway</span><span class="o">=</span><span class="c"># \d users</span>
</span><span class="line">                                    Table <span class="s2">&quot;public.users&quot;</span>
</span><span class="line">    Column     <span class="p">|</span>          Type          <span class="p">|</span>                     Modifiers
</span><span class="line">---------------+------------------------+----------------------------------------------------
</span><span class="line"> id            <span class="p">|</span> integer                <span class="p">|</span> not null default nextval<span class="o">(</span><span class="s1">&#39;users_id_seq&#39;</span>::regclass<span class="o">)</span>
</span><span class="line"> username      <span class="p">|</span> character varying<span class="o">(</span>50<span class="o">)</span>  <span class="p">|</span> not null
</span><span class="line"> email         <span class="p">|</span> character varying<span class="o">(</span>255<span class="o">)</span> <span class="p">|</span> not null
</span><span class="line"> password_hash <span class="p">|</span> text                   <span class="p">|</span> not null
</span><span class="line">Indexes:
</span><span class="line">    <span class="s2">&quot;users_pkey&quot;</span> PRIMARY KEY, btree <span class="o">(</span>id<span class="o">)</span>
</span><span class="line">    <span class="s2">&quot;users_email_key&quot;</span> UNIQUE CONSTRAINT, btree <span class="o">(</span>email<span class="o">)</span>
</span><span class="line">    <span class="s2">&quot;users_username_key&quot;</span> UNIQUE CONSTRAINT, btree <span class="o">(</span>username<span class="o">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>So, the <code>Create</code> method in gorm would return an error of type <a href="http://godoc.org/github.com/lib/pq#Error">pq Error</a> with the <a href="http://godoc.org/github.com/lib/pq#ErrorCode">ErrorCode</a> as <code>"23505"</code> for <code>unique_violation</code>, and the <code>Constraint</code> field will be having the unique constraint key name <code>users_email_key</code> and <code>users_username_key</code> for email and username duplicate error respectively. </p>

<p>Though this error does communicate what we wanted, it is very generic and what we want is something concrete to our use case. </p>

<p>To make it happen, let’s create a new folder <code>postgres</code> (aka package) and write a utility function <code>IsUniqueConstraintError</code> which checks whether the given error is a unique constraint error or not.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// postgres/pq.go</span>
</span><span class="line"><span class="kd">func</span> <span class="nx">IsUniqueConstraintError</span><span class="p">(</span><span class="nx">err</span> <span class="kt">error</span><span class="p">,</span> <span class="nx">constraintName</span> <span class="kt">string</span><span class="p">)</span> <span class="kt">bool</span> <span class="p">{</span>
</span><span class="line">  <span class="k">if</span> <span class="nx">pqErr</span><span class="p">,</span> <span class="nx">ok</span> <span class="o">:=</span> <span class="nx">err</span><span class="p">.(</span><span class="o">*</span><span class="nx">pq</span><span class="p">.</span><span class="nx">Error</span><span class="p">);</span> <span class="nx">ok</span> <span class="p">{</span>
</span><span class="line">    <span class="k">return</span> <span class="nx">pqErr</span><span class="p">.</span><span class="nx">Code</span> <span class="o">==</span> <span class="s">&quot;23505&quot;</span> <span class="o">&amp;&amp;</span> <span class="nx">pqErr</span><span class="p">.</span><span class="nx">Constraint</span> <span class="o">==</span> <span class="nx">constraintName</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="k">return</span> <span class="kc">false</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>and then in the <code>model.go</code>, where we have the User model, add the constraint names as constants.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// user/model.go</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="kd">const</span> <span class="p">(</span>
</span><span class="line">  <span class="nx">UniqueConstraintUsername</span> <span class="p">=</span> <span class="s">&quot;users_username_key&quot;</span>
</span><span class="line">  <span class="nx">UniqueConstraintEmail</span>    <span class="p">=</span> <span class="s">&quot;users_email_key&quot;</span>
</span><span class="line"><span class="p">)</span>
</span><span class="line"><span class="c1">// ...</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Finally, define the custom error types</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// user/model.go</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="kd">type</span> <span class="nx">UsernameDuplicateError</span> <span class="kd">struct</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">Username</span> <span class="kt">string</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="kd">func</span> <span class="p">(</span><span class="nx">e</span> <span class="o">*</span><span class="nx">UsernameDuplicateError</span><span class="p">)</span> <span class="nx">Error</span><span class="p">()</span> <span class="kt">string</span> <span class="p">{</span>
</span><span class="line">  <span class="k">return</span> <span class="nx">fmt</span><span class="p">.</span><span class="nx">Sprintf</span><span class="p">(</span><span class="s">&quot;Username &#39;%s&#39; already exists&quot;</span><span class="p">,</span> <span class="nx">e</span><span class="p">.</span><span class="nx">Username</span><span class="p">)</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="kd">type</span> <span class="nx">EmailDuplicateError</span> <span class="kd">struct</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">Email</span> <span class="kt">string</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="kd">func</span> <span class="p">(</span><span class="nx">e</span> <span class="o">*</span><span class="nx">EmailDuplicateError</span><span class="p">)</span> <span class="nx">Error</span><span class="p">()</span> <span class="kt">string</span> <span class="p">{</span>
</span><span class="line">  <span class="k">return</span> <span class="nx">fmt</span><span class="p">.</span><span class="nx">Sprintf</span><span class="p">(</span><span class="s">&quot;Email &#39;%s&#39; already exists&quot;</span><span class="p">,</span> <span class="nx">e</span><span class="p">.</span><span class="nx">Email</span><span class="p">)</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>With this new helper function, constants and types in places, we can complete the create user function as follows.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// user/create.go</span>
</span><span class="line"><span class="kd">func</span> <span class="nx">Create</span><span class="p">(</span><span class="nx">db</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">,</span> <span class="nx">user</span> <span class="o">*</span><span class="nx">User</span><span class="p">)</span> <span class="p">(</span><span class="kt">uint</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">err</span> <span class="o">:=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">Create</span><span class="p">(</span><span class="nx">user</span><span class="p">).</span><span class="nx">Error</span>
</span><span class="line">  <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line">    <span class="k">if</span> <span class="nx">postgres</span><span class="p">.</span><span class="nx">IsUniqueConstraintError</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">UniqueConstraintUsername</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">      <span class="k">return</span> <span class="mi">0</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">UsernameDuplicateError</span><span class="p">{</span><span class="nx">Username</span><span class="p">:</span> <span class="nx">user</span><span class="p">.</span><span class="nx">Username</span><span class="p">}</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line">    <span class="k">if</span> <span class="nx">postgres</span><span class="p">.</span><span class="nx">IsUniqueConstraintError</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">UniqueConstraintEmail</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">      <span class="k">return</span> <span class="mi">0</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">EmailDuplicateError</span><span class="p">{</span><span class="nx">Email</span><span class="p">:</span> <span class="nx">user</span><span class="p">.</span><span class="nx">Email</span><span class="p">}</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line">    <span class="k">return</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">err</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="k">return</span> <span class="nx">user</span><span class="p">.</span><span class="nx">ID</span><span class="p">,</span> <span class="kc">nil</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>On the handler side, we just pass the outcome of this create function to the outside(application boundary) layer</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// user/signup/handler.go</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="kd">func</span> <span class="nx">Signup</span><span class="p">(</span><span class="nx">db</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">Request</span><span class="p">)</span> <span class="p">(</span><span class="o">*</span><span class="nx">Response</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="c1">// ...</span>
</span><span class="line">  <span class="nx">id</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">user</span><span class="p">.</span><span class="nx">Create</span><span class="p">(</span><span class="nx">db</span><span class="p">,</span> <span class="nx">newUser</span><span class="p">)</span>
</span><span class="line">  <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line">    <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="nx">err</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="k">return</span> <span class="o">&amp;</span><span class="nx">Response</span><span class="p">{</span><span class="nx">Id</span><span class="p">:</span> <span class="nx">id</span><span class="p">},</span> <span class="nx">err</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h3 id="test-driving-user-signup">Test Driving User Signup</h3>

<p>As we discussed earlier, let’s test drive the implementation from the application bootstrap. </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// main.go</span>
</span><span class="line"><span class="kd">func</span> <span class="nx">panicOnError</span><span class="p">(</span><span class="nx">err</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line">    <span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="kd">func</span> <span class="nx">main</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">db</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">gorm</span><span class="p">.</span><span class="nx">Open</span><span class="p">(</span><span class="s">&quot;postgres&quot;</span><span class="p">,</span>
</span><span class="line">    <span class="s">`host=localhost </span>
</span><span class="line"><span class="s">      user=postgres password=test</span>
</span><span class="line"><span class="s">      dbname=gomidway </span>
</span><span class="line"><span class="s">      sslmode=disable`</span><span class="p">)</span>
</span><span class="line">  <span class="nx">panicOnError</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span><span class="line">  <span class="k">defer</span> <span class="nx">db</span><span class="p">.</span><span class="nx">Close</span><span class="p">()</span>
</span><span class="line">
</span><span class="line">  <span class="nx">signupUser</span><span class="p">(</span><span class="nx">db</span><span class="p">)</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// main.go</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="kd">func</span> <span class="nx">signupUser</span><span class="p">(</span><span class="nx">db</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">res</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">signup</span><span class="p">.</span><span class="nx">Signup</span><span class="p">(</span><span class="nx">db</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">signup</span><span class="p">.</span><span class="nx">Request</span><span class="p">{</span>
</span><span class="line">    <span class="nx">Email</span><span class="p">:</span>    <span class="s">&quot;foo@bar.com&quot;</span><span class="p">,</span>
</span><span class="line">    <span class="nx">Username</span><span class="p">:</span> <span class="s">&quot;foo&quot;</span><span class="p">,</span>
</span><span class="line">    <span class="nx">Password</span><span class="p">:</span> <span class="s">&quot;foobar&quot;</span><span class="p">,</span>
</span><span class="line">  <span class="p">})</span>
</span><span class="line">  <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line">    <span class="k">switch</span> <span class="nx">err</span><span class="p">.(</span><span class="kd">type</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">    <span class="k">case</span> <span class="o">*</span><span class="nx">user</span><span class="p">.</span><span class="nx">UsernameDuplicateError</span><span class="p">:</span>
</span><span class="line">      <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">&quot;Bad Request: &quot;</span><span class="p">,</span> <span class="nx">err</span><span class="p">.</span><span class="nx">Error</span><span class="p">())</span>
</span><span class="line">      <span class="k">return</span>
</span><span class="line">    <span class="k">case</span> <span class="o">*</span><span class="nx">user</span><span class="p">.</span><span class="nx">EmailDuplicateError</span><span class="p">:</span>
</span><span class="line">      <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">&quot;Bad Request: &quot;</span><span class="p">,</span> <span class="nx">err</span><span class="p">.</span><span class="nx">Error</span><span class="p">())</span>
</span><span class="line">      <span class="k">return</span>
</span><span class="line">    <span class="k">default</span><span class="p">:</span>
</span><span class="line">      <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">&quot;Internal Server Error: &quot;</span><span class="p">,</span> <span class="nx">err</span><span class="p">.</span><span class="nx">Error</span><span class="p">())</span>
</span><span class="line">      <span class="k">return</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">&quot;Created: &quot;</span><span class="p">,</span> <span class="nx">res</span><span class="p">.</span><span class="nx">Id</span><span class="p">)</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>if we run the program for the first time after setting up the PostgreSQL database <code>gomidway</code> with the <code>users</code> table, we will get the following output</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line">Created:  1
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>if we rerun the program again, we’ll see the bad request error</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line">Bad Request:  Username <span class="s1">&#39;foo&#39;</span> already exists
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>if we modify the username from <code>foo</code> to <code>bar</code> and run the program, we’ll again get a bad request error for the email address</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line">Bad Request:  Email <span class="s1">&#39;foo@bar.com&#39;</span> already exists
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>That’s it! We have completed the first use case of <strong>gomidway</strong>!!</p>

<h2 id="use-case-2---user-login">Use Case #2 - User Login</h2>

<p>The next use case that we are going to implement is user login. The requirement for login has been defined as</p>

<ul>
  <li>
    <p>if the user logs in with a different email address or with a different password, we need to show him appropriate errors</p>
  </li>
  <li>
    <p>if the email and the password matches, let the user know that he has logged in</p>
  </li>
</ul>

<h3 id="defining-the-login-handler">Defining the Login handler</h3>

<p>As we did for the signup, let’s start our implementation from defining the handler for login</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// user/login/handler.go</span>
</span><span class="line"><span class="kd">type</span> <span class="nx">Request</span> <span class="kd">struct</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">Email</span>    <span class="kt">string</span>
</span><span class="line">  <span class="nx">Password</span> <span class="kt">string</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="kd">type</span> <span class="nx">Response</span> <span class="kd">struct</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">User</span> <span class="o">*</span><span class="nx">user</span><span class="p">.</span><span class="nx">User</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="kd">func</span> <span class="nx">Login</span><span class="p">(</span><span class="nx">db</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">Request</span><span class="p">)</span> <span class="p">(</span><span class="o">*</span><span class="nx">Response</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="c1">// ...</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>To implement login, we need some help from the persistence. In other words, we have to find whether the user with the given email address exists in our application.</p>

<h3 id="adding-user-findbyemail-function">Adding User FindByEmail function</h3>

<p>Let’s create a new file <code>find.go</code> in the <code>user</code> folder and define the <code>FindByEmail</code> function</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// user/find.go</span>
</span><span class="line"><span class="kd">func</span> <span class="nx">FindByEmail</span><span class="p">(</span><span class="nx">db</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">,</span> <span class="nx">email</span> <span class="kt">string</span><span class="p">)</span> <span class="p">(</span><span class="o">*</span><span class="nx">User</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="kd">var</span> <span class="nx">user</span> <span class="nx">User</span>
</span><span class="line">  <span class="nx">res</span> <span class="o">:=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">User</span><span class="p">{</span><span class="nx">Email</span><span class="p">:</span> <span class="nx">email</span><span class="p">})</span>
</span><span class="line">  <span class="k">return</span> <span class="o">&amp;</span><span class="nx">user</span><span class="p">,</span> <span class="nx">res</span><span class="p">.</span><span class="nx">Error</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>That’s great. But how are we going to find if the email didn’t exist in the first place?</p>

<p>Thankfully, We don’t need to anything extra other than calling the <a href="https://godoc.org/github.com/jinzhu/gorm#DB.RecordNotFound">RecordNotFound</a> to figure this out!</p>

<p>Let’s define a custom error type <code>EmailNotExistsError</code> and return it if no records found.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// user/find.go</span>
</span><span class="line"><span class="kd">type</span> <span class="nx">EmailNotExistsError</span> <span class="kd">struct</span><span class="p">{}</span>
</span><span class="line">
</span><span class="line"><span class="kd">func</span> <span class="p">(</span><span class="o">*</span><span class="nx">EmailNotExistsError</span><span class="p">)</span> <span class="nx">Error</span><span class="p">()</span> <span class="kt">string</span> <span class="p">{</span>
</span><span class="line">  <span class="k">return</span> <span class="s">&quot;email not exists&quot;</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="kd">func</span> <span class="nx">FindByEmail</span><span class="p">(</span><span class="nx">db</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">,</span> <span class="nx">email</span> <span class="kt">string</span><span class="p">)</span> <span class="p">(</span><span class="o">*</span><span class="nx">User</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="kd">var</span> <span class="nx">user</span> <span class="nx">User</span>
</span><span class="line">  <span class="nx">res</span> <span class="o">:=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">User</span><span class="p">{</span><span class="nx">Email</span><span class="p">:</span> <span class="nx">email</span><span class="p">})</span>
</span><span class="line">  <span class="k">if</span> <span class="nx">res</span><span class="p">.</span><span class="nx">RecordNotFound</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">EmailNotExistsError</span><span class="p">{}</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="k">return</span> <span class="o">&amp;</span><span class="nx">user</span><span class="p">,</span> <span class="kc">nil</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Now its time to turn our attention to Login handler to wire up the login functionality. </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// user/login/handler.go</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="kd">func</span> <span class="nx">Login</span><span class="p">(</span><span class="nx">db</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">Request</span><span class="p">)</span> <span class="p">(</span><span class="o">*</span><span class="nx">Response</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">user</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">user</span><span class="p">.</span><span class="nx">FindByEmail</span><span class="p">(</span><span class="nx">db</span><span class="p">,</span> <span class="nx">req</span><span class="p">.</span><span class="nx">Email</span><span class="p">)</span>
</span><span class="line">  <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line">    <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="nx">err</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="c1">// ...</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The next scenario that we need to handle is, compare the password in the request with the password hash. As we need to let the user know in case of password mismatch, let’s create a <code>PasswordMismatchError</code> in the login handler and return it during the mismatch.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// user/login/handler.go</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="kd">type</span> <span class="nx">PasswordMismatchError</span> <span class="kd">struct</span><span class="p">{}</span>
</span><span class="line"><span class="kd">func</span> <span class="p">(</span><span class="nx">e</span> <span class="o">*</span><span class="nx">PasswordMismatchError</span><span class="p">)</span> <span class="nx">Error</span><span class="p">()</span> <span class="kt">string</span> <span class="p">{</span>
</span><span class="line">  <span class="k">return</span> <span class="s">&quot;password didn&#39;t match&quot;</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="kd">func</span> <span class="nx">Login</span><span class="p">(</span><span class="nx">db</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">Request</span><span class="p">)</span> <span class="p">(</span><span class="o">*</span><span class="nx">Response</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="c1">// ...</span>
</span><span class="line">  <span class="nx">err</span> <span class="p">=</span> <span class="nx">bcrypt</span><span class="p">.</span><span class="nx">CompareHashAndPassword</span><span class="p">([]</span><span class="nb">byte</span><span class="p">(</span><span class="nx">user</span><span class="p">.</span><span class="nx">PasswordHash</span><span class="p">),</span> <span class="p">[]</span><span class="nb">byte</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">Password</span><span class="p">))</span>
</span><span class="line">  <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line">    <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">PasswordMismatchError</span><span class="p">{}</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="k">return</span> <span class="o">&amp;</span><span class="nx">Response</span><span class="p">{</span><span class="nx">User</span><span class="p">:</span> <span class="nx">user</span><span class="p">},</span> <span class="kc">nil</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>With this, we are done with login handler implementation. Let’s test drive it!</p>

<h3 id="test-driving-user-login">Test Driving User Login</h3>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// main.go</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="kd">func</span> <span class="nx">main</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">  <span class="c1">// ...</span>
</span><span class="line">  <span class="nx">loginUser</span><span class="p">(</span><span class="nx">db</span><span class="p">)</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="kd">func</span> <span class="nx">loginUser</span><span class="p">(</span><span class="nx">db</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">res</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">login</span><span class="p">.</span><span class="nx">Login</span><span class="p">(</span><span class="nx">db</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">login</span><span class="p">.</span><span class="nx">Request</span><span class="p">{</span>
</span><span class="line">    <span class="nx">Email</span><span class="p">:</span> <span class="s">&quot;foo@bar.com&quot;</span><span class="p">,</span>
</span><span class="line">    <span class="nx">Password</span><span class="p">:</span> <span class="s">&quot;foobar&quot;</span><span class="p">})</span>
</span><span class="line">  <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line">    <span class="k">switch</span> <span class="nx">err</span><span class="p">.(</span><span class="kd">type</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">    <span class="k">case</span> <span class="o">*</span><span class="nx">user</span><span class="p">.</span><span class="nx">EmailNotExistsError</span><span class="p">:</span>
</span><span class="line">      <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">&quot;Bad Request: &quot;</span><span class="p">,</span> <span class="nx">err</span><span class="p">.</span><span class="nx">Error</span><span class="p">())</span>
</span><span class="line">      <span class="k">return</span>
</span><span class="line">    <span class="k">case</span> <span class="o">*</span><span class="nx">login</span><span class="p">.</span><span class="nx">PasswordMismatchError</span><span class="p">:</span>
</span><span class="line">      <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">&quot;Bad Request: &quot;</span><span class="p">,</span> <span class="nx">err</span><span class="p">.</span><span class="nx">Error</span><span class="p">())</span>
</span><span class="line">      <span class="k">return</span>
</span><span class="line">    <span class="k">default</span><span class="p">:</span>
</span><span class="line">      <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">&quot;Internal Server Error: &quot;</span><span class="p">,</span> <span class="nx">err</span><span class="p">.</span><span class="nx">Error</span><span class="p">())</span>
</span><span class="line">      <span class="k">return</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="nx">fmt</span><span class="p">.</span><span class="nx">Printf</span><span class="p">(</span><span class="s">&quot;Ok: User &#39;%s&#39; logged in&quot;</span><span class="p">,</span> <span class="nx">res</span><span class="p">.</span><span class="nx">User</span><span class="p">.</span><span class="nx">Username</span><span class="p">)</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h2 id="summary">Summary</h2>

<p>In this blog post, we have seen how we can use the create and find function in gorm along with the use case driven approach. The source code can be found in <a href="https://github.com/tamizhvendan/gomidway/tree/part-1">my GitHub repository</a>. </p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Leveraging interfaces in golang - Part 2]]></title>
    <link href="http://blog.tamizhvendan.in/blog/2017/07/03/leveraging-interfaces-in-golang-part-2/"/>
    <updated>2017-07-03T19:44:33+05:30</updated>
    <id>http://blog.tamizhvendan.in/blog/2017/07/03/leveraging-interfaces-in-golang-part-2</id>
    <content type="html"><![CDATA[<p>In my previous <a href="http://blog.tamizhvendan.in/blog/2017/06/24/leveraging-interfaces-in-golang-part-1/">blog post</a>, we have seen how interfaces in golang can help us to come up with a cleaner design. In this blog post, we are going to see an another interesting use case of applying golang’s interfaces in creating adapters!</p>

<h2 id="some-context">Some Context</h2>

<p>In my current project, we are using <a href="https://www.postgresql.org/">Postgres</a> for persisting the application data. To make our life easier, we are using <a href="http://jinzhu.me/gorm/">gorm</a> to talk to Postgres from our golang code. Things were going well and we started rolling out new features without any challenges. One beautiful day, we came across an interesting requirement which gave us a run for the money.   </p>

<p>The requirement is to store and retrieve an array of strings from Postgres!</p>

<p><img class="center" src="http://blog.tamizhvendan.in/images/igo2/slice-to-array-conversion.png" /></p>

<p>It sounds simple on paper but while implementing it we found that it is not straightforward. Let me explain what the challenge was and how we solved it through a <strong>Task list</strong> example</p>

<h2 id="the-database-side">The Database Side</h2>

<p>Let’s assume that we have database <code>mytasks</code> with a table <code>tasks</code> to keep track of the tasks. </p>

<p>The <code>tasks</code> table has the following schema </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="sql"><span class="line"><span class="k">CREATE</span> <span class="k">TABLE</span> <span class="n">tasks</span> <span class="p">(</span>
</span><span class="line">  <span class="n">id</span> <span class="nb">SERIAL</span> <span class="k">PRIMARY</span> <span class="k">KEY</span><span class="p">,</span>
</span><span class="line">  <span class="n">name</span> <span class="nb">TEXT</span> <span class="k">NOT</span> <span class="k">NULL</span><span class="p">,</span>
</span><span class="line">  <span class="n">is_completed</span> <span class="n">BOOL</span> <span class="k">NOT</span> <span class="k">NULL</span><span class="p">,</span>
</span><span class="line">  <span class="n">tags</span> <span class="nb">VARCHAR</span><span class="p">(</span><span class="mi">10</span><span class="p">)[]</span>
</span><span class="line"><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>An important thing to note over here is that each <code>task</code> has an array of <code>tags</code> of type <code>varchar(10)</code>.</p>

<h2 id="the-golang-side">The Golang Side</h2>

<p>The equivalent <a href="http://jinzhu.me/gorm/models.html#model-definition">model definition</a> of the <code>tasks</code> table would look like the following in <em>Golang</em></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="kd">type</span> <span class="nx">Task</span> <span class="kd">struct</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">Id</span>          <span class="kt">uint</span>
</span><span class="line">  <span class="nx">Name</span>        <span class="kt">string</span>
</span><span class="line">  <span class="nx">IsCompleted</span> <span class="kt">bool</span>
</span><span class="line">  <span class="nx">Tags</span>        <span class="p">[]</span><span class="kt">string</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h2 id="the-challenge">The Challenge</h2>

<p>Everything is set to test drive the task creation. </p>

<p>Let’s see what happens when we try to create a new task!</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
<span class="line-number">32</span>
<span class="line-number">33</span>
<span class="line-number">34</span>
<span class="line-number">35</span>
<span class="line-number">36</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="kn">package</span> <span class="nx">main</span>
</span><span class="line"><span class="kn">import</span> <span class="p">(</span>
</span><span class="line">  <span class="s">&quot;fmt&quot;</span>
</span><span class="line">
</span><span class="line">  <span class="s">&quot;github.com/jinzhu/gorm&quot;</span>
</span><span class="line">  <span class="nx">_</span> <span class="s">&quot;github.com/jinzhu/gorm/dialects/postgres&quot;</span>
</span><span class="line"><span class="p">)</span>
</span><span class="line">
</span><span class="line"><span class="kd">func</span> <span class="nx">panicOnError</span><span class="p">(</span><span class="nx">err</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line">    <span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="kd">func</span> <span class="nx">CreateTask</span><span class="p">(</span><span class="nx">db</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">,</span> <span class="nx">name</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">tags</span> <span class="p">[]</span><span class="kt">string</span><span class="p">)</span> <span class="p">(</span><span class="kt">uint</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">newTask</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="nx">Task</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="nx">name</span><span class="p">,</span> <span class="nx">Tags</span><span class="p">:</span> <span class="nx">tags</span><span class="p">}</span>
</span><span class="line">  <span class="nx">result</span> <span class="o">:=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">Create</span><span class="p">(</span><span class="nx">newTask</span><span class="p">)</span>
</span><span class="line">  <span class="k">if</span> <span class="nx">result</span><span class="p">.</span><span class="nx">Error</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line">    <span class="k">return</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">result</span><span class="p">.</span><span class="nx">Error</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="k">return</span> <span class="nx">newTask</span><span class="p">.</span><span class="nx">Id</span><span class="p">,</span> <span class="kc">nil</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="kd">func</span> <span class="nx">main</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">db</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">gorm</span><span class="p">.</span><span class="nx">Open</span><span class="p">(</span><span class="s">&quot;postgres&quot;</span><span class="p">,</span>
</span><span class="line">    <span class="s">`host=localhost </span>
</span><span class="line"><span class="s">      user=postgres password=test</span>
</span><span class="line"><span class="s">      dbname=mytasks </span>
</span><span class="line"><span class="s">      sslmode=disable`</span><span class="p">)</span>
</span><span class="line">  <span class="nx">panicOnError</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span><span class="line">  <span class="k">defer</span> <span class="nx">db</span><span class="p">.</span><span class="nx">Close</span><span class="p">()</span>
</span><span class="line">
</span><span class="line">  <span class="nx">id</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">CreateTask</span><span class="p">(</span><span class="nx">db</span><span class="p">,</span> <span class="s">&quot;test 123&quot;</span><span class="p">,</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="s">&quot;personal&quot;</span><span class="p">,</span> <span class="s">&quot;test&quot;</span><span class="p">})</span>
</span><span class="line">  <span class="nx">panicOnError</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span><span class="line">  <span class="nx">fmt</span><span class="p">.</span><span class="nx">Printf</span><span class="p">(</span><span class="s">&quot;Task %d has been created\n&quot;</span><span class="p">,</span> <span class="nx">id</span><span class="p">)</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>When we run this program, it will panic with the following error message </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line">panic: sql: converting Exec argument <span class="nv">$3</span> <span class="nb">type</span>: unsupported <span class="nb">type</span> <span class="o">[]</span>string, a slice of string
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>As the error message says, the SQL driver doesn’t support <code>[]string</code>. From <a href="https://golang.org/pkg/database/sql/driver/#Value">the documentation</a>, we can found that the <em>SQL drivers</em> only support the following values</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line">int64
</span><span class="line">float64
</span><span class="line">bool
</span><span class="line"><span class="o">[]</span>byte
</span><span class="line">string
</span><span class="line">time.Time
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>So, we can’t persist the <code>task</code> with the <code>tags</code> using this approach. </p>

<h2 id="golangs-interface-in-action">Golang’s interface in Action</h2>

<p>As a first step towards the solution, let’s see how the plain SQL <code>insert</code> query provides the value for arrays in <em>Postgres</em></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="sql"><span class="line"><span class="k">INSERT</span> <span class="k">INTO</span> <span class="n">tasks</span><span class="p">(</span><span class="n">name</span><span class="p">,</span><span class="n">is_completed</span><span class="p">,</span><span class="n">tags</span><span class="p">)</span> <span class="k">VALUES</span><span class="p">(</span><span class="s1">&#39;buy milk&#39;</span><span class="p">,</span><span class="k">false</span><span class="p">,</span><span class="s1">&#39;{&quot;home&quot;,&quot;delegate&quot;}&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The clue here is the plain SQL expects the value for array as a string with the following format</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line"><span class="s1">&#39;{ val1 delim val2 delim ... }&#39;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<blockquote>
  <p>double quotes around element values if they are empty strings, contain curly braces, delimiter characters, double quotes, backslashes, or white space, or match the word NULL. Double quotes and backslashes embedded in element values will be backslash-escaped. - <a href="https://www.postgresql.org/docs/9.6/static/arrays.html">Postgres Documentation</a></p>
</blockquote>

<p>That’s great! All we need to do is convert the <code>[]string</code> to <code>string</code> which follows the format specified above. </p>

<p>An easier approach would be changing the <code>Tags</code> field of the <code>Task</code> <strong>struct</strong> to <code>string</code> and do this conversion somewhere in the application code before persisting the task. </p>

<p>But it’s not a cleaner approach as the resulting code is not semantically correct!</p>

<p>Golang provides a neat solution to this problem through the <a href="https://golang.org/pkg/database/sql/driver/#Valuer">Valuer</a> interface</p>

<blockquote>
  <p>Types implementing Valuer interface are able to convert themselves to a driver Value.</p>
</blockquote>

<p>That is we need to have a type representing the <code>[]string</code> type and implement this interface to do the type conversion. </p>

<p>Like we did in the <a href="http://blog.tamizhvendan.in/blog/2017/06/24/leveraging-interfaces-in-golang-part-1/">part-1</a> of this series, let’s make use of <a href="https://golang.org/ref/spec#Type_identity">named types</a> by creating a new type called <code>StringSlice</code></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="kd">type</span> <span class="nx">StringSlice</span> <span class="p">[]</span><span class="kt">string</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Then we need to do the type conversion in the <code>Value</code> method</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="kd">func</span> <span class="p">(</span><span class="nx">stringSlice</span> <span class="nx">StringSlice</span><span class="p">)</span> <span class="nx">Value</span><span class="p">()</span> <span class="p">(</span><span class="nx">driver</span><span class="p">.</span><span class="nx">Value</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="kd">var</span> <span class="nx">quotedStrings</span> <span class="p">[]</span><span class="kt">string</span>
</span><span class="line">  <span class="k">for</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">str</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">stringSlice</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">quotedStrings</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">quotedStrings</span><span class="p">,</span> <span class="nx">strconv</span><span class="p">.</span><span class="nx">Quote</span><span class="p">(</span><span class="nx">str</span><span class="p">))</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="nx">value</span> <span class="o">:=</span> <span class="nx">fmt</span><span class="p">.</span><span class="nx">Sprintf</span><span class="p">(</span><span class="s">&quot;{ %s }&quot;</span><span class="p">,</span> <span class="nx">strings</span><span class="p">.</span><span class="nx">Join</span><span class="p">(</span><span class="nx">quotedStrings</span><span class="p">,</span> <span class="s">&quot;,&quot;</span><span class="p">))</span>
</span><span class="line">  <span class="k">return</span> <span class="nx">value</span><span class="p">,</span> <span class="kc">nil</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Great! </p>

<p>With this new type in place, we can change the datatype of <code>Tags</code> field from <code>[]string</code> to <code>StringSlice</code> in the <code>Task</code> struct. </p>

<p>If we rerun the program, it will work as expected!!</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line">Task 1 has been created
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h2 id="filter-by-tag">Filter by tag</h2>

<p>Let’s move to the query side of the problem. </p>

<p>We would like to get a list of tasks associated with a particular tag. </p>

<p>It’d be a straightforward function that uses the <a href="http://jinzhu.me/gorm/crud.html#query">find method</a> in gorm.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="kd">func</span> <span class="nx">GetTasksByTag</span><span class="p">(</span><span class="nx">db</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">,</span> <span class="nx">tag</span> <span class="kt">string</span><span class="p">)</span> <span class="p">([]</span><span class="nx">Task</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">tasks</span> <span class="o">:=</span> <span class="p">[]</span><span class="nx">Task</span><span class="p">{}</span>
</span><span class="line">  <span class="nx">result</span> <span class="o">:=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">tasks</span><span class="p">,</span> <span class="s">&quot;? = any(tags)&quot;</span><span class="p">,</span> <span class="nx">tag</span><span class="p">)</span>
</span><span class="line">  <span class="k">if</span> <span class="nx">result</span><span class="p">.</span><span class="nx">Error</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line">    <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="nx">result</span><span class="p">.</span><span class="nx">Error</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="k">return</span> <span class="nx">tasks</span><span class="p">,</span> <span class="kc">nil</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Then we need to call it from our main function </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="kd">func</span> <span class="nx">main</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">  <span class="c1">// ...</span>
</span><span class="line">  <span class="nx">tasks</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">GetTasksByTag</span><span class="p">(</span><span class="nx">db</span><span class="p">,</span> <span class="s">&quot;project-x&quot;</span><span class="p">)</span>
</span><span class="line">  <span class="nx">panicOnError</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span><span class="line">  <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="nx">tasks</span><span class="p">)</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Unfortunately, if we run the program, it will panic with the following error message</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line">panic: sql: Scan error on column index 3: unsupported Scan, storing driver.Value <span class="nb">type</span> <span class="o">[]</span>uint8 into
</span><span class="line"><span class="nb">type</span> *main.StringSlice<span class="p">;</span> sql: Scan error on column index 3: unsupported Scan,
</span><span class="line">storing driver.Value <span class="nb">type</span> <span class="o">[]</span>uint8 into <span class="nb">type</span> *main.StringSlice
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>As the error message says, the SQL driver unable to scan (unmarshal) the data type byte slice (<code>[]uint8</code>) into our custom type <code>StringSlice</code>. </p>

<p>To fix this, we need to provide a mechanism to convert <code>[]uint8</code> to <code>StringSlice</code> which in turn will be used by the SQL driver while scanning. </p>

<p>Like the <code>Valuer</code> interface, <em>Golang</em> provides <a href="https://golang.org/pkg/database/sql/#Scanner">Scanner</a> interface to do the data type conversion while scanning. </p>

<p>The signature of the <em>Scanner</em> interface returns an error and not the converted value. </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="kd">type</span> <span class="nx">Scanner</span> <span class="kd">interface</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">Scan</span><span class="p">(</span><span class="nx">src</span> <span class="kd">interface</span><span class="p">{})</span> <span class="kt">error</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
<p>So, it implies the implementor of this interface should have a pointer receiver (<code>*StringSlice</code>) which will mutate its value upon successful conversion.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="kd">func</span> <span class="p">(</span><span class="nx">stringSlice</span> <span class="o">*</span><span class="nx">StringSlice</span><span class="p">)</span> <span class="nx">Scan</span><span class="p">(</span><span class="nx">src</span> <span class="kd">interface</span><span class="p">{})</span> <span class="kt">error</span> <span class="p">{</span>
</span><span class="line">  <span class="c1">// ...</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>In the implementation of this interface, we just need to convert the byte slice into a string slice by converting it to a <code>string</code> (Postgres representation of array value) first, and then to <code>StringSlice</code></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="p">[]</span><span class="kt">uint8</span> <span class="o">--</span><span class="p">&gt;</span> <span class="p">{</span><span class="nx">home</span><span class="p">,</span><span class="nx">delegate</span><span class="p">}</span> <span class="o">--</span><span class="p">&gt;</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="s">&quot;home&quot;</span><span class="p">,</span> <span class="s">&quot;delegate&quot;</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>After successful conversion, we need to assign the converted value to the receiver (<code>*stringSlice</code>)</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="kd">func</span> <span class="p">(</span><span class="nx">stringSlice</span> <span class="o">*</span><span class="nx">StringSlice</span><span class="p">)</span> <span class="nx">Scan</span><span class="p">(</span><span class="nx">src</span> <span class="kd">interface</span><span class="p">{})</span> <span class="kt">error</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">val</span><span class="p">,</span> <span class="nx">ok</span> <span class="o">:=</span> <span class="nx">src</span><span class="p">.([]</span><span class="kt">byte</span><span class="p">)</span>
</span><span class="line">  <span class="k">if</span> <span class="p">!</span><span class="nx">ok</span> <span class="p">{</span>
</span><span class="line">    <span class="k">return</span> <span class="nx">fmt</span><span class="p">.</span><span class="nx">Errorf</span><span class="p">(</span><span class="s">&quot;unable to scan&quot;</span><span class="p">)</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="nx">value</span> <span class="o">:=</span> <span class="nx">strings</span><span class="p">.</span><span class="nx">TrimPrefix</span><span class="p">(</span><span class="nb">string</span><span class="p">(</span><span class="nx">val</span><span class="p">),</span> <span class="s">&quot;{&quot;</span><span class="p">)</span>
</span><span class="line">  <span class="nx">value</span> <span class="p">=</span> <span class="nx">strings</span><span class="p">.</span><span class="nx">TrimSuffix</span><span class="p">(</span><span class="nx">value</span><span class="p">,</span> <span class="s">&quot;}&quot;</span><span class="p">)</span>
</span><span class="line">
</span><span class="line">  <span class="o">*</span><span class="nx">stringSlice</span> <span class="p">=</span> <span class="nx">strings</span><span class="p">.</span><span class="nx">Split</span><span class="p">(</span><span class="nx">value</span><span class="p">,</span> <span class="s">&quot;,&quot;</span><span class="p">)</span>
</span><span class="line">
</span><span class="line">  <span class="k">return</span> <span class="kc">nil</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>That’s it. If we run the program now, we can see the output as expected. </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line"><span class="o">[{</span>2 schedule meeting with the team <span class="nb">false</span> <span class="o">[</span>project-x<span class="o">]}</span>
</span><span class="line">  <span class="o">{</span>3 prepare <span class="k">for </span>client demo <span class="nb">false</span> <span class="o">[</span>slides project-x<span class="o">]}]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h2 id="summary">Summary</h2>

<p>In this blog post, we have seen how we can make use of <code>Valuer</code> and <code>Scanner</code> interfaces in golang to marshal and unmarshal our custom data type from the database. </p>

<p>The source code can be found in <a href="https://github.com/tamizhvendan/igo2">my GitHub repository</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Leveraging interfaces in golang - Part 1]]></title>
    <link href="http://blog.tamizhvendan.in/blog/2017/06/24/leveraging-interfaces-in-golang-part-1/"/>
    <updated>2017-06-24T13:38:16+05:30</updated>
    <id>http://blog.tamizhvendan.in/blog/2017/06/24/leveraging-interfaces-in-golang-part-1</id>
    <content type="html"><![CDATA[<p>In my previous blog post <a href="http://blog.tamizhvendan.in/blog/2017/05/01/using-golang-in-production-my-experiences/">on using golang in production</a>, I have mentioned that <a href="https://gobyexample.com/interfaces">interfaces</a> are my favorite feature in golang. </p>

<p>As a follow-up of this comment, I would like to share how we are using (my current project is also in golang!) the interfaces to keep our code clean and consistent through a series of three blog posts</p>

<p>This blog post series assumes that you are familiar with the basics of interfaces in golang. If would like to know what it brings to the table, I strongly recommend to check out <a href="https://hackernoon.com/why-i-like-gos-interfaces-2891adf2803c">this well-written article</a> by <a href="https://twitter.com/theburningmonk">Yan Cui</a>.</p>

<p>Let me start the series with a solution that we have implemented a few days back. </p>

<h2 id="some-context">Some Context</h2>

<p>The product that we are building consists of a suite of web applications. To authenticate the users, these web applications talk to a centralized web application called “Identity Server”. </p>

<p>Upon receiving valid login credentials, the Identity Server generates <a href="https://jwt.io/introduction/">a JSON Web Token</a>(JWT) with the corresponding user claims and signs it using a public/private key pair using RSA. </p>

<p>The downstream web applications will then use this JWT to grant the access to their corresponding protected resources. </p>

<p>Let’s assume a simple JWT claims payload</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="json"><span class="line"><span class="p">{</span>
</span><span class="line">  <span class="nt">&quot;sub&quot;</span><span class="p">:</span> <span class="s2">&quot;1234567890&quot;</span><span class="p">,</span>
</span><span class="line">  <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;John D&quot;</span><span class="p">,</span>
</span><span class="line">  <span class="nt">&quot;admin&quot;</span><span class="p">:</span> <span class="kc">true</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The above payload uses one of the <a href="https://tools.ietf.org/html/rfc7519#section-4.1">JWT standard claims</a>, <code>sub</code>, to communicate the unique identifier of the user in the product for all the web applications. The <code>name</code> and <code>admin</code> are the custom claims. </p>

<p>As per the JWT spec, <a href="https://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#subDef">the sub claim</a> is a case-sensitive string containing a StringOrURI value which is locally unique in the context of the issuer or be globally unique, but in our system, the unique identifier of a user is an unsigned integer(uint) type. </p>

<p>As we will be sharing the JWT with other third party applications, we made a call to stick to the JWT spec and converted the uint to string type while generating the token and did the reverse while authenticating the user using this token.</p>

<blockquote>
  <p><em>Update</em> - After writing this blog post, I came to know from <a href="http://disq.us/p/1kcwwkh">the comment</a> that the use case of this blog post, unmarshalling a JSON string to <code>uint</code> type can be done by adding <code>string</code> to the <code>json</code> tag. Being said that, if you’d like to know about how to use an interface to solve it, the rest of the post would help. </p>
</blockquote>

<h2 id="unmarshalling-jwt---a-naive-approach">Unmarshalling JWT - A Naive Approach</h2>

<p>Before witnessing the golang interface in action, let’s see a naive implementation how we can unmarshal the claim and use.</p>

<p>The straightforward thing would be creating a struct matching the properties of the claim </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="kd">type</span> <span class="nx">UserJwt</span> <span class="kd">struct</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">Sub</span>    <span class="kt">string</span>
</span><span class="line">  <span class="nx">Name</span>   <span class="kt">string</span>
</span><span class="line">  <span class="nx">Admin</span>  <span class="kt">bool</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>and unmarshalling using the <a href="https://golang.org/pkg/encoding/json/">json package</a> in golang </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="nx">claims</span> <span class="o">:=</span> <span class="s">`</span>
</span><span class="line"><span class="s">{</span>
</span><span class="line"><span class="s">  &quot;sub&quot;: &quot;1234567890&quot;,</span>
</span><span class="line"><span class="s">  &quot;name&quot;: &quot;John D&quot;,</span>
</span><span class="line"><span class="s">  &quot;admin&quot;: true</span>
</span><span class="line"><span class="s">}`</span>
</span><span class="line">
</span><span class="line"><span class="kd">var</span> <span class="nx">userJwt</span> <span class="o">*</span><span class="nx">UserJwt</span>
</span><span class="line"><span class="nx">err</span> <span class="o">:=</span> <span class="nx">json</span><span class="p">.</span><span class="nx">Unmarshal</span><span class="p">([]</span><span class="nb">byte</span><span class="p">(</span><span class="nx">claims</span><span class="p">),</span> <span class="o">&amp;</span><span class="nx">userJwt</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>To convert the <code>sub</code> from <code>string</code> to <code>uint</code>, we can have a method <code>Id</code> on the <code>UserJwt</code> type.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="kd">func</span> <span class="p">(</span><span class="nx">u</span> <span class="o">*</span><span class="nx">UserJwt</span><span class="p">)</span> <span class="nx">Id</span><span class="p">()</span> <span class="p">(</span><span class="kt">uint</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">v</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">strconv</span><span class="p">.</span><span class="nx">ParseUint</span><span class="p">(</span><span class="nx">u</span><span class="p">.</span><span class="nx">Sub</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="nx">strconv</span><span class="p">.</span><span class="nx">IntSize</span><span class="p">)</span>
</span><span class="line">  <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line">    <span class="k">return</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">err</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="k">return</span> <span class="nb">uint</span><span class="p">(</span><span class="nx">v</span><span class="p">),</span> <span class="kc">nil</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>and use it after successful unmarshalling of the JWT claims. </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="nx">err</span> <span class="o">:=</span> <span class="nx">json</span><span class="p">.</span><span class="nx">Unmarshal</span><span class="p">([]</span><span class="nb">byte</span><span class="p">(</span><span class="nx">claims</span><span class="p">),</span> <span class="o">&amp;</span><span class="nx">userJwt</span><span class="p">)</span>
</span><span class="line"><span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line">  <span class="k">return</span> <span class="nx">err</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line"><span class="nx">id</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">userJwt</span><span class="p">.</span><span class="nx">Id</span><span class="p">()</span>
</span><span class="line"><span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line">  <span class="k">return</span> <span class="nx">err</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line"><span class="c1">// Do something with the id of type uint</span>
</span><span class="line"><span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="nx">id</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>That’s great. But did you see any code smell here?</p>

<p>Let me share what’s wrong with this approach,</p>

<p>Let’s say that we have the following JSON claim with <code>sub</code> has the value <code>user/john</code> instead of a string representing the unsigned integer identifier of the user.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="nx">claims</span> <span class="o">:=</span> <span class="s">`</span>
</span><span class="line"><span class="s">{</span>
</span><span class="line"><span class="s">  &quot;sub&quot;: &quot;user/john&quot;,</span>
</span><span class="line"><span class="s">  &quot;name&quot;: &quot;John D&quot;,</span>
</span><span class="line"><span class="s">  &quot;admin&quot;: true</span>
</span><span class="line"><span class="s">}`</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Unmarshalling this claim will work, and it won’t return any error</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="nx">err</span> <span class="o">:=</span> <span class="nx">json</span><span class="p">.</span><span class="nx">Unmarshal</span><span class="p">([]</span><span class="nb">byte</span><span class="p">(</span><span class="nx">claims</span><span class="p">),</span> <span class="o">&amp;</span><span class="nx">userJwt</span><span class="p">)</span>
</span><span class="line"><span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line">  <span class="k">return</span> <span class="nx">err</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>We can share the unmarshalled <code>userJwt</code> with the rest of the code to carry the business logic. </p>

<p>We will come to know that the claim has an invalid <code>sub</code> value only when we try to get the id of the user by calling the <code>Id</code> method</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="nx">id</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">userJwt</span><span class="p">.</span><span class="nx">Id</span><span class="p">()</span>
</span><span class="line"><span class="c1">// This will return the following error</span>
</span><span class="line"><span class="c1">// strconv.ParseUint: parsing &quot;name/john&quot;: invalid syntax</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>If we didn’t call the <code>Id</code> method, this subtle bug slip silently into the product and someday will end up as a production issue! </p>

<p>In a nutshell, this approach is not robust, and the resulting code is not clean.</p>

<h2 id="using-interfaces---a-better-approach">Using Interfaces - A better approach</h2>

<p>Ideally, we want the <code>json.Unmarshal</code> function should return an error if the <code>sub</code> doesn’t contain a <code>uint</code> value as string.</p>

<p>To make it happen, we need to inform the <code>json.Unmarshal</code> function somehow to do the type conversion while unmarshalling and return an error if the conversion fails. </p>

<p>How to make it happen? </p>

<p>We can do this by using the <a href="https://golang.org/pkg/encoding/json/#Unmarshaler">Unmarshaler</a> interface. </p>

<p>In our case, we can declare the <code>UnmarshalJSON</code> method with the <code>UserJwt</code> type and in the definition, we can do the type conversion. But that’d be an overkill as we need to do the unmarshalling of the other fields, <code>Name</code>, and <code>Admin</code>, which is already working well without any custom logic. </p>

<p>In other words, the effective way would be overriding the JSON unmarshalling behavior of <code>Sub</code> field alone by having the <code>UnmarshalJSON</code> method with <code>uint</code> type. But according to golang’s spec we can’t do it</p>

<blockquote>
  <p>You can only declare a method with a receiver whose type is defined in the same package as the method. You cannot declare a method with a receiver whose type is defined in another package (which includes the built-in types such as int).</p>
</blockquote>

<p>To handle this kind of scenario, we can make use of the <a href="https://golang.org/ref/spec#Type_identity">named types</a> in golang and define a new type called <code>Sub</code> with an underlying type <code>uint</code></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="kd">type</span> <span class="nx">Sub</span> <span class="kt">uint</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Then we can declare the <code>UnmarshalJSON</code> method with this <code>Sub</code> type. </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="kd">func</span> <span class="p">(</span><span class="nx">s</span> <span class="o">*</span><span class="nx">Sub</span><span class="p">)</span> <span class="nx">UnmarshalJSON</span><span class="p">(</span><span class="nx">b</span> <span class="p">[]</span><span class="kt">byte</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">sub</span> <span class="o">:=</span> <span class="nx">strings</span><span class="p">.</span><span class="nx">Replace</span><span class="p">(</span><span class="nb">string</span><span class="p">(</span><span class="nx">b</span><span class="p">),</span> <span class="s">`&quot;`</span><span class="p">,</span> <span class="s">&quot;&quot;</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
</span><span class="line">  <span class="nx">v</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">strconv</span><span class="p">.</span><span class="nx">ParseUint</span><span class="p">(</span><span class="nx">sub</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="nx">strconv</span><span class="p">.</span><span class="nx">IntSize</span><span class="p">)</span>
</span><span class="line">  <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line">    <span class="k">return</span> <span class="nx">err</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="o">*</span><span class="nx">s</span> <span class="p">=</span> <span class="nx">Sub</span><span class="p">(</span><span class="nb">uint</span><span class="p">(</span><span class="nx">v</span><span class="p">))</span>
</span><span class="line">  <span class="k">return</span> <span class="kc">nil</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<blockquote>
  <p>Using the <code>Replace</code> function, we are getting rid of the double quotes in the actual JSON encoded value </p>
</blockquote>

<p>With this new <code>Sub</code> type in place, We can rewrite the <code>UserJwt</code> by replacing the <code>Sub</code> field with the <code>Id</code> field of type <code>Sub</code>.  </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="kd">type</span> <span class="nx">UserJwt</span> <span class="kd">struct</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">Id</span>    <span class="nx">Sub</span> <span class="s">`json:&quot;sub&quot;`</span>
</span><span class="line">  <span class="nx">Name</span>  <span class="kt">string</span>
</span><span class="line">  <span class="nx">Admin</span> <span class="kt">bool</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<blockquote>
  <p>The <code>json</code> tag with the value <code>"sub"</code> is required to map the <code>sub</code> key in the JSON claim with the Id. </p>
</blockquote>

<p>Now if we try to unmarshal the invalid claim, the <code>json.Unmarshal</code> function will return an error</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="nx">claims</span> <span class="o">:=</span> <span class="s">`</span>
</span><span class="line"><span class="s">{</span>
</span><span class="line"><span class="s">  &quot;sub&quot;: &quot;user/john&quot;,</span>
</span><span class="line"><span class="s">  &quot;name&quot;: &quot;John D&quot;,</span>
</span><span class="line"><span class="s">  &quot;admin&quot;: true</span>
</span><span class="line"><span class="s">}`</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">userJwt</span> <span class="o">*</span><span class="nx">UserJwt</span>
</span><span class="line"><span class="nx">err</span> <span class="o">:=</span> <span class="nx">json</span><span class="p">.</span><span class="nx">Unmarshal</span><span class="p">([]</span><span class="nb">byte</span><span class="p">(</span><span class="nx">claims</span><span class="p">),</span> <span class="o">&amp;</span><span class="nx">userJwt</span><span class="p">)</span>
</span><span class="line"><span class="c1">// This will return the following error</span>
</span><span class="line"><span class="c1">// strconv.ParseUint: parsing &quot;name/john&quot;: invalid syntax</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>For a valid claim, we can now get the <code>Id</code> directly from the <code>UserJwt</code> <code>Id</code> field.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="nx">claims</span> <span class="o">:=</span> <span class="s">`</span>
</span><span class="line"><span class="s">{</span>
</span><span class="line"><span class="s">  &quot;sub&quot;: &quot;1234567890&quot;,</span>
</span><span class="line"><span class="s">  &quot;name&quot;: &quot;John D&quot;,</span>
</span><span class="line"><span class="s">  &quot;admin&quot;: true</span>
</span><span class="line"><span class="s">}`</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">userJwt</span> <span class="o">*</span><span class="nx">UserJwt</span>
</span><span class="line"><span class="nx">err</span> <span class="o">:=</span> <span class="nx">json</span><span class="p">.</span><span class="nx">Unmarshal</span><span class="p">([]</span><span class="nb">byte</span><span class="p">(</span><span class="nx">claims</span><span class="p">),</span> <span class="o">&amp;</span><span class="nx">userJwt</span><span class="p">)</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="nx">userJwt</span><span class="p">.</span><span class="nx">Id</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>That’s it! The code is in better shape now :)</p>

<h2 id="summary">Summary</h2>

<p>In this blog post, we have seen how we can write cleaner code by leveraging the interfaces. The source code is available in <a href="https://github.com/tamizhvendan/igo1">my GitHub repository</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Using Golang in Production - My Experiences]]></title>
    <link href="http://blog.tamizhvendan.in/blog/2017/05/01/using-golang-in-production-my-experiences/"/>
    <updated>2017-05-01T07:50:32+05:30</updated>
    <id>http://blog.tamizhvendan.in/blog/2017/05/01/using-golang-in-production-my-experiences</id>
    <content type="html"><![CDATA[<p>For the last one year, I was working with the development team of a leading media entertainment company in India and developed a cloud platform to distribute the <a href="https://en.wikipedia.org/wiki/Digital_Cinema_Package">DCPs</a> across the globe in a uniform, scalable and cost-effective manner.</p>

<p>We built the entire platform using <a href="https://golang.org/">golang</a> and <a href="https://www.nginx.com/blog/event-driven-data-management-microservices/">event-driven microservices architecture</a>. It was an exciting journey, and this blog post summarizes my experiences of using golang in this project.</p>

<h2 id="the-learning-curve">The Learning Curve</h2>

<p>Golang is <a href="https://www.youtube.com/watch?v=rFejpH_tAHM">a simple language</a> to learn. Any developer who has some good experience in any programming language can pick it in a month. It took me two weeks to understand the language. </p>

<p>I’ve also learned a lot from the code review comments from the other developers of my team who are already familiar with the language. </p>

<p>The official golang site has done an excellent job in coming up two important learning resources for the beginners.</p>

<ul>
  <li><a href="https://tour.golang.org">A Tour of Go</a> - Through a series of in-browser hands-on tutorials you can get a good feel of the language in few hours. </li>
  <li><a href="https://golang.org/doc/effective_go.html">Effective Go</a> - It is one the best introduction as well as best practices documentation of a programming language that I have read. Right from package naming convention to how to do state sharing, this documentation will provide all it required to write an idiomatic golang code. </li>
</ul>

<p>In addition to these resources, I recommend the <a href="https://golang.org/doc/faq">Golang FAQs</a> and the <a href="https://gobyexample.com/">GoByExample</a> for the beginners. </p>

<h2 id="go-routines-channels-and-select">Go Routines, Channels and Select</h2>

<p>In my perspective, go routines, channels and select are the sweet spots of golang. These <a href="https://talks.golang.org/2015/simplicity-is-complicated.slide#21">abstractions</a> are elegant and enable you to write concurrent programs without any hassles.</p>

<p>We have made substantial use of golang concurrency whenever it made sense, and the benefits were incredible. The blog post on <a href="https://blog.golang.org/pipelines">Go Concurrency Patterns</a> is an excellent read to get a feel of it.</p>

<h2 id="interfaces-in-golang">Interfaces in golang</h2>

<p>My favorite feature in golang is its support for <a href="https://gobyexample.com/interfaces">interfaces</a>. </p>

<p>Unlike C# or Java, you don’t need to specify the name of the interface when a type implements an interface. Because of this, the package in which the type present, doesn’t need to refer the package in which the interface has been declared.</p>

<p>Yan Cui has written a great <a href="https://hackernoon.com/why-i-like-gos-interfaces-2891adf2803c">blog post</a> about its elegance.</p>

<blockquote>
  <p>The design for Go’s interface stems from the observation that <strong>patterns and abstractions only become apparent after we’ve seen it a few times</strong>. So rather than locking us in with abstractions at the start of a project when we’re at the point of our greatest ignorance, we can define these abstractions as and when they become apparent to us. - <em>Yan Cui</em></p>
</blockquote>

<h2 id="the-go-proverbs">The Go Proverbs</h2>

<p>The <a href="https://go-proverbs.github.io/">Go Proverbs</a> provides a set of principles and guidelines while developing software in golang. </p>

<p>Though certain principles <em>(A little copying is better than a little dependency.)</em> look weird, they have profound meaning behind it. </p>

<p>Like the saying, <em>“You need to spend time crawling alone through shadows to truly appreciate what it is to stand in the sun.”</em>, to appreciate these proverbs you need to spend a decent amount time in developing software in go.</p>

<h2 id="golang-standard-library">Golang Standard Library</h2>

<p>The golang <a href="https://golang.org/pkg/">standard library</a> is futuristic. It has pretty much all that is required for solving the general problems efficiently. </p>

<p>The surprising factor for me is treating <a href="https://golang.org/pkg/encoding/json/">JSON</a> as a first class citizen in the standard library. </p>

<p>Most of the languages rely on an open source library to deal with JSON. Having JSON handling as part of the standard library shows how much thought and care has been put in.</p>

<h2 id="declared-and-not-used-compiler-error">Declared and Not used Compiler Error</h2>

<p>Another good thing that golang got it right is showing compiler errors for unused variables and packages. </p>

<p>The software which we write evolve along with its business requirements. Continuous refactoring, feature addition or deletion, changing the architecture to meet the new demands are some the stuff that we do during the evolution of the software. During these activities often we miss removing the unused code and the packages that we were using before.</p>

<p>Through this compiler error, golang forces the developer to write better code. The biggest advantage is while reading the code written by someone, you can be sure that the variables and the packages are always being used.</p>

<p>Also removing unused packages results in smaller binary size.</p>

<h2 id="go-command-command-line-interface-and-go-tools">go Command (Command Line Interface) and go tools</h2>

<p>The <a href="https://golang.org/cmd/go/">go command</a> is an another well thought out feature in golang which comes by default with the installation. </p>

<p>Using <code>go command</code>, you can compile &amp; build the code, download and install external packages, run the tests and lot more without relying on any other external tools. The <code>go test</code> command is incredibly fast and it made our job easier while doing Test-Driven development. </p>

<p>The <a href="https://golang.org/cmd/gofmt/">gofmt</a> command enabled our team to follow a consistent formatting of golang source files. Thanks to this awesome tool we hardly had code review comments on the format of the code.</p>

<p>The <a href="https://godoc.org/golang.org/x/tools">golang tools</a>, especially <a href="https://godoc.org/golang.org/x/tools/cmd/goimports">goimports</a> and <a href="https://godoc.org/golang.org/x/tools/cmd/gorename">gorename</a> has been extremely useful </p>

<h2 id="go-install-and-single-executable-binary">go install and Single executable binary</h2>

<p>The command which I loved the most in golang is the <code>go install</code> command. It takes care of compiling the code and produces a stand alone executable binary. Due to caching of intermediary packages, it builds the executable binary incredibly fast.</p>

<p>To run this resulted binary file, we don’t have to install anything on the target machine <em>(Like JVM, .NET)</em>.</p>

<p>It enabled us to share the microservice as an executable file with the other team members to create <a href="http://www.extremeprogramming.org/rules/spike.html">spikes</a>, develop and locally test other dependent microservices. </p>

<blockquote>
  <p>Just like bundling the front-end assets into single javascript file and serving them via CDNs, we can even do continuous deployment of golang codebase by serving the binaries from a content provider like Amazon S3, if it makes sense!</p>
</blockquote>

<p>We can also do <a href="https://dave.cheney.net/2015/08/22/cross-compilation-with-go-1-5">cross-compilation</a> of your golang code for different OSes and Architectures using <code>go build</code> command. </p>

<h2 id="open-source-libraries-in-golang">Open Source Libraries in golang</h2>

<p>Golang has a thriving open source community, and it houses a vast collection of <a href="https://github.com/avelino/awesome-go">open source libraries and frameworks</a>. Here is the list of some of the things that we have used heavily</p>

<ul>
  <li><a href="https://github.com/streadway/amqp">AMQP</a> - To interact with RabbitMQ</li>
  <li><a href="https://github.com/jinzhu/gorm">GORM</a> - To perform database operations in PostgreSQL</li>
  <li><a href="https://github.com/satori/go.uuid">go-uuid</a> - To generate and use UUIDs</li>
  <li><a href="https://github.com/mattes/migrate">migrate</a> - For database migrations</li>
  <li><a href="https://github.com/kelseyhightower/envconfig">envconfig</a> - For managing configuration data from environment variables</li>
  <li><a href="https://github.com/urfave/negroni">negroni</a> - To write HTTP middlewares</li>
  <li><a href="http://github.com/julienschmidt/httprouter">httprouter</a> - For handling HTTP routes. We have used this along with golang’s <a href="https://golang.org/doc/articles/wiki/">standard HTTP handlers</a> </li>
  <li><a href="http://github.com/sirupsen/logrus">logrus</a> - Simple and powerful library for logging</li>
  <li><a href="https://github.com/stretchr/testify">testify</a> - For unit test assertions</li>
</ul>

<p>For most of the common things that you’d like to do in your project, you can always find an off the shelf open source library</p>

<h2 id="private-methods-functions-and-struct-fields">Private methods, functions and struct fields</h2>

<p>I was admired when I came to know that just by using <a href="https://golang.org/ref/spec#Exported_identifiers">a naming convention</a>, I can specify public and private methods, functions and struct fields. </p>

<p>It is a smart feature in the language. If you want to expose them as public, start with an upper case letter and start with a lower case letter if you want to them to be used only inside a package or a struct. </p>

<h2 id="not-so-good-features-in-golang">Not So Good Features in Golang</h2>

<p>So far in this blog post, I’ve shared the features that I liked very much in golang. In the rest of the post, I am about to share the not so good features in golang. The heading was intentionally started with “Not So Good” as the things that I am about to share are not bad ones according to the golang language design principles and the go proverbs that we have seen earlier.</p>

<p>IMHO there is no perfect programming language, and there is no silver bullet. All languages shine in certain areas and not so good in some other areas. At the end of the day, a programming language is just a tool which we use to solve the business problems. We need to pick an appropriate language that solves the problem in hand. </p>

<blockquote>
  <p>Disclaimer: The intention of this blog post is to share my experiences and provide honest feedback to the people who is evaluating golang. </p>
</blockquote>

<h2 id="the-golang-way-of-handling-errors">The Golang way of handling errors</h2>

<p>The imperative way of handling errors is one of the <a href="http://stackoverflow.com/questions/18771569/avoid-checking-if-error-is-nil-repetition">common complaint raised</a> by many people.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
</pre></td><td class="code"><pre><code class="go"><span class="line"><span class="nx">_</span><span class="p">,</span> <span class="nx">err</span> <span class="p">=</span> <span class="nx">foobar1</span><span class="p">()</span>
</span><span class="line"><span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line"> <span class="k">return</span> <span class="nx">err</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line"><span class="nx">_</span><span class="p">,</span> <span class="nx">err</span> <span class="p">=</span> <span class="nx">foobar2</span><span class="p">()</span>
</span><span class="line"><span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line"> <span class="k">return</span> <span class="nx">err</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line"><span class="nx">_</span><span class="p">,</span> <span class="nx">err</span> <span class="p">=</span> <span class="nx">foobar3</span><span class="p">()</span>
</span><span class="line"><span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class="line"> <span class="k">return</span> <span class="nx">err</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line"><span class="c1">// and so on</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Rob Pike addresses this concern in a detailed blog post, <a href="https://blog.golang.org/errors-are-values">Errors are values</a> and quotes a pattern using <code>errWriter</code> to avoid the repetition. It is a good design and elegantly wraps the <code>nil</code> check on the <code>error</code>. The downside of this approach is we need to write an extra wrapper for every new type to get rid of the repetitiveness. The wrapper approach may get complex if the <code>foobar1</code>, <code>foobar2</code>, and <code>foobar3</code> are addressing different concerns. </p>

<p>For people who is coming from typed functional programming languages (F#, Haskell, Scala) background, like me, this may look little awkward to write it in this way. There is a <a href="https://github.com/golang/go/issues/19991">proposal</a> to include Result type in golang but I feel it may not be incorporated.</p>

<h2 id="treating-nil-as-value">Treating nil as value</h2>

<p>While other languages are moving away from dealing with null values and replacing it with option types, golang is taking a backward step by treating <code>nil</code> (equivalent for <code>null</code> in Go) as a valid value. So we need to be cautious while using the nil value. Lack of discipline may result in runtime exceptions (panic in go vocabulary)</p>

<p>This problem can be avoided to some degree by having a function/method to return two values, the actual value to be returned and the error, and ensuring that the actual value will never be <code>nil</code>, if the error is <code>nil</code> and vice versa. Unfortunately, this approach leads to the repetition concern that we just saw.</p>

<h2 id="absence-of-generics">Absence of generics</h2>

<p>This also an another typical critic in golang. There is an answer of for this question in <a href="https://golang.org/doc/faq#generics">golang FAQ</a> saying, it is in the pipeline but my opinion is it may not be in the near future.</p>

<p>There are some workarounds like using <a href="https://tour.golang.org/methods/14">an empty interface</a> and casting it to appropriate types using <a href="https://tour.golang.org/methods/15">type assertion</a>. </p>

<p>The real concern is trying to do map, filter, reduce operations over collections. Again there are workarounds by using <a href="http://bouk.co/blog/idiomatic-generics-in-go/">templating and reflection</a>, but it has its own cost (performance and boilerplate code). After fiddling around with different options, We went back to the classic way of iterating through <code>for loop</code>.</p>

<h2 id="mutable-variables-and-imperative-coding">Mutable variables and imperative coding</h2>

<p>For developers who is coming from the functional programming background, the mutable variables and imperative way of writing code are speed breakers in the golang journey.</p>

<p>Though golang has some <a href="https://golang.org/doc/codewalk/functions/">good support</a> for doing functional programming, the presence of mutable variables and imperative way doing certain things, hinder the progress.</p>

<h2 id="summary">Summary</h2>

<p>Apart from these few concerns, I’ve liked golang and enjoyed using it.</p>

<p>The language design principles of golang are my important takeaways. I strongly recommend watching the <a href="http://go-lang.cat-v.org/talks/">talks of Rob Pike</a> on golang design; even you are not going to use golang.</p>

<p>I’d consider using golang in an another project in future for sure if it is an appropriate language for the problem at hand.</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Implementing Two-Factor Authentication in Suave]]></title>
    <link href="http://blog.tamizhvendan.in/blog/2016/12/26/implementing-two-factor-authentication-in-suave/"/>
    <updated>2016-12-26T18:34:27+05:30</updated>
    <id>http://blog.tamizhvendan.in/blog/2016/12/26/implementing-two-factor-authentication-in-suave</id>
    <content type="html"><![CDATA[<p>Two-factor authentication is a type of <a href="https://en.wikipedia.org/wiki/Multi-factor_authentication">Multi-factor authentication</a> which adds an extra layer of security to the applications.</p>

<p><a href="https://en.wikipedia.org/wiki/Google_Authenticator">Google Authenticator</a> is one of the popular application that implements two-factor authentication services. In this blog post, we are going to learn how to implement Two-factor authentication in web applications developed using <a href="https://suave.io">suave</a></p>

<p>The idea presented here is a naive implementation of Two-factor authentication. The objective here is to demonstrate how to implement it in a functional programming language, F#. Things like TLS/HTTPS, preventing CSRF and other attacks are ignored for brevity. </p>

<blockquote>
  <p>This blog post is a part of <a href="https://sergeytihon.wordpress.com/2016/10/23/f-advent-calendar-in-english-2016/">fsharp advent calendar 2016</a>. </p>
</blockquote>

<h2 id="prerequisite">Prerequisite</h2>

<p>This blog post assumes that you are familiar with the concept of Two-factor authentication and Google Authenticator. </p>

<p>If you would like to know more about these, check out the below resources to get a picture of what it is all about.</p>

<ul>
  <li><a href="https://www.google.com/landing/2step">Two-step verification</a> by Google </li>
  <li><a href="https://garbagecollected.org/2014/09/14/how-google-authenticator-works/">How Google Authenticator works</a></li>
  <li><a href="https://security.stackexchange.com/questions/35157/how-does-google-authenticator-work">A Stack-Overflow Question</a></li>
</ul>

<p>We are going to use <a href="https://en.wikipedia.org/wiki/Time-based_One-time_Password_Algorithm">Time-based One-time Password(TOTP)</a> algorithm in this blog post</p>

<h2 id="what-we-will-be-building">What we will be building</h2>

<p>We are going to build a tiny web appliaction that has an inbuilt user account with the username <code>foo</code> and the password <code>bar</code></p>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/suave_two_factor/Login.png" width="300" height="200" /></p>

<p>After successful login, the user redirected to the <strong>Profile</strong> page where the user sees his name with a couple of buttons. One to enable <em>Two-factor authentication</em> and another one to <em>log out</em></p>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/suave_two_factor/Profile.png" width="350" height="200" /></p>

<p>Upon clicking the <em>Enable Two Factor Authentication</em> button, the user redirected to the <strong>Enable Two Factor Authentication</strong> page where the user has to scan the QR Code with the Google Authenticator App (For <a href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&amp;hl=en">Android</a> or <a href="https://itunes.apple.com/in/app/google-authenticator/id388497605?mt=8">iPhone</a>). Then he needs to enter the verification code to enable Two-factor authentication for his account. </p>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/suave_two_factor/Enable_Two_Factor.png" width="450" height="250" /></p>

<p><em>Google Authenticator App</em></p>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/suave_two_factor/Google_Authenticator.png" width="200" height="400" /></p>

<p>If the verification code matches, the updated <strong>Profile</strong> page will look like </p>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/suave_two_factor/Profile_After_Two_Factor.png" width="350" height="200" /></p>

<p>Now if the user logout and login again, he will be prompted to enter the verification code </p>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/suave_two_factor/Auth_Code_Prompt.png" width="250" height="150" /></p>

<p>After entering the verification code from the Google Authenticator, the user will be redirected to his <strong>Profile</strong> page. </p>

<h2 id="getting-started">Getting Started</h2>

<p>Create a new <strong>F# Console Project</strong> with the name <em>Suave.TwoFactorAuth</em> and use Paket to install the following dependencies. </p>

<p><em>paket.dependencies</em></p>

<div class="bogus-wrapper"><notextile><figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class=""><span class="line">nuget FSharp.Core
</span><span class="line">nuget Suave
</span><span class="line">nuget DotLiquid
</span><span class="line">nuget Suave.DotLiquid
</span><span class="line">nuget OtpSharp</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Then reference them in the <em>Suave.TwoFactorAuth</em> project.</p>

<p><em>Suave.TwoFactorAuth/paket.references</em></p>

<div class="bogus-wrapper"><notextile><figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class=""><span class="line">FSharp.Core
</span><span class="line">Suave
</span><span class="line">DotLiquid
</span><span class="line">Suave.DotLiquid
</span><span class="line">OtpSharp</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <a href="https://www.nuget.org/packages/OtpSharp/">OtpSharp</a> is an .NET library that we will be using to generate keys and to verify the verification code from Google Authenticator app using the <a href="https://en.wikipedia.org/wiki/Time-based_One-time_Password_Algorithm">TOTP</a> algorithm.</p>

<p>The reference to <a href="https://www.nuget.org/packages/DotLiquid/">DotLiquid</a> library is required to render the templates using <a href="https://www.nuget.org/packages/Suave.DotLiquid/">Suave.DotLiquid</a></p>

<h2 id="initializing-dotliquid">Initializing DotLiquid</h2>

<p>To use <a href="https://github.com/Shopify/liquid/wiki/Liquid-for-Designers">DotLiquid</a> to render the views in Suave, we need to set the templates directory explicitly. </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// Suave.TwoFactorAuth/Suave.TwoFactorAuth.fs</span>
</span><span class="line"><span class="k">module</span> <span class="nn">Suave.TwoFactorAuth.Main</span>
</span><span class="line">
</span><span class="line"><span class="k">open</span> <span class="nn">Suave</span>
</span><span class="line"><span class="k">open</span> <span class="nn">System.IO</span>
</span><span class="line"><span class="k">open</span> <span class="nn">System.Reflection</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.DotLiquid</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">initializeDotLiquid</span> <span class="bp">()</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">currentDirectory</span> <span class="o">=</span>
</span><span class="line">    <span class="k">let</span> <span class="nv">mainExeFileInfo</span> <span class="o">=</span>
</span><span class="line">      <span class="k">new</span> <span class="n">FileInfo</span><span class="o">(</span><span class="nn">Assembly</span><span class="p">.</span><span class="n">GetEntryAssembly</span><span class="bp">()</span><span class="o">.</span><span class="n">Location</span><span class="o">)</span>
</span><span class="line">    <span class="n">mainExeFileInfo</span><span class="o">.</span><span class="n">Directory</span>
</span><span class="line">  <span class="nn">Path</span><span class="p">.</span><span class="n">Combine</span><span class="o">(</span><span class="n">currentDirectory</span><span class="o">.</span><span class="n">FullName</span><span class="o">,</span> <span class="s">&quot;views&quot;</span><span class="o">)</span>
</span><span class="line">  <span class="o">|&gt;</span> <span class="n">setTemplatesDir</span>
</span><span class="line">
</span><span class="line"><span class="o">[&lt;</span><span class="n">EntryPoint</span><span class="o">&gt;]</span>
</span><span class="line"><span class="k">let</span> <span class="nv">main</span> <span class="n">argv</span> <span class="o">=</span>
</span><span class="line">  <span class="n">initializeDotLiquid</span> <span class="bp">()</span>
</span><span class="line">  <span class="mi">0</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>In this sample application we are going to create a directory <em>views</em>. This <em>views</em> directory will contain the liquid templates of our appliaction</p>

<h2 id="serving-the-login-page">Serving the Login Page</h2>

<p>Let’s start by serving the Login page. </p>

<p>Create a new directory with the name <em>views</em> in the <em>Suave.TwoFactorAuth</em> project and add a new liquid template <em>page.liquid</em>. This <em>page.liquid</em> is the master template for our application</p>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/suave_two_factor/page.png" width="300" height="300" /></p>

<p>After creating, change the ‘Copy to output’ property of the <em>page.liquid</em> file to ‘Copy if newer’ so that the view files copied to the build output directory. </p>

<p>This step is applicable for all the other view templates that we will be creating later</p>

<blockquote>
  <p>If you are using VS Code or atom editor, you need to do this property change manually by opening the <em>Suave.TwoFactorAuth.fsproj</em> file </p>
</blockquote>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
</pre></td><td class="code"><pre><code class="html"><span class="line"><span class="c">&lt;!-- .... --&gt;</span>
</span><span class="line"><span class="nt">&lt;ItemGroup&gt;</span>
</span><span class="line">  <span class="nt">&lt;Folder</span> <span class="na">Include=</span><span class="s">&quot;views\&quot;</span> <span class="nt">/&gt;</span>
</span><span class="line"><span class="nt">&lt;/ItemGroup&gt;</span>
</span><span class="line"><span class="nt">&lt;ItemGroup&gt;</span>
</span><span class="line">  <span class="nt">&lt;None</span> <span class="na">Include=</span><span class="s">&quot;views\page.liquid&quot;</span><span class="nt">&gt;</span>
</span><span class="line">    <span class="nt">&lt;CopyToOutputDirectory&gt;</span>PreserveNewest<span class="nt">&lt;/CopyToOutputDirectory&gt;</span>
</span><span class="line">  <span class="nt">&lt;/None&gt;</span>
</span><span class="line"><span class="nt">&lt;/ItemGroup&gt;</span>
</span><span class="line"><span class="c">&lt;!-- .... --&gt;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Then create a new template file <em>login.liquid</em> in the <em>views</em> directory </p>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/suave_two_factor/login_view.png" width="500" height="300" /></p>

<p>The <em>login.liquid</em> view extends the <em>page.liquid</em> view and fill the placeholders for <code>head</code> and <code>content</code>.</p>

<p>To display the error messages like <em>Password didn’t match</em>, <em>login.liquid</em> view bounded to the model of type <code>string</code>. </p>

<p>Now we have the view template for the login page ready and the next step is to render it upon receiving an HTTP request.</p>

<p>Create a new fsharp source file <em>Login.fs</em> and update it as below</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">module</span> <span class="nn">Suave.TwoFactorAuth.Login</span>
</span><span class="line">
</span><span class="line"><span class="k">open</span> <span class="nn">Suave</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.DotLiquid</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Filters</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Operators</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">loginPath</span> <span class="o">=</span> <span class="s">&quot;/login&quot;</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">renderLoginView</span> <span class="o">(</span><span class="n">request</span> <span class="o">:</span> <span class="n">HttpRequest</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">errMsg</span> <span class="o">=</span>
</span><span class="line">    <span class="k">match</span> <span class="n">request</span><span class="o">.[</span><span class="s">&quot;err&quot;</span><span class="o">]</span> <span class="k">with</span>
</span><span class="line">    <span class="o">|</span> <span class="n">Some</span> <span class="n">msg</span> <span class="o">-&gt;</span> <span class="n">msg</span>
</span><span class="line">    <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="s">&quot;&quot;</span>
</span><span class="line">  <span class="n">page</span> <span class="s">&quot;login.liquid&quot;</span> <span class="n">errMsg</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">loginWebPart</span> <span class="o">=</span>
</span><span class="line">  <span class="n">path</span> <span class="n">loginPath</span> <span class="o">&gt;=&gt;</span> <span class="n">choose</span> <span class="o">[</span>
</span><span class="line">      <span class="n">GET</span> <span class="o">&gt;=&gt;</span> <span class="n">request</span> <span class="n">renderLoginView</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>As a good practice let’s create a new module <code>Web</code> which will be containing all the WebParts of the application</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// Suave.TwoFactorAuth/Suave.Web.fs</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Login</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">app</span> <span class="o">=</span>
</span><span class="line">  <span class="n">choose</span> <span class="o">[</span>
</span><span class="line">    <span class="n">loginWebPart</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Then start the Web Server</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// Suave.TwoFactorAuth/Suave.TwoFactorAuth.fs</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Web</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="k">let</span> <span class="nv">main</span> <span class="n">argv</span> <span class="o">=</span>
</span><span class="line">  <span class="c1">// ...</span>
</span><span class="line">  <span class="n">startWebServer</span> <span class="n">defaultConfig</span> <span class="n">app</span>
</span><span class="line">  <span class="mi">0</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<blockquote>
  <p>Keeping all the Suave WebParts in a single place like we did in the <code>Web.fs</code> file, enable us to host Suave in <a href="https://www.nuget.org/packages/Suave.Azure.Functions">Azure Functions</a> or <a href="https://dusted.codes/running-suave-in-aspnet-core-and-on-top-of-kestrel">Asp.Net Core</a> without doing any significant changes. </p>
</blockquote>

<h2 id="handling-user-login">Handling User Login</h2>

<p>To handle the login request from the user, we need to have some users in the application. Let’s hardcode a user account. </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// Suave.TwoFactorAuth/Suave.TwoFactorAuth.fs</span>
</span><span class="line"><span class="k">module</span> <span class="nn">Suave.TwoFactorAuth.User</span>
</span><span class="line">
</span><span class="line"><span class="k">open</span> <span class="nn">System.Collections.Generic</span>
</span><span class="line">
</span><span class="line"><span class="k">type</span> <span class="nc">User</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">Username</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line">  <span class="n">Password</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">private</span> <span class="n">users</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Dictionary</span><span class="o">&lt;</span><span class="kt">string</span><span class="o">,</span> <span class="n">User</span><span class="o">&gt;</span><span class="bp">()</span>
</span><span class="line">
</span><span class="line"><span class="n">users</span><span class="o">.</span><span class="n">Add</span><span class="o">(</span><span class="s">&quot;foo&quot;</span><span class="o">,</span> <span class="o">{</span><span class="n">Username</span> <span class="o">=</span> <span class="s">&quot;foo&quot;</span><span class="o">;</span> <span class="n">Password</span> <span class="o">=</span> <span class="s">&quot;bar&quot;</span><span class="o">})</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">getUser</span> <span class="n">username</span> <span class="o">=</span>
</span><span class="line">  <span class="k">match</span> <span class="n">users</span><span class="o">.</span><span class="n">TryGetValue</span> <span class="n">username</span> <span class="k">with</span>
</span><span class="line">  <span class="o">|</span> <span class="k">true</span><span class="o">,</span> <span class="n">user</span> <span class="o">-&gt;</span> <span class="n">Some</span> <span class="n">user</span>
</span><span class="line">  <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">None</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Post successful login, to serve the subsequent requests we need to identify the user who logged in. We can achieve it Suave using <code>statefulForSession</code>, which initializes a user state for a browsing session. </p>

<p>Let’s create some helper functions to do this. </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// Suave.TwoFactorAuth/Combinators.fs</span>
</span><span class="line"><span class="k">module</span> <span class="nn">Suave.TwoFactorAuth.Combinators</span>
</span><span class="line">
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.State.CookieStateStore</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Cookie</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Operators</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Authentication</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">sessionSet</span> <span class="n">failureF</span> <span class="n">key</span> <span class="n">value</span> <span class="o">=</span>
</span><span class="line">  <span class="n">statefulForSession</span>
</span><span class="line">  <span class="o">&gt;=&gt;</span> <span class="n">context</span> <span class="o">(</span><span class="k">fun</span> <span class="n">ctx</span> <span class="o">-&gt;</span>
</span><span class="line">                <span class="k">match</span> <span class="nn">HttpContext</span><span class="p">.</span><span class="n">state</span> <span class="n">ctx</span> <span class="k">with</span>
</span><span class="line">                <span class="o">|</span> <span class="n">Some</span> <span class="n">state</span> <span class="o">-&gt;</span> <span class="n">state</span><span class="o">.</span><span class="n">set</span> <span class="n">key</span> <span class="n">value</span>
</span><span class="line">                <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">failureF</span>
</span><span class="line">              <span class="o">)</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">sessionGet</span> <span class="n">failureF</span> <span class="n">key</span> <span class="n">successF</span> <span class="o">=</span>
</span><span class="line">  <span class="n">statefulForSession</span>
</span><span class="line">  <span class="o">&gt;=&gt;</span> <span class="n">context</span> <span class="o">(</span><span class="k">fun</span> <span class="n">ctx</span> <span class="o">-&gt;</span>
</span><span class="line">                <span class="k">match</span> <span class="nn">HttpContext</span><span class="p">.</span><span class="n">state</span> <span class="n">ctx</span> <span class="k">with</span>
</span><span class="line">                <span class="o">|</span> <span class="n">Some</span> <span class="n">store</span> <span class="o">-&gt;</span>
</span><span class="line">                  <span class="k">match</span> <span class="n">store</span><span class="o">.</span><span class="n">get</span> <span class="n">key</span> <span class="k">with</span>
</span><span class="line">                  <span class="o">|</span> <span class="n">Some</span> <span class="n">value</span> <span class="o">-&gt;</span> <span class="n">successF</span> <span class="n">value</span>
</span><span class="line">                  <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">failureF</span>
</span><span class="line">                <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">failureF</span>
</span><span class="line">  <span class="o">)</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">clearSession</span> <span class="o">=</span>
</span><span class="line">  <span class="n">unsetPair</span> <span class="n">SessionAuthCookie</span>
</span><span class="line">    <span class="o">&gt;=&gt;</span> <span class="n">unsetPair</span> <span class="n">StateCookie</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <code>sessionSet</code> function takes a WebPart and a key value pair and tries to persist the value in the session state with the given key. If it fails, it calls the WebPart. </p>

<p>The <code>sessionGet</code> function takes a success WebPart Combinator, a failure WebPart, and a key. If retrieving the value from session state is successful it calls the success WebPart combinator with the retrieved value. In case of retrieval failure it calls the failure WebPart</p>

<p>The <code>clearSession</code> function clears the state. We will be using it while implementing <em>log out</em></p>

<p>Now we have all the building blocks for handling user login request, and it’s time to start its implementation</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
<span class="line-number">32</span>
<span class="line-number">33</span>
<span class="line-number">34</span>
<span class="line-number">35</span>
<span class="line-number">36</span>
<span class="line-number">37</span>
<span class="line-number">38</span>
<span class="line-number">39</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// Suave.TwoFactorAuth/Login.fs</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Redirection</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Authentication</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Cookie</span>
</span><span class="line">
</span><span class="line"><span class="k">open</span> <span class="nn">Combinators</span>
</span><span class="line"><span class="k">open</span> <span class="nn">User</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="k">let</span> <span class="nv">userSessionKey</span> <span class="o">=</span> <span class="s">&quot;loggedUser&quot;</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">redirectToLogin</span> <span class="o">=</span> <span class="k">function</span>
</span><span class="line">  <span class="o">|</span> <span class="n">Some</span> <span class="n">errMsg</span> <span class="o">-&gt;</span> <span class="n">FOUND</span> <span class="o">(</span><span class="n">sprintf</span> <span class="s">&quot;%s?err=%s&quot;</span> <span class="n">loginPath</span> <span class="n">errMsg</span><span class="o">)</span>
</span><span class="line">  <span class="o">|</span> <span class="n">None</span> <span class="o">-&gt;</span> <span class="n">FOUND</span> <span class="n">loginPath</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">loginSucess</span> <span class="n">failureW</span> <span class="n">redirectPath</span> <span class="n">username</span> <span class="o">=</span>
</span><span class="line">  <span class="n">authenticated</span> <span class="nn">Cookie</span><span class="p">.</span><span class="nn">CookieLife</span><span class="p">.</span><span class="n">Session</span> <span class="k">false</span>
</span><span class="line">    <span class="o">&gt;=&gt;</span> <span class="n">sessionSet</span> <span class="n">failureW</span> <span class="n">userSessionKey</span> <span class="n">username</span>
</span><span class="line">    <span class="o">&gt;=&gt;</span> <span class="n">FOUND</span> <span class="n">redirectPath</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">onLogin</span> <span class="n">redirectPath</span> <span class="o">(</span><span class="n">request</span> <span class="o">:</span> <span class="n">HttpRequest</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">  <span class="k">match</span> <span class="n">request</span><span class="o">.[</span><span class="s">&quot;Username&quot;</span><span class="o">],</span> <span class="n">request</span><span class="o">.[</span><span class="s">&quot;Password&quot;</span><span class="o">]</span> <span class="k">with</span>
</span><span class="line">  <span class="o">|</span> <span class="n">Some</span> <span class="n">username</span><span class="o">,</span> <span class="n">Some</span> <span class="n">password</span> <span class="o">-&gt;</span>
</span><span class="line">    <span class="k">match</span> <span class="n">getUser</span> <span class="n">username</span> <span class="k">with</span>
</span><span class="line">    <span class="o">|</span> <span class="n">Some</span> <span class="n">user</span> <span class="o">-&gt;</span>
</span><span class="line">      <span class="k">match</span> <span class="n">user</span><span class="o">.</span><span class="n">Password</span> <span class="o">=</span> <span class="n">password</span> <span class="k">with</span>
</span><span class="line">      <span class="o">|</span> <span class="k">true</span> <span class="o">-&gt;</span> <span class="n">loginSucess</span> <span class="n">never</span> <span class="n">redirectPath</span> <span class="n">username</span>
</span><span class="line">      <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">redirectToLogin</span> <span class="o">(</span><span class="n">Some</span> <span class="s">&quot;Password didn&#39;t match&quot;</span><span class="o">)</span>
</span><span class="line">    <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">redirectToLogin</span> <span class="o">(</span><span class="n">Some</span> <span class="s">&quot;Invalid username&quot;</span><span class="o">)</span>
</span><span class="line">  <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">redirectToLogin</span> <span class="o">(</span><span class="n">Some</span> <span class="s">&quot;Invalid request&quot;</span><span class="o">)</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">secured</span> <span class="n">webpart</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">onFail</span> <span class="o">=</span> <span class="n">redirectToLogin</span> <span class="o">(</span><span class="n">Some</span> <span class="s">&quot;sign-in to access&quot;</span><span class="o">)</span>
</span><span class="line">  <span class="n">sessionGet</span> <span class="n">onFail</span> <span class="n">userSessionKey</span> <span class="n">webpart</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">loginWebPart</span> <span class="n">redirectPath</span> <span class="o">=</span>
</span><span class="line">  <span class="n">path</span> <span class="n">loginPath</span> <span class="o">&gt;=&gt;</span> <span class="n">choose</span> <span class="o">[</span>
</span><span class="line">      <span class="c1">// ...</span>
</span><span class="line">      <span class="n">POST</span> <span class="o">&gt;=&gt;</span> <span class="n">request</span> <span class="o">(</span><span class="n">onLogin</span> <span class="n">redirectPath</span><span class="o">)]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The key function to note here is <code>secured</code> that takes a WebPart. It calls this WebPart only if the user has logged in. If he didn’t the user will be redirected to the Login page</p>

<p>After successful login, we need to redirect the user to his profile page. Let’s create a <code>profile.liquid</code> a view template for the Profile page</p>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/suave_two_factor/profile_view.png" width="600" height="450" /></p>

<p>To render this profile page let’s add some code </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
<span class="line-number">32</span>
<span class="line-number">33</span>
<span class="line-number">34</span>
<span class="line-number">35</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// Suave.TwoFactorAuth/Profile.fs</span>
</span><span class="line"><span class="k">module</span> <span class="nn">Suave.TwoFactorAuth.Profile</span>
</span><span class="line">
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.DotLiquid</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Redirection</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Filters</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Operators</span>
</span><span class="line">
</span><span class="line"><span class="k">open</span> <span class="nn">User</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Login</span>
</span><span class="line">
</span><span class="line"><span class="k">type</span> <span class="nc">ProfileViewModel</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">Username</span><span class="o">:</span> <span class="kt">string</span>
</span><span class="line">  <span class="n">SecretKey</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line">  <span class="n">IsTwoFactorAuthEnabled</span> <span class="o">:</span> <span class="kt">bool</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line"><span class="k">with</span> <span class="k">static</span> <span class="k">member</span> <span class="n">FromUser</span> <span class="n">user</span> <span class="o">=</span>
</span><span class="line">        <span class="o">{</span>
</span><span class="line">          <span class="n">SecretKey</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
</span><span class="line">          <span class="n">IsTwoFactorAuthEnabled</span> <span class="o">=</span> <span class="k">false</span>
</span><span class="line">          <span class="n">Username</span> <span class="o">=</span> <span class="n">user</span><span class="o">.</span><span class="n">Username</span>
</span><span class="line">        <span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">profilePath</span> <span class="o">=</span> <span class="s">&quot;/profile&quot;</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">renderProfile</span> <span class="n">notFoundPath</span> <span class="n">username</span> <span class="o">=</span>
</span><span class="line">  <span class="k">match</span> <span class="n">getUser</span> <span class="n">username</span> <span class="k">with</span>
</span><span class="line">  <span class="o">|</span> <span class="n">Some</span> <span class="n">user</span> <span class="o">-&gt;</span>
</span><span class="line">    <span class="n">user</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="nn">ProfileViewModel</span><span class="p">.</span><span class="n">FromUser</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="n">page</span> <span class="s">&quot;profile.liquid&quot;</span>
</span><span class="line">  <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">FOUND</span> <span class="n">notFoundPath</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">profileWebPart</span> <span class="n">notFoundPath</span> <span class="o">=</span>
</span><span class="line">  <span class="n">path</span> <span class="n">profilePath</span> <span class="o">&gt;=&gt;</span> <span class="n">secured</span> <span class="o">(</span><span class="n">renderProfile</span> <span class="n">notFoundPath</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The labels <code>IsTwoFactorAuthEnabled</code>, <code>SecretKey</code> are just blank right now, and we will be seeing them in action while adding two-factor authentication</p>

<p>The <code>notfound.liquid</code> page that is going to our fancy <code>404</code> page</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
</pre></td><td class="code"><pre><code class="html"><span class="line"><span class="c">&lt;!-- Suave.TwoFactorAuth/views/not_found.liquid --&gt;</span>
</span><span class="line">Not Found :(
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The final step is to put these WebParts together</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// Suave.TwoFactorAuth/Web.fs</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Profile</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.DotLiquid</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Filters</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Operators</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">notFoundPath</span> <span class="o">=</span> <span class="s">&quot;/notfound&quot;</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">app</span> <span class="o">=</span>
</span><span class="line">  <span class="n">choose</span> <span class="o">[</span>
</span><span class="line">    <span class="n">loginWebPart</span> <span class="n">profilePath</span>
</span><span class="line">    <span class="n">profileWebPart</span> <span class="n">notFoundPath</span>
</span><span class="line">    <span class="n">path</span> <span class="n">notFoundPath</span> <span class="o">&gt;=&gt;</span> <span class="n">page</span> <span class="s">&quot;not_found.liquid&quot;</span> <span class="s">&quot;&quot;</span>
</span><span class="line">  <span class="o">]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h2 id="handling-logout">Handling Logout</h2>

<p>Handling logout is a simpler task as we have all the infrastructure already in place. </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// Suave.TwoFactorAuth/Web.fs</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Combinators</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Login</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">app</span> <span class="o">=</span>
</span><span class="line">  <span class="n">choose</span> <span class="o">[</span>
</span><span class="line">    <span class="c1">// ...</span>
</span><span class="line">    <span class="n">path</span> <span class="s">&quot;/logout&quot;</span> <span class="o">&gt;=&gt;</span> <span class="n">clearSession</span> <span class="o">&gt;=&gt;</span> <span class="n">redirectToLogin</span> <span class="n">None</span>
</span><span class="line">  <span class="o">]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h2 id="enabling-two-factor-authentication">Enabling Two-factor Authentication</h2>

<p>To enable Two-factor authentication, we need to change our <code>User</code> domain model first. </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// Suave.TwoFactorAuth/User.fs</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="k">type</span> <span class="nc">TwoFactorAuthentication</span> <span class="o">=</span>
</span><span class="line"><span class="o">|</span> <span class="n">Enabled</span> <span class="k">of</span> <span class="n">SecretKey</span><span class="o">:</span><span class="kt">string</span>
</span><span class="line"><span class="o">|</span> <span class="n">Disabled</span>
</span><span class="line">
</span><span class="line"><span class="k">type</span> <span class="nc">User</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="c1">// ...</span>
</span><span class="line">  <span class="n">TwoFactorAuthentication</span> <span class="o">:</span> <span class="n">TwoFactorAuthentication</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line"><span class="c1">// ... </span>
</span><span class="line"><span class="c1">// Let&#39;s assume TwoFactorAuthentication is disabled by default </span>
</span><span class="line"><span class="n">users</span><span class="o">.</span><span class="n">Add</span><span class="o">(</span><span class="s">&quot;foo&quot;</span><span class="o">,</span> <span class="o">{</span><span class="n">Username</span> <span class="o">=</span> <span class="s">&quot;foo&quot;</span><span class="o">;</span> <span class="n">Password</span> <span class="o">=</span> <span class="s">&quot;bar&quot;</span><span class="o">;</span> <span class="n">TwoFactorAuthentication</span> <span class="o">=</span> <span class="n">Disabled</span><span class="o">})</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="k">let</span> <span class="nv">enableTwoFactorAuth</span> <span class="n">username</span> <span class="n">key</span> <span class="o">=</span>
</span><span class="line">  <span class="k">match</span> <span class="n">getUser</span> <span class="n">username</span> <span class="k">with</span>
</span><span class="line">  <span class="o">|</span> <span class="n">Some</span> <span class="n">user</span> <span class="o">-&gt;</span>
</span><span class="line">    <span class="n">users</span><span class="o">.[</span><span class="n">username</span><span class="o">]</span> <span class="o">&lt;-</span> <span class="o">{</span><span class="n">user</span> <span class="k">with</span> <span class="n">TwoFactorAuthentication</span> <span class="o">=</span> <span class="n">Enabled</span> <span class="n">key</span><span class="o">}</span>
</span><span class="line">  <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="bp">()</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The next step is to define a liquid view template for the <code>enable_two_factor</code> page.</p>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/suave_two_factor/enable_two_factor_view.png" width="600" height="450" /></p>

<p>While enabling the Two-factor authentication, we need to generate a secret key for the user that will be required for both, one-time verification code generation as well as its verification.</p>

<p>So, in the <em>enable_two_factor.liquid</em> template we pass the generated <code>SecretKey</code> as a <code>hidden</code> input which will then be used for the verification of the code. </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="html"><span class="line"><span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;hidden&quot;</span> <span class="na">name=</span><span class="s">&quot;SecretKey&quot;</span> <span class="na">value=</span><span class="s">&quot;&quot;</span><span class="nt">&gt;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Now we need to render the <code>enable_two_factor</code> page in response to the <em>HTTP GET</em> request <code>/enable_two_factor</code></p>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/suave_two_factor/Enable_Two_Factor.png" width="450" height="250" /></p>

<p>Let’s create a new module <code>GoogleAuthenticator</code> to put the Two-factor authentication related functions together</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
<span class="line-number">32</span>
<span class="line-number">33</span>
<span class="line-number">34</span>
<span class="line-number">35</span>
<span class="line-number">36</span>
<span class="line-number">37</span>
<span class="line-number">38</span>
<span class="line-number">39</span>
<span class="line-number">40</span>
<span class="line-number">41</span>
<span class="line-number">42</span>
<span class="line-number">43</span>
<span class="line-number">44</span>
<span class="line-number">45</span>
<span class="line-number">46</span>
<span class="line-number">47</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// Suave.TwoFactorAuth/GoogleAuthenticator.fs</span>
</span><span class="line"><span class="k">module</span> <span class="nn">Suave.TwoFactorAuth.GoogleAuthenticator</span>
</span><span class="line">
</span><span class="line"><span class="k">open</span> <span class="nn">Suave</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Filters</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Operators</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.DotLiquid</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Redirection</span>
</span><span class="line"><span class="k">open</span> <span class="nn">OtpSharp</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Base32</span>
</span><span class="line">
</span><span class="line"><span class="k">open</span> <span class="nn">Login</span>
</span><span class="line"><span class="k">open</span> <span class="nn">User</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">enableTwoFactorAuthPath</span> <span class="o">=</span> <span class="s">&quot;/enable_two_factor&quot;</span>
</span><span class="line">
</span><span class="line"><span class="k">type</span> <span class="nc">EnableTwoFactorViewModel</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">Key</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line">  <span class="n">Url</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line">  <span class="n">Err</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line"><span class="k">with</span> <span class="k">static</span> <span class="k">member</span> <span class="n">From</span> <span class="n">username</span> <span class="n">err</span> <span class="o">=</span>
</span><span class="line">      <span class="k">let</span> <span class="nv">secretKey</span> <span class="o">=</span> <span class="nn">KeyGeneration</span><span class="p">.</span><span class="n">GenerateRandomKey</span><span class="o">(</span><span class="mi">20</span><span class="o">)</span>
</span><span class="line">      <span class="k">let</span> <span class="nv">appName</span> <span class="o">=</span> <span class="s">&quot;SuaveRocks&quot;</span>
</span><span class="line">      <span class="k">let</span> <span class="nv">label</span> <span class="o">=</span> <span class="n">sprintf</span> <span class="s">&quot;%s (%s.com/%s)&quot;</span> <span class="n">appName</span> <span class="n">appName</span> <span class="n">username</span>
</span><span class="line">      <span class="k">let</span> <span class="nv">keyUrl</span> <span class="o">=</span> <span class="nn">KeyUrl</span><span class="p">.</span><span class="n">GetTotpUrl</span><span class="o">(</span><span class="n">secretKey</span><span class="o">,</span> <span class="n">label</span><span class="o">)</span>
</span><span class="line">      <span class="o">{</span> <span class="n">Url</span> <span class="o">=</span> <span class="n">sprintf</span> <span class="s">&quot;https://qrcode.kaywa.com/img.php?s=4&amp;d=%s&amp;issuer=%s&quot;</span> <span class="n">keyUrl</span> <span class="n">appName</span>
</span><span class="line">        <span class="n">Key</span> <span class="o">=</span> <span class="nn">Base32Encoder</span><span class="p">.</span><span class="n">Encode</span><span class="o">(</span><span class="n">secretKey</span><span class="o">)</span>
</span><span class="line">        <span class="n">Err</span> <span class="o">=</span> <span class="n">err</span><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">renderEnableTwoFactorAuthView</span> <span class="n">notFoundPath</span> <span class="n">username</span> <span class="n">ctx</span> <span class="o">=</span> <span class="n">async</span> <span class="o">{</span>
</span><span class="line">  <span class="k">match</span> <span class="n">getUser</span> <span class="n">username</span> <span class="k">with</span>
</span><span class="line">  <span class="o">|</span> <span class="n">Some</span> <span class="n">user</span> <span class="o">-&gt;</span>
</span><span class="line">    <span class="k">let</span> <span class="nv">err</span> <span class="o">=</span>
</span><span class="line">      <span class="k">match</span> <span class="n">ctx</span><span class="o">.</span><span class="n">request</span><span class="o">.[</span><span class="s">&quot;err&quot;</span><span class="o">]</span> <span class="k">with</span>
</span><span class="line">      <span class="o">|</span> <span class="n">Some</span> <span class="n">err</span> <span class="o">-&gt;</span> <span class="n">err</span>
</span><span class="line">      <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="s">&quot;&quot;</span>
</span><span class="line">    <span class="k">let</span> <span class="nv">vm</span> <span class="o">=</span> <span class="nn">EnableTwoFactorViewModel</span><span class="p">.</span><span class="n">From</span> <span class="n">username</span> <span class="n">err</span>
</span><span class="line">    <span class="k">return</span><span class="o">!</span> <span class="n">page</span> <span class="s">&quot;enable_two_factor.liquid&quot;</span> <span class="n">vm</span> <span class="n">ctx</span>
</span><span class="line">  <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="k">return</span><span class="o">!</span> <span class="n">redirect</span> <span class="n">notFoundPath</span> <span class="n">ctx</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">googleAuthenticatorWebPart</span> <span class="n">notFoundPath</span> <span class="o">=</span>
</span><span class="line">  <span class="n">choose</span> <span class="o">[</span>
</span><span class="line">    <span class="n">path</span> <span class="n">enableTwoFactorAuthPath</span> <span class="o">&gt;=&gt;</span> <span class="n">choose</span> <span class="o">[</span>
</span><span class="line">      <span class="n">GET</span> <span class="o">&gt;=&gt;</span> <span class="n">secured</span> <span class="o">(</span><span class="n">renderEnableTwoFactorAuthView</span> <span class="n">notFoundPath</span><span class="o">)</span>
</span><span class="line">    <span class="o">]]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>As we did in the login page, we are using the <code>err</code> query string in the request to pass the verification code mismatch errors. </p>

<p>We are leveraging the <code>OtpSharp</code> library to generate the URL that is in turn represented as a QR Code. </p>

<blockquote>
  <p>If you would like to how Google Authenticator interprets the generated key and the issuer name from the URL embedded in the QR Code, check out the <a href="https://github.com/google/google-authenticator/wiki/Key-Uri-Format">UriFormat</a> documentation. </p>
</blockquote>

<p>The last step in rendering this page is adding the <code>googleAuthenticatorWebPart</code> in the <code>Web</code> module where we are putting all the WebParts together</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// Suave.TwoFactorAuth/Web.fs</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="k">open</span> <span class="nn">GoogleAuthenticator</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">app</span> <span class="o">=</span>
</span><span class="line">  <span class="n">choose</span> <span class="o">[</span>
</span><span class="line">    <span class="c1">// ...</span>
</span><span class="line">    <span class="n">googleAuthenticatorWebPart</span> <span class="n">notFoundPath</span>
</span><span class="line">  <span class="o">]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>While enabling Two-factor authentication, the user has to scan the QR-Code from his <em>Google Authenticator</em> app and he will be getting a one-time verification code like this upon adding</p>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/suave_two_factor/Google_Authenticator.png" width="200" height="400" /></p>

<p>Then he will be entering this in the <code>enable_two_factor</code> page and click <code>Enable</code>.</p>

<p>Let’s handle this <em>POST</em> request. </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// Suave.TwoFactorAuth/GoogleAuthenticator.fs</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="k">let</span> <span class="nv">verifyOtp</span> <span class="n">secretKey</span> <span class="n">code</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">otp</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Totp</span><span class="o">(</span><span class="nn">Base32Encoder</span><span class="p">.</span><span class="n">Decode</span> <span class="n">secretKey</span><span class="o">)</span>
</span><span class="line">  <span class="n">otp</span><span class="o">.</span><span class="n">VerifyTotp</span><span class="o">(</span><span class="n">code</span><span class="o">,</span> <span class="n">ref</span> <span class="mi">0L</span><span class="o">,</span> <span class="k">new</span> <span class="n">VerificationWindow</span><span class="o">(</span><span class="mi">2</span><span class="o">,</span> <span class="mi">2</span><span class="o">))</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">enableTwoFactorAuth</span> <span class="n">redirectPath</span> <span class="n">notFoundPath</span> <span class="n">username</span> <span class="n">ctx</span> <span class="o">=</span> <span class="n">async</span> <span class="o">{</span>
</span><span class="line">  <span class="k">match</span> <span class="n">ctx</span><span class="o">.</span><span class="n">request</span><span class="o">.[</span><span class="s">&quot;SecretKey&quot;</span><span class="o">],</span> <span class="n">ctx</span><span class="o">.</span><span class="n">request</span><span class="o">.[</span><span class="s">&quot;Code&quot;</span><span class="o">]</span> <span class="k">with</span>
</span><span class="line">  <span class="o">|</span> <span class="n">Some</span> <span class="n">secretKey</span><span class="o">,</span> <span class="n">Some</span> <span class="n">code</span> <span class="o">-&gt;</span>
</span><span class="line">    <span class="k">match</span> <span class="n">verifyOtp</span> <span class="n">secretKey</span> <span class="n">code</span> <span class="k">with</span>
</span><span class="line">    <span class="o">|</span> <span class="k">true</span> <span class="o">-&gt;</span>
</span><span class="line">      <span class="n">enableTwoFactorAuth</span> <span class="n">username</span> <span class="n">secretKey</span>
</span><span class="line">      <span class="k">return</span><span class="o">!</span> <span class="n">redirect</span> <span class="n">redirectPath</span> <span class="n">ctx</span>
</span><span class="line">    <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span>
</span><span class="line">      <span class="k">let</span> <span class="nv">redirectTo</span> <span class="o">=</span>
</span><span class="line">        <span class="n">sprintf</span> <span class="s">&quot;%s?err=code validation failed&quot;</span> <span class="n">enableTwoFactorAuthPath</span>
</span><span class="line">      <span class="k">return</span><span class="o">!</span> <span class="n">redirect</span> <span class="n">redirectTo</span> <span class="n">ctx</span>
</span><span class="line">  <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="k">return</span><span class="o">!</span> <span class="n">redirect</span> <span class="n">notFoundPath</span> <span class="n">ctx</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">googleAuthenticatorWebPart</span> <span class="n">redirectPath</span> <span class="n">notFoundPath</span> <span class="o">=</span>
</span><span class="line">  <span class="n">choose</span> <span class="o">[</span>
</span><span class="line">    <span class="n">path</span> <span class="n">enableTwoFactorAuthPath</span> <span class="o">&gt;=&gt;</span> <span class="n">choose</span> <span class="o">[</span>
</span><span class="line">      <span class="c1">// ...</span>
</span><span class="line">      <span class="n">POST</span> <span class="o">&gt;=&gt;</span> <span class="n">secured</span> <span class="o">(</span><span class="n">enableTwoFactorAuth</span> <span class="n">redirectPath</span> <span class="n">notFoundPath</span><span class="o">)</span>
</span><span class="line">    <span class="o">]]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Thanks to the <em>OtpSharp</em> library for making our job simpler here. We just need to get the <code>SecretKey</code>, and the <code>Code</code> from the POST request and get it verified using <em>OtpSharp’s</em> <a href="https://bitbucket.org/devinmartin/otp-sharp/wiki/TOTP">VerifyTotp</a> function. </p>

<p>If the verification is successful, we will be enabling the Two-factor authentication for the user in our in-memory backend using the <code>enableTwoFactorAuth</code> function and then redirect to the redirect path which in this case the <em>Profile</em> page.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// Suave.TwoFactorAuth/Web.fs</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">app</span> <span class="o">=</span>
</span><span class="line">  <span class="n">choose</span> <span class="o">[</span>
</span><span class="line">    <span class="c1">// ...</span>
</span><span class="line">    <span class="n">googleAuthenticatorWebPart</span> <span class="n">profilePath</span> <span class="n">notFoundPath</span>
</span><span class="line">  <span class="o">]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h2 id="login-with-two-factor-authentication">Login With Two-factor Authentication</h2>

<p>The last step is to prompt for the verification code whenever the Two-factor Authentication enabled user tries to log in and verify the one-time verification code before granting the access. </p>

<p>Let’s start by defining the liquid view template <code>auth_code.liquid</code> for getting the one-time verification code.</p>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/suave_two_factor/auth_code_view.png" width="450" height="350" /></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// Suave.TwoFactorAuth/GoogleAuthenticator.fs</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="k">let</span> <span class="nv">authCodePath</span> <span class="o">=</span> <span class="s">&quot;/authcode&quot;</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">googleAuthenticatorWebPart</span> <span class="n">redirectPath</span> <span class="n">notFoundPath</span> <span class="o">=</span>
</span><span class="line">  <span class="n">choose</span> <span class="o">[</span>
</span><span class="line">    <span class="c1">// ...</span>
</span><span class="line">    <span class="n">path</span> <span class="n">authCodePath</span> <span class="o">&gt;=&gt;</span> <span class="n">page</span> <span class="s">&quot;auth_code.liquid&quot;</span> <span class="s">&quot;&quot;</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>After username and password verification, the user has to be redirected the <em>auth_code</em> page</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// Suave.TwoFactorAuth/Login.fs</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="k">let</span> <span class="nv">authCodeSessionKey</span> <span class="o">=</span> <span class="s">&quot;loginUser&quot;</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">onLogin</span> <span class="n">redirectPath</span> <span class="n">authCodePath</span> <span class="o">(</span><span class="n">request</span> <span class="o">:</span> <span class="n">HttpRequest</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">  <span class="k">match</span> <span class="n">request</span><span class="o">.[</span><span class="s">&quot;Username&quot;</span><span class="o">],</span> <span class="n">request</span><span class="o">.[</span><span class="s">&quot;Password&quot;</span><span class="o">]</span> <span class="k">with</span>
</span><span class="line">  <span class="o">|</span> <span class="n">Some</span> <span class="n">username</span><span class="o">,</span> <span class="n">Some</span> <span class="n">password</span> <span class="o">-&gt;</span>
</span><span class="line">    <span class="k">match</span> <span class="n">getUser</span> <span class="n">username</span> <span class="k">with</span>
</span><span class="line">    <span class="o">|</span> <span class="n">Some</span> <span class="n">user</span> <span class="o">-&gt;</span>
</span><span class="line">      <span class="k">match</span> <span class="n">user</span><span class="o">.</span><span class="n">Password</span> <span class="o">=</span> <span class="n">password</span><span class="o">,</span> <span class="n">user</span><span class="o">.</span><span class="n">TwoFactorAuthentication</span> <span class="k">with</span>
</span><span class="line">      <span class="o">|</span> <span class="k">true</span><span class="o">,</span> <span class="n">Disabled</span> <span class="o">-&gt;</span> <span class="n">loginSucess</span> <span class="n">never</span> <span class="n">redirectPath</span> <span class="n">username</span>
</span><span class="line">      <span class="o">|</span> <span class="k">true</span><span class="o">,</span> <span class="n">Enabled</span> <span class="o">_</span> <span class="o">-&gt;</span>
</span><span class="line">          <span class="n">sessionSet</span> <span class="n">never</span> <span class="n">authCodeSessionKey</span> <span class="n">username</span>
</span><span class="line">            <span class="o">&gt;=&gt;</span> <span class="n">FOUND</span> <span class="n">authCodePath</span>
</span><span class="line">      <span class="c1">// ...</span>
</span><span class="line">
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">loginWebPart</span> <span class="n">redirectPath</span> <span class="n">authCodePath</span> <span class="o">=</span>
</span><span class="line">  <span class="n">path</span> <span class="n">loginPath</span> <span class="o">&gt;=&gt;</span> <span class="n">choose</span> <span class="o">[</span>
</span><span class="line">      <span class="c1">// ...</span>
</span><span class="line">      <span class="n">POST</span> <span class="o">&gt;=&gt;</span> <span class="n">request</span> <span class="o">(</span><span class="n">onLogin</span> <span class="n">redirectPath</span> <span class="n">authCodePath</span><span class="o">)]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// Suave.TwoFactorAuth/Web.fs</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="k">let</span> <span class="nv">app</span> <span class="o">=</span>
</span><span class="line">  <span class="n">choose</span> <span class="o">[</span>
</span><span class="line">    <span class="n">loginWebPart</span> <span class="n">profilePath</span> <span class="n">authCodePath</span>
</span><span class="line">    <span class="c1">// ...</span>
</span><span class="line">  <span class="o">]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>We are using a separate session key <code>authCodeSessionKey</code> to hold the username of the user. </p>

<p>The final step is verifying the one-time verification code (from the Google Authenticator app) entered by the user. </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// Suave.TwoFactorAuth/GoogleAuthenticator.fs</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Combinators</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="k">let</span> <span class="nv">onAuthCodeVerification</span> <span class="n">redirectPath</span> <span class="o">(</span><span class="n">request</span> <span class="o">:</span> <span class="n">HttpRequest</span><span class="o">)</span> <span class="n">username</span> <span class="o">=</span>
</span><span class="line">  <span class="k">match</span> <span class="n">request</span><span class="o">.[</span><span class="s">&quot;Code&quot;</span><span class="o">],</span> <span class="n">getUser</span> <span class="n">username</span> <span class="k">with</span>
</span><span class="line">  <span class="o">|</span> <span class="n">Some</span> <span class="n">code</span><span class="o">,</span> <span class="n">Some</span> <span class="n">user</span> <span class="o">-&gt;</span>
</span><span class="line">    <span class="k">match</span> <span class="n">user</span><span class="o">.</span><span class="n">TwoFactorAuthentication</span> <span class="k">with</span>
</span><span class="line">    <span class="o">|</span> <span class="n">Enabled</span> <span class="n">secretKey</span> <span class="o">-&gt;</span>
</span><span class="line">      <span class="k">match</span> <span class="n">verifyOtp</span> <span class="n">secretKey</span> <span class="n">code</span> <span class="k">with</span>
</span><span class="line">      <span class="o">|</span> <span class="k">true</span> <span class="o">-&gt;</span> <span class="n">loginSucess</span> <span class="n">never</span> <span class="n">redirectPath</span> <span class="n">user</span><span class="o">.</span><span class="n">Username</span>
</span><span class="line">      <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">redirectToLogin</span> <span class="o">(</span><span class="n">Some</span> <span class="s">&quot;invalid otp&quot;</span><span class="o">)</span>
</span><span class="line">    <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">redirectToLogin</span> <span class="o">(</span><span class="n">Some</span> <span class="s">&quot;invalid request&quot;</span><span class="o">)</span>
</span><span class="line">  <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">redirectToLogin</span> <span class="o">(</span><span class="n">Some</span> <span class="s">&quot;invalid request&quot;</span><span class="o">)</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">onVerifyAuthCode</span> <span class="n">redirectPath</span> <span class="n">httpRequest</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">onFail</span> <span class="o">=</span> <span class="n">redirectToLogin</span> <span class="o">(</span><span class="n">Some</span> <span class="s">&quot;invalid request&quot;</span><span class="o">)</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">onAuthCodeVerification</span> <span class="o">=</span>
</span><span class="line">    <span class="n">onAuthCodeVerification</span> <span class="n">redirectPath</span> <span class="n">httpRequest</span>
</span><span class="line">  <span class="n">sessionGet</span> <span class="n">onFail</span> <span class="n">authCodeSessionKey</span> <span class="n">onAuthCodeVerification</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">googleAuthenticatorWebPart</span> <span class="n">redirectPath</span> <span class="n">notFoundPath</span> <span class="o">=</span>
</span><span class="line">  <span class="n">choose</span> <span class="o">[</span>
</span><span class="line">    <span class="c1">// ...</span>
</span><span class="line">    <span class="n">path</span> <span class="s">&quot;/verify_auth_code&quot;</span> <span class="o">&gt;=&gt;</span> <span class="n">request</span> <span class="o">(</span><span class="n">onVerifyAuthCode</span> <span class="n">redirectPath</span><span class="o">)]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>That’s it! We have successfully implemented Two-factor authentication. </p>

<p>The complete source code is available in <a href="https://github.com/tamizhvendan/blog-samples/tree/master/SuaveTwoFactorAuth">my GitHub repository</a></p>

<h3 id="related-posts">Related Post(s)</h3>

<ul>
  <li><a href="http://blog.tamizhvendan.in/blog/2015/07/15/securing-apis-in-suave-using-json-web-token/">Securing APIs in Suave using JSON Web Token</a></li>
</ul>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Leveraging Property Based Testing]]></title>
    <link href="http://blog.tamizhvendan.in/blog/2016/09/30/leveraging-property-based-testing/"/>
    <updated>2016-09-30T09:06:15+05:30</updated>
    <id>http://blog.tamizhvendan.in/blog/2016/09/30/leveraging-property-based-testing</id>
    <content type="html"><![CDATA[<p><a href="http://fsharpforfunandprofit.com/posts/property-based-testing/">Property-based testing</a> is one of the powerful technique to unit test the code. Unlike the example-based testing (where we <em>Arrange</em> a set of example inputs to <em>Assert</em> the system under test), Property based testing enable us to focus on what we wanted to test and liberate us from doing mundane work on coming up with sample inputs.</p>

<p>Recently, I got a chance to use Property based testing in <a href="https://github.com/tamizhvendan/Suave.Azure.Functions">an open source library</a> that I am developing to use <a href="https://suave.io">Suave</a> in <a href="https://azure.microsoft.com/en-in/services/functions/">Azure Functions</a>. I felt very productive and it was a such a joy to write the unit tests.  </p>

<p>In this blog post, you are going to learn how Property-based testing has helped me and why you need to consider using(or learning) it</p>

<h2 id="use-case">Use Case</h2>

<p>Let me start with the use case that I wanted to test. The library that I am working is an adapter between two HTTP protocol abstractions, <a href="https://msdn.microsoft.com/en-us/library/system.net.http.aspx">System.Net.Http</a> and <a href="https://github.com/SuaveIO/suave/blob/v1.1.3/src/Suave/Http.fs">Suave.Http</a></p>

<p>The first task is to map <a href="https://msdn.microsoft.com/en-us/library/system.net.httpstatuscode.aspx">HttpStatusCode</a> of <em>System.Net</em> to the <a href="https://github.com/SuaveIO/suave/blob/v1.1.3/src/Suave/Http.fs#L64-L71">HttpCode</a> of <em>Suave.Http</em> and the next task is doing the vice-versa.</p>

<blockquote>
  <p><em>HttpStatusCode</em> is an enum type and <em>HttpCode</em> is a discriminated union type. Refer this <a href="https://fsharpforfunandprofit.com/posts/enum-types/">blog post</a> to know more about this difference.</p>
</blockquote>

<h2 id="identifying-the-property">Identifying the Property</h2>

<p>The first step is Property-based testing is identifying the property. In other words, it forces to think about the relationship between the <em>input</em> and the <em>output</em>.</p>

<p>I believe this <em>thinking</em> will make a huge difference in the quality of the software that we deliver.</p>

<p>In the first task that we are about to implement, the relationship is the <em>integer</em> representation of the HTTP status code is both <em>HttpStatusCode</em> and <em>HttpCode</em>.</p>

<p>Programmatically, this can be asserted like</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// boolean condition</span>
</span><span class="line"><span class="c1">// In F# (=) operator represents the equality checking</span>
</span><span class="line"><span class="nn">LanguagePrimitives</span><span class="p">.</span><span class="n">EnumToValue</span> <span class="n">httpStatusCode</span> <span class="o">=</span> <span class="n">httpCode</span><span class="o">.</span><span class="n">code</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<blockquote>
  <p>The <a href="https://msdn.microsoft.com/en-us/visualfsharpdocs/conceptual/languageprimitives.enumtovalue%5B'enum,'t%5D-function-%5Bfsharp%5D">EnumToValue</a> returns the integer value associated with the enum, which is nothing but the integer representation of the HTTP status code it represents. The <code>code</code> is <a href="https://github.com/SuaveIO/suave/blob/v1.1.3/src/Suave/Http.fs#L73-L85">a member of</a> <em>HttpCode</em> that represents the same integer.</p>
</blockquote>

<p>If this property holds true for given set of inputs, then we can assert that the function that does the transformation is working correctly.</p>

<h2 id="implementing-the-mapping-function-httpstatuscode">Implementing the mapping function <code>httpStatusCode</code></h2>

<p>The initial implementation that I had in my mind was</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">NetStatusCode</span> <span class="o">=</span> <span class="k">function</span>
</span><span class="line"><span class="o">|</span> <span class="nn">HttpCode</span><span class="p">.</span><span class="n">HTTP_200</span> <span class="o">-&gt;</span> <span class="nn">HttpStatusCode</span><span class="p">.</span><span class="n">OK</span>
</span><span class="line"><span class="o">|</span> <span class="nn">HttpCode</span><span class="p">.</span><span class="n">HTTP_201</span> <span class="o">-&gt;</span> <span class="nn">HttpStatusCode</span><span class="p">.</span><span class="n">Created</span>
</span><span class="line"><span class="o">|</span> <span class="nn">HttpCode</span><span class="p">.</span><span class="n">HTTP_400</span> <span class="o">-&gt;</span> <span class="nn">HttpStatusCode</span><span class="p">.</span><span class="n">BadRequest</span>
</span><span class="line"><span class="o">|</span> <span class="nn">HttpCode</span><span class="p">.</span><span class="n">HTTP_404</span> <span class="o">-&gt;</span> <span class="nn">HttpStatusCode</span><span class="p">.</span><span class="n">NotFound</span>
</span><span class="line"><span class="o">|</span> <span class="nn">HttpCode</span><span class="p">.</span><span class="n">HTTP_202</span> <span class="o">-&gt;</span> <span class="nn">HttpStatusCode</span><span class="p">.</span><span class="n">Accepted</span>
</span><span class="line"><span class="o">|</span> <span class="c1">// ...</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
<p>If I haven’t choosen to use Property based testing, I might have ended up with this line by line mapping for all the HTTP status codes. As a matter of fact, in <a href="(/blog/2016/09/19/scale-up-azure-functions-in-f-number-using-suave/)">my last blog post</a> on using Suave in Azure Functions, I’ve used this same approach.</p>

<p>While thinking regarding properties to assert the transformation, for the first time I came to know about the <a href="https://msdn.microsoft.com/en-us/visualfsharpdocs/conceptual/core.languageprimitives-module-%5Bfsharp%5D">Language Primitives</a> module in F# and the <em>EnumToValue</em> function.</p>

<p>There should be an another function <em>EnumOfValue</em> right?</p>

<p>Yes!</p>

<p>Let’s use this in the <code>httpStatusCode</code> function implementation</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">httpStatusCode</span> <span class="o">(</span><span class="n">httpCode</span> <span class="o">:</span> <span class="n">HttpCode</span><span class="o">)</span> <span class="o">:</span> <span class="n">HttpStatusCode</span> <span class="o">=</span>
</span><span class="line">  <span class="nn">LanguagePrimitives</span><span class="p">.</span><span class="n">EnumOfValue</span> <span class="n">httpCode</span><span class="o">.</span><span class="n">code</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
<p>Short and Sweet!</p>

<p>Property-based testing made my day and helped me <a href="http://keysleft.com/">to save</a> a lot of keystrokes!</p>

<h2 id="writing-our-first-property-based-unit-test">Writing Our First Property based Unit Test</h2>

<p>In F# we can use the <a href="https://fscheck.github.io/FsCheck/">FsCheck</a> library to write the Property based unit tests. For this implementation, we will be using <em>FsCheck.Xunit</em> to run Property tests in <a href="http://xunit.github.io/">XUnit</a></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">open</span> <span class="nn">Suave.Http</span>
</span><span class="line"><span class="k">open</span> <span class="nn">System.Net</span>
</span><span class="line"><span class="k">open</span> <span class="nn">FsCheck</span>
</span><span class="line"><span class="k">open</span> <span class="nn">FsCheck.Xunit</span>
</span><span class="line">
</span><span class="line"><span class="o">[&lt;</span><span class="n">Property</span><span class="o">&gt;]</span>
</span><span class="line"><span class="k">let</span> <span class="o">``</span><span class="n">httpStatusCode</span> <span class="n">maps</span> <span class="n">Suave&#39;s</span> <span class="n">HttpCode</span> <span class="k">to</span> <span class="nn">System</span><span class="p">.</span><span class="n">Net&#39;s</span> <span class="n">HttpStatusCode</span> <span class="o">``</span>
</span><span class="line">  <span class="o">(</span><span class="n">httpCode</span> <span class="o">:</span> <span class="n">HttpCode</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">
</span><span class="line">    <span class="k">let</span> <span class="nv">httpStatusCode</span> <span class="o">=</span> <span class="nn">Response</span><span class="p">.</span><span class="n">httpStatusCode</span> <span class="n">httpCode</span>
</span><span class="line">    <span class="nn">LanguagePrimitives</span><span class="p">.</span><span class="n">EnumToValue</span> <span class="n">httpStatusCode</span> <span class="o">=</span> <span class="n">httpCode</span><span class="o">.</span><span class="n">code</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The magic here is the <code>Property</code> attribute. It makes our life easier by auto-populating the parameter <code>httpCode</code> with the all the possible values and runs the unit test against each value.</p>

<p>As a convention, we need to return boolean by validating the property that we wanted to assert.</p>

<blockquote>
  <p>There is no Arrange step to setup the input parameter and FsCheck does that for you with 100% test coverage :-)</p>
</blockquote>

<h2 id="mapping-httpcode-to-httpstatuscode">Mapping HttpCode to HttpStatusCode</h2>

<p>The next task in the use case is doing the reverse, mapping <em>HttpStatusCode</em> to <em>HttpCode</em>.</p>

<p>Let’s start with the test first.</p>

<p>The integer representation of HTTP status code property that we used on the previous task holds true for this mapping also.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="o">[&lt;</span><span class="n">Property</span><span class="o">&gt;]</span>
</span><span class="line"><span class="k">let</span> <span class="o">``</span><span class="n">suaveHttpCode</span> <span class="n">maps</span> <span class="nn">System</span><span class="p">.</span><span class="n">Net&#39;s</span> <span class="n">HttpStatusCode</span> <span class="k">to</span> <span class="n">Suave&#39;s</span> <span class="n">HttpCode</span> <span class="k">if</span> <span class="n">exists</span><span class="o">``</span>
</span><span class="line">  <span class="o">(</span><span class="n">httpStatusCode</span> <span class="o">:</span> <span class="n">HttpStatusCode</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">    <span class="k">let</span> <span class="nv">httpCode</span> <span class="o">=</span> <span class="n">suaveHttpCode</span> <span class="n">httpStatusCode</span>
</span><span class="line">    <span class="k">let</span> <span class="nv">code</span> <span class="o">=</span> <span class="nn">LanguagePrimitives</span><span class="p">.</span><span class="n">EnumToValue</span> <span class="n">httpStatusCode</span>
</span><span class="line">
</span><span class="line">    <span class="nn">Option</span><span class="p">.</span><span class="n">isSome</span> <span class="n">httpCode</span> <span class="o">&amp;&amp;</span> <span class="n">httpCode</span><span class="o">.</span><span class="n">Value</span><span class="o">.</span><span class="n">code</span> <span class="o">=</span> <span class="n">code</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <code>suaveHttpCode</code> function returns an <a href="http://fsharpforfunandprofit.com/posts/the-option-type/">Option type</a> as Suave.Http.HttpCode’s <code>tryParse</code> function <a href="https://github.com/SuaveIO/suave/blob/v1.1.3/src/Suave/Http.fs#L184-L194">parses the integer HTTP status code</a> and returns the corresponding <code>HttpCode</code> if the parsing succeeds.</p>

<p>The implementation of <code>suaveHttpCode</code> function is</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">suaveHttpCode</span> <span class="o">(</span><span class="n">httpStatusCode</span> <span class="o">:</span> <span class="n">HttpStatusCode</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">code</span> <span class="o">=</span>
</span><span class="line">    <span class="nn">LanguagePrimitives</span><span class="p">.</span><span class="n">EnumToValue</span> <span class="n">httpStatusCode</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="nn">HttpCode</span><span class="p">.</span><span class="n">tryParse</span>
</span><span class="line">  <span class="k">match</span> <span class="n">code</span> <span class="k">with</span>
</span><span class="line">  <span class="o">|</span> <span class="n">Choice1Of2</span> <span class="n">httpCode</span> <span class="o">-&gt;</span> <span class="n">Some</span> <span class="n">httpCode</span>
</span><span class="line">  <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">None</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Now if we run the unit tests, You will be getting the following error (if you are using Suave NuGet package version &lt;= 1.1.3)</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="nn">Suave</span><span class="p">.</span><span class="nn">Azure</span><span class="p">.</span><span class="nn">Functions</span><span class="p">.</span><span class="nn">Tests</span><span class="p">.</span><span class="n">suaveHttpCode</span> <span class="n">maps</span> <span class="nn">System</span><span class="p">.</span><span class="n">Net&#39;s</span> <span class="n">HttpStatusCode</span> <span class="k">to</span> <span class="n">Suave&#39;s</span> <span class="n">HttpCode</span> <span class="o">[</span><span class="n">FAIL</span><span class="o">]</span>
</span><span class="line"><span class="nn">FsCheck</span><span class="p">.</span><span class="nn">Xunit</span><span class="p">.</span><span class="n">PropertyFailedException</span> <span class="o">:</span>
</span><span class="line">     <span class="n">Falsifiable</span><span class="o">,</span> <span class="n">after</span> <span class="mi">7</span> <span class="n">tests</span> <span class="o">(</span><span class="mi">0</span> <span class="n">shrinks</span><span class="o">)</span> <span class="o">(</span><span class="n">StdGen</span> <span class="o">(</span><span class="mi">1629668181</span><span class="o">,</span><span class="mi">296211181</span><span class="o">)):</span>
</span><span class="line">     <span class="n">Original</span><span class="o">:</span>
</span><span class="line">     <span class="n">Unused</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The reason for this failure is Suave (up to v1.1.3) doesn’t have the HTTP status code <em>306 (UnUsed)</em>. The unit test that we wrote was exercised by the <em>FsCheck</em> for the all possible values of the <code>HttpStatusCode</code> enum till it encountered this failure case.</p>

<p>Let’s patch our unit test to fix this failure.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">httpCode</span> <span class="o">=</span> <span class="nn">Response</span><span class="p">.</span><span class="n">suaveHttpCode</span> <span class="n">httpStatusCode</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">code</span> <span class="o">=</span> <span class="nn">LanguagePrimitives</span><span class="p">.</span><span class="n">EnumToValue</span> <span class="n">httpStatusCode</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">unSupportedSuaveHttpCodes</span> <span class="o">=</span> <span class="o">[</span><span class="mi">306</span><span class="o">]</span>
</span><span class="line">
</span><span class="line">  <span class="k">if</span> <span class="nn">List</span><span class="p">.</span><span class="n">contains</span> <span class="n">code</span> <span class="n">unSupportedSuaveHttpCodes</span> <span class="k">then</span>
</span><span class="line">    <span class="nn">Option</span><span class="p">.</span><span class="n">isNone</span> <span class="n">httpCode</span>
</span><span class="line">  <span class="k">else</span>
</span><span class="line">    <span class="nn">Option</span><span class="p">.</span><span class="n">isSome</span> <span class="n">httpCode</span> <span class="o">&amp;&amp;</span> <span class="n">httpCode</span><span class="o">.</span><span class="n">Value</span><span class="o">.</span><span class="n">code</span> <span class="o">=</span> <span class="n">code</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>If you run the unit test after this, you will get an another failure</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="nn">Suave</span><span class="p">.</span><span class="nn">Azure</span><span class="p">.</span><span class="nn">Functions</span><span class="p">.</span><span class="nn">Tests</span><span class="p">.</span><span class="n">suaveHttpCode</span> <span class="n">maps</span> <span class="nn">System</span><span class="p">.</span><span class="n">Net&#39;s</span> <span class="n">HttpStatusCode</span> <span class="k">to</span> <span class="n">Suave&#39;s</span> <span class="n">HttpCode</span> <span class="o">[</span><span class="n">FAIL</span><span class="o">]</span>
</span><span class="line"><span class="nn">FsCheck</span><span class="p">.</span><span class="nn">Xunit</span><span class="p">.</span><span class="n">PropertyFailedException</span> <span class="o">:</span>
</span><span class="line">  <span class="n">Falsifiable</span><span class="o">,</span> <span class="n">after</span> <span class="mi">10</span> <span class="n">tests</span> <span class="o">(</span><span class="mi">0</span> <span class="n">shrinks</span><span class="o">)</span> <span class="o">(</span><span class="n">StdGen</span> <span class="o">(</span><span class="mi">507658935</span><span class="o">,</span><span class="mi">296211184</span><span class="o">)):</span>
</span><span class="line">  <span class="n">Original</span><span class="o">:</span>
</span><span class="line">  <span class="n">UpgradeRequired</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Again, The reason is HTTP Status Code <code>426 (UpgradeRequired)</code> is not supported is Suave at this point of writing. Let’s patch this too by adding this to the list <code>unSupportedSuaveHttpCodes</code>.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="k">let</span> <span class="nv">unSupportedSuaveHttpCodes</span> <span class="o">=</span> <span class="o">[</span><span class="mi">306</span><span class="o">;</span><span class="mi">426</span><span class="o">]</span>
</span><span class="line"><span class="c1">// ...</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>After this FsCheck is happy and we too.</p>

<blockquote>
  <p>If I haven’t used Property based testing, for sure, I might have missed these two unsupported HTTP status codes.</p>
</blockquote>

<h2 id="the-spirit-of-open-source">The Spirit of Open Source</h2>

<p>While looking at <code>Suave.Http</code> codebase to fix the unit test failures, this is what I saw in the code</p>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/leveraging_pbt/send_pr.png" /></p>

<p>This is the beauty of open source, and I am glad <a href="https://github.com/SuaveIO/suave/pull/512">to do it</a></p>

<h2 id="summary">Summary</h2>

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Writing tests first forces you to think about the problem you&#39;re solving. Writing property-based tests forces you to think way harder.</p>&mdash; Jessica Kerr (@jessitron) <a href="https://twitter.com/jessitron/status/327480330900611072">April 25, 2013</a></blockquote>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Scale Up Azure Functions in F# using Suave]]></title>
    <link href="http://blog.tamizhvendan.in/blog/2016/09/19/scale-up-azure-functions-in-f-number-using-suave/"/>
    <updated>2016-09-19T15:55:45+05:30</updated>
    <id>http://blog.tamizhvendan.in/blog/2016/09/19/scale-up-azure-functions-in-f-number-using-suave</id>
    <content type="html"><![CDATA[<p>Recently Microsoft Azure has made <a href="https://blogs.msdn.microsoft.com/appserviceteam/2016/09/01/azure-functions-0-5-release-august-portal-update/">F# as a first-class citizen</a> to write <a href="https://azure.microsoft.com/en-in/services/functions/">Azure Functions</a>. As F# is a functional-first programming language, I feel Azure Functions and F# would be a match made in heaven.</p>

<p>In this blog post, you are going to experience a scaled up version of Azure Functions in F# using <a href="https://suave.io">Suave</a></p>

<h2 id="whats-in-the-function-signatures">What’s in the Function Signatures?</h2>

<p>In a functional programming language, we define small functions that do one thing well and then we compose them together to represent the solution. To <a href="https://fsharpforfunandprofit.com/posts/function-composition/">compose functions</a>, we need to be thoughtful while designing the signature of a function.</p>

<p>Let’s see the signature of an <a href="https://azure.microsoft.com/en-us/documentation/articles/functions-reference-fsharp/">Azure Function in F#</a></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// HttpRequestMessage -&gt; HttpResponseMessage</span>
</span><span class="line"><span class="k">let</span> <span class="nv">Run</span><span class="o">(</span><span class="n">req</span><span class="o">:</span> <span class="n">HttpRequestMessage</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">  <span class="k">new</span> <span class="n">HttpResponseMessage</span><span class="o">(</span><span class="nn">HttpStatusCode</span><span class="p">.</span><span class="n">OK</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <code>Run</code> function takes a <code>HttpRequestMessage</code> and returns the <code>HttpResponseMessage</code>. This signature is simple, but it has a limitation. The limitation has been showcased in the <a href="https://github.com/Azure/azure-webjobs-sdk-templates/tree/dev/Templates">templates</a> directory of Azure Webjobs SDK</p>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/AzureFunctionsSuave/Azure_Functions_CRUD.png" width="250" height="250" /></p>

<p>My each <code>C</code>, <code>R</code>, <code>U</code>, <code>D</code> are in different functions. Well, there is nothing wrong here. These templates are suitable for getting started in Azure Functions. But what will you do if you have a requirement to expose <code>CRUD</code> of a resource as an Azure Functions?</p>

<p>One option is to define each part of the <code>CRUD</code> as separate Azure Functions (as defined by the templates). If you choose to go by this, you will have four different endpoints and I am sure your client code will have a hard time to consume these endpoints. In addition to this, you will also need to manage four things to satisfy your one requirement.</p>

<p>The other option is putting the <code>CRUD</code> inside a single function.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">Run</span> <span class="o">(</span><span class="n">req</span><span class="o">:</span><span class="n">HttpRequestMessage</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">    <span class="k">if</span> <span class="n">req</span><span class="o">.</span><span class="n">Method</span> <span class="o">=</span> <span class="nn">HttpMethod</span><span class="p">.</span><span class="n">Get</span> <span class="k">then</span>
</span><span class="line">        <span class="c1">// ...</span>
</span><span class="line">    <span class="k">else</span> <span class="k">if</span> <span class="n">req</span><span class="o">.</span><span class="n">Method</span> <span class="o">=</span> <span class="nn">HttpMethod</span><span class="p">.</span><span class="n">Post</span> <span class="k">then</span>
</span><span class="line">        <span class="c1">// ...</span>
</span><span class="line">    <span class="k">else</span> <span class="k">if</span> <span class="n">req</span><span class="o">.</span><span class="n">Method</span> <span class="o">=</span> <span class="nn">HttpMethod</span><span class="p">.</span><span class="n">Put</span> <span class="k">then</span>
</span><span class="line">        <span class="c1">// ...</span>
</span><span class="line">    <span class="k">else</span> <span class="k">if</span> <span class="n">req</span><span class="o">.</span><span class="n">Method</span> <span class="o">=</span> <span class="nn">HttpMethod</span><span class="p">.</span><span class="n">Delete</span> <span class="k">then</span>
</span><span class="line">        <span class="c1">// ...</span>
</span><span class="line">    <span class="k">else</span>
</span><span class="line">        <span class="c1">// ...</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Though this approach solves the problem, it comes with another set of <a href="http://stackoverflow.com/questions/126409/ways-to-eliminate-switch-in-code">challenges</a>. In Object Oriented  Programming, we typically use <a href="http://www.refactoring.com/catalog/replaceConditionalWithPolymorphism.html">Polymorphism</a> to replace the conditional logic.</p>

<p><img class="center" src="http://scontent.cdninstagram.com/t51.2885-15/s480x480/e35/13391359_1083221395099569_1878773023_n.jpg?ig_cache_key=MTI3NTQ5MjQ4NzE4Mjk3MTIxOQ%3D%3D.2" /></p>

<h2 id="revisiting-function-signature">Revisiting Function Signature</h2>

<p>A request <code>handler</code> looks for some condition to be meet in the incoming HTTP request, and if the predicate succeeds, it modifies the HTTP response.</p>

<p>The signature of the <code>Run</code> function, <code>HttpRequestMessage -&gt; HttpResponseMessage</code> is not completely reflecting the above specification.</p>

<p>Let’s have a look at the limitations of this signature</p>

<ul>
  <li>
    <p>The <code>Run</code> function doesn’t return the <code>HttpRequestMessage</code>. So if we have multiple <code>handler</code>s we are constrained to use either <code>if else if</code> or Polymorphism.</p>
  </li>
  <li>
    <p>It doesn’t represent a handler that doesn’t handle the HTTP request. If the HTTP request is <code>GET</code>, the <code>handler</code> for HTTP <code>POST</code> will not modify the <code>HttpResponseMessage</code></p>
  </li>
</ul>

<p>The better signature would have the following to describe a handler in a better way</p>

<ul>
  <li>
    <p>The handler has to be pure function that takes both <code>Request</code> and <code>Response</code> as it’s parameters</p>
  </li>
  <li>
    <p>If the handler is not handling the HTTP request, it has to return the unmodified <code>Request</code> and <code>Response</code> along with an indicator saying that it didn’t handle the request.</p>
  </li>
</ul>

<p>It’s where the <a href="https://suave.io">Suave</a> library shines. Suave defines a type called <code>WebPart</code> with the signature to model the <code>handler</code> with the above-said expectations.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">type</span> <span class="nc">HttpContext</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">request</span>    <span class="o">:</span> <span class="n">HttpRequest</span>
</span><span class="line">  <span class="n">response</span>   <span class="o">:</span> <span class="n">HttpResult</span>
</span><span class="line">  <span class="c1">// ...</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="k">type</span> <span class="nc">WebPart</span> <span class="o">=</span> <span class="n">HttpContext</span> <span class="o">-&gt;</span> <span class="n">Async</span><span class="o">&lt;</span><span class="n">HttpContext</span> <span class="n">option</span><span class="o">&gt;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<blockquote>
  <p>The <code>Async</code> represents that the <code>WebPart</code> function is a non-blocking asynchronous function and <code>option</code> type models the <code>WebPart</code> which doesn’t handle the HTTP request</p>
</blockquote>

<p>The real power of Suave is its set of combinators to manipulate route flow and task composition. You can define an API in Suave that only handles HTTP <code>POST</code> requests and returns <code>Hello</code> as text without typing too much.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// HttpContext -&gt; Async&lt;HttpContext option&gt;</span>
</span><span class="line"><span class="k">let</span> <span class="nv">app</span> <span class="o">=</span> <span class="n">POST</span> <span class="o">&gt;=&gt;</span> <span class="n">OK</span> <span class="s">&quot;HelloSystem.Net.Http</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<blockquote>
  <p>To learn more about the Suave combinators refer my blog post on <a href="http://blog.tamizhvendan.in/blog/2015/06/11/building-rest-api-in-fsharp-using-suave/">Building REST API in suave</a></p>
</blockquote>

<p>If you notice the binding <code>app</code> itself is a <code>WebPart</code> (which in turn a function) with the signature <code>HttpContext -&gt; Async&lt;HttpContext option&gt;</code>. So, you can call this function in your application code and project the output of the function to any output medium that you wish.</p>

<h2 id="the-difference">The Difference</h2>

<p>The Azure Functions do an incredible job in helping you to define <em>a part of your system</em> as <em>a function</em>. Suave takes it to the next level by helping you to define <em>your system</em> as <em>function</em>.</p>

<p>In nutshell, Suave complements Azure Functions and helps you to define your system as a <em>Serverless Function</em></p>

<h2 id="creating-a-suave-adapter">Creating a Suave Adapter</h2>

<p>So, to scale up Azure Functions using Suave, all we need is an adapter.</p>

<p><img class="center" src="http://images.freeimages.com/images/previews/c0d/adapter-1420487.jpg" /></p>

<p>The adapter does the following</p>

<ul>
  <li>
    <p>Transforms <code>HttpRequestMessage</code> from <code>System.Net.Http</code> to <code>HttpRequest</code> of <code>Suave.Http</code></p>
  </li>
  <li>
    <p>Then create an empty Suave’s <code>HttpContext</code> with the above <code>HttpRequest</code> and call the <code>WebPart</code> (that represents your system).</p>
  </li>
  <li>
    <p>The final step is converting the <code>HttpResult</code> of <code>Suave.Http</code> to <code>HttpResponseMessage</code> of <code>System.Net.Http</code>.</p>
  </li>
</ul>

<p>Let’s start from <code>HttpRequestMessage</code></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
<span class="line-number">32</span>
<span class="line-number">33</span>
<span class="line-number">34</span>
<span class="line-number">35</span>
<span class="line-number">36</span>
<span class="line-number">37</span>
<span class="line-number">38</span>
<span class="line-number">39</span>
<span class="line-number">40</span>
<span class="line-number">41</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// SuaveAdapter.fsx</span>
</span><span class="line"><span class="k">let</span> <span class="nv">SuaveHttpMethod</span> <span class="o">(</span><span class="n">httpMethod</span> <span class="o">:</span> <span class="nn">System</span><span class="p">.</span><span class="nn">Net</span><span class="p">.</span><span class="nn">Http</span><span class="p">.</span><span class="n">HttpMethod</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">  <span class="k">match</span> <span class="n">httpMethod</span><span class="o">.</span><span class="n">Method</span> <span class="k">with</span>
</span><span class="line">  <span class="o">|</span> <span class="s">&quot;GET&quot;</span> <span class="o">-&gt;</span> <span class="nn">HttpMethod</span><span class="p">.</span><span class="n">GET</span>
</span><span class="line">  <span class="o">|</span> <span class="s">&quot;POST&quot;</span> <span class="o">-&gt;</span> <span class="nn">HttpMethod</span><span class="p">.</span><span class="n">POST</span>
</span><span class="line">  <span class="o">|</span> <span class="s">&quot;PUT&quot;</span> <span class="o">-&gt;</span> <span class="nn">HttpMethod</span><span class="p">.</span><span class="n">PUT</span>
</span><span class="line">  <span class="o">|</span> <span class="s">&quot;DELETE&quot;</span> <span class="o">-&gt;</span> <span class="nn">HttpMethod</span><span class="p">.</span><span class="n">DELETE</span>
</span><span class="line">  <span class="o">|</span> <span class="n">x</span> <span class="o">-&gt;</span> <span class="nn">HttpMethod</span><span class="p">.</span><span class="n">OTHER</span> <span class="n">x</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">SuaveHeaders</span> <span class="o">(</span><span class="n">headers</span> <span class="o">:</span> <span class="n">HttpRequestHeaders</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">  <span class="n">headers</span>
</span><span class="line">  <span class="o">|&gt;</span> <span class="nn">Seq</span><span class="p">.</span><span class="n">map</span> <span class="o">(</span><span class="k">fun</span> <span class="n">h</span> <span class="o">-&gt;</span> <span class="o">(</span><span class="n">h</span><span class="o">.</span><span class="n">Key</span><span class="o">,</span> <span class="n">h</span><span class="o">.</span><span class="n">Value</span> <span class="o">|&gt;</span> <span class="nn">Seq</span><span class="p">.</span><span class="n">head</span><span class="o">))</span>
</span><span class="line">  <span class="o">|&gt;</span> <span class="nn">Seq</span><span class="p">.</span><span class="n">toList</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">SuaveRawForm</span> <span class="o">(</span><span class="n">content</span> <span class="o">:</span> <span class="nn">System</span><span class="p">.</span><span class="nn">Net</span><span class="p">.</span><span class="nn">Http</span><span class="p">.</span><span class="n">HttpContent</span><span class="o">)</span> <span class="o">=</span> <span class="n">async</span> <span class="o">{</span>
</span><span class="line">  <span class="k">let!</span> <span class="nv">content</span> <span class="o">=</span> <span class="n">content</span><span class="o">.</span><span class="n">ReadAsByteArrayAsync</span><span class="bp">()</span> <span class="o">|&gt;</span> <span class="nn">Async</span><span class="p">.</span><span class="n">AwaitTask</span>
</span><span class="line">  <span class="k">return</span> <span class="n">content</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">SuaveRawQuery</span> <span class="o">(</span><span class="n">requestUri</span> <span class="o">:</span> <span class="nn">System</span><span class="p">.</span><span class="n">Uri</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">  <span class="k">if</span> <span class="n">requestUri</span><span class="o">.</span><span class="n">Query</span><span class="o">.</span><span class="n">Length</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">then</span>
</span><span class="line">    <span class="n">requestUri</span><span class="o">.</span><span class="n">Query</span><span class="o">.</span><span class="n">Substring</span><span class="o">(</span><span class="mi">1</span><span class="o">)</span>
</span><span class="line">  <span class="k">else</span>
</span><span class="line">      <span class="s">&quot;&quot;</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">NetHeaderValue</span> <span class="o">(</span><span class="n">headers</span> <span class="o">:</span> <span class="n">HttpRequestHeaders</span><span class="o">)</span> <span class="n">key</span> <span class="o">=</span>
</span><span class="line">    <span class="n">headers</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="nn">Seq</span><span class="p">.</span><span class="n">tryFind</span> <span class="o">(</span><span class="k">fun</span> <span class="n">h</span> <span class="o">-&gt;</span> <span class="n">h</span><span class="o">.</span><span class="n">Key</span> <span class="o">=</span> <span class="n">key</span><span class="o">)</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="nn">Option</span><span class="p">.</span><span class="n">map</span> <span class="o">(</span><span class="k">fun</span> <span class="n">h</span> <span class="o">-&gt;</span> <span class="n">h</span><span class="o">.</span><span class="n">Value</span> <span class="o">|&gt;</span> <span class="nn">Seq</span><span class="p">.</span><span class="n">head</span><span class="o">)</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">SuaveRequest</span> <span class="o">(</span><span class="n">req</span> <span class="o">:</span> <span class="n">HttpRequestMessage</span><span class="o">)</span> <span class="o">=</span> <span class="n">async</span> <span class="o">{</span>
</span><span class="line">  <span class="k">let!</span> <span class="nv">content</span> <span class="o">=</span> <span class="n">SuaveRawForm</span> <span class="n">req</span><span class="o">.</span><span class="n">Content</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">host</span> <span class="o">=</span> <span class="n">defaultArg</span> <span class="o">(</span><span class="n">NetHeaderValue</span> <span class="n">req</span><span class="o">.</span><span class="n">Headers</span> <span class="s">&quot;Host&quot;</span><span class="o">)</span> <span class="s">&quot;&quot;</span>
</span><span class="line">  <span class="k">return</span> <span class="o">{</span><span class="nn">HttpRequest</span><span class="p">.</span><span class="n">empty</span> <span class="k">with</span>
</span><span class="line">            <span class="n">url</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">RequestUri</span>
</span><span class="line">            <span class="o">``</span><span class="k">method</span><span class="o">``</span> <span class="o">=</span> <span class="n">SuaveHttpMethod</span> <span class="n">req</span><span class="o">.</span><span class="n">Method</span>
</span><span class="line">            <span class="n">headers</span> <span class="o">=</span> <span class="n">SuaveHeaders</span> <span class="n">req</span><span class="o">.</span><span class="n">Headers</span>
</span><span class="line">            <span class="n">rawForm</span> <span class="o">=</span> <span class="n">content</span>
</span><span class="line">            <span class="n">rawQuery</span> <span class="o">=</span> <span class="n">SuaveRawQuery</span> <span class="n">req</span><span class="o">.</span><span class="n">RequestUri</span>
</span><span class="line">            <span class="n">host</span> <span class="o">=</span> <span class="n">host</span><span class="o">}</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<blockquote>
  <p>As a convention, I’ve used <code>Net</code> and <code>Suave</code> prefixes in the function name to represent the returning type of <code>System.Net.Http</code> and <code>Suave.Http</code> respectively.  </p>
</blockquote>

<p>I hope that these functions are self-explanatory, so let’s move on the next step.</p>

<blockquote>
  <p>To keep it simple, I’ve ignored other HTTP Methods like PATCH, HEAD, etc.</p>
</blockquote>

<p>The next step is creating Suave <code>HttpContext</code></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">SuaveContext</span> <span class="n">httpRequest</span> <span class="o">=</span> <span class="n">async</span> <span class="o">{</span>
</span><span class="line">  <span class="k">let!</span> <span class="nv">suaveReq</span> <span class="o">=</span> <span class="n">SuaveRequest</span> <span class="n">httpRequest</span>
</span><span class="line">  <span class="k">return</span> <span class="o">{</span> <span class="nn">HttpContext</span><span class="p">.</span><span class="n">empty</span> <span class="k">with</span> <span class="n">request</span> <span class="o">=</span> <span class="n">suaveReq</span><span class="o">}</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Then we need to convert <code>HttpResult</code> to <code>HttpResponseMessage</code></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">NetStatusCode</span> <span class="o">=</span> <span class="k">function</span>
</span><span class="line"><span class="o">|</span> <span class="nn">HttpCode</span><span class="p">.</span><span class="n">HTTP_200</span> <span class="o">-&gt;</span> <span class="nn">HttpStatusCode</span><span class="p">.</span><span class="n">OK</span>
</span><span class="line"><span class="o">|</span> <span class="nn">HttpCode</span><span class="p">.</span><span class="n">HTTP_201</span> <span class="o">-&gt;</span> <span class="nn">HttpStatusCode</span><span class="p">.</span><span class="n">Created</span>
</span><span class="line"><span class="o">|</span> <span class="nn">HttpCode</span><span class="p">.</span><span class="n">HTTP_400</span> <span class="o">-&gt;</span> <span class="nn">HttpStatusCode</span><span class="p">.</span><span class="n">BadRequest</span>
</span><span class="line"><span class="o">|</span> <span class="nn">HttpCode</span><span class="p">.</span><span class="n">HTTP_404</span> <span class="o">-&gt;</span> <span class="nn">HttpStatusCode</span><span class="p">.</span><span class="n">NotFound</span>
</span><span class="line"><span class="o">|</span> <span class="nn">HttpCode</span><span class="p">.</span><span class="n">HTTP_202</span> <span class="o">-&gt;</span> <span class="nn">HttpStatusCode</span><span class="p">.</span><span class="n">Accepted</span>
</span><span class="line"><span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="nn">HttpStatusCode</span><span class="p">.</span><span class="n">Ambiguous</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">NetHttpResponseMessage</span> <span class="n">httpResult</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">content</span> <span class="o">=</span> <span class="k">function</span>
</span><span class="line">  <span class="o">|</span> <span class="n">Bytes</span> <span class="n">c</span> <span class="o">-&gt;</span> <span class="n">c</span>
</span><span class="line">  <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="nn">Array</span><span class="p">.</span><span class="n">empty</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">res</span> <span class="o">=</span> <span class="k">new</span> <span class="n">HttpResponseMessage</span><span class="bp">()</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">content</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ByteArrayContent</span><span class="o">(</span><span class="n">content</span> <span class="n">httpResult</span><span class="o">.</span><span class="n">content</span><span class="o">)</span>
</span><span class="line">  <span class="n">httpResult</span><span class="o">.</span><span class="n">headers</span> <span class="o">|&gt;</span> <span class="nn">List</span><span class="p">.</span><span class="n">iter</span> <span class="n">content</span><span class="o">.</span><span class="n">Headers</span><span class="o">.</span><span class="n">Add</span>
</span><span class="line">  <span class="n">res</span><span class="o">.</span><span class="n">Content</span> <span class="o">&lt;-</span> <span class="n">content</span>
</span><span class="line">  <span class="n">res</span><span class="o">.</span><span class="n">StatusCode</span> <span class="o">&lt;-</span> <span class="n">NetStatusCode</span> <span class="n">httpResult</span><span class="o">.</span><span class="n">status</span>
</span><span class="line">  <span class="n">res</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<blockquote>
  <p>To keep it simple, I’ve ignored other HTTP StatusCodes</p>
</blockquote>

<p>The final step is putting these functions together and run the <code>WebPart</code> function with the translated <code>HttpContext</code>.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">SuaveRunAsync</span> <span class="n">app</span> <span class="n">suaveContext</span> <span class="o">=</span> <span class="n">async</span> <span class="o">{</span>
</span><span class="line">  <span class="k">let!</span> <span class="nv">res</span> <span class="o">=</span> <span class="n">app</span> <span class="n">suaveContext</span>
</span><span class="line">  <span class="k">match</span> <span class="n">res</span> <span class="k">with</span>
</span><span class="line">  <span class="o">|</span> <span class="n">Some</span> <span class="n">ctx</span> <span class="o">-&gt;</span>
</span><span class="line">    <span class="k">return</span> <span class="o">(</span><span class="n">NetHttpResponseMessage</span> <span class="n">ctx</span><span class="o">.</span><span class="n">response</span><span class="o">,</span> <span class="n">ctx</span><span class="o">)</span>
</span><span class="line">  <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span>
</span><span class="line">    <span class="k">let</span> <span class="nv">res</span> <span class="o">=</span> <span class="k">new</span> <span class="n">HttpResponseMessage</span><span class="bp">()</span>
</span><span class="line">    <span class="n">res</span><span class="o">.</span><span class="n">Content</span> <span class="o">&lt;-</span> <span class="k">new</span> <span class="n">ByteArrayContent</span><span class="o">(</span><span class="nn">Array</span><span class="p">.</span><span class="n">empty</span><span class="o">)</span>
</span><span class="line">    <span class="n">res</span><span class="o">.</span><span class="n">StatusCode</span> <span class="o">&lt;-</span> <span class="nn">HttpStatusCode</span><span class="p">.</span><span class="n">NotFound</span>
</span><span class="line">    <span class="k">return</span> <span class="n">res</span><span class="o">,</span><span class="n">suaveContext</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">RunWebPartAsync</span> <span class="n">app</span> <span class="n">httpRequest</span> <span class="o">=</span> <span class="n">async</span> <span class="o">{</span>
</span><span class="line">  <span class="k">let!</span> <span class="nv">suaveContext</span> <span class="o">=</span> <span class="n">SuaveContext</span> <span class="n">httpRequest</span>
</span><span class="line">  <span class="k">return</span><span class="o">!</span> <span class="n">SuaveRunAsync</span> <span class="n">app</span> <span class="n">suaveContext</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h2 id="suave-adapter-in-action">Suave Adapter In Action</h2>

<p>Let’s see the Suave Adapter that we created in action.</p>

<p>As already there are two great blog posts by <a href="http://gregshackles.com/getting-started-with-azure-functions-and-f/">Greg Shackles</a> and <a href="https://mnie.github.io/2016-09-08-AzureFunctions/">Michał Niegrzybowski</a>, I am diving directly into Azure functions in F#.</p>

<p>Let me create a new Azure Function application in Azure with the name “TamAzureFun” and then define the first function <code>HelloSuave</code>.</p>

<p>The <code>function.json</code> of <code>HelloSuave</code> has to be updated with the <code>methods</code> property to support different HTTP request methods.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
</pre></td><td class="code"><pre><code class="json"><span class="line"><span class="p">{</span>
</span><span class="line">    <span class="nt">&quot;disabled&quot;</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
</span><span class="line">    <span class="nt">&quot;bindings&quot;</span><span class="p">:</span> <span class="p">[{</span>
</span><span class="line">      <span class="nt">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;httpTrigger&quot;</span><span class="p">,</span>
</span><span class="line">      <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;req&quot;</span><span class="p">,</span>
</span><span class="line">      <span class="nt">&quot;methods&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;get&quot;</span><span class="p">,</span><span class="s2">&quot;put&quot;</span><span class="p">,</span><span class="s2">&quot;post&quot;</span><span class="p">,</span><span class="s2">&quot;delete&quot;</span><span class="p">],</span>
</span><span class="line">      <span class="nt">&quot;authLevel&quot;</span><span class="p">:</span> <span class="s2">&quot;anonymous&quot;</span><span class="p">,</span>
</span><span class="line">      <span class="nt">&quot;direction&quot;</span><span class="p">:</span> <span class="s2">&quot;in&quot;</span>
</span><span class="line">    <span class="p">},{</span>
</span><span class="line">      <span class="nt">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;http&quot;</span><span class="p">,</span>
</span><span class="line">      <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;res&quot;</span><span class="p">,</span>
</span><span class="line">      <span class="nt">&quot;direction&quot;</span><span class="p">:</span> <span class="s2">&quot;out&quot;</span>
</span><span class="line">    <span class="p">}]</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Then add the <code>Suave</code> dependency in <code>project.json</code></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
</pre></td><td class="code"><pre><code class="json"><span class="line"><span class="p">{</span>
</span><span class="line">  <span class="nt">&quot;frameworks&quot;</span><span class="p">:</span> <span class="p">{</span>
</span><span class="line">    <span class="nt">&quot;net46&quot;</span><span class="p">:</span> <span class="p">{</span>
</span><span class="line">      <span class="nt">&quot;dependencies&quot;</span><span class="p">:</span> <span class="p">{</span>
</span><span class="line">        <span class="nt">&quot;Suave&quot;</span><span class="p">:</span> <span class="s2">&quot;1.1.3&quot;</span>
</span><span class="line">      <span class="p">}</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Let’s start simply by defining small API (system) that handles different types of HTTP methods.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// app.fsx</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Successful</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Operators</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Filters</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">app</span> <span class="o">=</span>
</span><span class="line">  <span class="n">choose</span> <span class="o">[</span>
</span><span class="line">      <span class="n">GET</span> <span class="o">&gt;=&gt;</span> <span class="n">OK</span> <span class="s">&quot;GET test&quot;</span>
</span><span class="line">      <span class="n">POST</span> <span class="o">&gt;=&gt;</span> <span class="n">OK</span> <span class="s">&quot;POST test&quot;</span>
</span><span class="line">      <span class="n">PUT</span> <span class="o">&gt;=&gt;</span> <span class="n">OK</span> <span class="s">&quot;PUT test&quot;</span>
</span><span class="line">      <span class="n">DELETE</span> <span class="o">&gt;=&gt;</span> <span class="n">OK</span> <span class="s">&quot;DELETE test&quot;</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The final step is referring the <code>SuaveAdapter.fsx</code> &amp; <code>app.fsx</code> files in the <code>run.fsx</code> and have fun!</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// run.fsx</span>
</span><span class="line"><span class="o">#</span><span class="n">load</span> <span class="s">&quot;SuaveAdapter.fsx&quot;</span>
</span><span class="line"><span class="o">#</span><span class="n">load</span> <span class="s">&quot;app.fsx&quot;</span>
</span><span class="line"><span class="k">open</span> <span class="nn">SuaveAdapter</span>
</span><span class="line"><span class="k">open</span> <span class="nn">App</span>
</span><span class="line"><span class="k">open</span> <span class="nn">System.Net.Http</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">Run</span> <span class="o">(</span><span class="n">req</span> <span class="o">:</span> <span class="n">HttpRequestMessage</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">res</span><span class="o">,</span> <span class="o">_</span> <span class="o">=</span> <span class="n">RunWebPartAsync</span> <span class="n">app</span> <span class="n">req</span> <span class="o">|&gt;</span> <span class="nn">Async</span><span class="p">.</span><span class="n">RunSynchronously</span>
</span><span class="line">  <span class="n">res</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Let’s make some HTTP requests to test our implementation.</p>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/AzureFunctionsSuave/HelloSuaveRequests.png" width="700" height="500" /></p>

<p>Suave is rocking!</p>

<h2 id="creating-a-rest-api-in-azure-functions">Creating a REST API in Azure Functions</h2>

<p>We can extend the above example to expose a REST end point!</p>

<p>In Suave <em>a REST API</em> is a <strong>function</strong>.</p>

<p>Create a new Azure Function <code>HelloREST</code> and add <code>NewtonSoft.Json</code> &amp; <code>Suave</code> dependencies in <code>project.json</code></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
</pre></td><td class="code"><pre><code class="json"><span class="line"><span class="p">{</span>
</span><span class="line">  <span class="nt">&quot;frameworks&quot;</span><span class="p">:</span> <span class="p">{</span>
</span><span class="line">    <span class="nt">&quot;net46&quot;</span><span class="p">:</span> <span class="p">{</span>
</span><span class="line">      <span class="nt">&quot;dependencies&quot;</span><span class="p">:</span> <span class="p">{</span>
</span><span class="line">        <span class="nt">&quot;Suave&quot;</span><span class="p">:</span> <span class="s2">&quot;1.1.3&quot;</span><span class="p">,</span>
</span><span class="line">        <span class="nt">&quot;NewtonSoft.Json&quot;</span> <span class="p">:</span> <span class="s2">&quot;9.0.1&quot;</span>
</span><span class="line">      <span class="p">}</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>To handle <em>JSON</em> requests and responses, let’s add some combinators</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
<span class="line-number">32</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// Suave.Newtonsoft.Json.fsx</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Newtonsoft.Json</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Newtonsoft.Json.Serialization</span>
</span><span class="line"><span class="k">open</span> <span class="nn">System.Text</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Json</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Http</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Operators</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">toJson</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">T</span><span class="o">&gt;</span> <span class="o">(</span><span class="n">o</span><span class="o">:</span> <span class="k">&#39;</span><span class="n">T</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">settings</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JsonSerializerSettings</span><span class="bp">()</span>
</span><span class="line">  <span class="n">settings</span><span class="o">.</span><span class="n">ContractResolver</span> <span class="o">&lt;-</span> <span class="k">new</span> <span class="n">CamelCasePropertyNamesContractResolver</span><span class="bp">()</span>
</span><span class="line">  <span class="nn">JsonConvert</span><span class="p">.</span><span class="n">SerializeObject</span><span class="o">(</span><span class="n">o</span><span class="o">,</span> <span class="n">settings</span><span class="o">)</span>
</span><span class="line">  <span class="o">|&gt;</span> <span class="nn">Encoding</span><span class="p">.</span><span class="nn">UTF8</span><span class="p">.</span><span class="n">GetBytes</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">fromJson</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">T</span><span class="o">&gt;</span> <span class="o">(</span><span class="n">bytes</span> <span class="o">:</span> <span class="kt">byte</span> <span class="bp">[]</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">json</span> <span class="o">=</span> <span class="nn">Encoding</span><span class="p">.</span><span class="nn">UTF8</span><span class="p">.</span><span class="n">GetString</span> <span class="n">bytes</span>
</span><span class="line">  <span class="nn">JsonConvert</span><span class="p">.</span><span class="n">DeserializeObject</span><span class="o">(</span><span class="n">json</span><span class="o">,</span> <span class="n">typeof</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">T</span><span class="o">&gt;)</span> <span class="o">:?&gt;</span> <span class="k">&#39;</span><span class="n">T</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">mapJsonWith</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">TIn</span><span class="o">,</span> <span class="k">&#39;</span><span class="n">TOut</span><span class="o">&gt;</span>
</span><span class="line">  <span class="o">(</span><span class="n">deserializer</span><span class="o">:</span><span class="kt">byte</span><span class="bp">[]</span> <span class="o">-&gt;</span> <span class="k">&#39;</span><span class="n">TIn</span><span class="o">)</span> <span class="o">(</span><span class="n">serializer</span><span class="o">:</span><span class="k">&#39;</span><span class="n">TOut</span><span class="o">-&gt;</span><span class="kt">byte</span><span class="bp">[]</span><span class="o">)</span> <span class="n">webpart</span> <span class="n">f</span> <span class="o">=</span>
</span><span class="line">  <span class="n">request</span><span class="o">(</span><span class="k">fun</span> <span class="n">r</span> <span class="o">-&gt;</span>
</span><span class="line">    <span class="n">f</span> <span class="o">(</span><span class="n">deserializer</span> <span class="n">r</span><span class="o">.</span><span class="n">rawForm</span><span class="o">)</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="n">serializer</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="n">webpart</span>
</span><span class="line">    <span class="o">&gt;=&gt;</span> <span class="nn">Writers</span><span class="p">.</span><span class="n">setMimeType</span> <span class="s">&quot;application/json&quot;</span><span class="o">)</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">MapJson</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">T1</span><span class="o">,</span><span class="k">&#39;</span><span class="n">T2</span><span class="o">&gt;</span> <span class="n">webpart</span> <span class="o">=</span>
</span><span class="line">  <span class="n">mapJsonWith</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">T1</span><span class="o">,</span><span class="k">&#39;</span><span class="n">T2</span><span class="o">&gt;</span> <span class="n">fromJson</span> <span class="n">toJson</span> <span class="n">webpart</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">ToJson</span> <span class="n">webpart</span> <span class="n">x</span>  <span class="o">=</span>
</span><span class="line">  <span class="n">toJson</span> <span class="n">x</span> <span class="o">|&gt;</span> <span class="n">webpart</span> <span class="o">&gt;=&gt;</span> <span class="nn">Writers</span><span class="p">.</span><span class="n">setMimeType</span> <span class="s">&quot;application/json&quot;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Then define the REST api in <code>app.fsx</code></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
<span class="line-number">32</span>
<span class="line-number">33</span>
<span class="line-number">34</span>
<span class="line-number">35</span>
<span class="line-number">36</span>
<span class="line-number">37</span>
<span class="line-number">38</span>
<span class="line-number">39</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="o">#</span><span class="n">load</span> <span class="s">&quot;Suave.Newtonsoft.Json.fsx&quot;</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Successful</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Operators</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Filters</span>
</span><span class="line"><span class="k">open</span> <span class="nn">System</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Newtonsoft.Json</span>
</span><span class="line">
</span><span class="line"><span class="k">type</span> <span class="nc">Person</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">Id</span> <span class="o">:</span> <span class="n">Guid</span>
</span><span class="line">  <span class="n">Name</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line">  <span class="n">Email</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">createPerson</span> <span class="n">person</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">newPerson</span> <span class="o">=</span> <span class="o">{</span><span class="n">person</span> <span class="k">with</span> <span class="n">Id</span> <span class="o">=</span> <span class="nn">Guid</span><span class="p">.</span><span class="n">NewGuid</span><span class="bp">()</span><span class="o">}</span>
</span><span class="line">  <span class="n">newPerson</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">getPeople</span> <span class="bp">()</span> <span class="o">=</span> <span class="o">[</span>
</span><span class="line">  <span class="o">{</span><span class="n">Id</span> <span class="o">=</span> <span class="nn">Guid</span><span class="p">.</span><span class="n">NewGuid</span><span class="bp">()</span><span class="o">;</span> <span class="n">Name</span> <span class="o">=</span> <span class="s">&quot;john&quot;</span><span class="o">;</span> <span class="n">Email</span> <span class="o">=</span> <span class="s">&quot;j@g.co&quot;</span><span class="o">}</span>
</span><span class="line">  <span class="o">{</span><span class="n">Id</span> <span class="o">=</span> <span class="nn">Guid</span><span class="p">.</span><span class="n">NewGuid</span><span class="bp">()</span><span class="o">;</span> <span class="n">Name</span> <span class="o">=</span> <span class="s">&quot;mark&quot;</span><span class="o">;</span> <span class="n">Email</span> <span class="o">=</span> <span class="s">&quot;m@g.co&quot;</span><span class="o">}]</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">getPersonById</span> <span class="n">id</span> <span class="o">=</span>
</span><span class="line">  <span class="o">{</span><span class="n">Id</span> <span class="o">=</span> <span class="nn">Guid</span><span class="p">.</span><span class="n">Parse</span><span class="o">(</span><span class="n">id</span><span class="o">);</span> <span class="n">Name</span> <span class="o">=</span> <span class="s">&quot;john&quot;</span><span class="o">;</span> <span class="n">Email</span> <span class="o">=</span> <span class="s">&quot;j@g.co&quot;</span><span class="o">}</span>
</span><span class="line">  <span class="o">|&gt;</span> <span class="n">ToJson</span> <span class="n">ok</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">deletePersonById</span> <span class="n">id</span> <span class="o">=</span>
</span><span class="line">  <span class="n">sprintf</span> <span class="s">&quot;person %s deleted&quot;</span> <span class="n">id</span> <span class="o">|&gt;</span> <span class="n">OK</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">app</span> <span class="o">=</span>
</span><span class="line">  <span class="n">choose</span> <span class="o">[</span>
</span><span class="line">    <span class="n">path</span> <span class="s">&quot;/people&quot;</span> <span class="o">&gt;=&gt;</span> <span class="n">choose</span> <span class="o">[</span>
</span><span class="line">      <span class="n">POST</span> <span class="o">&gt;=&gt;</span> <span class="n">MapJson</span> <span class="n">created</span> <span class="n">createPerson</span>
</span><span class="line">      <span class="n">GET</span> <span class="o">&gt;=&gt;</span> <span class="n">ToJson</span> <span class="n">ok</span> <span class="o">(</span><span class="n">getPeople</span> <span class="bp">()</span><span class="o">)</span>
</span><span class="line">      <span class="n">PUT</span> <span class="o">&gt;=&gt;</span> <span class="n">MapJson</span> <span class="n">accepted</span> <span class="n">id</span>
</span><span class="line">    <span class="o">]</span>
</span><span class="line">    <span class="n">GET</span> <span class="o">&gt;=&gt;</span> <span class="n">pathScan</span> <span class="s">&quot;/people/%s&quot;</span> <span class="n">getPersonById</span>
</span><span class="line">    <span class="n">DELETE</span> <span class="o">&gt;=&gt;</span> <span class="n">pathScan</span> <span class="s">&quot;/people/%s&quot;</span> <span class="n">deletePersonById</span>
</span><span class="line">  <span class="o">]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
<blockquote>
  <p>To keep things simple, I am hard coding the values here. It can easily be extended to talk to any data source</p>
</blockquote>

<p>Our <code>SuaveAdapter</code> has capable of handling different HTTP methods and but it hasn’t been programmed to deal with different paths.</p>

<p>Here in this example we need to support two separate paths</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="n">GET</span> <span class="o">/</span><span class="n">people</span>
</span><span class="line"><span class="n">GET</span> <span class="o">/</span><span class="n">people</span><span class="o">/</span><span class="n">feafa5b5</span><span class="o">-</span><span class="mi">304</span><span class="n">d</span><span class="o">-</span><span class="mi">455</span><span class="n">e</span><span class="o">-</span><span class="n">b7e7</span><span class="o">-</span><span class="mi">13</span><span class="n">a5b3293f77</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The HTTP endpoint to call an Azure function has the format</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="n">https</span><span class="o">:</span><span class="c1">//{azure-function-app-name}.azurewebsites.net/api/{function-name}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>At this point of writing it doesn’t support multiple paths. So, we need to find a workaround to do it.</p>

<p>One way achieving this is to pass the <em>paths</em> as a Header. Let’s name the Header key as <code>X-Suave-URL</code>. Upon receiving the request we can rewrite the URL as</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="n">https</span><span class="o">:</span><span class="c1">//{azure-function-app-name}.azurewebsites.net/{header-value-of-X-Suave-URL}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Let’s update <code>SuaveAdapter.fsx</code> to do this</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">RunWebPartWithPathAsync</span> <span class="n">app</span> <span class="n">httpRequest</span> <span class="o">=</span> <span class="n">async</span> <span class="o">{</span>
</span><span class="line">  <span class="k">let!</span> <span class="nv">suaveContext</span> <span class="o">=</span> <span class="n">SuaveContext</span> <span class="n">httpRequest</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">netHeaderValue</span> <span class="o">=</span> <span class="n">NetHeaderValue</span> <span class="n">httpRequest</span><span class="o">.</span><span class="n">Headers</span>
</span><span class="line">  <span class="k">match</span> <span class="n">netHeaderValue</span> <span class="s">&quot;X-Suave-URL&quot;</span><span class="o">,</span> <span class="n">netHeaderValue</span> <span class="s">&quot;Host&quot;</span>  <span class="k">with</span>
</span><span class="line">  <span class="o">|</span> <span class="n">Some</span> <span class="n">suaveUrl</span><span class="o">,</span> <span class="n">Some</span> <span class="n">host</span> <span class="o">-&gt;</span>
</span><span class="line">    <span class="k">let</span> <span class="nv">url</span> <span class="o">=</span> <span class="n">sprintf</span> <span class="s">&quot;https://%s%s&quot;</span> <span class="n">host</span> <span class="n">suaveUrl</span> <span class="o">|&gt;</span> <span class="nn">System</span><span class="p">.</span><span class="n">Uri</span>
</span><span class="line">    <span class="k">let</span> <span class="nv">ctx</span> <span class="o">=</span> <span class="o">{</span><span class="n">suaveContext</span> <span class="k">with</span>
</span><span class="line">                <span class="n">request</span> <span class="o">=</span> <span class="o">{</span><span class="n">suaveContext</span><span class="o">.</span><span class="n">request</span> <span class="k">with</span>
</span><span class="line">                            <span class="n">url</span> <span class="o">=</span> <span class="n">url</span>
</span><span class="line">                            <span class="n">rawQuery</span> <span class="o">=</span> <span class="n">SuaveRawQuery</span> <span class="n">url</span><span class="o">}}</span>
</span><span class="line">    <span class="k">return</span><span class="o">!</span> <span class="n">SuaveRunAsync</span> <span class="n">app</span> <span class="n">ctx</span>
</span><span class="line">  <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="k">return</span><span class="o">!</span> <span class="n">SuaveRunAsync</span> <span class="n">app</span> <span class="n">suaveContext</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The final step is updating the <code>run.fsx</code> file to use this new function</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="o">#</span><span class="n">load</span> <span class="s">&quot;SuaveAdapter.fsx&quot;</span>
</span><span class="line"><span class="o">#</span><span class="n">load</span> <span class="s">&quot;app.fsx&quot;</span>
</span><span class="line"><span class="k">open</span> <span class="nn">SuaveAdapter</span>
</span><span class="line"><span class="k">open</span> <span class="nn">App</span>
</span><span class="line"><span class="k">open</span> <span class="nn">System.Net.Http</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">Run</span> <span class="o">(</span><span class="n">req</span> <span class="o">:</span> <span class="n">HttpRequestMessage</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">res</span><span class="o">,</span> <span class="o">_</span> <span class="o">=</span> <span class="n">RunWebPartWithPathAsync</span> <span class="n">app</span> <span class="n">req</span> <span class="o">|&gt;</span> <span class="nn">Async</span><span class="p">.</span><span class="n">RunSynchronously</span>
</span><span class="line">  <span class="n">res</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p><strong>Serverless REST API in Action</strong></p>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/AzureFunctionsSuave/HelloRestRequests.jpeg" /></p>

<blockquote>
  <p>This blog post is a proof of concept to use Suave in Azure Functions. There are a lot of improvements to be made to make it production ready. I am planning to publish this as a NuGet package based on the feedback from the community.</p>
</blockquote>

<p><strong>Update</strong> : <a href="https://www.nuget.org/packages/Suave.Azure.Functions">Suave.Azure.Functions</a> is available now as a Nuget Package</p>

<h2 id="summary">Summary</h2>

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">&quot;F# is a general purpose language, not just a science, or data science language.&quot; <a href="https://twitter.com/tomaspetricek">@tomaspetricek</a> <a href="https://twitter.com/hashtag/ndcoslo?src=hash">#ndcoslo</a> <a href="https://twitter.com/hashtag/fsharp?src=hash">#fsharp</a></p>&mdash; Bryan Hunter (@bryan_hunter) <a href="https://twitter.com/bryan_hunter/status/741164339747520514">June 10, 2016</a></blockquote>

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">*PLEASE* Microsoft, stop saying <a href="https://twitter.com/hashtag/fsharp?src=hash">#fsharp</a> is great for &quot;financial applications and stuff like that&quot;. It&#39;s a bloody general purpose language.</p>&mdash; Isaac Abraham (@isaac_abraham) <a href="https://twitter.com/isaac_abraham/status/740209486359605248">June 7, 2016</a></blockquote>

<p>The complete source code is available in <a href="https://github.com/tamizhvendan/TamAzureFun">my GitHub repository</a>.</p>

<h2 id="are-you-interested-in-learning-more-about-f">Are you interested in learning more about F#?</h2>

<p>I’m delighted to share that I’m running a tutorial at <a href="https://skillsmatter.com/conferences/7431-progressive-f-sharp-tutorials-2016">Progressive F# Tutorials 2016</a>, London on Dec 5, 2016. I’m excited to share my experiences with Suave and help developers to understand this wonderful F# library.</p>

<p>The Progressive F# Tutorials offer hands-on learning for every skill set and is led by some of the best experts in F# and functional programming</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Expressing Business Logic with F#'s Partial Active Patterns]]></title>
    <link href="http://blog.tamizhvendan.in/blog/2016/04/28/expressing-business-logic-with-f-number-s-partial-active-patterns/"/>
    <updated>2016-04-28T20:16:14+05:30</updated>
    <id>http://blog.tamizhvendan.in/blog/2016/04/28/expressing-business-logic-with-f-number-s-partial-active-patterns</id>
    <content type="html"><![CDATA[<p>Checking the state of the system and performing a requested action only if certain conditions met, is an indispensable requirement in most of the software we write. Though it is a straightforward thing to do, things will get complex/messier when we need to check multiple conditions.</p>

<p>Recently I encountered such a situation while developing a sample application for <a href="https://twitter.com/tamizhvendan/status/713365205871235072">my fsharp book</a>. Initially, I solved it with a typical nested <code>if else</code> and then I improved it by applying fsharp’s <a href="http://www.developerfusion.com/article/133772/pattern-matching-in-f-part-2-active-patterns/">Partial Active Patterns</a>.</p>

<p>In this blog post , I will be sharing what exactly I did and how it can help you to write an elegant code in fsharp.</p>

<h2 id="business-domain">Business Domain</h2>

<p>Let’s start with a description of the problem domain that we are going to solve.</p>

<p>When an individual visits a restaurant, he can place an order, specifying the list of foods he wants. The foods he ordered will be prepared by the chef and then it will be served.</p>

<p>Preparing a food should satisfy the following conditions</p>

<ul>
  <li>The Food should be a part of the order</li>
  <li>It should not be prepared already</li>
  <li>It should not be served already</li>
</ul>

<p>Serving a food should satisfy the following conditions</p>

<ul>
  <li>The Food should be a part of the order</li>
  <li>It should be prepared already</li>
  <li>It should not be served already</li>
</ul>

<p>If serving a food completes the order, we should tell that the order is served otherwise we should tell that there are some other foods to be served.</p>

<h2 id="starting-with-the-types">Starting with the types</h2>

<p>Let’s start with the types that are needed to solve our problem. If you would like to know why we need to start with the types do check out <a href="http://tomasp.net/blog/type-first-development.aspx/">this wonderful blog post</a> by <a href="https://twitter.com/tomaspetricek">Tomas Petricek</a>.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">type</span> <span class="nc">Food</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">MenuNumber</span> <span class="o">:</span> <span class="n">int</span>
</span><span class="line">  <span class="n">Name</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="k">type</span> <span class="nc">Order</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">Foods</span> <span class="o">:</span> <span class="n">Food</span> <span class="kt">list</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="k">type</span> <span class="nc">InProgressOrder</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">PlacedOrder</span> <span class="o">:</span> <span class="n">Order</span>
</span><span class="line">  <span class="n">PreparedFoods</span> <span class="o">:</span> <span class="n">Food</span> <span class="kt">list</span>
</span><span class="line">  <span class="n">ServedFoods</span> <span class="o">:</span> <span class="n">Food</span> <span class="kt">list</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The names of the types and its properties clearly describe what they represent, so let’s get to the crux of the problem straight</p>

<h2 id="prepare-food">Prepare Food</h2>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">prepareFood</span> <span class="n">food</span> <span class="n">ipo</span> <span class="o">=</span>
</span><span class="line">  <span class="k">if</span> <span class="nn">List</span><span class="p">.</span><span class="n">contains</span> <span class="n">food</span> <span class="n">ipo</span><span class="o">.</span><span class="n">PlacedOrder</span><span class="o">.</span><span class="n">Foods</span>  <span class="k">then</span>
</span><span class="line">    <span class="k">if</span> <span class="ow">not</span> <span class="o">(</span><span class="nn">List</span><span class="p">.</span><span class="n">contains</span> <span class="n">food</span> <span class="n">ipo</span><span class="o">.</span><span class="n">PreparedFoods</span><span class="o">)</span> <span class="k">then</span>
</span><span class="line">      <span class="k">if</span> <span class="ow">not</span> <span class="o">(</span><span class="nn">List</span><span class="p">.</span><span class="n">contains</span> <span class="n">food</span> <span class="n">ipo</span><span class="o">.</span><span class="n">ServedFoods</span><span class="o">)</span> <span class="k">then</span>
</span><span class="line">          <span class="n">printfn</span> <span class="s">&quot;Prepare Food&quot;</span>
</span><span class="line">      <span class="k">else</span>
</span><span class="line">        <span class="n">printfn</span> <span class="s">&quot;Can not prepare already served food&quot;</span>
</span><span class="line">    <span class="k">else</span>
</span><span class="line">      <span class="n">printfn</span> <span class="s">&quot;Can not prepare already prepared food&quot;</span>
</span><span class="line">  <span class="k">else</span>
</span><span class="line">    <span class="n">printfn</span> <span class="s">&quot;Can not prepare non ordered food&quot;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <code>if else</code> conditions represent the criteria mentioned in the business domain and for the sake of simplicity we are just writing the action in the console.</p>

<h2 id="serve-food">Serve Food</h2>

<p>Let’s move on to serving food</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">isServingFoodCompletesOrder</span> <span class="n">food</span> <span class="n">ipo</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">nonServedFoods</span> <span class="o">=</span>
</span><span class="line">    <span class="nn">List</span><span class="p">.</span><span class="n">except</span> <span class="n">ipo</span><span class="o">.</span><span class="n">ServedFoods</span> <span class="n">ipo</span><span class="o">.</span><span class="n">PlacedOrder</span><span class="o">.</span><span class="n">Foods</span>
</span><span class="line">  <span class="n">nonServedFoods</span> <span class="o">=</span> <span class="o">[</span><span class="n">food</span><span class="o">]</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">serveFood</span> <span class="n">food</span> <span class="n">ipo</span> <span class="o">=</span>
</span><span class="line">  <span class="k">if</span> <span class="nn">List</span><span class="p">.</span><span class="n">contains</span> <span class="n">food</span> <span class="n">ipo</span><span class="o">.</span><span class="n">PlacedOrder</span><span class="o">.</span><span class="n">Foods</span>  <span class="k">then</span>
</span><span class="line">    <span class="k">if</span> <span class="nn">List</span><span class="p">.</span><span class="n">contains</span> <span class="n">food</span> <span class="n">ipo</span><span class="o">.</span><span class="n">PreparedFoods</span> <span class="k">then</span>
</span><span class="line">      <span class="k">if</span> <span class="ow">not</span> <span class="o">(</span><span class="nn">List</span><span class="p">.</span><span class="n">contains</span> <span class="n">food</span> <span class="n">ipo</span><span class="o">.</span><span class="n">ServedFoods</span><span class="o">)</span> <span class="k">then</span>
</span><span class="line">        <span class="k">if</span> <span class="n">isServingFoodCompletesOrder</span> <span class="n">food</span> <span class="n">ipo</span> <span class="k">then</span>
</span><span class="line">          <span class="n">printfn</span> <span class="s">&quot;Order Served&quot;</span>
</span><span class="line">        <span class="k">else</span>
</span><span class="line">          <span class="n">printfn</span> <span class="s">&quot;Still some food(s) to serve&quot;</span>
</span><span class="line">      <span class="k">else</span>
</span><span class="line">        <span class="n">printfn</span> <span class="s">&quot;Can not serve already served food&quot;</span>
</span><span class="line">    <span class="k">else</span>
</span><span class="line">      <span class="n">printfn</span> <span class="s">&quot;Can not serve unprepared food&quot;</span>
</span><span class="line">  <span class="k">else</span>
</span><span class="line">    <span class="n">printfn</span> <span class="s">&quot;Can not serve non ordered food&quot;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>This is called <a href="http://c2.com/cgi/wiki?ArrowAntiPattern">Arrow Anti Pattern</a> and it is obvious that this code is hard to understand and maintain.</p>

<p>It can be improved by using the techniques mentioned <a href="http://programmers.stackexchange.com/questions/47789/how-would-you-refactor-nested-if-statements">in this StackExchange’s answers</a> and also by using the <a href="https://en.wikipedia.org/wiki/Specification_pattern">specification pattern</a> from the OO World.</p>

<p>Though the specification pattern solves the problem, it has a lot of code! No offense here but it can be done in a better way.</p>

<h2 id="f-active-patterns">F# Active Patterns</h2>

<blockquote>
  <p>Active Patterns allow programmers to wrap arbitrary values in a union-like data structure for easy pattern matching. For example, its possible wrap objects with an active pattern, so that you can use objects in pattern matching as easily as any other union type. - <a href="https://en.wikibooks.org/wiki/F_Sharp_Programming/Active_Patterns">F# Programming Wiki</a></p>
</blockquote>

<p>Let’s begin by defining a partial active pattern for <code>NonOrderedFood</code> and <code>UnPreparedFood</code></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="o">(|</span><span class="n">NonOrderedFood</span><span class="o">|_|)</span> <span class="n">order</span> <span class="n">food</span> <span class="o">=</span>
</span><span class="line">  <span class="k">match</span> <span class="nn">List</span><span class="p">.</span><span class="n">contains</span> <span class="n">food</span> <span class="n">order</span><span class="o">.</span><span class="n">Foods</span> <span class="k">with</span>
</span><span class="line">  <span class="o">|</span> <span class="k">false</span> <span class="o">-&gt;</span> <span class="n">Some</span> <span class="n">food</span>
</span><span class="line">  <span class="o">|</span> <span class="k">true</span> <span class="o">-&gt;</span> <span class="n">None</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="o">(|</span><span class="n">UnPreparedFood</span><span class="o">|_|)</span> <span class="n">ipo</span> <span class="n">food</span> <span class="o">=</span>
</span><span class="line">  <span class="k">match</span> <span class="nn">List</span><span class="p">.</span><span class="n">contains</span> <span class="n">food</span> <span class="n">ipo</span><span class="o">.</span><span class="n">PreparedFoods</span> <span class="k">with</span>
</span><span class="line">  <span class="o">|</span> <span class="k">false</span> <span class="o">-&gt;</span> <span class="n">Some</span> <span class="n">food</span>
</span><span class="line">  <span class="o">|</span> <span class="k">true</span> <span class="o">-&gt;</span> <span class="n">None</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Then for <code>AlreadyPreparedFood</code> and <code>AlreadyServedFood</code></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="o">(|</span><span class="n">AlreadyPreparedFood</span><span class="o">|_|)</span> <span class="n">ipo</span> <span class="n">food</span> <span class="o">=</span>
</span><span class="line">  <span class="k">match</span> <span class="nn">List</span><span class="p">.</span><span class="n">contains</span> <span class="n">food</span> <span class="n">ipo</span><span class="o">.</span><span class="n">PreparedFoods</span> <span class="k">with</span>
</span><span class="line">  <span class="o">|</span> <span class="k">true</span> <span class="o">-&gt;</span> <span class="n">Some</span> <span class="n">food</span>
</span><span class="line">  <span class="o">|</span> <span class="k">false</span> <span class="o">-&gt;</span> <span class="n">None</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="o">(|</span><span class="n">AlreadyServedFood</span><span class="o">|_|)</span> <span class="n">ipo</span> <span class="n">food</span> <span class="o">=</span>
</span><span class="line">  <span class="k">match</span> <span class="nn">List</span><span class="p">.</span><span class="n">contains</span> <span class="n">food</span> <span class="n">ipo</span><span class="o">.</span><span class="n">ServedFoods</span> <span class="k">with</span>
</span><span class="line">  <span class="o">|</span> <span class="k">true</span> <span class="o">-&gt;</span> <span class="n">Some</span> <span class="n">food</span>
</span><span class="line">  <span class="o">|</span> <span class="k">false</span> <span class="o">-&gt;</span> <span class="n">None</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Finally,</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="o">(|</span><span class="n">CompletesOrder</span><span class="o">|_|)</span> <span class="n">ipo</span> <span class="n">food</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">nonServedFoods</span> <span class="o">=</span>
</span><span class="line">    <span class="nn">List</span><span class="p">.</span><span class="n">except</span> <span class="n">ipo</span><span class="o">.</span><span class="n">ServedFoods</span> <span class="n">ipo</span><span class="o">.</span><span class="n">PlacedOrder</span><span class="o">.</span><span class="n">Foods</span>
</span><span class="line">  <span class="k">match</span> <span class="n">nonServedFoods</span> <span class="o">=</span> <span class="o">[</span><span class="n">food</span><span class="o">]</span> <span class="k">with</span>
</span><span class="line">  <span class="o">|</span> <span class="k">true</span> <span class="o">-&gt;</span> <span class="n">Some</span> <span class="n">food</span>
</span><span class="line">  <span class="o">|</span> <span class="k">false</span> <span class="o">-&gt;</span> <span class="n">None</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>With this in place we can rewrite <code>serveFood</code> function as</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">serveFood</span> <span class="n">food</span> <span class="n">ipo</span> <span class="o">=</span>
</span><span class="line">  <span class="k">match</span> <span class="n">food</span> <span class="k">with</span>
</span><span class="line">  <span class="o">|</span> <span class="n">NonOrderedFood</span> <span class="n">ipo</span><span class="o">.</span><span class="n">PlacedOrder</span> <span class="o">_</span> <span class="o">-&gt;</span>
</span><span class="line">    <span class="n">printfn</span> <span class="s">&quot;Can not serve non ordered food&quot;</span>
</span><span class="line">  <span class="o">|</span> <span class="n">UnPreparedFood</span> <span class="n">ipo</span> <span class="o">_</span> <span class="o">-&gt;</span>
</span><span class="line">    <span class="n">printfn</span> <span class="s">&quot;Can not serve unprepared food&quot;</span>
</span><span class="line">  <span class="o">|</span> <span class="n">AlreadyServedFood</span> <span class="n">ipo</span> <span class="o">_</span> <span class="o">-&gt;</span>
</span><span class="line">    <span class="n">printfn</span> <span class="s">&quot;Can not serve already served food&quot;</span>
</span><span class="line">  <span class="o">|</span> <span class="n">CompletesOrder</span> <span class="n">ipo</span> <span class="o">_</span> <span class="o">-&gt;</span>
</span><span class="line">    <span class="n">printfn</span> <span class="s">&quot;Order Served&quot;</span>
</span><span class="line">  <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">printfn</span> <span class="s">&quot;Still some food(s) to serve&quot;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<blockquote>
  <p>The goal is to have code that scrolls vertically a lot… but not so much horizontally. - <a href="http://blog.codinghorror.com/flattening-arrow-code/">Jeff Atwood</a></p>
</blockquote>

<p>Now the code expressing the business logic more clearly</p>

<p>To refactor <code>prepareFood</code> to use the parial active patterns we need one more. So, let’s define it</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="o">(|</span><span class="n">PreparedFood</span><span class="o">|_|)</span> <span class="n">ipo</span> <span class="n">food</span> <span class="o">=</span>
</span><span class="line">  <span class="k">match</span> <span class="nn">List</span><span class="p">.</span><span class="n">contains</span> <span class="n">food</span> <span class="n">ipo</span><span class="o">.</span><span class="n">PreparedFoods</span> <span class="k">with</span>
</span><span class="line">  <span class="o">|</span> <span class="k">true</span> <span class="o">-&gt;</span> <span class="n">Some</span> <span class="n">food</span>
</span><span class="line">  <span class="o">|</span> <span class="k">false</span> <span class="o">-&gt;</span> <span class="n">None</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Now we all set to refactor <code>prepareFood</code> and here we go</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">prepareFood</span> <span class="n">food</span> <span class="n">ipo</span> <span class="o">=</span>
</span><span class="line">  <span class="k">match</span> <span class="n">food</span> <span class="k">with</span>
</span><span class="line">  <span class="o">|</span> <span class="n">NonOrderedFood</span> <span class="n">ipo</span><span class="o">.</span><span class="n">PlacedOrder</span> <span class="o">_</span> <span class="o">-&gt;</span>
</span><span class="line">    <span class="n">printfn</span> <span class="s">&quot;Can not prepare non ordered food&quot;</span>
</span><span class="line">  <span class="o">|</span> <span class="n">PreparedFood</span> <span class="n">ipo</span> <span class="o">_</span> <span class="o">-&gt;</span>
</span><span class="line">    <span class="n">printfn</span> <span class="s">&quot;Can not prepare already prepared food&quot;</span>
</span><span class="line">  <span class="o">|</span> <span class="n">AlreadyServedFood</span> <span class="n">ipo</span> <span class="o">_</span> <span class="o">-&gt;</span>
</span><span class="line">    <span class="n">printfn</span> <span class="s">&quot;Can not prepare already served food&quot;</span>
</span><span class="line">  <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">printfn</span> <span class="s">&quot;Prepare Food&quot;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Awesome!</p>

<p>You can get the complete code in <a href="https://github.com/tamizhvendan/blog-samples/tree/master/RefactoringIfElse/src">my github repository</a></p>

<h2 id="summary">Summary</h2>

<blockquote>
  <p>F# is excellent at concisely expressing business and domain logic - <a href="https://www.thoughtworks.com/radar/languages-and-frameworks/f">ThoughtWorks Tech Radar 2012</a></p>
</blockquote>

<h3 id="related-posts">Related Posts</h3>

<p><a href="http://blog.tamizhvendan.in/blog/2015/04/02/step-10-refactoring-composition-root/">Refactoring Composition Root</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Keep it Simple]]></title>
    <link href="http://blog.tamizhvendan.in/blog/2016/02/01/keep-it-simple/"/>
    <updated>2016-02-01T15:51:46+05:30</updated>
    <id>http://blog.tamizhvendan.in/blog/2016/02/01/keep-it-simple</id>
    <content type="html"><![CDATA[<p>Last week, I was working on a task which involves populating some PostgreSQL database tables from CSV files. Though this is a straight forward work, I’ve encountered an interesting approach while manipulating a CSV file to adhere some changes in the database schema. In this blog post, I will be sharing what it is and how it made me think better.</p>

<p>Unlike my other blog posts, this post is more on the thought process behind my approach than the code.</p>

<h3 id="the-story">The Story</h3>

<p>The CSV file that we suppose to import to a database table has the following Structure with 1000 rows</p>

<div class="bogus-wrapper"><notextile><figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class=""><span class="line">code,value
</span><span class="line">XAS,0.23
</span><span class="line">SDR,3.21
</span><span class="line">WFZ,1.87
</span><span class="line">........
</span><span class="line">........
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The column name <code>code</code> and <code>value</code> are just for illustration.</p>

<p>The Proposed schema change is introduce a new column called <code>year</code> with a fixed value <code>2015</code> for all the rows. So, the expected CSV file would like</p>

<div class="bogus-wrapper"><notextile><figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class=""><span class="line">year,code,value
</span><span class="line">2015,XAS,0.23
</span><span class="line">2015,SDR,3.21
</span><span class="line">2015,WFZ,1.87
</span><span class="line">........
</span><span class="line">........</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>A Very Simple Task</p>

<p>Now, How can we solve it?</p>

<h3 id="approach-1---dont-try-this-at-your-officehome">Approach 1 - Don’t try this at your office/home</h3>

<p>Let me start with an approach number one</p>

<blockquote>
  <p>Edit all the rows manually</p>
</blockquote>

<p>It is something that you never wanted to see/do. So, let me move on to the next approach without wasting any time here</p>

<h3 id="approach-2---leverage-your-programming-skill">Approach 2 - Leverage your programming skill</h3>

<blockquote>
  <p>Pick your favorite programming language and whack the CSV file  </p>
</blockquote>

<p>I believe this would be the approach that came to your mind when you read the problem statement. A typical programmer’s instinct!</p>

<p>So, you picked your programming language ‘X’, what would be the next steps</p>

<ul>
  <li>Open the IDE/Editor - <em>Wait for it to load!</em></li>
  <li>Create a Project - <em>if required and wait for it also to load!</em></li>
  <li>Start typing - <em>and your phone rings</em></li>
  <li>Refer library documentation - <em>or Refer Stackoverflow</em></li>
  <li>Compile - <em>and wait for it</em> - <em>Ignore this step and wait for a run-time error if your programming language is dynamic</em></li>
  <li>Execute - <em>A bug -&gt; Go to Google -&gt; Stack Overflow -&gt; Change the code -&gt; Start again</em></li>
  <li>You are done!</li>
</ul>

<p><em>I’ve exaggerated some things here. If you don’t agree with any steps, just ignore that step</em></p>

<p>After 2 to 15 minutes (based on your ability &amp; the ceremony of your programming language) you have solved the problem.</p>

<p>Is it really worth? Well, It depends on the context.</p>

<p>If there are lot of CSV files which require the same change or also few more like this will about to come in the near future, then this effort really makes sense</p>

<p>But, here it is only one file which requires the change. So, I feel it is a complex response to a simple problem</p>

<h3 id="approach-3---use-a-tool">Approach 3 - Use a tool</h3>

<blockquote>
  <p>Use a shiny CSV management tool to make the changes</p>
</blockquote>

<p>It is slightly better approach than the previous one but it also has its own downsides</p>

<ul>
  <li>Googling to find the tool</li>
  <li>Download it - <em>Your office firewall is blocking that site! / Registration on the tool site / Requires Java x.x version</em></li>
  <li>Open the CSV file.</li>
  <li>Refer the tool’s documentation</li>
  <li>Get the job done</li>
</ul>

<p>You can also Microsoft Excel to achieve this. But again a heavy solution to solve a simple problem!</p>

<p>There should be a simple approach! That’s what we are going to see next.</p>

<h3 id="approach-4---find-and-replace">Approach 4 - Find And Replace</h3>

<blockquote>
  <p>Just use Find and Replace in an advanced editor</p>
</blockquote>

<p>This approach involves just three steps</p>

<ul>
  <li>Open the CSV file in an advanced text editor (notepad++, atom, sublime text, etc.,)</li>
  <li>Select all the text and press <code>tab</code></li>
  <li>Open <code>Find and Replace</code>. Find for <code>tab</code> and replace it with <code>2015,</code></li>
</ul>

<p>That’s it!</p>

<h3 id="summary">Summary</h3>

<blockquote class="twitter-tweet" lang="en"><p lang="en" dir="ltr">The older I get, the more I realize the biggest problem to solve in tech is to get people to stop making things harder than they have to be.</p>&mdash; Chad Fowler (@chadfowler) <a href="https://twitter.com/chadfowler/status/646624348028190720">September 23, 2015</a></blockquote>
<script async="" src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Implementing API Gateway in F# using Rx and Suave]]></title>
    <link href="http://blog.tamizhvendan.in/blog/2015/12/29/implementing-api-gateway-in-f-number-using-rx-and-suave/"/>
    <updated>2015-12-29T09:22:49+05:30</updated>
    <id>http://blog.tamizhvendan.in/blog/2015/12/29/implementing-api-gateway-in-f-number-using-rx-and-suave</id>
    <content type="html"><![CDATA[<p>One of the impressive aspects of functional programming is that it will enable you to write simple and expressive code to solve  complex problems. If you are wondering, how is it possible? Well, It is because, Functional Programming provides a lot of higher level abstractions to solve the problem in hand and avoids the need of writing lot of boilerplate &amp; plumbing code. As a developer, you will be more productive and deliver the solution faster.</p>

<p>In this blog post, we are going to see the application of the above statements by implementing an <a href="https://www.nginx.com/blog/building-microservices-using-an-api-gateway">API Gateway Pattern</a> in F# using <a href="http://reactivex.io/">Rx</a> and <a href="https://suave.io/">Suave</a>.  </p>

<blockquote>
  <p>This blog post is my contribution towards <a href="https://sergeytihon.wordpress.com/2015/10/25/f-advent-calendar-in-english-2015/">fsharp advent calendar 2015</a>. Do check out other great fsharp posts there</p>
</blockquote>

<h2 id="api-gateway-pattern">API Gateway Pattern</h2>
<p>Let’s assume that you are asked to build the backend for the below GitHub user profile screen.</p>

<p><img src="http://res.cloudinary.com/tamizhvendan/image/upload/v1450769741/Profile.png" alt="Github Profile" /></p>

<p>This profile screen has 3 components</p>

<ol>
  <li>
    <p>User - Username and Avatar</p>
  </li>
  <li>
    <p>Popular Repos - Top 3 Repos of the Given User (determined by the number of stars)</p>
  </li>
  <li>
    <p>Languages being used in the corresponding repos</p>
  </li>
</ol>

<p>Now as a developer, you have two options</p>

<ul>
  <li>
    <p>Build the Profile completely in client side by calling their corresponding GitHub APIs
<img src="http://res.cloudinary.com/tamizhvendan/image/upload/v1450769816/Profile_With_API_Calls.png" alt="Profile with URLs" /></p>

    <p>This approach makes the client side complex as it involves five HTTP requests to create the complete profile screen. It has a lot of drawbacks as mentioned in <a href="http://techblog.netflix.com/2013/01/optimizing-netflix-api.html">this blog post</a> by Netflix.</p>
  </li>
  <li>
    <p>Create a Facade API which takes care of the heavy lifting and hides the complexity of calling multiple services by  exposing a single endpoint which returns all the data required to create the profile screen in one API call
<img src="http://res.cloudinary.com/tamizhvendan/image/upload/v1450775641/API_Gateway.png" alt="API Gateway" /></p>

    <p>This approach is called API Gateway. It is one of the commonly used <a href="http://microservices.io/patterns/apigateway.html">patterns in the microservices</a> world.</p>
  </li>
</ul>

<h2 id="rx">Rx</h2>

<p>API Gateway is normally implemented using <a href="http://reactivex.io/">Rx</a>. Rx, an implementation of <a href="https://gist.github.com/staltz/868e7e9bc2a7b8c1f754">Functional Reactive Programming</a>, makes it easy to implement this kind of problems by enable us to think each asynchronous operation as streams (aka Observables). These streams offer a declarative API to work with the asynchronous operations.</p>

<p>In the implementation that we are going to see, we will be using <a href="http://fsprojects.github.io/FSharp.Control.Reactive/">FSharp.Control.Reactive</a>, an extension and wrapper for using the Reactive Extensions (Rx) with F#</p>

<h2 id="project-structure">Project Structure</h2>

<p>Create a new F# Console Application Project with the name <code>RxFsharp</code> and then create the files mentioned below in the given order</p>

<div class="bogus-wrapper"><notextile><figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
</pre></td><td class="code"><pre><code class=""><span class="line">RxFsharp
</span><span class="line">|--Http.fs --&gt; Abstraction to make http requests
</span><span class="line">|--GitHub.fs --&gt; Define data types, transforming &amp; parsing of responses from GitHub
</span><span class="line">|--ObservableExtensions.fs --&gt; Some Util methods over Rx Observable
</span><span class="line">|--Profile.fs --&gt; Implemention of API Gateway using Rx
</span><span class="line">|--ApiGateway.fs --&gt; Suave API
</span><span class="line">|--Program.fs --&gt; Entry Point
</span><span class="line">|--user.json --&gt; Sample response of GitHub user API
</span><span class="line">|--repos.json --&gt; Sample response of GitHub repos API
</span><span class="line">|--App.config
</span><span class="line">|--packages.config</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Then install the following NuGet packages</p>

<ul>
  <li><a href="https://www.nuget.org/packages/FSharp.Control.Reactive">FSharp.Control.Reactive</a></li>
  <li><a href="https://www.nuget.org/packages/Http.fs">Http.fs</a></li>
  <li><a href="https://www.nuget.org/packages/Suave">Suave</a></li>
  <li><a href="https://www.nuget.org/packages/Newtonsoft.Json">Newtonsoft.Json</a></li>
  <li><a href="https://www.nuget.org/packages/FSharp.Data">FSharp.Data</a></li>
</ul>

<h2 id="modeling-http-request--response-as-stream">Modeling Http Request &amp; Response as Stream</h2>

<p>In Functional Reactive Programming(FRP) every action is treated as stream. So, first step in implementing an API Gateway is modeling each HTTP request&amp;response as stream.</p>

<p>Open <code>Http.fs</code> file and update it as below</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">module</span> <span class="nn">Http</span>
</span><span class="line">
</span><span class="line"><span class="k">open</span> <span class="nn">HttpClient</span>
</span><span class="line"><span class="k">open</span> <span class="nn">FSharp.Control.Reactive</span>
</span><span class="line">
</span><span class="line"><span class="k">type</span> <span class="nc">HttpResponse</span> <span class="o">=</span>
</span><span class="line"><span class="o">|</span> <span class="n">Ok</span> <span class="k">of</span> <span class="kt">string</span>
</span><span class="line"><span class="o">|</span> <span class="n">Error</span> <span class="k">of</span> <span class="n">int</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">getResponseAsync</span> <span class="n">url</span> <span class="o">=</span>
</span><span class="line">  <span class="n">async</span> <span class="o">{</span>
</span><span class="line">    <span class="k">let!</span> <span class="nv">response</span> <span class="o">=</span>
</span><span class="line">      <span class="n">createRequest</span> <span class="n">Get</span> <span class="n">url</span>
</span><span class="line">      <span class="o">|&gt;</span> <span class="n">withHeader</span> <span class="o">(</span><span class="n">UserAgent</span> <span class="s">&quot;FsharpRx&quot;</span><span class="o">)</span>
</span><span class="line">      <span class="o">|&gt;</span> <span class="nn">HttpClient</span><span class="p">.</span><span class="n">getResponseAsync</span>
</span><span class="line">    <span class="k">let</span> <span class="nv">httpResponse</span> <span class="o">=</span>
</span><span class="line">      <span class="k">match</span> <span class="n">response</span><span class="o">.</span><span class="n">StatusCode</span> <span class="k">with</span>
</span><span class="line">      <span class="o">|</span> <span class="mi">200</span> <span class="o">-&gt;</span> <span class="n">response</span><span class="o">.</span><span class="n">EntityBody</span><span class="o">.</span><span class="n">Value</span> <span class="o">|&gt;</span> <span class="n">Ok</span>
</span><span class="line">      <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">response</span><span class="o">.</span><span class="n">StatusCode</span> <span class="o">|&gt;</span> <span class="n">Error</span>
</span><span class="line">    <span class="k">return</span> <span class="n">httpResponse</span>
</span><span class="line">  <span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">asyncResponseToObservable</span> <span class="o">=</span> <span class="n">getResponseAsync</span> <span class="o">&gt;&gt;</span> <span class="nn">Observable</span><span class="p">.</span><span class="n">ofAsync</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <code>getResponseAsync</code> function makes use of <a href="https://github.com/relentless/Http.fs">Http.fs</a>, an HTTP Client library for F#, to fire the HTTP GET request and returns the HTTP response asynchronously.</p>

<p>The HTTP response has been modeled as either <code>Ok</code> with the response content for all the responses with the status code <code>200</code> and everything else is treated as <code>Error</code> for simplicity.</p>

<p>In the final line, we create a stream (aka Observable) from asynchronous response using the function <code>Observable.ofAsync</code> from <a href="https://github.com/fsprojects/FSharp.Control.Reactive">FSharp.Control.Reactive</a></p>

<p>As all the GitHub API <a href="https://developer.github.com/v3/#user-agent-required">requests require user agent</a>, we are adding one before firing the request.</p>

<h2 id="parsing-and-transforming-github-api-responses">Parsing and Transforming GitHub API Responses</h2>

<p>Upon successful response from GitHub, the next step is parsing the JSON response and transforming the parsed response as per the Profile screen requirements.</p>

<p>To parse the response, we are going to leverage the powerful tool of FSharp called <a href="http://fsharp.github.io/FSharp.Data/library/JsonProvider.html">JsonTypeProvider</a></p>

<p>The JSON Type Provider provides statically typed access to JSON documents. It takes a sample document as an input. Here in our case, it is user.json and repos.json</p>

<p>Get the sample response from GitHub using its <a href="https://api.github.com/users/tamizhvendan">User API</a> and <a href="https://api.github.com/users/tamizhvendan/repos">Repos API</a> and save the response in user.json and repos.json respectively.</p>

<p>With the help of JsonTypeProvider, we can now easily parse the raw JSON response to its equivalent types in just a few lines of code in <code>GitHub.fs</code>!</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">module</span> <span class="nn">GitHub</span>
</span><span class="line">
</span><span class="line"><span class="k">open</span> <span class="nn">Http</span>
</span><span class="line"><span class="k">open</span> <span class="nn">FSharp.Data</span>
</span><span class="line">
</span><span class="line"><span class="k">type</span> <span class="nc">GitHubUser</span> <span class="o">=</span> <span class="n">JsonProvider</span><span class="o">&lt;</span><span class="s">&quot;user.json&quot;</span><span class="o">&gt;</span>
</span><span class="line"><span class="k">type</span> <span class="nc">GitHubUserRepos</span> <span class="o">=</span> <span class="n">JsonProvider</span><span class="o">&lt;</span><span class="s">&quot;repos.json&quot;</span><span class="o">&gt;</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">parseUser</span> <span class="o">=</span> <span class="nn">GitHubUser</span><span class="p">.</span><span class="n">Parse</span>
</span><span class="line"><span class="k">let</span> <span class="nv">parseUserRepos</span> <span class="o">=</span> <span class="nn">GitHubUserRepos</span><span class="p">.</span><span class="n">Parse</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>As <code>GitHub.fs</code> is an abstraction of GitHub let’s put their URLs also here in the same file</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">host</span> <span class="o">=</span> <span class="s">&quot;https://api.github.com&quot;</span>
</span><span class="line"><span class="k">let</span> <span class="nv">userUrl</span> <span class="o">=</span> <span class="n">sprintf</span> <span class="s">&quot;%s/users/%s&quot;</span> <span class="n">host</span>
</span><span class="line"><span class="k">let</span> <span class="nv">reposUrl</span> <span class="o">=</span> <span class="n">sprintf</span> <span class="s">&quot;%s/users/%s/repos&quot;</span> <span class="n">host</span>
</span><span class="line"><span class="k">let</span> <span class="nv">languagesUrl</span> <span class="n">repoName</span> <span class="n">userName</span> <span class="o">=</span> <span class="n">sprintf</span> <span class="s">&quot;%s/repos/%s/%s/languages&quot;</span> <span class="n">host</span> <span class="n">userName</span> <span class="n">repoName</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
<p>We have used <a href="http://fsharpforfunandprofit.com/posts/partial-application">partial application</a> of function <code>sprintf</code> in the <code>userUrl</code> and <code>reposUrl</code> function here, so both of these functions take username as its parameter implicitly</p>

<p>The JSON response of <a href="https://api.github.com/repos/tamizhvendan/fsharp-phonecat/languages">languages</a> API is little tricky to parse as its keys are dynamic. The type provider will work only if the underlying response has a fixed schema. So, we can’t use the type provider directly to parse the response of languages API.</p>

<p>We are going to use the inbuilt <a href="http://fsharp.github.io/FSharp.Data/library/JsonValue.html">JSON Parser</a> available with JsonTypeProvider to parse the languages response</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">parseLanguages</span> <span class="n">languagesJson</span> <span class="o">=</span>
</span><span class="line">  <span class="n">languagesJson</span>
</span><span class="line">  <span class="o">|&gt;</span> <span class="nn">JsonValue</span><span class="p">.</span><span class="n">Parse</span>
</span><span class="line">  <span class="o">|&gt;</span> <span class="nn">JsonExtensions</span><span class="p">.</span><span class="n">Properties</span>
</span><span class="line">  <span class="o">|&gt;</span> <span class="nn">Array</span><span class="p">.</span><span class="n">map</span> <span class="n">fst</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <code>JsonValue.Parse</code> parses the raw string JSON to a type called <code>JsonValue</code> and the <code>JsonExtensions.Properties</code> function takes a <code>JsonValue</code> and returns the key and value pairs of all the properties in the JSON as tuples. As we are interested only in the Keys here, we just pluck that value alone using the function <code>fst</code></p>

<p>Great! Now we are done with parsing the JSON response of all the three APIs and creating it’s equivalent types. The next step is doing some business transformation</p>

<p>One of the requirements of the Profile Screen is that we need to show only the top 3 popular repositories based on the stars received by the repository. Let’s implement it</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">popularRepos</span> <span class="o">(</span><span class="n">repos</span> <span class="o">:</span> <span class="nn">GitHubUserRepos</span><span class="p">.</span><span class="n">Root</span> <span class="bp">[]</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">ownRepos</span> <span class="o">=</span> <span class="n">repos</span> <span class="o">|&gt;</span> <span class="nn">Array</span><span class="p">.</span><span class="n">filter</span> <span class="o">(</span><span class="k">fun</span> <span class="n">repo</span> <span class="o">-&gt;</span> <span class="ow">not</span> <span class="n">repo</span><span class="o">.</span><span class="n">Fork</span><span class="o">)</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">takeCount</span> <span class="o">=</span> <span class="k">if</span> <span class="n">ownRepos</span><span class="o">.</span><span class="n">Length</span> <span class="o">&gt;</span> <span class="mi">3</span> <span class="k">then</span> <span class="mi">3</span> <span class="k">else</span> <span class="n">repos</span><span class="o">.</span><span class="n">Length</span>
</span><span class="line">
</span><span class="line">  <span class="n">ownRepos</span>
</span><span class="line">  <span class="o">|&gt;</span> <span class="nn">Array</span><span class="p">.</span><span class="n">sortBy</span> <span class="o">(</span><span class="k">fun</span> <span class="n">r</span> <span class="o">-&gt;</span> <span class="o">-</span><span class="n">r</span><span class="o">.</span><span class="n">StargazersCount</span><span class="o">)</span>
</span><span class="line">  <span class="o">|&gt;</span> <span class="nn">Array</span><span class="p">.</span><span class="n">toSeq</span>
</span><span class="line">  <span class="o">|&gt;</span> <span class="nn">Seq</span><span class="p">.</span><span class="n">take</span> <span class="n">takeCount</span>
</span><span class="line">  <span class="o">|&gt;</span> <span class="nn">Seq</span><span class="p">.</span><span class="n">toArray</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>In the <code>Http.fs</code> file, we defined how to get the raw JSON response using Stream as <code>HttpResponse</code> (<code>Ok</code> &amp; <code>Error</code>) and in this <code>GitHub.fs</code>, we have defined how to parse this raw JSON response and transform them its equivalent strongly types.</p>

<p>The final step is integrating both these logic and return the Output record type needed by the Profile Screen</p>

<p>let’s start by defining the Profile type</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">type</span> <span class="nc">Profile</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">Name</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line">  <span class="n">AvatarUrl</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line">  <span class="n">PopularRepositories</span> <span class="o">:</span> <span class="n">Repository</span> <span class="n">seq</span>
</span><span class="line"><span class="o">}</span> <span class="ow">and</span> <span class="n">Repository</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">Name</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line">  <span class="n">Stars</span> <span class="o">:</span> <span class="n">int</span>
</span><span class="line">  <span class="n">Languages</span> <span class="o">:</span> <span class="kt">string</span><span class="bp">[]</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
<p>Then write functions to get the value from <code>HttpResponse</code> and create this profile output.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">reposResponseToPopularRepos</span> <span class="o">=</span> <span class="k">function</span>
</span><span class="line">  <span class="o">|</span><span class="n">Ok</span><span class="o">(</span><span class="n">r</span><span class="o">)</span> <span class="o">-&gt;</span> <span class="n">r</span> <span class="o">|&gt;</span> <span class="n">parseUserRepos</span> <span class="o">|&gt;</span> <span class="n">popularRepos</span>
</span><span class="line">  <span class="o">|_</span> <span class="o">-&gt;</span> <span class="o">[||]</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Languages always associated with a repository</span>
</span><span class="line"><span class="k">let</span> <span class="nv">languageResponseToRepoWithLanguages</span> <span class="o">(</span><span class="n">repo</span> <span class="o">:</span> <span class="nn">GitHubUserRepos</span><span class="p">.</span><span class="n">Root</span><span class="o">)</span> <span class="o">=</span> <span class="k">function</span>
</span><span class="line">  <span class="o">|</span><span class="n">Ok</span><span class="o">(</span><span class="n">l</span><span class="o">)</span> <span class="o">-&gt;</span> <span class="o">{</span><span class="n">Name</span> <span class="o">=</span> <span class="n">repo</span><span class="o">.</span><span class="n">Name</span><span class="o">;</span> <span class="n">Languages</span> <span class="o">=</span> <span class="o">(</span><span class="n">parseLanguages</span> <span class="n">l</span><span class="o">);</span> <span class="n">Stars</span> <span class="o">=</span> <span class="n">repo</span><span class="o">.</span><span class="n">StargazersCount</span><span class="o">}</span>
</span><span class="line">  <span class="o">|_</span> <span class="o">-&gt;</span> <span class="o">{</span><span class="n">Name</span> <span class="o">=</span> <span class="n">repo</span><span class="o">.</span><span class="n">Name</span><span class="o">;</span> <span class="n">Languages</span> <span class="o">=</span> <span class="nn">Array</span><span class="p">.</span><span class="n">empty</span><span class="o">;</span> <span class="n">Stars</span> <span class="o">=</span> <span class="n">repo</span><span class="o">.</span><span class="n">StargazersCount</span><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">toProfile</span>  <span class="o">=</span> <span class="k">function</span>
</span><span class="line">  <span class="o">|</span><span class="n">Ok</span><span class="o">(</span><span class="n">u</span><span class="o">),</span> <span class="n">repos</span> <span class="o">-&gt;</span>
</span><span class="line">      <span class="k">let</span> <span class="nv">user</span> <span class="o">=</span> <span class="n">parseUser</span> <span class="n">u</span>
</span><span class="line">      <span class="o">{</span><span class="n">Name</span> <span class="o">=</span> <span class="n">user</span><span class="o">.</span><span class="n">Name</span><span class="o">;</span> <span class="n">PopularRepositories</span> <span class="o">=</span> <span class="n">repos</span><span class="o">;</span> <span class="n">AvatarUrl</span> <span class="o">=</span> <span class="n">user</span><span class="o">.</span><span class="n">AvatarUrl</span><span class="o">}</span> <span class="o">|&gt;</span> <span class="n">Some</span>
</span><span class="line">  <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">None</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>All the above functions except <code>toProfile</code> take <code>HttpResponse</code> as its last parameter implicitly.</p>

<p>In <code>reposResponseToPopularRepos</code> function, if the repos API request is successful, we parse the response to its equivalent type and then pick only three of them based on star count and in the case of an error we just return an empty array.</p>

<p>The <code>languageResponseToRepoWithLanguages</code> function handles the response from the Languages API request which takes its associated repository as its first parameter. If the response is successful, then it creates the <code>Repository</code> record with the returned languages else it just the <code>Repository</code> record with an empty array for languages.</p>

<p>The last function <code>toProfile</code> is a merge function which takes a tuple of <code>HttpResponse</code> (of User API request) and <code>Repository []</code> and creates a <code>Profile</code> record if the response is successful. In case of an error, it just returns <code>None</code></p>

<p><em>Note: To keep this blog post simple, I am handling the errors using empty arrays and None. It can be extended using <a href="http://fsharpforfunandprofit.com/rop/">ROP</a></em></p>

<h2 id="implementing-api-gateway">Implementing API Gateway</h2>

<p>Let me quickly summarize what we have done so far. We have created two abstractions.</p>

<ul>
  <li><code>Http</code> - Responsible for firing the HTTP GET request with the given URL and give the response as a Rx Stream</li>
</ul>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="n">URL</span>
</span><span class="line">  <span class="err">\</span>
</span><span class="line"><span class="o">----------</span><span class="n">Response</span><span class="o">--|</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<ul>
  <li><code>GitHub</code> - Takes care of parsing the JSON response from GitHub API and does some business logic (finding top 3 popular repositories). Then returns the output in the format that the Client needs.</li>
</ul>

<p>With the help of these abstractions now we are going to build the API Gateway to get the profile object.</p>

<p>Open <code>Gateway.fs</code> and add the <code>getProfile</code> function</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">//string -&gt; Async&lt;Profile&gt;</span>
</span><span class="line"><span class="k">let</span> <span class="nv">getProfile</span> <span class="n">username</span> <span class="o">=</span>
</span><span class="line">  <span class="n">async</span> <span class="o">{</span>
</span><span class="line">    <span class="c1">// TODO</span>
</span><span class="line">    <span class="k">return</span><span class="o">!</span> <span class="n">profile</span>
</span><span class="line">  <span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
<p>It is just a skeleton which just describes the what function does. Let’s start its implementation.</p>

<p>In Rx world, everything is a stream. So, the first step is converting GitHub User API request to stream</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">getProfile</span> <span class="n">username</span> <span class="o">=</span>
</span><span class="line">  <span class="c1">// ...</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">userStream</span> <span class="o">=</span> <span class="n">username</span> <span class="o">|&gt;</span> <span class="n">userUrl</span> <span class="o">|&gt;</span> <span class="n">asyncResponseToObservable</span>
</span><span class="line">  <span class="c1">// ...</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>We have created the <code>userStream</code> using the <code>userUrl</code> and <code>asyncResponseToObservable</code> function defined earlier.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="n">userURL</span>
</span><span class="line">  <span class="err">\</span>
</span><span class="line"><span class="o">-----------</span><span class="n">UJ</span><span class="o">--|</span>              <span class="c1">// UJ - GitHub User Response in JSON format</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Then we need top three popular repositories as a stream</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">getProfile</span> <span class="n">username</span> <span class="o">=</span>
</span><span class="line">  <span class="c1">// ...</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">popularReposStream</span> <span class="o">=</span>
</span><span class="line">    <span class="n">username</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="n">reposUrl</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="n">asyncResponseToObservable</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="nn">Observable</span><span class="p">.</span><span class="n">map</span> <span class="n">reposResponseToPopularRepos</span>
</span><span class="line">  <span class="c1">// ...</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Except the last line, everything is same as that of creating <code>userStream</code>. If you check <a href="https://api.github.com/users/tamizhvendan/repos">GitHub repos API</a> it just returns all the repos associated with the given username. But what we need is only top three of them based on the number of stars it has received.</p>

<p>We already have a function <code>reposResponseToPopularRepos</code> in <code>GitHub.fs</code> which does the job of picking the top three repos from the raw JSON. As the response is in the form Rx stream, we need to get the value from the stream and then we need to apply this function and that’s what the <code>Observable.map</code> does. It is very similar to <a href="https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/map">Array.map</a> and <a href="https://msdn.microsoft.com/en-us/library/system.linq.enumerable.select(v=vs.100).aspx">LINQ Select</a></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="n">reposURL</span>
</span><span class="line">  <span class="err">\</span>
</span><span class="line"><span class="o">----------</span><span class="n">RJ</span><span class="o">---|</span>                          <span class="c1">// RJ - GitHub user repos in JSON format</span>
</span><span class="line">          <span class="o">|</span> <span class="n">MAP</span> <span class="k">function</span> <span class="o">(</span><span class="n">RJ</span> <span class="o">-&gt;</span> <span class="n">PR</span><span class="o">)</span>       <span class="c1">// PR - Popular Repos</span>
</span><span class="line">          <span class="n">V</span>
</span><span class="line"><span class="o">--------------</span><span class="n">PR</span><span class="o">---|</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The next operation is a little complex. i.e. finding out the programming languages being used in these popular repositories. To get this GitHub API, we need to fire three separate requests to the <a href="https://developer.github.com/v3/repos/#list-languages">Languages API</a> for each repository and then merge the results back with the corresponding repository.</p>

<p>To implement this with the help of Rx streams, we need to understand the <code>flatMap</code> <a href="http://reactivex.io/documentation/operators/flatmap.html">function of Rx</a>.</p>

<p>It is similar to the <code>map</code> function that we have seen before with a difference that it takes a function that returns a new item stream instead of a new item.</p>

<h3 id="map">Map</h3>

<p><img src="http://reactivex.io/documentation/operators/images/map.c.png" alt="Map" /></p>

<p>The <code>map</code> function has the following signature</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="o">(</span><span class="k">&#39;</span><span class="n">a</span> <span class="o">-&gt;</span> <span class="k">&#39;</span><span class="n">b</span><span class="o">)</span> <span class="o">-&gt;</span> <span class="n">IObservable</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;</span> <span class="o">-&gt;</span> <span class="n">IObservable</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">b</span><span class="o">&gt;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h3 id="flatmap">FlatMap</h3>

<p><img src="http://reactivex.io/documentation/operators/images/flatMap.c.png" alt="FlatMap" /></p>

<p>The <code>flatMap</code> function has the following signature</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="o">(</span><span class="k">&#39;</span><span class="n">a</span> <span class="o">-&gt;</span> <span class="n">IObservable</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">b</span><span class="o">&gt;)</span> <span class="o">-&gt;</span> <span class="n">IObservable</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;</span> <span class="o">-&gt;</span> <span class="n">IObservable</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">b</span><span class="o">&gt;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>This function is also called as <code>bind</code> function in the functional programming world. If you would like to know further on this topic, I strongly recommend <a href="http://fsharpforfunandprofit.com/posts/elevated-world">this blog series</a> by the fsharp great, <a href="https://twitter.com/ScottWlaschin">Scott Wlaschin</a></p>

<p>Back to the problem in hand, we need to fire three HTTP GET Requests to get back the languages associated with the each of the top three popular repos. In terms of the <code>flatMap</code> function, it boils down to three functions of the following syntax</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="o">(</span><span class="nn">GitHubUserRepos</span><span class="p">.</span><span class="n">Root</span> <span class="o">-&gt;</span> <span class="n">IObservable</span><span class="o">&lt;</span><span class="n">Repostiory</span><span class="o">&gt;)</span>
</span><span class="line">  <span class="o">-&gt;</span> <span class="n">IObservable</span><span class="o">&lt;</span><span class="nn">GitHubUserRepos</span><span class="p">.</span><span class="n">Root</span><span class="o">&gt;</span> <span class="o">-&gt;</span> <span class="n">IObservable</span><span class="o">&lt;</span><span class="n">Repostiory</span><span class="o">&gt;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>We can implement the solution using three <code>flatMap</code> functions using the above syntax. But, we can make it more granular by creating a new variant of <code>flatMap</code> function to achieve this in a more straightforward way.</p>

<p>The ideal function that we are looking for in this <code>flatMap</code> variant holds the following signature</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="o">(</span><span class="k">&#39;</span><span class="n">a</span> <span class="o">-&gt;</span> <span class="n">IObservable</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">b</span><span class="o">&gt;)</span> <span class="o">-&gt;</span> <span class="n">IObservable</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span> <span class="bp">[]</span><span class="o">&gt;</span> <span class="o">-&gt;</span> <span class="n">IObservable</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">b</span> <span class="bp">[]</span><span class="o">&gt;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
<p>i.e three <code>flatMap</code> can be rewritten as</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="o">(</span><span class="nn">GitHubUserRepos</span><span class="p">.</span><span class="n">Root</span> <span class="o">-&gt;</span> <span class="n">IObservable</span><span class="o">&lt;</span><span class="n">Repostiory</span><span class="o">&gt;)</span>
</span><span class="line">  <span class="o">-&gt;</span> <span class="n">IObservable</span><span class="o">&lt;</span><span class="nn">GitHubUserRepos</span><span class="p">.</span><span class="n">Root</span> <span class="bp">[]</span><span class="o">&gt;</span> <span class="o">-&gt;</span> <span class="n">IObservable</span><span class="o">&lt;</span><span class="n">Repostiory</span> <span class="bp">[]</span><span class="o">&gt;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Let’s name it as <code>flatMap2</code> and add the implementation of it in the file <code>ObservableExtensions.fs</code></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">module</span> <span class="nn">ObservableExtensions</span>
</span><span class="line"><span class="k">open</span> <span class="nn">FSharp.Control.Reactive</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">flatmap2</span> <span class="n">f</span> <span class="n">observable</span> <span class="o">=</span>
</span><span class="line">  <span class="n">observable</span>
</span><span class="line">  <span class="o">|&gt;</span> <span class="nn">Observable</span><span class="p">.</span><span class="n">flatmap</span> <span class="o">(</span><span class="nn">Array</span><span class="p">.</span><span class="n">map</span> <span class="n">f</span> <span class="o">&gt;&gt;</span> <span class="nn">Observable</span><span class="p">.</span><span class="n">mergeArray</span><span class="o">)</span>
</span><span class="line">  <span class="o">|&gt;</span> <span class="nn">Observable</span><span class="p">.</span><span class="n">toArray</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Here is the representation of what this function does</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="o">-----</span><span class="n">X</span><span class="o">[</span><span class="n">n</span><span class="o">]--------------------------|-&gt;</span>
</span><span class="line">      <span class="err">\</span>   <span class="n">flatMap</span> <span class="n">on</span> <span class="n">each</span> <span class="n">item</span> <span class="k">in</span> <span class="n">X</span> <span class="n">which</span> <span class="k">yield</span> <span class="n">the</span> <span class="n">stream</span> <span class="k">of</span> <span class="n">R</span>
</span><span class="line"><span class="o">-------</span><span class="n">R1</span><span class="o">-------------------------|-&gt;</span>
</span><span class="line"><span class="o">----------</span><span class="n">R2</span><span class="o">----------------------|-&gt;</span>
</span><span class="line">          <span class="o">......</span>
</span><span class="line"><span class="o">-------------</span><span class="n">Rn</span><span class="o">-------------------|-&gt;</span>
</span><span class="line">          <span class="o">||</span>  <span class="n">mergeArray</span> <span class="o">-&gt;</span> <span class="n">merge</span> <span class="n">array</span> <span class="k">of</span> <span class="n">R</span> <span class="n">streams</span> <span class="n">into</span> <span class="n">one</span> <span class="n">stream</span>
</span><span class="line">          <span class="n">VV</span>
</span><span class="line"><span class="o">------</span><span class="n">R1</span><span class="o">-</span><span class="n">R2</span><span class="o">--</span><span class="n">Rn</span><span class="o">-------------------|-&gt;</span>
</span><span class="line">              <span class="err">\</span> <span class="n">toArray</span> <span class="o">-&gt;</span> <span class="n">Creates</span> <span class="n">an</span> <span class="n">array</span> <span class="n">from</span> <span class="n">an</span> <span class="n">observable</span> <span class="n">sequence</span>
</span><span class="line"><span class="o">-------------</span><span class="n">R</span><span class="o">[</span><span class="n">n</span><span class="o">]-----------------|-&gt;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>It’s hard to get it right in a single shot. So, let’s see it in detail step by step by applying it to our use case here</p>

<ul>
  <li>We have the stream of three popular repos (i.e array of repos)</li>
</ul>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="o">-----</span><span class="n">X</span><span class="o">[</span><span class="n">n</span><span class="o">]--------------------------|-&gt;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
<ul>
  <li>To get the languages associated with the each repo we need to call the languages API for every repo item in the above step</li>
</ul>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="o">-----</span><span class="n">X</span><span class="o">[</span><span class="n">n</span><span class="o">]--------------------------|-&gt;</span>
</span><span class="line">      <span class="err">\</span>   <span class="n">flatMap</span> <span class="n">on</span> <span class="n">each</span> <span class="n">item</span> <span class="k">in</span> <span class="n">X</span> <span class="n">which</span> <span class="k">yield</span> <span class="n">the</span> <span class="n">n</span> <span class="n">streams</span> <span class="k">of</span> <span class="n">R</span>
</span><span class="line"><span class="o">-------</span><span class="n">R1</span><span class="o">-------------------------|-&gt;</span>
</span><span class="line"><span class="o">----------</span><span class="n">R2</span><span class="o">----------------------|-&gt;</span>
</span><span class="line">          <span class="o">......</span>
</span><span class="line"><span class="o">-------------</span><span class="n">Rn</span><span class="o">-------------------|-&gt;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
<ul>
  <li>After we received the response from each languages API call, we need to merge them into one stream</li>
</ul>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="o">-------</span><span class="n">R1</span><span class="o">-------------------------|-&gt;</span>
</span><span class="line"><span class="o">----------</span><span class="n">R2</span><span class="o">----------------------|-&gt;</span>
</span><span class="line">          <span class="o">......</span>
</span><span class="line"><span class="o">-------------</span><span class="n">Rn</span><span class="o">-------------------|-&gt;</span>
</span><span class="line">          <span class="o">|</span>  <span class="n">mergeArray</span> <span class="o">-&gt;</span> <span class="n">merge</span> <span class="n">array</span> <span class="k">of</span> <span class="n">R</span> <span class="n">streams</span> <span class="n">into</span> <span class="n">one</span> <span class="n">stream</span>
</span><span class="line">          <span class="n">V</span>
</span><span class="line"><span class="o">------</span><span class="n">R1</span><span class="o">-</span><span class="n">R2</span><span class="o">--</span><span class="n">Rn</span><span class="o">-------------------|-&gt;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<ul>
  <li>To integrate this with the expected application response, we need all the responses in a single go</li>
</ul>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="o">------</span><span class="n">R1</span><span class="o">-</span><span class="n">R2</span><span class="o">--</span><span class="n">Rn</span><span class="o">-------------------|-&gt;</span>
</span><span class="line">              <span class="err">\</span> <span class="n">toArray</span> <span class="o">-&gt;</span> <span class="n">Creates</span> <span class="n">an</span> <span class="n">array</span> <span class="n">from</span> <span class="n">an</span> <span class="n">observable</span> <span class="n">sequence</span>
</span><span class="line"><span class="o">-------------</span><span class="n">R</span><span class="o">[</span><span class="n">n</span><span class="o">]-----------------|-&gt;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Great! You got it right!!</p>

<p>Let’s use this <code>flatMap2</code> function and complete the implementation of profile API gateway.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">getProfile</span> <span class="n">username</span> <span class="o">=</span>
</span><span class="line">  <span class="c1">// ...</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">toRepoWithLanguagesStream</span> <span class="o">(</span><span class="n">repo</span> <span class="o">:</span> <span class="nn">GitHubUserRepos</span><span class="p">.</span><span class="n">Root</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">    <span class="n">username</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="n">languagesUrl</span> <span class="n">repo</span><span class="o">.</span><span class="n">Name</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="n">asyncResponseToObservable</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="nn">Observable</span><span class="p">.</span><span class="n">map</span> <span class="o">(</span><span class="n">languageResponseToRepoWithLanguages</span> <span class="n">repo</span><span class="o">)</span>
</span><span class="line">
</span><span class="line">  <span class="k">let</span> <span class="nv">popularReposStream</span> <span class="o">=</span>
</span><span class="line">    <span class="n">username</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="n">reposUrl</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="n">asyncResponseToObservable</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="nn">Observable</span><span class="p">.</span><span class="n">map</span> <span class="n">reposResponseToPopularRepos</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="n">flatmap2</span> <span class="n">toRepoWithLanguagesStream</span>
</span><span class="line">
</span><span class="line">  <span class="c1">// ...</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <code>flatmap2</code> function takes the function <code>toRepoWithLanguagesStream</code> which converts the <code>GitHubUserRepos.Root</code> type to <code>IObservable&lt;Repository&gt;</code> to find out the languages associated with the given popular repositories.</p>

<p>The <code>toRepoWithLanguagesStream</code> function does the following</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="nn">GitHubUserRepos</span><span class="p">.</span><span class="n">Root</span>
</span><span class="line">  <span class="err">\</span> <span class="n">create</span> <span class="n">a</span> <span class="n">languages</span> <span class="n">GitHub</span> <span class="n">API</span> <span class="n">stream</span> <span class="n">using</span> <span class="n">the</span> <span class="n">repo</span> <span class="n">name</span> <span class="n">from</span> <span class="n">the</span> <span class="n">input</span>
</span><span class="line"><span class="o">-------</span><span class="n">LR</span><span class="o">----------|</span>              <span class="c1">// LR - languages GitHub API response</span>
</span><span class="line">        <span class="err">\</span> <span class="n">MAP</span> <span class="k">function</span> <span class="o">(</span><span class="nn">GitHubUserRepos</span><span class="p">.</span><span class="n">Root</span> <span class="o">-&gt;</span> <span class="n">LR</span> <span class="o">-&gt;</span> <span class="n">R</span><span class="o">)</span>
</span><span class="line"><span class="o">------------</span><span class="n">R</span><span class="o">------|</span>              <span class="c1">// R - Repository type that defined earlier</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
<p>The <code>Observable.map</code> function takes only one input, but here we need to two inputs. So, With the help of <a href="http://fsharpforfunandprofit.com/posts/partial-application/">partial application</a>, we created an intermediate function by partially applying the first parameter alone</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="nn">Observable</span><span class="p">.</span><span class="n">map</span> <span class="o">(</span><span class="n">languageResponseToRepoWithLanguages</span> <span class="n">repo</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <code>languageResponseToRepoWithLanguages</code> function has been already defined in the <code>GitHub.fs</code> file.</p>

<p>The last step of the <code>getProfile</code> function is combining this <code>popularReposStream</code> with the <code>userStream</code> created earlier and return the <code>Profile</code> type asynchronously.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">getProfile</span> <span class="n">username</span> <span class="o">=</span>
</span><span class="line">  <span class="c1">// ...</span>
</span><span class="line">  <span class="n">async</span> <span class="o">{</span>
</span><span class="line">    <span class="k">return</span><span class="o">!</span> <span class="n">popularReposStream</span>
</span><span class="line">            <span class="o">|&gt;</span> <span class="nn">Observable</span><span class="p">.</span><span class="n">zip</span> <span class="n">userStream</span>
</span><span class="line">            <span class="o">|&gt;</span> <span class="nn">Observable</span><span class="p">.</span><span class="n">map</span> <span class="n">toProfile</span>
</span><span class="line">            <span class="o">|&gt;</span> <span class="nn">TaskObservableExtensions</span><span class="p">.</span><span class="n">ToTask</span>
</span><span class="line">            <span class="o">|&gt;</span> <span class="nn">Async</span><span class="p">.</span><span class="n">AwaitTask</span>
</span><span class="line">  <span class="o">}</span>
</span><span class="line">  <span class="c1">// ...</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <code>Observable.zip</code> function takes two streams as its input, then merges the output of each stream and return the output as a tuple. From this tuple, we have used <code>Observable.map</code> function to map it a <code>Profile</code> type using the <code>toProfile</code> function created earlier in <code>GitHub.fs</code></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="o">-----</span><span class="n">UR</span><span class="o">-------------|</span>     <span class="c1">// UR - GitHub User API Response</span>
</span><span class="line"><span class="o">--------</span><span class="n">PR</span><span class="o">----------|</span>     <span class="c1">// PR - Popular Repos</span>
</span><span class="line">        <span class="err">\</span> <span class="n">ZIP</span> <span class="k">function</span> <span class="o">(</span><span class="n">UR</span> <span class="o">-&gt;</span> <span class="n">PR</span> <span class="o">-&gt;</span> <span class="o">(</span><span class="n">UR</span><span class="o">,</span><span class="n">PR</span><span class="o">))</span>
</span><span class="line"><span class="o">---------(</span><span class="n">UR</span><span class="o">,</span><span class="n">PR</span><span class="o">)----|</span>
</span><span class="line">          <span class="err">\</span> <span class="n">MAP</span> <span class="o">(</span> <span class="o">(</span><span class="n">UR</span><span class="o">,</span><span class="n">PR</span><span class="o">)</span> <span class="o">-&gt;</span> <span class="n">P</span> <span class="o">)</span>  <span class="c1">// P - Profile</span>
</span><span class="line"><span class="o">----------</span><span class="n">P</span><span class="o">---------|</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The last functions <code>TaskObservableExtensions.ToTask</code> and <code>Async.AwaitTask</code> does the conversion of <code>IObservable</code> to <code>async</code> by converting it to a <code>Task</code> first and then the <code>Task</code> to <code>async</code></p>

<p>The final <code>getProfile</code> function will be like</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">getProfile</span> <span class="n">username</span> <span class="o">=</span>
</span><span class="line">
</span><span class="line">  <span class="k">let</span> <span class="nv">userStream</span> <span class="o">=</span> <span class="n">username</span> <span class="o">|&gt;</span> <span class="n">userUrl</span> <span class="o">|&gt;</span> <span class="n">asyncResponseToObservable</span>
</span><span class="line">
</span><span class="line">  <span class="k">let</span> <span class="nv">toRepoWithLanguagesStream</span> <span class="o">(</span><span class="n">repo</span> <span class="o">:</span> <span class="nn">GitHubUserRepos</span><span class="p">.</span><span class="n">Root</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">    <span class="n">username</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="n">languagesUrl</span> <span class="n">repo</span><span class="o">.</span><span class="n">Name</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="n">asyncResponseToObservable</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="nn">Observable</span><span class="p">.</span><span class="n">map</span> <span class="o">(</span><span class="n">languageResponseToRepoWithLanguages</span> <span class="n">repo</span><span class="o">)</span>
</span><span class="line">
</span><span class="line">  <span class="k">let</span> <span class="nv">popularReposStream</span> <span class="o">=</span>
</span><span class="line">    <span class="n">username</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="n">reposUrl</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="n">asyncResponseToObservable</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="nn">Observable</span><span class="p">.</span><span class="n">map</span> <span class="n">reposResponseToPopularRepos</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="n">flatmap2</span> <span class="n">toRepoWithLanguagesStream</span>
</span><span class="line">
</span><span class="line">  <span class="n">async</span> <span class="o">{</span>
</span><span class="line">    <span class="k">return</span><span class="o">!</span> <span class="n">popularReposStream</span>
</span><span class="line">            <span class="o">|&gt;</span> <span class="nn">Observable</span><span class="p">.</span><span class="n">zip</span> <span class="n">userStream</span>
</span><span class="line">            <span class="o">|&gt;</span> <span class="nn">Observable</span><span class="p">.</span><span class="n">map</span> <span class="n">toProfile</span>
</span><span class="line">            <span class="o">|&gt;</span> <span class="nn">TaskObservableExtensions</span><span class="p">.</span><span class="n">ToTask</span>
</span><span class="line">            <span class="o">|&gt;</span> <span class="nn">Async</span><span class="p">.</span><span class="n">AwaitTask</span>
</span><span class="line">  <span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>This function is a testimonial on <em>How functional programming helps to write less, robust, and readable code to solve a complex problem</em></p>

<p>We have handled all the five HTTP requests asynchronously, did some error handling (by returning empty types), and finally efficiently combined outputs of these five HTTP requests and created a type to send back to the client. Everything is asynchronous!</p>

<p>Pretty awesome isn’t it?</p>

<h2 id="exposing-the-api">Exposing the API</h2>

<p>The final step is exposing what we have done so far as an API to the outside world. We are going to implement this using <a href="https://suave.io/">Suave</a></p>

<p>Open <code>ApiGateway.fs</code> file and update it as below</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">JSON</span> <span class="n">v</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">jsonSerializerSettings</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JsonSerializerSettings</span><span class="bp">()</span>
</span><span class="line">  <span class="n">jsonSerializerSettings</span><span class="o">.</span><span class="n">ContractResolver</span> <span class="o">&lt;-</span> <span class="k">new</span> <span class="n">CamelCasePropertyNamesContractResolver</span><span class="bp">()</span>
</span><span class="line">
</span><span class="line">  <span class="nn">JsonConvert</span><span class="p">.</span><span class="n">SerializeObject</span><span class="o">(</span><span class="n">v</span><span class="o">,</span> <span class="n">jsonSerializerSettings</span><span class="o">)</span>
</span><span class="line">  <span class="o">|&gt;</span> <span class="n">OK</span>
</span><span class="line">  <span class="o">&gt;=&gt;</span> <span class="nn">Writers</span><span class="p">.</span><span class="n">setMimeType</span> <span class="s">&quot;application/json; charset=utf-8&quot;</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">getProfile</span> <span class="n">userName</span> <span class="o">(</span><span class="n">httpContext</span> <span class="o">:</span> <span class="n">HttpContext</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">   <span class="n">async</span> <span class="o">{</span>
</span><span class="line">      <span class="k">let!</span> <span class="nv">profile</span> <span class="o">=</span> <span class="n">getProfile</span> <span class="n">userName</span>
</span><span class="line">      <span class="k">match</span> <span class="n">profile</span> <span class="k">with</span>
</span><span class="line">      <span class="o">|</span> <span class="n">Some</span> <span class="n">p</span> <span class="o">-&gt;</span> <span class="k">return</span><span class="o">!</span> <span class="n">JSON</span> <span class="n">p</span> <span class="n">httpContext</span>
</span><span class="line">      <span class="o">|</span> <span class="n">None</span> <span class="o">-&gt;</span> <span class="k">return</span><span class="o">!</span> <span class="n">NOT_FOUND</span> <span class="o">(</span><span class="n">sprintf</span> <span class="s">&quot;Username %s not found&quot;</span> <span class="n">userName</span><span class="o">)</span> <span class="n">httpContext</span>
</span><span class="line">   <span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <code>JSON</code> is a utility function (WebPart in the world of Suave) which takes any type, serialize it to JSON format and return it as JSON HTTP response.</p>

<p>The <code>getProfile</code> function is the API WebPart which calls our backend API gateway implementation and pass the received response to the <code>JSON</code> WebPart defined before.</p>

<p>In case if there is no profile available (Remember? we return empty types in case of errors), we just return <code>404</code> with the message that the given username is not found.</p>

<p>Then update the <code>Program.fs</code> to write the web server code</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="o">[&lt;</span><span class="n">EntryPoint</span><span class="o">&gt;]</span>
</span><span class="line"><span class="k">let</span> <span class="nv">main</span> <span class="n">argv</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">webpart</span> <span class="o">=</span> <span class="n">pathScan</span> <span class="s">&quot;/api/profile/%s&quot;</span> <span class="nn">ApiGateway</span><span class="p">.</span><span class="n">getProfile</span>
</span><span class="line">  <span class="n">startWebServer</span> <span class="n">defaultConfig</span> <span class="n">webpart</span>
</span><span class="line">  <span class="mi">0</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Thanks to <code>Suave</code> for it’s lightweight and low-ceremony offerings in creating an API. We just exposed it in two lines!</p>

<p>Hit <code>F5</code> and access the API at <code>http://localhost:8083/api/profile/{github-username}</code> Bingo!!</p>

<h2 id="summary">Summary</h2>

<blockquote>
  <p>A language that doesn’t affect the way you think about programming is not worth knowing - Alan Perils</p>
</blockquote>

<p>The above quote summarizes the gist of this blog post. Functional Programming will help you think better. You can get the source code associated with the blog post in my <a href="https://github.com/tamizhvendan/blog-samples/tree/master/RxFsharp">blog-samples GitHub repository</a></p>

<p>Wish you a happy and prosperous new year</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[A beginner's guide to setup React.js environment using npm, Babel 6 and Webpack]]></title>
    <link href="http://blog.tamizhvendan.in/blog/2015/11/23/a-beginner-guide-to-setup-react-dot-js-environment-using-babel-6-and-webpack/"/>
    <updated>2015-11-23T16:12:30+05:30</updated>
    <id>http://blog.tamizhvendan.in/blog/2015/11/23/a-beginner-guide-to-setup-react-dot-js-environment-using-babel-6-and-webpack</id>
    <content type="html"><![CDATA[<p>Facebook has really changed the way we think about front-end UI development with the introduction of <a href="https://facebook.github.io/react">React</a>. One of the main advantages of this component based approach is, it is easy to reason about as the view is just a function of props and state.</p>

<p>Though, the learning curve of React is smaller compared to that of its counterparts, one intimidating aspect for the beginners is the tools (<a href="http://babeljs.io">Babel</a>, <a href="https://webpack.github.io">Webpack</a>) and libraries around it.</p>

<p>In fact, these tools are not required to use React and but in order to get the most out of the features of <a href="https://github.com/lukehoban/es6features">ES6</a>, <a href="https://facebook.github.io/react/docs/jsx-in-depth.html">JSX</a> and bundling, we need them. In this blog post we are going to see how to setup a React development environment without being sidetracked by the tools.</p>

<p>A Disclaimer: The approach that I am going to share is just for beginners to understand on how to get started with React as going by this lean way has helped a lot when I started learning React.</p>

<h2 id="lets-start-from-scratch">Let’s start from scratch</h2>

<p>Create a new folder ‘react-hello-world’ and initialize it with npm.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
</pre></td><td class="code"><pre><code class=""><span class="line">mkdir react-hello-world
</span><span class="line">cd react-hello-world
</span><span class="line">npm init</span></code></pre></td></tr></table></div></figure></notextile></div>
<p>Accept the default for all the prompts</p>

<h2 id="installing-and-configuring-webpack">Installing and Configuring Webpack</h2>

<p><a href="https://webpack.github.io">Webpack</a> is a module bundler which takes modules with dependencies and generates static assets by bundling them together based on some configuration.</p>

<p>The support of <a href="http://webpack.github.io/docs/loaders.html">loaders</a> in Webpack makes it a perfect fit for using it along with React and we will discuss it later in this post with more details.</p>

<p>Let’s start with installing webpack using npm</p>

<div class="bogus-wrapper"><notextile><figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class=""><span class="line">npm i webpack -S</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Webpack requires some configuration settings to carry out its work and the best practice is doing it via a config file called <em>webpack.config.js</em>.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class=""><span class="line">touch webpack.config.js</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Update the config file as follows</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
</pre></td><td class="code"><pre><code class="js"><span class="line"><span class="kd">var</span> <span class="nx">webpack</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;webpack&#39;</span><span class="p">);</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">path</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;path&#39;</span><span class="p">);</span>
</span><span class="line">
</span><span class="line"><span class="kd">var</span> <span class="nx">BUILD_DIR</span> <span class="o">=</span> <span class="nx">path</span><span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="nx">__dirname</span><span class="p">,</span> <span class="s1">&#39;src/client/public&#39;</span><span class="p">);</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">APP_DIR</span> <span class="o">=</span> <span class="nx">path</span><span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="nx">__dirname</span><span class="p">,</span> <span class="s1">&#39;src/client/app&#39;</span><span class="p">);</span>
</span><span class="line">
</span><span class="line"><span class="kd">var</span> <span class="nx">config</span> <span class="o">=</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">entry</span><span class="o">:</span> <span class="nx">APP_DIR</span> <span class="o">+</span> <span class="s1">&#39;/index.jsx&#39;</span><span class="p">,</span>
</span><span class="line">  <span class="nx">output</span><span class="o">:</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">path</span><span class="o">:</span> <span class="nx">BUILD_DIR</span><span class="p">,</span>
</span><span class="line">    <span class="nx">filename</span><span class="o">:</span> <span class="s1">&#39;bundle.js&#39;</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line"><span class="p">};</span>
</span><span class="line">
</span><span class="line"><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">config</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The minimalist requirement of a Webpack config file is the presence of entry and output properties.</p>

<p>The <code>APP_DIR</code> holds the directory path of the React application’s codebase and the <code>BUILD_DIR</code> represents the directory path of the bundle file output.</p>

<p>As the name suggests <em>entry</em> specifies the entry file using which the bundling process starts. If you are coming from C# or Java, it’s similar to the class that contains <em>main</em> method. Webpack supports multiple entry points too. Here the <em>index.jsx</em> in the <em>src/client/app</em> directory is the starting point of the application</p>

<p>The <em>output</em> instructs Webpack what to do after the bundling process has been completed. Here, we are instructing it to use the <em>src/client/public</em> directory to output the bundled file with the name <em>bundle.js</em></p>

<p>Let’s create the <em>index.jsx</em> file in the <em>./src/client/app</em> and add the following code to verify this configuration.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="js"><span class="line"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Hello World!&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Now in the terminal run the following command</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="js"><span class="line"><span class="p">.</span><span class="o">/</span><span class="nx">node_modules</span><span class="o">/</span><span class="p">.</span><span class="nx">bin</span><span class="o">/</span><span class="nx">webpack</span> <span class="o">-</span><span class="nx">d</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The above command runs the webpack in the development mode and generates the <em>bundle.js</em> file and its associated map file <em>bundle.js.map</em> in the <em>src/client/public</em> directory.</p>

<p>To make it more interactive, create an <em>index.html</em> file in the <em>src/client</em> directory and modify it to use this <em>bundle.js</em> file</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
</pre></td><td class="code"><pre><code class="html"><span class="line"><span class="nt">&lt;html&gt;</span>
</span><span class="line">  <span class="nt">&lt;head&gt;</span>
</span><span class="line">    <span class="nt">&lt;meta</span> <span class="na">charset=</span><span class="s">&quot;utf-8&quot;</span><span class="nt">&gt;</span>
</span><span class="line">    <span class="nt">&lt;title&gt;</span>React.js using NPM, Babel6 and Webpack<span class="nt">&lt;/title&gt;</span>
</span><span class="line">  <span class="nt">&lt;/head&gt;</span>
</span><span class="line">  <span class="nt">&lt;body&gt;</span>
</span><span class="line">    <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;app&quot;</span> <span class="nt">/&gt;</span>
</span><span class="line">    <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;public/bundle.js&quot;</span> <span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class="line">  <span class="nt">&lt;/body&gt;</span>
</span><span class="line"><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Now if you open the browser, you can see the <em>Hello World!</em> in the console log.</p>

<p>Note: There is a webpack loader called <a href="https://github.com/webpack/html-loader">html-loader</a> which automatically creates this html file with the correct location of <em>bundle.js</em>.   </p>

<h2 id="setting-up-babel-loader">Setting Up Babel-Loader</h2>

<p>As we have seen in the beginning, by using JSX and ES6 we can be more productive while working with React. But the JSX syntax and ES6, are not supported in all the browsers.</p>

<p>Hence, if we are using them in the React code, we need to use a tool which translates them to the format that has been supported by the browsers. It’s where <a href="http://babeljs.io">babel</a> comes into the picture.</p>

<p>While installing Webpack we touched a little on loaders. Webpack uses loaders to translate the file before bundling them</p>

<p><img class="center" src="http://blog.tamizhvendan.in/images/react-hello-world/babel-loader.png" /></p>

<p>To setup install the following npm packages</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="html"><span class="line">npm i babel-loader babel-preset-es2015 babel-preset-react -S
</span></code></pre></td></tr></table></div></figure></notextile></div>
<p>The <em>babel-preset-es2015</em> and <em>babel-preset-react</em> are plugins being used by the <em>babel-loader</em> to translate ES6 and JSX syntax respectively.</p>

<p>As we did for Webpack, <em>babel-loader</em> also requires some configuration. Here we need to tell it to use the ES6 and JSX plugins.</p>

<p>Create a .babelrc file and update it as below</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="html"><span class="line">touch .babelrc
</span></code></pre></td></tr></table></div></figure></notextile></div>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
</pre></td><td class="code"><pre><code class="js"><span class="line"><span class="p">{</span>
</span><span class="line">  <span class="s2">&quot;presets&quot;</span> <span class="o">:</span> <span class="p">[</span><span class="s2">&quot;es2015&quot;</span><span class="p">,</span> <span class="s2">&quot;react&quot;</span><span class="p">]</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The next step is telling Webpack to use the babel-loader while bundling the files</p>

<p>open <em>webpack.config.js</em> file and update it as below</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
</pre></td><td class="code"><pre><code class="js"><span class="line"><span class="c1">// Existing Code ....</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">config</span> <span class="o">=</span> <span class="p">{</span>
</span><span class="line">  <span class="c1">// Existing Code ....</span>
</span><span class="line">  <span class="nx">module</span> <span class="o">:</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">loaders</span> <span class="o">:</span> <span class="p">[</span>
</span><span class="line">      <span class="p">{</span>
</span><span class="line">        <span class="nx">test</span> <span class="o">:</span> <span class="sr">/\.jsx?/</span><span class="p">,</span>
</span><span class="line">        <span class="nx">include</span> <span class="o">:</span> <span class="nx">APP_DIR</span><span class="p">,</span>
</span><span class="line">        <span class="nx">loader</span> <span class="o">:</span> <span class="s1">&#39;babel&#39;</span>
</span><span class="line">      <span class="p">}</span>
</span><span class="line">    <span class="p">]</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <em>loaders</em> property takes array of loaders, here we are just using <em>babel-loader</em>. Each <em>loader</em> property should specify what are the file extension it has to process via the <em>test</em> property. Here we have configured it to process both <em>.js</em> and <em>.jsx</em> files using the regular expression. The <em>include</em> property specifies what is the directory to be used to look for these file extensions. The <em>loader</em> property represents the name of the loader.</p>

<p>Now we all the setup done. Let’s write some code in React.</p>

<h2 id="hello-react">Hello React</h2>

<p>Use npm to install react and react-dom</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="js"><span class="line"><span class="nx">npm</span> <span class="nx">i</span> <span class="nx">react</span> <span class="nx">react</span><span class="o">-</span><span class="nx">dom</span> <span class="o">-</span><span class="nx">S</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Replace the existing console.log statement in the <em>index.jsx</em> with the following content</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
</pre></td><td class="code"><pre><code class="js"><span class="line"><span class="kr">import</span> <span class="nx">React</span> <span class="nx">from</span> <span class="s1">&#39;react&#39;</span><span class="p">;</span>
</span><span class="line"><span class="kr">import</span> <span class="p">{</span><span class="nx">render</span><span class="p">}</span> <span class="nx">from</span> <span class="s1">&#39;react-dom&#39;</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="kr">class</span> <span class="nx">App</span> <span class="kr">extends</span> <span class="nx">React</span><span class="p">.</span><span class="nx">Component</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">render</span> <span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="k">return</span> <span class="o">&lt;</span><span class="nx">p</span><span class="o">&gt;</span> <span class="nx">Hello</span> <span class="nx">React</span><span class="o">!&lt;</span><span class="err">/p&gt;;</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="nx">render</span><span class="p">(</span><span class="o">&lt;</span><span class="nx">App</span><span class="o">/&gt;</span><span class="p">,</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">&#39;app&#39;</span><span class="p">));</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Then run the following command to update the bundle file with the new changes</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="js"><span class="line"><span class="p">.</span><span class="o">/</span><span class="nx">node_modules</span><span class="o">/</span><span class="p">.</span><span class="nx">bin</span><span class="o">/</span><span class="nx">webpack</span> <span class="o">-</span><span class="nx">d</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Now, if you open the <em>index.html</em> in the browser you can see <em>Hello React</em></p>

<h2 id="adding-some-complexity">Adding Some Complexity</h2>

<h3 id="making-webpack-to-watch-the-changes">Making Webpack to watch the changes</h3>

<p>Running the webpack command on every time when you change the file is not a productive work. We can easily change this behavior by using the following command</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="js"><span class="line"><span class="p">.</span><span class="o">/</span><span class="nx">node_modules</span><span class="o">/</span><span class="p">.</span><span class="nx">bin</span><span class="o">/</span><span class="nx">webpack</span> <span class="o">-</span><span class="nx">d</span> <span class="o">--</span><span class="nx">watch</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
<p>Now Webpack is running in the watch mode, which will automatically bundle the file whenever there is a change detected. To test it, change <em>Hello React</em> to something else and refresh the <em>index.html</em> in the browser. You can see your new changes.</p>

<p>If you don’t like refreshing the browser to see the changes you can use <a href="http://gaearon.github.io/react-hot-loader/getstarted/">react-hot-loader</a>!</p>

<h3 id="using-npm-as-a-tool-runner">Using npm as a tool runner</h3>

<p>The command <code>./node_modules/.bin/webpack</code> can be made even simpler by leveraging npm.</p>

<p>Update the packages.json as below</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
</pre></td><td class="code"><pre><code class="js"><span class="line"><span class="p">{</span>
</span><span class="line">  <span class="c1">// ...</span>
</span><span class="line">  <span class="s2">&quot;scripts&quot;</span><span class="o">:</span> <span class="p">{</span>
</span><span class="line">    <span class="s2">&quot;dev&quot;</span><span class="o">:</span> <span class="s2">&quot;webpack -d --watch&quot;</span><span class="p">,</span>
</span><span class="line">    <span class="s2">&quot;build&quot;</span> <span class="o">:</span> <span class="s2">&quot;webpack -p&quot;</span>
</span><span class="line">  <span class="p">},</span>
</span><span class="line">  <span class="c1">// ...</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Now the command <code>npm run build</code> runs Webpack in production mode, which minimizes the bundle file automatically and<br />
the command <code>npm run dev</code> runs the Webpack in the watch mode.</p>

<h3 id="adding-some-files">Adding some files</h3>

<p>In the sample we have seen only one Component called <em>App</em>. Let’s add some more to test the bundling setup.</p>

<p>Create a new file <em>AwesomeComponent.jsx</em> and update it as below</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
</pre></td><td class="code"><pre><code class="js"><span class="line"><span class="kr">import</span> <span class="nx">React</span> <span class="nx">from</span> <span class="s1">&#39;react&#39;</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="kr">class</span> <span class="nx">AwesomeComponent</span> <span class="kr">extends</span> <span class="nx">React</span><span class="p">.</span><span class="nx">Component</span> <span class="p">{</span>
</span><span class="line">
</span><span class="line">  <span class="nx">constructor</span><span class="p">(</span><span class="nx">props</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">    <span class="kr">super</span><span class="p">(</span><span class="nx">props</span><span class="p">);</span>
</span><span class="line">    <span class="k">this</span><span class="p">.</span><span class="nx">state</span> <span class="o">=</span> <span class="p">{</span><span class="nx">likesCount</span> <span class="o">:</span> <span class="mi">0</span><span class="p">};</span>
</span><span class="line">    <span class="k">this</span><span class="p">.</span><span class="nx">onLike</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">onLike</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">
</span><span class="line">  <span class="nx">onLike</span> <span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="kd">let</span> <span class="nx">newLikesCount</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">likesCount</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
</span><span class="line">    <span class="k">this</span><span class="p">.</span><span class="nx">setState</span><span class="p">({</span><span class="nx">likesCount</span><span class="o">:</span> <span class="nx">newLikesCount</span><span class="p">});</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">
</span><span class="line">  <span class="nx">render</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="k">return</span> <span class="p">(</span>
</span><span class="line">      <span class="o">&lt;</span><span class="nx">div</span><span class="o">&gt;</span>
</span><span class="line">        <span class="nx">Likes</span> <span class="o">:</span> <span class="o">&lt;</span><span class="nx">span</span><span class="o">&gt;</span><span class="p">{</span><span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">likesCount</span><span class="p">}</span><span class="o">&lt;</span><span class="err">/span&gt;</span>
</span><span class="line">        <span class="o">&lt;</span><span class="nx">div</span><span class="o">&gt;&lt;</span><span class="nx">button</span> <span class="nx">onClick</span><span class="o">=</span><span class="p">{</span><span class="k">this</span><span class="p">.</span><span class="nx">onLike</span><span class="p">}</span><span class="o">&gt;</span><span class="nx">Like</span> <span class="nx">Me</span><span class="o">&lt;</span><span class="err">/button&gt;&lt;/div&gt;</span>
</span><span class="line">      <span class="o">&lt;</span><span class="err">/div&gt;</span>
</span><span class="line">    <span class="p">);</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="kr">export</span> <span class="k">default</span> <span class="nx">AwesomeComponent</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Then include it in the <em>index.jsx</em> file</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
</pre></td><td class="code"><pre><code class="js"><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="kr">import</span> <span class="nx">AwesomeComponent</span> <span class="nx">from</span> <span class="s1">&#39;./AwesomeComponent.jsx&#39;</span><span class="p">;</span>
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line"><span class="kr">class</span> <span class="nx">App</span> <span class="kr">extends</span> <span class="nx">React</span><span class="p">.</span><span class="nx">Component</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">render</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="k">return</span> <span class="p">(</span>
</span><span class="line">        <span class="o">&lt;</span><span class="nx">div</span><span class="o">&gt;</span>
</span><span class="line">          <span class="o">&lt;</span><span class="nx">p</span><span class="o">&gt;</span> <span class="nx">Hello</span> <span class="nx">React</span><span class="o">!&lt;</span><span class="err">/p&gt;</span>
</span><span class="line">          <span class="o">&lt;</span><span class="nx">AwesomeComponent</span> <span class="o">/&gt;</span>
</span><span class="line">        <span class="o">&lt;</span><span class="err">/div&gt;</span>
</span><span class="line">    <span class="p">);</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line"><span class="c1">// ...</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
<p>`</p>

<p>If your Webpack is already running in watch mode then refresh the browser to see the AwesomeComponent in action!</p>

<p><img class="center" src="http://blog.tamizhvendan.in/images/react-hello-world/Output.png" /></p>

<h2 id="summary">Summary</h2>

<p>In this blog post we have seen a lean approach for setting up a development environment to work with React. In the next blog post we will be extending this example to implement the <a href="https://facebook.github.io/react/docs/flux-overview.html">flux</a> architecture using <a href="http://alt.js.org">Alt</a>. You can get the source code associated with this blog post can be found in my <a href="https://github.com/tamizhvendan/blog-samples/tree/master/react-hello-world">github repository</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Creating Mock API server in fsharp using Suave]]></title>
    <link href="http://blog.tamizhvendan.in/blog/2015/07/23/creating-mock-api-server-in-fsharp-using-suave/"/>
    <updated>2015-07-23T16:56:20+05:30</updated>
    <id>http://blog.tamizhvendan.in/blog/2015/07/23/creating-mock-api-server-in-fsharp-using-suave</id>
    <content type="html"><![CDATA[<p>As part of the current assignment in my day job, I am working in a web application which integrates with an another web application via web APIs. The backend calls the exposed web APIs and does some business logic. Due to some technical limitations, we are not able to setup a development environment of the Web APIs so we have decided to create a mock API server during the development and replace it with the real one in the production.</p>

<p>Since it’s just a mock API server, we don’t want to spend much time on it. Thanks to the awesome light-weight fsharp library <a href="http://suave.io/">Suave</a> we have made it in just 15 minutes!</p>

<p>In this blog post, I will be sharing how we have achieved it. As a sample, we will mock the <a href="https://developer.GitHub.com/v3/">GitHub API</a>.</p>

<h2 id="getting-started">Getting Started</h2>

<p>Create a new fsharp console application project “GitHubMockApiServer” in Visual Studio and install the <a href="https://www.nuget.org/packages/Suave/">suave</a> nuget package.</p>

<p>To keep it short we are going to mock only two GitHub APIs</p>

<ul>
  <li><a href="https://developer.GitHub.com/v3/users/#get-a-single-user">Get a single user</a> - <strong>/users/:username</strong></li>
  <li><a href="https://developer.GitHub.com/v3/repos/#list-user-repositories">List user repositories</a> - <strong>/users/:username/repos</strong></li>
</ul>

<h2 id="creating-the-mock-apis">Creating the mock APIs</h2>

<p>The first step is getting the sample response for these APIs and save them in separate JSON files. In this example, I’ve created these using my GitHub username and added to the project as below.</p>

<p><img class="center" src="http://blog.tamizhvendan.in/images/suave_mock_api/project.png" /></p>

<p>After adding, change the “Copy to Output Directory” property of the both the files to “Copy always”</p>

<p>Open the <strong>Program.fs</strong> and update it as follows</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">open</span> <span class="nn">Suave</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Operators</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Successful</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Filters</span>
</span><span class="line"><span class="k">open</span> <span class="nn">System.IO</span>
</span><span class="line">
</span><span class="line"><span class="o">[&lt;</span><span class="n">EntryPoint</span><span class="o">&gt;]</span>
</span><span class="line"><span class="k">let</span> <span class="nv">main</span> <span class="n">argv</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">json</span> <span class="n">fileName</span> <span class="o">=</span>
</span><span class="line">    <span class="k">let</span> <span class="nv">content</span> <span class="o">=</span> <span class="nn">File</span><span class="p">.</span><span class="n">ReadAllText</span> <span class="n">fileName</span>
</span><span class="line">    <span class="n">content</span><span class="o">.</span><span class="n">Replace</span><span class="o">(</span><span class="s">&quot;</span><span class="se">\r</span><span class="s">&quot;</span><span class="o">,</span> <span class="s">&quot;&quot;</span><span class="o">).</span><span class="n">Replace</span><span class="o">(</span><span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="o">,</span><span class="s">&quot;&quot;</span><span class="o">)</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="n">OK</span> <span class="o">&gt;=&gt;</span> <span class="nn">Writers</span><span class="p">.</span><span class="n">setMimeType</span> <span class="s">&quot;application/json&quot;</span>
</span><span class="line">
</span><span class="line">  <span class="k">let</span> <span class="nv">user</span> <span class="o">=</span> <span class="n">pathScan</span> <span class="s">&quot;/users/%s&quot;</span> <span class="o">(</span><span class="k">fun</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="s">&quot;User.json&quot;</span> <span class="o">|&gt;</span> <span class="n">json</span><span class="o">)</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">repos</span> <span class="o">=</span> <span class="n">pathScan</span> <span class="s">&quot;/users/%s/repos&quot;</span> <span class="o">(</span><span class="k">fun</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="s">&quot;Repos.json&quot;</span> <span class="o">|&gt;</span> <span class="n">json</span><span class="o">)</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">mockApi</span> <span class="o">=</span> <span class="n">choose</span> <span class="o">[</span><span class="n">repos</span><span class="o">;</span><span class="n">user</span><span class="o">]</span>
</span><span class="line">
</span><span class="line">  <span class="n">startWebServer</span> <span class="n">defaultConfig</span> <span class="n">mockApi</span>
</span><span class="line">  <span class="mi">0</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Short and Sweet! Now you can hit this mock GitHub APIs without worrying about its <a href="https://developer.GitHub.com/v3/#rate-limiting">rate limits</a></p>

<p>The <code>json</code> function reads the sample JSON file, then removes the line breaks and return the HTTP 200 response with the content type as  “application/json”</p>

<p>The nice DSL in suave enabled us to configure the routes without giving much works to our hands :-)  </p>

<h2 id="mock-apis-in-action">Mock APIs in action</h2>

<p><img class="border center" src="http://blog.tamizhvendan.in/images/suave_mock_api/user_api.png" /></p>

<p><img class="border center" src="http://blog.tamizhvendan.in/images/suave_mock_api/repos_api.png" /></p>

<h2 id="summary">Summary</h2>

<p>This work is inspired by Scott Wlaschin’s blog post series on <a href="http://fsharpforfunandprofit.com/series/low-risk-ways-to-use-fsharp-at-work.html">Low-risk ways to use F# at work</a>. I am glad to find one more low-risk way to use F# at work and I believe it would help you in future. You can find the sample code in my <a href="https://github.com/tamizhvendan/blog-samples/tree/master/GithubMockApiServer">blog-samples GitHub repository</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Securing APIs in Suave using JSON Web Token]]></title>
    <link href="http://blog.tamizhvendan.in/blog/2015/07/15/securing-apis-in-suave-using-json-web-token/"/>
    <updated>2015-07-15T12:04:12+05:30</updated>
    <id>http://blog.tamizhvendan.in/blog/2015/07/15/securing-apis-in-suave-using-json-web-token</id>
    <content type="html"><![CDATA[<p>In the <a href="http://blog.tamizhvendan.in/blog/2015/06/11/building-rest-api-in-fsharp-using-suave/">last blog post</a>, we have seen how we can combine small functions to create a REST API in Suave and in this blog post we are going to see how can we secure the APIs using JSON web tokens(JWT).</p>

<p>This blog post is based on <a href="http://bitoftech.net/">Taiseer’s</a> blog post on <a href="http://bitoftech.net/2014/10/27/json-web-token-asp-net-web-api-2-jwt-owin-authorization-server/">JSON Web Token in ASP.NET Web API 2 using Owin</a> and I will be covering how to implement the same in <a href="http://suave.io">Suave</a>. If you are interested in the theoretical background of JWT, kindly read his blog post before reading this.</p>

<h2 id="workflow">Workflow</h2>

<p>The typical workflow of JWT based application would look like this</p>

<ol>
  <li>New Audience (Resource Server) gets registered with Authorization Server.</li>
  <li>Get the JWT access token from Authorization Server by passing Client Id of the resource server and login credentials</li>
  <li>Use the access token obtained above to get access to the secured resources in the resource server</li>
</ol>

<p>We are going to see how to implement all these three steps in this blog post</p>

<h2 id="project-setup">Project Setup</h2>

<p>Create an empty visual studio solution and add new projects with the following name</p>

<ul>
  <li>SuaveJwt - A fsharp library project which contains all the JWT related things</li>
  <li>SuaveJwt.AuthServerHost - A fsharp console application which is going to host the authorization server</li>
  <li>Audience1 - A fsharp console application representing the resource server 1   </li>
  <li>Audience2 - A fsharp console application representing the resource server 2   </li>
</ul>

<p>After creating, install the following NuGet packages</p>

<ul>
  <li><a href="https://www.nuget.org/packages/Suave/">Suave</a> in all the four projects</li>
  <li><a href="https://www.nuget.org/packages/Newtonsoft.Json/">Newtonsoft.Json</a> and <a href="https://www.nuget.org/packages/System.IdentityModel.Tokens.Jwt/">JSON Web Token Handler</a> in <em>SuaveJwt</em></li>
</ul>

<p>Then add reference the .NET framework library <strong>System.IdentityModel</strong> in all the four projects from GAC and then add a reference to the <strong>SuaveJwt</strong> project library in all the other three projects.</p>

<p><img class="center" src="http://blog.tamizhvendan.in/images/suave_jwt/project_structure.png" /></p>

<h2 id="new-audience-registration">New Audience Registration</h2>

<p>As we have seen in the workflow, the first step is to enable an audience to register itself with the authorization server. Let’s begin by defining the business logic.</p>

<p>Add a new source file <em>JwtToken.fs</em> in the <strong>SuaveJwt</strong> project and update it as follows</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">type</span> <span class="nc">Audience</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">ClientId</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line">  <span class="n">Secret</span> <span class="o">:</span> <span class="n">Base64String</span>
</span><span class="line">  <span class="n">Name</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="c1">// string -&gt; Audience</span>
</span><span class="line"><span class="k">let</span> <span class="nv">createAudience</span> <span class="n">audienceName</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">clientId</span> <span class="o">=</span> <span class="nn">Guid</span><span class="p">.</span><span class="n">NewGuid</span><span class="bp">()</span><span class="o">.</span><span class="n">ToString</span><span class="o">(</span><span class="s">&quot;N&quot;</span><span class="o">)</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">data</span> <span class="o">=</span> <span class="nn">Array</span><span class="p">.</span><span class="n">zeroCreate</span> <span class="mi">32</span>
</span><span class="line">  <span class="nn">RNGCryptoServiceProvider</span><span class="p">.</span><span class="n">Create</span><span class="bp">()</span><span class="o">.</span><span class="n">GetBytes</span><span class="o">(</span><span class="n">data</span><span class="o">)</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">secret</span> <span class="o">=</span> <span class="n">data</span> <span class="o">|&gt;</span> <span class="nn">Base64String</span><span class="p">.</span><span class="n">create</span>
</span><span class="line">  <span class="o">{</span><span class="n">ClientId</span> <span class="o">=</span> <span class="n">clientId</span><span class="o">;</span> <span class="n">Secret</span> <span class="o">=</span> <span class="n">secret</span><span class="o">;</span> <span class="n">Name</span> <span class="o">=</span>  <span class="n">audienceName</span><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The above snippet creates an audience record with a random client id and secret key. The secret key is of type <a href="https://en.wikipedia.org/wiki/Base64#URL_applications">base64 URL encoded</a> string. This type doesn’t exist, so let’s create it.</p>

<p>Add a new source file <em>Encodings.fs</em> in the <strong>SuaveJwt</strong> project and add this type</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">type</span> <span class="nc">Base64String</span> <span class="o">=</span> <span class="k">private</span> <span class="n">Base64String</span> <span class="k">of</span> <span class="kt">string</span> <span class="k">with</span>
</span><span class="line">
</span><span class="line">  <span class="k">static</span> <span class="k">member</span> <span class="n">decode</span> <span class="o">(</span><span class="n">base64String</span> <span class="o">:</span> <span class="n">Base64String</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">    <span class="k">let</span> <span class="o">(</span><span class="n">Base64String</span> <span class="n">text</span><span class="o">)</span> <span class="o">=</span> <span class="n">base64String</span>
</span><span class="line">    <span class="k">let</span> <span class="nv">pad</span> <span class="n">text</span> <span class="o">=</span>
</span><span class="line">      <span class="k">let</span> <span class="nv">padding</span> <span class="o">=</span> <span class="mi">3</span> <span class="o">-</span> <span class="o">((</span><span class="nn">String</span><span class="p">.</span><span class="n">length</span> <span class="n">text</span> <span class="o">+</span> <span class="mi">3</span><span class="o">)</span> <span class="o">%</span> <span class="mi">4</span><span class="o">)</span>
</span><span class="line">      <span class="k">if</span> <span class="n">padding</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">then</span> <span class="n">text</span> <span class="k">else</span> <span class="o">(</span><span class="n">text</span> <span class="o">+</span> <span class="k">new</span> <span class="n">String</span><span class="o">(</span><span class="sc">&#39;=&#39;</span><span class="o">,</span> <span class="n">padding</span><span class="o">))</span>
</span><span class="line">
</span><span class="line">    <span class="nn">Convert</span><span class="p">.</span><span class="n">FromBase64String</span><span class="o">(</span><span class="n">pad</span><span class="o">(</span><span class="n">text</span><span class="o">.</span><span class="n">Replace</span><span class="o">(</span><span class="sc">&#39;-&#39;</span><span class="o">,</span> <span class="sc">&#39;+&#39;</span><span class="o">).</span><span class="n">Replace</span><span class="o">(</span><span class="sc">&#39;_&#39;</span><span class="o">,</span> <span class="sc">&#39;/&#39;</span><span class="o">)))</span>
</span><span class="line">
</span><span class="line">  <span class="k">static</span> <span class="k">member</span> <span class="n">create</span> <span class="n">data</span> <span class="o">=</span>
</span><span class="line">    <span class="nn">Convert</span><span class="p">.</span><span class="n">ToBase64String</span><span class="o">(</span><span class="n">data</span><span class="o">)</span>
</span><span class="line">      <span class="o">.</span><span class="n">TrimEnd</span><span class="o">(</span><span class="sc">&#39;=&#39;</span><span class="o">)</span>
</span><span class="line">      <span class="o">.</span><span class="n">Replace</span><span class="o">(</span><span class="sc">&#39;+&#39;</span><span class="o">,</span> <span class="sc">&#39;-&#39;</span><span class="o">)</span>
</span><span class="line">      <span class="o">.</span><span class="n">Replace</span><span class="o">(</span><span class="sc">&#39;/&#39;</span><span class="o">,</span> <span class="sc">&#39;_&#39;</span><span class="o">)</span> <span class="o">|&gt;</span> <span class="n">Base64String</span><span class="o">;</span>
</span><span class="line">
</span><span class="line">
</span><span class="line">  <span class="k">static</span> <span class="k">member</span> <span class="n">fromString</span> <span class="o">=</span> <span class="n">Base64String</span>
</span><span class="line">
</span><span class="line">  <span class="k">override</span> <span class="n">this</span><span class="p">.</span><span class="nf">ToString</span><span class="bp">()</span> <span class="o">=</span>
</span><span class="line">    <span class="k">let</span> <span class="o">(</span><span class="n">Base64String</span> <span class="n">str</span><span class="o">)</span> <span class="o">=</span> <span class="n">this</span>
</span><span class="line">    <span class="n">str</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>To keep things simple, I haven’t added any validations here. The next step is to create a Suave <em>WebPart</em> to expose the audience create functionality.</p>

<p>Add a new source file <em>AuthServer.fs</em> in the <strong>SuaveJwt</strong> project and update it as below</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
<span class="line-number">32</span>
<span class="line-number">33</span>
<span class="line-number">34</span>
<span class="line-number">35</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">type</span> <span class="nc">AudienceCreateRequest</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">Name</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="k">type</span> <span class="nc">AudienceCreateResponse</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">ClientId</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line">  <span class="n">Base64Secret</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line">  <span class="n">Name</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="k">type</span> <span class="nc">Config</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">AddAudienceUrlPath</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line">  <span class="n">SaveAudience</span> <span class="o">:</span> <span class="n">Audience</span> <span class="o">-&gt;</span> <span class="n">Async</span><span class="o">&lt;</span><span class="n">Audience</span><span class="o">&gt;</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">audienceWebPart</span> <span class="n">config</span> <span class="o">=</span>
</span><span class="line">
</span><span class="line">  <span class="k">let</span> <span class="nv">toAudienceCreateResponse</span> <span class="o">(</span><span class="n">audience</span> <span class="o">:</span> <span class="n">Audience</span><span class="o">)</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">    <span class="n">Base64Secret</span> <span class="o">=</span> <span class="n">audience</span><span class="o">.</span><span class="n">Secret</span><span class="o">.</span><span class="n">ToString</span><span class="bp">()</span>
</span><span class="line">    <span class="n">ClientId</span> <span class="o">=</span> <span class="n">audience</span><span class="o">.</span><span class="n">ClientId</span>
</span><span class="line">    <span class="n">Name</span> <span class="o">=</span> <span class="n">audience</span><span class="o">.</span><span class="n">Name</span>
</span><span class="line">  <span class="o">}</span>
</span><span class="line">
</span><span class="line">  <span class="k">let</span> <span class="nv">tryCreateAudience</span> <span class="o">(</span><span class="n">ctx</span><span class="o">:</span> <span class="n">HttpContext</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">    <span class="k">match</span> <span class="n">mapJsonPayload</span><span class="o">&lt;</span><span class="n">AudienceCreateRequest</span><span class="o">&gt;</span> <span class="n">ctx</span><span class="o">.</span><span class="n">request</span> <span class="k">with</span>
</span><span class="line">    <span class="o">|</span> <span class="n">Some</span> <span class="n">audienceCreateRequest</span> <span class="o">-&gt;</span>
</span><span class="line">        <span class="n">async</span> <span class="o">{</span>
</span><span class="line">          <span class="k">let!</span> <span class="nv">audience</span> <span class="o">=</span>
</span><span class="line">            <span class="n">audienceCreateRequest</span><span class="o">.</span><span class="n">Name</span> <span class="o">|&gt;</span> <span class="n">createAudience</span> <span class="o">|&gt;</span> <span class="n">config</span><span class="o">.</span><span class="n">SaveAudience</span>
</span><span class="line">          <span class="k">let</span> <span class="nv">audienceCreateResponse</span> <span class="o">=</span> <span class="n">toAudienceCreateResponse</span> <span class="n">audience</span>
</span><span class="line">          <span class="k">return</span><span class="o">!</span> <span class="n">JSON</span> <span class="n">audienceCreateResponse</span> <span class="n">ctx</span>
</span><span class="line">        <span class="o">}</span>
</span><span class="line">    <span class="o">|</span> <span class="n">None</span> <span class="o">-&gt;</span> <span class="n">BAD_REQUEST</span> <span class="s">&quot;Invalid Audience Create Request&quot;</span> <span class="n">ctx</span>
</span><span class="line">
</span><span class="line">  <span class="n">path</span> <span class="n">config</span><span class="o">.</span><span class="n">AddAudienceUrlPath</span> <span class="o">&gt;=&gt;</span> <span class="n">POST</span> <span class="o">&gt;=&gt;</span> <span class="n">tryCreateAudience</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <code>audienceWebPart</code> function retrieves the <code>AudienceCreateRequest</code> from the JSON request payload and creates a new audience.<br />
To make it independent of the host, we have externalized the hosting functionality using the <code>Config</code> record type.</p>

<p>The <code>mapJsonPayload</code> and <code>JSON</code> functions serialize and deserialize JSON objects across the wire respectively. These functions are not part of Suave, so let’s add them</p>

<p>Add a new source file <em>SuaveJson.fs</em> in the <strong>SuaveJwt</strong> project and add these functions</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">JSON</span> <span class="n">v</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">jsonSerializerSettings</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JsonSerializerSettings</span><span class="bp">()</span>
</span><span class="line">  <span class="n">jsonSerializerSettings</span><span class="o">.</span><span class="n">ContractResolver</span> <span class="o">&lt;-</span> <span class="k">new</span> <span class="n">CamelCasePropertyNamesContractResolver</span><span class="bp">()</span>
</span><span class="line">
</span><span class="line">  <span class="nn">JsonConvert</span><span class="p">.</span><span class="n">SerializeObject</span><span class="o">(</span><span class="n">v</span><span class="o">,</span> <span class="n">jsonSerializerSettings</span><span class="o">)</span>
</span><span class="line">  <span class="o">|&gt;</span> <span class="n">OK</span>
</span><span class="line">  <span class="o">&gt;=&gt;</span> <span class="nn">Writers</span><span class="p">.</span><span class="n">setMimeType</span> <span class="s">&quot;application/json; charset=utf-8&quot;</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">mapJsonPayload</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;</span> <span class="o">(</span><span class="n">req</span> <span class="o">:</span> <span class="n">HttpRequest</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">fromJson</span> <span class="n">json</span> <span class="o">=</span>
</span><span class="line">    <span class="k">try</span>
</span><span class="line">      <span class="k">let</span> <span class="nv">obj</span> <span class="o">=</span> <span class="nn">JsonConvert</span><span class="p">.</span><span class="n">DeserializeObject</span><span class="o">(</span><span class="n">json</span><span class="o">,</span> <span class="n">typeof</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;)</span> <span class="o">:?&gt;</span> <span class="k">&#39;</span><span class="n">a</span>
</span><span class="line">      <span class="n">Some</span> <span class="kt">obj</span>
</span><span class="line">    <span class="k">with</span>
</span><span class="line">    <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">None</span>
</span><span class="line">
</span><span class="line">  <span class="k">let</span> <span class="nv">getString</span> <span class="n">rawForm</span> <span class="o">=</span>
</span><span class="line">    <span class="nn">System</span><span class="p">.</span><span class="nn">Text</span><span class="p">.</span><span class="nn">Encoding</span><span class="p">.</span><span class="nn">UTF8</span><span class="p">.</span><span class="n">GetString</span><span class="o">(</span><span class="n">rawForm</span><span class="o">)</span>
</span><span class="line">
</span><span class="line">  <span class="n">req</span><span class="o">.</span><span class="n">rawForm</span> <span class="o">|&gt;</span> <span class="n">getString</span> <span class="o">|&gt;</span> <span class="n">fromJson</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The next step is hosting this audience web part.</p>

<p>Open the <em>Program.fs</em> file in the <strong>SuaveJwt.AuthServerHost</strong> project and update it as below</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">authorizationServerConfig</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">AddAudienceUrlPath</span> <span class="o">=</span> <span class="s">&quot;/api/audience&quot;</span>
</span><span class="line">  <span class="n">SaveAudience</span> <span class="o">=</span> <span class="nn">AudienceStorage</span><span class="p">.</span><span class="n">saveAudience</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line"><span class="k">let</span> <span class="nv">audienceWebPart</span><span class="k">&#39;</span> <span class="o">=</span> <span class="n">audienceWebPart</span> <span class="n">authorizationServerConfig</span>
</span><span class="line"><span class="n">startWebServer</span> <span class="n">defaultConfig</span> <span class="n">audienceWebPart&#39;</span>
</span><span class="line"><span class="mi">0</span> <span class="c1">// return an integer exit code</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>It is a straight forward self-host suave server program which exposes the audience web part.</p>

<p>The <em>AudienceStorage</em> is responsible for storing the created audiences and to add it create a new source file <em>AudienceStorage.fs</em> in the <strong>SuaveJwt.AuthServerHost</strong> project and add these functions</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">module</span> <span class="nn">AudienceStorage</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">private</span> <span class="n">audienceStorage</span>
</span><span class="line">  <span class="o">=</span> <span class="k">new</span> <span class="n">Dictionary</span><span class="o">&lt;</span><span class="kt">string</span><span class="o">,</span> <span class="n">Audience</span><span class="o">&gt;</span><span class="bp">()</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">saveAudience</span> <span class="o">(</span><span class="n">audience</span> <span class="o">:</span> <span class="n">Audience</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">    <span class="n">audienceStorage</span><span class="o">.</span><span class="n">Add</span><span class="o">(</span><span class="n">audience</span><span class="o">.</span><span class="n">ClientId</span><span class="o">,</span> <span class="n">audience</span><span class="o">)</span>
</span><span class="line">    <span class="n">audience</span> <span class="o">|&gt;</span> <span class="n">async</span><span class="o">.</span><span class="n">Return</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
<p>To keep this simple, we are using in-memory dictionary here and it can be easily replaced with any data store</p>

<p>Now we have everything to create a new audience. So, let’s run the <strong>SuaveJwt.AuthServerHost</strong> application and verify</p>

<p><img class="center" src="http://blog.tamizhvendan.in/images/suave_jwt/audience_create.png" /></p>

<p>Keep a note of this <em>clientId</em> and <em>base64Secret</em> as we will be using them while defining the resource server (“Audience1” in this case).</p>

<h2 id="generating-access-token">Generating Access Token</h2>

<p>After registering an audience with the authorization server, the next step is to get the access token to access the resources in the given resource server.</p>

<p>Let’s begin by defining the business logic to create an access token.</p>

<p><img class="center" src="http://blog.tamizhvendan.in/images/suave_jwt/createToken.png" /></p>

<p>Open <em>JwtToken.fs</em> and add the following types</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">type</span> <span class="nc">TokenCreateRequest</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">Issuer</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line">  <span class="n">UserName</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line">  <span class="n">Password</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line">  <span class="n">TokenTimeSpan</span> <span class="o">:</span> <span class="n">TimeSpan</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="k">type</span> <span class="nc">IdentityStore</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">getClaims</span> <span class="o">:</span> <span class="kt">string</span> <span class="o">-&gt;</span> <span class="n">Async</span><span class="o">&lt;</span><span class="n">Claim</span> <span class="n">seq</span><span class="o">&gt;</span>
</span><span class="line">  <span class="n">isValidCredentials</span> <span class="o">:</span> <span class="kt">string</span> <span class="o">-&gt;</span> <span class="kt">string</span> <span class="o">-&gt;</span> <span class="n">Async</span><span class="o">&lt;</span><span class="kt">bool</span><span class="o">&gt;</span>
</span><span class="line">  <span class="n">getSecurityKey</span> <span class="o">:</span> <span class="n">Base64String</span> <span class="o">-&gt;</span> <span class="n">SecurityKey</span>
</span><span class="line">  <span class="n">getSigningCredentials</span> <span class="o">:</span> <span class="n">SecurityKey</span> <span class="o">-&gt;</span> <span class="n">SigningCredentials</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="k">type</span> <span class="nc">Token</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">AccessToken</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line">  <span class="n">ExpiresIn</span> <span class="o">:</span> <span class="kt">float</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>These types are generic abstractions which decouple the token creation part from the underlying host.</p>

<p>The <code>TokenCreateRequest</code> models the underlying issuer and token lifetime.</p>

<p>The <code>IdentityStore</code> represents a generic data store in which the identity information has been stored and it also provides the security key and the signing credentials to protect the access token from misuse.</p>

<p>With these types in place let’s add the <code>createToken</code> function in the <em>SuaveJwt.fs</em> file</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">createToken</span> <span class="n">tokenCreateRequest</span> <span class="n">identityStore</span> <span class="n">audience</span> <span class="o">=</span>
</span><span class="line">  <span class="n">async</span> <span class="o">{</span>
</span><span class="line">    <span class="k">let!</span> <span class="nv">isValidCredentials</span> <span class="o">=</span>
</span><span class="line">      <span class="n">identityStore</span><span class="o">.</span><span class="n">isValidCredentials</span> <span class="n">tokenCreateRequest</span><span class="o">.</span><span class="n">UserName</span> <span class="n">tokenCreateRequest</span><span class="o">.</span><span class="n">Password</span>
</span><span class="line">    <span class="k">if</span> <span class="n">isValidCredentials</span> <span class="k">then</span>
</span><span class="line">      <span class="k">let</span> <span class="nv">signingCredentials</span> <span class="o">=</span>
</span><span class="line">        <span class="o">(</span><span class="n">identityStore</span><span class="o">.</span><span class="n">getSecurityKey</span> <span class="o">&gt;&gt;</span> <span class="n">identityStore</span><span class="o">.</span><span class="n">getSigningCredentials</span><span class="o">)</span> <span class="n">audience</span><span class="o">.</span><span class="n">Secret</span>
</span><span class="line">      <span class="k">let</span> <span class="nv">issuedOn</span> <span class="o">=</span> <span class="n">Nullable</span> <span class="nn">DateTime</span><span class="p">.</span><span class="n">UtcNow</span>
</span><span class="line">      <span class="k">let</span> <span class="nv">expiresBy</span> <span class="o">=</span> <span class="n">Nullable</span> <span class="o">(</span><span class="nn">DateTime</span><span class="p">.</span><span class="nn">UtcNow</span><span class="p">.</span><span class="n">Add</span><span class="o">(</span><span class="n">tokenCreateRequest</span><span class="o">.</span><span class="n">TokenTimeSpan</span><span class="o">))</span>
</span><span class="line">      <span class="k">let!</span> <span class="nv">claims</span> <span class="o">=</span>  <span class="n">identityStore</span><span class="o">.</span><span class="n">getClaims</span> <span class="n">tokenCreateRequest</span><span class="o">.</span><span class="n">UserName</span>
</span><span class="line">      <span class="k">let</span> <span class="nv">jwtSecurityToken</span> <span class="o">=</span>
</span><span class="line">        <span class="k">new</span> <span class="n">JwtSecurityToken</span><span class="o">(</span><span class="n">tokenCreateRequest</span><span class="o">.</span><span class="n">Issuer</span><span class="o">,</span> <span class="n">audience</span><span class="o">.</span><span class="n">ClientId</span><span class="o">,</span> <span class="n">claims</span><span class="o">,</span> <span class="n">issuedOn</span><span class="o">,</span> <span class="n">expiresBy</span><span class="o">,</span> <span class="n">signingCredentials</span><span class="o">)</span>
</span><span class="line">      <span class="k">let</span> <span class="nv">handler</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JwtSecurityTokenHandler</span><span class="bp">()</span>
</span><span class="line">      <span class="k">let</span> <span class="nv">accessToken</span> <span class="o">=</span> <span class="n">handler</span><span class="o">.</span><span class="n">WriteToken</span><span class="o">(</span><span class="n">jwtSecurityToken</span><span class="o">)</span>
</span><span class="line">      <span class="k">return</span> <span class="n">Some</span> <span class="o">{</span><span class="n">AccessToken</span> <span class="o">=</span> <span class="n">accessToken</span><span class="o">;</span> <span class="n">ExpiresIn</span> <span class="o">=</span> <span class="n">tokenCreateRequest</span><span class="o">.</span><span class="n">TokenTimeSpan</span><span class="o">.</span><span class="n">TotalSeconds</span><span class="o">}</span>
</span><span class="line">    <span class="k">else</span> <span class="k">return</span> <span class="n">None</span>
</span><span class="line">  <span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <code>createToken</code> function checks the validness of the login credentials. If it is valid, then it get the claims associated with the given username and creates a <em>JwtToken</em> using the <a href="https://www.nuget.org/packages/System.IdentityModel.Tokens.Jwt/">JSON Web Token Handler</a> library, else it returns <code>None</code></p>

<p>Now we have got the backend business logic ready, let’s expose it as a suave <em>WebPart</em></p>

<p>Open <em>AuthServer.fs</em> and add a new record type for the incoming token create request and update <code>Config</code> and <code>audienceWebPart</code> as below</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
<span class="line-number">32</span>
<span class="line-number">33</span>
<span class="line-number">34</span>
<span class="line-number">35</span>
<span class="line-number">36</span>
<span class="line-number">37</span>
<span class="line-number">38</span>
<span class="line-number">39</span>
<span class="line-number">40</span>
<span class="line-number">41</span>
<span class="line-number">42</span>
<span class="line-number">43</span>
<span class="line-number">44</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">type</span> <span class="nc">TokenCreateCredentials</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">UserName</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line">  <span class="n">Password</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line">  <span class="n">ClientId</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="k">type</span> <span class="nc">Config</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="c1">// ... existing fields ...</span>
</span><span class="line">  <span class="n">CreateTokenUrlPath</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line">  <span class="n">GetAudience</span> <span class="o">:</span> <span class="kt">string</span> <span class="o">-&gt;</span> <span class="n">Async</span><span class="o">&lt;</span><span class="n">Audience</span> <span class="n">option</span><span class="o">&gt;</span>
</span><span class="line">  <span class="n">Issuer</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line">  <span class="n">TokenTimeSpan</span> <span class="o">:</span> <span class="n">TimeSpan</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">audienceWebPart</span> <span class="n">config</span> <span class="n">identityStore</span> <span class="o">=</span>
</span><span class="line">
</span><span class="line">  <span class="c1">// ... existing functions ...</span>
</span><span class="line">
</span><span class="line">  <span class="k">let</span> <span class="nv">tryCreateToken</span> <span class="o">(</span><span class="n">ctx</span><span class="o">:</span> <span class="n">HttpContext</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">    <span class="k">match</span> <span class="n">mapJsonPayload</span><span class="o">&lt;</span><span class="n">TokenCreateCredentials</span><span class="o">&gt;</span> <span class="n">ctx</span><span class="o">.</span><span class="n">request</span> <span class="k">with</span>
</span><span class="line">    <span class="o">|</span> <span class="n">Some</span> <span class="n">tokenCreateCredentials</span> <span class="o">-&gt;</span>
</span><span class="line">      <span class="n">async</span> <span class="o">{</span>
</span><span class="line">        <span class="k">let!</span> <span class="nv">audience</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">GetAudience</span> <span class="n">tokenCreateCredentials</span><span class="o">.</span><span class="n">ClientId</span>
</span><span class="line">        <span class="k">match</span> <span class="n">audience</span> <span class="k">with</span>
</span><span class="line">        <span class="o">|</span> <span class="n">Some</span> <span class="n">audience</span> <span class="o">-&gt;</span>
</span><span class="line">            <span class="k">let</span> <span class="nv">tokenCreateRequest</span> <span class="o">:</span> <span class="n">TokenCreateRequest</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">              <span class="n">Issuer</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">Issuer</span>
</span><span class="line">              <span class="n">UserName</span> <span class="o">=</span> <span class="n">tokenCreateCredentials</span><span class="o">.</span><span class="n">UserName</span>
</span><span class="line">              <span class="n">Password</span> <span class="o">=</span> <span class="n">tokenCreateCredentials</span><span class="o">.</span><span class="n">Password</span>
</span><span class="line">              <span class="n">TokenTimeSpan</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">TokenTimeSpan</span>
</span><span class="line">            <span class="o">}</span>
</span><span class="line">            <span class="k">let!</span> <span class="nv">token</span> <span class="o">=</span> <span class="n">createToken</span> <span class="n">tokenCreateRequest</span> <span class="n">identityStore</span> <span class="n">audience</span>
</span><span class="line">            <span class="k">match</span> <span class="n">token</span> <span class="k">with</span>
</span><span class="line">            <span class="o">|</span> <span class="n">Some</span> <span class="n">token</span> <span class="o">-&gt;</span> <span class="k">return</span><span class="o">!</span> <span class="n">JSON</span> <span class="n">token</span> <span class="n">ctx</span>
</span><span class="line">            <span class="o">|</span> <span class="n">None</span> <span class="o">-&gt;</span> <span class="k">return</span><span class="o">!</span> <span class="n">BAD_REQUEST</span> <span class="s">&quot;Invalid Login Credentials&quot;</span> <span class="n">ctx</span>
</span><span class="line">
</span><span class="line">        <span class="o">|</span> <span class="n">None</span> <span class="o">-&gt;</span> <span class="k">return</span><span class="o">!</span> <span class="n">BAD_REQUEST</span> <span class="s">&quot;Invalid Client Id&quot;</span> <span class="n">ctx</span>
</span><span class="line">      <span class="o">}</span>
</span><span class="line">    <span class="o">|</span> <span class="n">None</span> <span class="o">-&gt;</span> <span class="n">BAD_REQUEST</span> <span class="s">&quot;Invalid Token Create Request&quot;</span> <span class="n">ctx</span>
</span><span class="line">
</span><span class="line">  <span class="n">choose</span> <span class="o">[</span>
</span><span class="line">    <span class="n">path</span> <span class="n">config</span><span class="o">.</span><span class="n">AddAudienceUrlPath</span> <span class="o">&gt;=&gt;</span> <span class="n">POST</span> <span class="o">&gt;=&gt;</span> <span class="n">tryCreateAudience</span>
</span><span class="line">    <span class="n">path</span> <span class="n">config</span><span class="o">.</span><span class="n">CreateTokenUrlPath</span> <span class="o">&gt;=&gt;</span> <span class="n">POST</span> <span class="o">&gt;=&gt;</span> <span class="n">tryCreateToken</span>
</span><span class="line">  <span class="o">]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <code>tryCreateToken</code> function checks whether the <code>ClientId</code> is a registered audience or not, if it exists, then this function creates a token using the <code>createToken</code> function defined above otherwise it returns the <code>BAD_REQUST</code> <em>WebPart</em> with the appropriate error message.</p>

<p>The final change is modifying the <em>Program.fs</em> and <em>AudienceStorage.fs</em> files in the <strong>SuaveJwt.AuthServerHost</strong> to expose this <em>WebPart</em>.</p>

<p><strong>Program.fs</strong></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">authorizationServerConfig</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">AddAudienceUrlPath</span> <span class="o">=</span> <span class="s">&quot;/api/audience&quot;</span>
</span><span class="line">  <span class="n">CreateTokenUrlPath</span> <span class="o">=</span> <span class="s">&quot;/oauth2/token&quot;</span>
</span><span class="line">  <span class="n">SaveAudience</span> <span class="o">=</span> <span class="nn">AudienceStorage</span><span class="p">.</span><span class="n">saveAudience</span>
</span><span class="line">  <span class="n">GetAudience</span> <span class="o">=</span> <span class="nn">AudienceStorage</span><span class="p">.</span><span class="n">getAudience</span>
</span><span class="line">  <span class="n">Issuer</span> <span class="o">=</span> <span class="s">&quot;http://localhost:8083/suave&quot;</span>
</span><span class="line">  <span class="n">TokenTimeSpan</span> <span class="o">=</span> <span class="nn">TimeSpan</span><span class="p">.</span><span class="n">FromMinutes</span><span class="o">(</span><span class="mi">1</span><span class="o">.)</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">identityStore</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">getClaims</span> <span class="o">=</span> <span class="nn">IdentityStore</span><span class="p">.</span><span class="n">getClaims</span>
</span><span class="line">  <span class="n">isValidCredentials</span> <span class="o">=</span> <span class="nn">IdentityStore</span><span class="p">.</span><span class="n">isValidCredentials</span>
</span><span class="line">  <span class="n">getSecurityKey</span> <span class="o">=</span> <span class="nn">KeyStore</span><span class="p">.</span><span class="n">securityKey</span>
</span><span class="line">  <span class="n">getSigningCredentials</span> <span class="o">=</span> <span class="nn">KeyStore</span><span class="p">.</span><span class="n">hmacSha256</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">audienceWebPart</span><span class="k">&#39;</span> <span class="o">=</span> <span class="n">audienceWebPart</span> <span class="n">authorizationServerConfig</span> <span class="n">identityStore</span>
</span><span class="line">
</span><span class="line"><span class="n">startWebServer</span> <span class="n">defaultConfig</span> <span class="n">audienceWebPart&#39;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p><strong>AudienceStorage.fs</strong></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">getAudience</span> <span class="n">clientId</span> <span class="o">=</span>
</span><span class="line">  <span class="k">if</span> <span class="n">audienceStorage</span><span class="o">.</span><span class="n">ContainsKey</span><span class="o">(</span><span class="n">clientId</span><span class="o">)</span> <span class="k">then</span>
</span><span class="line">    <span class="n">Some</span> <span class="n">audienceStorage</span><span class="o">.[</span><span class="n">clientId</span><span class="o">]</span> <span class="o">|&gt;</span> <span class="n">async</span><span class="o">.</span><span class="n">Return</span>
</span><span class="line">  <span class="k">else</span>
</span><span class="line">    <span class="n">None</span> <span class="o">|&gt;</span> <span class="n">async</span><span class="o">.</span><span class="n">Return</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <em>KeyStore</em> and <em>IdentityStore</em> do not exists, so let’s add them</p>

<p>Add <em>KeyStore.fs</em> in the <strong>SuaveJwt</strong> project and it provide the in-memory symmetric security key based on <a href="https://en.wikipedia.org/wiki/Hash-based_message_authentication_code">HMAC</a></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">module</span> <span class="nn">KeyStore</span>
</span><span class="line"><span class="k">open</span> <span class="nn">System.IdentityModel.Tokens</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Encodings</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">securityKey</span> <span class="n">sharedKey</span> <span class="o">:</span> <span class="n">SecurityKey</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">symmetricKey</span> <span class="o">=</span> <span class="n">sharedKey</span> <span class="o">|&gt;</span> <span class="nn">Base64String</span><span class="p">.</span><span class="n">decode</span>
</span><span class="line">  <span class="k">new</span> <span class="n">InMemorySymmetricSecurityKey</span><span class="o">(</span><span class="n">symmetricKey</span><span class="o">)</span> <span class="o">:&gt;</span> <span class="n">SecurityKey</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">hmacSha256</span> <span class="n">secretKey</span> <span class="o">=</span>
</span><span class="line">  <span class="k">new</span> <span class="n">SigningCredentials</span><span class="o">(</span><span class="n">secretKey</span><span class="o">,</span><span class="nn">SecurityAlgorithms</span><span class="p">.</span><span class="n">HmacSha256Signature</span><span class="o">,</span> <span class="nn">SecurityAlgorithms</span><span class="p">.</span><span class="n">Sha256Digest</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Then add <em>IdentityStore.fs</em> in the <strong>SuaveJwt.AuthServerHost</strong> project.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">module</span> <span class="nn">IdentityStore</span>
</span><span class="line"><span class="k">open</span> <span class="nn">System.Security.Claims</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">getClaims</span> <span class="n">userName</span> <span class="o">=</span>
</span><span class="line">  <span class="n">seq</span> <span class="o">{</span>
</span><span class="line">    <span class="k">yield</span> <span class="o">(</span><span class="nn">ClaimTypes</span><span class="p">.</span><span class="n">Name</span><span class="o">,</span> <span class="n">userName</span><span class="o">)</span>
</span><span class="line">    <span class="k">if</span> <span class="o">(</span><span class="n">userName</span> <span class="o">=</span> <span class="s">&quot;Admin&quot;</span><span class="o">)</span> <span class="k">then</span>
</span><span class="line">      <span class="k">yield</span> <span class="o">(</span><span class="nn">ClaimTypes</span><span class="p">.</span><span class="n">Role</span><span class="o">,</span> <span class="s">&quot;Admin&quot;</span><span class="o">)</span>
</span><span class="line">    <span class="k">if</span> <span class="o">(</span><span class="n">userName</span> <span class="o">=</span> <span class="s">&quot;Foo&quot;</span><span class="o">)</span> <span class="k">then</span>
</span><span class="line">      <span class="k">yield</span> <span class="o">(</span><span class="nn">ClaimTypes</span><span class="p">.</span><span class="n">Role</span><span class="o">,</span> <span class="s">&quot;SuperUser&quot;</span><span class="o">)</span>
</span><span class="line">  <span class="o">}</span> <span class="o">|&gt;</span> <span class="nn">Seq</span><span class="p">.</span><span class="n">map</span> <span class="o">(</span><span class="k">fun</span> <span class="n">x</span> <span class="o">-&gt;</span> <span class="k">new</span> <span class="n">Claim</span><span class="o">(</span><span class="n">fst</span> <span class="n">x</span><span class="o">,</span> <span class="n">snd</span> <span class="n">x</span><span class="o">))</span> <span class="o">|&gt;</span> <span class="n">async</span><span class="o">.</span><span class="n">Return</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">isValidCredentials</span> <span class="n">username</span> <span class="n">password</span> <span class="o">=</span>
</span><span class="line">  <span class="n">username</span> <span class="o">=</span> <span class="n">password</span> <span class="o">|&gt;</span> <span class="n">async</span><span class="o">.</span><span class="n">Return</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>To keep this simple, I am just hardcoding the credentials and claims here and it can be replaced with any backend. In this case, I am just going with accepting all the credentials as valid if the username and password are same.</p>

<p>Let’s run the <strong>SuaveJwt.AuthServerHost</strong> and verify the token</p>

<p><img class="center" src="http://blog.tamizhvendan.in/images/suave_jwt/audience_admin_token.png" /></p>

<h2 id="securing-the-resources">Securing the resources</h2>

<p>Now we have come to the interesting part of securing the resources using the <em>access token</em> created in the above step</p>

<p>The first step to achieving this to validate the incoming access token. Let’s add this validation logic in the <em>JwtToken.fs</em> file.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">type</span> <span class="nc">TokenValidationRequest</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">Issuer</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line">  <span class="n">SecurityKey</span> <span class="o">:</span> <span class="n">SecurityKey</span>
</span><span class="line">  <span class="n">ClientId</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line">  <span class="n">AccessToken</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">validate</span> <span class="n">tokenValidationRequest</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">tokenValidationParameters</span> <span class="o">=</span>
</span><span class="line">    <span class="k">let</span> <span class="nv">validationParams</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TokenValidationParameters</span><span class="bp">()</span>
</span><span class="line">    <span class="n">validationParams</span><span class="o">.</span><span class="n">ValidAudience</span> <span class="o">&lt;-</span> <span class="n">tokenValidationRequest</span><span class="o">.</span><span class="n">ClientId</span>
</span><span class="line">    <span class="n">validationParams</span><span class="o">.</span><span class="n">ValidIssuer</span> <span class="o">&lt;-</span> <span class="n">tokenValidationRequest</span><span class="o">.</span><span class="n">Issuer</span>
</span><span class="line">    <span class="n">validationParams</span><span class="o">.</span><span class="n">ValidateLifetime</span> <span class="o">&lt;-</span> <span class="k">true</span>
</span><span class="line">    <span class="n">validationParams</span><span class="o">.</span><span class="n">ValidateIssuerSigningKey</span> <span class="o">&lt;-</span> <span class="k">true</span>
</span><span class="line">    <span class="n">validationParams</span><span class="o">.</span><span class="n">IssuerSigningKey</span> <span class="o">&lt;-</span>  <span class="n">tokenValidationRequest</span><span class="o">.</span><span class="n">SecurityKey</span>
</span><span class="line">    <span class="n">validationParams</span>
</span><span class="line">  <span class="k">try</span>
</span><span class="line">    <span class="k">let</span> <span class="nv">handler</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JwtSecurityTokenHandler</span><span class="bp">()</span>
</span><span class="line">    <span class="k">let</span> <span class="nv">principal</span> <span class="o">=</span>
</span><span class="line">      <span class="n">handler</span><span class="o">.</span><span class="n">ValidateToken</span><span class="o">(</span><span class="n">tokenValidationRequest</span><span class="o">.</span><span class="n">AccessToken</span><span class="o">,</span> <span class="n">tokenValidationParameters</span><span class="o">,</span> <span class="n">ref</span> <span class="k">null</span><span class="o">)</span>
</span><span class="line">    <span class="n">principal</span><span class="o">.</span><span class="n">Claims</span> <span class="o">|&gt;</span> <span class="n">Choice1Of2</span>
</span><span class="line">  <span class="k">with</span>
</span><span class="line">    <span class="o">|</span> <span class="n">ex</span> <span class="o">-&gt;</span> <span class="n">ex</span><span class="o">.</span><span class="n">Message</span> <span class="o">|&gt;</span> <span class="n">Choice2Of2</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <code>validate</code> function returns a <code>Choice</code> type which contains either a sequence of <a href="https://msdn.microsoft.com/en-us/library/system.security.claims(v=vs.110).aspx">Claims</a> present in the token if the access token is valid or an error message describing what’s wrong with the access token</p>

<p>The next step is using this function to secure a Suave <em>WebPart</em></p>

<p>Create a new source file <em>Secure.fs</em> in the <strong>SuaveJwt</strong> project and add the following code</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">type</span> <span class="nc">JwtConfig</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">    <span class="n">Issuer</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line">    <span class="n">SecurityKey</span> <span class="o">:</span> <span class="n">SecurityKey</span>
</span><span class="line">    <span class="n">ClientId</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">jwtAuthenticate</span> <span class="n">jwtConfig</span> <span class="n">webpart</span> <span class="o">(</span><span class="n">ctx</span><span class="o">:</span> <span class="n">HttpContext</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">
</span><span class="line">  <span class="k">let</span> <span class="nv">updateContextWithClaims</span> <span class="n">claims</span> <span class="o">=</span>
</span><span class="line">    <span class="o">{</span> <span class="n">ctx</span> <span class="k">with</span> <span class="n">userState</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="n">userState</span><span class="o">.</span><span class="n">Remove</span><span class="o">(</span><span class="s">&quot;Claims&quot;</span><span class="o">).</span><span class="n">Add</span><span class="o">(</span><span class="s">&quot;Claims&quot;</span><span class="o">,</span> <span class="n">claims</span><span class="o">)</span> <span class="o">}</span>
</span><span class="line">
</span><span class="line">  <span class="k">match</span> <span class="n">ctx</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">header</span> <span class="s">&quot;token&quot;</span> <span class="k">with</span>
</span><span class="line">  <span class="o">|</span> <span class="n">Choice1Of2</span> <span class="n">accessToken</span> <span class="o">-&gt;</span>
</span><span class="line">      <span class="k">let</span> <span class="nv">tokenValidationRequest</span> <span class="o">=</span>  <span class="o">{</span>
</span><span class="line">        <span class="n">Issuer</span> <span class="o">=</span> <span class="n">jwtConfig</span><span class="o">.</span><span class="n">Issuer</span>
</span><span class="line">        <span class="n">SecurityKey</span> <span class="o">=</span> <span class="n">jwtConfig</span><span class="o">.</span><span class="n">SecurityKey</span>
</span><span class="line">        <span class="n">ClientId</span> <span class="o">=</span> <span class="n">jwtConfig</span><span class="o">.</span><span class="n">ClientId</span>
</span><span class="line">        <span class="n">AccessToken</span> <span class="o">=</span> <span class="n">accessToken</span>
</span><span class="line">      <span class="o">}</span>
</span><span class="line">      <span class="k">let</span> <span class="nv">validationResult</span> <span class="o">=</span> <span class="n">validate</span> <span class="n">tokenValidationRequest</span>
</span><span class="line">      <span class="k">match</span> <span class="n">validationResult</span> <span class="k">with</span>
</span><span class="line">      <span class="o">|</span> <span class="n">Choice1Of2</span> <span class="n">claims</span> <span class="o">-&gt;</span> <span class="n">webpart</span> <span class="o">(</span><span class="n">updateContextWithClaims</span> <span class="n">claims</span><span class="o">)</span>
</span><span class="line">      <span class="o">|</span> <span class="n">Choice2Of2</span> <span class="n">err</span> <span class="o">-&gt;</span> <span class="n">FORBIDDEN</span> <span class="n">err</span> <span class="n">ctx</span>
</span><span class="line">
</span><span class="line">  <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">BAD_REQUEST</span> <span class="s">&quot;Invalid Request. Provide both clientid and token&quot;</span> <span class="n">ctx</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <code>jwtAuthenticate</code> function validates the access token present in the request header and invokes the given <em>WebPart</em> if it is valid. In case of invalid or absence of access token, it returns an HTTP error response instead of executing the <em>WebPart</em>.</p>

<p>Upon successful access token validation, the <code>jwtAuthenticate</code> function puts the claims in the <code>userState</code> map of incoming <code>HttpContext</code> so that subsequent <em>WebPart</em>s in the pipeline can use it.</p>

<p>The <code>JwtConfig</code> record abstracts the underlying audience from the validation logic so that it can be reused across multiple audiences.</p>

<p>Now we have a functionality secure a web part. Let’s create an audience and leverage this</p>

<p>Update the <em>Program.fs</em> file in the <strong>Audience1</strong> project as mentioned below</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="o">[&lt;</span><span class="n">EntryPoint</span><span class="o">&gt;]</span>
</span><span class="line"><span class="k">let</span> <span class="nv">main</span> <span class="n">argv</span> <span class="o">=</span>
</span><span class="line">
</span><span class="line">  <span class="k">let</span> <span class="nv">jwtConfig</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">    <span class="n">Issuer</span> <span class="o">=</span> <span class="s">&quot;http://localhost:8083/suave&quot;</span>
</span><span class="line">    <span class="n">ClientId</span> <span class="o">=</span> <span class="s">&quot;7ff79ba3305c4e4f9d0ececeae70c78f&quot;</span>
</span><span class="line">    <span class="n">SecurityKey</span> <span class="o">=</span> <span class="nn">KeyStore</span><span class="p">.</span><span class="n">securityKey</span> <span class="o">(</span><span class="nn">Base64String</span><span class="p">.</span><span class="n">fromString</span> <span class="s">&quot;Op5EqjC70aLS2dx3gI0zADPIZGX2As6UEwjA4oyBjMo&quot;</span><span class="o">)</span>
</span><span class="line">  <span class="o">}</span>
</span><span class="line">
</span><span class="line">  <span class="k">let</span> <span class="nv">sample1</span> <span class="o">=</span> <span class="n">path</span> <span class="s">&quot;/audience1/sample1&quot;</span> <span class="o">&gt;=&gt;</span> <span class="n">jwtAuthenticate</span> <span class="n">jwtConfig</span> <span class="o">(</span><span class="n">OK</span> <span class="s">&quot;Sample 1&quot;</span><span class="o">)</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">config</span> <span class="o">=</span> <span class="o">{</span> <span class="n">defaultConfig</span> <span class="k">with</span> <span class="n">bindings</span> <span class="o">=</span> <span class="o">[</span><span class="nn">HttpBinding</span><span class="p">.</span><span class="n">mkSimple</span> <span class="n">HTTP</span> <span class="s">&quot;127.0.0.1&quot;</span> <span class="mi">8084</span><span class="o">]</span> <span class="o">}</span>
</span><span class="line">
</span><span class="line">  <span class="n">startWebServer</span> <span class="n">config</span> <span class="n">sample1</span>
</span><span class="line">  <span class="mi">0</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>I’ve asked you to keep a note of the <em>clientId</em> and the <em>securityKey</em> while doing the registration of <strong>Audience1</strong>. We are using them here in the <code>jwtConfig</code> record.</p>

<p>Let’s see it in action</p>

<p><img class="center" src="http://blog.tamizhvendan.in/images/suave_jwt/audience_sample1_success.png" /></p>

<p>Hurray! We have made it. “/audience1/sample1” is a secured API now!</p>

<p>What will happen if we mess with the access token? Well, we will get an HTTP error. Let’s change the character <code>Q</code> in the access token from upper case to lower case and here is the result of it.</p>

<p><img class="center" src="http://blog.tamizhvendan.in/images/suave_jwt/audience_sample1_error.png" /></p>

<p>Cool, Isn’t it?</p>

<p>Let’s add authorization based on the claims that we have obtained from the JWT token</p>

<p>Open <em>Secure.fs</em> and update the authorization functionality</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">type</span> <span class="nc">AuthorizationResult</span> <span class="o">=</span>
</span><span class="line">  <span class="o">|</span> <span class="n">Authorized</span>
</span><span class="line">  <span class="o">|</span> <span class="n">UnAuthorized</span> <span class="k">of</span> <span class="kt">string</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">jwtAuthorize</span> <span class="n">jwtConfig</span> <span class="n">authorizeUser</span> <span class="n">webpart</span>  <span class="o">=</span>
</span><span class="line">
</span><span class="line">  <span class="k">let</span> <span class="nv">getClaims</span> <span class="o">(</span><span class="n">ctx</span><span class="o">:</span> <span class="n">HttpContext</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">    <span class="k">let</span> <span class="nv">userState</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="n">userState</span>
</span><span class="line">    <span class="k">if</span> <span class="n">userState</span><span class="o">.</span><span class="n">ContainsKey</span><span class="o">(</span><span class="s">&quot;Claims&quot;</span><span class="o">)</span> <span class="k">then</span>
</span><span class="line">      <span class="k">match</span> <span class="n">userState</span><span class="o">.</span><span class="n">Item</span> <span class="s">&quot;Claims&quot;</span> <span class="k">with</span>
</span><span class="line">      <span class="o">|</span> <span class="o">:?</span> <span class="o">(</span><span class="n">Claim</span> <span class="n">seq</span><span class="o">)</span> <span class="k">as</span> <span class="n">claims</span> <span class="o">-&gt;</span> <span class="n">Some</span> <span class="n">claims</span>
</span><span class="line">      <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">None</span>
</span><span class="line">    <span class="k">else</span>
</span><span class="line">        <span class="n">None</span>
</span><span class="line">
</span><span class="line">  <span class="k">let</span> <span class="nv">authorize</span> <span class="n">httpContext</span> <span class="o">=</span>
</span><span class="line">    <span class="k">match</span> <span class="n">getClaims</span> <span class="n">httpContext</span> <span class="k">with</span>
</span><span class="line">    <span class="o">|</span> <span class="n">Some</span> <span class="n">claims</span> <span class="o">-&gt;</span>
</span><span class="line">        <span class="n">async</span> <span class="o">{</span>
</span><span class="line">          <span class="k">let!</span> <span class="nv">authorizationResult</span> <span class="o">=</span> <span class="n">authorizeUser</span> <span class="n">claims</span>
</span><span class="line">          <span class="k">match</span> <span class="n">authorizationResult</span> <span class="k">with</span>
</span><span class="line">          <span class="o">|</span> <span class="n">Authorized</span> <span class="o">-&gt;</span> <span class="k">return</span><span class="o">!</span> <span class="n">webpart</span> <span class="n">httpContext</span>
</span><span class="line">          <span class="o">|</span> <span class="n">UnAuthorized</span> <span class="n">err</span> <span class="o">-&gt;</span> <span class="k">return</span><span class="o">!</span> <span class="n">FORBIDDEN</span> <span class="n">err</span> <span class="n">httpContext</span>
</span><span class="line">        <span class="o">}</span>
</span><span class="line">    <span class="o">|</span> <span class="n">None</span> <span class="o">-&gt;</span> <span class="n">FORBIDDEN</span> <span class="s">&quot;Claims not found&quot;</span> <span class="n">httpContext</span>
</span><span class="line">
</span><span class="line">  <span class="n">jwtAuthenticate</span> <span class="n">jwtConfig</span> <span class="n">authorize</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <code>jwtConfig</code> function is very similar to the <code>jwtAuthenticate</code> function which provides authorization in addition to the authentication.</p>

<p>The key here is the parameter <code>authorizeUser</code> which is a function that takes a sequence of claims and returns an <code>AuthorizationResult</code>.</p>

<p>Like <code>jwtAuthenticate`` function, the</code>jwtConfig&#8220;` function is also abstracted from the underlying <em>Audience</em> so we can use it across multiple <em>Audience</em>s.</p>

<p>Let’s use this in the <strong>Audience1</strong>.</p>

<p><strong>Program.fs</strong></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="o">[&lt;</span><span class="n">EntryPoint</span><span class="o">&gt;]</span>
</span><span class="line"><span class="k">let</span> <span class="nv">main</span> <span class="n">argv</span> <span class="o">=</span>
</span><span class="line">
</span><span class="line">  <span class="c1">// ... existing code ...</span>
</span><span class="line">
</span><span class="line">  <span class="c1">// Claim Seq -&gt; Async&lt;AuthorizationResult&gt;</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">authorizeAdmin</span> <span class="o">(</span><span class="n">claims</span> <span class="o">:</span> <span class="n">Claim</span> <span class="n">seq</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">    <span class="k">match</span> <span class="n">claims</span> <span class="o">|&gt;</span> <span class="nn">Seq</span><span class="p">.</span><span class="n">tryFind</span> <span class="o">(</span><span class="k">fun</span> <span class="n">c</span> <span class="o">-&gt;</span> <span class="n">c</span><span class="o">.</span><span class="n">Type</span> <span class="o">=</span> <span class="nn">ClaimTypes</span><span class="p">.</span><span class="n">Role</span> <span class="o">&amp;&amp;</span> <span class="n">c</span><span class="o">.</span><span class="n">Value</span> <span class="o">=</span> <span class="s">&quot;Admin&quot;</span><span class="o">)</span> <span class="k">with</span>
</span><span class="line">    <span class="o">|</span> <span class="n">Some</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">Authorized</span> <span class="o">|&gt;</span> <span class="n">async</span><span class="o">.</span><span class="n">Return</span>
</span><span class="line">    <span class="o">|</span> <span class="n">None</span> <span class="o">-&gt;</span> <span class="n">UnAuthorized</span> <span class="s">&quot;User is not an admin&quot;</span> <span class="o">|&gt;</span> <span class="n">async</span><span class="o">.</span><span class="n">Return</span>
</span><span class="line">
</span><span class="line">  <span class="k">let</span> <span class="nv">sample2</span> <span class="o">=</span> <span class="n">path</span> <span class="s">&quot;/audience1/sample2&quot;</span> <span class="o">&gt;=&gt;</span> <span class="n">jwtAuthorize</span> <span class="n">jwtConfig</span> <span class="n">authorizeAdmin</span> <span class="o">(</span><span class="n">OK</span> <span class="s">&quot;Sample 2&quot;</span><span class="o">)</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">app</span> <span class="o">=</span> <span class="n">choose</span> <span class="o">[</span><span class="n">sample1</span><span class="o">;</span><span class="n">sample2</span><span class="o">]</span>
</span><span class="line">
</span><span class="line">  <span class="n">startWebServer</span> <span class="n">config</span> <span class="n">app</span>
</span><span class="line">  <span class="mi">0</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <code>jwtAuthroize</code> function in action</p>

<p><img class="center" src="http://blog.tamizhvendan.in/images/suave_jwt/audience1_sample2_error.png" /></p>

<p><em>Note: I’ve generated a new access token here to exercise this use case.</em></p>

<p>That’s it we have successfully completed all the three steps mentioned at the beginning of this blog post.</p>

<h2 id="a-supplement">A Supplement</h2>

<p>One cool thing about the design of the <strong>SuaveJwt</strong> library is, it doesn’t have any assumption about the <em>Authorization Server</em> and the <em>Resource Server</em>. Because of it, we can easily extend it.</p>

<p>Let’s prove it by updating the <em>Program.fs</em> file in the <strong>Audience2</strong> project.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="o">[&lt;</span><span class="n">EntryPoint</span><span class="o">&gt;]</span>
</span><span class="line"><span class="k">let</span> <span class="nv">main</span> <span class="n">argv</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">jwtConfig</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">    <span class="n">Issuer</span> <span class="o">=</span> <span class="s">&quot;http://localhost:8083/suave&quot;</span>
</span><span class="line">    <span class="n">ClientId</span> <span class="o">=</span> <span class="s">&quot;ada9263885c440869fb484fe354de13d&quot;</span>
</span><span class="line">    <span class="n">SecurityKey</span> <span class="o">=</span> <span class="nn">KeyStore</span><span class="p">.</span><span class="n">securityKey</span> <span class="o">(</span><span class="nn">Base64String</span><span class="p">.</span><span class="n">fromString</span> <span class="s">&quot;0RWyzyttDmJtiaYkG9rph5cqxCTI8YAOsR7stq-P_5o&quot;</span><span class="o">)</span>
</span><span class="line">  <span class="o">}</span>
</span><span class="line">
</span><span class="line">  <span class="k">let</span> <span class="nv">authorizeSuperUser</span> <span class="o">(</span><span class="n">claims</span> <span class="o">:</span> <span class="n">Claim</span> <span class="n">seq</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">    <span class="k">match</span> <span class="n">claims</span> <span class="o">|&gt;</span> <span class="nn">Seq</span><span class="p">.</span><span class="n">tryFind</span> <span class="o">(</span><span class="k">fun</span> <span class="n">c</span> <span class="o">-&gt;</span> <span class="n">c</span><span class="o">.</span><span class="n">Type</span> <span class="o">=</span> <span class="nn">ClaimTypes</span><span class="p">.</span><span class="n">Role</span> <span class="o">&amp;&amp;</span> <span class="n">c</span><span class="o">.</span><span class="n">Value</span> <span class="o">=</span> <span class="s">&quot;SuperUser&quot;</span><span class="o">)</span> <span class="k">with</span>
</span><span class="line">    <span class="o">|</span> <span class="n">Some</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">Authorized</span> <span class="o">|&gt;</span> <span class="n">async</span><span class="o">.</span><span class="n">Return</span>
</span><span class="line">    <span class="o">|</span> <span class="n">None</span> <span class="o">-&gt;</span> <span class="n">UnAuthorized</span> <span class="s">&quot;User is not a Super User&quot;</span> <span class="o">|&gt;</span> <span class="n">async</span><span class="o">.</span><span class="n">Return</span>
</span><span class="line">
</span><span class="line">  <span class="k">let</span> <span class="nv">authorize</span> <span class="o">=</span> <span class="n">jwtAuthorize</span> <span class="n">jwtConfig</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">sample1</span> <span class="o">=</span> <span class="n">path</span> <span class="s">&quot;/audience2/sample1&quot;</span> <span class="o">&gt;=&gt;</span> <span class="n">OK</span> <span class="s">&quot;Sample 1&quot;</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">sample2</span> <span class="o">=</span> <span class="n">path</span> <span class="s">&quot;/audience2/sample2&quot;</span> <span class="o">&gt;=&gt;</span> <span class="n">authorize</span> <span class="n">authorizeSuperUser</span> <span class="o">(</span><span class="n">OK</span> <span class="s">&quot;Sample 2&quot;</span><span class="o">)</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">config</span> <span class="o">=</span> <span class="o">{</span> <span class="n">defaultConfig</span> <span class="k">with</span> <span class="n">bindings</span> <span class="o">=</span> <span class="o">[</span><span class="nn">HttpBinding</span><span class="p">.</span><span class="n">mkSimple</span> <span class="n">HTTP</span> <span class="s">&quot;127.0.0.1&quot;</span> <span class="mi">8085</span><span class="o">]</span> <span class="o">}</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">app</span> <span class="o">=</span> <span class="n">choose</span> <span class="o">[</span><span class="n">sample1</span><span class="o">;</span><span class="n">sample2</span><span class="o">]</span>
</span><span class="line">
</span><span class="line">  <span class="n">startWebServer</span> <span class="n">config</span> <span class="n">app</span>
</span><span class="line">  <span class="mi">0</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Note that the <code>jwtConfig</code> values are different from that of <strong>Audience1</strong> and it is obtained from calling the <strong>AuthorizationServer</strong>’s audience registration API for <strong>Audience2</strong>.</p>

<h2 id="summary">Summary</h2>

<p>Suave provides a simple and elegant way of extending its core functionality. In this blog post, we have seen how to bend it to support JWT based authorization and I believe we can do a lot of other cool things too!</p>

<p>You can find the complete source code of the sample application used in this blog post in my <a href="https://github.com/tamizhvendan/blog-samples/tree/master/SuaveJwtSampleApplication">blog-samples</a> GitHub repository.    </p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Building REST Api in fsharp using Suave]]></title>
    <link href="http://blog.tamizhvendan.in/blog/2015/06/11/building-rest-api-in-fsharp-using-suave/"/>
    <updated>2015-06-11T10:48:20+05:30</updated>
    <id>http://blog.tamizhvendan.in/blog/2015/06/11/building-rest-api-in-fsharp-using-suave</id>
    <content type="html"><![CDATA[<p>In the last one month lot of great things happening in fsharp world around <a href="suave.io">suave</a>, a simple web development fsharp library. Scott Hanselman <a href="http://www.hanselman.com/blog/RunningSuaveioAndFWithFAKEInAzureWebAppsWithGitAndTheDeployButton.aspx">blogged</a> about it, <a href="https://twitter.com/tomaspetricek">Tomas Petricek</a> kick-started an awesome <a href="https://skillsmatter.com/skillscasts/6381-suave-hands-on-with-tomas-petricek">hands on session</a> and followed up with a <a href="http://channel9.msdn.com/Blogs/Seth-Juarez/Deploying-an-F-Web-Application-with-Suave">great talk</a> on Channel 9. Last but not the least, <a href="https://twitter.com/theimowski">Tomasz Heimowski</a> authored a clear and crisp <a href="http://theimowski.gitbooks.io/suave-music-store/content/">book on Suave</a></p>

<p>I got super excited after learning suave from these resources and started playing with it. One of the great things about the fsharp community is, if you want to improve any existing library all you need is just send a pull request with the feature you would like to have. Yes, it’s as simple as that! It <a href="https://github.com/SuaveIO/suave/pull/259">worked</a> for me and I am sure for you too, if you wish.</p>

<p>In this blog post, you are going to learn how to build a REST api using suave. The REST api that we are going to create here follows the standard being used in the <a href="http://docs.strongloop.com/display/public/LB/Use+API+Explorer">StrongLoop</a>, a node.js REST api library. To keep things simple, we are not going to see validation and error handling as part of this post and I will be covering that in an another post.</p>

<p>Let’s get started</p>

<h2 id="setting-up-the-project">Setting up the project</h2>

<p>Create a new “F# Console Application” project in Visual Studio with the name <code>SuaveRestApi</code> and rename <code>Program.fs</code> to <code>App.fs</code>. This file is going to contain the application bootstrap logic. Add two more files <code>Db.fs</code> and <code>RestFul.fs</code> which would contain database access and restful api implementation code respectively. Ensure these files are in the order as shown in below.</p>

<p><img class="center" src="http://blog.tamizhvendan.in/images/sauve_rest_api/proj_structure.png" /></p>

<p>After creating, install the following nuget packages</p>

<ul>
  <li><a href="https://www.nuget.org/packages/suave">Suave</a></li>
  <li><a href="">Newtonsoft.Json</a></li>
</ul>

<h2 id="webpart">WebPart</h2>

<p>The basic building block of Suave is <a href="http://theimowski.gitbooks.io/suave-music-store/content/webpart.html">WebPart</a>. It is an alias of function type <code>HttpContext -&gt; Async&lt;HttpContext option&gt;</code>. This simple function type actually model whole set of Request and Response model of Http protocol. From the Tomasz Heimowski’s book here is the definition of the <code>WebPart</code></p>

<blockquote>
  <p>Based on the http context, we give you a promise (async) of optional resulting http context, where the resulting context is likely to have its response set with regards to the logic of the WebPart itself</p>
</blockquote>

<p>A <code>WebPart</code> represents a http request and response. Since it is a function, we can combine multiple <code>WebPart</code>s together and build a complex web application which handles multiple requests and responses. This is the beauty of functional programming. You just think in terms of one function at a time and make it work. Once you are done, all you need to do is just gluing them together. Solving problems using this functional abstraction will make things much easier and help you to write less code compare to its Object Oriented version.</p>

<p>The <code>OK</code> webpart is a very simple one in Suave which takes a <code>string</code> and returns a http response with the status code <code>200</code> and the given string. Add the following code in the <code>App.fs</code> and run the console app.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">open</span> <span class="nn">Suave.Web</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Successful</span>
</span><span class="line">
</span><span class="line"><span class="o">[&lt;</span><span class="n">EntryPoint</span><span class="o">&gt;]</span>
</span><span class="line"><span class="k">let</span> <span class="nv">main</span> <span class="n">argv</span> <span class="o">=</span>
</span><span class="line">  <span class="n">startWebServer</span> <span class="n">defaultConfig</span> <span class="o">(</span><span class="n">OK</span> <span class="s">&quot;Hello, Suave!&quot;</span><span class="o">)</span>
</span><span class="line">  <span class="mi">0</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
<p>The is the simplest Suave application that greets all visitors with the string “Hello, Suave!”. The <code>startWebServer</code> is a blocking function that takes a configuration (port number, ssl, etc.,) and starts a http web server in the port 8083 upon calling.</p>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/sauve_rest_api/hello_suave.png" /></p>

<p>The Rest Api that we are going to design here is a <code>WebPart</code> which will be replacing this <code>OK</code> webpart.</p>

<h2 id="http-get">HTTP GET</h2>

<p>Let’s begin by defining a record type representing a <em>restful</em> resource. Open <code>Restful.fs</code> and update it as below</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">namespace</span> <span class="nn">SuaveRestApi</span><span class="p">.</span><span class="n">Rest</span>
</span><span class="line"><span class="o">[&lt;</span><span class="n">AutoOpen</span><span class="o">&gt;]</span>
</span><span class="line"><span class="k">module</span> <span class="nn">RestFul</span> <span class="o">=</span>
</span><span class="line">  <span class="k">type</span> <span class="nc">RestResource</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">    <span class="n">GetAll</span> <span class="o">:</span> <span class="kt">unit</span> <span class="o">-&gt;</span> <span class="k">&#39;</span><span class="n">a</span> <span class="n">seq</span>
</span><span class="line">  <span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>This <code>RestResource</code> is a container representing all the operations on a restful  resource. This record type abstracts the actual resource from the rest api web part. This enables the reuse of rest api web part across multiple resources.</p>

<p>Let’s create a function in <code>RestFul.fs</code> which takes a resource name and this <code>RestResource</code> and returns a web part representing the restful api.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// string -&gt; RestResource&lt;&#39;a&gt; -&gt; WebPart</span>
</span><span class="line"><span class="k">let</span> <span class="nv">rest</span> <span class="n">resourceName</span> <span class="n">resource</span> <span class="o">=</span>
</span><span class="line">  <span class="c1">// TODO</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>We are going to use the following building blocks of the suave library to implement the <code>rest</code> function.</p>

<ul>
  <li>
    <p>The <code>path</code> is a function of type: <code>string -&gt; WebPart</code>. It means that if we give it a string it will return <code>WebPart</code>. Under the hood, the function looks at the incoming request and returns <code>Some</code> if the paths match, and <code>None</code> otherwise.</p>
  </li>
  <li>
    <p>The <code>GET</code> is a static inbuilt <code>WebPart</code> which matches the HTTP GET requests.</p>
  </li>
  <li>
    <p>The <code>&gt;=&gt;</code> operator composes two WebParts into one by first evaluating the <code>WebPart</code> on the left, and applying the WebPart on the right only if the first one returned <code>Some</code>.</p>
  </li>
</ul>

<p>To return a json response we need to change the mime type to “application/json” of the response. There is an <a href="https://github.com/SuaveIO/suave/blob/master/src/Suave/Json.fs">inbuilt function</a> in suave to do this but it is using .Net’s <code>DataContractJsonSerializer</code>. I feel it’s not ideal to use as we need to write decorator attribute <code>DataMember</code> to serialize the types.</p>

<p>As <a href="http://james.newtonking.com/archive/2014/04/30/json-net-6-0-release-3-serialize-all-the-f">Newtonsoft.Json</a> provides serialization support for fsharp types without any need of decorating attributes, we will be using them there.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// &#39;a -&gt; WebPart</span>
</span><span class="line"><span class="k">let</span> <span class="nv">JSON</span> <span class="n">v</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">jsonSerializerSettings</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JsonSerializerSettings</span><span class="bp">()</span>
</span><span class="line">  <span class="n">jsonSerializerSettings</span><span class="o">.</span><span class="n">ContractResolver</span> <span class="o">&lt;-</span> <span class="k">new</span> <span class="n">CamelCasePropertyNamesContractResolver</span><span class="bp">()</span>
</span><span class="line">
</span><span class="line">  <span class="nn">JsonConvert</span><span class="p">.</span><span class="n">SerializeObject</span><span class="o">(</span><span class="n">v</span><span class="o">,</span> <span class="n">jsonSerializerSettings</span><span class="o">)</span>
</span><span class="line">  <span class="o">|&gt;</span> <span class="n">OK</span>
</span><span class="line">  <span class="o">&gt;=&gt;</span> <span class="nn">Writers</span><span class="p">.</span><span class="n">setMimeType</span> <span class="s">&quot;application/json; charset=utf-8&quot;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
<p>As the signature indicates <code>JSON</code> function takes a generic type, serialize it using <em>Newtonsoft.Json</em> and return the json response. <code>Writers.setMimeType</code> takes a mime type and a web part returns the web part with the given mime type.</p>

<p>Now we have everything to implement the HTTP GET request</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">rest</span> <span class="n">resourceName</span> <span class="n">resource</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">resourcePath</span> <span class="o">=</span> <span class="s">&quot;/&quot;</span> <span class="o">+</span> <span class="n">resourceName</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">gellAll</span> <span class="o">=</span> <span class="n">resource</span><span class="o">.</span><span class="n">GetAll</span> <span class="bp">()</span> <span class="o">|&gt;</span> <span class="n">JSON</span>
</span><span class="line">  <span class="n">path</span> <span class="n">resourcePath</span> <span class="o">&gt;=&gt;</span> <span class="n">GET</span> <span class="o">&gt;=&gt;</span> <span class="n">getAll</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The one caveat here is the path resolution of Suave library. Based on the webpart given, the <code>startWebServer</code> function configures it’s internal routing table during the application startup and it is static after the application has been started. So, the <code>getAll</code> webpart will be created only during application startup. To avoid this, we need to wrap the <code>getAll</code> webpart with a <code>warbler</code> function which ensures that it is called only when the incoming request matches the given resource path.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">rest</span> <span class="n">resourceName</span> <span class="n">resource</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">resourcePath</span> <span class="o">=</span> <span class="s">&quot;/&quot;</span> <span class="o">+</span> <span class="n">resourceName</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">gellAll</span> <span class="o">=</span> <span class="n">warbler</span> <span class="o">(</span><span class="k">fun</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">resource</span><span class="o">.</span><span class="n">GetAll</span> <span class="bp">()</span> <span class="o">|&gt;</span> <span class="n">JSON</span><span class="o">)</span>
</span><span class="line">  <span class="n">path</span> <span class="n">resourcePath</span> <span class="o">&gt;=&gt;</span> <span class="n">GET</span> <span class="o">&gt;=&gt;</span> <span class="n">getAll</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Now we have the middleware to create a web part. Let’s create other things and glue them together.</p>

<p>Open <code>Db.fs</code> file and add the following code</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">namespace</span> <span class="nn">SuaveRestApi</span><span class="p">.</span><span class="n">Db</span>
</span><span class="line"><span class="k">open</span> <span class="nn">System.Collections.Generic</span>
</span><span class="line"><span class="k">type</span> <span class="nc">Person</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">Id</span> <span class="o">:</span> <span class="n">int</span>
</span><span class="line">  <span class="n">Name</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line">  <span class="n">Age</span> <span class="o">:</span> <span class="n">int</span>
</span><span class="line">  <span class="n">Email</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line"><span class="k">module</span> <span class="nn">Db</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">private</span> <span class="n">peopleStorage</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Dictionary</span><span class="o">&lt;</span><span class="n">int</span><span class="o">,</span> <span class="n">Person</span><span class="o">&gt;</span><span class="bp">()</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">getPeople</span> <span class="bp">()</span> <span class="o">=</span>
</span><span class="line">    <span class="n">peopleStorage</span><span class="o">.</span><span class="n">Values</span> <span class="o">|&gt;</span> <span class="nn">Seq</span><span class="p">.</span><span class="n">map</span> <span class="o">(</span><span class="k">fun</span> <span class="n">p</span> <span class="o">-&gt;</span> <span class="n">p</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Since it’s a sample application, I am just using an in memory dictionary to store the details of people. You can easily replace this with any data source. The <code>Person</code> type represents the <code>People</code> resource of the rest api.</p>

<p>The next step is wiring the Restful web part with the application. Open <code>App.fs</code> and update it as below</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">open</span> <span class="nn">SuaveRestApi.Rest</span>
</span><span class="line"><span class="k">open</span> <span class="nn">SuaveRestApi.Db</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Web</span>
</span><span class="line"><span class="k">open</span> <span class="nn">Suave.Http.Successful</span>
</span><span class="line">
</span><span class="line"><span class="o">[&lt;</span><span class="n">EntryPoint</span><span class="o">&gt;]</span>
</span><span class="line"><span class="k">let</span> <span class="nv">main</span> <span class="n">argv</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">personWebPart</span> <span class="o">=</span> <span class="n">rest</span> <span class="s">&quot;people&quot;</span> <span class="o">{</span>
</span><span class="line">    <span class="n">GetAll</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">getPeople</span>
</span><span class="line">  <span class="o">}</span>
</span><span class="line">  <span class="n">startWebServer</span> <span class="n">defaultConfig</span> <span class="n">personWebPart</span>
</span><span class="line">  <span class="mi">0</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>That’s it! Now we have the HTTP GET Request up and running</p>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/sauve_rest_api/http_get.png" /></p>

<p>Since we are having no people in our in-memory dictionary, we are getting an empty result here. Let’s add a new person using HTTP POST</p>

<h2 id="http-post">HTTP POST</h2>

<p>HTTP POST uses the same workflow as HTTP GET. To implement this, we are going to use the following features in Suave.</p>

<ul>
  <li>
    <p>The <code>choose</code> function takes a list of WebParts, and chooses the first one that applies (i.e which returns <code>Some</code>), or if none WebPart applies, then choose will  return <code>None</code></p>
  </li>
  <li>
    <p>The <code>request</code> function takes a function of type <code>HttpRequest -&gt; WebPart</code> and returns the <code>WebPart</code>. We will use this <code>HttpRequest</code> to get the POST content.</p>
  </li>
  <li>
    <p>The <code>POST</code> is a static in-built <code>WebPart</code> which matches the HTTP POST requests.</p>
  </li>
</ul>

<p>The first step in implementing POST request is updating the <code>RestResource</code>.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">type</span> <span class="nc">RestResource</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">GetAll</span> <span class="o">:</span> <span class="kt">unit</span> <span class="o">-&gt;</span> <span class="k">&#39;</span><span class="n">a</span> <span class="n">seq</span>
</span><span class="line">  <span class="n">Create</span> <span class="o">:</span> <span class="k">&#39;</span><span class="n">a</span> <span class="o">-&gt;</span> <span class="k">&#39;</span><span class="n">a</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Then add the following utility functions in <code>Restful.fs</code> to get the resource from the HttpRequest</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">fromJson</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;</span> <span class="n">json</span> <span class="o">=</span>
</span><span class="line">  <span class="nn">JsonConvert</span><span class="p">.</span><span class="n">DeserializeObject</span><span class="o">(</span><span class="n">json</span><span class="o">,</span> <span class="n">typeof</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;)</span> <span class="o">:?&gt;</span> <span class="k">&#39;</span><span class="n">a</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">getResourceFromReq</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;</span> <span class="o">(</span><span class="n">req</span> <span class="o">:</span> <span class="n">HttpRequest</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">getString</span> <span class="n">rawForm</span> <span class="o">=</span>
</span><span class="line">    <span class="nn">System</span><span class="p">.</span><span class="nn">Text</span><span class="p">.</span><span class="nn">Encoding</span><span class="p">.</span><span class="nn">UTF8</span><span class="p">.</span><span class="n">GetString</span><span class="o">(</span><span class="n">rawForm</span><span class="o">)</span>
</span><span class="line">  <span class="n">req</span><span class="o">.</span><span class="n">rawForm</span> <span class="o">|&gt;</span> <span class="n">getString</span> <span class="o">|&gt;</span> <span class="n">fromJson</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <code>rawForm</code> field in the <code>HttpRequest</code> has the POST content as a byte array, we are just deserializing to a fsharp type.</p>

<p>The next step is updating the <code>rest</code> function to support POST</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">rest</span> <span class="n">resourceName</span> <span class="n">resource</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">resourcePath</span> <span class="o">=</span> <span class="s">&quot;/&quot;</span> <span class="o">+</span> <span class="n">resourceName</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">gellAll</span> <span class="o">=</span> <span class="n">warbler</span> <span class="o">(</span><span class="k">fun</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">resource</span><span class="o">.</span><span class="n">GetAll</span> <span class="bp">()</span> <span class="o">|&gt;</span> <span class="n">JSON</span><span class="o">)</span>
</span><span class="line">  <span class="n">path</span> <span class="n">resourcePath</span> <span class="o">&gt;=&gt;</span> <span class="n">choose</span> <span class="o">[</span>
</span><span class="line">    <span class="n">GET</span> <span class="o">&gt;=&gt;</span> <span class="n">getAll</span>
</span><span class="line">    <span class="n">POST</span> <span class="o">&gt;=&gt;</span> <span class="n">request</span> <span class="o">(</span><span class="n">getResourceFromReq</span> <span class="o">&gt;&gt;</span> <span class="n">resource</span><span class="o">.</span><span class="n">Create</span> <span class="o">&gt;&gt;</span> <span class="n">JSON</span><span class="o">)</span>
</span><span class="line">  <span class="o">]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
<p>Thanks to the awesome function composition feature, we have combined all these tiny functions and implemented a new request and response.  </p>

<p>Then update <code>Db.fs</code> and <code>App.fs</code> respectively as follows</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">module</span> <span class="nn">Db</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">createPerson</span> <span class="n">person</span> <span class="o">=</span>
</span><span class="line">    <span class="k">let</span> <span class="nv">id</span> <span class="o">=</span> <span class="n">peopleStorage</span><span class="o">.</span><span class="n">Values</span><span class="o">.</span><span class="n">Count</span> <span class="o">+</span> <span class="mi">1</span>
</span><span class="line">    <span class="k">let</span> <span class="nv">newPerson</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">        <span class="n">Id</span> <span class="o">=</span> <span class="n">id</span>
</span><span class="line">        <span class="n">Name</span> <span class="o">=</span> <span class="n">person</span><span class="o">.</span><span class="n">Name</span>
</span><span class="line">        <span class="n">Age</span> <span class="o">=</span> <span class="n">person</span><span class="o">.</span><span class="n">Age</span>
</span><span class="line">        <span class="n">Email</span> <span class="o">=</span> <span class="n">person</span><span class="o">.</span><span class="n">Email</span>
</span><span class="line">    <span class="o">}</span>
</span><span class="line">    <span class="n">peopleStorage</span><span class="o">.</span><span class="n">Add</span><span class="o">(</span><span class="n">id</span><span class="o">,</span> <span class="n">newPerson</span><span class="o">)</span>
</span><span class="line">    <span class="n">newPerson</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">personWebPart</span> <span class="o">=</span> <span class="n">rest</span> <span class="s">&quot;people&quot;</span> <span class="o">{</span>
</span><span class="line">  <span class="n">GetAll</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">getPeople</span>
</span><span class="line">  <span class="n">Create</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">createPerson</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The HTTP POST function in action</p>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/sauve_rest_api/http_post.png" /></p>

<h2 id="http-put">HTTP PUT</h2>

<p>As we did for GET &amp; POST we will be starting by updating the <code>RestResource</code></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">type</span> <span class="nc">RestResource</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">GetAll</span> <span class="o">:</span> <span class="kt">unit</span> <span class="o">-&gt;</span> <span class="k">&#39;</span><span class="n">a</span> <span class="n">seq</span>
</span><span class="line">  <span class="n">Create</span> <span class="o">:</span> <span class="k">&#39;</span><span class="n">a</span> <span class="o">-&gt;</span> <span class="k">&#39;</span><span class="n">a</span>
</span><span class="line">  <span class="n">Update</span> <span class="o">:</span> <span class="k">&#39;</span><span class="n">a</span> <span class="o">-&gt;</span> <span class="k">&#39;</span><span class="n">a</span> <span class="n">option</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
<p>We have added a bit of error handling here. This <code>Update</code> function tries to update a resource and returns the updated resource if the resource exists. If it didn’t it returns <code>None</code></p>

<p>To support HTTP PUT we will be using the following from suave library</p>

<ul>
  <li>
    <p>The <code>BAD_REQUEST</code> function takes a string and returns a WebPart representing HTTP status code 400 response with given string as it response.</p>
  </li>
  <li>
    <p>The <code>PUT</code> is a static in-built <code>WebPart</code> which matches the HTTP PUT requests.</p>
  </li>
</ul>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">rest</span> <span class="n">resourceName</span> <span class="n">resource</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">resourcePath</span> <span class="o">=</span> <span class="s">&quot;/&quot;</span> <span class="o">+</span> <span class="n">resourceName</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">badRequest</span> <span class="o">=</span> <span class="n">BAD_REQUEST</span> <span class="s">&quot;Resource not found&quot;</span>
</span><span class="line">
</span><span class="line">  <span class="k">let</span> <span class="nv">gellAll</span> <span class="o">=</span> <span class="n">warbler</span> <span class="o">(</span><span class="k">fun</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">resource</span><span class="o">.</span><span class="n">GetAll</span> <span class="bp">()</span> <span class="o">|&gt;</span> <span class="n">JSON</span><span class="o">)</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">handleResource</span> <span class="n">requestError</span> <span class="o">=</span> <span class="k">function</span>
</span><span class="line">    <span class="o">|</span> <span class="n">Some</span> <span class="n">r</span> <span class="o">-&gt;</span> <span class="n">r</span> <span class="o">|&gt;</span> <span class="n">JSON</span>
</span><span class="line">    <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">requestError</span>
</span><span class="line">
</span><span class="line">  <span class="n">path</span> <span class="n">resourcePath</span> <span class="o">&gt;=&gt;</span>
</span><span class="line">    <span class="n">choose</span> <span class="o">[</span>
</span><span class="line">      <span class="n">GET</span> <span class="o">&gt;=&gt;</span> <span class="n">getAll</span>
</span><span class="line">      <span class="n">POST</span> <span class="o">&gt;=&gt;</span>
</span><span class="line">        <span class="n">request</span> <span class="o">(</span><span class="n">getResourceFromReq</span> <span class="o">&gt;&gt;</span> <span class="n">resource</span><span class="o">.</span><span class="n">Create</span> <span class="o">&gt;&gt;</span> <span class="n">JSON</span><span class="o">)</span>
</span><span class="line">      <span class="n">PUT</span> <span class="o">&gt;=&gt;</span>
</span><span class="line">        <span class="n">request</span> <span class="o">(</span><span class="n">getResourceFromReq</span> <span class="o">&gt;&gt;</span> <span class="n">resource</span><span class="o">.</span><span class="n">Update</span> <span class="o">&gt;&gt;</span> <span class="n">handleResource</span> <span class="n">badRequest</span><span class="o">)</span>
</span><span class="line">    <span class="o">]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
<p>Then update <code>Db.fs</code> and <code>App.fs</code> as usual</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">module</span> <span class="nn">Db</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">updatePersonById</span> <span class="n">personId</span> <span class="n">personToBeUpdated</span> <span class="o">=</span>
</span><span class="line">    <span class="k">if</span> <span class="n">peopleStorage</span><span class="o">.</span><span class="n">ContainsKey</span><span class="o">(</span><span class="n">personId</span><span class="o">)</span> <span class="k">then</span>
</span><span class="line">      <span class="k">let</span> <span class="nv">updatedPerson</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">        <span class="n">Id</span> <span class="o">=</span> <span class="n">personId</span>
</span><span class="line">        <span class="n">Name</span> <span class="o">=</span> <span class="n">personToBeUpdated</span><span class="o">.</span><span class="n">Name</span>
</span><span class="line">        <span class="n">Age</span> <span class="o">=</span> <span class="n">personToBeUpdated</span><span class="o">.</span><span class="n">Age</span>
</span><span class="line">        <span class="n">Email</span> <span class="o">=</span> <span class="n">personToBeUpdated</span><span class="o">.</span><span class="n">Email</span>
</span><span class="line">      <span class="o">}</span>
</span><span class="line">      <span class="n">peopleStorage</span><span class="o">.[</span><span class="n">personId</span><span class="o">]</span> <span class="o">&lt;-</span> <span class="n">updatedPerson</span>
</span><span class="line">      <span class="n">Some</span> <span class="n">updatedPerson</span>
</span><span class="line">    <span class="k">else</span>
</span><span class="line">      <span class="n">None</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">updatePerson</span> <span class="n">personToBeUpdated</span> <span class="o">=</span>
</span><span class="line">    <span class="n">updatePersonById</span> <span class="n">personToBeUpdated</span><span class="o">.</span><span class="n">Id</span> <span class="n">personToBeUpdated</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
<p>We have created one more function here <code>updatePersonById</code> which will be used later.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">personWebPart</span> <span class="o">=</span> <span class="n">rest</span> <span class="s">&quot;people&quot;</span> <span class="o">{</span>
</span><span class="line">  <span class="n">GetAll</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">getPeople</span>
</span><span class="line">  <span class="n">Create</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">createPerson</span>
</span><span class="line">  <span class="n">Update</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">updatePerson</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p><strong>Updating an existing resource</strong></p>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/sauve_rest_api/http_put.png" /></p>

<p><strong>Updating a non-existing resource</strong></p>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/sauve_rest_api/http_put_error.png" /></p>

<h2 id="http-delete">HTTP DELETE</h2>

<p>Let’s begin by updating the <code>RestResource</code></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">type</span> <span class="nc">RestResource</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">GetAll</span> <span class="o">:</span> <span class="kt">unit</span> <span class="o">-&gt;</span> <span class="k">&#39;</span><span class="n">a</span> <span class="n">seq</span>
</span><span class="line">  <span class="n">Create</span> <span class="o">:</span> <span class="k">&#39;</span><span class="n">a</span> <span class="o">-&gt;</span> <span class="k">&#39;</span><span class="n">a</span>
</span><span class="line">  <span class="n">Update</span> <span class="o">:</span> <span class="k">&#39;</span><span class="n">a</span> <span class="o">-&gt;</span> <span class="k">&#39;</span><span class="n">a</span> <span class="n">option</span>
</span><span class="line">  <span class="n">Delete</span> <span class="o">:</span> <span class="n">int</span> <span class="o">-&gt;</span> <span class="kt">unit</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
<p>HTTP DELETE is little different from the other implemented requests as we will be retrieving the id of the resource to be deleted from the URL.</p>

<p>For example, <strong>DELETE /people/1</strong> will delete a person with the id 1.  </p>

<p>To retrieve the id from the url, we will be using the <code>pathScan</code> function in Suave. This function similar to <code>printf</code> which takes a <a href="">PrintfFormat</a> and a function which takes the output of the printfformat and returns the WebPart. You can get more details about it from the <a href="http://theimowski.gitbooks.io/suave-music-store/content/url_parameters.html">suave-music-store book</a>.</p>

<p>In addition to this, we will be using the following from suave</p>

<ul>
  <li>The <code>NO_CONTENT</code> is a static <code>WebPart</code> represents the HTTP Response with the status code 204</li>
  <li>The <code>DELETE</code> matches the HTTP request of type DELETE</li>
</ul>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">rest</span> <span class="n">resourceName</span> <span class="n">resource</span> <span class="o">=</span>
</span><span class="line">
</span><span class="line">  <span class="k">let</span> <span class="nv">resourcePath</span> <span class="o">=</span> <span class="s">&quot;/&quot;</span> <span class="o">+</span> <span class="n">resourceName</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">resourceIdPath</span> <span class="o">=</span>
</span><span class="line">    <span class="k">new</span> <span class="n">PrintfFormat</span><span class="o">&lt;(</span><span class="n">int</span> <span class="o">-&gt;</span> <span class="kt">string</span><span class="o">),</span><span class="kt">unit</span><span class="o">,</span><span class="kt">string</span><span class="o">,</span><span class="kt">string</span><span class="o">,</span><span class="n">int</span><span class="o">&gt;(</span><span class="n">resourcePath</span> <span class="o">+</span> <span class="s">&quot;/%d&quot;</span><span class="o">)</span>
</span><span class="line">
</span><span class="line">  <span class="k">let</span> <span class="nv">badRequest</span> <span class="o">=</span> <span class="n">BAD_REQUEST</span> <span class="s">&quot;Resource not found&quot;</span>
</span><span class="line">
</span><span class="line">  <span class="k">let</span> <span class="nv">gellAll</span> <span class="o">=</span> <span class="n">warbler</span> <span class="o">(</span><span class="k">fun</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">resource</span><span class="o">.</span><span class="n">GetAll</span> <span class="bp">()</span> <span class="o">|&gt;</span> <span class="n">JSON</span><span class="o">)</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">handleResource</span> <span class="n">requestError</span> <span class="o">=</span> <span class="k">function</span>
</span><span class="line">    <span class="o">|</span> <span class="n">Some</span> <span class="n">r</span> <span class="o">-&gt;</span> <span class="n">r</span> <span class="o">|&gt;</span> <span class="n">JSON</span>
</span><span class="line">    <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">requestError</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">deleteResourceById</span> <span class="n">id</span> <span class="o">=</span>
</span><span class="line">    <span class="n">resource</span><span class="o">.</span><span class="n">Delete</span> <span class="n">id</span>
</span><span class="line">    <span class="n">NO_CONTENT</span>
</span><span class="line">
</span><span class="line">  <span class="n">choose</span> <span class="o">[</span>
</span><span class="line">    <span class="n">path</span> <span class="n">resourcePath</span> <span class="o">&gt;=&gt;</span> <span class="n">choose</span> <span class="o">[</span>
</span><span class="line">      <span class="n">GET</span> <span class="o">&gt;=&gt;</span> <span class="n">getAll</span>
</span><span class="line">      <span class="n">POST</span> <span class="o">&gt;=&gt;</span>
</span><span class="line">        <span class="n">request</span> <span class="o">(</span><span class="n">getResourceFromReq</span> <span class="o">&gt;&gt;</span> <span class="n">resource</span><span class="o">.</span><span class="n">Create</span> <span class="o">&gt;&gt;</span> <span class="n">JSON</span><span class="o">)</span>
</span><span class="line">      <span class="n">PUT</span> <span class="o">&gt;=&gt;</span>
</span><span class="line">        <span class="n">request</span> <span class="o">(</span><span class="n">getResourceFromReq</span> <span class="o">&gt;&gt;</span> <span class="n">resource</span><span class="o">.</span><span class="n">Update</span> <span class="o">&gt;&gt;</span> <span class="n">handleResource</span> <span class="n">badRequest</span><span class="o">)</span>
</span><span class="line">    <span class="o">]</span>
</span><span class="line">    <span class="n">DELETE</span> <span class="o">&gt;=&gt;</span> <span class="n">pathScan</span> <span class="n">resourceIdPath</span> <span class="n">deleteResourceById</span>
</span><span class="line">  <span class="o">]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>One thing to notice here is we have wrapped the existing <code>choose</code> function with an another <code>choose</code> function. It may be little complex to understand but if you understand what each thing mean, it is easier. Here the inner <code>choose</code> function represents the handler functions for GET, POST &amp; PUT requests having the url “/{resourceName}” and the <code>DELETE</code> webpart represents the HTTP DELETE handler for the url “/{resourceName}/{resourceId}”.</p>

<p>The outer <code>choose</code> function chooses one of these based on the incoming request.</p>

<p><strong>Db.fs</strong></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">deletePerson</span> <span class="n">personId</span> <span class="o">=</span>
</span><span class="line">  <span class="n">peopleStorage</span><span class="o">.</span><span class="n">Remove</span><span class="o">(</span><span class="n">personId</span><span class="o">)</span> <span class="o">|&gt;</span> <span class="n">ignore</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p><strong>App.fs</strong></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">personWebPart</span> <span class="o">=</span> <span class="n">rest</span> <span class="s">&quot;people&quot;</span> <span class="o">{</span>
</span><span class="line">  <span class="n">GetAll</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">getPeople</span>
</span><span class="line">  <span class="n">Create</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">createPerson</span>
</span><span class="line">  <span class="n">Update</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">updatePerson</span>
</span><span class="line">  <span class="n">Delete</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">deletePerson</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
<p><img class="center border" src="http://blog.tamizhvendan.in/images/sauve_rest_api/http_delete.png" /></p>

<h2 id="http-get--http-put-by-id">HTTP GET &amp; HTTP PUT by id</h2>

<p>I hope by this time you know how to wire things up in Suave to create an API. Let’s add features for getting and updating resource by id.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">type</span> <span class="nc">RestResource</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">GetAll</span> <span class="o">:</span> <span class="kt">unit</span> <span class="o">-&gt;</span> <span class="k">&#39;</span><span class="n">a</span> <span class="n">seq</span>
</span><span class="line">  <span class="n">Create</span> <span class="o">:</span> <span class="k">&#39;</span><span class="n">a</span> <span class="o">-&gt;</span> <span class="k">&#39;</span><span class="n">a</span>
</span><span class="line">  <span class="n">Update</span> <span class="o">:</span> <span class="k">&#39;</span><span class="n">a</span> <span class="o">-&gt;</span> <span class="k">&#39;</span><span class="n">a</span> <span class="n">option</span>
</span><span class="line">  <span class="n">Delete</span> <span class="o">:</span> <span class="n">int</span> <span class="o">-&gt;</span> <span class="kt">unit</span>
</span><span class="line">  <span class="n">GetById</span> <span class="o">:</span> <span class="n">int</span> <span class="o">-&gt;</span> <span class="k">&#39;</span><span class="n">a</span> <span class="n">option</span>
</span><span class="line">  <span class="n">UpdateById</span> <span class="o">:</span> <span class="n">int</span> <span class="o">-&gt;</span> <span class="k">&#39;</span><span class="n">a</span> <span class="o">-&gt;</span> <span class="k">&#39;</span><span class="n">a</span> <span class="n">option</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">rest</span> <span class="n">resourceName</span> <span class="n">resource</span> <span class="o">=</span>
</span><span class="line">
</span><span class="line">  <span class="c1">// .. Existing code ...</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">getResourceById</span> <span class="o">=</span>
</span><span class="line">    <span class="n">resource</span><span class="o">.</span><span class="n">GetById</span> <span class="o">&gt;&gt;</span> <span class="n">handleResource</span> <span class="o">(</span><span class="n">NOT_FOUND</span> <span class="s">&quot;Resource not found&quot;</span><span class="o">)</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">updateResourceById</span> <span class="n">id</span> <span class="o">=</span>
</span><span class="line">    <span class="n">request</span> <span class="o">(</span><span class="n">getResourceFromReq</span> <span class="o">&gt;&gt;</span> <span class="o">(</span><span class="n">resource</span><span class="o">.</span><span class="n">UpdateById</span> <span class="n">id</span><span class="o">)</span> <span class="o">&gt;&gt;</span> <span class="n">handleResource</span> <span class="n">badRequest</span><span class="o">)</span>
</span><span class="line">
</span><span class="line">  <span class="n">choose</span> <span class="o">[</span>
</span><span class="line">    <span class="n">path</span> <span class="n">resourcePath</span> <span class="o">&gt;=&gt;</span> <span class="n">choose</span> <span class="o">[</span>
</span><span class="line">      <span class="n">GET</span> <span class="o">&gt;=&gt;</span> <span class="n">getAll</span>
</span><span class="line">      <span class="n">POST</span> <span class="o">&gt;=&gt;</span>
</span><span class="line">        <span class="n">request</span> <span class="o">(</span><span class="n">getResourceFromReq</span> <span class="o">&gt;&gt;</span> <span class="n">resource</span><span class="o">.</span><span class="n">Create</span> <span class="o">&gt;&gt;</span> <span class="n">JSON</span><span class="o">)</span>
</span><span class="line">      <span class="n">PUT</span> <span class="o">&gt;=&gt;</span>
</span><span class="line">        <span class="n">request</span> <span class="o">(</span><span class="n">getResourceFromReq</span> <span class="o">&gt;&gt;</span> <span class="n">resource</span><span class="o">.</span><span class="n">Update</span> <span class="o">&gt;&gt;</span> <span class="n">handleResource</span> <span class="n">badRequest</span><span class="o">)</span>
</span><span class="line">    <span class="o">]</span>
</span><span class="line">    <span class="n">DELETE</span> <span class="o">&gt;=&gt;</span> <span class="n">pathScan</span> <span class="n">resourceIdPath</span> <span class="n">deleteResourceById</span>
</span><span class="line">    <span class="n">GET</span> <span class="o">&gt;=&gt;</span> <span class="n">pathScan</span> <span class="n">resourceIdPath</span> <span class="n">getResourceById</span>
</span><span class="line">    <span class="n">PUT</span> <span class="o">&gt;=&gt;</span> <span class="n">pathScan</span> <span class="n">resourceIdPath</span> <span class="n">updateResourceById</span>
</span><span class="line">  <span class="o">]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p><strong>Db.fs</strong></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">getPerson</span> <span class="n">id</span> <span class="o">=</span>
</span><span class="line">  <span class="k">if</span> <span class="n">peopleStorage</span><span class="o">.</span><span class="n">ContainsKey</span><span class="o">(</span><span class="n">id</span><span class="o">)</span> <span class="k">then</span>
</span><span class="line">    <span class="n">Some</span> <span class="n">peopleStorage</span><span class="o">.[</span><span class="n">id</span><span class="o">]</span>
</span><span class="line">  <span class="k">else</span>
</span><span class="line">    <span class="n">None</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p><strong>App.fs</strong></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">personWebPart</span> <span class="o">=</span> <span class="n">rest</span> <span class="s">&quot;people&quot;</span> <span class="o">{</span>
</span><span class="line">  <span class="n">GetAll</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">getPeople</span>
</span><span class="line">  <span class="n">Create</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">createPerson</span>
</span><span class="line">  <span class="n">Update</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">updatePerson</span>
</span><span class="line">  <span class="n">Delete</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">deletePerson</span>
</span><span class="line">  <span class="n">GetById</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">getPerson</span>
</span><span class="line">  <span class="n">UpdateById</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">updatePersonById</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/sauve_rest_api/http_get_id.png" />
<img class="center border" src="http://blog.tamizhvendan.in/images/sauve_rest_api/http_put_id.png" /></p>

<h2 id="http-head">HTTP HEAD</h2>

<p>Http HEAD request checks whether the request with the given id is there or not. Its implementation is straight forward.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">type</span> <span class="nc">RestResource</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">  <span class="n">GetAll</span> <span class="o">:</span> <span class="kt">unit</span> <span class="o">-&gt;</span> <span class="k">&#39;</span><span class="n">a</span> <span class="n">seq</span>
</span><span class="line">  <span class="n">Create</span> <span class="o">:</span> <span class="k">&#39;</span><span class="n">a</span> <span class="o">-&gt;</span> <span class="k">&#39;</span><span class="n">a</span>
</span><span class="line">  <span class="n">Update</span> <span class="o">:</span> <span class="k">&#39;</span><span class="n">a</span> <span class="o">-&gt;</span> <span class="k">&#39;</span><span class="n">a</span> <span class="n">option</span>
</span><span class="line">  <span class="n">Delete</span> <span class="o">:</span> <span class="n">int</span> <span class="o">-&gt;</span> <span class="kt">unit</span>
</span><span class="line">  <span class="n">GetById</span> <span class="o">:</span> <span class="n">int</span> <span class="o">-&gt;</span> <span class="k">&#39;</span><span class="n">a</span> <span class="n">option</span>
</span><span class="line">  <span class="n">UpdateById</span> <span class="o">:</span> <span class="n">int</span> <span class="o">-&gt;</span> <span class="k">&#39;</span><span class="n">a</span> <span class="o">-&gt;</span> <span class="k">&#39;</span><span class="n">a</span> <span class="n">option</span>
</span><span class="line">  <span class="n">IsExists</span> <span class="o">:</span> <span class="n">int</span> <span class="o">-&gt;</span> <span class="kt">bool</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">rest</span> <span class="n">resourceName</span> <span class="n">resource</span> <span class="o">=</span>
</span><span class="line">
</span><span class="line">  <span class="c1">// .. Existing code ...</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">isResourceExists</span> <span class="n">id</span> <span class="o">=</span>
</span><span class="line">    <span class="k">if</span> <span class="n">resource</span><span class="o">.</span><span class="n">IsExists</span> <span class="n">id</span> <span class="k">then</span> <span class="n">OK</span> <span class="s">&quot;&quot;</span> <span class="k">else</span> <span class="n">NOT_FOUND</span> <span class="s">&quot;&quot;</span>
</span><span class="line">
</span><span class="line">  <span class="n">choose</span> <span class="o">[</span>
</span><span class="line">    <span class="n">path</span> <span class="n">resourcePath</span> <span class="o">&gt;=&gt;</span> <span class="n">choose</span> <span class="o">[</span>
</span><span class="line">      <span class="n">GET</span> <span class="o">&gt;=&gt;</span> <span class="n">getAll</span>
</span><span class="line">      <span class="n">POST</span> <span class="o">&gt;=&gt;</span>
</span><span class="line">        <span class="n">request</span> <span class="o">(</span><span class="n">getResourceFromReq</span> <span class="o">&gt;&gt;</span> <span class="n">resource</span><span class="o">.</span><span class="n">Create</span> <span class="o">&gt;&gt;</span> <span class="n">JSON</span><span class="o">)</span>
</span><span class="line">      <span class="n">PUT</span> <span class="o">&gt;=&gt;</span>
</span><span class="line">        <span class="n">request</span> <span class="o">(</span><span class="n">getResourceFromReq</span> <span class="o">&gt;&gt;</span> <span class="n">resource</span><span class="o">.</span><span class="n">Update</span> <span class="o">&gt;&gt;</span> <span class="n">handleResource</span> <span class="n">badRequest</span><span class="o">)</span>
</span><span class="line">    <span class="o">]</span>
</span><span class="line">    <span class="n">DELETE</span> <span class="o">&gt;=&gt;</span> <span class="n">pathScan</span> <span class="n">resourceIdPath</span> <span class="n">deleteResourceById</span>
</span><span class="line">    <span class="n">GET</span> <span class="o">&gt;=&gt;</span> <span class="n">pathScan</span> <span class="n">resourceIdPath</span> <span class="n">getResourceById</span>
</span><span class="line">    <span class="n">PUT</span> <span class="o">&gt;=&gt;</span> <span class="n">pathScan</span> <span class="n">resourceIdPath</span> <span class="n">updateResourceById</span>
</span><span class="line">    <span class="n">HEAD</span> <span class="o">&gt;=&gt;</span> <span class="n">pathScan</span> <span class="n">resourceIdPath</span> <span class="n">isResourceExists</span>
</span><span class="line">  <span class="o">]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
<p><strong>Db.fs</strong></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">isPersonExists</span> <span class="o">=</span> <span class="n">peopleStorage</span><span class="o">.</span><span class="n">ContainsKey</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p><strong>App.fs</strong></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">personWebPart</span> <span class="o">=</span> <span class="n">rest</span> <span class="s">&quot;people&quot;</span> <span class="o">{</span>
</span><span class="line">  <span class="n">GetAll</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">getPeople</span>
</span><span class="line">  <span class="n">GetById</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">getPerson</span>
</span><span class="line">  <span class="n">Create</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">createPerson</span>
</span><span class="line">  <span class="n">Update</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">updatePerson</span>
</span><span class="line">  <span class="n">UpdateById</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">updatePersonById</span>
</span><span class="line">  <span class="n">Delete</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">deletePerson</span>
</span><span class="line">  <span class="n">IsExists</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">isPersonExists</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
<p><img class="center border" src="http://blog.tamizhvendan.in/images/sauve_rest_api/head.png" /></p>

<p>That’s all.. We have successfully implemented a REST API using Suave</p>

<h2 id="extending-with-a-new-resource">Extending with a new Resource</h2>

<p>The beautiful aspect of this functional REST API design we can easily extend it to support other resources.</p>

<p>Here is the rest API implementation of the <code>albums</code> resource in the <a href="http://theimowski.gitbooks.io/suave-music-store/content/database.html">music-store</a> application. You can find the source code of MusicStoreDb <a href="https://github.com/tamizhvendan/blog-samples/blob/master/SuaveRestApi/SuaveRestApi/MusicStoreDb.fs">here</a>.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="o">[&lt;</span><span class="n">EntryPoint</span><span class="o">&gt;]</span>
</span><span class="line"><span class="k">let</span> <span class="nv">main</span> <span class="n">argv</span> <span class="o">=</span>
</span><span class="line">
</span><span class="line">  <span class="k">let</span> <span class="nv">personWebPart</span> <span class="o">=</span> <span class="n">rest</span> <span class="s">&quot;people&quot;</span> <span class="o">{</span>
</span><span class="line">    <span class="n">GetAll</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">getPeople</span>
</span><span class="line">    <span class="n">GetById</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">getPerson</span>
</span><span class="line">    <span class="n">Create</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">createPerson</span>
</span><span class="line">    <span class="n">Update</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">updatePerson</span>
</span><span class="line">    <span class="n">UpdateById</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">updatePersonById</span>
</span><span class="line">    <span class="n">Delete</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">deletePerson</span>
</span><span class="line">    <span class="n">IsExists</span> <span class="o">=</span> <span class="nn">Db</span><span class="p">.</span><span class="n">isPersonExists</span>
</span><span class="line">  <span class="o">}</span>
</span><span class="line">
</span><span class="line">  <span class="k">let</span> <span class="nv">albumWebPart</span> <span class="o">=</span> <span class="n">rest</span> <span class="s">&quot;albums&quot;</span> <span class="o">{</span>
</span><span class="line">    <span class="n">GetAll</span> <span class="o">=</span> <span class="nn">MusicStoreDb</span><span class="p">.</span><span class="n">getAlbums</span>
</span><span class="line">    <span class="n">GetById</span> <span class="o">=</span> <span class="nn">MusicStoreDb</span><span class="p">.</span><span class="n">getAlbumById</span>
</span><span class="line">    <span class="n">Create</span> <span class="o">=</span> <span class="nn">MusicStoreDb</span><span class="p">.</span><span class="n">createAlbum</span>
</span><span class="line">    <span class="n">Update</span> <span class="o">=</span> <span class="nn">MusicStoreDb</span><span class="p">.</span><span class="n">updateAlbum</span>
</span><span class="line">    <span class="n">UpdateById</span> <span class="o">=</span> <span class="nn">MusicStoreDb</span><span class="p">.</span><span class="n">updateAlbumById</span>
</span><span class="line">    <span class="n">Delete</span> <span class="o">=</span> <span class="nn">MusicStoreDb</span><span class="p">.</span><span class="n">deleteAlbum</span>
</span><span class="line">    <span class="n">IsExists</span> <span class="o">=</span> <span class="nn">MusicStoreDb</span><span class="p">.</span><span class="n">isAlbumExists</span>
</span><span class="line">  <span class="o">}</span>
</span><span class="line">
</span><span class="line">  <span class="n">startWebServer</span> <span class="n">defaultConfig</span> <span class="o">(</span><span class="n">choose</span> <span class="o">[</span><span class="n">personWebPart</span><span class="o">;</span><span class="n">albumWebPart</span><span class="o">])</span>
</span><span class="line">  <span class="mi">0</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/sauve_rest_api/get_album_id.png" /></p>

<h2 id="conclusion">Conclusion</h2>

<p>In the amazing presentation on <a href="https://skillsmatter.com/skillscasts/6120-functional-programming-design-patterns-with-scott-wlaschin">Functional Programming Design Patterns</a>, Scott Wlaschin had this slide</p>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/sauve_rest_api/fp_design_patterns_slide.png" /></p>

<p>I wondered how this can be applied in real-time. By creating a rest API using suave I’ve understood this.</p>

<blockquote>
  <p>Just create functions and combine it to build a bigger system.</p>
</blockquote>

<p>What a nice way to develop a system!</p>

<p>You can get the source code associated with this blog post in <a href="https://github.com/tamizhvendan/blog-samples/tree/master/SuaveRestApi">my GitHub repository</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Grouping data into buckets using fsharp]]></title>
    <link href="http://blog.tamizhvendan.in/blog/2015/05/09/grouping-data-into-buckets-using-fsharp/"/>
    <updated>2015-05-09T16:19:06+05:30</updated>
    <id>http://blog.tamizhvendan.in/blog/2015/05/09/grouping-data-into-buckets-using-fsharp</id>
    <content type="html"><![CDATA[<p>Last week I came across an interesting data grouping problem, which groups the data into different buckets based on the given filters as shown in the image below</p>

<p><img class="center" src="http://blog.tamizhvendan.in/images/fs_data_grouping/bucket_function.png" /></p>

<p>In this blog post I am going to share how can we solve this problem very expressively using fsharp.</p>

<h2 id="parsing-filters-and-translate-to-an-abstract-syntax-tree-ast">Parsing filters and translate to an Abstract Syntax Tree (AST)</h2>

<p>The first step to solve this problem is parsing the filters and translate to an AST. The strong type system in fsharp makes this step pretty easy.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">type</span> <span class="nc">Filter</span> <span class="o">=</span>
</span><span class="line">  <span class="o">|</span> <span class="n">GreaterThan</span> <span class="k">of</span> <span class="n">int</span>
</span><span class="line">  <span class="o">|</span> <span class="n">Between</span> <span class="k">of</span> <span class="n">int</span> <span class="o">*</span> <span class="n">int</span>
</span><span class="line">  <span class="o">|</span> <span class="n">LessThan</span> <span class="k">of</span> <span class="n">int</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <code>Filter</code> type represents the AST of the raw string filter. There are <strong>n</strong> number of ways to transform this incoming string filter to its strongly typed counterpart.</p>

<p>The most idiomatic way of achieving it in fsharp is through <a href="http://en.wikibooks.org/wiki/F_Sharp_Programming/Active_Patterns#Partial_Active_Patterns">Partial Active Patterns</a></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="o">(|</span><span class="n">Regex</span><span class="o">|_|)</span> <span class="n">pattern</span> <span class="n">input</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">m</span> <span class="o">=</span> <span class="nn">Regex</span><span class="p">.</span><span class="n">Match</span><span class="o">(</span><span class="n">input</span><span class="o">,</span> <span class="n">pattern</span><span class="o">)</span>
</span><span class="line">  <span class="k">if</span> <span class="n">m</span><span class="o">.</span><span class="n">Success</span> <span class="k">then</span> <span class="n">Some</span><span class="o">(</span><span class="nn">List</span><span class="p">.</span><span class="n">tail</span> <span class="o">[</span> <span class="k">for</span> <span class="n">g</span> <span class="k">in</span> <span class="n">m</span><span class="o">.</span><span class="n">Groups</span> <span class="o">-&gt;</span> <span class="n">g</span><span class="o">.</span><span class="n">Value</span> <span class="o">])</span>
</span><span class="line">  <span class="k">else</span> <span class="n">None</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>You can easily understand this partial active pattern by thinking it as a function with the following signature</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="kt">string</span> <span class="o">-&gt;</span> <span class="kt">string</span> <span class="o">-&gt;</span> <span class="kt">string</span> <span class="kt">list</span> <span class="n">option</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>i.e Takes an input, matches it against a pattern. If it matched, then returns the list of matched strings wrapped with the <code>Some</code> type else returns the <code>None</code> type.</p>

<p>Now you may think why we need to write this straight-forward function as a partial active pattern with some weird symbols <code>(|_|)</code> ?</p>

<p>We can certainly do that, but we can’t do <a href="http://fsharpforfunandprofit.com/posts/match-expression/">pattern matching</a> against a function. </p>

<p>The best way to understand this by seeing it in action</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// string -&gt; Filter</span>
</span><span class="line"><span class="k">let</span> <span class="nv">createFilter</span> <span class="n">filterString</span> <span class="o">=</span>
</span><span class="line">  <span class="k">match</span> <span class="n">filterString</span> <span class="k">with</span>
</span><span class="line">  <span class="o">|</span> <span class="n">Regex</span> <span class="s">&quot;^&gt;(</span><span class="err">\</span><span class="s">d+)$&quot;</span> <span class="o">[</span><span class="n">min</span><span class="o">]</span> <span class="o">-&gt;</span> <span class="n">GreaterThan</span><span class="o">(</span><span class="n">int</span> <span class="n">min</span><span class="o">)</span>
</span><span class="line">  <span class="o">|</span> <span class="n">Regex</span> <span class="s">&quot;^(</span><span class="err">\</span><span class="s">d+)-(</span><span class="err">\</span><span class="s">d+)$&quot;</span> <span class="o">[</span><span class="n">min</span><span class="o">;</span><span class="n">max</span><span class="o">]</span> <span class="o">-&gt;</span> <span class="n">Between</span><span class="o">(</span><span class="n">int</span> <span class="n">min</span><span class="o">,</span><span class="n">int</span> <span class="n">max</span><span class="o">)</span>
</span><span class="line">  <span class="o">|</span> <span class="n">Regex</span> <span class="s">&quot;^&lt;(</span><span class="err">\</span><span class="s">d+)$&quot;</span> <span class="o">[</span><span class="n">max</span><span class="o">]</span> <span class="o">-&gt;</span> <span class="n">LessThan</span><span class="o">(</span><span class="n">int</span> <span class="n">max</span><span class="o">)</span>
</span><span class="line">  <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">failwith</span> <span class="s">&quot;Invalid Filter&quot;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The above function transforms the raw string filter into its equivalent fsharp type that we have defined before. The pattern matching makes our job very easier by declaratively saying if it matches this, then do this.</p>

<p>One another important benefit that we are getting here, the return value (list of matched strings) is available as a last parameter in the pattern matching. It’s just coming for free. </p>

<p>I’d like to give you an exercise to appreciate this excellent feature in fsharp. Try to implement the above using a function instead of a partial active patterns. </p>

<p>Great! We are done with the first step. Let’s move to the next one.</p>

<h2 id="grouping-the-data-using-the-filter">Grouping the data using the filter</h2>

<p>To do the actual grouping we need to have a function that filters the data based on the given filter. Let me call it as a predicate.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// Filter -&gt; int -&gt; bool</span>
</span><span class="line"><span class="k">let</span> <span class="nv">createPredicate</span> <span class="o">=</span> <span class="k">function</span>
</span><span class="line">  <span class="o">|</span> <span class="n">GreaterThan</span> <span class="n">min</span> <span class="o">-&gt;</span> <span class="k">fun</span> <span class="n">n</span> <span class="o">-&gt;</span> <span class="n">n</span> <span class="o">&gt;</span> <span class="n">min</span>
</span><span class="line">  <span class="o">|</span> <span class="n">Between</span> <span class="o">(</span><span class="n">min</span><span class="o">,</span> <span class="n">max</span><span class="o">)</span> <span class="o">-&gt;</span> <span class="k">fun</span> <span class="n">n</span> <span class="o">-&gt;</span> <span class="n">n</span> <span class="o">&gt;=</span> <span class="n">min</span> <span class="o">&amp;&amp;</span> <span class="n">n</span> <span class="o">&lt;=</span> <span class="n">max</span>
</span><span class="line">  <span class="o">|</span> <span class="n">LessThan</span> <span class="n">max</span> <span class="o">-&gt;</span> <span class="k">fun</span> <span class="n">n</span> <span class="o">-&gt;</span> <span class="n">n</span> <span class="o">&lt;</span> <span class="n">max</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <code>createPredicate</code> function takes a filter and returns the predicate function <code>int -&gt; bool</code></p>

<p>With the functions <code>createFilter</code> and <code>createPredicate</code> in place, we can combine them and create a new function that takes a raw filter string and translate that to a predicate. </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="c1">// string -&gt; int -&gt; bool</span>
</span><span class="line"><span class="k">let</span> <span class="nv">createRule</span> <span class="o">=</span> <span class="n">createFilter</span> <span class="o">&gt;&gt;</span> <span class="n">createPredicate</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
<p>Let me create a new record type <code>BucketRule</code> which holds this string and the predicate</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">type</span> <span class="nc">BucketRule</span> <span class="o">=</span> <span class="o">{</span> <span class="n">Label</span> <span class="o">:</span> <span class="kt">string</span><span class="o">;</span> <span class="n">Rule</span> <span class="o">:</span> <span class="n">int</span> <span class="o">-&gt;</span> <span class="kt">bool</span><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">createBucketRule</span> <span class="n">filterString</span> <span class="o">=</span>
</span><span class="line">  <span class="o">{</span> <span class="n">Label</span> <span class="o">=</span> <span class="n">filterString</span><span class="o">;</span> <span class="n">Rule</span> <span class="o">=</span> <span class="n">createRule</span> <span class="n">filterString</span> <span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Now we have all required functions and it’s time to do the data grouping</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">createBucket</span> <span class="n">numbers</span> <span class="n">bucketRule</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">bucketContent</span> <span class="o">=</span> <span class="n">numbers</span> <span class="o">|&gt;</span> <span class="nn">List</span><span class="p">.</span><span class="n">filter</span> <span class="n">bucketRule</span><span class="o">.</span><span class="n">Rule</span>
</span><span class="line">  <span class="o">(</span><span class="n">bucketRule</span><span class="o">.</span><span class="n">Label</span><span class="o">,</span> <span class="n">bucketContent</span><span class="o">)</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">createBuckets</span> <span class="n">numbers</span> <span class="n">filterStrings</span>  <span class="o">=</span>
</span><span class="line">  <span class="n">filterStrings</span>
</span><span class="line">  <span class="o">|&gt;</span> <span class="nn">List</span><span class="p">.</span><span class="n">map</span> <span class="n">createBucketRule</span>
</span><span class="line">  <span class="o">|&gt;</span> <span class="nn">List</span><span class="p">.</span><span class="n">map</span> <span class="o">(</span><span class="n">createBucket</span> <span class="n">numbers</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h2 id="summary">Summary</h2>

<p>Though the problem that we have seen is so trivial, the great features in fsharp make it very pleasant to write expressive code to solve it. The complete code snippet is available in <a href="http://fssnip.net/qZ">fssnipnet</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Some tips for Using C# Libraries in F#]]></title>
    <link href="http://blog.tamizhvendan.in/blog/2015/04/30/some-tips-for-using-c-number-libraries-in-f-number/"/>
    <updated>2015-04-30T11:19:53+05:30</updated>
    <id>http://blog.tamizhvendan.in/blog/2015/04/30/some-tips-for-using-c-number-libraries-in-f-number</id>
    <content type="html"><![CDATA[<p>In my <a href="http://blog.tamizhvendan.in/blog/2015/04/25/my-takeaways/">last blog post</a> on what I’ve learned while developing a complete web application in fsharp, I’ve mentioned that we can leverage all the libraries that were written for csharp in fsharp. </p>

<p>Fsharp is a hybrid programming language which supports both functional programming and object oriented programming. Though you can write an application completely in a functional way, when you need to integrate with other .NET languages, you may need to use some OO features.</p>

<p>As both the languages has its own design and principles (immutable types, not allowing null, etc.,), the integration of these is not straightforward in certain scenarios. In this blog post you are going to learn how to handle these tricky scenarios. </p>

<h2 id="allownullliteral-attribute">AllowNullLiteral Attribute</h2>

<p>When you <a href="http://fsharpforfunandprofit.com/posts/classes/">create a class in F#</a>, by default, we can’t explicitly assign a null value to an instance of the class unlike C#. You will get a compiler error when you do it. It’s a great feature and it helps in getting rid of Null Reference exceptions. </p>

<p><img class="center" src="http://blog.tamizhvendan.in/images/fs_cs_interop/NullError.png" /></p>

<p>But in certain cases, we may need to assign a null value to a class. For example, let us take the <a href="https://msdn.microsoft.com/en-us/library/dn497475(v=vs.108).aspx">Find method</a> in the Asp.Net identity framework. It returns a user with the specified username and password or null if there is a no match. </p>

<p>When you try to use this in a fsharp code, you will be getting a compiler error</p>

<p><img class="center" src="http://blog.tamizhvendan.in/images/fs_cs_interop/UserNullError.png" /></p>

<p>It’s where <a href="https://msdn.microsoft.com/en-us/library/ee353608.aspx?f=255&amp;MSPPError=-2147217396">AllowNullLiteral attribute</a> comes into the picture. If you want to make a class type to allow null literal as one of its value, you need to decorate that class with the AllowNullLiteral attribute.</p>

<p><img class="center" src="http://blog.tamizhvendan.in/images/fs_cs_interop/AllowNullAttr.png" /></p>

<h2 id="climutable-attribute">CLIMutable Attribute</h2>

<p>When a fsharp Record type is compiled, it has been translated to a Common Language Infrastructure (CLI) representation of a typical <a href="http://blog.pluralsight.com/domain-driven-design-in-csharp-implementing-immutable-value-objects">value object declaration</a> in C#.</p>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/fs_cs_interop/Record_Type_Compilation.png" /></p>

<p>The important thing to notice here is there is no default constructor! </p>

<p>Certain libraries and frameworks requires a class to contain default constructor. For example, the <a href="http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api">model binding</a> feature in Asp.Net framework expects the class with a default constructor to bind the incoming request to a parameter in the action method. You will get a run-time error if the class doesn’t contain default constructor.</p>

<p>So, if we need to have a default constructor for a fsharp record type when it get compiled, we need to decorate the record type with the <a href="https://msdn.microsoft.com/en-us/library/hh289724.aspx">CLIMutable attribute</a></p>

<p>The Ppesence of this attribute enables the compiler to generate the default constructor and the property setters when the code gets compiled to IL</p>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/fs_cs_interop/Record_Type_Attr_Compilation.png" /></p>

<h2 id="using-dynamic-types">Using Dynamic Types</h2>

<p>In C#, we can create a <a href="https://msdn.microsoft.com/en-IN/library/dd264736.aspx">dynamic type</a> which bypasses static type checking and helps to hold the data together without declaring any types. </p>

<p>The <a href="http://stackoverflow.com/questions/14896013/how-viewbag-in-asp-net-mvc-works">ViewBag feature</a> in Asp.Net MVC is a one of the best examples of using dynamic types. It allows you to put any arbitary data in it and use them in the razor views.</p>

<p>There is no straightforward way to access the dynamic types in fsharp.</p>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/fs_cs_interop/ViewBagError.png" /></p>

<p>If we would like to access dynamic types in fsharp we need to use the <a href="https://www.nuget.org/packages/ImpromptuInterface.FSharp/">ImpromptuInterface.FSharp</a> nuget package.</p>

<p>This package defines the <code>?</code> operator, which provides the implementation for accessing dynamic types.</p>

<p><img class="center border" src="http://blog.tamizhvendan.in/images/fs_cs_interop/Dynamic_Operator.png" /></p>

<h2 id="summary">Summary</h2>

<p>In this blog post we have seen three tips which can help us while using C# libraries in F#. If you know any other interoperability tips, kindly leave a comment below. </p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[My Takeaways]]></title>
    <link href="http://blog.tamizhvendan.in/blog/2015/04/25/my-takeaways/"/>
    <updated>2015-04-25T15:09:02+05:30</updated>
    <id>http://blog.tamizhvendan.in/blog/2015/04/25/my-takeaways</id>
    <content type="html"><![CDATA[<blockquote>
  <p>This is the concluding part of my blog series on <a href="http://blog.tamizhvendan.in/blog/2014/12/10/web-application-development-in-fsharp-using-asp-dot-net-mvc/">Web Application Development in Fsharp using ASP.NET MVC</a></p>
</blockquote>

<p>I would like to begin this blog post by thanking <a href="https://twitter.com/jsonmez">John Sonmez</a> for his inspirational video on <a href="http://simpleprogrammer.com/2014/01/09/importance-finishing-started/">the importance of finishing what you started</a>. I haven’t written any blog series <a href="http://blog.tamizhvendan.in/blog/2014/12/10/web-application-development-in-fsharp-using-asp-dot-net-mvc/">like this</a> before, so during this course, I was about to give up but the statement </p>

<p style="text-align:center"> <strong> Finish what you started </strong> </p>

<p>kept me going. Thank you John, I have learned a great lesson in my life from you.</p>

<p>Back to the business, In this blog post I am going to share my key takeaways on developing a complete web application in fsharp using ASP.NET MVC</p>

<h2 id="enterprise-application-development-in-fsharp">Enterprise application development in fsharp</h2>

<p>As a learner of F#, I have spent lots of time in listening to <a href="https://vimeo.com/channels/c4fsharp">the great talks</a> by the vibrant <a href="http://c4fsharp.net/">fsharp community</a>. Though those talks are great, I was intrigued, how these individual pieces would work together in creating a complete enterprise application. Is it really possible? </p>

<p>Developing this complete <a href="https://github.com/tamizhvendan/fsharp-phonecat">fsharp-phonecat</a> application answered my questions and I am sure it answered yours too. It may appear hard because of less sources and functional paradigm, but once you figured it out, it would be a cakewalk.</p>

<p>The bottom line is <strong>we can create a complete enterprise application in fsharp</strong>. As a matter of fact, there is a book written on this subject, <a href="http://www.amazon.com/gp/product/1617291323/ref=as_li_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1617291323&amp;linkCode=as2&amp;tag=bor0b-20&amp;linkId=SYG2CSFARCGD5KUL">F# Deep Dives</a></p>

<p>If you are not convinced yet, read <a href="http://fsharp.org/testimonials/">these testimonials</a> from the commercial users of F#. </p>

<h2 id="leveraging-the-existing-net-ecosystem">Leveraging the existing .NET ecosystem</h2>

<p>In my perspective F# is a <em>pragmatic functional programming language</em>. In addition to lot of elegant features of the language, it works seamlessly with the existing .NET libraries. This one characteristic I would say is a blessing. You can say, ‘This feature is really cool’, but at the end of the day it should help you to get the job done. F# is not only cool, It can help you too!</p>

<p>In the sample application we have leveraged the <a href="http://blog.tamizhvendan.in/blog/2014/12/17/phonecat-backend-using-web-api-and-typeproviders/">Web Api 2</a>, <a href="http://blog.tamizhvendan.in/blog/2014/12/23/step-2-fsharp-phonecat-views-using-razor/">Razor Views</a>, <a href="http://blog.tamizhvendan.in/blog/2015/02/04/step-6-authentication-using-owin-middleware-and-asp-dot-net-identity/">Asp.Net Identity</a> and the Asp.Net framework itself. So, you can do whatever you are doing in C# in F#! ( With less lines of code <i class="emoji smile"></i>)</p>

<h2 id="using-f-in-your-existing-c-codebase">Using F# in your existing C# Codebase</h2>

<p>As F# is a <a href="http://en.wikipedia.org/wiki/List_of_CLI_languages#CLI_languages">CLI Language</a> it can be added to your existing C# solution. All you need to do just create a new F# project in the solution and this project can work seamlessly with the other projects in the solution. </p>

<p>In the sample application, we have a <a href="http://blog.tamizhvendan.in/blog/2015/01/18/step-5-advanced-search-dsl-using-fparsec/">created a parser</a> for a search criteria DSL using <a href="http://www.quanttec.com/fparsec/">FParsec</a>. Doing this in C# would be very hard. So we can easily wrap this F# implementation in a class library and use it from any C# codebase. </p>

<p>In the <a href="http://blog.tamizhvendan.in/blog/2015/01/06/step-4-build-automation-using-fake/">step-5</a> we have automated build process using <a href="http://fsharp.github.io/FAKE/">FAKE</a> which is <em>far</em> better than its counterpart verbose MSBuild xml files. This can be used in any .NET projects!</p>

<h2 id="less-is-beautiful">Less is beautiful</h2>

<p>Another cool aspect of F# is you will be writing less lines of code to achieve complex things. It took only <a href="https://github.com/tamizhvendan/fsharp-phonecat/blob/5/Domain/SearchParser.fs#L10-L44">35 lines of code</a> to create a parser for a DSL. </p>

<p><a href="http://fsharpforfunandprofit.com/rop/">Railway Oriented Programming</a> by <a href="https://twitter.com/ScottWlaschin">Scott Wlaschin</a> is an absolute gem. If you would like to know what F# brings to your plate, I strongly suggest you to listen his talk on <a href="http://fsharpforfunandprofit.com/fppatterns/">Functional Design Patterns</a>. The way you see programming will never be the same after you have seen this presentation. </p>

<h2 id="summary">Summary</h2>

<p>In nutshell, F# is just an awesome programming language to create applications. I hope you would have enjoyed this series. If you have any suggestions, kindly leave a comment.</p>

<p>I would like to conclude this post with the below formula</p>

<p style="text-align:center"> <strong> Python + .NET = F# </strong> </p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Step-10 Refactoring Composition Root]]></title>
    <link href="http://blog.tamizhvendan.in/blog/2015/04/02/step-10-refactoring-composition-root/"/>
    <updated>2015-04-02T17:07:23+05:30</updated>
    <id>http://blog.tamizhvendan.in/blog/2015/04/02/step-10-refactoring-composition-root</id>
    <content type="html"><![CDATA[<blockquote>
  <p>This is step 10 of my blog series on <a href="http://blog.tamizhvendan.in/blog/2014/12/10/web-application-development-in-fsharp-using-asp-dot-net-mvc/">Web Application Development in Fsharp using ASP.NET MVC</a></p>
</blockquote>

<p> </p>

<p>In the fsharp-phonecat application that we are creating as part of this series, to <a href="https://github.com/tamizhvendan/fsharp-phonecat/blob/9/Web/MvcInfrastructure.fs#L14-L48">create the controller instances</a>, we are using <a href="http://blog.ploeh.dk/2014/06/10/pure-di/">Pure DI</a>. Though this <a href="http://blog.ploeh.dk/2011/07/28/CompositionRoot/">composition root</a> solves the problem of <a href="http://blog.ploeh.dk/2012/11/06/WhentouseaDIContainer/">dependency injection</a>, the quality of the code is not up to the mark. </p>

<p>In this blog post we are going to refactor this and make it shorter and more F# idiomatic.</p>

<h3 id="the-current-state-of-getcontrollerinstance-method">The current state of GetControllerInstance method</h3>

<p><img class="border center" src="http://blog.tamizhvendan.in/images/fsharp_phonecat/step_10/if_else_tangle.png" /></p>

<p> 
 </p>

<p>It’s if full of <strong>if..else if.. else if.. else</strong> and the method is too long</p>

<p>As depicted in the above screenshot, the <code>GetControllerInstance</code> method does the following three things for all the controller types in the application</p>

<ul>
  <li>Checks the incoming controller type</li>
  <li>Creates the requested controller instance</li>
  <li>Returns the created controller instance</li>
</ul>

<p><img class="border center" src="http://blog.tamizhvendan.in/images/fsharp_phonecat/step_10/home_controller_creation.png" /></p>

<p>This can be refactored to a function</p>

<p><img class="border center" src="http://blog.tamizhvendan.in/images/fsharp_phonecat/step_10/home_controller_function.png" /></p>

<p>The function takes a type and returns an <a href="http://fsharpforfunandprofit.com/posts/the-option-type/">Option type</a> of <code>IController</code></p>

<p>Let’s do the same for an another controller creation which is little complex than this.</p>

<p><img class="border center" src="http://blog.tamizhvendan.in/images/fsharp_phonecat/step_10/phone_controller_function.png" /></p>

<p>Here in this case to create an instance of <code>PhoneController</code> we need two additional parameters, Phones sequence and anonymous id of the session.</p>

<p>With these functions in place, the <code>GetControllerInstance</code> method would look like as below</p>

<p><img class="border center" src="http://blog.tamizhvendan.in/images/fsharp_phonecat/step_10/match_with_some_and_none.png" /></p>

<p>Though the functions that have created has reduced the size of the method, it has introduced an another problem (<a href="http://raynos.github.io/presentation/shower/controlflow.htm?full#PyramidOfDoom">Pyramid Of Doom</a>) as indicated by the arrow in the screenshot. </p>

<p>We can get rid of this using a bind function as we did in <a href="http://blog.tamizhvendan.in/blog/2015/03/02/step-7-validation-and-error-handling-using-rop/">validation step using rop</a>.</p>

<p>The downside of the <a href="http://fsharpforfunandprofit.com/posts/computation-expressions-bind/">bind function</a> is it’s not generic and we can’t reuse the existing bind function that we have created for doing validation.</p>

<p>So, going with this approach would lead to adding more code which is not in alignment with the objective of this refactoring.</p>

<p>What can we do ??</p>

<p> 
 
 
 
 
 
 
 
 
 
 
 </p>

<p>The answer is <strong><a href="http://en.wikibooks.org/wiki/F_Sharp_Programming/Active_Patterns">Active Patterns</a></strong></p>

<blockquote>
  <p>Active Patterns allow programmers to wrap arbitrary values in a union-like data structure for easy pattern matching. For example, its possible wrap objects with an active pattern, so that you can use objects in pattern matching as easily as any other union type -    <em>F# Programming WikiBook</em></p>
</blockquote>

<p>We are going to use <a href="http://en.wikibooks.org/wiki/F_Sharp_Programming/Active_Patterns#Partial_Active_Patterns">Partial Active Patterns</a> to refactor the composition root.</p>

<h3 id="creating-partial-active-patterns">Creating Partial Active Patterns</h3>

<p>Let’s start by creating a partial active pattern for <code>HomeController</code></p>

<p><img class="border center" src="http://blog.tamizhvendan.in/images/fsharp_phonecat/step_10/home_controller_active_pattern.png" /></p>

<p>As described in the screenshot, it’s very similar to the <code>createHomeController</code> function and the only difference is the addition of the <em>Banana Clips</em> (yellow ellipses). The <code>_</code> symbol makes the active pattern partial.  </p>

<p>The partial active patterns always returns an <code>Option</code> type. </p>

<p>Partial active patterns support defining pattern with multiple parameters. So we can change the <code>createPhoneController</code> function as below</p>

<p><img class="border center" src="http://blog.tamizhvendan.in/images/fsharp_phonecat/step_10/phone_controller_active_pattern.png" /></p>

<p>Great! We are almost done with the refactoring. The pending step is leveraging these partial active patterns in the <code>GetControllerInstance</code> method.</p>

<p>It’s where the <strong>beauty of pattern matching</strong> reveals!</p>

<p><img class="border center" src="http://blog.tamizhvendan.in/images/fsharp_phonecat/step_10/home_controller_pattern_matching.png" /></p>

<p>What’s happening here? </p>

<ul>
  <li>Based on the Active Pattern Name (<code>HomeController</code>), the control goes to the corresponding active pattern</li>
  <li>The value we are matching (<code>controllerType</code>) passed as argument.</li>
  <li>The value returned by the active pattern (instance of <code>HomeController</code>) is assigned to the <code>homeController</code> literal in the match expression</li>
  <li>If none of the pattern has met the matching criteria, it executes the default match (raising the exception)</li>
</ul>

<p>It does the same thing for the Active Patterns with multiple parameters</p>

<p><img class="border center" src="http://blog.tamizhvendan.in/images/fsharp_phonecat/step_10/phone_controller_pattern_matching.png" /></p>

<p>The only thing to note here is, the value against which we are matching is always passed as a last argument.</p>

<p>That’s it!!</p>

<p>After completing the creation of partial active patterns for all the other controller types in the application, the <code>GetControllerInstance</code> would be shorter like this</p>

<p><img class="border center" src="http://blog.tamizhvendan.in/images/fsharp_phonecat/step_10/composition_root_final.png" /></p>

<p> 
 
 
 
 
 
 
 </p>

<p><img class="border center" src="http://blog.tamizhvendan.in/images/fsharp_phonecat/step_10/awesomeness.gif" /></p>

<h3 id="summary">Summary</h3>

<p>Moving from C# to F#, it’s not just change in syntax! It’s much more than that. The perfect analogy for this refactoring is the classic proverb <em>When in Rome, do as the Romans do</em>. You can find the complete source code of this step in the <a href="https://github.com/tamizhvendan/fsharp-phonecat/tree/10">phonecat github repository</a></p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Step-9 Adding Checkout]]></title>
    <link href="http://blog.tamizhvendan.in/blog/2015/03/28/step-9-adding-checkout/"/>
    <updated>2015-03-28T13:07:20+05:30</updated>
    <id>http://blog.tamizhvendan.in/blog/2015/03/28/step-9-adding-checkout</id>
    <content type="html"><![CDATA[<blockquote>
  <p>This is step 9 of my blog series on <a href="http://blog.tamizhvendan.in/blog/2014/12/10/web-application-development-in-fsharp-using-asp-dot-net-mvc/">Web Application Development in Fsharp using ASP.NET MVC</a></p>
</blockquote>

<p>In the <a href="http://blog.tamizhvendan.in/blog/2015/03/20/step-8-adding-shopping-cart/">last blog post</a> we have added the shopping cart feature to our phonecat application and in this blog post we are going to implement the checkout feature.</p>

<p>Implementing the checkout feature involves two steps.<br />
  1. Adding a View Cart Page<br />
  2. Processing the Checkout and creating an order</p>

<h3 id="adding-a-view-cart-page">Adding a View Cart Page</h3>

<p><img class="border" src="http://blog.tamizhvendan.in/images/fsharp_phonecat/step_9/view-cart.png" /></p>

<p>As we have done in the previous posts, let’s begin by extending our shopping cart domain. The first step is to add a function to retrieve the items in the shopping cart. </p>

<p>Open <code>ShoppingCart</code> module in the <strong>Domain</strong> project and update it as below</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">getItems</span> <span class="n">cart</span> <span class="o">=</span>
</span><span class="line">  <span class="k">match</span> <span class="n">cart</span> <span class="k">with</span>
</span><span class="line">  <span class="o">|</span> <span class="n">Empty</span> <span class="o">-&gt;</span> <span class="nn">Seq</span><span class="p">.</span><span class="n">empty</span>
</span><span class="line">  <span class="o">|</span> <span class="n">Active</span> <span class="n">items</span> <span class="o">-&gt;</span> <span class="n">items</span> <span class="o">|&gt;</span> <span class="nn">List</span><span class="p">.</span><span class="n">toSeq</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The above function retrieves the phone ids present in the cart. In order to show a detailed checkout page, we need to get the associated phone details of these phone ids. Right now we don’t have this capability in our app so let’s add them.</p>

<p>Open <code>Phones</code> module in the <strong>Domain</strong> project and add the below functions</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">contains</span> <span class="n">x</span> <span class="o">=</span> <span class="nn">Seq</span><span class="p">.</span><span class="n">exists</span> <span class="o">((=)</span> <span class="n">x</span><span class="o">)</span>
</span><span class="line">
</span><span class="line"><span class="k">let</span> <span class="nv">getPhonesByIds</span> <span class="o">(</span><span class="n">phones</span> <span class="o">:</span> <span class="n">seq</span><span class="o">&lt;</span><span class="n">Phone</span><span class="o">&gt;)</span> <span class="n">phoneIds</span> <span class="o">=</span>
</span><span class="line">  <span class="n">phones</span> <span class="o">|&gt;</span> <span class="nn">Seq</span><span class="p">.</span><span class="n">filter</span> <span class="o">(</span><span class="k">fun</span> <span class="n">p</span> <span class="o">-&gt;</span> <span class="n">contains</span> <span class="n">p</span><span class="o">.</span><span class="n">Id</span> <span class="n">phoneIds</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <code>contains</code> function is a utility function which checks whether the given element is present in a <code>seq</code> or not and the <code>getPhonesByIds</code> function filters phones in the system by the incoming phone ids and returns the requested ones.</p>

<p>Now we have all the bare bones and the next step is defining a controller to serve the View Cart Page.</p>

<p>Add a new Source file <code>CheckoutController</code> in the <strong>Web</strong> project under <em>Controllers</em> directory and update it as below</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">type</span> <span class="nc">CheckoutController</span>
</span><span class="line">  <span class="o">(</span>
</span><span class="line">      <span class="n">getPhones</span> <span class="o">:</span> <span class="n">seq</span><span class="o">&lt;</span><span class="kt">string</span><span class="o">&gt;</span> <span class="o">-&gt;</span> <span class="n">seq</span><span class="o">&lt;</span><span class="n">Phone</span><span class="o">&gt;,</span>
</span><span class="line">      <span class="n">cart</span> <span class="o">:</span> <span class="n">Cart</span>
</span><span class="line">  <span class="o">)</span> <span class="o">=</span>
</span><span class="line">  <span class="k">inherit</span> <span class="n">Controller</span> <span class="bp">()</span>
</span><span class="line">
</span><span class="line">  <span class="k">member</span> <span class="n">this</span><span class="p">.</span><span class="nf">ViewCart</span> <span class="bp">()</span> <span class="o">=</span>
</span><span class="line">    <span class="n">cart</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="n">getItems</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="n">getPhones</span>
</span><span class="line">    <span class="o">|&gt;</span> <span class="n">this</span><span class="o">.</span><span class="n">View</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <code>ViewCart</code> action method uses the two functions that we have defined before and renders the <code>ViewCart</code> view. Add a new razor view with the name <code>ViewCart</code> in the <em>Views\Checkout</em> Directory and update it <a href="https://github.com/tamizhvendan/fsharp-phonecat/blob/9/Web/Views/Checkout/ViewCart.cshtml#L1-L30">as described here</a>. </p>

<p>The final step in rendering this view is gluing the components together in the <code>CheckoutController</code> controller instance creation. </p>

<p>To get the cart associated with the given session id we have added <a href="https://github.com/tamizhvendan/fsharp-phonecat/blob/8/Web/Infrastructure.fs#L41-L45">a piece of logic</a> in the last step which checks the presence of <code>Cart</code> for the given anonymous id in the <code>CartStorage</code> and creates the cart if it doesn’t contain. Since we need the same logic here, let’s move this logic to a function <code>getOrCreate</code> in the <code>CartStorage</code> module and reuse it in both the places</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">let</span> <span class="nv">getOrCreate</span> <span class="n">anonymousId</span> <span class="o">=</span>
</span><span class="line">  <span class="k">match</span> <span class="n">get</span> <span class="n">anonymousId</span> <span class="k">with</span>
</span><span class="line">  <span class="o">|</span> <span class="n">Some</span> <span class="n">cart</span> <span class="o">-&gt;</span> <span class="n">cart</span>
</span><span class="line">  <span class="o">|</span> <span class="n">None</span> <span class="o">-&gt;</span> <span class="n">create</span> <span class="n">anonymousId</span> <span class="nn">ShoppingCart</span><span class="p">.</span><span class="n">Empty</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
<p>Then open <code>MvcInfrastructure</code> module in the <strong>Web</strong> project and update it as below</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">type</span> <span class="nc">CompositionRoot</span><span class="o">(</span><span class="n">phones</span> <span class="o">:</span> <span class="n">seq</span><span class="o">&lt;</span><span class="nn">PhoneTypeProvider</span><span class="p">.</span><span class="n">Root</span><span class="o">&gt;)</span> <span class="o">=</span>
</span><span class="line">  <span class="k">inherit</span> <span class="n">DefaultControllerFactory</span><span class="bp">()</span> <span class="k">with</span>
</span><span class="line">    <span class="k">override</span> <span class="n">this</span><span class="p">.</span><span class="nf">GetControllerInstance</span><span class="o">(</span><span class="n">requestContext</span><span class="o">,</span> <span class="n">controllerType</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">    <span class="c1">// ... existing code ...</span>
</span><span class="line">    <span class="k">else</span> <span class="k">if</span> <span class="n">controllerType</span> <span class="o">=</span> <span class="n">typeof</span><span class="o">&lt;</span><span class="n">CheckoutController</span><span class="o">&gt;</span> <span class="k">then</span>
</span><span class="line">      <span class="k">let</span> <span class="nv">anonymousID</span> <span class="o">=</span> <span class="n">requestContext</span><span class="o">.</span><span class="n">HttpContext</span><span class="o">.</span><span class="n">Request</span><span class="o">.</span><span class="n">AnonymousID</span>
</span><span class="line">      <span class="k">let</span> <span class="nv">shoppingCart</span> <span class="o">=</span> <span class="nn">CartStorage</span><span class="p">.</span><span class="n">getOrCreate</span> <span class="n">anonymousID</span>
</span><span class="line">      <span class="k">let</span> <span class="nv">getPhonesByIds</span> <span class="o">=</span> <span class="n">phones</span> <span class="o">|&gt;</span> <span class="nn">Seq</span><span class="p">.</span><span class="n">map</span> <span class="nn">TypeProviders</span><span class="p">.</span><span class="n">ToPhone</span> <span class="o">|&gt;</span> <span class="nn">Phones</span><span class="p">.</span><span class="n">getPhonesByIds</span>
</span><span class="line">      <span class="k">let</span> <span class="nv">checkoutController</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CheckoutController</span><span class="o">(</span><span class="n">getPhonesByIds</span><span class="o">,</span> <span class="n">shoppingCart</span><span class="o">)</span>
</span><span class="line">      <span class="n">checkoutController</span> <span class="o">:&gt;</span> <span class="n">IController</span>
</span><span class="line">    <span class="c1">// ... existing code ...</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The composition of <code>CheckoutController</code> is similar to that of other controllers in the application. We get the cart associated with the given anonymous id and then create a partial applied function of <code>Phones.getPhonesByIds</code> by passing the first argument (phones in the app) alone.</p>

<p>That’s it. The Cart View is up and running!</p>

<h3 id="processing-the-checkout">Processing the Checkout</h3>

<p>As mentioned in the beginning, the next step after displaying the shopping cart page is processing the checkout and creating an order. </p>

<p>Let’s begin by defining the domain for Orders.</p>

<p>Create a source file with the name <code>Orders</code> in the <strong>Domain</strong> project and add the following types</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">module</span> <span class="nn">Orders</span> <span class="o">=</span>
</span><span class="line">  <span class="k">type</span> <span class="nc">OrderRequest</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">    <span class="n">UserId</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line">    <span class="n">ProductIds</span> <span class="o">:</span> <span class="n">ProductId</span> <span class="n">seq</span>
</span><span class="line">  <span class="o">}</span>
</span><span class="line">  <span class="k">type</span> <span class="nc">OrderConfirmed</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">    <span class="n">OrderId</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line">    <span class="n">UserId</span> <span class="o">:</span> <span class="kt">string</span>
</span><span class="line">    <span class="n">ProductIds</span> <span class="o">:</span> <span class="n">ProductId</span> <span class="n">seq</span>
</span><span class="line">  <span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <code>OrderRequest</code> type represents the order being placed by the user and the <code>OrderConfirmed</code> type represents the successful order creation.</p>

<p>To Keep things simple, we are just going to see the order confirmation and we are intentionally leaving out error handling and validation. We can easily <a href="http://blog.tamizhvendan.in/blog/2015/03/02/step-7-validation-and-error-handling-using-rop/">add them as we did</a>  it in the user registration step and I leave it you as an exercise.</p>

<p>The next step is storing the incoming order. </p>

<p>Create a source file with the name <code>OrderStorage</code> in the <strong>DataAccess</strong> project and add the following function</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">module</span> <span class="nn">OrderStorage</span> <span class="o">=</span>
</span><span class="line">  <span class="k">let</span> <span class="nv">placeOrder</span> <span class="o">(</span><span class="n">orderRequest</span> <span class="o">:</span> <span class="n">OrderRequest</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">    <span class="k">let</span> <span class="nv">orderId</span> <span class="o">=</span> <span class="nn">Guid</span><span class="p">.</span><span class="n">NewGuid</span><span class="bp">()</span><span class="o">.</span><span class="n">ToString</span><span class="bp">()</span>
</span><span class="line">    <span class="o">{</span><span class="n">OrderId</span> <span class="o">=</span> <span class="n">orderId</span><span class="o">;</span> <span class="n">UserId</span> <span class="o">=</span> <span class="n">orderRequest</span><span class="o">.</span><span class="n">UserId</span><span class="o">;</span> <span class="n">ProductIds</span> <span class="o">=</span> <span class="n">orderRequest</span><span class="o">.</span><span class="n">ProductIds</span><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Here we are just faked the implementation of order storage by generating a new <code>Guid</code> and returning it as Order Id</p>

<p>Now it’s time for adding a <code>OrderController</code> in the <strong>Web</strong> project to handle the checkout and creating the order using the components defined above.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">type</span> <span class="nc">OrderController</span>
</span><span class="line">  <span class="o">(</span>
</span><span class="line">    <span class="n">cart</span> <span class="o">:</span> <span class="n">Cart</span><span class="o">,</span>
</span><span class="line">    <span class="n">placeOrder</span> <span class="o">:</span> <span class="n">OrderRequest</span> <span class="o">-&gt;</span> <span class="n">OrderConfirmed</span><span class="o">,</span>
</span><span class="line">    <span class="n">updateCart</span> <span class="o">:</span> <span class="n">Cart</span> <span class="o">-&gt;</span> <span class="n">Cart</span>
</span><span class="line">  <span class="o">)</span> <span class="o">=</span>
</span><span class="line">  <span class="k">inherit</span> <span class="n">Controller</span> <span class="bp">()</span>
</span><span class="line">
</span><span class="line">  <span class="o">[&lt;</span><span class="n">Authorize</span><span class="o">&gt;]</span>
</span><span class="line">  <span class="k">member</span> <span class="n">this</span><span class="p">.</span><span class="nf">Checkout</span> <span class="bp">()</span> <span class="o">=</span>
</span><span class="line">    <span class="k">let</span> <span class="nv">identity</span> <span class="o">=</span> <span class="k">base</span><span class="o">.</span><span class="n">User</span><span class="o">.</span><span class="n">Identity</span> <span class="o">:?&gt;</span> <span class="n">ClaimsIdentity</span>
</span><span class="line">    <span class="k">let</span> <span class="nv">userId</span> <span class="o">=</span> <span class="n">identity</span><span class="o">.</span><span class="n">FindFirst</span><span class="o">(</span><span class="nn">ClaimTypes</span><span class="p">.</span><span class="n">Name</span><span class="o">).</span><span class="n">Value</span>
</span><span class="line">    <span class="k">let</span> <span class="nv">orderConfirmed</span> <span class="o">=</span> <span class="n">placeOrder</span> <span class="o">{</span> <span class="n">UserId</span> <span class="o">=</span> <span class="n">userId</span><span class="o">;</span> <span class="n">ProductIds</span> <span class="o">=</span> <span class="n">getItems</span> <span class="n">cart</span><span class="o">}</span>
</span><span class="line">    <span class="n">updateCart</span> <span class="nn">Cart</span><span class="p">.</span><span class="n">Empty</span> <span class="o">|&gt;</span> <span class="n">ignore</span>
</span><span class="line">    <span class="n">this</span><span class="o">.</span><span class="n">View</span><span class="o">(</span><span class="n">orderConfirmed</span><span class="o">);</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The checkout method is straightforward. We get the <code>UserId</code> from the <code>User.Identity</code> property and place the order using it. Upon successful order confirmation, we are clearing the shopping cart and rendering the <code>Checkout</code> view.</p>

<p><img class="border" src="http://blog.tamizhvendan.in/images/fsharp_phonecat/step_9/order-confirmation.png" /></p>

<p>The important thing to notice here the <code>Authorize</code> attribute. Just like any other e-commerce portal, we are not allowing anonymous check out here. The presence of <a href="https://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute%28v=vs.118%29.aspx">this authorize attribute</a> ensures that only logged in users are checking out and in case if they are not logged in it would redirect the user to the login page.</p>

<p>The last step is updating the composition root to create the <code>OrderController</code> instance.</p>

<p>Open <code>MvcInfrasturcture</code> and update it as below</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
</pre></td><td class="code"><pre><code class="fsharp"><span class="line"><span class="k">type</span> <span class="nc">CompositionRoot</span><span class="o">(</span><span class="n">phones</span> <span class="o">:</span> <span class="n">seq</span><span class="o">&lt;</span><span class="nn">PhoneTypeProvider</span><span class="p">.</span><span class="n">Root</span><span class="o">&gt;)</span> <span class="o">=</span>
</span><span class="line">  <span class="k">inherit</span> <span class="n">DefaultControllerFactory</span><span class="bp">()</span> <span class="k">with</span>
</span><span class="line">    <span class="k">override</span> <span class="n">this</span><span class="p">.</span><span class="nf">GetControllerInstance</span><span class="o">(</span><span class="n">requestContext</span><span class="o">,</span> <span class="n">controllerType</span><span class="o">)</span> <span class="o">=</span>
</span><span class="line">    <span class="c1">// ... existing code ...</span>
</span><span class="line">    <span class="k">else</span> <span class="k">if</span> <span class="n">controllerType</span> <span class="o">=</span> <span class="n">typeof</span><span class="o">&lt;</span><span class="n">OrderController</span><span class="o">&gt;</span> <span class="k">then</span>
</span><span class="line">      <span class="k">let</span> <span class="nv">anonymousID</span> <span class="o">=</span> <span class="n">requestContext</span><span class="o">.</span><span class="n">HttpContext</span><span class="o">.</span><span class="n">Request</span><span class="o">.</span><span class="n">AnonymousID</span>
</span><span class="line">      <span class="k">let</span> <span class="nv">shoppingCart</span> <span class="o">=</span> <span class="nn">CartStorage</span><span class="p">.</span><span class="n">getOrCreate</span> <span class="n">anonymousID</span>
</span><span class="line">      <span class="k">let</span> <span class="nv">updateCart</span> <span class="o">=</span> <span class="nn">CartStorage</span><span class="p">.</span><span class="n">update</span> <span class="n">anonymousID</span>
</span><span class="line">      <span class="k">let</span> <span class="nv">orderController</span> <span class="o">=</span> <span class="k">new</span> <span class="n">OrderController</span><span class="o">(</span><span class="n">shoppingCart</span><span class="o">,</span> <span class="nn">OrderStorage</span><span class="p">.</span><span class="n">placeOrder</span><span class="o">,</span> <span class="n">updateCart</span><span class="o">)</span>
</span><span class="line">      <span class="n">orderController</span> <span class="o">:&gt;</span> <span class="n">IController</span>
</span><span class="line">    <span class="c1">// ... existing code ...</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>We are done!</p>

<h3 id="summary">Summary</h3>

<p>We have come a long way from just setting up the visual studio project to a complete prototype of an e-commerce site and I hope you would have enjoyed this series of blog post. In the next blog post we are going to refactor the <code>CompositionRoot</code>which is getting clumsy with a series of <code>if..else if..</code> expressions using Active Patterns and I will be wrapping this series by an another post which will be reflecting back on what I have learned by writing this blog series.</p>

<p>You can find the source code of this step in the <a href="https://github.com/tamizhvendan/fsharp-phonecat/tree/9">fsharp-phonecat github repository</a></p>

<p>Thanks for reading!</p>
]]></content>
  </entry>
  
</feed>
