Skip to content

epot/gifterv2

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

36 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Gifter v2

This is a complete rewrite of https://github.com/epot/gifter in Golang/React. The project was bootstrapped from https://github.com/martishin/react-golang-user-login-oauth.

Links

  • How to work locally here
  • Backend documentation here
  • Frontend documentation here

Tech Stack

  • Frontend: React.js, Material UI
  • Backend: Go, Chi, goth
  • Database: PostgreSQL
  • Auth Provider: Google OAuth 2.0
  • Others: Docker

Context

I started this pet project as I had some unexpected time home ahead of me.

The requirements were:

  • Get a working prototype in a few days, even if it meant not providing all the features the original project had.
  • Use golang backend side, I have been using it at work for a few years and really enjoy how productive you quickly get with it. I thought it would be fun to compare the end result between what I got with Play!/Scala and a lower level language like Go.
  • Use React frontend side, I didn't get a lot of opportunity to use it - I had past experience with VueJS and Angular but only a very short/irrelevant one with React - and wanted to spend some time playing around with it.
  • Find a new deployment stack. I was using Heroku before, but I didn't really like what the product became after they got acquired. I have a lot more experience with infra now, so I wasn't afraid of using something less "out-of-the box".
  • No AI whatsoever. I have never used any AI for development for work and this is not going to change any time soon.

Development

I quickly decided to settle for https://github.com/martishin/react-golang-user-login-oauth as a bootstrap project. It uses exactly the tech stack I want, and I got it working locally very quickly. The backend was really extremely easy/fast to write as what it does is really not complicated: a simple CRUD API over events/gifts with only some advanced features to obfuscate some content. I decided to not change how I was persisting gifts in my previous project, using a fat JSON column for all the "advanced" content that you never need to query on.

Frontend side things were a little more complicated, mostly because I had almost 0 experience with React. I quickly settled for Material UI to get nice styling and a lot of components, but it was not enough. For instance I was surprised that you need to add several dependencies and wire all of them together to get a "simple" form validation (I followed something like https://medium.com/@ignatovich.dm/implementing-advanced-form-validation-with-formik-and-yup-898d34e17ad0). I am sure what I am doing is terrible, but it ended up looking ok quickly enough to be a satisfying development experience.

Deployment

As I said, I didn't want to go for Heroku this time. Their pricing model is kind of crazy today, and I had a bad experience of seeing it changing overnight. I read this blogpost https://madhanganesh.medium.com/golang-react-application-2aaf3bca92b1 and decided to give a try to Google App Engine. I already had the Google project as I wanted to support Google authentication. Deploying the project there was a pleasant experience. However, I was surprised how tricky it was to get all the nitty gritty details right. I didn't think my setup was super exotic: there is a backend exposing a REST API and I want a frontend service a single page application. I followed https://medium.com/@rgoyard/how-to-deploy-a-single-page-application-and-its-backend-to-google-app-engine-353ff93bd38c but it was not fully working, for instance loading directly a subpage of the website would end up in a 404. I ended up fighting with it for some time before I managed to find the correct setup that is spread in 3 files:

  • app.yaml that defines the single page application deployment configuration
  • server/api.yaml that defines the backend deployment configuration (this file is not committed as it contains some secrets, but there is a template file `server/api.yaml.example)
  • dispatch.yaml to explains how requests are routed to the single page application or the backend depending on the route

In order to push a frontend update :

  • npm run build from the client folder
  • gcloud app deploy from the root folder

The last piece required to have something working was the database. When I started to click around in Google UI I realized that it was probably not what I wanted: I would get a dedicated fat machine, which is kind of stupid for my usecase (no one could be using the website for weeks) and would probably end up being super expensive - which was not really clear when I was trying to create an instance. I gave Neon a try, as I heard from them at work. It was a great experience. In a few clicks I signed up to their product, and got a serverless database I could connect to. They even provide a lot of observability dashboards out of the box, you don't even need to have extra monitoring to start playing with it. With this and the google console logs explorer I was able to troubleshoot the last deployment problems and got something that worked.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors