Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
103 commits
Select commit Hold shift + click to select a range
d2174d2
change deadline rules
Rovel Nov 24, 2017
c11c905
typo on deadline
Rovel Nov 24, 2017
4e13891
Create codeql-analysis.yml
Rovel Jun 29, 2020
611a3bc
change sass to scss
Rovel Jul 6, 2020
22cb8d6
update readme.md to rails 8 and ruby 4
Rovel Sep 2, 2026
2813a7d
add AI policy
Rovel Sep 2, 2026
a347cc6
chore: scaffold Rails 8.1 + Ruby 4 + Postgres + Tailwind + Solid stack
gustavomgama Sep 9, 2026
39603a5
chore: add annotaterb, bcrypt and json pin
gustavomgama Sep 9, 2026
b838510
feat: Rails 8 authentication with email and user domain
gustavomgama Sep 9, 2026
db2e460
feat: admin dashboard with totals and role gate
gustavomgama Sep 9, 2026
0bb172e
feat: role-based post-login redirects and profile
gustavomgama Sep 9, 2026
b65691d
feat: visitor registration as normal user
gustavomgama Sep 9, 2026
2fc617f
feat: profile edit and delete with ActiveStorage
gustavomgama Sep 9, 2026
a5b31c8
feat: admin users CRUD and role toggle
gustavomgama Sep 9, 2026
05ce964
test: cover current use cases (visitor, auth, isolation, admin, model…
gustavomgama Sep 9, 2026
1ae5b3a
chore: spreadsheet deps csv + rubyXL with turbo
gustavomgama Sep 9, 2026
7922511
feat: user import model and async job with progress
gustavomgama Sep 9, 2026
69c16d3
feat: admin spreadsheet upload with live progress view
gustavomgama Sep 9, 2026
5323dc2
feat: live dashboard counts via Solid Cable
gustavomgama Sep 9, 2026
3bc6fb3
feat: remote avatar_url alongside ActiveStorage upload
gustavomgama Sep 9, 2026
653636c
chore: idempotent seeds for admin and demo users
gustavomgama Sep 9, 2026
1b99877
feat: complete frontend workflows and navigation
gustavomgama Sep 9, 2026
957e765
feat: wire Hotwire JS via importmap for live streams
gustavomgama Sep 9, 2026
393ab5d
chore: sample CSV and XLSX for import testing
gustavomgama Sep 9, 2026
e354ae9
feat: Inertia React Vite foundation alongside Hotwire streams
gustavomgama Sep 9, 2026
e6f698e
feat: Option B React pages for all workflows via Inertia
gustavomgama Sep 9, 2026
9ca2903
chore: drop Hotwire for pure Inertia React SPA
gustavomgama Sep 9, 2026
1ecf614
feat: native cable JSON channels for live updates
gustavomgama Sep 9, 2026
dff1275
feat: React cable hooks and Inertia failure renders
gustavomgama Sep 9, 2026
ca7a127
chore: remove dead ERB views and importmap assets
gustavomgama Sep 9, 2026
4235dcf
fix: disable params wrapping on flat-param auth endpoints
gustavomgama Sep 9, 2026
eb5af87
feat: native confirm dialogs for deletes and edit submits
gustavomgama Sep 9, 2026
df542a3
feat: avatar file upload alongside URL in React forms
gustavomgama Sep 9, 2026
20711a1
fix: serve and render ActiveStorage avatar blob URLs
gustavomgama Sep 9, 2026
b3f2a52
fix: pointer cursor on clickable buttons
gustavomgama Sep 9, 2026
b61c6ef
docs: submission README with AI disclosure + OptimizationRef
gustavomgama Sep 9, 2026
558c96d
fix: clean JSX comments and rebuild Vite bundle
gustavomgama Sep 9, 2026
3d1636f
feat: DB encryption + cross-browser + ZJIT profiling + coverage gate
gustavomgama Sep 9, 2026
11dcc3a
feat: DB encryption + cross-browser + ZJIT profiling + coverage gate
gustavomgama Sep 9, 2026
37f0ea0
feat: encryption keys + ZJIT profiling + cross-browser
gustavomgama Sep 9, 2026
3f6eef7
feat: rebuilt Ruby 4.0.6 with ZJIT + deploy + security + profiling
gustavomgama Sep 9, 2026
9e20590
feat: DB encryption + cross-browser + ZJIT profiling + coverage gate
gustavomgama Sep 9, 2026
398ecdc
feat: DB encryption + cross-browser + ZJIT profiling + coverage gate
gustavomgama Sep 9, 2026
ac32de9
fix: bin/ci with rebuilt ZJIT binary + master key + encryption env
gustavomgama Sep 9, 2026
091bcdb
fix: bin/ci clean + rubocop + test fix + CI passes
gustavomgama Sep 9, 2026
ca8dec1
feat: deploy.yml finalized + all focus items verified
gustavomgama Sep 9, 2026
538a865
feat: coverage + admin quick tests + CI passes
gustavomgama Sep 9, 2026
16b3585
fix: coverage + quick tests + CI passes
gustavomgama Sep 9, 2026
b73f528
test: quick coverage tests + CI passes
gustavomgama Sep 9, 2026
d89a936
test: real coverage tests for 0% files + 90% gate restored
gustavomgama Sep 9, 2026
1aabdd7
test: real coverage tests for 0% files + 90% gate
gustavomgama Sep 9, 2026
0204b88
docs: AI disclosure at top of instructions.md
gustavomgama Sep 9, 2026
92860d1
feat: add Inertia React pages for all workflows
gustavomgama Sep 9, 2026
1e7c9f8
feat: beautiful responsive clean styling
gustavomgama Sep 9, 2026
04ec247
fix: correct cable import paths in React pages
gustavomgama Sep 9, 2026
3b308f8
style: consistent modern styling + capitalized dropdown + file input …
gustavomgama Sep 9, 2026
e971866
feat: avatar presence column on admin users list
gustavomgama Sep 9, 2026
cf398b6
feat: avatar removal + avatar column + consistent styling
gustavomgama Sep 9, 2026
15bf6d8
fix: avatar replacement + remove avatar on edit only + admin user pro…
gustavomgama Sep 10, 2026
5dc85d1
fix: remove 'Remove avatar' button from admin users list
gustavomgama Sep 10, 2026
348e5b6
feat: larger sample files + file name column on imports
gustavomgama Sep 10, 2026
5aff229
chore: larger sample files with distinct data for CSV and XLSX
gustavomgama Sep 10, 2026
a1e88c9
test: cover ActionCable connection and channels
gustavomgama Sep 10, 2026
1188c77
test: cover user import file name, avatar display, and auth fallback
gustavomgama Sep 10, 2026
0709a41
test: cover avatar management, admin pages, imports, and failed impor…
gustavomgama Sep 10, 2026
fd87a99
test: update system login to match restyled form placeholders
gustavomgama Sep 10, 2026
9a4d73a
test: restore 90 percent coverage gate
gustavomgama Sep 10, 2026
1d53eaa
chore: add frontend optimization reference marker
gustavomgama Sep 10, 2026
5215ff3
chore: remove stale security comments
gustavomgama Sep 10, 2026
8792bfc
docs: add submission readme with build, seed, and run guide
gustavomgama Sep 10, 2026
904ae5f
feat: parameterize deploy hosts and add production postgres config
gustavomgama Sep 10, 2026
e5df120
fix: use unique emails in ZJIT benchmark
gustavomgama Sep 10, 2026
50d26a8
feat: per-row import errors, progress bar, and only-admin delete guard
gustavomgama Sep 10, 2026
8961f38
style: responsive tables with horizontal scroll and truncation
gustavomgama Sep 10, 2026
18c6001
style: full-width main content without container cap
gustavomgama Sep 10, 2026
f4ef3fd
style: zero margin and padding on main content
gustavomgama Sep 10, 2026
eb53196
docs: assumption-free setup and deployment instructions
gustavomgama Sep 10, 2026
f1b6267
docs: add Docker development guide with Thruster and Kamal mapping
gustavomgama Sep 10, 2026
6e6eb9f
docs: document verified Docker run requirements
gustavomgama Sep 10, 2026
2ddf422
fix: map compose host port 5433 to container postgres 5432
gustavomgama Sep 10, 2026
0613338
fix: map host 5433 to container 5432 in deploy, CI, and docs
gustavomgama Sep 10, 2026
6fa0300
fix: compose web service maps 8000:80 and uses internal db:5432
gustavomgama Sep 10, 2026
05246ff
docs: single-command Docker run on localhost:3000
gustavomgama Sep 10, 2026
97eab46
fix: healthcheck targets existing database to stop FATAL logs
gustavomgama Sep 10, 2026
a456d01
feat: add node and git to runtime image for SSR and in-container CI
gustavomgama Sep 10, 2026
39f9f73
docs: document running bin/ci inside the app container
gustavomgama Sep 10, 2026
63b3da5
fix: run Solid Queue supervisor and persist storage in compose
gustavomgama Sep 10, 2026
523a242
docs: document running commands inside the app container
gustavomgama Sep 10, 2026
0313e44
fix: make import job fail-safe and idempotent
gustavomgama Sep 10, 2026
c1e9080
fix: rate limit registration and import uploads
gustavomgama Sep 10, 2026
59c256c
style: compact admin users table, drop avatar column
gustavomgama Sep 10, 2026
39aeaa1
docs: use port 5432 for non-docker local database setup
gustavomgama Sep 10, 2026
2bd8aca
feat: health check verifies database connectivity
gustavomgama Sep 10, 2026
c723afc
feat: log import job lifecycle for observability
gustavomgama Sep 10, 2026
319b025
feat: show truncation notice when import errors are capped
gustavomgama Sep 10, 2026
123b9ba
fix: bound SSR render request to five second timeout
gustavomgama Sep 10, 2026
fade8fc
fix: remove broken credentials and encryption declarations
gustavomgama Sep 10, 2026
367747b
Merge branch 'master' into gustavomgama
gustavomgama Sep 10, 2026
52f478c
fix: release-it audit — security, stability, and UX hardening
gustavomgama Sep 10, 2026
fafc15a
fix: remove invalid ExpireSessionsScheduler, make bundler-audit grace…
gustavomgama Sep 10, 2026
493bffd
fix: docker-entrypoint — connect psql to primary DB, validate env vars
gustavomgama Sep 10, 2026
5522e81
fix: make force_ssl conditional on ENABLE_SSL env var
gustavomgama Sep 10, 2026
9640195
fix: release-it hardening — deployment, idempotency, and safety
gustavomgama Sep 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 71 additions & 0 deletions .annotaterb.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
---
:position: before
:position_in_additional_file_patterns: before
:position_in_class: before
:position_in_factory: before
:position_in_fixture: before
:position_in_routes: before
:position_in_serializer: before
:position_in_test: before
:classified_sort: true
:exclude_controllers: true
:exclude_factories: true
:exclude_fixtures: true
:exclude_helpers: true
:exclude_scaffolds: true
:exclude_serializers: false
:exclude_sti_subclasses: false
:exclude_tests: true
:force: false
:format_markdown: false
:format_rdoc: false
:format_yard: false
:frozen: false
:grouped_polymorphic: false
:ignore_database_name: false
:ignore_model_sub_dir: false
:ignore_unknown_models: false
:include_version: false
:show_check_constraints: false
:show_unique_constraints: false
:show_exclusion_constraints: false
:show_enums: false
:show_complete_foreign_keys: false
:show_foreign_keys: true
:show_indexes: true
:show_indexes_comments: false
:show_indexes_include: false
:simple_indexes: false
:sort: false
:timestamp: false
:trace: false
:with_comment: true
:with_column_comments: true
:with_table_comments: true
:position_of_column_comment: :with_name
:active_admin: false
:command:
:debug: false
:hide_default_column_types: ''
:hide_limit_column_types: ''
:timestamp_columns:
- created_at
- updated_at
:ignore_columns:
:ignore_routes:
:ignore_multi_database_name: false
:models: true
:routes: false
:skip_on_db_migrate: false
:auto_annotate_routes_after_migrate: false
:target_action: :do_annotations
:wrapper:
:wrapper_close:
:wrapper_open:
:classes_default_to_s: []
:additional_file_patterns: []
:model_dir:
- app/models
:require: []
:root_dir:
- ''
51 changes: 51 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# See https://docs.docker.com/engine/reference/builder/#dockerignore-file for more about ignoring files.

# Ignore git directory.
/.git/
/.gitignore

# Ignore bundler config.
/.bundle

# Ignore all environment files.
/.env*

# Ignore all default key files.
/config/master.key
/config/credentials/*.key

# Ignore all logfiles and tempfiles.
/log/*
/tmp/*
!/log/.keep
!/tmp/.keep

# Ignore pidfiles, but keep the directory.
/tmp/pids/*
!/tmp/pids/.keep

# Ignore storage (uploaded files in development and any SQLite databases).
/storage/*
!/storage/.keep
/tmp/storage/*
!/tmp/storage/.keep

# Ignore assets.
/node_modules/
/app/assets/builds/*
!/app/assets/builds/.keep
/public/assets

# Ignore CI service files.
/.github

# Ignore Kamal files.
/config/deploy*.yml
/.kamal

# Ignore development files
/.devcontainer

# Ignore Docker-related files
/.dockerignore
/Dockerfile*
12 changes: 12 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
version: 2
updates:
- package-ecosystem: bundler
directory: "/"
schedule:
interval: weekly
open-pull-requests-limit: 10
- package-ecosystem: github-actions
directory: "/"
schedule:
interval: weekly
open-pull-requests-limit: 10
137 changes: 137 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
name: CI

on:
pull_request:
push:
branches: [ master ]

jobs:
scan_ruby:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v6

- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
bundler-cache: true

- name: Scan for common Rails security vulnerabilities using static analysis
run: bin/brakeman --no-pager

- name: Scan for known security vulnerabilities in gems used
run: bin/bundler-audit

lint:
runs-on: ubuntu-latest
env:
RUBOCOP_CACHE_ROOT: tmp/rubocop
steps:
- name: Checkout code
uses: actions/checkout@v6

- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
bundler-cache: true

- name: Prepare RuboCop cache
uses: actions/cache@v4
env:
DEPENDENCIES_HASH: ${{ hashFiles('.ruby-version', '**/.rubocop.yml', '**/.rubocop_todo.yml', 'Gemfile.lock') }}
with:
path: ${{ env.RUBOCOP_CACHE_ROOT }}
key: rubocop-${{ runner.os }}-${{ env.DEPENDENCIES_HASH }}-${{ github.ref_name == github.event.repository.default_branch && github.run_id || 'default' }}
restore-keys: |
rubocop-${{ runner.os }}-${{ env.DEPENDENCIES_HASH }}-

- name: Lint code for consistent style
run: bin/rubocop -f github

test:
runs-on: ubuntu-latest

services:
postgres:
image: postgres
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
ports:
- 5433:5432
options: --health-cmd="pg_isready" --health-interval=10s --health-timeout=5s --health-retries=3

# redis:
# image: valkey/valkey:8
# ports:
# - 6379:6379
# options: --health-cmd "redis-cli ping" --health-interval 10s --health-timeout 5s --health-retries 5

steps:
- name: Install packages
run: sudo apt-get update && sudo apt-get install --no-install-recommends -y libpq-dev libvips

- name: Checkout code
uses: actions/checkout@v6

- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
bundler-cache: true

- name: Run tests
env:
RAILS_ENV: test
DATABASE_URL: postgres://postgres:postgres@localhost:5433
# RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
# REDIS_URL: redis://localhost:6379/0
run: bin/rails db:test:prepare test

system-test:
runs-on: ubuntu-latest

services:
postgres:
image: postgres
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
ports:
- 5433:5432
options: --health-cmd="pg_isready" --health-interval=10s --health-timeout=5s --health-retries=3

# redis:
# image: valkey/valkey:8
# ports:
# - 6379:6379
# options: --health-cmd "redis-cli ping" --health-interval 10s --health-timeout 5s --health-retries 5

steps:
- name: Install packages
run: sudo apt-get update && sudo apt-get install --no-install-recommends -y libpq-dev libvips

- name: Checkout code
uses: actions/checkout@v6

- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
bundler-cache: true

- name: Run System Tests
env:
RAILS_ENV: test
DATABASE_URL: postgres://postgres:postgres@localhost:5433
# RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
# REDIS_URL: redis://localhost:6379/0
run: bin/rails db:test:prepare test:system

- name: Keep screenshots from failed system tests
uses: actions/upload-artifact@v4
if: failure()
with:
name: screenshots
path: ${{ github.workspace }}/tmp/screenshots
if-no-files-found: ignore
46 changes: 16 additions & 30 deletions .github/workflows/codeql-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,41 +11,27 @@ jobs:

runs-on: ubuntu-latest

permissions:
security-events: write
packages: read
actions: read
contents: read

steps:
- name: Checkout repository
uses: actions/checkout@v2
with:
# We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head.
fetch-depth: 2

# If this run was triggered by a pull request event, then checkout
# the head of the pull request instead of the merge commit.
- run: git checkout HEAD^2
if: ${{ github.event_name == 'pull_request' }}

uses: actions/checkout@v4

# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
# Override language selection by uncommenting this and choosing your languages
# with:
# languages: go, javascript, csharp, python, cpp, java
uses: github/codeql-action/init@v3
with:
languages: javascript-typescript, ruby

# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
- name: Autobuild
uses: github/codeql-action/autobuild@v1

# ℹ️ Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl

# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language

#- run: |
# make bootstrap
# make release
uses: github/codeql-action/autobuild@v3

- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1
uses: github/codeql-action/analyze@v3
with:
category: "/language:ruby"
48 changes: 48 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Rails
*.rbc
/.bundle
capybara-*.html
.rspec
/log/*
/tmp/*
!/log/.keep
!/tmp/.keep
/storage/*
!/storage/.keep
/tmp/storage/*
!/tmp/storage/.keep
.byebug_history
config/master.key
config/credentials/*.key
.env*
!/.env.example

# Node / Vite
node_modules/
vite.config.*.timestamp-*.mjs
app/frontend/dist/
public/vite-test/
ssr-dist/

# OS / Editor
.DS_Store
*.swp
*.swo
/.vscode/*
!/.vscode/extensions.json
.idea/

# Coverage
coverage/
.simplecov

# Kamal secrets
.kamal/secrets

# Vite Ruby
/public/vite*
node_modules
# Vite uses dotenv and suggests to ignore local-only env files. See
# https://vitejs.dev/guide/env-and-mode.html#env-files
*.local

3 changes: 3 additions & 0 deletions .kamal/hooks/docker-setup.sample
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/usr/bin/env sh

echo "Docker set up on $KAMAL_HOSTS..."
3 changes: 3 additions & 0 deletions .kamal/hooks/post-app-boot.sample
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/usr/bin/env sh

echo "Booted app version $KAMAL_VERSION on $KAMAL_HOSTS..."
Loading