<?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: Chris Pinkney</title>
    <description>The latest articles on DEV Community by Chris Pinkney (@chrispinkney).</description>
    <link>https://dev.to/chrispinkney</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%2F470355%2F97a7a22c-8b0c-4fae-917a-773d2cca7d17.jpeg</url>
      <title>DEV Community: Chris Pinkney</title>
      <link>https://dev.to/chrispinkney</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/chrispinkney"/>
    <language>en</language>
    <item>
      <title>Curiosity, one of the most genuine of emotions</title>
      <dc:creator>Chris Pinkney</dc:creator>
      <pubDate>Sat, 24 Apr 2021 00:56:08 +0000</pubDate>
      <link>https://dev.to/chrispinkney/curiosity-one-of-the-most-genuine-of-emotions-58n8</link>
      <guid>https://dev.to/chrispinkney/curiosity-one-of-the-most-genuine-of-emotions-58n8</guid>
      <description>&lt;p&gt;​ Today marks the final day of my OSD700 experience. I can't believe it's already over, it feels like just yesterday when I was mashing my refresh button to ensure that I was one of the lucky few to get accepted into OSD600. Most of my friends weren't as lucky. Some may say it's through the power of fate, though personally I say it's through the power of fibre optic internet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--f_zj7T7A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ou7gkcgx5v5wkg7bem2k.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--f_zj7T7A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ou7gkcgx5v5wkg7bem2k.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Chris, shortly after getting into OSD600&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;One of the things I've found myself ruminating on lately is just how much I've learned these past 8 months. Several questions have come up from friends asking me for advice, most of the time I the answer, or can at least yield some sort of guiding intuition. This intuition was &lt;strong&gt;solely&lt;/strong&gt; gained from my time spent in these courses. I've found similar behaviour in some stackoverflow/reddit questions.&lt;/p&gt;

&lt;p&gt;I've made friends too. I've had great experiences working with everyone in the project:  from spending late nights working with Josue, to laughing at nonsense with Anton, Abdul, or Ilya, or talking about the benefits of coconut water with Tony, everyone has been a real joy to work with and get to know. I'm really going to miss everyone. My biggest regret is simply that this course couldn't have happened in person, I want my Telescope 2.0 pizza party damn it. Guess I'll just order a party size pizza anyway and send the bill to Dave.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0tr4wmmt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/39lrb9zzc9cwrvzkln3b.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0tr4wmmt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/39lrb9zzc9cwrvzkln3b.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Chris, shortly after finishing OSD700 (kidding of course)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Moreover, today also marks my final day as a Seneca student! My time at Seneca hasn't always been as wonderful as these two courses have been, in fact it's been mostly the opposite. I never considered dropping out or changing programs though, just that perseverance can often be a challenging endeavour in and of its own right. Although, OSD &lt;strong&gt;really&lt;/strong&gt; turned things around for me. I always looked towards the lectures and to the weekly labs and assignments with an excited fervour. These courses ended up being so important to me whereas I would &lt;em&gt;nearly&lt;/em&gt; say your time in CPA/CPD is wasted by not having the privilege of taking these courses.&lt;/p&gt;

&lt;p&gt;But enough fluff from me. Let's discuss what went on this week with me.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Maintainer
&lt;/h3&gt;

&lt;p&gt;​ Sunday! I finally re-approved &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2033"&gt;Tony's PWA&lt;/a&gt; PR after we got the final go-ahead approval from Dave. Interestingly, Tony reached out to the PWA's library creator to talk about how updates work when we deploy new code. The creator responded saying the PWA is updated! Because of this the PWA was given the go ahead.&lt;/p&gt;

&lt;p&gt;I manually tested &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2132"&gt;an update&lt;/a&gt; to a dependency with Doc Josue. We found both instances where the library was used and forced them to perform, like lions, tigers, and bears at a circus. Oh my. Always get excellent guidance from our resident Doc.&lt;/p&gt;

&lt;p&gt;I also reviewed Abdul's &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2165"&gt;PR&lt;/a&gt; which adds a health check to the posts service. Short, simple, to the point. My favourite type of PR to review.&lt;/p&gt;

&lt;p&gt;​ Monday, bloody Monday. Off to a poor start apparently! I raised &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2181"&gt;an issue&lt;/a&gt; but Josue told me that Abdul had beaten me to it. A funny coincidence, as Abdul had pointed &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2173#discussion_r615976781"&gt;out an issue&lt;/a&gt; with the users microservice, and was kind enough to throw a ticket up about it.&lt;/p&gt;

&lt;p&gt;I also raised &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2182"&gt;another issue&lt;/a&gt; to change the Users Microservice port to something that is unrestricted.&lt;/p&gt;

&lt;p&gt;​ T-T-Tuesday. Approved &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2184#pullrequestreview-639943629"&gt;a PR from Yuan&lt;/a&gt; which changed something that was bothering me since I created the about page using MDX. I also had the privilege of leading the final triage meeting, which was kind of sad for me. I always enjoyed leading the discussion, even if people were half asleep. I also "helped" by adding screenshot confirmations a few times in both Slack and &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2190#issuecomment-823599425"&gt;GitHub&lt;/a&gt; to demo the Users Microservice being used live for the first time! &lt;/p&gt;

&lt;p&gt;​ Thursday. Start off by approving &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2200"&gt;Yuan's new slack icon&lt;/a&gt; fix. She brought in &lt;code&gt;react-icons&lt;/code&gt;, a library I've used several times before and really enjoy. I also approved &lt;a href="https://github.com/Seneca-CDOT/satellite/pull/14#pullrequestreview-642847052"&gt;a neat addition to satellite&lt;/a&gt; which adds the ability to cleanly shutdown a satellite-based service. I also approved another one of &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2205#pullrequestreview-642903335"&gt;Yuan's PRs&lt;/a&gt; which updates our dark mode palette. It removes a lot of magic strings we relied on in a few places and properly adds them to the MUI theme file.&lt;/p&gt;

&lt;p&gt;​ Friday! A very sad day as it's our last release day, and the last day of class. I started it off by approving &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2206#pullrequestreview-643296991"&gt;Anton's attempt to speed up CI&lt;/a&gt; which unfortunately doesn't seem to make a huge difference, though a lot of larger companies employ such techniques regardless. I then went onto approve &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2208"&gt;Dave's PR&lt;/a&gt; which removes tests running prior to shipping a release. He also had an excellent write up to fully explain the process of this.&lt;/p&gt;

&lt;p&gt;I then had a short meeting with Abdul to audit the use of &lt;code&gt;createError&lt;/code&gt; in the Users Microservice. We came to the conclusion that it was fine as it was. &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2177"&gt;I later approved his PR&lt;/a&gt;. Looks like Abdul has the honour of shipping the last piece of code to Telescope before 2.0 landed. Kudos!&lt;/p&gt;

&lt;p&gt;​ And that was it. I had figured that this last Friday would have been more chaotic, instead it was more neutral. I won't complain about getting some more time to work on my blog post though!&lt;/p&gt;




&lt;h3&gt;
  
  
  The Microservice
&lt;/h3&gt;

&lt;p&gt;​ Josue and I started the week off by working on converting the unit tests for the Users Microservice to proper e2e tests. We both got stuck about half way through when several responses seemingly stopped cooperating and refused to properly return what we were requesting. I started working on it the next day and found where the stumbling occurred, we either weren't parsing the JSON via &lt;code&gt;await response.json()&lt;/code&gt; or weren't converting the response text via &lt;code&gt;await response.text()&lt;/code&gt;. Silly little mistakes that we got eventually. With those out of the way we continued on our way and eventually had a lot of great tests written. Josue helped me out a lot with some really neat &lt;a href="https://github.com/Seneca-CDOT/telescope/blob/master/src/api/users/test/e2e/utils.js#L28-L45"&gt;promise&lt;/a&gt; &lt;a href="https://github.com/Seneca-CDOT/telescope/blob/master/src/api/users/test/e2e/utils.js#L71-L85"&gt;tricks&lt;/a&gt;, an area where I still struggle a lot. On another note, I ended up ripping out a lot of the code that checked for hardcoded error messages. More sage wisdom provided to me, as error messages generated by our dependencies may randomly change, leading to failing tests. I also got a little lesson from Sage Dave on the proper use the fat-arrow in JS, or rather how to clearly return a promise. I have a bad habit of saving the response to a variable, only to later return it without performing any logic. An unnecessary task &lt;a href="https://github.com/Seneca-CDOT/telescope/blob/master/src/api/users/test/e2e/utils.js#L61-L69"&gt;which I changed in the final PR&lt;/a&gt;. We finally landed our &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2173"&gt;updated tests on Tuesday&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;​ From here we transitioned to attempting to implement a health check API for Firestore, both the production version and the emulated version. Both of us spent about an hour trying to research potential solutions to this, but at the current time it doesn't seem like this is possible. I even asked a (&lt;em&gt;my first, actually&lt;/em&gt;) question on stackoverflow regarding this and was met &lt;a href="https://stackoverflow.com/questions/67188704/how-can-i-check-the-status-health-check-of-my-firestore-project"&gt;with neutral responses&lt;/a&gt;. I updated the ticket regarding this issue and we moved onto something else.&lt;/p&gt;

&lt;p&gt;​ Finally, we followed this up by trying to work on how a &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2153"&gt;user becomes an admin&lt;/a&gt; in the users microservice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We tried to &lt;code&gt;post&lt;/code&gt; &amp;amp; &lt;code&gt;put&lt;/code&gt; a user with a Telescope user token (via Postman) and were denied.&lt;/li&gt;
&lt;li&gt;We tried to &lt;code&gt;post&lt;/code&gt; &amp;amp; &lt;code&gt;put&lt;/code&gt; a user with a Telescope admin token and were granted access.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Given the following, we both came to the conclusion that this work was already done for us. During our final meeting, both of us spoke to Dave about how exactly we're going to limit a user becoming an admin. We received some advice on how to proceed further, which was essentially 'lock down everything', something that I look forward to implementing with Josue. We'll give it another shot ASAP.&lt;/p&gt;

&lt;p&gt;​ In the mean time, we decided to work on replacing the &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2197"&gt;feed parser&lt;/a&gt;, which is currently being deprecated but used in a few places in our backend. We started out by &lt;code&gt;curl&lt;/code&gt;ing the feed parser wiki, editing it to only have 3 blog urls (one atom, one rss, and one xml), and running our own web server via &lt;code&gt;npx http-server&lt;/code&gt;, so instead of having our backend parse several hundred blog feeds, we'll only parse 3 of the possible known types of blog feeds. A really amazing idea from Doc. We continued on by doing some research into promise-based feed parsing libraries, which was eventually concluded with Doc suggesting that we replace &lt;a href="https://www.npmjs.com/package/feedparser-promised"&gt;&lt;code&gt;feedparser-promised&lt;/code&gt;&lt;/a&gt; with &lt;a href="https://www.npmjs.com/package/rss-parser"&gt;&lt;code&gt;rss-parser&lt;/code&gt;&lt;/a&gt;. From here it's just a matter of manipulating the shape of the data that we feed the new library we're transition too. We called it quits from here, but we'll continue working on it ASAP. Although that about does it with my microservice contributions for the week, I'll try my best to not to make this the last time I work on the microservice.&lt;/p&gt;

&lt;p&gt;​ I'm exceedingly thankful to be working with Josue. He has both taught me a lot, and shown me proper ways of doing all sorts of things with both programming and soft skills. He is an exceedingly talented programmer worth his weight in gold, and more. Both he and Dave are two people that I can only aspire to emulate, surely either of them have forgotten more than I know. I truly wish Josue only the best in his future endeavours and hope that we keep in touch.&lt;/p&gt;




&lt;p&gt;&lt;iframe width="100%" height="80px" src="https://open.spotify.com/embed/track/4jdEbvfD0u6tmOLgMKJYUg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  The Finale
&lt;/h3&gt;

&lt;p&gt;​ I'm not sure what else needs to be said, I'm only sure that there's things left unsaid (&lt;em&gt;if that makes sense&lt;/em&gt;.) The feelings and experiences from OSD &lt;u&gt;cannot&lt;/u&gt; be expressed in a single post. I think my experiences as a digital carpenter in this course can be expressed in the following: &lt;strong&gt;&lt;u&gt;I learned how to navigate and contribute to a medium-sized project in 4-8 months, and you can too!&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Some big moments for me are as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mjswensen/shoulders/pull/8"&gt;When I got my first code merged in OSD600&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/poundifdef/plainoldrecipe/pull/43/files"&gt;When I contributed (several times) to plainoldrecipe&lt;/a&gt;, a repo publicized by hacker news.&lt;/li&gt;
&lt;li&gt;My Hacktoberfest shirt arriving!&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1147"&gt;Breaking Telescope!&lt;/a&gt; (&lt;em&gt;which I think was my first Telescope contribution, naturally reviewed by Josue who was likely cursing my name&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1915"&gt;Finally landing the users microservice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Learning tonnes of devops such as CI/CD &amp;amp; Docker&lt;/li&gt;
&lt;li&gt;Realizing how many technologies I've touched in the last 8 months. I've worked on so many different, modern, and relevant tech stacks that I can really apply my knowledge to a lot of interesting places and careers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What's next? Well, I'm not sure. I still haven't decided if I'm going to McMaster University to upgrade to a Bachelor's Degree, or if I'll simply seek a job. I do know one thing, &lt;u&gt;I &lt;strong&gt;really&lt;/strong&gt; need a better chair&lt;/u&gt;.&lt;/p&gt;

&lt;p&gt;So it goes. See you later everyone, and thanks for all the fish.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pEXt7cPV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ljdj72ncjnn3o6x91nfh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pEXt7cPV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ljdj72ncjnn3o6x91nfh.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>finale</category>
    </item>
    <item>
      <title>Dawn of the Final Week (Again)</title>
      <dc:creator>Chris Pinkney</dc:creator>
      <pubDate>Sat, 17 Apr 2021 01:00:48 +0000</pubDate>
      <link>https://dev.to/chrispinkney/dawn-of-the-final-week-again-ee6</link>
      <guid>https://dev.to/chrispinkney/dawn-of-the-final-week-again-ee6</guid>
      <description>&lt;h3&gt;
  
  
  The Maintainer
&lt;/h3&gt;

&lt;p&gt;​ Like most weeks we started with panic, but this time with a little extra gusto as it's finals week.&lt;/p&gt;

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

&lt;p&gt;I started off the week by "&lt;em&gt;reviewing&lt;/em&gt;" &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2093#pullrequestreview-635037323" rel="noopener noreferrer"&gt;one of Dave's PRs&lt;/a&gt;. I say "&lt;em&gt;reviewing&lt;/em&gt;" as the tests for the PR are currently not yet passing, as such I was left to only review the code posted and not test the PR locally. As always, the code seemed fine. I was really excited to see this PR as the users microservice is finally starting to seriously come together.&lt;/p&gt;

&lt;p&gt;I also approved &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2150" rel="noopener noreferrer"&gt;a quick-fix PR&lt;/a&gt; from Pedro for a clean $20, as it was discovered that our landing page didn't properly display viewport heights. My favourite kind of PRs are always the ones that are &amp;lt;= 10 SLOC.&lt;/p&gt;

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

&lt;p&gt;Also approved a really interesting &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2159#pullrequestreview-637711102" rel="noopener noreferrer"&gt;Docker related PR&lt;/a&gt; from Doc Josue! I had never thought about how containers and volumes dispose of unused elements until now. I guess I just magically assumed they would disappear when the container closes.&lt;/p&gt;

&lt;p&gt;Reviewed &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2130#discussion_r614926813" rel="noopener noreferrer"&gt;some changes&lt;/a&gt; to the frontend made by Royce, I liked where it was heading, just not how the names were duplicated. We discussed it during our Friday meeting as well, and everyone seemed to share a general consensus about the duplicated names but also agreed that the line was an excellent touch.&lt;/p&gt;

&lt;p&gt;I approved Tony's PWA PR again since we have a bunch of testing now. I think it's adequate, however, Dave has expressed reluctance to add it as we're currently unsure how the PWA will behave when we deploy an update to prod. Tony has since reached out to the maintainer of next-pwa for answer. As a result, I have removed my approval and apologized to Tony. Hopefully we'll get a reply soon and can get some answers so we can move forward with this. Still one of my favourite PRs.&lt;/p&gt;

&lt;p&gt;I added my &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2117#issuecomment-821259868" rel="noopener noreferrer"&gt;thoughts&lt;/a&gt; to a comment that Tony left on an issue suggesting a share icon feature addition to Telescope. Tony expressed hesitation about working on this feature, but I think working in open source forces collaboration, expression, critique, and commentary, and shared my opinion as such. I'm curious to see what we can do with this. A share button would be cool, especially if it copied the link URL to the clipboard, then a user can just ctrl-v to share it to someone. Might be a nice feature for new comers to the project to tackle!&lt;/p&gt;

&lt;p&gt;I also reviewed Royce's new &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2163#pullrequestreview-638098518" rel="noopener noreferrer"&gt;SearchHelp PR&lt;/a&gt; which changes how the helpful search instructions are displayed on our search page. I pointed out a bug (&lt;em&gt;that may or may not be related to his PR&lt;/em&gt;). Lots of great frontend fixes lately from Royce!&lt;/p&gt;

&lt;p&gt;Finally, in other humorous news, &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2165" rel="noopener noreferrer"&gt;I left a really dumb review&lt;/a&gt; on something that is either not finished, failing CI, or both. Heh. I'll have to take another look at it when it's ready. GitHub is great but either I'm not great, or the UI is occasionally un-intuitive.&lt;/p&gt;

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




&lt;h3&gt;
  
  
  The Microservice
&lt;/h3&gt;

&lt;p&gt;​ I started working on converting the unit tests inside the Users Microservice to proper e2e type tests tests two days ago but ran into a few snags. For the life of both Josue and I just could not get the microservice to respond properly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// takes a user object, performs GET using the user's email&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;USERS_URL&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;createServiceToken&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;allUsers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;--&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="nx"&gt;objects&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;response.body&lt;/code&gt; simply refused to co-operate with us, and returned a bunch of crap that we didn't want. Give us the user, curse you! &lt;del&gt;&lt;a href="https://www.youtube.com/watch?v=W07r0-_Efi8" rel="noopener noreferrer"&gt;Curse you and all the halflings!&lt;/a&gt;&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;The solution ended up being &lt;code&gt;const user = await response.json()&lt;/code&gt; which allowed us to parse the JSON returned and make assertions based on the user returned via the &lt;code&gt;GET&lt;/code&gt;s body. I'm currently sitting at 6 tests rewritten out of the... who knows, 15 or so that I have to do? I'm hoping to have the rest of them done by Sunday.&lt;/p&gt;

&lt;p&gt;With only 1 week left I made it a point to issue a call for a potential roadmap for the Users Microservice. We still have a lot of work to do, but fortunately there's a bunch of us working on this stuff and a few items won't take too long. &lt;/p&gt;

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

&lt;p&gt;After these e2e tests go in to replace the current unit tests I'll be shifting gears to work on &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2153" rel="noopener noreferrer"&gt;how users are declared administrators&lt;/a&gt;, followed up by &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1932" rel="noopener noreferrer"&gt;some research&lt;/a&gt;, and concluded with &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1974" rel="noopener noreferrer"&gt;adding some quotes&lt;/a&gt;. Then finishing up what isn't done by end of week!&lt;/p&gt;




&lt;p&gt;&lt;iframe src="https://open.spotify.com/embed/track/1OeD1qftfYJk3B0q4ADP6L" width="100%" height="80px"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;In other more personal news:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;My first final went &lt;em&gt;okay&lt;/em&gt; I think... hopefully.&lt;/li&gt;
&lt;li&gt;Think I might buy a cherry tree for my backyard garden this year. I have no idea how trees work or how to care for them so hopefully I learn a lot...

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;A society grows great when aged people plant trees in whose shade they know they shall never sit.&lt;/em&gt; 🌲&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Continuing with my Rust fascination from the previous blog post, I stumbled upon a &lt;a href="https://github.com/atsamd-rs/atsamd" rel="noopener noreferrer"&gt;Rust cargo library&lt;/a&gt; which adds support for various microcontrollers. I have a Circuit Playground Express sitting in my basement. I bought it last year with the hopes of designing an automated garden watering system. Maybe I'll try it in Rust sometime!&lt;/li&gt;

&lt;li&gt;I've always wanted to get involved in something impactful. &lt;a href="https://www.remoteimpact.io/" rel="noopener noreferrer"&gt;I remember a website that I bookmarked for this just occasion!&lt;/a&gt; Maybe it will help you, dear reader, too.&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>opensource</category>
      <category>bribery</category>
      <category>ohgodhelpme</category>
      <category>beer</category>
    </item>
    <item>
      <title>Human Murmuration</title>
      <dc:creator>Chris Pinkney</dc:creator>
      <pubDate>Sat, 10 Apr 2021 01:41:38 +0000</pubDate>
      <link>https://dev.to/chrispinkney/human-murmuration-4h8l</link>
      <guid>https://dev.to/chrispinkney/human-murmuration-4h8l</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Credulous at best, your desire to believe in&lt;br&gt;
Angels in the hearts of men&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;​ The week started off not with a bang but with a whimper, as I opened &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2087" rel="noopener noreferrer"&gt;an issue&lt;/a&gt; that Davedalf the White noticed during our weekly triage meeting. I've been trying to reproduce the bug, but like Pedro I just couldn't no matter how hard I tried. Software development can be strange like this sometime, but unfortunately if this can't be reproduceable fixing the invisible will post quite the challenge. (&lt;strong&gt;Edit:&lt;/strong&gt; &lt;em&gt;As of this Friday, during our weekly deployment meeting we're currently under the impression that this is no longer an issue.&lt;/em&gt;)&lt;/p&gt;

&lt;p&gt;This was followed up by a quick microservice meeting to discuss the latest status and &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2053" rel="noopener noreferrer"&gt;the massive changes&lt;/a&gt; required to fully land the Users Microservice. I'll talk more about that later but the clock is ticking, t-minus 2 weeks and counting from today's date.&lt;/p&gt;

&lt;p&gt;Josue and I had a quick meeting with Pedro to discuss some typing issues related to &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2076" rel="noopener noreferrer"&gt;his latest PR&lt;/a&gt; which updated the Dynamic Image component we use on Telescope's home page. The meeting was concluded by the suggestion to implement &lt;a href="https://www.npmjs.com/package/@material-ui/types" rel="noopener noreferrer"&gt;MUI Types&lt;/a&gt;. I kind of wish I had learned more about typescript and NextJS but I think I'm okay focusing mostly on the backend for now.&lt;/p&gt;

&lt;p&gt;After the meeting, Josue and I reviewed a &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2058" rel="noopener noreferrer"&gt;PR from Davedalf&lt;/a&gt;, following some excellent advice to not test this locally (&lt;em&gt;as it's not really something that's testable locally&lt;/em&gt;), but instead read the code and the tests. It's hard to understate the significance of brief (yet detailed) &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2058#issuecomment-814374260" rel="noopener noreferrer"&gt;code explanations&lt;/a&gt;. &lt;/p&gt;

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

&lt;p&gt;I also reviewed &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2094" rel="noopener noreferrer"&gt;Yuan's latest PR&lt;/a&gt; which adds a really that hides the navbar on the initial render of our website, but shows it as the user scrolls down. I pointed out an issue that (presumably) caused this PR to clash with another newly landed PR from Duke which adds (awesome) scroll snapping. Unfortunately I don't know enough to help beyond pointing out flaws. Living the dream.&lt;/p&gt;

&lt;p&gt;On a similar note, I also left my thoughts (&lt;em&gt;such as they are&lt;/em&gt;) on &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2035#issuecomment-816224115" rel="noopener noreferrer"&gt;Huy's PR&lt;/a&gt; which touches up the author section of Telescope. I also reviewed another of &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2101" rel="noopener noreferrer"&gt;Dave's PRs&lt;/a&gt;, yet again joined by Doc Josue, which is helpful given that I can barely read a lot of the code he's pushing out lately. Having someone to dumb things down for you is also helpful.&lt;/p&gt;

&lt;p&gt;I also had a brief meeting with Dave regarding some issues he was running into when attempting to POST users to the Users microservice in some tests. Yet again Doc Josue was able to save the day, and &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2103" rel="noopener noreferrer"&gt;a fix PR&lt;/a&gt; arrived shortly after. It turned out our backend was mocking our node-fetch requests, resulting in data not being sent to the microservice.&lt;/p&gt;

&lt;p&gt;I finished off the night by leaving &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1801#issuecomment-816392491" rel="noopener noreferrer"&gt;some thoughts&lt;/a&gt; about a weird code escaping bug, which was conveniently being caught by another blog post by yours truly. I've worked on our backend's sanitizer previously so fortunately I have a small bit of "&lt;em&gt;insight&lt;/em&gt;" into what may or may not be causing the problem.&lt;/p&gt;

&lt;p&gt;​ Friday, the week is over but we still have to deploy and land all our PRs before hand. Here's a flurry of PR's that I approved:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2099" rel="noopener noreferrer"&gt;A PR&lt;/a&gt; which (&lt;em&gt;finally&lt;/em&gt;) allows user authentication on our Vercel deployments. Something I've been waiting for for a while now.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and also ... &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2107" rel="noopener noreferrer"&gt;a followup PR&lt;/a&gt; to fix something that I noticed just broke with the Vercel fix!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I also &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2106" rel="noopener noreferrer"&gt;left some notes&lt;/a&gt; on Illya's search microservice.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Finally, I also approved &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2113" rel="noopener noreferrer"&gt;a last minute fix&lt;/a&gt; from Doc Josue which fixed our latest prod deployment.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Users Microservice
&lt;/h3&gt;

&lt;p&gt;​ We finally landed &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2060" rel="noopener noreferrer"&gt;a fix for our paginated GET route&lt;/a&gt; (&lt;em&gt;something I tried my best to review&lt;/em&gt;) which, admittedly, had me nervous for a few days. The problem we had previously was that the paginated GET route that I created &lt;strong&gt;only&lt;/strong&gt; worked for users who had IDs starting from 0. Since we hash our user IDs, this obviously is not a solution. The solution is actually really clever: it relies on keeping track and embedding where we &lt;em&gt;left off&lt;/em&gt; in the response's header so the subsequent request has all the information where to &lt;em&gt;continue from&lt;/em&gt; in the response header:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;orderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userToStartAt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;perPage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;vs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;orderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;documentId&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;perPage&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// If we were given a user ID to start after, use that document path to add .startAfter()&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;startAfter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startAfter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;startAfter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;snapshot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;docs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;data&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="c1"&gt;// Add paging link header if necessary, so caller can request next page&lt;/span&gt;
&lt;span class="nf"&gt;addNextLinkHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;perPage&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addNextLinkHeader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;perPage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// If there aren't any results, there's no "next" page to get&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Similarly, if the number of users is less than the perPage size,&lt;/span&gt;
    &lt;span class="c1"&gt;// don't bother adding a next link, since there aren't going to be more.&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;perPage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Get the id of the last user in this page of results&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lastUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lastId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;lastUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Construct the body of the header, giving the URI to use for the next page:&lt;/span&gt;
    &lt;span class="c1"&gt;// '&amp;lt;https://api.telescope.cdot.systems/v1/users?start_after=6Xoj0UXOW3&amp;amp;per_page=100&amp;gt;; rel="next"'&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;LinkHeader&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;refs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;USERS_URL&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;?start_after=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;lastId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;per_page=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;perPage&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;rel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Link&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clever fixes like these are amazing.&lt;/p&gt;

&lt;p&gt;Aside from going over this PR a few times, Josue and &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2096" rel="noopener noreferrer"&gt;I wrote a tool&lt;/a&gt; to help export users from the &lt;a href="https://wiki.cdot.senecacollege.ca/wiki/Planet_CDOT_Feed_List#Feeds" rel="noopener noreferrer"&gt;Planet CDOT Feed List&lt;/a&gt; (a list of Telescope users and their blog information.) It... actually didn't turn out bad at all! The code is easy to read, maintainable, and best of all, short. It went through a few rounds of reviews (&lt;em&gt;a new personal best for me.&lt;/em&gt;)&lt;/p&gt;

&lt;p&gt;I also started initial discussions and research into proper e2e testing for the Users microservice, and implementing our own Redis cache. More on that to come by next Friday.&lt;/p&gt;

&lt;p&gt;Overall a good week which I spent a lot of time reviewing, commenting on stuff, and having meetings.&lt;/p&gt;




&lt;p&gt;&lt;iframe src="https://open.spotify.com/embed/track/65ShmiE5aLBdcIGr7tHX35" width="100%" height="80px"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;In other more personal news:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Been playing a bit of Assassin's Creed Valhalla, it's a solid 6/10 which (&lt;em&gt;in the few hours I've played&lt;/em&gt;) has been otherwise enjoyable.&lt;/li&gt;
&lt;li&gt;Been thinking about getting into Rust a lot lately. All this JavaScript lately has been making me itch to get back into a "&lt;em&gt;lower level&lt;/em&gt;" language.

&lt;ul&gt;
&lt;li&gt;I really wish I had pushed myself more in OSD600 to try something new. I don't regret my time using Python at all (as it was also new to me), but I guess the grass is, in fact, always brighter on the other side. Or maybe it's always rustier? Who knows.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Still enjoying The Way of Kings a lot. Finally on part 3 after starting this book nearly 4 months ago. Highly recommend &lt;a href="https://www.graphicaudio.net/the-stormlight-archive-1-the-way-of-kings-1-of-5.html" rel="noopener noreferrer"&gt;the graphic audio version&lt;/a&gt; if anyone else is an audio book fan (they also have a preview on their website which is awesome)&lt;/li&gt;

&lt;li&gt;Wish me luck with my finals start next week.&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>opensource</category>
      <category>microservices</category>
      <category>javascript</category>
      <category>nonsense</category>
    </item>
    <item>
      <title>This Horrifying Force (The Desire To Merge)</title>
      <dc:creator>Chris Pinkney</dc:creator>
      <pubDate>Sat, 03 Apr 2021 17:53:40 +0000</pubDate>
      <link>https://dev.to/chrispinkney/this-horrifying-force-the-desire-to-merge-3gg8</link>
      <guid>https://dev.to/chrispinkney/this-horrifying-force-the-desire-to-merge-3gg8</guid>
      <description>&lt;p&gt;​ The weekend crept around like a bad habit. I spent it working at my job and making progress on my &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2022"&gt;two&lt;/a&gt; &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2027"&gt;PRs&lt;/a&gt; which couldn't be landed in our &lt;a href="https://github.com/Seneca-CDOT/telescope/runs/2204839841"&gt;Friday release&lt;/a&gt; due to &lt;del&gt;an acute programming deficiency&lt;/del&gt; time and review constraints. Both PRs went through a rampant series of reviews before they could be landed, which I am consistently and eternally grateful towards. Telescope would look like a dog's breakfast were I put in charge of approving or disapproving code integrations. Plus it's always good to have someone better than you review your code:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--o4_a5kJ4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lzy9c8ovzc3fhhsf0fsc.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--o4_a5kJ4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lzy9c8ovzc3fhhsf0fsc.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;​ But we'll get into the users micro-service stuff shortly. Switching gears to some Telescope maintainer work, I approved a &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2023"&gt;PR&lt;/a&gt; which adds Portainer, a container management GUI  (&lt;em&gt;which I had explored a few days prior with Josue&lt;/em&gt;) which makes the Telescope admin's lives much easier. I used to host a lot of game servers when I was younger (&lt;em&gt;still do&lt;/em&gt;) so I &lt;strong&gt;love&lt;/strong&gt; to play around with software like this.&lt;/p&gt;

&lt;p&gt;I also approved &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2045"&gt;a small PR&lt;/a&gt; which fixes a typo we had in our CSS, and &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2026"&gt;another&lt;/a&gt; fixing the way we display hyphens in Telescope users names. The latter PR had some pretty interesting discussion based around how to approach this issue, how &lt;em&gt;should&lt;/em&gt; we display long names which contain hyphens? Should we break the name onto a newline, or split the name at the hyphen? Eventually we decided to simply split onto a newline after encountering a hyphen.&lt;/p&gt;

&lt;p&gt;I suggested the use of Formik for our new &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2032#pullrequestreview-624826321"&gt;user sign-up page PR&lt;/a&gt;. The sign-up page will eventually be sending post requests to the Users microservice to allow Seneca Students to create accounts and add their blog feeds/GitHub info to their profiles. Naturally it's imperative that we employ &lt;strong&gt;&lt;em&gt;double-validation&lt;/em&gt;&lt;/strong&gt; (&lt;em&gt;a word which I totally didn't create just now&lt;/em&gt;), meaning we should be validating information that users can input in both the frontend and the backend.&lt;/p&gt;

&lt;p&gt;I also lead our weekly triage meeting, with my co-pilot Royce. I think it went really well. I certainly didn't feel as nervous as I did the first time leading.&lt;/p&gt;




&lt;h3&gt;
  
  
  Users Microservice
&lt;/h3&gt;

&lt;p&gt;​ One change of note &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2022"&gt;to one of my PRs&lt;/a&gt; mentioned above, was an idea suggested by Head Wizard Davealdore to validate the query parameters used in the users micro-service even further. We currently have code in the Users microservice which parses each parameter passed in when executing a &lt;code&gt;GET&lt;/code&gt; request to &lt;code&gt;/?per_page=xxx&amp;amp;page=yyy&lt;/code&gt; to retrieve Telescope users. These values for the parameters (&lt;em&gt;&lt;code&gt;xxx&lt;/code&gt; and &lt;code&gt;yyy&lt;/code&gt; above&lt;/em&gt;) can be between &amp;gt;= 1 and &amp;lt;= 100 for &lt;code&gt;per_page&lt;/code&gt;, and  &amp;gt;= 1 for&lt;code&gt;page&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parsePerPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;per_page&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;per_page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;perPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;parsePerPage&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;parsePerPage&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;parsePerPage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parsePage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;parsePage&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;parsePage&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;parsePage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, it was suggested to instead delegate some heavy lifting to Celebrate, a library we use in the backend as middleware to our routes, such that we don't have to entirely rely on weird hacky code like the above snippet. It looks something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;-    [Segments.QUERY]: {
-      per_page: Joi.number(),
-      page: Joi.number(),
&lt;/span&gt;&lt;span class="gi"&gt;+    [Segments.QUERY]: {
+      per_page: Joi.number().integer().min(1).max(100),
+      page: Joi.number().integer().min(1),
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not only does Celebrate now ensure that the parameters can ONLY be numbers (specifically integers), it ensures that they must be integers with a range between 1 and 100 for &lt;code&gt;per_page&lt;/code&gt; and &amp;gt;= 1 for &lt;code&gt;page&lt;/code&gt;. With this change also comes a much needed pruning of the spaghetti logic above, as since we're validating both &lt;code&gt;page&lt;/code&gt; and &lt;code&gt;per_page&lt;/code&gt;, we have no need to parse or specify the values, and the code can simply be changed to the follow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;-   const parsePerPage = req.query.per_page &amp;lt; 1 ? 100 : Math.min(parseInt(req.query.per_page, 10), 100);
-   const perPage = !parsePerPage || parsePerPage &amp;lt; 1 ? 100 : parsePerPage;
-
-   const parsePage = parseInt(req.query.page, 10);
-   const page = !parsePage || parsePage &amp;lt; 1 ? 1 : parsePage;
&lt;/span&gt;&lt;span class="gi"&gt;+   const { per_page: perPage, page } = req.query;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Awesome. I feel that every time I work with Celebrate I always come out feeling quite pleased with this library and with myself. When a JS library ups your self esteem you've probably been inside the house for too long. &lt;em&gt;Sigh&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;​ I also wanted to spend some time later in the week converting the unit tests in the Users microservice to e2e tests with Doc Josue, however a big PR from Head Wizard Davealdore was put up for review which changed a lot of the background and common files in the users microservice. Because of these changes I had to alter the order of my operations since a lot of files that I'd be touching are going to get changed after said PR lands. Thus I instead spent the night working towards finally landing my paginated PR instead, &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2060#pullrequestreview-625867994"&gt;followed by a review&lt;/a&gt; to Davealdore's above mentioned PR. Also I think a certain head wizard needs a break... or a beer, or both, preferably both:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sRA8Hu1_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/guvb2eipuf1hue83mjgy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sRA8Hu1_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/guvb2eipuf1hue83mjgy.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;​ I also reviewed &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2064#pullrequestreview-626484550"&gt;a PR about Jest&lt;/a&gt;, which added a watch mode to the e2e test runner. Constantly re-running tests was slowly driving me (&lt;em&gt;further&lt;/em&gt;) into madness. I actually never thought that this had to be added, and instead figured it was just part of Jest and that I was, instead, being too lazy to google to run it.&lt;/p&gt;

&lt;p&gt;This weekend I hope to finally get around to converting the users tests to proper e2e tests, submit more reviews to Dave's large PR, and ideally start working on adding our data to Redis as a cache between Firebase and Telescope. Happy Easter.&lt;/p&gt;




&lt;p&gt;&lt;iframe width="100%" height="80px" src="https://open.spotify.com/embed/track/0YsugU0fORmrH2fNBvq4UD"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>microservices</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Hey Sailor</title>
      <dc:creator>Chris Pinkney</dc:creator>
      <pubDate>Sat, 27 Mar 2021 02:43:01 +0000</pubDate>
      <link>https://dev.to/chrispinkney/another-week-1301</link>
      <guid>https://dev.to/chrispinkney/another-week-1301</guid>
      <description>&lt;p&gt;I started off the week approving a &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2006"&gt;simple but much needed PR&lt;/a&gt; from &lt;a href="https://dev.to/yuanleemidori"&gt;Yuan&lt;/a&gt; which shunk the title font size and added a link to the author's blog (my favourite part.) I then went onto approve &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2018"&gt;YET ANOTHER pr&lt;/a&gt; from Miss Lee (&lt;em&gt;who has been making some nice additions to our front end apparently&lt;/em&gt;) which re-adds our much needed admin buttons to our front end.&lt;/p&gt;

&lt;p&gt;Next I set my sights on the ever polite Metropass (&lt;em&gt;if that is his real name&lt;/em&gt;). I reviewed &lt;a href="https://github.com/Seneca-CDOT/satellite/pull/9#discussion_r601716509"&gt;Mo's really cool PR&lt;/a&gt; and left my thoughts for him to digest. I had suggested that in addition to hardcoding how long we specify our Cache ages (&lt;em&gt;i.e. how long the browser should cache a piece of data vs requesting a new piece of data all over again&lt;/em&gt;) the developer could alternatively pass a specific value to specify how long they want to cache their stuff (&lt;em&gt;the ever technical word.&lt;/em&gt;)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DgfE6lmE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4eh7lk5s4rk2iou6r23h.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DgfE6lmE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4eh7lk5s4rk2iou6r23h.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;​ The PR also reminded me of &lt;a href="https://docs.python.org/3.10/whatsnew/3.10.html#pep-634-structural-pattern-matching"&gt;how switch cases finally got added to Python&lt;/a&gt;, I remember Googling how to do them in Python during OSD600 while working on link checker program, and since Python (at the time) didn't have them, &lt;a href="https://github.com/chrispinkney/He-s-Dead-Jim/blob/master/src/hdj.py#L14"&gt;I had to instead use &lt;code&gt;if/else&lt;/code&gt;&lt;/a&gt; etc. This is kind of an ugly change if you ask me but not an entirely unwanted one.&lt;/p&gt;

&lt;p&gt;I also threw &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1801#issuecomment-808291290"&gt;some thoughts about a PR here&lt;/a&gt;, and finally &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2033#issuecomment-808363190"&gt;I also reviewed Tony's PWA PR&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;​ I remember talking to Tony near the beginning of the semester and us both agreeing to work on the PWA together (&lt;em&gt;though we have since diverged paths massively since I'm currently obsessed with microservices&lt;/em&gt;) so I'm glad to actually see it being worked on. I have to say I'm really amazed at how simple it seemed to set this up. For some reason I was picturing doing something like React Native to get this work. Nope, simply import a library and Bob's you're uncle. Amazing. I even tested it on my phone and it worked beautifully. I was in shock, truly.&lt;/p&gt;

&lt;p&gt;​ Finally, I gave my comrade Ilya a brief lesson on microservices (and satellite) since he's taking over managing a microservice. I'm really excited to see where it'll head to because I can finally talk and review microservices after my experience working on one for the last few weeks. Speaking of microservice...&lt;/p&gt;




&lt;p&gt;Feeling undeservedly accomplished for now, I went back to touching (&lt;em&gt;finishing?&lt;/em&gt;) up the Users Microservice. I had at least two goals that I wanted to accomplish this week:  properly paginate the GET route, and fully set up the users microservice for prod. First thing was first so let's dive in:&lt;/p&gt;

&lt;p&gt;I started off by working on paginating (&lt;em&gt;a fancy word for saying "give me only a slice of the cake instead of the whole cake"&lt;/em&gt;) the GET route for the microservice. After working on the issue for a while I stumbled upon a major issue: &lt;strong&gt;How can I request only &lt;em&gt;n&lt;/em&gt; number of records and know where to start at when I don't have a point of reference?&lt;/strong&gt; I can't just pump gas into my car and know when to stop, I need some sort of point of reference. Similarly I can't just request 20 records from the DB without saying where to start and stop from. How would the query know which 20 I'm requesting? The first 20? The second? The third? Etc. Can't I to request 1 page of 20 records, another page of the following 20, and a third page of another 20 records?&lt;/p&gt;

&lt;p&gt;​ Generally in these situations there's something called an &lt;strong&gt;offset&lt;/strong&gt;. I can request 20 records on the 5th page and simply offset which records I want by 20 * 5, thus ensuring that I get records 100-120. But not in Firestore! Another gotcya that's slowly pushing my away from the database that I once loved. The problem with this situation is that the &lt;a href="https://firebeast.dev/tips/do-not-use-offset"&gt;offset&lt;/a&gt; method in Firestore &lt;a href="https://firebeast.dev/tips/do-not-use-offset"&gt;requests ALL records in the DB&lt;/a&gt; as opposed to the few that I request. This is a problem when dealing with massive databases. If I have a database with 100,000 records, and I request 20, why should I pay for the bandwidth of requesting 100,000? (&lt;em&gt;Probably so Google can charge you for it, but that's neither here nor there.&lt;/em&gt;)&lt;/p&gt;

&lt;p&gt;​ I contacted Sage Dave and asked for some advice which left both of us in a stump. The solution I came up with is simply start from user 0 and work my way up from that when requesting &lt;em&gt;n&lt;/em&gt; users. If a user has an id of 0, I can request 10 users on page 1 and 10 users on page 2, and since I know my starting point of reference I'll easily be able to request the first 20 users.&lt;/p&gt;

&lt;p&gt;​ I finished my &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2022"&gt;PR and threw it up for review&lt;/a&gt;. As with most of my code I'm getting good reviews with a lot of language-based semantic nitpicks. JS is not my forte. I mean, I have no forte, but if I did JS would not be it. I'm really starting to enjoy it though.&lt;/p&gt;

&lt;p&gt;Next up is making sure that the Users Microservice is ready to be deployed on production. Since our code lives inside of Docker (with traffic managed by Traefik) I have to ensure that my microservice can both receive and send signals to the other microservices as required. The complicated part of this PR is differentiating between what environment the code is currently running in, and how to respond accordingly as a result.&lt;/p&gt;

&lt;p&gt;​ When the microservice is running in dev mode, we have ensure that we're using the Firebase emulator and not the actual Firebase db (as to not incur usage charges when we're simply fixing code or adding features). How do you tell which code to run when though? This is a minor problem I struggled with a lot in this PR (I think mostly it's because my knowledge of Docker, Traefik, dev vs prod, is flaky at best). But my main challenge I faced with this PR was getting the emulator to work inside of Docker's dev environment (&lt;em&gt;there's a lot of minute details and things to keep in mind with this issue, so I'll try to keep this brief.&lt;/em&gt;)&lt;/p&gt;

&lt;p&gt;​ There's currently two dev versions to this microservice, a Docker version and a local version. Think of them as one in the same entity, just with a different coat of pain. The local version works flawlessly, so why doesn't the Docker version? I simply am not able to communicate with my microservice via Docker. WHY? It's maddening! I felt my sanity slip away while working on it. I explored every Google hit I could think of before relenting and asking for help from Doc Josue. After about 2 hours of us trying to figure this out, we came across the extremely obvious (in hindsight) solution.&lt;/p&gt;

&lt;p&gt;​ You need a few things to ensure that the Firebase emulator functions properly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;You have to make sure that you specify a port and address in the &lt;code&gt;firebase.json&lt;/code&gt; file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You have to make sure that the &lt;code&gt;projectId&lt;/code&gt;s match for both the emulator and the firebase config file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;u&gt;You have to make sure that the &lt;code&gt;FIRESTORE_EMULATOR_HOST&lt;/code&gt; environment variable is &lt;strong&gt;PROPERLY&lt;/strong&gt; pointing to the emulated Firebase instance in question.&lt;/u&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;​ If you haven't guessed it, I was declaring the Docker address incorrectly: &lt;code&gt;FIRESTORE_EMULATOR_HOST=localhost:8088&lt;/code&gt; vs &lt;code&gt;FIRESTORE_EMULATOR_HOST=firebase:8088&lt;/code&gt;. And it makes perfect sense too when you think about it. &lt;code&gt;localhost&lt;/code&gt; does not exist to other Docker containers, thus saying "I want you (&lt;em&gt;localhost:6666&lt;/em&gt;) to connect to Firebase at localhost:8088" is not applicable. localhost:8088 does not exist from one container to the next. &lt;strong&gt;Stupid&lt;/strong&gt;. Very stupid of me. All we had to do was specify the Docker container's network address (&lt;em&gt;via &lt;code&gt;firebase:8088&lt;/code&gt;&lt;/em&gt;) and we were back in business. We also briefly tested deploying the microservice to prod using a real Firestore instance and I'm happy to report that everything works as expected!&lt;/p&gt;

&lt;p&gt;Both PRs ended up taking much longer and being way more involved that I had thought either of them would be. I really happy that I stuck with it and managed to work through several blockers I had. I genuinely could not have done it without Doc Josue and Sage Dave as both issues required more pairs of eyes to finally figure out. Kudos to both of them. 🍻🍻🍻&lt;/p&gt;




&lt;p&gt;In more personal news:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Currently listening to local Windsor band Woods of Ypres&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;iframe width="100%" height="80px" src="https://open.spotify.com/embed/track/0WZWSfFk5iAReQGfIXzCj8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I'm very excited that it's getting warming and I can finally start my garden up again. If anyone wants to request a specific fruit or veggie to grow now is the time, simply bring a 6 pack to share when you come to pick up the harvest. That or review my PRs. Preferably the former.&lt;/li&gt;
&lt;li&gt;I finally got around to watching some of &lt;a href="https://www.youtube.com/watch?v=CsplLiZHbj0"&gt;Dirty Money&lt;/a&gt;'s season 2. It's just as good as season 1 so far.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>opensource</category>
      <category>javascript</category>
      <category>docker</category>
      <category>traefik</category>
    </item>
    <item>
      <title>Perseverance</title>
      <dc:creator>Chris Pinkney</dc:creator>
      <pubDate>Sat, 20 Mar 2021 00:02:49 +0000</pubDate>
      <link>https://dev.to/chrispinkney/perseverance-43a1</link>
      <guid>https://dev.to/chrispinkney/perseverance-43a1</guid>
      <description>&lt;p&gt;​ The week started off with me leading our weekly triage meeting, with Mo taking notes. There's not too much to talk about, as only a few students were wounded in the telescope attack. I decided to spend a good chunk of meeting time focusing on older issues, as seeing 100+ issues, some of them from 2019, makes my neat-freak skin crawl. I imagine that this is a project most medium sized projects deal with. I also imagine that larger scale projects simply don't. All in all I enjoyed leading the meeting but was surprisingly nervous throughout most of it.&lt;/p&gt;

&lt;p&gt;I also lightly reviewed one of &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1954" rel="noopener noreferrer"&gt;Sir Dave's PR&lt;/a&gt; as I happened to be playing musical chairs recently with various &lt;code&gt;PORT&lt;/code&gt; values for the plethora of services we're all working on.&lt;/p&gt;

&lt;p&gt;​ On Wednesday I continued to work on the excellent &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1915" rel="noopener noreferrer"&gt;abundance&lt;/a&gt; of requested changes to my Users microservice by Mo, Abdul, Doc Josue, and Sir Dave. My all-time favourite requested change would have to be &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1915#discussion_r593771931" rel="noopener noreferrer"&gt;this&lt;/a&gt; one. Previously I had two functions which would create different users that I could save to my database (&lt;em&gt;to test routes that return all users, for example&lt;/em&gt;) but this change lets me instantiate as many users as I'd like with one function, and simply pass in different information when required. &lt;em&gt;Awesome&lt;/em&gt;. I had really wanted to do something like this but couldn't figure out how to syntactically get it down.&lt;/p&gt;

&lt;p&gt;I also started working on a &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1967" rel="noopener noreferrer"&gt;fix&lt;/a&gt; to the pathetically un-styled About page. I'm still not crazy about working on front-end stuff, but I'd still really like to get better at it, plus, in the immortal words of Doc Josue: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;but you know, it's good to know a bit of everything&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Although clearly he's never tried to ask three+ designers to all agree on a design of something, as I had several changes, both on the GitHub page and privately on slack, requested of me at the same time. Lots of fun! I did learn a lot about CSS in the process, and what I already knew was a big refresher for me as I'm not the greatest in styling stuff. I do however always enjoy doing CSS stuff... for about the first 30 minutes, then I just wish I had gone into medicine instead. Big thanks to Ilya who spent some time with me teaching me a lot about various CSS properties and breakpoints, and helping me get the PR to where it is today. Hopefully it'll land soon.&lt;/p&gt;

&lt;p&gt;​ Thors-day! I finally finished my micro-service approved and landed! Many hours of hard work finally over, with more hours to come. I also got to use the shiny force button too!&lt;/p&gt;

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

&lt;p&gt;I genuinely couldn't have done it without all the guidance and help given to me by my professor and peers. The one thing I love about open source work is the communication ability coupled with suggested changes. Learning from those better than you is incalculably valuable. I'm really glad that I stuck with it and got it done, although It didn't get completed in as timely of a manner as I'd have wanted.&lt;/p&gt;

&lt;p&gt;Oh, and naturally my power went out half way-through my final rebase, which resulted in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PS C:\Users\Chris\Documents\Code\Repos\telescope&amp;gt; git status
fatal: not a git repository (or any of the parent directories): .git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lovely. I had to reclone my fork and continue on my way. Not the end of the world but definitely annoying.&lt;/p&gt;

&lt;p&gt;So what's next? I'm not sure! Figuring out what to do is always part of the fun. &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1932" rel="noopener noreferrer"&gt;I'd like to get this wired up to &lt;code&gt;prod&lt;/code&gt;&lt;/a&gt; next, then do a test-run to see if everything works as expected. &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1931" rel="noopener noreferrer"&gt;Then move onto addressing several security concerns&lt;/a&gt;. Finally, I'd like to start working on actually implementing the users micro-service!&lt;/p&gt;

&lt;p&gt;​ Friday. I started out by reviewing &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1980" rel="noopener noreferrer"&gt;a minor Husky fix&lt;/a&gt; by Josue. How strange that dependabot upgrading our web hook program actually caused it to stop working. I mean that genuinely not as a snarky comment. It seemed like functionality completely broke in between versions and none of us noticed it for a few weeks. Strange. Thankfully Doc patched us up and we're good to go.&lt;/p&gt;

&lt;p&gt;I also very quickly approved &lt;a href="https://github.com/Seneca-CDOT/satellite/pull/8" rel="noopener noreferrer"&gt;this PR&lt;/a&gt; (&lt;em&gt;generously explained to us during on Friday meeting call&lt;/em&gt;) which adds an authorized middleware to Satellite which ensures that users must be authorized to execute specific routes. I look forward to implementing this, as security is something I was concerned with.&lt;/p&gt;

&lt;p&gt;Speaking of our Friday meeting, Royce spent some time working on &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1910#pullrequestreview-616840330" rel="noopener noreferrer"&gt;a fix for inline img tags&lt;/a&gt; in Telescope which he was kind enough to explain to us. I didn't think a simple task like this would be so involved but given how different blog providers handle images differently than another, it makes sense that Telescope can't accommodate every blog provided equally. Royce proposed working on a fix to detect Blogspot (our current problem child blog platform) and handle those images differently from the rest. I'm curious to see how this will handle random RSS feeds (&lt;em&gt;i.e. those not on medium/blogpost/dev/etc.&lt;/em&gt;) and if it'll be a problem.&lt;/p&gt;

&lt;p&gt;Finally I also released a minor &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1997" rel="noopener noreferrer"&gt;fix to my users&lt;/a&gt; micro-service's &lt;code&gt;Dockerfile&lt;/code&gt; for &lt;code&gt;prod&lt;/code&gt;. This is what I get for copying and pasting without looking through it. However the fix also fixes my OCD as I had just noticed that a few files were not in the same structure as the rest of the micro-services. Phew. Now I can finally sleep well at night.&lt;/p&gt;




&lt;p&gt;An overall busy but quiet week for me. I'm really glad that I was able to get the microservice merged and I'm really excited to move further forward with it.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>microservices</category>
      <category>clickbaittitle</category>
      <category>github</category>
    </item>
    <item>
      <title>The Shippening: Part 1.8, Micro Madness</title>
      <dc:creator>Chris Pinkney</dc:creator>
      <pubDate>Sat, 13 Mar 2021 00:56:50 +0000</pubDate>
      <link>https://dev.to/chrispinkney/the-shippening-part-1-8-micro-madness-517p</link>
      <guid>https://dev.to/chrispinkney/the-shippening-part-1-8-micro-madness-517p</guid>
      <description>&lt;p&gt;Earlier this week I decided to pause progress of my microservice today to instead test @humphd's dockerized Firebase emulator. I needed to ensure this works for &lt;del&gt;three&lt;/del&gt; two reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;del&gt;To get a grade in OSD700 by testing a PR&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;To ensure that I could insert data into a local, traefik, dockeriz'd, offline, version of the Firebase Firestore.&lt;/li&gt;
&lt;li&gt;To ensure a smooth integration into my User microservice.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://dev.to/chrispinkney/hackathon-update-2mng"&gt;Last week I participated in a hackathon&lt;/a&gt; and used Firebase as my db of choice. I ran into some issues that were preventing me from inserting data into my local version of the db. I had assumed that this was due to the fact that I had never specified a private API key to use. &lt;u&gt;This is a big issue as having to specify a private API key to use the offline emulator means that we have to authenticate each and every developer who needs to use Firestore (this also ruins our potential CI pipeline.)&lt;/u&gt; Assuming the worst, I reported my grim findings during our triage meeting on Tuesday.&lt;/p&gt;

&lt;p&gt;Evidently this is not the case as I did not specify one when testing this PR. Hopefully the fact that the emulated version now works is due to PEBKAC, RTFM, or both. I need to release a draft PR in order to get more devs to test my code.&lt;/p&gt;

&lt;p&gt;I tested this PR by making a separate (&lt;em&gt;i.e. bastardized&lt;/em&gt;) version of my current microservice work that I use to send data to my Firestore, and pointing it to the dockerized version. It sounds simple but there were a few things that I had to do first:  I had to lighty reintroduce myself to Docker, fix my Ubuntu WSL2 install (&lt;em&gt;god I need to get Ubuntu working with my fakeraid system...&lt;/em&gt;), and do some reading and catching up about Firestore Emulator. After some time I finally got it to work and reported by findings on the PR.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KXazugfZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hsbq7m5yf3q2aducpdpk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KXazugfZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hsbq7m5yf3q2aducpdpk.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Anyway, testing this PR was a lot of fun and a headache at the same time. I imagine this feeling is a lot like raising children. &lt;/p&gt;

&lt;p&gt;After finishing my review, I proceeded to continue working my microservice. It's finally nearing a point where I can release it to the wild for review. I needed (and am eternally grateful for) guidance, direction, and help to push this thing into a PR. The only thing that I lack now is time. Time, and brain cells mostly. It's getting late in the week and the last 10% of something always takes as much time as the 90% did. Well, maybe not 90% in this case, but it sure felt like it given all the work I've rushed into this in the last few days.&lt;/p&gt;

&lt;p&gt;Here is my leftover todo list:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Finish up making some more tests, specifically ones that test Celebrate's validation rules
a. &lt;strong&gt;Mostly done.&lt;/strong&gt; I still could use several tests testing various smaller bits of code but those can always be added in later and spending too much time on this won't get a PR up sooner.&lt;/li&gt;
&lt;li&gt;Migrate to &lt;a href="https://www.npmjs.com/package/@firebase/rules-unit-testing"&gt;https://www.npmjs.com/package/@firebase/rules-unit-testing&lt;/a&gt; because &lt;code&gt;@firebase/testing&lt;/code&gt; is deprecated
a. &lt;strong&gt;Done.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Create a basic README.md file
a. &lt;strong&gt;Done.&lt;/strong&gt; I'm rather proud of it actually. It does need some more work as I need to specify exactly how the service and docker + traefik work together to get data where it needs to go.&lt;/li&gt;
&lt;li&gt;Implement a list of current deficiencies and issues to discuss when the draft PR goes up
a. &lt;strong&gt;Done. Kind of.&lt;/strong&gt; I've been keeping track of this but at lot of them have been fixed and a lot of things have changed in the last few days. &lt;/li&gt;
&lt;li&gt;Implement &lt;a href="https://github.com/Seneca-CDOT/satellite"&gt;Satellite&lt;/a&gt;
a. &lt;strong&gt;Done.&lt;/strong&gt; I was having some issues with this though, as after implementing Satellite all my tests were failing. My problem, as expected, was minor and silly:  &lt;code&gt;const { app } = require('../../index');&lt;/code&gt;, I wasn't de-structuring &lt;code&gt;app&lt;/code&gt; from &lt;code&gt;index&lt;/code&gt;, so all the function calls were failing as they didn't exist in &lt;code&gt;app&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Dockerize the microservice
a. &lt;strong&gt;Done.&lt;/strong&gt; I'm a great admirer of Docker (and traefik) but it's still confusing to me. I just need more experience. Mostly I lack the context of how things are interconnected to each other via multiple Dockers + Traefik.&lt;/li&gt;
&lt;li&gt;Add Firestore private key placeholders to  &lt;code&gt;env.production&lt;/code&gt; and &lt;code&gt;env.staging&lt;/code&gt;
a.  &lt;strong&gt;Not done.&lt;/strong&gt; I'm lacking both files so I'll need to iterate on this. Thanks, checklist!&lt;/li&gt;
&lt;li&gt;
&lt;del&gt;Tidy up the &lt;code&gt;package.json&lt;/code&gt; run commands using &lt;a href="https://www.npmjs.com/package/npm-run-all"&gt;npm-run-all&lt;/a&gt;&lt;/del&gt;
a.  Unnecessary since the entire microservice is run via Docker, having npm run commands are a thing of the past.&lt;/li&gt;
&lt;li&gt;Create an update (&lt;em&gt;put&lt;/em&gt;) route
a.  &lt;strong&gt;Done&lt;/strong&gt;, along with accompanying tests.&lt;/li&gt;
&lt;li&gt;Create a delete route
  a.  &lt;strong&gt;Done&lt;/strong&gt;, along with accompanying tests.&lt;/li&gt;
&lt;li&gt;
&lt;del&gt;Add date/time users were created (&lt;em&gt;mostly for funsies&lt;/em&gt;)&lt;/del&gt;
  a.  &lt;strong&gt;Not done.&lt;/strong&gt; Scrapped for time.&lt;/li&gt;
&lt;li&gt;
&lt;del&gt;Add date/time users were updated (&lt;em&gt;again, for funsies&lt;/em&gt;)&lt;/del&gt;
  a.  &lt;strong&gt;Not done.&lt;/strong&gt; Scrapped for time.&lt;/li&gt;
&lt;li&gt;Migrate unnecessary &lt;code&gt;package.json&lt;/code&gt; dependencies to dev-dependencies
  a.  &lt;strong&gt;Done.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Finally, &lt;strong&gt;create a PR!&lt;/strong&gt;
  a.  &lt;strong&gt;&lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1915"&gt;Done!&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So now that the microservice is finally up, I'm hoping for a lot of feedback. I still have things that I need to fix, though mostly minor things and documentation edits. I have a few tests that need to pass, and I'm hoping to make the time for it this week around my work schedule. I'd also like to expand on how exactly to test the PR on the PR page. Sometimes it's hard to translate what little goes on in my head, to fingers and keyboard.&lt;/p&gt;

&lt;p&gt;Something else that needs answers that I didn't think about until now: How do I ensure my delete route can only be ran by admins? Any fellow proletariat can execute &lt;del&gt;the bourgeoisie&lt;/del&gt; a delete route and delete a bunch of users. Questions, questions that need answers and riddles in the dark.&lt;/p&gt;

&lt;p&gt;Minor list of things that did dun need doing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Create a &lt;code&gt;env.production&lt;/code&gt; and &lt;code&gt;env.staging&lt;/code&gt; file&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Clean up the readme&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fix the Dockerfile&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a section on how to test the PR (on the PR page)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fix the failing tests&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Expected value:  {&lt;strong&gt;"displayName": "Galileo Galilei",&lt;/strong&gt; "feeds": ["&lt;a href="https://dev.to/feed/galileogalilei%22"&gt;https://dev.to/feed/galileogalilei"&lt;/a&gt;], "firstName": "Galileo", "github": {"avatarUrl": "&lt;a href="https://avatars.githubusercontent.com/u/7242003?s=460&amp;amp;u=733c50a2f50ba297ed30f6b5921a511c2f43bfee&amp;amp;v=4"&gt;https://avatars.githubusercontent.com/u/7242003?s=460&amp;amp;u=733c50a2f50ba297ed30f6b5921a511c2f43bfee&amp;amp;v=4&lt;/a&gt;", "username": "galileogalilei"}, "id": 10001, "isAdmin": true, "isFlagged": true, "lastName": "Galilei"}
vs.&lt;/li&gt;
&lt;li&gt;Received object: {"feeds": ["&lt;a href="https://dev.to/feed/galileogalilei%22"&gt;https://dev.to/feed/galileogalilei"&lt;/a&gt;], "firstName": "Galileo", "github": {"avatarUrl": "&lt;a href="https://avatars.githubusercontent.com/u/7242003?s=460&amp;amp;u=733c50a2f50ba297ed30f6b5921a511c2f43bfee&amp;amp;v=4"&gt;https://avatars.githubusercontent.com/u/7242003?s=460&amp;amp;u=733c50a2f50ba297ed30f6b5921a511c2f43bfee&amp;amp;v=4&lt;/a&gt;", "username": "galileogalilei"}, "id": 10001, "isAdmin": true, "isFlagged": true, "lastName": "Galilei"}&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How are we going to do security?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Switch my port to 7777 since &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1833/files#diff-4e3af2b0cd9bb7198b4b3aa1fcd33b2e6233eb335c90b79c132c5ea4f4f83720R107"&gt;SOMEONE&lt;/a&gt; took my satanic panic port 6666, my disappointment is immeasurable and my day Is ruined.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Oh, and I just reviewed &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1833"&gt;Tony's microservice&lt;/a&gt;! I unfortunately missed out on Abdul's and I kept my head buried in the sand for the last week or so trying to finish this up, so I'm glad I got to play around with someone else's. &lt;a href="https://www.npmjs.com/package/got"&gt;Got&lt;/a&gt; looks like a sweet library, that plus celebrate is really turning me towards NodeJS development.&lt;/p&gt;

&lt;p&gt;Anyway that's it for me right now. Fun but busy week, and as always looking forward to the next one.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>helphowdoiwritetags</category>
      <category>traefik</category>
      <category>docker</category>
    </item>
    <item>
      <title>Hackathon update!</title>
      <dc:creator>Chris Pinkney</dc:creator>
      <pubDate>Sat, 06 Mar 2021 03:34:42 +0000</pubDate>
      <link>https://dev.to/chrispinkney/hackathon-update-2mng</link>
      <guid>https://dev.to/chrispinkney/hackathon-update-2mng</guid>
      <description>&lt;p&gt;Today marks the closing of my Hackathon week, &lt;em&gt;aka the week where I neglected everything in the world, while hacking away on an app.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This week my partner and I participated in Seneca's Hackathon. It was an amazing experience that I highly recommend if you're looking to get humbled, to have a good time, or both. Preferably both. The hackathon featured keynote speakers, mentors, advice panels, and late night mixers!&lt;/p&gt;

&lt;p&gt;There were &lt;a href="http://www.senecahackathon.com/challengesets"&gt;several categories&lt;/a&gt; to participate in, but my partner and I decided to participate in the &lt;em&gt;Digital Health/Vaccination Passport to Support category&lt;/em&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Enable organizations to verify health credentials for employees, students, customers, and visitors entering their site based on criteria specified by the organization. Privacy and integrity is central to the solution, and the digital wallet can allow individuals to maintain control of their personal health information and share it in a way that is secured, verifiable, and trusted. Participants can attempt to model processes to implement contact-tracing using digital health passports, to identify other individuals who accessed the same spaces/areas in a set period. Sponsors will provide instances and technical support for teams.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every team in this category was given the following challenge (but given leeway to be as creative as possible while still maintaining the objectives outlined):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your challenge here is to make it simple, safe and secure to check vaccination status of individual and help institutions such as your school or office to verify it, to ensure safety of the people returning to them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here is my mockup of the app I wanted to design:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sGs00Oyv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y1e8u7dwsqhbijzzrwk0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sGs00Oyv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y1e8u7dwsqhbijzzrwk0.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Given that this is a category centered around privacy and integrity (&lt;em&gt;two things which I value&lt;/em&gt;) naturally, this category spoke to me. It also seemed relatively easy given the uh... current climate of things around the world right now. My team's idea was to have a security and privacy centric app which allows users to quickly and easily display their vaccination and disease testing history with just a few clicks on a screen, which then spits out a QR code for easy reading and verification. We also wanted the app to also educate users on vaccines and diseases.&lt;/p&gt;

&lt;p&gt;Luckily my wonderful girlfriend Hope curated information about various diseases (as advocated by the Ontario and Canadian government.) Another thing I wanted to focus on was life after COVID, so my team and I ensured the app also supported a wide variety of other diseases, such that the app doesn't succumb to a simple life of bit rot after &lt;em&gt;this&lt;/em&gt; is all over. Over the three days of the hackathon I personally spent about 25-30 hours working on the app.&lt;/p&gt;

&lt;p&gt;While we didn't win (and am too embarrassed to post the source code &lt;em&gt;which is not hard to find&lt;/em&gt;) I really enjoyed my time and can't wait for the next one. My only two regrets is that it couldn't be held in person, and that I'll be graduating soon, meaning I'll be unable to participate in the next hackathon.&lt;/p&gt;

&lt;p&gt;The hackathon was sponsored by Salesforce, Sightline Innovation, Microsoft, and others. I attended two keynotes speeches during my time, both very interesting, particularly the talk from a Microsoft CFO regarding the state of IOT and various industries facing integration and challenges . I have no experience in IOT but embedded devices are something that I've always wanted to get involved with. I asked a question during the keystone on how to get involved and was told to "pick up a raspberry pi and start hacking" (paraphrased.) So hey, maybe I'll do that?&lt;/p&gt;

&lt;p&gt;10/10 experience, highly recommend. I'm excited to attend another hackathon outside of my school.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>github</category>
      <category>hackathon</category>
      <category>coffee</category>
    </item>
    <item>
      <title>Insert catchy title here!</title>
      <dc:creator>Chris Pinkney</dc:creator>
      <pubDate>Sat, 27 Feb 2021 01:52:30 +0000</pubDate>
      <link>https://dev.to/chrispinkney/insert-catchy-title-here-5436</link>
      <guid>https://dev.to/chrispinkney/insert-catchy-title-here-5436</guid>
      <description>&lt;p&gt;I let this week get away from me due to all the chaos that comes from midterms. Ah well, so much for inbox 0.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ifBg9C9X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4w0lbgvmfe7mb66hj7ua.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ifBg9C9X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4w0lbgvmfe7mb66hj7ua.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Without further ado (&lt;em&gt;i.e. excuses&lt;/em&gt;,) let's begin with what went down this week on the admin side of Telescope.&lt;/p&gt;

&lt;p&gt;​ On Wednesday it was discovered that our new Telescope builds were failing to deploy to our staging server &lt;em&gt;despite&lt;/em&gt; our CI being all green across the board:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Copying API_URL=https://dev.telescope.cdot.systems to NEXT_PUBLIC_API_URL
Using NEXT_PUBLIC_API_URL=https://dev.telescope.cdot.systems
info  - Creating an optimized production build...

Failed to compile.

./src/components/Posts/Post.tsx:101:54
Type error: Argument of type '{ month: string; day: string; year: string; }' is not assignable to parameter of type 'DateTimeFormatOptions'.
  Types of property 'year' are incompatible.
    Type 'string' is not assignable to type '"numeric" | "2-digit" | undefined'.
   99 |   const date = new Date(dateString);
  100 |   const options = { month: 'long', day: 'numeric', year: 'numeric' };
&amp;gt; 101 |   const formatted = new Intl.DateTimeFormat('en-CA', options).format(date);
      |                                                      ^
  102 |   return `Last Updated ${formatted}`;
  103 | };
  104 | 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The failing file was &lt;code&gt;Post.tsx&lt;/code&gt;, which strangely enough, was not touched for about 10 days. The builds were building just fine otherwise, it wasn't until we tried to build Telescope using Docker that we discovered the failure.&lt;/p&gt;

&lt;p&gt;The fix was even stranger (old vs fix):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dateString&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;month&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;long&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;day&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;numeric&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;year&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;numeric&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;formatted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Intl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DateTimeFormat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;en-CA&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;vs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dateString&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;formatted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Intl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DateTimeFormat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;en-CA&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;month&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;long&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;day&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;numeric&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;year&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;numeric&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nx"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I laughed about it with Josue before approving the fix 🤷 The lesson: have your CI deploy using the same tech as your prod server. Our CI does not build, run , and test using Docker and that's where the disconnect came from. One failed using Docker, and one did not.&lt;/p&gt;

&lt;p&gt;Thanks Doc Josue!&lt;/p&gt;

&lt;p&gt;​ I also &lt;em&gt;minorly&lt;/em&gt; &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1833"&gt;reviewed Tony's microservice&lt;/a&gt;. I didn't end up testing it locally, it's on my list of things to do tomorrow after work. It's great to see another microservice popping up that I can look at and borrow (&lt;del&gt;steal&lt;/del&gt;) ideas from. Currently looking forward to more of this, plus Abdul's and Professor Dave's stuff.&lt;/p&gt;




&lt;h3&gt;
  
  
  User Microservice Update
&lt;/h3&gt;

&lt;p&gt;Several updates happened this week to my microservice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I finally got Firebase to work offline.

&lt;ul&gt;
&lt;li&gt;It took a lot of trial and error, and blog posts mostly. I'm still not that great at reading technical instruction documentation.&lt;/li&gt;
&lt;li&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pSPXvYlM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/28iay8uzju2zv51jclsh.png" alt="Alt Text"&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;This means I can implement testing!

&lt;ul&gt;
&lt;li&gt;Since the db can now be manipulated offline, I can add and delete data to ensure that when we use the actual &lt;u&gt;production&lt;/u&gt; version of the db, all our code that we've developed will work as intended.&lt;/li&gt;
&lt;li&gt;This also means that I can now start writing unit tests to ensure a solid relationship between Express and Firestore. &lt;/li&gt;
&lt;li&gt;The whole experience of this two pronged attack (offline mode + testing) has been really enlightening, it really displayed how quickly a prototype can be created, demoed, and implemented using some basic tooling. It doesn't matter if your db is on or offline, if you can test it then the code you created is &lt;strong&gt;guaranteed&lt;/strong&gt; to work on a production version (sans outside interference from other tools like nginx, firewalls, etc.)&lt;/li&gt;
&lt;li&gt;I added several basic unit-tests using Supertest (after failing an initial attempt using &lt;a href="https://www.npmjs.com/package/got"&gt;Got&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also got some really great feedback and direction from a little demo I presented to Professor X. Let's take a look (and laugh) at this week's goals from &lt;a href="https://dev.to/chrispinkney/il-meglio-e-l-inimico-del-bene-25f2"&gt;last week's blog post&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;del&gt;Get testing working with the emulator and Jest&lt;/del&gt; Done!&lt;/li&gt;
&lt;li&gt;Implement &lt;a href="https://github.com/Seneca-CDOT/satellite"&gt;Satellite&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Create some basic README.md files&lt;/li&gt;
&lt;li&gt;
&lt;del&gt;Export my private key to &lt;code&gt;.env&lt;/code&gt; (&lt;em&gt;was having trouble with this last week&lt;/em&gt;)&lt;/del&gt; Not possible in this form&lt;/li&gt;
&lt;li&gt;
&lt;del&gt;Figure out how to utilize my &lt;code&gt;User&lt;/code&gt; class/schema&lt;/del&gt; Will likely be deleted&lt;/li&gt;
&lt;li&gt;Create an update route&lt;/li&gt;
&lt;li&gt;Create a delete route&lt;/li&gt;
&lt;li&gt;Add date/time users were created (&lt;em&gt;mostly for funsies&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Add date/time users were updated (&lt;em&gt;again, for funsies&lt;/em&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HMX1O2dc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mk9yz0jm80n5bz7pttue.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HMX1O2dc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mk9yz0jm80n5bz7pttue.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the updated todo list that I want to get done between now and our next big release (&lt;em&gt;&lt;a href="https://github.com/Seneca-CDOT/telescope/wiki/Winter-2021---Telescope-2.0"&gt;1.8 - March 12th 2021&lt;/a&gt;&lt;/em&gt;):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Finish up making some more tests, specifically ones that test Celebrate's validation rules&lt;/li&gt;
&lt;li&gt;Migrate to &lt;a href="https://www.npmjs.com/package/@firebase/rules-unit-testing"&gt;https://www.npmjs.com/package/@firebase/rules-unit-testing&lt;/a&gt; because &lt;code&gt;@firebase/testing&lt;/code&gt; is deprecated&lt;/li&gt;
&lt;li&gt;Create a basic README.md file&lt;/li&gt;
&lt;li&gt;Implement a list of current deficiencies and issues to discuss when the draft PR goes up&lt;/li&gt;
&lt;li&gt;Implement &lt;a href="https://github.com/Seneca-CDOT/satellite"&gt;Satellite&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dockerize the microservice&lt;/li&gt;
&lt;li&gt;Add Firestore private key placeholders to  &lt;code&gt;env.production&lt;/code&gt; and &lt;code&gt;env.staging&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Tidy up the &lt;code&gt;package.json&lt;/code&gt; run commands using &lt;a href="https://www.npmjs.com/package/npm-run-all"&gt;npm-run-all&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Create an update (&lt;em&gt;put&lt;/em&gt;) route&lt;/li&gt;
&lt;li&gt;Create a delete route&lt;/li&gt;
&lt;li&gt;Add date/time users were created (&lt;em&gt;mostly for funsies&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Add date/time users were updated (&lt;em&gt;again, for funsies&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Migrate unnecessary &lt;code&gt;package.json&lt;/code&gt; dependencies to dev-dependencies&lt;/li&gt;
&lt;li&gt;Finally, &lt;strong&gt;create a draft PR!&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I think that about does it for me this week. Hoping to get some more done next blog post to show off.&lt;/p&gt;




&lt;p&gt;Other news:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I got an Aeropress on sale this week and some ground coffee at a local coffee shop, I'll never go back to my &lt;a href="https://en.wikipedia.org/wiki/Keurig#Corporate_affairs"&gt;Kureig&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;I think midterm week went okay for me. 🤞&lt;/li&gt;
&lt;li&gt;I'm participating in &lt;a href=""&gt;Seneca's hackathon&lt;/a&gt; next week! It's my first and I'm hoping it'll be a lot of fun.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>opensource</category>
      <category>toolazyfortitles</category>
    </item>
    <item>
      <title>Il meglio è l'inimico del bene</title>
      <dc:creator>Chris Pinkney</dc:creator>
      <pubDate>Sat, 20 Feb 2021 04:49:06 +0000</pubDate>
      <link>https://dev.to/chrispinkney/il-meglio-e-l-inimico-del-bene-25f2</link>
      <guid>https://dev.to/chrispinkney/il-meglio-e-l-inimico-del-bene-25f2</guid>
      <description>&lt;p&gt;​ Another week done, another week in review. I'll talk first about my week then the progress I'm making with the User Microservice.&lt;/p&gt;

&lt;p&gt;​ I started my &lt;strong&gt;Saturday&lt;/strong&gt; off with a review on this &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1692"&gt;minor PR here&lt;/a&gt; from Tony. MUI is really neat and I'd love to learn more about it, I love the idea of having a global theme and utilizing it throughout your entire web app. CSS libraries are spiffy.&lt;/p&gt;

&lt;p&gt;​ &lt;strong&gt;Sunday&lt;/strong&gt; Funday came around and I started it off by testing a &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1606"&gt;PR from Mo&lt;/a&gt; which I concluded with adding instructions on how to test the changes locally. Unfortunately the PR was ultimately closed (as we no longer use Gatsby) but sometimes this is the nature in software development. Hell, most of Google's crap is removed several months after launching, I wonder how those engineers feel about that.&lt;/p&gt;

&lt;p&gt;I concluded my Sunday reviews by &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1701"&gt;testing this bug fix&lt;/a&gt; which was driving me up the wall every time I noticed it. Ilya does a lot of these little bug fixes which overtime increase the overall UX of our app. Love it.&lt;/p&gt;

&lt;p&gt;​ &lt;strong&gt;Monday&lt;/strong&gt; rolls around and I starting work on a &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1691"&gt;pagebase&lt;/a&gt; that I can use for the About page that I designed using MDX.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I originally intended to dynamically render each and every doc in our app's &lt;a href="https://github.com/Seneca-CDOT/telescope/tree/master/docs"&gt;doc folder&lt;/a&gt; using the &lt;a href="https://nextjs.org/docs/routing/dynamic-routes"&gt;dynamic routes&lt;/a&gt; feature of NextJS. With a similar layout (i.e. pagebase) each document will look the same when it's rendered. I want to get around to working on this but my primary focus right now is to finish the User Microservice.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I ran into an issue early on and couldn't for the life of me figure out how to make the &lt;code&gt;.mdx&lt;/code&gt; file inherent the styles I passed but everything else is fine. I eventually had an idea to throw all the content into an &lt;code&gt;about.md&lt;/code&gt; file and just &lt;code&gt;import&lt;/code&gt; it in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;MDXPageBase&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../pages/layouts/MDXPageBase&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;About&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../markdown-pages/about.md&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;AboutPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;MDXPageBase&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'About Us'&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;About&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;MDXPageBase&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;AboutPage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The pagebase's code (&lt;code&gt;MDXPageBase&lt;/code&gt;) can be viewed &lt;a href="https://github.com/Seneca-CDOT/telescope/blob/master/src/frontend/next/src/pages/layouts/MDXPageBase.tsx"&gt;here&lt;/a&gt;. I also might have reviewed my own PR:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BkQkxIkc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ns0zt64qzwgxr615bube.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BkQkxIkc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ns0zt64qzwgxr615bube.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I spent a bit more time working on this on &lt;strong&gt;Tuesday&lt;/strong&gt;/Wednesday and finally made &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1769"&gt;the PR&lt;/a&gt; on Wednesday. I also got some great help from Anton with a really neat use of destructuring to shorten some repeated code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;palette&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;main&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I also discovered &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1780"&gt;a new bug&lt;/a&gt; with out GitHub Contributors card which (thankfully) ol' reliable Ilya expressed interest in fixing.&lt;/p&gt;

&lt;p&gt;​ &lt;strong&gt;Wednesday&lt;/strong&gt;. Finished up pagebase for with some help from Tony (and a really great &lt;a href="https://www.carlrippon.com/react-children-with-typescript/"&gt;types link&lt;/a&gt; from Pedro.) I spent so long screwing around trying to get the theme working and just right in &lt;code&gt;MDXPageBase&lt;/code&gt; so thank the gods for Tony, big shout out to him for the fix. Sent my PR and moved onto the next issue. &lt;em&gt;Submitting a PR still makes me feel nervous.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Anyway, I then started working on &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1655"&gt;my little SEO fix&lt;/a&gt; and jeez talk about a rabbit hole. &lt;strong&gt;This was supposed to be a 5 minute fix!&lt;/strong&gt; It was anything but:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I started off by exploring all uses of &lt;code&gt;meta&lt;/code&gt; tags in each and every component including the ones inside our  &lt;code&gt;_document&lt;/code&gt; &lt;a href="https://github.com/Seneca-CDOT/telescope/blob/master/src/frontend/next/src/pages/_document.tsx"&gt;file&lt;/a&gt;.

&lt;ul&gt;
&lt;li&gt;I figured the smart play was to move the &lt;code&gt;&amp;lt;Head&amp;gt;&lt;/code&gt; code (&lt;em&gt;along with all its the accompanying &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; tags&lt;/em&gt;) from &lt;code&gt;_document&lt;/code&gt; to the SEO component because SEO renders &lt;code&gt;&amp;lt;Head&amp;gt;&lt;/code&gt; and additional &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; tags. This didn't work (&lt;em&gt;see point 2.&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;I then tried another approach, removing all &lt;code&gt;&amp;lt;Head&amp;gt;&lt;/code&gt; calls in SEO and returning only the &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; tags, which would allow something like the following: &lt;code&gt;&amp;lt;Head&amp;gt;&amp;lt;SEO/&amp;gt;&amp;lt;/Head&amp;gt;&lt;/code&gt;. Also didn't work:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;TypeError: Cannot destructure property 'pathname' of 'Object(...)(...)' as it is null.&lt;/code&gt; Seems that &lt;code&gt;_document&lt;/code&gt; doesn't like the use of &lt;code&gt;const { pathname } = useRouter();&lt;/code&gt;. It only turned out then that I noticed the import for &lt;code&gt;&amp;lt;Head&amp;gt;&lt;/code&gt; was different in &lt;code&gt;_document&lt;/code&gt; and SEO... &lt;code&gt;import Head from 'next/document'&lt;/code&gt; vs &lt;code&gt;import Head from 'next/head';&lt;/code&gt; So off to Google I went to discover the difference and if one or the other was unneeded (though at this point I started to panic, I started to feel as though there was no work around and we just have to have some sort of repeated code):&lt;/li&gt;
&lt;li&gt;For the curious reader: this &lt;a href="https://github.com/vercel/next.js/issues/13230"&gt;link&lt;/a&gt; was super helpful, and this &lt;a href="https://github.com/vercel/next.js/discussions/12290"&gt;link&lt;/a&gt; was too. Turns out both &lt;code&gt;&amp;lt;Head&amp;gt;&lt;/code&gt;s have separate purposes and as a result I think all the &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; tags should stay as is and a minor tidy-up can take place in its stead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.youtube.com/watch?v=cdEQmpVIE4A"&gt;Disappointed!&lt;/a&gt;&lt;/strong&gt; Thought I was on this really great refactor kick and now my PR is only going to contain... well, &lt;em&gt;a 5 minute fix&lt;/em&gt;. I spent way longer on this than I should have but I learned some really interesting things about NextJS. I hung my head in shame, remade my branch, and started back refactoring SEO in place of all &lt;code&gt;&amp;lt;Head&amp;gt;&lt;/code&gt; (&lt;code&gt;next/head&lt;/code&gt;) calls, and &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1774"&gt;made my PR&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;​ &lt;strong&gt;Thor's-day&lt;/strong&gt;. Tony and I discovered that our CI pipeline started to fail at around 11am or so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm ERR! code ETARGET
npm ERR! notarget No matching version found for @graphql-tools/merge@^6.2.8.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! notarget 
npm ERR! notarget It was specified as a dependency of '@graphql-tools/load'
npm ERR! notarget 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We all discussed reasons for this and I did some digging around trying to find some info from GraphQL-Tools as to why and found &lt;a href="https://github.com/ardatan/graphql-tools/issues/2615"&gt;this&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Also got some sage wisdom regarding this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;humphd  12:32 PM
it's a dep of a dep

humphd  12:32 PM
and npm is picking a patch release that doesn't exist

Anton Biriukov  12:33 PM
but if did not update our dep in the first place, how could've their dep got updated (which broke it)?
each package has to release a new version to update its own deps, right?

Abdulbasid Guled  12:34 PM
This is something I need to research, if dependencies within dependencies update on their own?

Anton Biriukov  12:34 PM
I was under impression that they should not

humphd  12:35 PM
they do with the lock file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cool. TIL. A really bad day for someone on either the GraphQL team, or NPM, as GraphQL is pointing the finger at NPM for the reason their build failed. Pretty funny how a minor issue like this could affect potentially thousands of Gatsby and pages using GraphQL.&lt;/p&gt;

&lt;p&gt;​ I also reviewed &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1777"&gt;yet another MUI related PR&lt;/a&gt; from Tony.&lt;/p&gt;

&lt;p&gt;​ &lt;strong&gt;Friday&lt;/strong&gt;. Today. Our rush day I spent most of the morning prepping for our meeting, reviewing PRs, and catching up on the status of the project and our 1.7 release. Quick approvals in no particular order: &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1785"&gt;This&lt;/a&gt;, &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1746"&gt;this&lt;/a&gt;, &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1787"&gt;this&lt;/a&gt;, and &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1782"&gt;this&lt;/a&gt;. We all got a lot of work in this week and FINALLY shipped Telescope using only NextJS and TypeScript. Great for us, bad for all the students hard work that came before us. I can't wait until the next group of students hopefully does the same to us. We have a few minor bandaids to apply but for better or worse our mark remains on Telescope for the forseeable future.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The cycle of software continues evermore.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  User Microservice
&lt;/h3&gt;

&lt;p&gt;​ I tried to spend some time this week working on my User Microservice, though my primary focus being on getting my two other PRs in before 1.7.&lt;/p&gt;

&lt;p&gt;Anyway, my focus for this week was to at least get Celebrate in and working as intended. I came across a really solid blog post by celebrate's creator &lt;a href="https://medium.com/@adambretz/time-to-celebrate-27ccfc656d7f"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What is Celebrate?&lt;/p&gt;

&lt;p&gt;celebrate is an express middleware function that wraps the joi validation library. This allows you to use this middleware in any single route, or globally, and ensure that all of your inputs are correct before any handler function.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A little backstory on the situation:  &lt;em&gt;I currently have a mini express server which will be making calls to a Firestore database, and receiving calls from a frontend containing data from users. Naturally, we have to ensure that the data being persisted is as clean as possible.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;celebrate is &lt;strong&gt;perfect&lt;/strong&gt; for this because it's flexible to utilize route validate either globally or specifically per route. I actually want to implement this globally in my capstone project as we use Passport and Google's OAuth ids, coupled with state to send and receiving data to our db, and for making payments via Stripe. Ensuring that a user currently has a valid ID in ALL backend calls can prevent anyone from using postman to persist garbage to our db.&lt;/p&gt;

&lt;p&gt;Anyway, I spent a while working on celebrate and kept bashing my head against a wall as I just couldn't get the post route to cooperate with celebrate. I was doing everything right! Every post, every document, I even google'd other projects using celebrate. It looked fine! What was the issue?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SJC8TKXc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/otdk4ey7tz8c9ckzvti2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SJC8TKXc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/otdk4ey7tz8c9ckzvti2.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Oversight. Oversight was the issue. It turns out the issue was &lt;code&gt;router.use(bodyParser.urlencoded({ extended: true }));&lt;/code&gt; &lt;em&gt;vs&lt;/em&gt; &lt;code&gt;router.use(bodyParser.json());&lt;/code&gt;... for some reason I just assumed that the former contained that latter and thus I didn't need to specify &lt;code&gt;bodyParser.json()&lt;/code&gt; Stupid. &lt;strong&gt;Really&lt;/strong&gt; stupid. At least I got some wonderous sage wisdom (after wasting his time too in an attempt to help): &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;humphd  5:58 PM&lt;br&gt;
don't stop your progress&lt;br&gt;
just keep track of defects, write a test and add .skip() on it&lt;br&gt;
&lt;u&gt;perfect is the enemy of the good&lt;/u&gt;&lt;br&gt;
the thing with how we do open source is that you acknowledge your bugs, and iterate to fix them&lt;br&gt;
vs. only shipping when it's ready&lt;br&gt;
ship all the time, and file then fix&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One bug down, one to go:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/user/:id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;celebrate&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Segments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PARAMS&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Joi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;required&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;userRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;202&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;GET &lt;a href="http://localhost:5555/user/123"&gt;http://localhost:5555/user/123&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;yields the following error: &lt;code&gt;Error: Value for argument &amp;amp;quot;documentPath&amp;amp;quot; is not a valid resource path. Path must be a non-empty string.&lt;/code&gt; which goes away when not using the celebrate middleware, and a user is retrieved successfully. I didn't let this slow me down and instead tried programming defensively for the time being:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/user/:id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;celebrate&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Segments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PARAMS&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Joi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;required&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;userRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

      &lt;span class="c1"&gt;// placeholder if else until i can figure out celebrate&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`User data (id: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;) was requested by &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; but could not be found.`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
          &lt;span class="na"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`User data (id: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;) was requested but could not be found.`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="s2"&gt;`User data (id: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;) was requested by &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; and served successfully.`&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;202&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a weird Firestore issue, my first instinct is that celebrate is converting the param &lt;code&gt;123&lt;/code&gt; to a string or something funky. Unsure. It console logs as a number though so I'm not sure. Regardless, I'll actually listen for once and come back to this at a later time and date.&lt;/p&gt;

&lt;p&gt;I also read a best practices doc from Google regarding Firestore which can be seen &lt;a href="https://cloud.google.com/firestore/docs/best-practices"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I also wanted to write an update route for users, but it turns out that you can attach &lt;code&gt;{ merge: true }&lt;/code&gt; to a post request and send it off to Firestore to achieve very similar results. A found good link &lt;a href="https://stackoverflow.com/questions/46597327/difference-between-set-with-merge-true-and-update"&gt;here&lt;/a&gt; explaining the difference, however I still think making a &lt;code&gt;put&lt;/code&gt; / &lt;code&gt;patch&lt;/code&gt; route is the way to approach this scenario as: &lt;code&gt;update will update fields, but will fail if the document doesn't exist.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I also thought of exporting the celebrate schema that I'm using in both the &lt;code&gt;get&lt;/code&gt; and &lt;code&gt;post&lt;/code&gt; and throwing them into &lt;code&gt;/config/celebrate.js&lt;/code&gt; file or something, so I can import it and make my requests a bit easier to read and understand (plus it'll look cooler):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;celebratePost&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./config/celebrate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;celebratePost&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="kd"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Added user with id: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:\n&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Added user with id: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:\n&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;but this is just an idea I'm playing around with in my head. I'll probably forget about it right after I finish this blog post and never do it. We'll see.&lt;/p&gt;

&lt;p&gt;I also started looking into Firebase Emulator. This major step is in its very early stages and I'm unsure how this will work with Jest, but I'm going to fart around with it all next week and hopefully have some progress to report back on. I also got Firestore to run locally, which is really sweet:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--I2pBRJHR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aq69o4of3ylrgtgcieyu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--I2pBRJHR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aq69o4of3ylrgtgcieyu.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That about does it for me this week. It was busy and I think I got a lot done. I wanted to get more work into my microservice but c'est la vie. I'm hoping next week will be a major milestone for and I'll have a draft PR to present to the world.&lt;/p&gt;

&lt;p&gt;Next week's microservice todo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get testing working with the emulator and Jest&lt;/li&gt;
&lt;li&gt;Implement &lt;a href="https://github.com/Seneca-CDOT/satellite"&gt;Satellite&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Create some basic README.md files&lt;/li&gt;
&lt;li&gt;Export my private key to &lt;code&gt;.env&lt;/code&gt; (&lt;em&gt;was having trouble with this last week&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Figure out how to utilize my &lt;code&gt;User&lt;/code&gt; class/schema&lt;/li&gt;
&lt;li&gt;Create an update route&lt;/li&gt;
&lt;li&gt;Create a delete route&lt;/li&gt;
&lt;li&gt;Add date/time users were created (&lt;em&gt;mostly for funsies&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Add date/time users were updated (&lt;em&gt;again, for funsies&lt;/em&gt;)&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;In Other News:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Found this really neat program &lt;a href="https://microsoft.github.io/react-native-windows/"&gt;here&lt;/a&gt; that converts a React Native frontend to a Windows/Mac app. I'm really interested in App development but have no experience in it at all. I want to pick up Java/Kotlin and Swift but figure React Native is the next best thing. And this is cool as hell.&lt;/li&gt;
&lt;li&gt;Gojira &lt;a href="https://www.youtube.com/watch?v=3p85-KtgDSs"&gt;released a new song&lt;/a&gt; on their upcoming album.&lt;/li&gt;
&lt;li&gt;Found out about &lt;a href="https://skyline.github.com/chrispinkney/2020"&gt;GitHub's skyline feature&lt;/a&gt;. Amazingly, you can export the render to an STL file, this making it 3d printable. I'll be trying to print it this week I think. Hopefully I can show it off next Friday.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://twitter.com/NASAPersevere/status/1362507436611956736"&gt;We landed another fricken rover on Mars&lt;/a&gt;. I saw the livestream of it being launched around my birthday last year and set a reminder for this this week to watch it. Nasa even released the approximate time it would land on the Red Planet, and amazingly it was right. Isn't that insane?&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>opensource</category>
    </item>
    <item>
      <title>Putting the 'Micro' in Microbrain</title>
      <dc:creator>Chris Pinkney</dc:creator>
      <pubDate>Sat, 13 Feb 2021 03:33:43 +0000</pubDate>
      <link>https://dev.to/chrispinkney/putting-the-micro-in-microbrain-4hp6</link>
      <guid>https://dev.to/chrispinkney/putting-the-micro-in-microbrain-4hp6</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yZlp76sg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fk3ygbsg4bgssf21ggoe.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yZlp76sg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fk3ygbsg4bgssf21ggoe.jpg" alt="Microbrain"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://memory-alpha.fandom.com/wiki/Microbrain_(insult)"&gt; Microbrain &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;...And we're back.&lt;/p&gt;

&lt;p&gt;From outer space.&lt;/p&gt;

&lt;p&gt;I just walked in to find you here with that sad look upon your face.&lt;/p&gt;




&lt;p&gt;​ Monday-funday rolls around and I started the week off working on my &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1651"&gt;About page issue&lt;/a&gt;. I'm finding this issue to be unexpectedly challenging, mostly due to the fact that my NextJS knowledge is not great, plus I'm trying to figure out how to style an MDX page using a combination of &lt;a href="https://github.com/Seneca-CDOT/telescope/blob/master/src/frontend/gatsby/src/pages/PageBase.js"&gt;Pagebase&lt;/a&gt; and &lt;a href="https://github.com/Seneca-CDOT/telescope/blob/master/src/frontend/gatsby/src/templates/template.js"&gt;template&lt;/a&gt; at the same time, as our previous about page for Telescope was comprised of both pieces. In essence, my problem resolves around the fact that I can't just wrap plain markdown in an MUI theme. So right now I'm trying to import the about page content separately and style the entire &lt;code&gt;about.mdx&lt;/code&gt; page. But this too is being problematic, yet also opportunistic. If I can solve this issue, I'll be able to simply import all of our other documents  in our &lt;code&gt;docs&lt;/code&gt; folder and render them accordingly.&lt;/p&gt;

&lt;p&gt;However during our last triage meeting on Tuesday Royce raised a question asking if we can re-implement Pagebase, so He, Anton, Ilya and myself are going to have a meeting to &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1691"&gt;discuss how to implement that&lt;/a&gt;. This might be a better alternative for me, and will probably be more elegant that the current spaghetti I'm cooking up. Mmmmm pasta.&lt;/p&gt;

&lt;p&gt;​ Tuesday rolls around and and I'm still practicing away with my goal of GitHub inbox zero, all notifications clear and unfortunately all the fishy PRs have been hooked, lined, and sinker'd already. Hoping my pole snatches a few before the end of the week. In other news, &lt;a href="https://medium.com/@pedrofonsecadev"&gt;Pedro's&lt;/a&gt; new design is &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1676"&gt;looking REALLY nice&lt;/a&gt; and I'm really interested to see more.&lt;/p&gt;

&lt;p&gt;We had a great triage meeting as usual, this week &lt;a href="https://github.com/Seneca-CDOT/telescope/wiki/Triage-Meeting-February-09th,-2021"&gt;I was the desinated taker of &lt;del&gt;lives&lt;/del&gt; notes&lt;/a&gt;, and I think I organized them pretty well all things considered.&lt;/p&gt;

&lt;p&gt;​ Wednesday, everyone's least favourite day. Today I started working on a small &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1655"&gt;meta tags issue&lt;/a&gt; that I raised a few days ago. I found that we're using &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;Head&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt;, both, neither, or using our SEO component, incorrectly. So I'm hoping to fix these smaller issues with this PR. As &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; tags also relate to &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1608"&gt;Accessibility&lt;/a&gt;, Anton's domain, I spoke to him about this as not to step on any toes, he gave me his blessing so I got to work. The way this week is looking I'll have the PR ready today or sometime later.&lt;/p&gt;

&lt;p&gt;I'm also starting to review &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1606"&gt;an older PR by Mo&lt;/a&gt;, which adds a neat frontend variable, a topic which I somehow always struggled with during the few times that I've tried to implement it. I made a comment on and I'll get back to it ASAP.&lt;/p&gt;

&lt;p&gt;​ Thursday. I reviewed &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1694"&gt;another PR&lt;/a&gt; from Mo and had to do &lt;a href="https://stackoverflow.com/questions/66020820/npm-when-to-use-force-and-legacy-peer-deps/66035709"&gt;some&lt;/a&gt; &lt;a href="https://github.com/npm/rfcs/issues/218"&gt;light&lt;/a&gt; &lt;a href="https://docs.npmjs.com/cli/v7/commands/npm-install"&gt;research&lt;/a&gt; on what exactly &lt;code&gt;legacy-peer-deps&lt;/code&gt; does. I also finally made the time to start some light work with my User Microservice (see below.)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Having a peer dependency means that your package needs a dependency that is the same exact dependency as the person installing your package. This is useful for packages like &lt;code&gt;react&lt;/code&gt; that need to have a single copy of &lt;code&gt;react-dom&lt;/code&gt; that is also used by the person installing it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://classic.yarnpkg.com/en/docs/dependency-types"&gt;Source&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;​ Friday is here. I started off the morning by commenting on &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1695"&gt;a PR that adds documentation&lt;/a&gt;, and you know how much I love me sum documentation. Moving on, I spent some time trying to test &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1696"&gt;yet another one of Mo's PRs&lt;/a&gt; but for some reason I'm getting super strange errors. I followed up with Mo and everything looks fine on his end so I can only assume that it's something on my end. I was hoping to have a review for this up by today but Jest is not co-operating with me and I don't even know where to begin with these errors.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VO_N95Cd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/43iwy5dio2y4x61vi3i7.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VO_N95Cd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/43iwy5dio2y4x61vi3i7.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our meeting was cool, I enjoy all of our meetings but the demos that some of us put on on Fridays always give me something to go &lt;em&gt;ohhhhhh&lt;/em&gt;... &lt;em&gt;ahhhhhhhh&lt;/em&gt;.... &lt;em&gt;ouuuuuuuu&lt;/em&gt; at. We started off with Yuan and Anton demoing their respective works and investigations with Dependabot and Renovate. Both seem really cool. Dependabot is built into GitHub natively now, though Renovate seems more customizable (&lt;em&gt;and more advanced.&lt;/em&gt;) I've always wanted to implement Dependabot to some repo, so maybe I'll do it for my capstone project. Looking forward to see more Dependabot in action. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Edit&lt;/strong&gt;: &lt;em&gt;I regret everything. Bot-sama plz.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HcwikJFN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/yxbv3dyctvj3hnnnx0tr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HcwikJFN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/yxbv3dyctvj3hnnnx0tr.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Similarly, during the meeting I had a chance to demo my very (&lt;em&gt;minor&lt;/em&gt;) work that I've done on the User Microservice the group, and got some really great feedback and direction which I'll discuss below.&lt;/p&gt;

&lt;p&gt;I ended Friday with a little hangout session with Anton and Abdul where we spend an hour figuring out the best possible names for GitHub tags for Dependabot to use. It's &lt;strong&gt;very&lt;/strong&gt; serious business.&lt;/p&gt;




&lt;h4&gt;
  
  
  User Microservice
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;For those who didn't read last week's blog post:  I'm currently working with Anton on a way to &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1642"&gt;migrate a large list of data&lt;/a&gt; (Telescope users names and blog URLs) to an external database. The database we agreed to work with is Google's Firebase.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;​ Woohoo! I'm giving this current PR its own section because it's a lot to talk about (and also because I'm really excited about finally contributing something on the larger side to Telescope.) I had a meeting with Anton on Monday before our Triage meeting, which was a lot of fun, he's a great guy to work with. We partially scoped out the issue but had several questions we needed to raise during our meeting such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How does the current feed system work?&lt;/li&gt;
&lt;li&gt;How does Seneca's authentication work, and what does it return (and how can we leverage this data for our issue)?&lt;/li&gt;
&lt;li&gt;Since we're adding more data to the users (GitHub usernames &lt;em&gt;&amp;amp;&lt;/em&gt; Avatar URLs) what should we do about our "legacy" users which won't have this information on file (until they sign into Telescope again?)&lt;/li&gt;
&lt;li&gt;Do we want a user to store multiple feed URLs?&lt;/li&gt;
&lt;li&gt;How should we parse users with multiple names?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thankfully, all these questions (and more) got perfectly answered. We also got some feedback on what the user "schema" will look like (&lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1642#issuecomment-776922598"&gt;&lt;em&gt;which you can see here&lt;/em&gt;&lt;/a&gt;.) I'm still trying to find my mix between brevity and verbosity, currently leaning more towards the latter as my weird anxious mind (&lt;em&gt;imposter syndrome&lt;/em&gt;) makes me want to explain everything humanly possible (&lt;em&gt;to the detriment of others, mind you&lt;/em&gt;.)&lt;/p&gt;

&lt;p&gt;I'm very excited to start working on this, hopefully, if time permitting, I'll be starting on this later this week.&lt;/p&gt;

&lt;h5&gt;
  
  
  Feedback and Direction:
&lt;/h5&gt;

&lt;p&gt;As mentioned after Friday's show-and-tell, I got some good comments, concerns and directions to take this feature in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;So Firebase requires a private API key in order to authenticate the developer's working on the DB. I'm currently storing this key in a &lt;code&gt;.json&lt;/code&gt; file, which is pretty redundant given that we have a perfectly good &lt;code&gt;.env&lt;/code&gt; file to utilize.

&lt;ul&gt;
&lt;li&gt;After the meeting I went to try and implement the in the main &lt;code&gt;.env&lt;/code&gt; file but ran into a few blockers:&lt;/li&gt;
&lt;li&gt;The JSON key is too large to fit inside of a single-lined string.&lt;/li&gt;
&lt;li&gt;Furthermore, I couldn't even import any environment values as they were all being listed as &lt;code&gt;undefined&lt;/code&gt;. I wanted to look into this further but used enough time as it is so I dropped this issue for now. I'll ask for help soon*ish*.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;&lt;del&gt;Add some CRUD code to &lt;strong&gt;create&lt;/strong&gt; a user to the db (&lt;em&gt;with a randomly generated id&lt;/em&gt;.)&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;del&gt;Add some CRUD code to &lt;strong&gt;read&lt;/strong&gt; a user from the db (&lt;em&gt;with a specific id&lt;/em&gt;.)&lt;/del&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Figure out how to add unit tests, and work with the Firestore db offline (&lt;em&gt;probably the most challenging.&lt;/em&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement &lt;a href="https://www.npmjs.com/package/celebrate"&gt;middleware to handle data validation&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Things I'd like to do:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Implement pino logging

&lt;ul&gt;
&lt;li&gt;We currently use &lt;a href="https://getpino.io/#/"&gt;pino&lt;/a&gt; in a few places in the project, I'd like to use it here too.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope to have a draft PR up for all of the above by Friday the 19th. Maybe a better approach is to implement a basic skeleton and create various issues to see if anyone is interested in trying their hand at this.&lt;/p&gt;




&lt;p&gt;Other News:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stanford made their iOS development course &lt;a href="https://www.youtube.com/playlist?list=PLpGHT1n4-mAtTj9oywMWoBx0dCGd51_yG"&gt;public on youtube&lt;/a&gt; which is awesome. Maybe I'll take a look into that sometime.&lt;/li&gt;
&lt;li&gt;Attended a Seneca Honours Bachelor of Technology - Software Development Alumni where five graduates spoke about their history in the program and where they are now. Surprisingly two of the alumni gave shoutouts to David Humphrey and the OSD course! Again, extremely grateful that I'm here.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>opensource</category>
    </item>
    <item>
      <title>Blogpost #968-b</title>
      <dc:creator>Chris Pinkney</dc:creator>
      <pubDate>Sat, 06 Feb 2021 01:32:09 +0000</pubDate>
      <link>https://dev.to/chrispinkney/blogpost-968-b-2j74</link>
      <guid>https://dev.to/chrispinkney/blogpost-968-b-2j74</guid>
      <description>&lt;p&gt;TODAY THIS CODE UNIT WILL EXPLAIN THE GOING-ONS WITHIN THE LAST 168 HOURS [STOP]&lt;/p&gt;

&lt;p&gt;IT WILL BE DRY AND BORING [STOP]&lt;/p&gt;

&lt;p&gt;YOU HAVE BEEN WARNED [STOP]&lt;/p&gt;

&lt;p&gt;UNCLOG YOUR EXHAUST PIPES AND PAY ATTENTION [STOP]&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FLMqgb0n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/g7lmwp0o34jl95orp0wx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FLMqgb0n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/g7lmwp0o34jl95orp0wx.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Actual picture of me, circa 2021&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;​ So I started this week off by helping Anton (a fellow &lt;a href="https://github.com/Seneca-CDOT/telescope"&gt;Telescope&lt;/a&gt; contributor) test out a really neat addition to our CD pipeline:  &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1628"&gt;GitHub Action Deployment&lt;/a&gt;. Essentially, whenever we're ready to push a new version of the software out to prod we simply add a Git tag specifying the version of the software we're shipping, and push the tag to trigger the auto deployment routine. It also builds REALLY &lt;a href="https://github.com/Seneca-CDOT/telescope/releases/tag/1.6.0"&gt;beautiful release notes&lt;/a&gt;. This is a really sweet addition that tickles my pipeline fancy (&lt;em&gt;uhhh... wait&lt;/em&gt;). I worked with something similar to this in my OSD600 class, although my project was Python based as opposed to web based so it was great to learn more about this, the backend, and deployment.&lt;/p&gt;

&lt;p&gt;​ Later in the week I &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1640#pullrequestreview-582772319"&gt;reviewed a funny bug&lt;/a&gt; from Doctor Josue regarding our Netlify deployment:  our deployments on Netlify were "failing" is the successive build had no major changes. This is annoying from a reviewer point of view, as each new PR which didn't require a rebuild of our site was automatically marked as failing our CI checks. But more importantly, our Netlify badge was &lt;u&gt;INCORRECTLY LABELLING US AS FAILURES&lt;/u&gt;. We discussed this issue during our meeting, and this is a really great solution that I hadn't thought about. It just goes to show that sometimes the simplest solution is the best (even if it is just a temporary band-aid fix.) And now it proudly (&lt;em&gt;forcefully?&lt;/em&gt;) displays our successful builds.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dggrWKbw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/tkjqzg4zibz6wbu3nvvs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dggrWKbw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/tkjqzg4zibz6wbu3nvvs.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;​ More excitingly, our &lt;code&gt;SearchPage&lt;/code&gt; component landed, a component which was blocking &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1621"&gt;my &lt;code&gt;Search&lt;/code&gt; component&lt;/a&gt;, as it's dependent on &lt;code&gt;SearchPage&lt;/code&gt;. I hastily &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1583"&gt;reviewed it&lt;/a&gt;, and really appreciated the commentary in the code as it really helps a plebian such as I understand more about functional components and design decisions. Once day I'll be as good of a programmer as Calvin, but it is not today. As soon as it landed I got to work on finishing up my port of the Search page. In essence, Calvin's component does the actual searching in our database for user posts, and my component gives his work a page to be displayed on.&lt;/p&gt;

&lt;p&gt;Although, I have to say I'm kind of conflicted on it. Calvin did such a great job on his &lt;code&gt;SearchPage&lt;/code&gt; component that I don't see why we should even use my wrapper component at all. Moreover, we can just inject the SEO, Header, Banner, and Darkmode toggle button that my &lt;code&gt;Search&lt;/code&gt; page renders using his PR. However, for completeness sake this mirrors how our Gatsby branch did it. Ah well. On a side note I think my descriptions and titles are getting to be pretty good. I also got a &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1621/files#r570629963"&gt;nice hint&lt;/a&gt; from my Professor which will lead me down &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1655"&gt;a rabit-hole&lt;/a&gt;, my favourite place to be. I'll have to work on this with Anton later in the week as he's expressed interest in making our web-app more accessible-friendly and meta tags relates to this.&lt;/p&gt;

&lt;p&gt;​ Speaking of Professor, I also got some really great &lt;a href="https://github.com/streamich/react-use/blob/master/docs/useLocalStorage.md"&gt;reading material&lt;/a&gt; from &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1641#issuecomment-772832438"&gt;a comment by the one and only Humphd&lt;/a&gt; about local storage. Coincidentally this is also something that I need to utilize for my on-going capstone project.&lt;/p&gt;

&lt;p&gt;I also raised a new issue &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1653"&gt;here&lt;/a&gt; about a warning we started to get recently as our React version is not on the latest version (v17.0) As NextJS depends on React, NextJS' next version (v11.0) depends on updating React. This lead me to read about the &lt;a href="https://reactjs.org/blog/2020/08/10/react-v17-rc.html"&gt;new features in React 17.0&lt;/a&gt;, which hilarious enough, add "&lt;em&gt;nothing&lt;/em&gt;".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LKl39Q-8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kt7p87f1w5up24q3nvwm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LKl39Q-8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kt7p87f1w5up24q3nvwm.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also helped research (and discuss) a bug with our &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1652"&gt;darkmode toggle button&lt;/a&gt; that Abdul and Anton both started noticing that I annoyingly couldn't reproduce on my end. Funnily enough, it was eventually discovered that the reason I couldn't reproduce this bug was due to the white darkmode toggle button blending in too well with our white background, essentially making it disappear. Even funnier, this issue only visible on widescreen monitors (my browser monitor is portrait.)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--23K8hKaZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/u26e8q2yiphb3w2x6r4b.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--23K8hKaZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/u26e8q2yiphb3w2x6r4b.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lastly, I also find myself getting more and more interested in the world of Microservices. &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1627"&gt;Ray and Professor Dave&lt;/a&gt; are starting a REALLY interesting discussion and I'm very interested to see where it goes.&lt;/p&gt;

&lt;p&gt;​ Friday is finally upon us, and I started off my day by participating an a meeting with Doctor Josue, Anton, Ilya, Abdul, and Professor Dave. Unbeknownst to me, this meeting would &lt;u&gt;span a whole five hours&lt;/u&gt;. (&lt;em&gt;and this is how you know you truly love something:  when five hours flies by and strangely enough you're still ready for more.&lt;/em&gt;) The purpose of the meeting was to help out Ilya, a fellow contributor, &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1659"&gt;get his work in&lt;/a&gt; before our 1:30PM deadline. We made it in time and I learned some new git features (&lt;code&gt;git cherry-pick&lt;/code&gt;), and some new &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1659/files#diff-777971038a09aee885473383438eca93b883162179164674b4f4f07e048c3742R72"&gt;TypeScript features&lt;/a&gt; by watching my fellows voraciously hack away at a new addition.&lt;/p&gt;

&lt;p&gt;Our Friday triage meeting was as entertaining as always, although I disappointingly had to tell the group that I couldn't get my &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1651"&gt;two&lt;/a&gt; &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1651"&gt;issues&lt;/a&gt; in by our deadline. This week simply got away from me, but I think there's always a lesson to learn:  plan better and don't over or under estimate the time cost of programming.&lt;/p&gt;

&lt;p&gt;However, on a brighter note, the new feature that I took under my (&lt;em&gt;broken&lt;/em&gt;) wing is &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1642"&gt;looking positively amazing&lt;/a&gt;. The tl;dr is that I'm championing a new database addition to our project to keep track of our &lt;a href="https://wiki.cdot.senecacollege.ca/wiki/Planet_CDOT_Feed_List"&gt;Planet Feed List&lt;/a&gt;, amongst other pieces of data. I'm not a database guy at all, but I do &lt;strong&gt;love&lt;/strong&gt; to design new additions, and I love to play with APIs, so I get the best of both worlds here. I have a bit of basic experience using Firestore and I'm really looking forward to contributing something that I actually feel &lt;em&gt;slightly&lt;/em&gt; confident working on. &lt;strong&gt;The best part about this feature is that we're planning on additional features which will built off this basework that I'll be doing!&lt;/strong&gt; It's in its very immediate infancy right now so I'll discuss it further on next week's blog post, so keep an eye out for that. Or don't, I'm a robot not your mother.&lt;/p&gt;




&lt;p&gt;​ That about does it from me this week. It excitingly exploded towards the end and I'm more and more eager to begin another week in the world of open source development.&lt;/p&gt;

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