Skip to content

boddhisattva/learner-web

Repository files navigation

Learner

About

Life is journey of constant learnings and this is an attempt to keep track of at least some of those learnings in an attempt to be a better version of oneself everyday

Functionalities implemented thus far

The following features are available via both the Web app & in Mobile

  • User sign up & sign in(Uses Hotwire Stimulus as needed)
    • As part of a user sign up, an organization is created based on user name & it is associated with an appropriate membership
  • Update User profile details(Uses Hotwire Turbo as needed)
  • Add ability to create a new learning
    • Sample Learnings & Learning Categories can be added through rake db:seed
    • Additional learning categories can be currently added through rails c backend manually
  • Learning Search implemented using Stimulus and related features like Stimulus Target
  • Infinite scroll implementation using Turbo Frames and lazy loading
  • Inline functionalities for - Learning creation, update using Turbo Streams
    • Functionalities like Update make use of features like Morphing that allows one to preserve scroll position and provides a better UX in general(especially in Mobile)
  • Learning deletion also implemented with Turbo Streams to give a more intuitive user experience
  • Floating flash notifications implemented for operations like learning create, update & delete to give a much better User experience.

Entity Relationship Diagram & Learner App Screenshots

Entity Relationship Diagram
  ┌─────────────────────────────────┐
  │          Users                  │
  ├─────────────────────────────────┤
  │ id                              │
  │ email                           │────────┐
  │ encrypted_password              │        │
  │ first_name                      │        │
  │ last_name                       │        │
  │ personal_organization_id (FK)   │─────┐  │  (FK - your "home" org, set once)
  │ reset_password_token            │     │  │
  │ remember_created_at             │     │  │
  │ created_at                      │     │  │
  │ updated_at                      │     │  │
  └─────────────────────────────────┘     │  │
          │                               │  │
          │ has_many                      │  │
          │ :memberships                  │  │
          │                               │  │
          ▼                               │  │
  ┌─────────────────────────────────┐     │  │
  │       Memberships               │◄────┘  │
  ├─────────────────────────────────┤        │
  │ id                              │        │
  │ member_id (FK)                  │────────┘  ← This IS your "organization_ids"!
  │ organization_id (FK)            │─────┐
  │ learnings_count                 │     │  (counter cache)
  │ created_at                      │     │
  │ updated_at                      │     │
  └─────────────────────────────────┘     │
          ▲                               │
          │                               │
          │ has_many                      │
          │ :memberships                  │
          │                               │
          │                               ▼
  ┌─────────────────────────────────┐  ┌─────────────────────────────────┐
  │      Organizations              │  │                                 │
  ├─────────────────────────────────┤  │                                 │
  │ id                              │  │                                 │
  │ name                            │  │                                 │
  │ owner_id (FK)                   │──┘  ─→ Users (who created it)      │
  │ created_at                      │                                    │
  │ updated_at                      │                                    │
  └─────────────────────────────────┘                                    │
          │                                                              │
          │ has_many                                                     │
          │ :learnings                                                   │
          │                                                              │
          ▼                                                              │
  ┌─────────────────────────────────┐                                    │
  │         Learnings               │                                    │
  ├─────────────────────────────────┤                                    │
  │ id                              │                                    │
  │ lesson                          │                                    │
  │ description                     │                                    │
  │ creator_id (FK)                 │────────────────────────────────────┘
  │ last_modifier_id (FK)           │───────┐ ─→ Users
  │ organization_id (FK)            │       │
  │ learning_category_ids (array)   │       │
  │ deleted_at                      │       │
  │ created_at                      │       │
  │ updated_at                      │       │
  └─────────────────────────────────┘       │
          │                                 │
          │ has_many                        │
          │ :learning_categorizations       │
          │                                 │
          ▼                                 │
  ┌─────────────────────────────────┐       │
  │  LearningCategorizations        │       │
  │  (Join Table)                   │       │
  ├─────────────────────────────────┤       │
  │ id                              │       │
  │ learning_id (FK)                │       │
  │ category_id (FK)                │───┐   │
  │ deleted_at                      │   │   │
  │ created_at                      │   │   │
  │ updated_at                      │   │   │
  └─────────────────────────────────┘   │   │
                                        │   │
                                        ▼   │
  ┌─────────────────────────────────┐       │
  │     LearningCategories          │       │
  ├─────────────────────────────────┤       │
  │ id                              │       │
  │ name                            │       │
  │ description                     │       │
  │ organization_id (FK)            │───┐   │
  │ creator_id (FK)                 │───┼───┘
  │ last_modifier_id (FK)           │───┘ ─→ Users
  │ deleted_at                      │
  │ created_at                      │
  │ updated_at                      │
  └─────────────────────────────────┘
View App related screenshots
  1. Create New Inline Learning Alt text

  2. Learnings Index Alt text

3.Learnings Show Alt text

  1. Update Learnings Inline & confirm updates with Floating Notifcations Alt text

  2. Learnings Rendered in Mobile View

Alt text

  1. Search learnings via Mobile view

Alt text

  1. Learning related Floating Notifications in Mobile view

Alt text

Features that are currently a Work in Progress(WIP)

  • Implementing Learning Categories, Memberships & Organisations fully pertaining to a user's learning is a current WIP

Areas of Improvement

  • Login based on current organization needs to be implemented. It currently only takes user credentials for login and it falls back to the personal organization for the user until we explicitly implement this in the login flow
  • Replace acts_as_paranoid with discard gem as that's more flexible & provides better future readynesss in terms of long term extendability(to allow support of more features etc.,) and maintainability
  • load_learning_categories(used in LearningsController) currently loads 100 learning categories. We can improve this further by providing UI options in appropriate parts of the app to filter and search learnings by other learning categories
  • Log exceptions to an error handling service like Sentry so that they can be acted upon proactively towards a resolution

Usage

Dependencies

  • This app uses Ruby 3.3.6 & Rails 8.1.1

Basic App setup

Installing app dependencies

  • Run bundle install from a project's root directory to install the related dependencies.

Setting up the Database schema

  • From the project root directory:
    • Create the Database Schema with: rake db:create and rake db:migrate

Setting up a test user

  • In order to get started with using the app with an existing user, one could use the rake db:seed
  • Additional learning categories can be currently added through rails c BE manually

Running the Rails app & ensuring it takes in the latest CSS & JS changes

  • Start the rails app with: bin/dev

Please note: This command also bundles the latest CSS & JS code that comes along/regularly changes throughout the development lifecycle of an app

Running the tests

  • One can run the tests from the project root directory with the command rspec

Use BE & FE Linters for better long term App Maintainability

Rubocop for linting .rb specific files

  • One can benefit with more consistent and better quality Ruby code with rubocop -a & rubocop -A to auto fix rubocop specific lint issues

Herb linter for linting .html.erb specific files

  • One can encourage use of best practices & catch common errors to improve view related code(as mentioned docs here)) regularly by using the Herb linter via the command npx @herb-tools/linter app/views/ --fix

About

Life is journey of constant learnings and this is an attempt to keep track of at least some of those learnings in an attempt to be a better version of oneself everyday

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors