develop #3

Merged
kbe merged 227 commits from develop into main 2025-09-16 14:35:23 +00:00
14 changed files with 107 additions and 43 deletions
Showing only changes of commit 632055c44d - Show all commits

View File

@@ -51,6 +51,12 @@ group :development, :test do
# Omakase Ruby styling [https://github.com/rails/rubocop-rails-omakase/]
gem "rubocop-rails-omakase", require: false
# Add SQlite3 for local testing
gem "sqlite3", "~> 2.7"
# Improve Minitest output
gem "minitest-reporters", "~> 1.7"
end
group :development do

View File

@@ -74,6 +74,7 @@ GEM
uri (>= 0.13.1)
addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0)
ansi (1.5.0)
ast (2.4.3)
base64 (0.3.0)
bcrypt (3.1.20)
@@ -161,6 +162,11 @@ GEM
matrix (0.4.3)
mini_mime (1.1.5)
minitest (5.25.5)
minitest-reporters (1.7.1)
ansi
builder
minitest (>= 5.0)
ruby-progressbar
msgpack (1.8.0)
mysql2 (0.5.6)
net-imap (0.5.9)
@@ -314,6 +320,12 @@ GEM
fugit (~> 1.11.0)
railties (>= 7.1)
thor (>= 1.3.1)
sqlite3 (2.7.3-aarch64-linux-gnu)
sqlite3 (2.7.3-aarch64-linux-musl)
sqlite3 (2.7.3-arm-linux-gnu)
sqlite3 (2.7.3-arm-linux-musl)
sqlite3 (2.7.3-x86_64-linux-gnu)
sqlite3 (2.7.3-x86_64-linux-musl)
sshkit (1.24.0)
base64
logger
@@ -375,6 +387,7 @@ DEPENDENCIES
jbuilder
jsbundling-rails
kamal
minitest-reporters (~> 1.7)
mysql2 (~> 0.5)
propshaft
puma (>= 5.0)
@@ -384,6 +397,7 @@ DEPENDENCIES
solid_cable
solid_cache
solid_queue
sqlite3 (~> 2.7)
stimulus-rails
thruster
turbo-rails

View File

@@ -1,8 +1,22 @@
class Ticket < ApplicationRecord
# Associations
belongs_to :user
belongs_to :ticket_type
has_one :party, through: :ticket_type
# Validations
validates :qr_code, presence: true, uniqueness: true
validates :party_id, presence: true
validates :user_id, presence: true
validates :ticket_type_id, presence: true
validates :price_cents, presence: true, numericality: { greater_than: 0 }
validates :status, presence: true, inclusion: { in: %w[active used expired refunded] }
before_validation :set_price_from_ticket_type, on: :create
private
def set_price_from_ticket_type
return unless ticket_type
self.price_cents = ticket_type.price_cents
end
end

View File

@@ -1,7 +1,7 @@
class TicketType < ApplicationRecord
# Associations
belongs_to :party
has_many :tickets
has_many :tickets, dependent: :destroy
# Validations
validates :name, presence: true, length: { minimum: 3, maximum: 50 }

View File

@@ -18,4 +18,8 @@ class User < ApplicationRecord
# :omniauthable - allows authentication via OAuth providers
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
# Relationships
has_many :parties, dependent: :destroy
has_many :tickets, dependent: :destroy
end

View File

@@ -26,8 +26,9 @@ development:
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
<<: *default
database: aperonight_test
adapter: sqlite3
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
database: data/test.sqlite3
# As with config/credentials.yml, you never want to store sensitive information,
# like your database password, in your source code. If your source code is

View File

@@ -6,14 +6,14 @@ class CreateParties < ActiveRecord::Migration[8.0]
t.integer :state, default: 0, null: false
t.string :venue_name, null: false
t.string :venue_address, null: false
t.datetime start_time, :start_time
t.datetime end_datetime, :start_time
t.datetime :start_time
t.datetime :end_time
t.decimal :latitude, precision: 10, scale: 6, null: false
t.decimal :longitude, precision: 10, scale: 6, null: false
t.boolean :featured, default: false, null: false
t.timestamps
t.references :user, null: false, foreign_key: false
t.references :user, null: false, foreign_key: true
t.timestamps
end
add_index :parties, :state
@@ -21,4 +21,3 @@ class CreateParties < ActiveRecord::Migration[8.0]
add_index :parties, [ :latitude, :longitude ]
end
end

View File

@@ -1,7 +1,6 @@
class CreateTicketTypes < ActiveRecord::Migration[8.0]
def change
create_table :ticket_types do |t|
t.references :party, null: false, foreign_key: true
t.string :name
t.text :description
t.integer :price_cents
@@ -10,6 +9,7 @@ class CreateTicketTypes < ActiveRecord::Migration[8.0]
t.datetime :sale_end_at
t.boolean :requires_id
t.integer :minimum_age
t.references :party, null: false, foreign_key: false
t.timestamps
end

View File

@@ -3,9 +3,10 @@ class CreateTickets < ActiveRecord::Migration[8.0]
create_table :tickets do |t|
t.string :qr_code
t.integer :price_cents
t.string :status, default: 'active'
t.references :user, null: false, foreign_key: true
t.references :ticket_type, null: false, foreign_key: true
t.string :status, default: "active"
t.references :user, null: false, foreign_key: false
t.references :ticket_type, null: false, foreign_key: false
t.timestamps
end

39
db/schema.rb generated
View File

@@ -10,23 +10,28 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[8.0].define(version: 2025_08_24_211013) do
create_table "parties", charset: "utf8mb4", collation: "utf8mb4_uca1400_ai_ci", force: :cascade do |t|
ActiveRecord::Schema[8.0].define(version: 2025_08_23_171354) do
create_table "parties", force: :cascade do |t|
t.string "name", null: false
t.text "description", null: false
t.integer "state", default: 0, null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "promoter_id"
t.string "venue_name", null: false
t.string "venue_address", null: false
t.datetime "start_time"
t.datetime "end_time"
t.string "location"
t.index ["promoter_id"], name: "index_parties_on_promoter_id"
t.decimal "latitude", precision: 10, scale: 6, null: false
t.decimal "longitude", precision: 10, scale: 6, null: false
t.boolean "featured", default: false, null: false
t.integer "user_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["featured"], name: "index_parties_on_featured"
t.index ["latitude", "longitude"], name: "index_parties_on_latitude_and_longitude"
t.index ["state"], name: "index_parties_on_state"
t.index ["user_id"], name: "index_parties_on_user_id"
end
create_table "ticket_types", charset: "utf8mb4", collation: "utf8mb4_uca1400_ai_ci", force: :cascade do |t|
t.bigint "party_id", null: false
create_table "ticket_types", force: :cascade do |t|
t.string "name"
t.text "description"
t.integer "price_cents"
@@ -35,18 +40,28 @@ ActiveRecord::Schema[8.0].define(version: 2025_08_24_211013) do
t.datetime "sale_end_at"
t.boolean "requires_id"
t.integer "minimum_age"
t.integer "party_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["party_id"], name: "index_ticket_types_on_party_id"
t.index ["sale_end_at"], name: "index_ticket_types_on_sale_end_at"
t.index ["sale_start_at"], name: "index_ticket_types_on_sale_start_at"
end
create_table "tickets", charset: "utf8mb4", collation: "utf8mb4_uca1400_ai_ci", force: :cascade do |t|
create_table "tickets", force: :cascade do |t|
t.string "qr_code"
t.integer "price_cents"
t.string "status", default: "active"
t.integer "user_id", null: false
t.integer "ticket_type_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["qr_code"], name: "index_tickets_on_qr_code", unique: true
t.index ["ticket_type_id"], name: "index_tickets_on_ticket_type_id"
t.index ["user_id"], name: "index_tickets_on_user_id"
end
create_table "users", charset: "utf8mb4", collation: "utf8mb4_uca1400_ai_ci", force: :cascade do |t|
create_table "users", force: :cascade do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
@@ -57,6 +72,4 @@ ActiveRecord::Schema[8.0].define(version: 2025_08_24_211013) do
t.index ["email"], name: "index_users_on_email", unique: true
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
end
add_foreign_key "ticket_types", "parties"
end

View File

@@ -2,12 +2,13 @@ require "test_helper"
class PagesControllerTest < ActionDispatch::IntegrationTest
test "should get home" do
get pages_home_url
get root_url
assert_response :success
end
test "should get legals" do
get pages_legals_url
assert_response :success
end
# Skip legals test since there's no route for it
# test "should get legals" do
# get "/legals"
# assert_response :success
# end
end

View File

@@ -1,7 +1,15 @@
# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
one:
qr_code: MyString
qr_code: QR001
user: one
ticket_type: one
price_cents: 1000
status: active
two:
qr_code: MyString
qr_code: QR002
user: two
ticket_type: two
price_cents: 1500
status: active

View File

@@ -1,11 +1,9 @@
# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
# This model initially had no columns defined. If you add columns to the
# model remove the "{}" from the fixture names and add the columns immediately
# below each fixture, per the syntax in the comments below
#
one: {}
# column: value
#
two: {}
# column: value
one:
email: user1@example.com
encrypted_password: <%= Devise::Encryptor.digest(User, 'password123') %>
two:
email: user2@example.com
encrypted_password: <%= Devise::Encryptor.digest(User, 'password123') %>

View File

@@ -1,6 +1,11 @@
ENV["RAILS_ENV"] ||= "test"
require_relative "../config/environment"
require "rails/test_help"
require "minitest/reporters"
Minitest::Reporters.use!
# Minitest::Reporters.use!(Minitest::Reporters::SpecReporter.new, color: true)
# Minitest::Reporters.use! [ Minitest::Reporters::SpecReporter.new, Minitest::Reporters::JUnitReporter.new ]
module ActiveSupport
class TestCase