Test Account
04/25/2024, 5:27 PM#!/usr/bin/env zsh
set -e # Stop script on first error
#
# MYAPP SETUP 2.0
#
# Check Rails Installation
if ! gem list -i rails; then
echo "Rails is not installed, installing Rails..."
gem install rails --version "~> 7.1.3"
else
echo "Rails is already installed."
fi
# Create New Rails Application
echo "Creating new Rails application with PostgreSQL, esbuild, and I18n support..."
rails new myapp --database=postgresql --javascript=esbuild --css=sass --skip-turbo-links
cd brgen
# Add Necessary Gems
echo "Adding necessary gems..."
bundle add esbuild-rails hotwire-rails stimulus_reflex devise
# Install Frameworks
echo "Installing Hotwire, StimulusReflex, and configuring Propshaft..."
bin/rails hotwire:install
bin/rails stimulus_reflex:install
bin/rails propshaft:install
# Initial Git Setup
git init
git add .
git commit -m "Initial setup: Generate Rails app with frontend gems"
# Configure Falcon as the Web Server
echo "Configuring Falcon as the default web server..."
cat <<RUBY > config/falcon.rb
#!/usr/bin/env falcon-host
# frozen_string_literal: true
ENV["RAILS_ENV"] ||= "production"
require_relative "./config/environment"
require "async/websocket/adapters/rack"
load :rack, :supervisor
Async do
hostname = "brgen"
rails = Rack::Builder.new do
map "/cable" do
run ActionCable.server
end
run Rails.application
end
rack hostname do
endpoint Async::HTTP::Endpoint.parse("<http://0.0.0.0:74823>")
app rails
end
supervisor
end
RUBY
git add .
git commit -m "Configured Falcon as the web server for production environment."
# Configure Rails as a Progressive Web App (PWA)
echo "Configuring Rails as a Progressive Web App (PWA)..."
bin/rails generate pwa:install
git add .
git commit -m "Configured Rails to run as a Progressive Web App (PWA)"
# Setting Up Devise for User Authentication
echo "Setting up Devise for user authentication..."
bundle add devise
bin/rails generate devise:install
bin/rails generate devise User
bin/rails generate migration Add_Details_To_Users username:string karma:integer avatar:string
bin/rails db:migrate
git add .
git commit -m "Added Devise gem, enhanced User model with Avatar, Username, and Karma attributes."
# --
# Solidus ecommerce framework
# Install necessary gems and dependencies
echo "Adding required gems..."
bundle add solidus solidus_auth_devise
bundle install
# Set up Solidus and default configurations
echo "Installing Solidus with default configurations..."
bin/rails generate solidus:install --auto-accept
bin/rails db:migrate
git add .
git commit -m "Install Solidus ecommerce framework."
# Setup SearchReflex for dynamic product search
echo "Creating SearchReflex for live product search..."
cat <<RUBY > app/reflexes/search_reflex.rb
class SearchReflex < ApplicationReflex
def perform
term = element[:value]
@products = Spree::Product.where("name ILIKE ?", "%#{term}%")
morph '#products_list', render(partial: 'spree/products/product_list', locals: { products: @products })
end
end
RUBY
git add .
git commit -m "Add Stimulus Reflex dynamic search functionality."
# Enhance product index view
echo "Enhancing product index view with modern standards..."
cat <<ERB > app/views/spree/products/index.html.erb
<%= form_with url: spree.products_path, method: :get, local: true, class: "search_form", data: { reflex: "keyup->Search#perform" } do |form| %>
<%= form.text_field :query, placeholder: t('search.products'), class: 'search_input', data: { action: "keyup->search#perform" } %>
<% end %>
<%= tag.div id: "products_index", class: "products_index", itemscope: true, itemtype: "<http://schema.org/ItemList>" do %>
<%= render partial: 'spree/products/product_card', collection: @products, as: :product %>
<% end %>
ERB
# Create product card partial
echo "Creating product card partial with SEO improvements..."
cat <<ERB > app/views/spree/products/_product_card.html.erb
<%= tag.div class: "product_card", itemprop: "itemListElement", itemscope: true, itemtype: "<http://schema.org/Product>" do %>
<%= link_to spree.product_path(product), itemprop: "url", class: "product_link" do %>
<%= image_tag product.display_image, itemprop: "image", class: "product_image", alt: product.name %>
<%= tag.div class: "product_details" do %>
<%= tag.h2 product.name, itemprop: "name", class: "product_name" %>
<%= tag.p product.description, itemprop: "description", class: "product_description" %>
<%= tag.span number_to_currency(product.price), itemprop: "price", class: "product_price" %>
<% end %>
<% end %>
<% end %>
ERB
# Update CSS for product views
echo "Updating CSS for modernized views..."
cat <<SCSS > app/assets/stylesheets/spree/frontend/products.scss
.products_index {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 20px;
}
.product_card {
background: white;
border: 1px solid #ccc;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
&:hover {
transform: translateY(-5px);
}
}
.product_image {
width: 100%;
height: auto;
}
.product_details {
margin-top: 10px;
}
.product_name, .product_description, .product_price {
margin-bottom: 10px;
}
SCSS
git add .
git commit -m "Modernized product views and implemented <http://Schema.org|Schema.org> SEO improvements."
***** END *****
Constructive criticism welcome!Jacob Penn
05/02/2024, 1:49 AM