<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shannon W</title>
    <description>The latest articles on DEV Community by Shannon W (@shannonw).</description>
    <link>https://dev.to/shannonw</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F206997%2F36ac80f9-a75c-4569-8c71-a55692d14765.png</url>
      <title>DEV Community: Shannon W</title>
      <link>https://dev.to/shannonw</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shannonw"/>
    <language>en</language>
    <item>
      <title>Setting Up a GraphQL API With Strapi</title>
      <dc:creator>Shannon W</dc:creator>
      <pubDate>Wed, 08 Jan 2020 02:06:00 +0000</pubDate>
      <link>https://dev.to/shannonw/setting-up-a-graphql-api-with-strapi-3hk1</link>
      <guid>https://dev.to/shannonw/setting-up-a-graphql-api-with-strapi-3hk1</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;a href="https://shannonwilliams.io/setting-up-graphql-api-with-strapi/" rel="noopener noreferrer"&gt;Original post from series "Building an App with Gatsby and Strapi"&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who is this post for?&lt;/strong&gt; Each post in the series is loosely dependent on each other. So you can follow any post in any order you like. Posts were made this way so you don’t have to read all the previous ones to follow along.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The goal of this post&lt;/strong&gt; is to explore Strapi’s GraphQL API in regards to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;setting up the API,&lt;/li&gt;
&lt;li&gt;setting up API permissions,&lt;/li&gt;
&lt;li&gt;documenting and testing API endpoints.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setting Up
&lt;/h2&gt;

&lt;p&gt;To begin, you will need to install the GraphQL plugin from the Marketplace.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiy8iglom2s2jxq4l355d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiy8iglom2s2jxq4l355d.png" alt="Alt Text" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once installation is finished, restart Strapi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up API Permissions
&lt;/h2&gt;

&lt;p&gt;Similar to setting up the REST API, we will need to define who has permission and to what actions. For example, let’s look at the Page content type and give the Public role permission to call &lt;code&gt;count&lt;/code&gt;, &lt;code&gt;find&lt;/code&gt;, and &lt;code&gt;findone&lt;/code&gt; actions (actions are simply the functions used by the controller to perform business logic).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1 – Ensure the content type is defined as needed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk902xgcprrux7wpsggpr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk902xgcprrux7wpsggpr.png" alt="Alt Text" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2 – Go to Roles &amp;amp; Permissions and select the Public role&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F54hpgfcchba94jiuro8l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F54hpgfcchba94jiuro8l.png" alt="Alt Text" width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3 – Give permission to use the actions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgrk9giby37iy0gwk481v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgrk9giby37iy0gwk481v.png" alt="Alt Text" width="800" height="596"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Documenting and Testing the API
&lt;/h2&gt;

&lt;p&gt;Strapi automatically provides a GraphQL playground at &lt;code&gt;/graphql&lt;/code&gt;. So if you are running Strapi locally, it can be found at &lt;a href="http://localhost:1337/graphql" rel="noopener noreferrer"&gt;http://localhost:1337/graphql&lt;/a&gt;, otherwise, it’ll be located at &lt;code&gt;http://&amp;lt;website-domain&amp;gt;/graphql&lt;/code&gt;. From here you can explore the available schemas, type details, arguments, and test queries using the editor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgdp8pji9xicwyc8aztrl.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgdp8pji9xicwyc8aztrl.gif" alt="Alt Text" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Setting Up a REST API With Strapi</title>
      <dc:creator>Shannon W</dc:creator>
      <pubDate>Sun, 05 Jan 2020 01:37:46 +0000</pubDate>
      <link>https://dev.to/shannonw/setting-up-rest-api-with-strapi-16d6</link>
      <guid>https://dev.to/shannonw/setting-up-rest-api-with-strapi-16d6</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;a href="https://shannonwilliams.io/making-api-calls-to-strapi/" rel="noopener noreferrer"&gt;Original post from series "Building an App with Gatsby and Strapi"&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who is this post for?&lt;/strong&gt; Each post in the series is loosely dependent on each other. So you can follow any post in any order you like. Posts were made this way so you don’t have to read all the previous ones to follow along.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The goal of this post&lt;/strong&gt; is to explore Strapi’s REST API in regards to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;setting up the API,&lt;/li&gt;
&lt;li&gt;setting up API permissions,&lt;/li&gt;
&lt;li&gt;documenting and testing API endpoints.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setting Up
&lt;/h2&gt;

&lt;p&gt;Okay, so far the post is a bit misleading… &lt;strong&gt;Strapi automatically generates content API endpoints for CRUD (create, read, update, delete) operations&lt;/strong&gt; when you create or modify content types 🙂 So we don’t have to worry about this step!&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up API Permissions
&lt;/h2&gt;

&lt;p&gt;Before we can use the generated API, we will need to define who has permission and to what actions. For example, lets look at the Page content type and give the Public role permission to call &lt;code&gt;count&lt;/code&gt;, &lt;code&gt;find&lt;/code&gt;, and &lt;code&gt;findone&lt;/code&gt; actions (actions are simply the functions used by the controller to perform business logic).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1 – Ensure the content type is defined as needed&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk5ory6688nwra64xzwkn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk5ory6688nwra64xzwkn.png" alt="Alt Text" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2 – Go to Roles &amp;amp; Permissions and select the Public role&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx39p01ckw4tn8718v1x1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx39p01ckw4tn8718v1x1.png" alt="Alt Text" width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3 – Give permission to use the actions&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8zgh6ny6po0vdupaqw0q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8zgh6ny6po0vdupaqw0q.png" alt="Alt Text" width="800" height="596"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Documenting and Testing the API
&lt;/h2&gt;

&lt;p&gt;There are multiple ways to test this, but for this post I recommend is using &lt;a href="https://swagger.io/tools/swagger-ui/" rel="noopener noreferrer"&gt;Swagger UI&lt;/a&gt;. It’s a nifty tool that automatically generates documentations for REST APIs. To set up, run the following command in your terminal in the root folder of the strapi instance.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   npm run strapi &lt;span class="nb"&gt;install &lt;/span&gt;documentation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart Strapi. A new UI section is then created to manage the documentation. Here you can access the documentation, test responses, and restrict access to the documentation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7xo0joh4bp2sukrcqcrh.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7xo0joh4bp2sukrcqcrh.gif" alt="Alt Text" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Getting Started With Gatsby and Strapi</title>
      <dc:creator>Shannon W</dc:creator>
      <pubDate>Fri, 03 Jan 2020 01:35:31 +0000</pubDate>
      <link>https://dev.to/shannonw/getting-started-with-gatsby-and-strapi-3b24</link>
      <guid>https://dev.to/shannonw/getting-started-with-gatsby-and-strapi-3b24</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;a href="https://shannonwilliams.io/getting-started-with-gatsby-and-strapi/" rel="noopener noreferrer"&gt;Original post from shannonwilliams.io&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who is this post for?&lt;/strong&gt; Each post in the series is loosely dependent on each other. So you can follow any post in any order you like. Posts were made this way so you don’t have to read all the previous ones to follow along.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The goal of this post&lt;/strong&gt; is to allow anyone to quickly understand how to get up and running with Strapi and Gatsby.  This is for anyone who need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;understand how they work together,&lt;/li&gt;
&lt;li&gt;get a project quickly up and running.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Use Strapi and Gatsby Together ?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is Gatsby?&lt;/strong&gt; Gatsby is a generator framework for building sites built using ReactJs. It has built in client-side routing (react-router), local-state management (Redux), plugins, theming and various other APIs for personalizing the app’s behavior. I recommend checking out there &lt;a href="https://www.gatsbyjs.org/docs/" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt; and &lt;a href="https://www.gatsbyjs.org/features/" rel="noopener noreferrer"&gt;comparison with other frameworks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is Strapi?&lt;/strong&gt; Strapi is an open-source Headless CMS, built on NodeJs, that makes managing content easy. It’s built with developers in mind with things like, automatic creation of REST and GraphQL APIs, admin UI for managing content, authentication, files, and making it easily extensible with plugins and custom controllers and services. I also recommend reading the &lt;a href="https://strapi.io/documentation/3.0.0-beta.x/getting-started/introduction.html" rel="noopener noreferrer"&gt;Strapi official documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How They Work Together?&lt;/strong&gt; Simple, Gatsby will be used for building a web app in React, which will make API calls to Strapi for resources.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Gatsby
&lt;/h2&gt;

&lt;p&gt;If NodeJs and NPM are not downloaded and installed, you can download them here. Follow the installation wizard and you’ll be finished in a few minutes.&lt;/p&gt;

&lt;p&gt;Open a terminal (Mac OS) or command prompt (Windows), and install the Gatsby command line tools (CLI):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; gatsby-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Navigate into your directory of choice&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;cd&lt;/span&gt; &amp;lt;replace-with-desired-directory&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a new site:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   gatsby new &amp;lt;replace-with-site-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Navigate into your site’s folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;cd&lt;/span&gt; &amp;lt;site-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start the site in developer mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   gatsby develop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now within a browser you can enter &lt;code&gt;localhost:8000&lt;/code&gt; (The default port is &lt;code&gt;8000&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Strapi
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;cd&lt;/code&gt; into the directory where you want the Strapi instance to be.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;cd&lt;/span&gt; &amp;lt;replace-with-desired-directory&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;(Option 1) Install and run Strapi – without connecting to database (Use SQLite).&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   npx create-strapi-app &amp;lt;project-name&amp;gt; &lt;span class="nt"&gt;--quickstart&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If successful, Strapi will begin running and you can begin configuring your admin account at &lt;a href="http://localhost:1337/admin" rel="noopener noreferrer"&gt;http://localhost:1337/admin&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;(Option 2) Install and run Strapi – with a database.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   npx create-strapi-app &amp;lt;project-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Follow the in-terminal setup wizard for connecting to your database. Should look similar to this:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe09n86ggdb2fpic4lj4s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe09n86ggdb2fpic4lj4s.png" alt="Alt Text" width="662" height="327"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once installation is finished, &lt;code&gt;cd&lt;/code&gt; into the new directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;cd&lt;/span&gt; &amp;lt;replace-with-desired-directory&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start Strapi in development mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   npm run develop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If successful, Strapi will begin running and you can begin configuring your admin account at &lt;a href="http://localhost:1337/admin" rel="noopener noreferrer"&gt;http://localhost:1337/admin&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;That’s it !&lt;/strong&gt; Now you can begin developing your client app with Gatsby and begin managing content with Strapi.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Full Stack Development vs Headless CMS vs Traditional CMS</title>
      <dc:creator>Shannon W</dc:creator>
      <pubDate>Sun, 29 Dec 2019 22:13:47 +0000</pubDate>
      <link>https://dev.to/shannonw/full-stack-development-vs-headless-cms-vs-traditional-cms-4b8p</link>
      <guid>https://dev.to/shannonw/full-stack-development-vs-headless-cms-vs-traditional-cms-4b8p</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;a href="https://shannonwilliams.io/full-stack-development-vs-headless-cms-vs-traditional-cms/" rel="noopener noreferrer"&gt;Original Post&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which one is better?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Like most of us, I like to spend my time finding ways to improve development time while still producing high-quality apps. Lately, there have been increasing interest and popularity in using a Headless CMS. But how does it differ and what are the benefits from traditional development and a Traditional CMS solution?&lt;/p&gt;

&lt;p&gt;Hopefully this post shed some light and serve as a guide for your next project :)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Tip – There’s a TL;DR; at the end of this post)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To get a more detailed understanding, we should look common pieces in detail using actual examples such as .NET Core based stack, Strapi (Headless CMS), and WordPress (Traditional CMS):&lt;/p&gt;

&lt;p&gt;So What’s a Headless CMS? In general, a Headless CMS is a management solution that is designed and built for simply managing the structure and access of content for multiple apps. Compared to a Traditional CMS, it’s a Headless CMS + front end management.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So how much development work are we looking at?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What percentage developers have to build/focus on typically look something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fisfum2afnaao6zqkuwy3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fisfum2afnaao6zqkuwy3.png" alt="Developer Areas of Focus Matrix" width="564" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  UI
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;.NET Core:&lt;/strong&gt; Whatever UI framework preferred.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strapi:&lt;/strong&gt; Whatever UI framework preferred.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WordPress:&lt;/strong&gt; You can use the inbuilt UI management tools for theming, and configuring the layout of pages and posts for a website. Alternatively, it has a REST API for retrieving posts, pages, categories, tags, etc. with your preferred UI framework. The only caveat is that the API only returns content in HTML. So you need to consider that for front-facing web, mobile, and desktop apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Content Management
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;.NET Core:&lt;/strong&gt; Unless you build a solution, you will have to define entities/objects/content types by defining classes and relations and integrating a data access technology like Entity Framework Core.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strapi:&lt;/strong&gt; Admin screen for defining entities/objects/content types and relations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WordPress:&lt;/strong&gt; Supports making pages, posts, categories, tags, by default. You will have to get a plugin or make your own for any additional content types.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;.NET Core:&lt;/strong&gt; You have to build unit tests and integration tests using xUnit or MSTest for APIs and any other server-side code you want to be tested. You are also free to use any client-side/UI testing tools according to what languages you’re using.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strapi:&lt;/strong&gt; No need for creating tests for server-side code. At most, you may want to manually double-check definition of content types, data stored, and roles and permissions just to be sure. You still need to focus on UI tests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WordPress:&lt;/strong&gt; You’ll have to focus on testing plugins to make sure updates don’t break anything. Helpers like PHPUnit and WP-CLI comes in handy.&lt;/p&gt;

&lt;h2&gt;
  
  
  APIs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;.NET Core:&lt;/strong&gt; Will have to architect and program REST or GraphQL API using data access technology like Entity Framework Core for connecting to a database, along with defining entities/objects/content types using classes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strapi:&lt;/strong&gt; Platform automatically creates a REST and GraphQL API once you create content types using the admin UI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WordPress:&lt;/strong&gt; Automatically has a REST API to retrieve content. If needed you can extend the API endpoints.&lt;/p&gt;

&lt;h2&gt;
  
  
  Roles and Permissions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;.NET Core:&lt;/strong&gt; Typically you would use a library like Identity Services for SSO and regular user authentication (email and password). Then you will have to include authentication &amp;amp; custom permission checks on each request to a content resource.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strapi:&lt;/strong&gt; Admin UI section for managing roles and permissions with interactive with different content types.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WordPress:&lt;/strong&gt; Typically only provides the below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Subscribers can read comments/comment/receive newsletters, etc. but cannot create regular site content.&lt;/li&gt;
&lt;li&gt;Contributors can write and manage their posts but not publish posts or upload media files.&lt;/li&gt;
&lt;li&gt;Authors can publish and manage their own posts, and are able to upload files.&lt;/li&gt;
&lt;li&gt;Editors can publish posts, manage posts as well as manage other people’s posts, etc.&lt;/li&gt;
&lt;li&gt;Administrators have access to all the administration features.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;– taken from WordPress&lt;/p&gt;

&lt;h2&gt;
  
  
  Database
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;.NET Core:&lt;/strong&gt; Typically a developer would use Migrations if using EF Core and the appropriate data provider library for the respective SQL database. It’s up to developers, or database admin to manage performance at the database level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strapi:&lt;/strong&gt; Upon setting up, you’re given the option to choose which database to use:&lt;/p&gt;

&lt;p&gt;MongoDB &amp;gt;= 3.6&lt;br&gt;
MySQL &amp;gt;= 5.6&lt;br&gt;
MariaDB &amp;gt;= 10.1&lt;br&gt;
PostgreSQL &amp;gt;= 10&lt;br&gt;
SQLite &amp;gt;= 3&lt;br&gt;
It’s up to developers, or database admin to manage performance at the database level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WordPress:&lt;/strong&gt; Limited to only MySQL. It’s up to developers, or database admin to manage performance at the database level or acquire a plugin to help.&lt;/p&gt;

&lt;h2&gt;
  
  
  Email Notifications
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;.NET Core:&lt;/strong&gt; Can implement this via an on-premise mail server, or external service. Can implement this in code base where necessary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strapi:&lt;/strong&gt; Can use the email plugin to trigger sending emails using services like Sendgrid on custom controllers or services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WordPress:&lt;/strong&gt; Chances are you can easily get a free plugin to send emails. All you need to do is to provide mail server settings or external service account info (if using a service like Sendgrid).&lt;/p&gt;

&lt;h2&gt;
  
  
  SMS/MMS Notifications
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;.NET Core:&lt;/strong&gt; Can implement this via external service. Can implement this in the code base where necessary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strapi:&lt;/strong&gt; Based on their documentation, there’s no plugin to send SMS or MMS. However, nothing is preventing you from using a NodeJs SDK to send SMS/MMS notifications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WordPress:&lt;/strong&gt; Again, there’s probably a plugin for this. Otherwise, you’ll have to create one. In both cases, an external SMS/MMS provider account (like Twilio SMS) details are required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Documentation
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;.NET Core:&lt;/strong&gt; You can use Swagger for REST API documentation. There are also various free and paid solutions for providing documentation for both server-side and client-side apps. The choice is yours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strapi:&lt;/strong&gt; It also uses Swagger for Strapi’s REST API documentation. The official documentation also addresses API endpoints that are generated for content types. As with any stack, you will have to find a free or paid solution for documenting any client-side app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WordPress:&lt;/strong&gt; Can find a plugin that uses Swagger to document WordPress’ REST API. The official documentation also addresses API endpoints that are generated for content types. As with any stack, you will have to find a free or paid solution for documenting any client-side app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;.NET Core:&lt;/strong&gt; Depends on the hosting providers’ plans, and fees from 3rd party services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strapi:&lt;/strong&gt; Depends on the hosting providers’ plans, and fees from 3rd party services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WordPress:&lt;/strong&gt; Depends on the hosting providers’ plans, and fees from 3rd party services, and paid plugins.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fixing Bad Code… &amp;gt;_&amp;lt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;.NET Core:&lt;/strong&gt; Can be found within the UI project, API, and perhaps some SQL. Still…. it depends on the situation. A developer may have been working on the codebase before you and may not have done such a great job choosing and sticking with software design patterns…. or requirements have changed which makes the existing code redundant. To make it worse, the codebase might be huuugee! No matter the reason, dealing with bad code sucks most of the time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strapi:&lt;/strong&gt; You may find bad code within a custom controller, services, plugins, and within the UI project’s codebase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WordPress:&lt;/strong&gt; Can be found within plugins and event custom Js snippets for posts or pages.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR;
&lt;/h2&gt;

&lt;p&gt;The truth is, it depends on the requirements for the app and the vision. If you just want a blog, WordPress is the way to go. But if you want a solution for managing content for various apps, blogging, and other various things, a headless CMS or full-stack development could be feasible.&lt;/p&gt;

&lt;p&gt;You see or feel something should be updated? Please reach out and let me know! It’ll be awesome to hear your feedback on this.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>codenewbie</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Choosing a Programming Stack</title>
      <dc:creator>Shannon W</dc:creator>
      <pubDate>Sat, 28 Dec 2019 16:05:54 +0000</pubDate>
      <link>https://dev.to/shannonw/choosing-a-programming-stack-3h9n</link>
      <guid>https://dev.to/shannonw/choosing-a-programming-stack-3h9n</guid>
      <description>&lt;p&gt;Picking the right development stack for a project can be difficult, especially if you are learning as you go. Lately, I have been playing with a few Headless CMS. Sadly, I find some didn’t quite cut it. Realizing this inspired me to write this post. Whether you working on a new innovative project as a freelancer, in-house developer, or just for fun, below are factors to consider.&lt;/p&gt;

&lt;h2&gt;
  
  
  Knowing The End Goal
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Start off by understanding a high-level overview of the main successful user flow&lt;/strong&gt;. Easy enough. Afterward, go into more details as to the workflow, but not too low where you begin speaking about UI designs. That’ll be a limiter throughout development.&lt;/p&gt;

&lt;p&gt;Then you will have to pry deeper to &lt;strong&gt;foresee points of failure and establish a correction workflow&lt;/strong&gt; for them. Correction workflows are basic steps of the user (or app) that will take if something goes wrong and how it’ll be rectified. Keep in mind that you may need to also do correction workflows for your correction workflows… Going through workflows with a client will help him/her to understand the complexity of work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Establish deadlines and budget you have&lt;/strong&gt;. If these aren’t established before development, then later down, “something” can happen and may force you to take shortcuts. This can be good or bad depending on how it’s handled. As for deadlines, you may set weekly, bi-weekly, or monthly milestones. Either case, a good understanding of the technology stack being used is needed to balance user deadlines and how long it’ll take to build features. With that said, you may have to come back to this step after addressing the below factors.&lt;/p&gt;

&lt;p&gt;Documenting these will help keep development on track and to provide a clear picture of where you are and where you need to be.&lt;/p&gt;

&lt;h2&gt;
  
  
  Development &amp;amp; Maintenance
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Cost&lt;/strong&gt;, cost, cost, cost… In the end, if not enough money is there, then a number of things can easily fall apart. You’ve got to support yourself and your family, your client needs the money to survive, support the application’s infrastructure maintenance costs, fund future development, etc.. At least a cost-benefit analysis should be done.&lt;/p&gt;

&lt;p&gt;No matter the environment, &lt;strong&gt;there must be an efficient way to debug and reproduce bugs&lt;/strong&gt; as they happen. Not saying you are a bad programmer! But they will happen, and if you aren’t able to fix the issue in a timely manner, then fingers are typically pointed to developers. While the blame game works itself out, you can focus on being the hero and fix the bug.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can’t forget about security!&lt;/strong&gt; By default, all modern applications need to be built in a way that does NOT prone to vulnerabilities listed in &lt;a href="https://www.owasp.org/images/7/72/OWASP_Top_10-2017_%28en%29.pdf.pdf" rel="noopener noreferrer"&gt;OWASP Top Ten&lt;/a&gt;. To the very least, your tech stack needs to be able to defend against them. Otherwise, the technology is not mature yet, or you just haven’t found a way yet. Keep in mind that you should not ignore the 3rd party libraries/packages being used!&lt;/p&gt;

&lt;p&gt;What does development look like? This is up to you. Loosely typed languages like NodeJs are fun for small projects. The trouble, however, creeps in as the code base grows larger over time. Type checking, IntelliSense tools, etc. are not as helpful as for strongly typed languages like C#. Therefore, it takes longer to debug. If this is the case for you, then you should use a different language or just allocate more time within estimates for debugging. Again, you also have to consider what working with 3rd party tools will be like. To see a few more factors to consider, &lt;a href="https://shannonwilliams.io/why-i-and-you-shouldnt-just-use-any-popular-library-out-there/" rel="noopener noreferrer"&gt;read this quick post&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One language or framework may not always be best for the project&lt;/strong&gt;, multiple may be needed. After looking at the trade-offs you may decide that using DotnetCore would be best for building an API and Python for web scraping jobs. The only downside is that you will have to manage runtime environments, SDKs packages, etc. for both in development and production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Must have strong documentation and support&lt;/strong&gt;. One of the biggest traps developers fall into is believing that new and trending tools are the best! By nature, it seems developers are early adopters of tech, so it makes sense. Yes, new tools are “suppose” to be better than older tools, but it’s crucial not to overlook the need for strong documentation and community support. The documentation has to be very detailed and must address all components on how they work, integrate with other components, along with best practices. When documentation fails, community support should be the next place for help. If you see a lack of information or poor support (Red Flag!), then chances are you may have to get a specialist for your project or what you want to achieve is not possible. This applies to libraries and packages (core and 3rd party).&lt;/p&gt;

&lt;p&gt;Lifetime support is ongoing and consistent. It doesn’t make sense to use SDKs, run time environments that are no longer being supported in the near future, right?&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Know exactly what you want to achieve for your project:

&lt;ul&gt;
&lt;li&gt;Establish timelines and budgets before development begins.&lt;/li&gt;
&lt;li&gt;Main successful workflow established.&lt;/li&gt;
&lt;li&gt;Corrective workflows should something go wrong.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Development and Maintenance:

&lt;ul&gt;
&lt;li&gt;Keep costs within budget.&lt;/li&gt;
&lt;li&gt;Be able to debug and reproduce bugs, especially ones found in production.&lt;/li&gt;
&lt;li&gt;Make sure the tech stack is safe against OWASP Top Ten vulnerabilities &amp;amp; can deliver according to deadlines.&lt;/li&gt;
&lt;li&gt;Strong documentation and support exist.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This best solution is not black and white, there will be some gray areas, but the best we can do is to minimize this area by looking at different trade-offs.&lt;/p&gt;

</description>
      <category>productivity</category>
    </item>
    <item>
      <title>Why I (And You) Should’nt Just Use Any [Popular] Library</title>
      <dc:creator>Shannon W</dc:creator>
      <pubDate>Sat, 28 Dec 2019 15:56:04 +0000</pubDate>
      <link>https://dev.to/shannonw/why-i-and-you-should-nt-just-use-any-popular-library-out-there-53pi</link>
      <guid>https://dev.to/shannonw/why-i-and-you-should-nt-just-use-any-popular-library-out-there-53pi</guid>
      <description>&lt;p&gt;Yes – even if it was made or supported by Google, Microsoft, or Facebook. I know I’m not the only one who encounters situations where you’re excited about working with a new tool, but it turns out it becomes an obstacle.&lt;/p&gt;

&lt;p&gt;The main reasons for this are just from logical reasoning, and my experience exploring different libraries for small projects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Security flaws&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This is my main concern with working with anything open source. To be quite frank, the majority of my encounters with security vulnerabilities have been with npm modules.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Library or Module Support&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It’s open source. Unless the maintainers are VERY passionate about keeping it up to date, continuous with 1-4 week periodic updates, good documentation, issue support, or they’re getting paid (mostly the latter), then chances are it’s going to be short-lived or you’ll mostly be on your own to fix any issues.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Poor Programming/Implementation&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modules/Tools/Libraries may get the job done, but the way it has been implemented is something every programmer should be aware of. Otherwise, realistically, how do we know the implications using a module will have on the project (good or bad)? Whether it’s in regards to performance, security, or usability.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Honestly, I developed this realization mindset in my last semester at University. What is more interesting, is how my mindset developed since my decision to pursue software development as a career.&lt;/p&gt;

&lt;h2&gt;
  
  
  (2013) First Year of College – Second Semester – Programming 1 (Java)
&lt;/h2&gt;

&lt;p&gt;Fell in love at first ‘Hello World!’. Afterward, I wanted to quickly develop my skills to get a job locally here in Cayman (Quite frankly, there’s little to no entry-level positions here for software developers). So I began searching the web for java development jobs and used the required Java-related technologies and skills advertised to guide what I’d learn next.&lt;/p&gt;

&lt;p&gt;I swore on my pride as a young programmer that Java was life and no other languages were better (oh how that changed right after Programming 2 – C++).&lt;/p&gt;

&lt;h2&gt;
  
  
  (2018) Last Year of College – Last Semester – Course Projects &amp;amp; 2 Internships Later
&lt;/h2&gt;

&lt;p&gt;Having gained more experience and confidence in my work, I had a slight preference for programming tools. I loved the concept of having open-source frameworks and even ecosystems! Having the flexibility to accomplish anything, and keeping a low budget sounds wonderful to me. However, my over-thinking self couldn’t help but doubt how secure, performant, and easy (or difficult) to work with the tools would be.&lt;/p&gt;

&lt;p&gt;At this time, I was more knowledgeable to look at the source code, README.md files, documentation, etc., to learn more about these tools. Yet, still, a bit overwhelmed by the amount of content to learn, sometimes I just couldn’t even bother! I just wanted to get the products built and functional, regardless of how it was done.&lt;/p&gt;

&lt;h2&gt;
  
  
  (January 2019 – Now) Working as a Full-Time Junior Software Developer – &lt;a href="https://www.walkersglobal.com/" rel="noopener noreferrer"&gt;Walkers&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Having to work full time, and messing with various small projects, I’ve had nothing but constant failure after failure trying to work with open source tools claiming to be ‘easy to use’, and to ‘take care of the mundane yet mandatory functionality’ within code. Some failures were due to lack of product support, poor documentation, or inability (or in some cases very difficult) to integrate with the current stack to satisfy requirements. Talk about stress! Even some of these tools were made or supported by the big tech companies like Facebook, Microsoft, and Google. Maybe it was me just not doing proper background checks in incorporating certain tools? Either way, my whole mindset of using tools has changed to what it is now.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;I didn’t know much about programming concepts and different development ecosystems as I do now. It was not until I had some experience working with various technologies like Reactjs React-Native, ASP.NET, WebApi (.NET Core), Vuejs, NativeScript, etc. and working from small to medium/large projects with a team, that I realized how hyped up a lot of things are! What I can say, is that before incorporating any new tool/module/library, I usually test the tool in a sandbox environment or a small application to see its pros and cons before using in a big project (as should you also). Yes, this is going to require more work and diligence, but it’ll be worth it in the end. Personally, I’ve made a personal promise to ensure my clients get the best service or product from me, so making this extra effort is an obligation by default.&lt;/p&gt;

&lt;p&gt;Want to add in a few additional thoughts to this? Then leave a comment below! I’d love to hear your thoughts on this!&lt;/p&gt;

</description>
      <category>productivity</category>
    </item>
  </channel>
</rss>
