<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Alexander V. Ruptsov - SashiDo.io | API Development, Deployment and Scaling made simple.]]></title><description><![CDATA[SashiDo.io is a serverless API development platform with scalable json rest and graphql apis, headless cms, built with nodejs, mongodb, parse server, kubernetes and docker.]]></description><link>https://blog.sashido.io/</link><image><url>https://blog.sashido.io/favicon.png</url><title>Alexander V. Ruptsov - SashiDo.io | API Development, Deployment and Scaling made simple.</title><link>https://blog.sashido.io/</link></image><generator>Ghost 1.20</generator><lastBuildDate>Wed, 27 May 2026 22:09:09 GMT</lastBuildDate><atom:link href="https://blog.sashido.io/author/alexander/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[How to handle WebHooks with Parse Server]]></title><description><![CDATA[<div class="kg-card-markdown"><h2 id="contentlist">Content List</h2>
<ul>
<li><a href="#handlingincomingwebhooks">Handling Incoming Webhooks</a>
<ul>
<li><a href="#buildingyourwebhookhandler">Building your Webhook Handler</a></li>
<li><a href="#extractinginformationfromtherequestbody">Extracting information from the Request Body</a></li>
</ul>
</li>
<li><a href="#examplewebhookhandlerwithslack">Example Webhook Handler with Slack</a>
<ul>
<li><a href="#1settingupyoursashidoapp">Setting up your SashiDo app</a></li>
<li><a href="#2cloudcode">Cloud Code</a></li>
<li><a href="#3settingupslack">Setting up Slack</a></li>
<li><a href="#4letstestitout">Lets try it out!</a></li>
</ul>
</li>
<li><a href="#otherusecasesandscenarios">Other UseCases and Scenarios</a></li>
<li><a href="#usefullinks">Useful Links</a></li>
</ul>
<h2 id="introduction">Introduction</h2>
<p>Have you ever wanted to integrate a 3rd Party</p></div>]]></description><link>https://blog.sashido.io/how-to-handle-webhooks-with-parse-server/</link><guid isPermaLink="false">5b531accbc278c0015f8027a</guid><category><![CDATA[webhooks]]></category><category><![CDATA[webhook handler]]></category><category><![CDATA[3rd party]]></category><category><![CDATA[advanced cloud code]]></category><category><![CDATA[Cloud Code]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Alexander V. Ruptsov]]></dc:creator><pubDate>Wed, 25 Jul 2018 12:00:00 GMT</pubDate><media:content url="https://media-blog.sashido.io/content/images/2018/07/web-hooks.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><h2 id="contentlist">Content List</h2>
<ul>
<li><a href="#handlingincomingwebhooks">Handling Incoming Webhooks</a>
<ul>
<li><a href="#buildingyourwebhookhandler">Building your Webhook Handler</a></li>
<li><a href="#extractinginformationfromtherequestbody">Extracting information from the Request Body</a></li>
</ul>
</li>
<li><a href="#examplewebhookhandlerwithslack">Example Webhook Handler with Slack</a>
<ul>
<li><a href="#1settingupyoursashidoapp">Setting up your SashiDo app</a></li>
<li><a href="#2cloudcode">Cloud Code</a></li>
<li><a href="#3settingupslack">Setting up Slack</a></li>
<li><a href="#4letstestitout">Lets try it out!</a></li>
</ul>
</li>
<li><a href="#otherusecasesandscenarios">Other UseCases and Scenarios</a></li>
<li><a href="#usefullinks">Useful Links</a></li>
</ul>
<h2 id="introduction">Introduction</h2>
<img src="https://media-blog.sashido.io/content/images/2018/07/web-hooks.png" alt="How to handle WebHooks with Parse Server"><p>Have you ever wanted to integrate a 3rd Party Client with your SashiDo applications? I suppose you have, and there's an awesome feature called <strong>WebHooks</strong> which help you do just that. In simple terms, a WebHook allows any 3rd Party Client, that supports Webhooks, communicate and send information (Payload) to your Parse Server instance and vice-versa.</p>
<p>If you want to get more familiar on how to send WebHooks from your SashiDo application to 3rd Party services, check our article on <a href="https://blog.sashido.io/how-to-set-up-webhooks-on-sashido/">How to set up WebHooks on SashiDo</a> or watch out <a href="https://www.youtube.com/watch?v=igGsAad6fn0&amp;index=8&amp;list=PLk66IKYX7bjrBKSNwNZVpTjVswA0oq5dr">YouTube Video Tutorial</a>.</p>
<p>Sending your own WebHooks is one thing, but let's say you want to <strong>Handle</strong> a WebHook sent from a 3rd Party Client, do something with the information, and respond back. Such WebHooks are also called <strong>Incoming WebHooks</strong> and the only thing you need to set up is a simple <strong>WebHook Handler</strong>.</p>
<h2 id="handlingincomingwebhooks">Handling Incoming WebHooks</h2>
<p>Handling an Incoming WebHook is a really easy task! An Incoming WebHook is just an HTTP <strong>GET</strong> or <strong>POST</strong> request that sends some information to your Parse Server.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/07/1_smLrriyaHX1vEzVTtNZU2A.png" alt="How to handle WebHooks with Parse Server"></p>
<p>As you may already know, every time you create an application with SashiDo, we automatically give you a <strong>Free Private</strong> GitHub Repository for it. In order for you to process the WebHook from your Parse Server, all you need to do is implement a <strong>Express</strong> route handler within your <strong>app.js</strong> file. That’s called <strong>Advanced Cloud Code</strong> and we’ve made an article about it. You can check the <a href="#useful-links-videos">Useful Links</a> section for a direct link to the article.<br>
The <strong>app.js</strong> file is located in your application's GitHub Repository, in the <strong>cloud</strong> folder.<br>
So let's get straight to the point!</p>
<h3 id="buildingyourwebhookhandler">Building your WebHook Handler</h3>
<p>Let's first navigate to the <strong>app.js</strong> file. Navigate to <strong>Dashboard -&gt; your app -&gt; Core -&gt; Cloud Code</strong> and click on the blue button <strong>Manage on GitHub</strong> in the upper right corner.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/07/cloudCodeNew.jpg" alt="How to handle WebHooks with Parse Server"></p>
<p>When you're in your repository, open the <strong>Cloud</strong> folder and you'll find the file <strong>app.js</strong>.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/07/cloudFolder.gif" alt="How to handle WebHooks with Parse Server"></p>
<p>Now it's time to write the Express route handler.</p>
<pre><code class="language-javascript">   app.post('/webhookHandler', function(request, response) {
    console.info('Received!'); // Log every time a WebHook is handled.

    // Execute any logic that you want when the 3rd Party Client hits that endpoint

    response.status(200); // Let the sender know that we've received the WebHook
    response.send();
});

</code></pre>
<p>Afterwards, you can access the handler by adding <strong>/webhookHandler</strong> to the end of your <strong>Server URL</strong>. The <strong>Server URL</strong> is just the <strong>API URL Address</strong> without the <strong>/1/</strong>. You can find it in <strong>Dashboard -&gt; Your App -&gt; App Settings -&gt; Security &amp; Keys</strong>. It should look something like this <code>https://pg-app-sd5ez1yjgta5vksvux7wdfjwiykcpt.scalabl.cloud/webhookHandler</code></p>
<p>Yes, it's that simple!</p>
<p>Let's break this down a bit. First, we define the <strong>app.post</strong> route handler with an endpoint <strong>/webhookHandler</strong>. You can name the endpoint whatever you want, but for the sake of simplicity, we call it like that.</p>
<p>After that, we can simply put <strong>console.info(‘Received!’)</strong> so we can track when we've received WebHooks through our <strong>Logs</strong> section in the <strong>Dashboard</strong>.</p>
<p><strong>ProTip:</strong> It's good practice to handle the WebHook quickly, as most services require you to respond in a few seconds, otherwise, you'll get a <strong>Timeout error</strong>. If you just need to execute some custom logic of yours after receiving a WebHook, without responding to it, a simple <code>response.status(200)</code> and <code>response.send()</code> would do just fine to tell the service that you’ve received the WebHook. If you need to respond to the Webhook then you should always check the Docs of the 3rd Party Service so you know in what time interval you need to respond and in what format. Some services may have a <code>responseURL</code> attached with the Payload. You can use it if you need to send information back to the 3rd Party Service after some time.</p>
<p>You may also find the <a href="http://devdocs.io/express/">Express Docs</a> useful so check them out too if you’d like. You can also check the Express <a href="http://devdocs.io/express-request/">Request</a>/<a href="http://devdocs.io/express-response/">Response</a> references.</p>
<p>That's about it. Now you can execute any logic that you want when you receive the WebHook! All good, but let's say you want to extract the payload and do something according to it.</p>
<h3 id="extractinginformationfromtherequestbody">Extracting information from the Request Body</h3>
<p>Extracting information from the request is pretty easy too. We can use the Express <strong>Body Parser</strong> for that.</p>
<p>Include it at the beginning of your <strong>app.js</strong> file like this:</p>
<pre><code class="language-javascript">const bodyParser = require('body-parser');

app.use(
    bodyParser.urlencoded({
        extended: true
    })
);

app.use(bodyParser.json()); // If you are processing a JSON formatted Content-Type

</code></pre>
<p>After you define the Body Parser you can use it to convert the information to something readable and then use it in some way.</p>
<p>Most 3rd Party Services provide you with unique <strong>Verification Token</strong>. When they send you a WebHook, they also include the <strong>Verification Token</strong> in the payload. That way, you can make sure that the WebHook is coming from the desired 3rd Party Client by comparing your <strong>Verification Token</strong> with the one sent with the WebHook payload like this:</p>
<pre><code class="language-javascript">app.post('/webhookHandler', function(request, response) {
    var payload = JSON.parse(request.body.payload);
    if (payload.verificationToken !== 'your_verification_token') {
        response.status(403).end('Access forbidden');
    }
    ...
});

</code></pre>
<p>You should note that every 3rd Party Client may send different information and with Content-Type, so always be sure to check what payload is sent through the WebHook so you know exactly how to process the information.</p>
<p>If you want to learn more about the <strong>body parser</strong>, check out the <a href="https://www.npmjs.com/package/body-parser#api">body-parser npm package</a>. It’s already installed so you don’t have to do it.</p>
<p>Here’s how your <strong>app.js</strong> file would look like if you followed the steps:</p>
<pre><code class="language-javascript">/*
 * Advanced Cloud Code Example
 */
const express = require('express');
const app = express();
const bodyParser = require('body-parser');

app.use(
    bodyParser.urlencoded({
        extended: true
    })
);

app.post('/webhookHandler', function(request, response) {
    var payload = JSON.parse(request.body.payload);
    if (payload.verificationToken !== 'your_verification_token') {
        response.status(403).end('Access forbidden');
    } else {
        response.status(200);
        response.send();
    }
});

/*
 * Exporting of module.exports.app is required.
 * we mount it automatically to the Parse Server Deployment.
 */

module.exports = app;

</code></pre>
<h2 id="examplewebhookhandlerwithslack">Example WebHook Handler with Slack</h2>
<p>It's time to put everything from above into a good example, in this case, with <strong>Slack</strong>.</p>
<p>As you may already know, Slack is one of the most used chat platforms by developers. But did you know that you can integrate it with your SashiDo application? For example, let us say that you want to have a <a href="https://api.slack.com/slash-commands"><strong>Slash Command</strong></a> that will list all unbilled users of your application and another <strong>Slash Command</strong> which will try to bill them. Well, the good news is that this can be done pretty easily using Slack apps and WebHooks!</p>
<h3 id="1settingupyoursashidoapp">1. Setting up your SashiDo app</h3>
<ol>
<li>Navigate to <strong>Dashboard -&gt; Your App -&gt; Core -&gt; Browser -&gt; <em>User</em> Class</strong>.</li>
<li>Create a new column of type <strong>boolean</strong> and name it <strong>billed</strong>.</li>
<li>If you don't have any entries in the <strong>User</strong> class, add some users and set the <strong>billed</strong> field of some of them to <strong>false</strong>
<ul>
<li>Easiest and fastest way to add new entries in your <strong>User</strong> class is to go to <strong>Dashboard -&gt; Your App -&gt; Core -&gt; API Console</strong>.</li>
<li>For <strong>Request Type</strong> choose <strong>POST</strong>, be sure to check the <strong>Use MasterKey</strong> toggle to be <strong>true</strong>.</li>
<li>Set the endpoint to <strong>classes/_User</strong>.</li>
<li>In <strong>Query Parameters</strong> type <strong>{&quot;username&quot;:&quot;someUsername&quot;,&quot;password&quot;:&quot;somePassword&quot;,&quot;billed&quot;: false}</strong> and hit <strong>Send Query</strong>.</li>
</ul>
</li>
</ol>
<p><img src="https://media-blog.sashido.io/content/images/2018/07/createUser.gif" alt="How to handle WebHooks with Parse Server"></p>
<h3 id="2cloudcode">2. Cloud Code</h3>
<p>For this example, we’ve implement 2 <strong>Slash Commands</strong>:</p>
<ul>
<li><strong>/unbilled</strong> - Will retreive all unbilled users.</li>
<li><strong>/bill</strong> - Tries to bill all the unbilled users.</li>
</ul>
<p>For each of the two, we’ve created a separate WebHook handler which we've included in a separate file. We've provided a direct link to it at the end of this section.</p>
<p>Now let’s see how the handler for the <strong>/bill</strong> command works. First, we define the <strong>route handler</strong> with an endpoint of <strong>/billUser</strong>.</p>
<pre><code class="language-javascript">app.post('/billUser', async (req, res) =&gt; {});
</code></pre>
<p>After that, we execute our custom logic to try and bill our users:</p>
<pre><code class="language-javascript">app.post('/billUser', async (req, res) =&gt; {
    // Find all unbilled users
    const unbilled = await new Parse.Query(Parse.User)
        .equalTo('billed', false)
        .find();

    // Iterate through all the user objects
    for (let user of unbilled) {
        await user.save({ billed: true }, { useMasterKey: true });
    }

    // When it's done, we send back a response to Slack
    res.send({ text: `${unbilled.length} users successfully billed!` });
});

</code></pre>
<p>For the sake of simplicity, we've modified the code so it's short and readable. If you want to check the full code, which includes error handling and the <strong>/unbilled Slash Command Handler</strong>, you can check the <strong>app.js</strong> file in our <a href="https://gist.github.com/AlexRuptsov/641f390d1b7da19519ac2d3d837222f5">Demo app.js Example Code</a> file. If you want you can even copy-paste the code in your <strong>app.js</strong> file.</p>
<h3 id="3settingupslack">3. Setting up Slack</h3>
<ol>
<li>Go to <a href="https://slack.com/create#email"><strong>Slack</strong></a> and create your own Workspace.</li>
<li>After that, create a new <a href="https://api.slack.com/apps?new_app=1"><strong>Slack App</strong></a>. Name it whatever you want and select the Workspace in which you want to implement it.</li>
<li>Navigate to <a href="https://api.slack.com/apps/ABQ3T3QFP/slash-commands?"><strong>Slash Commands</strong></a> in the section <strong>Add features and functionality</strong> and click on <strong>Create New Command</strong>.
<ul>
<li>For <strong>Command</strong>, type <strong>/unbilled</strong> (this is the name of your Slash Command).</li>
<li>In <strong>Request URL</strong> type your <strong>ServerURL</strong> + the route we defined in the <strong>app.js</strong> file. You can find your SashiDo App's <strong>ServerURL</strong> in <strong>Dashboard -&gt; Your App -&gt; App Settings -&gt; Security &amp; Keys -&gt; API URL Address</strong>. Just replace the <strong>/1/</strong> at the end with <strong>/getUnbilledUsers</strong>. It shoud look something like this - &quot;<a href="https://pg-app-sd5ez1yjgta5vksvux7wdfjwiykcpt.scalabl.cloud/getUnbilledUsers">https://pg-app-sd5ez1yjgta5vksvux7wdfjwiykcpt.scalabl.cloud/getUnbilledUsers</a>&quot;.</li>
<li>Add a short description to the command and optionally a hint, then click on <strong>Save</strong>.</li>
<li>Repeat for the <strong>/bill</strong> Slash Command. Just replace the <strong>Request URL</strong> endpoint to <strong>/billUser</strong> (that's our second route handler in the <strong>app.js</strong> file).</li>
</ul>
</li>
</ol>
<p><img src="https://media-blog.sashido.io/content/images/2018/07/billCommand.gif" alt="How to handle WebHooks with Parse Server"></p>
<h3 id="4letstestitout">4. Let’s test it out!</h3>
<p>So, we've implemented 2 <strong>Slash Commands</strong> - <strong>/unbilled</strong>, which will return all of our unbilled users, and <strong>/bill</strong> which will try to bill all unbilled users.</p>
<p>Let us try it out and see what happens!</p>
<p>First of all, we can see that we have a few unbilled users in the picture below:</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/07/testUnbilledUsers.jpg" alt="How to handle WebHooks with Parse Server"></p>
<p>Let's head to our Slack Workspace and try out our newly implemented <strong>Slash Commands</strong>.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/07/slashCommands.gif" alt="How to handle WebHooks with Parse Server"></p>
<p>We can even check our <strong>Logs</strong> section in <strong>Dashboard -&gt; your app -&gt; Core -&gt; Logs</strong> to see if the process went well internally. In our case, everything was fine, as we can see in the picture below:</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/07/logResult.jpg" alt="How to handle WebHooks with Parse Server"></p>
<p>We've also implemented logic to handle scenarios should there be no unbilled users. If you execute any of the above <strong>Slash Commands</strong> in this case, you'll get the following response:</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/07/noUnbilled.jpg" alt="How to handle WebHooks with Parse Server"></p>
<p>That's about it. As I said before, pretty simple, right?</p>
<h2 id="otherusecasesandscenarios">Other use cases and scenarios</h2>
<p>By now you've learned how to handle WebHooks. Let's look at some use cases.</p>
<h3 id="approvingcommentsuploads">Approving Comments/Uploads</h3>
<p>Let's say that you have an application in which your users can comment and upload pictures. You would probably want to regulate which comments and pictures are uploaded in some way.</p>
<p>One neat example is an integration with <strong>Slack</strong> and your SashiDo application with WebHooks. It would work in a way that when a person uploads or makes a comment, a WebHook will be fired to Slack, notifying you and your team and letting you choose whether the comment or picture is appropriate or not. After you've made your choice, another WebHook will be fired, this time to your SashiDo App. After handling it with your custom logic, the picture/comment will be posted or not, and you can send a message to the person if the content is not appropriate.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/07/fakeLogic.gif" alt="How to handle WebHooks with Parse Server"></p>
<p>If you want to read more about Slack's <strong>WebHooks</strong>, <strong>Interactive messages</strong> &amp; <strong>Buttons</strong> check out the following links:</p>
<ul>
<li><a href="https://api.slack.com/incoming-webhooks">Slack Incoming WebHooks</a></li>
<li><a href="https://api.slack.com/interactive-messages">Slack Interactive Messages</a></li>
<li><a href="https://api.slack.com/docs/message-buttons">Slack Buttons</a></li>
</ul>
<h3 id="billingservice">Billing service</h3>
<p>Say you want to have a paid plan for your SashiDo application. You can imagine how hard it would be to write your own custom billing service and so on. That can be easily avoided by integrating a 3rd Party Billing Service like <strong>Chargebee</strong> for example, with your SashiDo app using WebHooks.</p>
<p>If you're interested and want to learn more about it, check out Chargebee's <a href="https://www.chargebee.com/docs/events_and_webhooks.html">Events &amp; WebHooks</a></p>
<h3 id="chatticketing">Chat/Ticketing</h3>
<p>Have you ever want to get feedback from your users, handle problems and issues that they might have, but don't want to write such features from scratch? With WebHooks you can do just that. For example, you can use 3rd Party Chat/Ticketing Services like <strong>Intercom</strong> or <strong>Teamwork</strong> and integrate them with your SashiDo apps using WebHooks.</p>
<p>If you're interested in such integration, you can check out both <a href="https://developer.teamwork.com/projects/webhooks/overview">Teamwork</a> and <a href="https://developers.intercom.com/docs/webhooks">Intercom</a>'s Documentation about WebHooks.</p>
<h3 id="smscalling">SMS &amp; Calling</h3>
<p>Depending on what your application's about, you can choose to have SMS &amp; Calling through it. That, by itself, would be a very laborious task if you choose to code it yourself. With WebHooks, you can use a service like <strong>Twillio</strong> to send text messages and make calls from your application.</p>
<p>If you're interested in SMS &amp; Calls integration for your application, you can check our blog post <a href="https://blog.sashido.io/github-integration-of-advanced-cloud-code-part-1/">GitHub integration of Advanced Cloud Code part 1</a> or <a href="https://www.twilio.com/docs/sms/tutorials/how-to-receive-and-reply">Twillio's Documentation</a></p>
<h2 id="usefullinks">Useful Links</h2>
<ul>
<li>If you want to learn how to run your Advanced Cloud Code locally check out our blog post <a href="https://blog.sashido.io/github-integration-of-advanced-cloud-code-part-2/">GitHub integration of Advanced Cloud Code Part 2</a>.</li>
<li>You can also check our tutorial on <a href="https://blog.sashido.io/how-to-set-up-cloud-code-on-sashido/">How to set up Cloud Code on SashiDo</a>.</li>
<li>Watch our YouTube Video Tutorial on <a href="https://www.youtube.com/watch?v=Wm8wv3biWkc&amp;index=6&amp;list=PLk66IKYX7bjrBKSNwNZVpTjVswA0oq5dr">Simple Cloud Code on SashiDo</a></li>
</ul>
<h2 id="final">Final</h2>
<p>Whoa! That was a lot to take in. The great part is that you can use this information to your advantage and integrate your SashiDo apps with some other cool services!</p>
<p>Happy coding!</p>
</div>]]></content:encoded></item><item><title><![CDATA[Configuring your Mobile Applications on the fly with Parse Config]]></title><description><![CDATA[<div class="kg-card-markdown"><p>If you have ever wanted to update the configuration of your app on the fly, you should know how frustrating it is that the little update would require a fresh app release. Fortunately, Parse Config is here to the help! It's a very simple, yet at the same time, incredibly</p></div>]]></description><link>https://blog.sashido.io/parse-config/</link><guid isPermaLink="false">5b2a2cf5bc278c0015f80241</guid><category><![CDATA[Config]]></category><category><![CDATA[Parse Config]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Alexander V. Ruptsov]]></dc:creator><pubDate>Tue, 03 Jul 2018 12:00:00 GMT</pubDate><media:content url="https://media-blog.sashido.io/content/images/2018/06/cover.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://media-blog.sashido.io/content/images/2018/06/cover.png" alt="Configuring your Mobile Applications on the fly with Parse Config"><p>If you have ever wanted to update the configuration of your app on the fly, you should know how frustrating it is that the little update would require a fresh app release. Fortunately, Parse Config is here to the help! It's a very simple, yet at the same time, incredibly useful feature which allows you to add parameters to your app, which you can update whenever you want, without worrying that configuration changes will require a new release. It is stored as a configuration object on your Parse Server instance, so you can fetch it at any given time. So let's get to the point.</p>
<h2 id="gettingstarted">Getting Started</h2>
<p>It's fairly easy to start using Parse Config. In your SashiDo applications you can do that in <strong>Dashboard -&gt; Your App -&gt; Core -&gt; Config</strong>. Afterwards, you have to create the new parameters, which you'll be able to use and update whenever you want.<br>
To do that click on the green button <strong>Create your first parameter</strong> or the <strong>Create a parameter</strong> button in the top-right corner of the Dashboard.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/06/parseConfigNavigation.jpg" alt="Configuring your Mobile Applications on the fly with Parse Config"></p>
<p>Alright, so far so good. Now you'll need to specify a couple of things:</p>
<ul>
<li>
<p><strong>Parameter Name</strong> - It can be anything, but we suggest that it's something informative in regards to what you'll use it for.</p>
</li>
<li>
<p><strong>Type &amp; Value</strong> - Those two go hand-to-hand with each other. You may wonder what data type your parameters can be, but don't worry as Parse Config supports nearly any data type:</p>
<ul>
<li><strong>Boolean</strong> - This is the standard true/false data type. You can toggle if it's true or false with just one click! Red is false and green is true.</li>
<li><strong>String</strong> - Any form of text for example &quot;Hello from SashiDo's blog!&quot;</li>
<li><strong>Number</strong> - You can use this for both integer type numbers like 1; 2; 3; and for floating-point number e.g 2.6; 10.65; 1.05 etc.</li>
<li><strong>Date</strong> - It's self-explanatory, a date format. You can even set whatever time you like to your date. When you choose this type a little calendar-like window appears when you click to set the value.</li>
<li><strong>Object</strong> - Any object that contains key/value pairs.</li>
<li><strong>Array</strong> - An array of items, for example, strings, numbers, objects or dates [&quot;user1&quot;,&quot;user2&quot;,&quot;user3&quot;]; [1,2,3,4]; [{“George”:true},{“Alexa”:false}]. As you can see they can be from any data type and even in JSON format.</li>
<li><strong>Geo Point</strong> - With this you can specify coordinates to a location with given <strong>Latitude</strong> &amp; <strong>Longitude</strong>.</li>
<li><strong>File</strong> - Last but not least, your parameter could be a file. You simply need to upload it.</li>
</ul>
</li>
</ul>
<p><img src="https://media-blog.sashido.io/content/images/2018/06/createParameter.gif" alt="Configuring your Mobile Applications on the fly with Parse Config"></p>
<p>If you want to edit your parameter, just hit the <strong>Edit</strong> button. In case you feel that you don't have any more need of it, just delete it by clicking the <strong>Delete</strong> button.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/06/editDeletePar.jpg" alt="Configuring your Mobile Applications on the fly with Parse Config"></p>
<p>Take into consideration that you can have up to <strong>100 different parameters</strong> or a <strong>total size of 128KB across all parameters</strong> as described in the Official Parse Server JS SDK <a href="https://docs.parseplatform.org/js/guide/#parameters">here</a>.</p>
<p>That's it! Now you have created your parameter. All good, but now you may ask yourself, how do I fetch what I've created from my client?</p>
<h3 id="retrievingconfig">Retrieving Config</h3>
<p>Let's say we've created a parameter <strong>dailyMessage</strong> of type <strong>string</strong> with a certain value, like &quot;<strong>Today's specialty is Pineapple Pizza!</strong>&quot;. Let's assume that for our example we are building our application with JavaScript. You can simply retrieve your parameter like this:</p>
<pre><code class="language-javascript">  Parse.Config.get().then(function(config) {
    var dailyMessage = config.get(&quot;dailyMessage&quot;);
    // Now display your message wherever you want!
}, function(error) {
    // Something went wrong (e.g. request timed out)
});

</code></pre>
<p>Note that <code>Parse.Config.get();</code> by itself will fetch all your parameters from the server.</p>
<p>As you can see it's fairly simple! The cool part is that the JavaScript SDK, or any other as a matter of fact, automatically caches your last fetched Config, so you are not required to retrieve it again after the application has been restarted. How cool is that? Simply awesome! It's build to be as reliable as possible even if your internet connection is poor. You can always fetch your cached Config and assign it to a variable like in the example below:</p>
<pre><code class="language-javascript">   var config = Parse.Config.current(); // Note that this will return all cached parameters.
   config.get(&quot;dailyMessage&quot;); // Here you specify exactly which parameter’s value you want.
   
   // Now you can do something with it.
</code></pre>
<p>A great addition is that every Parse Config instance that you get is <strong>immutable</strong>. That means that if in the future you retrieve a new Parse Config from the server, it will not change or modify any existing Parse Config instances. It will lazily create a new instance and make it available through <code>Parse.Config.current()</code>. As you may have already guessed that means that you can safely use any <strong>current()</strong> object that you've created without worrying that it will be automatically updated.</p>
<p>If you want to read more about how to retrieve Config with the SDK of your choice, check these links to the Official Parse Docs:</p>
<ul>
<li><a href="https://docs.parseplatform.org/ios/guide/#retrieving-config">How to Retrieving Config with the iOS SDK</a></li>
<li><a href="https://docs.parseplatform.org/android/guide/#retrieving-config">Retrieving Config with the Android SDK</a></li>
<li><a href="https://docs.parseplatform.org/dotnet/guide/#retrieving-config">Retrieving Config the .NET + Xamarine SDK</a></li>
<li><a href="https://docs.parseplatform.org/macos/guide/#retrieving-config">Retrieving Config with the MacOS SDK</a></li>
</ul>
<h3 id="protip">ProTip</h3>
<h4 id="saverequestsbyretrievingconfigonlyonceinawhile">Save requests by retrieving Config only once in a while</h4>
<p>As you may understand by now, it may be a little bit of trouble for you if you retrieve the Config every time you want to use it. If that's the case, you can always use the cached <strong>current</strong> object of your last fetched config. You can also implement a simple logic to retrieve the latest Config only once in while like this:</p>
<pre><code class="language-javascript">   const getConfig = function() {
    let lastFetch;
    const timeBeforeFetch = 1000 * 60 * 60 * 24; // Re-fetch the config from the server only if the given time has passed. In this example, one day.
    return function() {
        const currentDate = new Date();
        if (lastFetch === undefined ||
            currentDate.getTime() - lastFetch.getTime() &gt; timeBeforeFetch) {
            lastFetch = currentDate;
            return Parse.Config.get();
        } else {
            return Promise.resolve(Parse.Config.current());
        }
    };
}();

</code></pre>
<p>That way you can save up on the requests you are going to make if you fetch the Config each time you need to use it. Rather try to fetch it again and if the required time hasn’t expired fall back to the cached Configs.</p>
<p>After that you can retrieve your desired parameter like that:</p>
<pre><code class="language-javascript">const config = await getConfig();
config.get(‘yourParameterName’);
</code></pre>
<h2 id="otherusecasesandscenarios">Other UseCases and Scenarios</h2>
<p>So far you've learned how to create your parameters and retrieve them. However, it may still be hard for you to think of a way to use Config.</p>
<h3 id="featurebetatesting">Feature Beta Testing</h3>
<p>A good example is if you want to add this cool new feature to your application. Yet you want some of your users to test it out, but not all of them. Okay, that's awesome, as you can use two parameters of the Config to accomplish it.</p>
<p>For starters you can add a parameter of type <strong>Array</strong> called &quot;<strong>betaTestUsers</strong>&quot;. In it you can add all the User IDs you would like the feature to be available for beta testing. After that, you can create a second parameter of type <strong>Date</strong>. You can call it whatever you want, let's say &quot;<strong>featureStart</strong>. That way you can specify exactly at what date and time the feature should be made available to the given users. Cool, isn't it? You can edit your <strong>betaTestUsers</strong> to include or exclude testers at runtime without worrying that you need to re-deploy your application.</p>
<h3 id="cookingapprecipeoftheday">Cooking app, Recipe of the Day</h3>
<p>Let's gaze upon another example. Say you have an application for cooking all sorts of pizza. You can have all sorts of different recipes but you can have a little special section for <strong><em>Today's Special Recipe</em></strong>.</p>
<p>Cool idea, don't you think? But with it comes the part where you would like to update that special recipe and for an example a picture of how it would look like when done. You can imagine how frustrating it would be to re-deploy your app every day because of some little message and a picture, right? Well as Config supports both <strong>File</strong> and <strong>String</strong> parameter types you can achieve this quite easily without the need for a fresh release. Simply create a new parameter of type <strong>String</strong> and call it &quot;<strong>dailySpecialRecipe</strong>&quot; and add the description of your recipe there. After that, make another config of type <strong>File</strong> so you can upload whatever picture you like and change it whenever you wish.</p>
<h2 id="itsalwaysbetterwithavideo">It's always better with a video</h2>
<iframe width="854" height="480" src="https://www.youtube.com/embed/nqDajm7PGHk?list=PLk66IKYX7bjrBKSNwNZVpTjVswA0oq5dr" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
<h2 id="final">Final</h2>
<p>That's about it! You've learned of a way to update your applications' configuration on the fly. All that's left to do is let your imagination loose and take that information to your advantage!</p>
</div>]]></content:encoded></item><item><title><![CDATA[Bug tracking & new features development by mastering GitHub Issues]]></title><description><![CDATA[<div class="kg-card-markdown"><h2 id="contentlist">Content List</h2>
<ul>
<li><a href="#introduction"><strong>Introduction</strong></a></li>
<li><a href="#milestoneslabelsassignees"><strong>Milestones, Labels &amp; Assignees</strong></a></li>
<li><a href="#notificationsmentionsandreferences"><strong>Notifications, @mentions, and References</strong></a></li>
<li><a href="#search"><strong>Search</strong></a></li>
<li><a href="#otherusesforissues"><strong>Other Uses</strong></a></li>
</ul>
<h2 id="introduction">Introduction</h2>
<p>Each application you create on SashiDo has its own <strong>Free Private</strong> repository on GitHub.<br>
As any great project, yours will probably need to have a way to track its bugs, tasks, and improvements. Great news,</p></div>]]></description><link>https://blog.sashido.io/bug-tracking-and-features-development-with-sashido-and-github-issues/</link><guid isPermaLink="false">5a7b18f6ffb6090015b87de2</guid><category><![CDATA[GitHub]]></category><category><![CDATA[Cloud Code]]></category><category><![CDATA[Tutorial]]></category><category><![CDATA[issues]]></category><category><![CDATA[bug tracking]]></category><dc:creator><![CDATA[Alexander V. Ruptsov]]></dc:creator><pubDate>Tue, 26 Jun 2018 12:00:00 GMT</pubDate><media:content url="https://media-blog.sashido.io/content/images/2018/02/github-issues-cover-1.jpg" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><h2 id="contentlist">Content List</h2>
<ul>
<li><a href="#introduction"><strong>Introduction</strong></a></li>
<li><a href="#milestoneslabelsassignees"><strong>Milestones, Labels &amp; Assignees</strong></a></li>
<li><a href="#notificationsmentionsandreferences"><strong>Notifications, @mentions, and References</strong></a></li>
<li><a href="#search"><strong>Search</strong></a></li>
<li><a href="#otherusesforissues"><strong>Other Uses</strong></a></li>
</ul>
<h2 id="introduction">Introduction</h2>
<img src="https://media-blog.sashido.io/content/images/2018/02/github-issues-cover-1.jpg" alt="Bug tracking & new features development by mastering GitHub Issues"><p>Each application you create on SashiDo has its own <strong>Free Private</strong> repository on GitHub.<br>
As any great project, yours will probably need to have a way to track its bugs, tasks, and improvements. Great news, as GitHub has just the right feature for the job. Its called <strong>Issues</strong> and it’s GitHub’s way of tracking and dealing with these sort of things.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/06/issues_with_hand.jpg" alt="Bug tracking & new features development by mastering GitHub Issues"></p>
<p>It’s really simple, as they function almost like an email, though the great part is that they can be shared and discussed with your team. Every repository comes with its own Issues section. So let's get straight to the point.</p>
<p>We can start by looking at <a href="https://github.com/parse-community/parse-server/issues"><strong>Parse Server’s Issues section</strong></a> for example:</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/06/testIssue.jpg" alt="Bug tracking & new features development by mastering GitHub Issues"></p>
<p>GitHub's tracker is also quite special. It offers excellent formatting and focuses on collaboration and references. You can check out how a typical issue on GitHub looks in the image below:</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/06/parseIssuePic-1.jpg" alt="Bug tracking & new features development by mastering GitHub Issues"></p>
<ul>
<li>You can see that there is a <strong>title</strong> and a <strong>description</strong> which informs us what the issue is about.</li>
<li>There are some neat color-coded <strong>labels</strong> which help you filter and organize your issue by category.</li>
<li><strong>Milestones</strong> are very useful for linking issues with specific feature or project phase (e.g Weekly Sprint 9/5-9/16 or Shipping 1.0). They are like a container for issues.</li>
<li>Every issue can have an <strong>assignee</strong> which is responsible for moving the issue forward.</li>
<li>And of course <strong>comments</strong> let anyone with access to the repository provide feedback and suggestions.</li>
</ul>
<h2 id="milestoneslabelsassignees">Milestones, Labels &amp; Assignees</h2>
<p>At some point, you're going to have many issues and you may find it hard to find a specific one. Don't worry, because <strong>labels</strong>, <strong>Milestones</strong> &amp; <strong>assignees</strong> are awesome features to help you filter and sort issues.</p>
<p>You can change and edit all of them by just clicking on their corresponding gears in the sidebar which is located on the right.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/06/labelsMilestonesAssignees-2.jpg" alt="Bug tracking & new features development by mastering GitHub Issues"></p>
<p>In case you do not see the edit button, that means that you do not have permission to edit the issue and you can ask the repository's owner to make you a collaborator, so you can get access.</p>
<h3 id="milestones">Milestones</h3>
<p><img src="https://media-blog.sashido.io/content/images/2018/06/milestone.jpg" alt="Bug tracking & new features development by mastering GitHub Issues"></p>
<p>Milestones are a great feature to group up your issues, for example by project, a feature or even a time period. They can be used in many different ways in software development. Here are some examples:</p>
<ul>
<li><strong>Beta Launch</strong> - You can include any bugs that need to be fixed before you release the beta. By doing so you make sure that you don't miss anything along the way.</li>
<li><strong>June Issues</strong> - If you have many things to get done, you can specify a Milestone with the given issues you would like to work on during a specific period of time.</li>
<li><strong>Redesign</strong> - A great way to handle issues regarding the design of your project as well as collecting new ideas along the way.</li>
</ul>
<h3 id="labels">Labels</h3>
<p><img src="https://media-blog.sashido.io/content/images/2018/06/labelsPic.jpg" alt="Bug tracking & new features development by mastering GitHub Issues"></p>
<p>Labels are an exceptionally good way to organize your issues. There is no limit to how many labels you can have and you can even filter your issues by one or more labels at the same time.</p>
<h3 id="assignees">Assignees</h3>
<p>Each issue may have an assignee which is responsible for pushing it forward. That's a great way to assign a particular person to track the issue, and is familiar with it. That way he can easily track and push it forward.</p>
<h2 id="notificationsmentionsandreferences">Notifications, @mentions, and References</h2>
<p>Communication is key to resolving any issue. By using GitHub's <strong>@mention</strong> system and references, you can link issues to the right people or teams so that the issues are resolved effectively. These features are really easy to learn and use and work in every text field as they're part of GitHub's text formatting syntax called <a href="https://help.github.com/articles/writing-on-github#name-and-team-mentions-autocomplete">GitHub Flavored Markdown</a>.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/06/mentionsReferences.jpg" alt="Bug tracking & new features development by mastering GitHub Issues"></p>
<p>If you want to learn more about the syntax, you can check GitHub's official guide on <a href="http://guides.github.com/features/mastering-markdown/">Mastering Markdown</a></p>
<h3 id="notifications">Notifications</h3>
<p>GitHub's way to keep you posted about your Issues is <a href="https://github.com/notifications">Notifications</a>. They can be utilized so you are up-to-date with new issues or to simply know if someone's waiting for your input so they can continue with their work.</p>
<p>You can receive notifications by two ways - either by email or via the web. To configure these settings navigate to your <a href="https://github.com/settings/notifications">notification settings</a>.</p>
<p>If you plan to receive many notifications, it's suggested that you configure to receive <strong>Web</strong> &amp; <strong>Email</strong> notifications for <strong>Participating</strong> and <strong>Web</strong> for <strong>Watching</strong>.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/06/notificationOptionsEdited.jpg" alt="Bug tracking & new features development by mastering GitHub Issues"></p>
<p>Given that you're using this configuration, you'll receive emails when someone specifically mentions you and you can visit the web-based interface to keep in touch with repositories you have interest in.</p>
<p>You can easily view your notifications in the <a href="https://github.com/notifications">Notifications Screen</a>. It's located on the left of your avatar in the top-right corner of the page. There you can easily navigate through many notifications at the same time. You can mark them as <strong>read</strong> or you can <strong>mute</strong> a specific thread. You can speed up this process by using keyboard shortcuts. To check a list of available shortcuts press the <code>?</code> on the page.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/06/muteNotification.jpg" alt="Bug tracking & new features development by mastering GitHub Issues"></p>
<p>There is a little difference between muting a thread and marking it as read. When you've marked a certain thread as read, you will not be notified until there has been a new comment, whereas if you mute it, you will not receive notifications until you are specifically @mentioned in the thread. That gives you the power to choose which threads are important to you and which you are not interested in.</p>
<p>GitHub comes with an awesome feature which syncs your notification statuses. Basically, if you read a notification in your email, it will be marked as read in the web-based interface. Awesome, right. However, you should enable your email client to show images if you want this to work.</p>
<h3 id="mentions">@mentions</h3>
<p>In order to reference other GitHub users in Issues, we use the @mention system. We can do so in both the description and the comment section of an issue by including the <code>@username</code> of the person. When we mention someone like that they'll receive a notification about it.</p>
<p>If you want to include people to a given issue you can use the <code>/cc</code> syntax. Here's an example:</p>
<blockquote>
<p>It looks like the images on our initial page are not loading.</p>
<p>/cc @alexSmith</p>
</blockquote>
<p>That's great, but only if you know who exactly to include. In most cases, we tend to work in teams and that way we may not know who exactly could be of help. Don't worry, because @mentions work with teams within organizations on GitHub. When you @mention a team it will send notifications to everyone who's part of it. Let's say for example you create an organization named @MySashiDoApp and under it, a team @javascrip-devs. An example @mention, in this case, would look like this:</p>
<blockquote>
<p>/cc @MySashiDoApp/javascript-devs</p>
</blockquote>
<h3 id="references">References</h3>
<p>Quite often different issues are intertwined or maybe you just want to reference one into the other. This can be done by using the hashtag <code>#</code> followed by the issue number.</p>
<blockquote>
<p>Hey @alexR, I think this issue may have something in common with #62</p>
</blockquote>
<p>After you've done it, an event is created in issue #62 which looks something like this:</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/06/reference.jpg" alt="Bug tracking & new features development by mastering GitHub Issues"></p>
<p>If you want to refer to an issue in an entirely different repo, just include the repository name like this <code>alex/example_project#62</code></p>
<p>You can also reference issues directly in commits by including the issue number in the commit message.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/06/closingIssueThroughCommit.jpg" alt="Bug tracking & new features development by mastering GitHub Issues"></p>
<p>If you preface the commit message with  “Fixes”, “Fixed”, “Fix”, “Closes”, “Closed”, or “Close” and afterwards merge to master, the issue will automatically be closed.</p>
<p>All in all, references are great for adding visibility to the history of your project, as they profoundly link the work being done with the bug being tracked.</p>
<h2 id="search">Search</h2>
<p>You can find the search box at the top of the page.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/06/search.jpg" alt="Bug tracking & new features development by mastering GitHub Issues"></p>
<p>You can apply different filters to your search, for example:</p>
<ul>
<li>Keyword - e.g. <a href="https://github.com/twbs/bootstrap/issues?q=sidebar">all issues mentioning the sidebar</a></li>
<li>State - <a href="https://github.com/twbs/bootstrap/issues?q=sidebar+is%3Aclosed">all issues mentioning the sidebar that are <strong>closed</strong></a></li>
<li>Assignee - <a href="https://github.com/twbs/bootstrap/issues?q=sidebar+is%3Aclosed+assignee%3Amdo">all issues mentioning the sidebar that were assigned to @mdo</a></li>
</ul>
<p>If you'd like to read more about the search, you can do so in the official GitHub Article about <a href="https://help.github.com/articles/using-search-to-filter-issues-and-pull-requests/">Using search to filter issues and pull requests</a></p>
<h2 id="otherusesforissues">Other uses for Issues</h2>
<p>Issues are not tied only for development purposes. In fact, they are quite useful to collaborate with your team on whatever issues you have. Here are some examples:</p>
<ul>
<li><a href="https://github.com/frabcus/house/issues?labels=building&amp;state=open">Bug tracker for your house</a> including such gems as <a href="https://github.com/frabcus/house/issues/58">the door being hung incorrectly</a></li>
<li><a href="https://github.com/joyent/node/issues">Bug tracker for your open source projects</a></li>
<li><a href="https://github.com/newmerator/recipes/issues">Request for recipes</a>, maybe you have a good <a href="https://github.com/newmerator/recipes/issues/3">gluten-free pizza dough recipe</a>?</li>
<li>MostlyAdequate's <a href="https://github.com/MostlyAdequate/mostly-adequate-guide/issues">E-books</a></li>
<li><a href="https://github.com/steeve/france.code-civil/issues">The French Civil Code</a>, as unlikely as it may sound.</li>
</ul>
<h2 id="final">Final</h2>
<p>Whew! That was a long article, but you've learned how to manage and keep track of your issues.</p>
</div>]]></content:encoded></item><item><title><![CDATA[Project management of your SashiDo Applications with GitHub Projects]]></title><description><![CDATA[<div class="kg-card-markdown"><p>Have you ever thought about how great it would be if you could customize your own workflow? Managing your project, schedule events, release checklists or manage some kind of specific feature work? Don't worry, because with GitHub's Project Boards you can do just that!<br>
What’s awesome is that with</p></div>]]></description><link>https://blog.sashido.io/project-management-of-your-sashido-applications-with-github-projects/</link><guid isPermaLink="false">5a7b385effb6090015b87de4</guid><category><![CDATA[Cloud Code]]></category><category><![CDATA[GitHub]]></category><category><![CDATA[Tutorial]]></category><category><![CDATA[projects]]></category><category><![CDATA[project boards]]></category><category><![CDATA[workflow]]></category><dc:creator><![CDATA[Alexander V. Ruptsov]]></dc:creator><pubDate>Tue, 19 Jun 2018 12:00:00 GMT</pubDate><media:content url="https://media-blog.sashido.io/content/images/2018/02/project_boards.jpg" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://media-blog.sashido.io/content/images/2018/02/project_boards.jpg" alt="Project management of your SashiDo Applications with GitHub Projects"><p>Have you ever thought about how great it would be if you could customize your own workflow? Managing your project, schedule events, release checklists or manage some kind of specific feature work? Don't worry, because with GitHub's Project Boards you can do just that!<br>
What’s awesome is that with every app you have on SashiDo, you get a <strong>Free Private</strong> GitHub repo, which includes the option to enable Project Boards by default.</p>
<h2 id="projectboards">Project Boards</h2>
<p>There are generally two types of Project Boards:</p>
<ul>
<li>Repository Project Boards - These types of Project Boards are scoped only to pull requests, issues, and notes under a given repo.</li>
<li>Organization-wide Project Boards - They may refer to pull requests and issues from any repository that is part of an organization.</li>
</ul>
<p>Project Boards are great for managing and coordinating your workflow. They combine pull requests, issues, and notes, which are sorted in cards in columns of your choosing. You can easily drag and drop cards to re-arrange them, for example at the top of the column or in another column altogether. The same can be applied to the columns themselves. This is also made easier by using keyboard shortcuts, for which you can read more in the official GitHub Guide for <a href="https://help.github.com/articles/using-keyboard-shortcuts/#project-boards">Using keyboard shortcuts for Project Boards</a></p>
<p><img src="https://media-blog.sashido.io/content/images/2018/06/dragDropCards.gif" alt="Project management of your SashiDo Applications with GitHub Projects"></p>
<h3 id="cards">Cards</h3>
<p>The cards in a Project Board contain data relevant to issues and pull requests, for example, labels, assignees, status or who opened the issue or pull request. If you want to see more detail, you can click the link in the card. The cool part is that each card has a unique URL address, which means you can easily share and discuss a specific card with your team.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/06/card.jpg" alt="Project management of your SashiDo Applications with GitHub Projects"></p>
<h3 id="notes">Notes</h3>
<p><img src="https://media-blog.sashido.io/content/images/2018/06/makeNote.gif" alt="Project management of your SashiDo Applications with GitHub Projects"></p>
<p>You can create a note in every column you desire. They generally function as a reminder or a reference to an issue or pull request from any repo on GitHub, but you can also simply add information related to the Project Board itself. If you want, you can create a reference card to another Project Board by adding a link to a note. However, there may come a time when simply a note is not enough for your needs. Should that time come, you can always convert it to an issue. If you want to read more about that, check out the official GitHub Guide on <a href="https://help.github.com/articles/adding-notes-to-a-project-board">Adding notes to a Project Board</a>.</p>
<h2 id="creatingviewingprojectboards">Creating &amp; Viewing Project Boards</h2>
<p>Before anything else, it's important to know that only people with <strong>write access</strong> to a repository can create a Project Board. Likewise, anybody who has <strong>read access</strong> to the repo can view the board. In relation to organization-wide Project Boards, only members of the given organization can create/view Project Boards. Should an organization-wide Project Board contain any pull requests or issues from a repository you do not have view access to, the card will be redacted.</p>
<p>It's fairly simple to create a Project Board. First of all, you need to be in your repository main page. Once there, you can see a little tab called <strong>Projects</strong> located under your repo name. When you click on it, given that you do not have any Project Boards, you need to click on the green button named <strong>New Project</strong>.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/06/createProjectBoard.gif" alt="Project management of your SashiDo Applications with GitHub Projects"></p>
<p>To create an organization-wide Project Board, you need to navigate to <strong>Your profile</strong>. You can find it when you click on your avatar in the top-right corner of the page. When there, on the left side of the screen, click on your organization icon. After that, click on <strong>Projects</strong> -&gt; <strong>Create a project</strong>.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/06/orgProjectBoard.gif" alt="Project management of your SashiDo Applications with GitHub Projects"></p>
<p>In both cases, you'll be asked to fill in the Project Board name and provide a description. After you've filled the name and description, you can optionally choose a template for your new board. Templates help you quickly set up your Project Board. When you choose to create it with a given template, it will include already created columns and cards with tips on how to use the Project Board. There are 3 templates to choose from:</p>
<ul>
<li><strong>Basic Kanban</strong> - Using this template you can track your tasks with <strong>To Do</strong>, <strong>In progress</strong> and <strong>Done</strong> columns.</li>
<li><strong>Automated Kanban</strong> - It's identical to the Kanban template, with a difference that the cards automatically move from <strong>To Do</strong>, <strong>In progress</strong> and <strong>Done</strong> columns. If you want to read more about automation, check out GitHub's Article &quot;<a href="https://help.github.com/articles/about-automation-for-project-boards">About automation for project boards</a>.&quot;</li>
<li><strong>Bug Triage</strong> - If you want to emphasize your work on bugs this template is perfect for you. It prioritizes bugs with columns of <strong>To Do</strong>, <strong>High priority</strong>, <strong>Low priority</strong> and <strong>Closed</strong>.</li>
</ul>
<p>The <strong>Activity view</strong> a really cool feature of the Project Board. It allows you to see the recent history, like if someone created new cards or moved them to another column. To access the Activity View, just click on the <strong>Menu</strong>.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/06/activityViewGif.gif" alt="Project management of your SashiDo Applications with GitHub Projects"></p>
<p><strong>Filtering</strong> enables you to easily find a specific card or some subset of cards in a Project Board by applying filters. For example, you can filter cards by author, assignee, label, state, type. If you want to read more, you can do so in GitHub's article <a href="https://help.github.com/articles/filtering-cards-on-a-project-board/">Filtering Cards on a Project Board</a></p>
<p>There might come a time when you've completed all your task in the Project Board and don't need it anymore. You can always <strong>close</strong> it. You can do so by clicking on the <strong>Projects</strong> tab in your repo. When there you can choose which Project Board you want to close in the <strong>projects list</strong>.</p>
<h2 id="furtherreadingaboutprojectboards">Further reading about Project Boards</h2>
<p>You've learned about Project Boards in general. However, it may still be hard for you to visualize how to use them or for what purposes so let us help you out a bit.</p>
<p>An example use of a Project Board is to categorize your issues &amp; pull requests. For instance, if you plan on a new release of your application, you can create a Project Board that can hold all the issue, pull requests, bugs and notes that need to be cleared before your new release. You can categorize them by columns of your choosing like <strong>Next up</strong>, <strong>In progress</strong>, <strong>High priority</strong>, <strong>Low priority</strong> &amp; <strong>Completed</strong>. That way it would be really easy for you and your team to get things done quickly and efficiently.</p>
<p>Don't forget that you can always draw inspiration from any open source projects on GitHub if you want. You can check <a href="https://github.com/kubernetes/kubernetes/projects">Kubernetes' Projects section</a> for example.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/06/kubernetesProjectSection.jpg" alt="Project management of your SashiDo Applications with GitHub Projects"></p>
<p>You can see that there is no limit as to how many Project Boards you can have, it can be one, it can be many. It solely depends on how you want to use them.</p>
<p>If you want to read in-depth about how to edit your Project Boards you can check GitHub's official article <a href="https://help.github.com/articles/editing-a-project-board">Editing a project board</a>.</p>
<p>Perhaps you are more interested in learning how to easily add issues and pull requests to your Project Boards. In that case, you can read more about it in GitHub's <a href="https://help.github.com/articles/adding-issues-and-pull-requests-to-a-project-board">Adding issues and pull requests to a project board</a>.</p>
</div>]]></content:encoded></item><item><title><![CDATA[Documenting your SashiDo Applications with GitHub]]></title><description><![CDATA[<div class="kg-card-markdown"><p>A crucial step for a successful project is documentation. When you present documentation in your project, it's easier for people to get to know what your project's about. But don't forget to update it from time to time so it stays relevant and useful.</p>
<p>Fortunately, GitHub makes the process of</p></div>]]></description><link>https://blog.sashido.io/documenting-your-applications-with-sashido-and-github/</link><guid isPermaLink="false">5a7b208effb6090015b87de3</guid><category><![CDATA[Cloud Code]]></category><category><![CDATA[GitHub]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Alexander V. Ruptsov]]></dc:creator><pubDate>Mon, 04 Jun 2018 14:00:00 GMT</pubDate><media:content url="https://media-blog.sashido.io/content/images/2018/02/github-wiki-cover-1.jpg" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://media-blog.sashido.io/content/images/2018/02/github-wiki-cover-1.jpg" alt="Documenting your SashiDo Applications with GitHub"><p>A crucial step for a successful project is documentation. When you present documentation in your project, it's easier for people to get to know what your project's about. But don't forget to update it from time to time so it stays relevant and useful.</p>
<p>Fortunately, GitHub makes the process of creating and maintaining documentation very easy.</p>
<p>There are two basic ways you can publish your documentation on GitHub:</p>
<ol>
<li>By using a <a href="https://github.com/parsegroundapps/pg-app-tynwrjdecdmr69ke5d8fec6ixljzx5/blob/master/README.md"><strong>README file</strong></a> - this is a simple way to inform others about your project.</li>
<li>Using <a href="https://github.com/parsegroundapps/pg-app-tynwrjdecdmr69ke5d8fec6ixljzx5/wiki"><strong>Wikis</strong></a> - they are used to present in-depth information.</li>
</ol>
<h2 id="creatingyourreadme">Creating your README</h2>
<p>At SashiDo, we automatically create a FREE Private repository for each application you make. Even better, each repo comes with a README containing useful information about how and where to set up some features. That being said, you can edit the README in any way you like.</p>
<p>Alternatively if you want to create your own repository, at the creation page, GitHub asks you whether you want it to come with a set of files in it, and the README is a part of them. You can tick it so the README file will automatically be created when you create the repo.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/05/createREADMEwithRepo.jpg" alt="Documenting your SashiDo Applications with GitHub"></p>
<p>If you haven't selected the option described above, GitHub makes it even easier for you by letting you know that you can create a README so others can get familiar with your work.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/05/createREADMEafterRepo.jpg" alt="Documenting your SashiDo Applications with GitHub"></p>
<h3 id="formattingyourreadme">Formatting your README</h3>
<p>There are many formats that you might choose for your README. The best approach is to have a general, informative format. That way people can easily understand what your project is about and start working on it.</p>
<p>A sample format would be something like this:</p>
<ol>
<li><strong>Project name</strong> - Who wouldn't include their project's name? GitHub even automatically adds your project name to the beginning of the README! It's also included in the README that's created with your SashiDo app's repo.</li>
<li><strong>Description</strong> - What would a README be without a description? It should be clear and to the point, so it's easy for people to understand what your project is about.</li>
<li><strong>Installation</strong> - Your project may be awesome and fun, but if you do not include a brief guide on how to install it locally it might irritate some people.</li>
<li><strong>Usage</strong> - After you've told users how to install your project locally, you can include brief instructions on how to use it.</li>
<li><strong>Contribution</strong> - If your project is a big one, you may consider adding guidelines on how people can contribute to it. You can check out GitHub's guide for <a href="https://help.github.com/articles/setting-guidelines-for-repository-contributors/">setting guidelines for repository contributors</a>.</li>
<li><strong>Credits</strong> - It would be awesome if you emphasize and link to the project's creators and contributors.</li>
</ol>
<p>If you want to have a longer, more in-depth documentation, <strong>Wikis</strong> are the way to go.</p>
<h2 id="creatingawiki">Creating a Wiki</h2>
<p>Every repository on GitHub comes with a Wiki. To start using it, you only need to navigate to the <strong>Wiki</strong> tab in the toolbar and press the <strong>Create the first page</strong> button.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/05/createWiki.gif" alt="Documenting your SashiDo Applications with GitHub"></p>
<h2 id="addingcontent">Adding Content</h2>
<p>It's fairly easy to start editing the content of your Wiki. You just need to navigate to the Wiki, then press the <strong>Edit</strong> button.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/05/editWiki.gif" alt="Documenting your SashiDo Applications with GitHub"></p>
<p>The Wiki itself comes with an awesome editor. It's relatively easy and pleasant to use. It even lets you choose the type of format for your wiki, for example, <a href="https://guides.github.com/features/mastering-markdown/">GitHub Markdown</a>, but you can use any format supported by <a href="https://github.com/github/markup">GitHub Markup</a>. This can be done in the drop menu in the editor. There's even a preview feature, which lets you see the formatted content. You can check it out by pressing on the <strong>Preview</strong> tab, right next to <strong>Write</strong>.</p>
<p>When you've added all the content you want, before you save it, you can add an <strong>Edit Message</strong>, notifying what and why you added/edited. GitHub automatically creates a transparent history of who and what people edited, added or deleted on each page. You can find information about the last person who committed to the given page right below the title. If you want a detailed history of the changes, you can click on that information and a page with the full history will be displayed.</p>
<p>Another awesome feature that the Wiki offers is that you can add a custom footer, in which you can store any contact details or license information regarding your project.</p>
<h2 id="addingpages">Adding Pages</h2>
<p>Of course, one page will not be enough for an in-depth documentation. To add a new page to your Wiki, go to the upper-right corner and click on the <strong>New Page</strong> button.</p>
<p>Every page you create is automatically added to the sidebar in alphabetical order so you can navigate pages easily.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/05/addingWikiPage.gif" alt="Documenting your SashiDo Applications with GitHub"></p>
<p>If that's not enough, you can even create your own custom sidebar. It's located right under the <strong>Pages</strong> list.</p>
<p>An important thing to know is that the Home page serves as the main page of your Wiki and should it be missing, some automatically generated content will be displayed at its place.</p>
<h2 id="syntaxhighlighting">Syntax highlighting</h2>
<p>Another awesome feature of the Wiki is that it supports syntax highlighting of code. If you want to check all the supported languages you can check them <a href="http://pygments.org/docs/lexers/">here</a>.</p>
<p>To utilize the syntax, the code block must start with three backticks and you can specify the name of the language the block will contain, but it's optional. After you've inserted the code, the block must end with another three backticks at the same indent level as the first three.</p>
<p>Here's an example with JavaScript:</p>
<p>The following code block:</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/05/codeBlock.jpg" alt="Documenting your SashiDo Applications with GitHub"></p>
<p>Renders to this syntax highlighted code sample:</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/05/renderedCodeBlock.jpg" alt="Documenting your SashiDo Applications with GitHub"></p>
<h2 id="yourereadytogo">You're ready to go!</h2>
<p>You have adapted some vital information about how to best document and present your project on GitHub, regardless of whether your project is big in scope and requires a Wiki, or you're simply beginning and setting up a reasonable and compact README.</p>
<h2 id="fewbeautifulwikisandreadmesexamples">Few beautiful wikis and readmes examples</h2>
<ul>
<li><a href="https://github.com/krasimir/kuker/blob/master/README.md">https://github.com/krasimir/kuker/blob/master/README.md</a></li>
<li><a href="https://github.com/NYTimes/objective-c-style-guide">https://github.com/NYTimes/objective-c-style-guide</a></li>
<li><a href="https://github.com/parse-community/parse-server/wiki">https://github.com/parse-community/parse-server/wiki</a></li>
<li><a href="https://github.com/krasimir/react-in-patterns/blob/master/README.md">https://github.com/krasimir/react-in-patterns/blob/master/README.md</a></li>
<li><a href="https://github.com/guardian/frontend/wiki">https://github.com/guardian/frontend/wiki</a></li>
<li><a href="https://github.com/airbnb/react-with-styles/blob/master/README.md">https://github.com/airbnb/react-with-styles/blob/master/README.md</a></li>
</ul>
<p>Happy documenting :)</p>
</div>]]></content:encoded></item><item><title><![CDATA[Understanding the GitHub Flow]]></title><description><![CDATA[<div class="kg-card-markdown"><h2 id="intoduction">Intoduction</h2>
<p>Whenever you are working on a project with your team there will probably be ideas about new features, an optimization, or all sorts of stuff regarding your project. You can imagine what a mess it would be if everyone starts to make changes to the code without consulting with</p></div>]]></description><link>https://blog.sashido.io/the-github-flow-tips-and-tricks/</link><guid isPermaLink="false">5a7b0929ffb6090015b87de1</guid><category><![CDATA[Tutorial]]></category><category><![CDATA[Cloud Code]]></category><category><![CDATA[GitHub]]></category><dc:creator><![CDATA[Alexander V. Ruptsov]]></dc:creator><pubDate>Tue, 29 May 2018 14:21:00 GMT</pubDate><media:content url="https://media-blog.sashido.io/content/images/2018/02/Screen-Shot-2018-02-07-at-4.11.05-PM.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><h2 id="intoduction">Intoduction</h2>
<img src="https://media-blog.sashido.io/content/images/2018/02/Screen-Shot-2018-02-07-at-4.11.05-PM.png" alt="Understanding the GitHub Flow"><p>Whenever you are working on a project with your team there will probably be ideas about new features, an optimization, or all sorts of stuff regarding your project. You can imagine what a mess it would be if everyone starts to make changes to the code without consulting with their team leader, or even push the changes directly into production. The GitHub Workflow makes the whole process of managing your project a hell of a lot easier.</p>
<p>Whenever you create a new app on SashiDo, we automatically create a FREE Private repository for every app on SashiDo in GitHub, so any information in this article is applicable to it and you can give it a try.</p>
<h2 id="thegithubworkflow">The GitHub Workflow</h2>
<p>You can divide the GitHub workflow in 4 basic steps:</p>
<ol>
<li><a href="#creatingabranch">Creating a <strong>Branch</strong></a></li>
<li><a href="#addingcommits">Making a <strong>Commit</strong></a></li>
<li><a href="#openingapullrequest">Opening a <strong>Pull Request</strong></a></li>
<li><a href="#reviewingpullrequestmerging">Review of the <strong>Pull Request</strong>/<strong>Merging</strong></a></li>
</ol>
<h2 id="creatingabranch">Creating a branch</h2>
<p><img src="https://media-blog.sashido.io/content/images/2018/05/createBranch.gif" alt="Understanding the GitHub Flow"></p>
<p>Creating a branch helps you and your team test new ideas, add new features, applying a bug fix and so on, without making direct changes to the master branch. The newly created branch is a snapshot of the current branch you are in, but changes you make to it will not affect the master branch.</p>
<p>You can give the branch whatever name you want, but it's advisable to be descriptive, so your colleagues can know what's being worked on in the given branch. Here are some example branch names: <code>refactor-authentication</code>, <code>user-content-cache-key</code>, <code>make-retina-avatars</code>.</p>
<p>There’s only one rule you need to follow: anything in master is always stable and deployable.</p>
<p>It's important to note, that when you create a new branch, you're creating a copy of the branch you’ve selected. For example if you have two branches - master &amp; development - if you're currently in the development one, and create a new branch, it will be a copy of the development branch and all the changes you’ve made to it.</p>
<h2 id="addingcommits">Adding Commits</h2>
<p><img src="https://media-blog.sashido.io/content/images/2018/05/makeCommit.gif" alt="Understanding the GitHub Flow"></p>
<p>After you've created a branch you can start making changes to it. When you modify a file, you can commit the changes to the branch. Each commit has an associated message with it, explaining why a certain change was made. That way the commit creates a transparent history of what you did so others can follow up. Furthermore, each commit is considered a separate unit of change. That means that if at some point a bug occurs in the code or if you have a new idea on how to do things that’s better than your current one, you can always go back to where you started.</p>
<h2 id="openingapullrequest">Opening a Pull Request</h2>
<p><img src="https://media-blog.sashido.io/content/images/2018/05/openPullRequest.gif" alt="Understanding the GitHub Flow"></p>
<p><strong>Pull Requests</strong> are a comparison of two branches. After you've made your commits you can open a Pull Request to start a discussion about the commits you made. Pull Requests are tightly integrated with the Git repository, so anyone can see exactly what changes would be merged if they accept your request.</p>
<p>Opening a Pull Request is fairly easy and it can be done at any given time. For example, you might have very small amount of code but you want to share the idea with your team so they can give you suggestions or directions. After you’re pretty much sure that you’ve done all you can, you can open a Pull Request so others can view the work you’ve done and decide whether it’s alright.</p>
<p>You can even notify specific people using the mention system. That way, a specific person can be pinged that you would like to review the request so no one stays out of the loop. You can do that with the following syntax - <code>@name</code>.</p>
<p>Pull Requests are useful for contributing to open source projects and for managing changes to shared repositories.<br>
Pull Requests are also very useful for the Fork &amp; Pull Model. For example, your friend is developing an awesome application on SashiDo and you want to contribute to it. When you make a fork of your friend’s repository, GitHub creates a copy of its repo in your account. After you’ve made the changes and think that they might be relevant for your friend, you can open a Pull Request to start a discussion about them. If your friend likes them, he can merge the changes.</p>
<p>You can also consider using a Shared Repository model. That’s basically when collaborators are granted push access to a single shared repo and different branches are created when changes need to be made. In this model, Pull Requests are an awesome way to start a conversation regarding the changes you would like to make to the project.</p>
<h2 id="reviewingpullrequestmerging">Reviewing Pull Request &amp; Merging</h2>
<p><img src="https://media-blog.sashido.io/content/images/2018/05/Merge-1.gif" alt="Understanding the GitHub Flow"></p>
<p>After you've made a pull request, your team may have comments or disagreements so you might have to change something and make further commits to your branch. Working that way ensures that nothing gets to production before it's well tested and approved. After everything is fine and your team accepts the changes you want to make, they can be merged with the master branch.</p>
<h2 id="deployingonsashido">Deploying on SashiDo</h2>
<p>What we’ve done for you on our platform is that when you merge/push to the master branch, your changes automatically deploy to SashiDo. That saves a lot of time, but you must be cautious because any changes to master will be reflected in your app.</p>
<p>Don’t worry, because there’s an easy way manage your workflow on SashiDo. For that purpose you can have two applications - one for production and one for development. That way it will be much easier to collaborate with your team and define what access any given person has. For example, you can add the new members to the development application. By doing so, you ensure that anything that's not tested or approved stays out of production. When everything is ready and good to go, the person responsible for changes in production can apply the changes to the production application.</p>
<h2 id="itsalwayscoolwithvideo">It's always cool with video</h2>
<p>Here is the official short GitHub Getting Started video on YouTube :)</p>
<iframe width="880" height="480" src="https://www.youtube.com/embed/47E-jcuQz5c" frameborder="0" allowfullscreen="allowfullscreen" data-link="https://www.youtube.com/watch?v=47E-jcuQz5c"></iframe>
<p>And our short video how to start using the CloudCode with GitHub in SashiDo :)</p>
<iframe width="880" height="480" src="https://www.youtube.com/embed/Wm8wv3biWkc?list=PLk66IKYX7bjrBKSNwNZVpTjVswA0oq5dr" frameborder="0" allowfullscreen="allowfullscreen" data-link="https://www.youtube.com/embed/Wm8wv3biWkc?list=PLk66IKYX7bjrBKSNwNZVpTjVswA0oq5dr"></iframe>
<h2 id="usefullinks">Useful Links</h2>
<ul>
<li>
<p><a href="https://www.youtube.com/watch?v=47E-jcuQz5c&amp;index=1&amp;list=PLg7s6cbtAD17Gw5u8644bgKhgRLiJXdX4">Find the official short GitHub Getting Started series on YouTube</a></p>
</li>
<li>
<p><a href="https://blog.sashido.io/tag/cloud-code/">Getting Started with Cloud Code on SashiDo</a></p>
</li>
<li>
<p><a href="https://blog.sashido.io/tag/web-hosting/">Getting Started with Website Hosting on SashiDo</a></p>
</li>
<li>
<p><a href="https://blog.sashido.io/tag/webhooks/">Getting Started with Webhooks on SashiDo</a></p>
</li>
</ul>
</div>]]></content:encoded></item></channel></rss>