<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Xata on Techformist</title>
    <link>https://techformist.com/tags/xata/</link>
    <description>Recent content in Xata on Techformist</description>
    <image>
      <url>https://techformist.com/logo.svg</url>
      <link>https://techformist.com/logo.svg</link>
    </image>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 19 Dec 2022 06:30:00 +0000</lastBuildDate><atom:link href="https://techformist.com/tags/xata/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Create a simple contact database with Express &amp; Xata</title>
      <link>https://techformist.com/simple-contact-database-xata-express/</link>
      <pubDate>Mon, 19 Dec 2022 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/simple-contact-database-xata-express/</guid>
      <description>&lt;p&gt;I am quite excited with all the developments in the database world. While hosted database is not a new concept, we now have services that are -&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;far more focused on usability - support intuitive data types, have spreadsheet-like experience&lt;/li&gt;
&lt;li&gt;have schema editors :)&lt;/li&gt;
&lt;li&gt;support simple migrations&lt;/li&gt;
&lt;li&gt;support more advanced functions like caching without need for black magic&lt;/li&gt;
&lt;li&gt;.. probably include more predictable pricing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://xata.io/&#34;&gt;Xata&lt;/a&gt; is one such database service that ticks a few boxes and is fairly new. In this post, let us look at how easy it is to create a simple contact application with Express and Xata.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I am quite excited with all the developments in the database world. While hosted database is not a new concept, we now have services that are -</p>
<ul>
<li>far more focused on usability - support intuitive data types, have spreadsheet-like experience</li>
<li>have schema editors :)</li>
<li>support simple migrations</li>
<li>support more advanced functions like caching without need for black magic</li>
<li>.. probably include more predictable pricing</li>
</ul>
<p><a href="https://xata.io/">Xata</a> is one such database service that ticks a few boxes and is fairly new. In this post, let us look at how easy it is to create a simple contact application with Express and Xata.</p>
<h2 id="1-setup-the-project">1. Setup the project</h2>
<p>Let us start by setting up the skeleton Express server.</p>
<p>Make sure you have <a href="https://nodejs.org/en/">Node</a> installed on the computer. Create a folder for your project - I will call it <code>crm-express-xata</code>.</p>
<p>Install Express and Typescript with a few commands.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl"><span class="k">cd</span> crm-express-xata
</span></span><span class="line"><span class="cl">npm init -y
</span></span><span class="line"><span class="cl">npm i express <span class="s2">&#34;@xata.io/cli&#34;</span> dotenv
</span></span><span class="line"><span class="cl">npm i -d rollup typescript esbuild <span class="s2">&#34;@types/node&#34;</span> ts-node nodemon <span class="s2">&#34;@types/express&#34;</span>
</span></span><span class="line"><span class="cl">node_modules/.bin/tsc --init
</span></span></code></pre></div><p>Here&rsquo;s everything we installed -</p>
<ol>
<li><code>express</code> - Express server</li>
<li><code>dotenv</code> - Import environment variables in the project</li>
<li><code>xata cli</code> - Utility that simplifies creation of tables, and run various other commands</li>
<li><code>rollup</code>, <code>esbuild</code> - Xata dependencies</li>
<li><code>typescript</code> - We will use typescript with Express</li>
<li><code>ts-node</code>, <code>nodemon</code> - Automatically restart Express and appply changes as they happen (&ldquo;hot reload&rdquo;)</li>
<li><code>@types/express</code> and <code>@types/node</code> to install types (and help ease our typing!)</li>
</ol>
<p>You may want to install <code>@xata.io/cli</code> globally if you are planning to use the Xata CLI in multiple projects.</p>
<p>We round up the installation with <code>tsc --init</code> that will create a default <code>tsconfig.json</code> used by Typescript. Observe the file content until your head reels, and replace it with -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;compilerOptions&#34;</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="cm">/* Language and Environment */</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;target&#34;</span><span class="o">:</span> <span class="s2">&#34;es2016&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;moduleDetection&#34;</span><span class="o">:</span> <span class="s2">&#34;auto&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="cm">/* Modules */</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;module&#34;</span><span class="o">:</span> <span class="s2">&#34;commonjs&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;rootDir&#34;</span><span class="o">:</span> <span class="s2">&#34;src&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;moduleResolution&#34;</span><span class="o">:</span> <span class="s2">&#34;node&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;allowSyntheticDefaultImports&#34;</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;lib&#34;</span><span class="o">:</span> <span class="p">[</span><span class="s2">&#34;esnext&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="cm">/* Emit */</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;outDir&#34;</span><span class="o">:</span> <span class="s2">&#34;dist&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;sourceMap&#34;</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="cm">/* Interop Constraints */</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;esModuleInterop&#34;</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;forceConsistentCasingInFileNames&#34;</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="cm">/* Type Checking */</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;strict&#34;</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="cm">/* Completeness */</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;skipLibCheck&#34;</span><span class="o">:</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Create a new file called <code>nodemon.json</code> -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;watch&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;src&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;ext&#34;</span><span class="p">:</span> <span class="s2">&#34;ts,json&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;ignore&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;src/**/*.spec.ts&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;exec&#34;</span><span class="p">:</span> <span class="s2">&#34;ts-node ./src/index.ts&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p><code>nodemon</code> along with <code>ts-node</code> will ensure that our changes are reflected as we develop the application. You can simply navigate to your project directory in a terminal, and call <code>nodemon</code> for the hot reloading to work.</p>
<p>Or, better yet - change the <code>scripts</code> section in <code>package.json</code> file to -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="s2">&#34;scripts&#34;</span><span class="err">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;dev&#34;</span><span class="p">:</span> <span class="s2">&#34;nodemon&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;test&#34;</span><span class="p">:</span> <span class="s2">&#34;echo \&#34;Error: no test specified\&#34; &amp;&amp; exit 1&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span><span class="err">,</span>
</span></span></code></pre></div><p>Create a new file called <code>src/index.ts</code> -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="p">(</span><span class="s2">&#34;hello world&#34;</span><span class="p">);</span>
</span></span></code></pre></div><p>You can now type in <code>npm dev</code> to see your application in action.</p>
<p><img loading="lazy" src="/2022/npm-run-dev-express-ts.png" type="" alt="npm-run-dev-express-ts"  /></p>
<p>Before we forget, let us create a <code>.gitignore</code> file to version control only those files that make sense. Use the below content for <code>.gitignore</code> for now -</p>
<pre tabindex="0"><code>node_modules
dist
.env
</code></pre><p>Alternatively, copy over the <code>.gitignore</code> content from the <a href="https://github.com/prashanth1k/crm-express-xata">crm-express-xata repo</a>.</p>
<p>If you don&rsquo;t mind seeing more code in a demo project and want to simplify the setup, you can always use a starter template with this command - <code>pnpx typescript-express-starter crm-express-xata</code>. You can avoid all the manual steps of setting up Express and Typescript with that single command (you can then ignore the majority of steps in this section!).</p>
<h2 id="2-setup-xata">2. Setup Xata</h2>
<p>Head over to <a href="https://app.xata.io/workspaces">Xata</a> and sign up for the free plan. With support for 750k records and 75 requests per second, we should be more than able to test the service in a pilot project.</p>
<p>You will land up on a home page with a blank workspace.
<img loading="lazy" src="/2022/xata-home-workspace.png" type="" alt="xata-home-workspace"  /></p>
<p>Create a database <code>contactdb</code> in your favourite region. Click on <code>Schema</code> link on the left navigation bar to visualize all tables (only one at this time), fields, and their relationships.</p>
<p><img loading="lazy" src="/2022/xata-schema-view.png" type="" alt="xata-schema-view"  /></p>
<p>Add a table called <code>contact</code> with the following columns -</p>
<ul>
<li>name - of type <code>string</code>, <code>not null</code></li>
<li>email - of type <code>email</code></li>
</ul>
<p>Column types are self explanatory and &ldquo;linking&rdquo; of the user table allows you to tag user records from the <code>contact</code> table.</p>
<p>Add other table(s) by clicking like crazy in your Xata workspace, and create the below table/columns.</p>
<ul>
<li>activity
<ul>
<li>description | <code>string</code>, <code>not null</code></li>
<li>type</li>
<li>status</li>
<li>contact | link to <code>contact</code> table</li>
</ul>
</li>
</ul>
<p>Click on any table from the left navigation bar under <code>Tables</code> header to see records in the table. Click on <code>Get code snippet</code> to see instructions on installing xata library and code snippets for accessing the table.</p>
<p><img loading="lazy" src="/2022/xata-table-setup-script.png" type="" alt="/2022/xata-table-setup-script.png"  /></p>
<p>I will install Xata library as dev depedency since I don&rsquo;t need them elsewhere.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">npm install -d @xata.io/cli
</span></span></code></pre></div><p>Copy the URL from the init snippet.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">xata init --db https://demo.us-east-1.xata.sh/db/contactdb
</span></span></code></pre></div><h2 id="3-code-the-foundation-for-express">3. Code the foundation for Express</h2>
<p>Create a <code>.env</code> file in your project root directory -</p>
<pre tabindex="0"><code>PORT=3000
</code></pre><p>The contents of the file will be used at various stages in the project.</p>
<p>Change the content of <code>src/index.ts</code> to -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">express</span><span class="p">,</span> <span class="p">{</span> <span class="nx">Express</span><span class="p">,</span> <span class="nx">Request</span><span class="p">,</span> <span class="nx">Response</span> <span class="p">}</span> <span class="kr">from</span> <span class="s2">&#34;express&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">dotenv</span> <span class="kr">from</span> <span class="s2">&#34;dotenv&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// read env file
</span></span></span><span class="line"><span class="cl"><span class="nx">dotenv</span><span class="p">.</span><span class="nx">config</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// initialize
</span></span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">app</span>: <span class="kt">Express</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">port</span> <span class="o">=</span> <span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">PORT</span> <span class="o">||</span> <span class="mi">3001</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">app</span><span class="p">.</span><span class="kr">get</span><span class="p">(</span><span class="s2">&#34;/api&#34;</span><span class="p">,</span> <span class="p">(</span><span class="nx">req</span>: <span class="kt">Request</span><span class="p">,</span> <span class="nx">res</span>: <span class="kt">Response</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">res</span><span class="p">.</span><span class="nx">json</span><span class="p">({</span> <span class="nx">msg</span><span class="o">:</span> <span class="s2">&#34;hello&#34;</span> <span class="p">});</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="nx">port</span><span class="p">,</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;Express server listening on port&#34;</span><span class="p">,</span> <span class="nx">port</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span></code></pre></div><p>Here&rsquo;s what we are doing here -</p>
<ol>
<li>Import <code>express</code>, <code>dotenv</code></li>
<li>Initiate <code>express</code></li>
<li>Create a simple test api at <code>/api</code> that responds with a simple JSON message</li>
<li>Start the server</li>
</ol>
<p>Start the program with <code>npm dev</code>. Use your favourite API client to invoke a <code>get</code> request to <code>http://localhost:3000/api</code> to see the below response -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nt">&#34;msg&#34;</span><span class="p">:</span> <span class="s2">&#34;hello&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Now that we know the Express server is working, let us setup Xata in Express.
Go back to the project directory in terminal and enter -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">node_modules/.bin/xata init --db https://demo.us-east-1.xata.sh/db/contactdb
</span></span></code></pre></div><p>If you have installed the CLI globally, you just use <code>xata init</code> without prefix. You must replace the URL here with the one copied over from the code snippet from Xata website.</p>
<p>The <code>init</code> command will -</p>
<ul>
<li>prompt you to enter your credentials</li>
<li>generate a secret key and update your key in <code>.env</code> file</li>
<li>create a <code>xata.ts</code> file that will provide the types for your database / tables</li>
</ul>
<p>Neat.</p>
<h2 id="4-code-the-contact-route">4. Code the Contact Route</h2>
<p>Create <code>/services/contact.ts</code> with one route -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">express</span><span class="p">,</span> <span class="p">{</span> <span class="nx">Router</span><span class="p">,</span> <span class="nx">Request</span><span class="p">,</span> <span class="nx">Response</span> <span class="p">}</span> <span class="kr">from</span> <span class="s2">&#34;express&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">XataClient</span> <span class="p">}</span> <span class="kr">from</span> <span class="s2">&#34;../xata&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">dotenv</span> <span class="kr">from</span> <span class="s2">&#34;dotenv&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">dotenv</span><span class="p">.</span><span class="nx">config</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">router</span>: <span class="kt">Router</span> <span class="o">=</span> <span class="nx">express</span><span class="p">.</span><span class="nx">Router</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">xata</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">XataClient</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">router</span><span class="p">.</span><span class="kr">get</span><span class="p">(</span><span class="s2">&#34;/&#34;</span><span class="p">,</span> <span class="kr">async</span> <span class="p">(</span><span class="nx">req</span>: <span class="kt">Request</span><span class="p">,</span> <span class="nx">res</span>: <span class="kt">Response</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">try</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;Trying to get contact records..&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="kd">let</span> <span class="nx">query</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">query</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">rec</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">xata</span><span class="p">.</span><span class="nx">db</span><span class="p">.</span><span class="nx">contact</span><span class="p">.</span><span class="nx">filter</span><span class="p">(</span><span class="nx">query</span><span class="p">).</span><span class="nx">getMany</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="nx">res</span><span class="p">.</span><span class="nx">json</span><span class="p">(</span><span class="nx">rec</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;..done&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">e</span>: <span class="kt">any</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">res</span><span class="p">.</span><span class="nx">status</span><span class="p">(</span><span class="mi">500</span><span class="p">).</span><span class="nx">send</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">toString</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">router</span><span class="p">;</span>
</span></span></code></pre></div><p><code>xata.db.contact.filter(query).getMany()</code> queries Xata for contact records.</p>
<p>In <code>index.js</code>, add -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">contact</span> <span class="kr">from</span> <span class="s2">&#34;./services/contact&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// .. other code
</span></span></span><span class="line"><span class="cl"><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">express</span><span class="p">.</span><span class="nx">json</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="s2">&#34;/api/contact/&#34;</span><span class="p">,</span> <span class="nx">contact</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// .. other code
</span></span></span><span class="line"><span class="cl"><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="nx">port</span><span class="p">,</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;Express server listening on port&#34;</span><span class="p">,</span> <span class="nx">port</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span></code></pre></div><p>Save files to restart server and you should now be able to get all contact records at <code>http://localhost:3000/api/contact</code>.</p>
<p>You don&rsquo;t need to code contact routes in a separate file, but this structure reduces some clutter in <code>main.js</code> (&amp; helps to scale in future).</p>
<p>Let us code in other methods in <code>contact.ts</code> as well and the entire file should like this -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">express</span><span class="p">,</span> <span class="p">{</span> <span class="nx">Router</span><span class="p">,</span> <span class="nx">Request</span><span class="p">,</span> <span class="nx">Response</span> <span class="p">}</span> <span class="kr">from</span> <span class="s2">&#34;express&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">XataClient</span> <span class="p">}</span> <span class="kr">from</span> <span class="s2">&#34;../xata&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">dotenv</span> <span class="kr">from</span> <span class="s2">&#34;dotenv&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">dotenv</span><span class="p">.</span><span class="nx">config</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">router</span>: <span class="kt">Router</span> <span class="o">=</span> <span class="nx">express</span><span class="p">.</span><span class="nx">Router</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">xata</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">XataClient</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">router</span><span class="p">.</span><span class="kr">get</span><span class="p">(</span><span class="s2">&#34;/&#34;</span><span class="p">,</span> <span class="kr">async</span> <span class="p">(</span><span class="nx">req</span>: <span class="kt">Request</span><span class="p">,</span> <span class="nx">res</span>: <span class="kt">Response</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">try</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;Trying to get contact records..&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="kd">let</span> <span class="nx">query</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">query</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">rec</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">xata</span><span class="p">.</span><span class="nx">db</span><span class="p">.</span><span class="nx">contact</span><span class="p">.</span><span class="nx">filter</span><span class="p">(</span><span class="nx">query</span><span class="p">).</span><span class="nx">getMany</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="nx">res</span><span class="p">.</span><span class="nx">json</span><span class="p">(</span><span class="nx">rec</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;..done&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">e</span>: <span class="kt">any</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">res</span><span class="p">.</span><span class="nx">status</span><span class="p">(</span><span class="mi">500</span><span class="p">).</span><span class="nx">send</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">toString</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">router</span><span class="p">.</span><span class="kr">get</span><span class="p">(</span><span class="s2">&#34;/:id&#34;</span><span class="p">,</span> <span class="kr">async</span> <span class="p">(</span><span class="nx">req</span>: <span class="kt">Request</span><span class="p">,</span> <span class="nx">res</span>: <span class="kt">Response</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">try</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">recId</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">params</span><span class="p">.</span><span class="nx">id</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;Trying to query for&#34;</span><span class="p">,</span> <span class="nx">recId</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">recId</span> <span class="o">===</span> <span class="s2">&#34;undefined&#34;</span><span class="p">)</span> <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s2">&#34;Id is undefined&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nx">res</span><span class="p">.</span><span class="nx">json</span><span class="p">(</span><span class="k">await</span> <span class="nx">xata</span><span class="p">.</span><span class="nx">db</span><span class="p">.</span><span class="nx">contact</span><span class="p">.</span><span class="nx">read</span><span class="p">(</span><span class="nx">recId</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">e</span>: <span class="kt">any</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">res</span><span class="p">.</span><span class="nx">status</span><span class="p">(</span><span class="mi">500</span><span class="p">).</span><span class="nx">send</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">toString</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">router</span><span class="p">.</span><span class="nx">post</span><span class="p">(</span><span class="s2">&#34;/&#34;</span><span class="p">,</span> <span class="kr">async</span> <span class="p">(</span><span class="nx">req</span>: <span class="kt">Request</span><span class="p">,</span> <span class="nx">res</span>: <span class="kt">Response</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">try</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;Creating contact:&#34;</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><span class="line"><span class="cl">    <span class="nx">res</span><span class="p">.</span><span class="nx">json</span><span class="p">(</span><span class="k">await</span> <span class="nx">xata</span><span class="p">.</span><span class="nx">db</span><span class="p">.</span><span class="nx">contact</span><span class="p">.</span><span class="nx">create</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><span class="line"><span class="cl">  <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">e</span>: <span class="kt">any</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">res</span><span class="p">.</span><span class="nx">status</span><span class="p">(</span><span class="mi">500</span><span class="p">).</span><span class="nx">send</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">toString</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">router</span><span class="p">.</span><span class="nx">patch</span><span class="p">(</span><span class="s2">&#34;/:id&#34;</span><span class="p">,</span> <span class="kr">async</span> <span class="p">(</span><span class="nx">req</span>: <span class="kt">Request</span><span class="p">,</span> <span class="nx">res</span>: <span class="kt">Response</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">try</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;Updating contact:&#34;</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><span class="line"><span class="cl">    <span class="nx">res</span><span class="p">.</span><span class="nx">json</span><span class="p">(</span><span class="k">await</span> <span class="nx">xata</span><span class="p">.</span><span class="nx">db</span><span class="p">.</span><span class="nx">contact</span><span class="p">.</span><span class="nx">update</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">params</span><span class="p">.</span><span class="nx">id</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><span class="line"><span class="cl">  <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">e</span>: <span class="kt">any</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">res</span><span class="p">.</span><span class="nx">status</span><span class="p">(</span><span class="mi">500</span><span class="p">).</span><span class="nx">send</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">toString</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">router</span><span class="p">.</span><span class="k">delete</span><span class="p">(</span><span class="s2">&#34;/:id&#34;</span><span class="p">,</span> <span class="kr">async</span> <span class="p">(</span><span class="nx">req</span>: <span class="kt">Request</span><span class="p">,</span> <span class="nx">res</span>: <span class="kt">Response</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">try</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;Deleting contact:&#34;</span><span class="p">,</span> <span class="nx">req</span><span class="p">.</span><span class="nx">params</span><span class="p">.</span><span class="nx">id</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nx">res</span><span class="p">.</span><span class="nx">json</span><span class="p">(</span><span class="k">await</span> <span class="nx">xata</span><span class="p">.</span><span class="nx">db</span><span class="p">.</span><span class="nx">contact</span><span class="p">.</span><span class="k">delete</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">params</span><span class="p">.</span><span class="nx">id</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">e</span>: <span class="kt">any</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">res</span><span class="p">.</span><span class="nx">status</span><span class="p">(</span><span class="mi">500</span><span class="p">).</span><span class="nx">send</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">toString</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">router</span><span class="p">;</span>
</span></span></code></pre></div><p>You should now be able to invoke the below methods.</p>
<ol>
<li>Create a new contact: <code>POST</code>: <code>http://localhost:3000/api/contact</code>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;Jane Doe&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&#34;email&#34;</span><span class="p">:</span> <span class="s2">&#34;jane@doe.com&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></li>
<li>Update a contact: <code>PATCH</code>: <code>http://localhost:3000/api/contact/rec_ceq4gkr6bfqmhh8thsdg</code>, where <code>rec_ceq4gkr6bfqmhh8thsdg</code> is the contact id to update
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;Jane Doe&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&#34;email&#34;</span><span class="p">:</span> <span class="s2">&#34;jane@doe1.com&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></li>
<li>Delete a contact <code>DELETE</code>: <code>http://localhost:3000/api/contact/rec_ceq4gkr6bfqmhh8thsdg</code></li>
</ol>
<p>We are also interested in getting activities for the contact. In other words, we want to get activities for a given contact id.</p>
<p>Add a different route handler in the same <code>contact.ts</code> file at the very end (just before the <code>export</code> statement)-</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// other code
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">router</span><span class="p">.</span><span class="kr">get</span><span class="p">(</span><span class="s2">&#34;/:id/activity&#34;</span><span class="p">,</span> <span class="kr">async</span> <span class="p">(</span><span class="nx">req</span>: <span class="kt">Request</span><span class="p">,</span> <span class="nx">res</span>: <span class="kt">Response</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">try</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">recId</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">params</span><span class="p">.</span><span class="nx">id</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;Trying to query for&#34;</span><span class="p">,</span> <span class="nx">recId</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">recId</span> <span class="o">===</span> <span class="s2">&#34;undefined&#34;</span><span class="p">)</span> <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s2">&#34;Id is undefined&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kd">let</span> <span class="nx">query</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">contact</span><span class="o">:</span> <span class="p">{</span> <span class="nx">id</span>: <span class="kt">recId</span> <span class="p">}</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">rec</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">xata</span><span class="p">.</span><span class="nx">db</span><span class="p">.</span><span class="nx">activity</span><span class="p">.</span><span class="nx">filter</span><span class="p">(</span><span class="nx">query</span><span class="p">).</span><span class="nx">getMany</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">res</span><span class="p">.</span><span class="nx">json</span><span class="p">(</span><span class="nx">rec</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">e</span>: <span class="kt">any</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">res</span><span class="p">.</span><span class="nx">status</span><span class="p">(</span><span class="mi">500</span><span class="p">).</span><span class="nx">send</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">toString</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">router</span><span class="p">;</span>
</span></span></code></pre></div><p>You should now be able to invoke <code>http://localhost:3000/api/contact/rec_cepc3ptvjen51bb31gig/activity</code> to get all activities for the contact id <code>rec_cepc3ptvjen51bb31gig</code>.</p>
<h2 id="5-code-the-activity-route">5. Code the Activity Route</h2>
<p>Add code to handle Activity methods similar to Contact.</p>
<p>Create a new file <code>/services/activity.ts</code> -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">express</span><span class="p">,</span> <span class="p">{</span> <span class="nx">Router</span><span class="p">,</span> <span class="nx">Request</span><span class="p">,</span> <span class="nx">Response</span> <span class="p">}</span> <span class="kr">from</span> <span class="s2">&#34;express&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">XataClient</span> <span class="p">}</span> <span class="kr">from</span> <span class="s2">&#34;../xata&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">dotenv</span> <span class="kr">from</span> <span class="s2">&#34;dotenv&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">dotenv</span><span class="p">.</span><span class="nx">config</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">router</span>: <span class="kt">Router</span> <span class="o">=</span> <span class="nx">express</span><span class="p">.</span><span class="nx">Router</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">xata</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">XataClient</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">router</span><span class="p">.</span><span class="kr">get</span><span class="p">(</span><span class="s2">&#34;/:id&#34;</span><span class="p">,</span> <span class="kr">async</span> <span class="p">(</span><span class="nx">req</span>: <span class="kt">Request</span><span class="p">,</span> <span class="nx">res</span>: <span class="kt">Response</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">try</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">recId</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">params</span><span class="p">.</span><span class="nx">id</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;Trying to query for&#34;</span><span class="p">,</span> <span class="nx">recId</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">recId</span> <span class="o">===</span> <span class="s2">&#34;undefined&#34;</span><span class="p">)</span> <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s2">&#34;Id is undefined&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nx">res</span><span class="p">.</span><span class="nx">json</span><span class="p">(</span><span class="k">await</span> <span class="nx">xata</span><span class="p">.</span><span class="nx">db</span><span class="p">.</span><span class="nx">activity</span><span class="p">.</span><span class="nx">read</span><span class="p">(</span><span class="nx">recId</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">e</span>: <span class="kt">any</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">res</span><span class="p">.</span><span class="nx">status</span><span class="p">(</span><span class="mi">500</span><span class="p">).</span><span class="nx">send</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">toString</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">router</span><span class="p">.</span><span class="nx">post</span><span class="p">(</span><span class="s2">&#34;/&#34;</span><span class="p">,</span> <span class="kr">async</span> <span class="p">(</span><span class="nx">req</span>: <span class="kt">Request</span><span class="p">,</span> <span class="nx">res</span>: <span class="kt">Response</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">try</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;Creating activity:&#34;</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><span class="line"><span class="cl">    <span class="nx">res</span><span class="p">.</span><span class="nx">json</span><span class="p">(</span><span class="k">await</span> <span class="nx">xata</span><span class="p">.</span><span class="nx">db</span><span class="p">.</span><span class="nx">activity</span><span class="p">.</span><span class="nx">create</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><span class="line"><span class="cl">  <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">e</span>: <span class="kt">any</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">res</span><span class="p">.</span><span class="nx">status</span><span class="p">(</span><span class="mi">500</span><span class="p">).</span><span class="nx">send</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">toString</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">router</span><span class="p">.</span><span class="nx">patch</span><span class="p">(</span><span class="s2">&#34;/:id&#34;</span><span class="p">,</span> <span class="kr">async</span> <span class="p">(</span><span class="nx">req</span>: <span class="kt">Request</span><span class="p">,</span> <span class="nx">res</span>: <span class="kt">Response</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">try</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;Updating activity:&#34;</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><span class="line"><span class="cl">    <span class="nx">res</span><span class="p">.</span><span class="nx">json</span><span class="p">(</span><span class="k">await</span> <span class="nx">xata</span><span class="p">.</span><span class="nx">db</span><span class="p">.</span><span class="nx">activity</span><span class="p">.</span><span class="nx">update</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">params</span><span class="p">.</span><span class="nx">id</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><span class="line"><span class="cl">  <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">e</span>: <span class="kt">any</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">res</span><span class="p">.</span><span class="nx">status</span><span class="p">(</span><span class="mi">500</span><span class="p">).</span><span class="nx">send</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">toString</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">router</span><span class="p">.</span><span class="k">delete</span><span class="p">(</span><span class="s2">&#34;/:id&#34;</span><span class="p">,</span> <span class="kr">async</span> <span class="p">(</span><span class="nx">req</span>: <span class="kt">Request</span><span class="p">,</span> <span class="nx">res</span>: <span class="kt">Response</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">try</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;Deleting activity:&#34;</span><span class="p">,</span> <span class="nx">req</span><span class="p">.</span><span class="nx">params</span><span class="p">.</span><span class="nx">id</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nx">res</span><span class="p">.</span><span class="nx">json</span><span class="p">(</span><span class="k">await</span> <span class="nx">xata</span><span class="p">.</span><span class="nx">db</span><span class="p">.</span><span class="nx">activity</span><span class="p">.</span><span class="k">delete</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">params</span><span class="p">.</span><span class="nx">id</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">e</span>: <span class="kt">any</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">res</span><span class="p">.</span><span class="nx">status</span><span class="p">(</span><span class="mi">500</span><span class="p">).</span><span class="nx">send</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">toString</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">router</span><span class="p">;</span>
</span></span></code></pre></div><p>Add pointer to this handler in <code>index.ts</code> -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="cl"><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="s2">&#34;/api/activity/&#34;</span><span class="p">,</span> <span class="nx">activity</span><span class="p">);</span>
</span></span></code></pre></div><p>You should now be able to invoke activity methods as easily -</p>
<ol>
<li><code>POST</code>: <code>http://localhost:3000/api/activity</code></li>
<li><code>PATCH</code>: <code>http://localhost:3000/api/activity/some_activity_id</code></li>
<li><code>DELETE</code>: <code>http://localhost:3000/api/activity/some_activity_id</code></li>
</ol>
<h2 id="6-conclusion">6. Conclusion</h2>
<p>Congratulations, you have built your own CRM app that can track contacts and activities.
Find the complete code on this <a href="https://github.com/prashanth1k/crm-express-xata">Github repository</a>.</p>
<p>In summary, you have seen how simple it is to use Xata in Express.</p>
<p>You can further explore -</p>
<ul>
<li>Xata support to apply changes and learn how DB changes can tag along the branches - <a href="https://xata.io/docs/api-reference/dbs/db_name#list-branches">https://xata.io/docs/api-reference/dbs/db_name#list-branches</a></li>
<li>Import CSV file to your DB with CLI - <a href="https://xata.io/docs/cli/import-data">https://xata.io/docs/cli/import-data</a></li>
<li>Adding basic auth - <a href="https://xata.io/docs/quickstart/adding-basic-auth-with-xata">https://xata.io/docs/quickstart/adding-basic-auth-with-xata</a></li>
</ul>
<p>Overall Xata, while quite new, has a few positives going for it -</p>
<ul>
<li>Easy to use ORM experience, similar to that in Prisma</li>
<li>Easy to use, but powerful search &amp; analytics features</li>
<li>Combines the power of PostgreSQL (which is the DB backend for Xata) with Elastic search for proven search functions. See <a href="https://xata.io/docs/intro/how-it-works">https://xata.io/docs/intro/how-it-works</a></li>
<li>Cool branching &amp; migration features</li>
</ul>
<p>Be prepared for a few downsides -</p>
<ul>
<li>Lack of help in the wild</li>
<li>While the documentation is decent, has limited examples. I don&rsquo;t see the current documentation structure to be intuitive, but that may be just me</li>
<li>Not fully tested in real-world</li>
</ul>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
