mirror of
https://github.com/ryankazokas/turbovault-app.git
synced 2026-04-16 23:22:53 +00:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| fab5ad5982 | |||
| 9b55627b32 | |||
| aa9edb0f65 | |||
| 454f706876 | |||
| 7c29e7789f | |||
| c00fdbdf2e |
21
.github/workflows/build-and-deploy.yml
vendored
21
.github/workflows/build-and-deploy.yml
vendored
@@ -54,6 +54,7 @@ jobs:
|
||||
with:
|
||||
oauth-client-id: ${{ secrets.TAILSCALE_CLIENT_ID }}
|
||||
oauth-secret: ${{ secrets.TAILSCALE_CLIENT_SECRET }}
|
||||
tags: tag:ci
|
||||
|
||||
- name: Setup kubectl
|
||||
uses: azure/setup-kubectl@v3
|
||||
@@ -66,6 +67,26 @@ jobs:
|
||||
echo "$KUBECONFIG_CONTENT" | base64 -d > ~/.kube/config
|
||||
chmod 600 ~/.kube/config
|
||||
|
||||
- name: Run database migrations
|
||||
run: |
|
||||
echo "🗄️ Running database migrations..."
|
||||
|
||||
# Delete old migration job if it exists
|
||||
kubectl delete job turbovault-migrate -n turbovault --ignore-not-found=true
|
||||
|
||||
# Update the migration job with the new image version
|
||||
sed "s|image: ghcr.io/ryankazokas/turbovault-app:.*|image: ghcr.io/ryankazokas/turbovault-app:${{ steps.version.outputs.tag }}|" \
|
||||
k8s/migrate-job.yaml | kubectl apply -f -
|
||||
|
||||
# Wait for migration to complete
|
||||
echo "⏳ Waiting for migrations to complete..."
|
||||
kubectl wait --for=condition=complete --timeout=5m job/turbovault-migrate -n turbovault
|
||||
|
||||
echo "✅ Migrations complete!"
|
||||
echo ""
|
||||
echo "📋 Migration logs:"
|
||||
kubectl logs job/turbovault-migrate -n turbovault
|
||||
|
||||
- name: Deploy to Kubernetes
|
||||
run: |
|
||||
echo "🚀 Deploying version ${{ steps.version.outputs.tag }} to Kubernetes..."
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
|
||||
<div>
|
||||
<%= f.label :format, class: "block text-sm font-medium text-gray-700" %>
|
||||
<%= f.select :format, [["Physical", "physical"], ["Digital", "digital"]], { prompt: "Select Format" }, class: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500" %>
|
||||
<%= f.select :format, [["Physical", "physical"], ["Digital", "digital"]], { prompt: "Select Format", selected: 'physical' }, class: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500" %>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
@@ -99,7 +99,7 @@
|
||||
|
||||
<div>
|
||||
<%= f.label :completion_status, class: "block text-sm font-medium text-gray-700" %>
|
||||
<%= f.select :completion_status, [["Backlog", "backlog"], ["Currently Playing", "currently_playing"], ["Completed", "completed"], ["On Hold", "on_hold"], ["Not Playing", "not_playing"]], { include_blank: "Select Status" }, class: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500" %>
|
||||
<%= f.select :completion_status, [["Backlog", "backlog"], ["Currently Playing", "currently_playing"], ["Completed", "completed"], ["On Hold", "on_hold"], ["Not Playing", "not_playing"]], { prompt: "Select Status", selected: "backlog" }, class: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500" %>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
@@ -123,7 +123,7 @@
|
||||
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
|
||||
<div>
|
||||
<%= f.label :condition, class: "block text-sm font-medium text-gray-700" %>
|
||||
<%= f.select :condition, [["CIB (Complete in Box)", "cib"], ["Loose", "loose"], ["Sealed", "sealed"], ["Good", "good"], ["Fair", "fair"]], { include_blank: "Select Condition" }, class: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500" %>
|
||||
<%= f.select :condition, [["CIB (Complete in Box)", "cib"], ["Loose", "loose"], ["Sealed", "sealed"], ["Good", "good"], ["Fair", "fair"]], { prompt: "Select Condition", selected: "loose" }, class: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500" %>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
@@ -180,10 +180,6 @@
|
||||
<p class="mt-1 text-xs text-gray-500">Start typing to see previously used stores</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<%= f.label :price_paid, class: "block text-sm font-medium text-gray-700" %>
|
||||
<%= f.number_field :price_paid, step: 0.01, class: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500" %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -1,23 +1,29 @@
|
||||
<div class="max-w-4xl mx-auto text-center py-16">
|
||||
<h1 class="text-5xl font-bold text-gray-900 mb-6">Welcome to TurboVault</h1>
|
||||
<p class="text-xl text-gray-600 mb-8">Track and manage your video game collection with ease (Test Deployment v1.0.1)</p>
|
||||
|
||||
<p class="text-xl text-gray-600 mb-8">Track and manage your video game collection with ease.</p>
|
||||
|
||||
<div class="space-x-4">
|
||||
<%= link_to "Get Started", signup_path, class: "px-8 py-3 bg-indigo-600 text-white rounded-lg hover:bg-indigo-700 text-lg font-semibold" %>
|
||||
<%= link_to "Login", login_path, class: "px-8 py-3 bg-gray-200 text-gray-800 rounded-lg hover:bg-gray-300 text-lg font-semibold" %>
|
||||
<%= link_to "Get Started",
|
||||
signup_path,
|
||||
class:
|
||||
"px-8 py-3 bg-indigo-600 text-white rounded-lg hover:bg-indigo-700 text-lg font-semibold" %>
|
||||
<%= link_to "Login",
|
||||
login_path,
|
||||
class:
|
||||
"px-8 py-3 bg-gray-200 text-gray-800 rounded-lg hover:bg-gray-300 text-lg font-semibold" %>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="mt-16 grid grid-cols-1 md:grid-cols-3 gap-8">
|
||||
<div class="bg-white p-6 rounded-lg shadow">
|
||||
<h3 class="text-xl font-bold mb-2">Track Your Collection</h3>
|
||||
<p class="text-gray-600">Manage both physical and digital games across all platforms</p>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="bg-white p-6 rounded-lg shadow">
|
||||
<h3 class="text-xl font-bold mb-2">Organize with Collections</h3>
|
||||
<p class="text-gray-600">Create custom collections and subcollections for your games</p>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="bg-white p-6 rounded-lg shadow">
|
||||
<h3 class="text-xl font-bold mb-2">View Statistics</h3>
|
||||
<p class="text-gray-600">See insights about your collection with detailed stats</p>
|
||||
|
||||
54
db/migrate/20260413005433_seed_platforms.rb
Normal file
54
db/migrate/20260413005433_seed_platforms.rb
Normal file
@@ -0,0 +1,54 @@
|
||||
class SeedPlatforms < ActiveRecord::Migration[8.1]
|
||||
def up
|
||||
platforms = [
|
||||
# Nintendo
|
||||
{ name: "Nintendo Entertainment System", abbreviation: "NES", manufacturer: "Nintendo" },
|
||||
{ name: "Super Nintendo Entertainment System", abbreviation: "SNES", manufacturer: "Nintendo" },
|
||||
{ name: "Nintendo 64", abbreviation: "N64", manufacturer: "Nintendo" },
|
||||
{ name: "Nintendo GameCube", abbreviation: "GCN", manufacturer: "Nintendo" },
|
||||
{ name: "Nintendo Wii", abbreviation: "Wii", manufacturer: "Nintendo" },
|
||||
{ name: "Nintendo Wii U", abbreviation: "Wii U", manufacturer: "Nintendo" },
|
||||
{ name: "Nintendo Switch", abbreviation: "Switch", manufacturer: "Nintendo" },
|
||||
{ name: "Game Boy", abbreviation: "GB", manufacturer: "Nintendo" },
|
||||
{ name: "Game Boy Color", abbreviation: "GBC", manufacturer: "Nintendo" },
|
||||
{ name: "Game Boy Advance", abbreviation: "GBA", manufacturer: "Nintendo" },
|
||||
{ name: "Nintendo DS", abbreviation: "NDS", manufacturer: "Nintendo" },
|
||||
{ name: "Nintendo 3DS", abbreviation: "3DS", manufacturer: "Nintendo" },
|
||||
|
||||
# Sony
|
||||
{ name: "PlayStation", abbreviation: "PS1", manufacturer: "Sony" },
|
||||
{ name: "PlayStation 2", abbreviation: "PS2", manufacturer: "Sony" },
|
||||
{ name: "PlayStation 3", abbreviation: "PS3", manufacturer: "Sony" },
|
||||
{ name: "PlayStation 4", abbreviation: "PS4", manufacturer: "Sony" },
|
||||
{ name: "PlayStation 5", abbreviation: "PS5", manufacturer: "Sony" },
|
||||
{ name: "PlayStation Portable", abbreviation: "PSP", manufacturer: "Sony" },
|
||||
{ name: "PlayStation Vita", abbreviation: "Vita", manufacturer: "Sony" },
|
||||
|
||||
# Microsoft
|
||||
{ name: "Xbox", abbreviation: "Xbox", manufacturer: "Microsoft" },
|
||||
{ name: "Xbox 360", abbreviation: "X360", manufacturer: "Microsoft" },
|
||||
{ name: "Xbox One", abbreviation: "XB1", manufacturer: "Microsoft" },
|
||||
{ name: "Xbox Series X/S", abbreviation: "XSX", manufacturer: "Microsoft" },
|
||||
|
||||
# Sega
|
||||
{ name: "Sega Genesis", abbreviation: "Genesis", manufacturer: "Sega" },
|
||||
{ name: "Sega Saturn", abbreviation: "Saturn", manufacturer: "Sega" },
|
||||
{ name: "Sega Dreamcast", abbreviation: "DC", manufacturer: "Sega" },
|
||||
{ name: "Sega Game Gear", abbreviation: "GG", manufacturer: "Sega" },
|
||||
|
||||
# PC
|
||||
{ name: "PC", abbreviation: "PC", manufacturer: nil },
|
||||
|
||||
# Other
|
||||
{ name: "Atari 2600", abbreviation: "2600", manufacturer: "Atari" }
|
||||
]
|
||||
|
||||
platforms.each do |platform|
|
||||
Platform.create!(platform)
|
||||
end
|
||||
end
|
||||
|
||||
def down
|
||||
Platform.delete_all
|
||||
end
|
||||
end
|
||||
20
db/migrate/20260413115611_seed_genres.rb
Normal file
20
db/migrate/20260413115611_seed_genres.rb
Normal file
@@ -0,0 +1,20 @@
|
||||
class SeedGenres < ActiveRecord::Migration[8.1]
|
||||
def change
|
||||
# Create Genres
|
||||
puts "Creating genres..."
|
||||
genres = [
|
||||
"Action", "Adventure", "RPG", "JRPG", "Strategy", "Simulation",
|
||||
"Platformer", "Fighting", "Racing", "Sports", "Puzzle", "Horror",
|
||||
"Stealth", "Shooter", "FPS", "TPS", "Rhythm", "Visual Novel",
|
||||
"Roguelike", "Metroidvania", "Sandbox", "MMO", "Turn-Based",
|
||||
"Real-Time Strategy", "Tower Defense", "Card Game", "Party Game",
|
||||
"Educational", "Survival", "Battle Royale"
|
||||
]
|
||||
|
||||
genres.each do |genre_name|
|
||||
Genre.find_or_create_by!(name: genre_name)
|
||||
end
|
||||
|
||||
puts "Created #{Genre.count} genres"
|
||||
end
|
||||
end
|
||||
2
db/schema.rb
generated
2
db/schema.rb
generated
@@ -10,7 +10,7 @@
|
||||
#
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema[8.1].define(version: 2026_03_28_222034) do
|
||||
ActiveRecord::Schema[8.1].define(version: 2026_04_13_115611) do
|
||||
# These are extensions that must be enabled in order to support this database
|
||||
enable_extension "pg_catalog.plpgsql"
|
||||
|
||||
|
||||
70
db/seeds.rb
70
db/seeds.rb
@@ -1,75 +1,5 @@
|
||||
puts "Seeding database..."
|
||||
|
||||
# Create Platforms
|
||||
puts "Creating platforms..."
|
||||
platforms_data = [
|
||||
# Nintendo
|
||||
{ name: "Nintendo Entertainment System", abbreviation: "NES", manufacturer: "Nintendo" },
|
||||
{ name: "Super Nintendo Entertainment System", abbreviation: "SNES", manufacturer: "Nintendo" },
|
||||
{ name: "Nintendo 64", abbreviation: "N64", manufacturer: "Nintendo" },
|
||||
{ name: "GameCube", abbreviation: "GCN", manufacturer: "Nintendo" },
|
||||
{ name: "Wii", abbreviation: "Wii", manufacturer: "Nintendo" },
|
||||
{ name: "Wii U", abbreviation: "Wii U", manufacturer: "Nintendo" },
|
||||
{ name: "Nintendo Switch", abbreviation: "Switch", manufacturer: "Nintendo" },
|
||||
{ name: "Game Boy", abbreviation: "GB", manufacturer: "Nintendo" },
|
||||
{ name: "Game Boy Color", abbreviation: "GBC", manufacturer: "Nintendo" },
|
||||
{ name: "Game Boy Advance", abbreviation: "GBA", manufacturer: "Nintendo" },
|
||||
{ name: "Nintendo DS", abbreviation: "DS", manufacturer: "Nintendo" },
|
||||
{ name: "Nintendo 3DS", abbreviation: "3DS", manufacturer: "Nintendo" },
|
||||
|
||||
# Sony
|
||||
{ name: "PlayStation", abbreviation: "PS1", manufacturer: "Sony" },
|
||||
{ name: "PlayStation 2", abbreviation: "PS2", manufacturer: "Sony" },
|
||||
{ name: "PlayStation 3", abbreviation: "PS3", manufacturer: "Sony" },
|
||||
{ name: "PlayStation 4", abbreviation: "PS4", manufacturer: "Sony" },
|
||||
{ name: "PlayStation 5", abbreviation: "PS5", manufacturer: "Sony" },
|
||||
{ name: "PlayStation Portable", abbreviation: "PSP", manufacturer: "Sony" },
|
||||
{ name: "PlayStation Vita", abbreviation: "PS Vita", manufacturer: "Sony" },
|
||||
|
||||
# Microsoft
|
||||
{ name: "Xbox", abbreviation: "Xbox", manufacturer: "Microsoft" },
|
||||
{ name: "Xbox 360", abbreviation: "X360", manufacturer: "Microsoft" },
|
||||
{ name: "Xbox One", abbreviation: "XB1", manufacturer: "Microsoft" },
|
||||
{ name: "Xbox Series X/S", abbreviation: "Series X/S", manufacturer: "Microsoft" },
|
||||
|
||||
# Sega
|
||||
{ name: "Sega Genesis", abbreviation: "Genesis", manufacturer: "Sega" },
|
||||
{ name: "Sega Saturn", abbreviation: "Saturn", manufacturer: "Sega" },
|
||||
{ name: "Sega Dreamcast", abbreviation: "Dreamcast", manufacturer: "Sega" },
|
||||
{ name: "Sega Game Gear", abbreviation: "Game Gear", manufacturer: "Sega" },
|
||||
|
||||
# Other
|
||||
{ name: "PC", abbreviation: "PC", manufacturer: nil },
|
||||
{ name: "Mobile (iOS)", abbreviation: "iOS", manufacturer: "Apple" },
|
||||
{ name: "Mobile (Android)", abbreviation: "Android", manufacturer: "Google" },
|
||||
{ name: "Arcade", abbreviation: "Arcade", manufacturer: nil }
|
||||
]
|
||||
|
||||
platforms_data.each do |platform_data|
|
||||
Platform.find_or_create_by!(name: platform_data[:name]) do |platform|
|
||||
platform.abbreviation = platform_data[:abbreviation]
|
||||
platform.manufacturer = platform_data[:manufacturer]
|
||||
end
|
||||
end
|
||||
|
||||
puts "Created #{Platform.count} platforms"
|
||||
|
||||
# Create Genres
|
||||
puts "Creating genres..."
|
||||
genres = [
|
||||
"Action", "Adventure", "RPG", "JRPG", "Strategy", "Simulation",
|
||||
"Platformer", "Fighting", "Racing", "Sports", "Puzzle", "Horror",
|
||||
"Stealth", "Shooter", "FPS", "TPS", "Rhythm", "Visual Novel",
|
||||
"Roguelike", "Metroidvania", "Sandbox", "MMO", "Turn-Based",
|
||||
"Real-Time Strategy", "Tower Defense", "Card Game", "Party Game",
|
||||
"Educational", "Survival", "Battle Royale"
|
||||
]
|
||||
|
||||
genres.each do |genre_name|
|
||||
Genre.find_or_create_by!(name: genre_name)
|
||||
end
|
||||
|
||||
puts "Created #{Genre.count} genres"
|
||||
|
||||
# Create demo user and sample games for development
|
||||
if Rails.env.development?
|
||||
|
||||
Reference in New Issue
Block a user