Skip to content

Commit

Permalink
Migrations for basic data models (user, school, provider)
Browse files Browse the repository at this point in the history
  • Loading branch information
elceebee committed Dec 18, 2023
1 parent 6c36835 commit 2e05f0b
Show file tree
Hide file tree
Showing 32 changed files with 561 additions and 53 deletions.
20 changes: 20 additions & 0 deletions app/models/claims/school.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# == Schema Information
#
# Table name: schools
#
# id :uuid not null, primary key
# claims :boolean default(FALSE)
# placements :boolean default(FALSE)
# urn :string not null
# created_at :datetime not null
# updated_at :datetime not null
#
# Indexes
#
# index_schools_on_claims (claims)
# index_schools_on_placements (placements)
# index_schools_on_urn (urn) UNIQUE
#
class Claims::School < School
default_scope { claims }
end
20 changes: 20 additions & 0 deletions app/models/claims/user.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# == Schema Information
#
# Table name: users
#
# id :uuid not null, primary key
# email :string not null
# first_name :string not null
# last_name :string not null
# service :enum not null
# support_user :boolean default(FALSE)
# created_at :datetime not null
# updated_at :datetime not null
#
# Indexes
#
# index_users_on_service_and_email (service,email) UNIQUE
#
class Claims::User < User
default_scope { claims }
end
2 changes: 2 additions & 0 deletions app/models/gias_school.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
# index_gias_schools_on_urn (urn) UNIQUE
#
class GiasSchool < ApplicationRecord
has_one :school, foreign_key: :urn, primary_key: :urn

validates :urn, presence: true
validates :urn, uniqueness: { case_sensitive: false }
validates :name, presence: true
Expand Down
16 changes: 9 additions & 7 deletions app/models/persona.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,18 @@
#
# Table name: users
#
# id :uuid not null, primary key
# email :string not null
# first_name :string not null
# last_name :string not null
# created_at :datetime not null
# updated_at :datetime not null
# id :uuid not null, primary key
# email :string not null
# first_name :string not null
# last_name :string not null
# service :enum not null
# support_user :boolean default(FALSE)
# created_at :datetime not null
# updated_at :datetime not null
#
# Indexes
#
# index_users_on_email (email) UNIQUE
# index_users_on_service_and_email (service,email) UNIQUE
#
class Persona < User
default_scope { where(email: PERSONA_EMAILS) }
Expand Down
20 changes: 20 additions & 0 deletions app/models/placements/school.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# == Schema Information
#
# Table name: schools
#
# id :uuid not null, primary key
# claims :boolean default(FALSE)
# placements :boolean default(FALSE)
# urn :string not null
# created_at :datetime not null
# updated_at :datetime not null
#
# Indexes
#
# index_schools_on_claims (claims)
# index_schools_on_placements (placements)
# index_schools_on_urn (urn) UNIQUE
#
class Placements::School < School
default_scope { placements }
end
20 changes: 20 additions & 0 deletions app/models/placements/support_user.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# == Schema Information
#
# Table name: users
#
# id :uuid not null, primary key
# email :string not null
# first_name :string not null
# last_name :string not null
# service :enum not null
# support_user :boolean default(FALSE)
# created_at :datetime not null
# updated_at :datetime not null
#
# Indexes
#
# index_users_on_service_and_email (service,email) UNIQUE
#
class Placements::SupportUser < Placements::User
default_scope { support_users }
end
20 changes: 20 additions & 0 deletions app/models/placements/user.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# == Schema Information
#
# Table name: users
#
# id :uuid not null, primary key
# email :string not null
# first_name :string not null
# last_name :string not null
# service :enum not null
# support_user :boolean default(FALSE)
# created_at :datetime not null
# updated_at :datetime not null
#
# Indexes
#
# index_users_on_service_and_email (service,email) UNIQUE
#
class Placements::User < User
default_scope { placements }
end
17 changes: 17 additions & 0 deletions app/models/provider.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# == Schema Information
#
# Table name: providers
#
# id :uuid not null, primary key
# provider_code :string not null
# created_at :datetime not null
# updated_at :datetime not null
#
# Indexes
#
# index_providers_on_provider_code (provider_code) UNIQUE
#
class Provider < ApplicationRecord
validates :provider_code, presence: true
validates :provider_code, uniqueness: { case_sensitive: false }
end
25 changes: 25 additions & 0 deletions app/models/school.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# == Schema Information
#
# Table name: schools
#
# id :uuid not null, primary key
# claims :boolean default(FALSE)
# placements :boolean default(FALSE)
# urn :string not null
# created_at :datetime not null
# updated_at :datetime not null
#
# Indexes
#
# index_schools_on_claims (claims)
# index_schools_on_placements (placements)
# index_schools_on_urn (urn) UNIQUE
#
class School < ApplicationRecord
has_one :gias_school, foreign_key: :urn, primary_key: :urn
validates :urn, presence: true
validates :urn, uniqueness: { case_sensitive: false }

scope :placements, -> { where placements: true }
scope :claims, -> { where claims: true }
end
25 changes: 17 additions & 8 deletions app/models/user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,29 @@
#
# Table name: users
#
# id :uuid not null, primary key
# email :string not null
# first_name :string not null
# last_name :string not null
# created_at :datetime not null
# updated_at :datetime not null
# id :uuid not null, primary key
# email :string not null
# first_name :string not null
# last_name :string not null
# service :enum not null
# support_user :boolean default(FALSE)
# created_at :datetime not null
# updated_at :datetime not null
#
# Indexes
#
# index_users_on_email (email) UNIQUE
# index_users_on_service_and_email (service,email) UNIQUE
#
class User < ApplicationRecord
enum :service,
{ no_service: "no_service", claims: "claims", placements: "placements" },
validate: true

validates :first_name, presence: true
validates :last_name, presence: true
validates :email, presence: true
validates :email, uniqueness: { case_sensitive: false }
validates :service, presence: true
validates :email, uniqueness: { scope: :service, case_sensitive: false }

scope :support_users, -> { where(support_user: true) }
end
7 changes: 6 additions & 1 deletion config/initializers/persona.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,12 @@
email: "patricia@example.com"
},
{ first_name: "Mary", last_name: "Lawson", email: "mary@example.com" },
{ first_name: "Colin", last_name: "Chapman", email: "colin@example.com" }
{
first_name: "Colin",
last_name: "Chapman",
email: "colin@example.com",
support_user: true
}
].push((DEVELOPER_PERSONA if defined?(DEVELOPER_PERSONA))).compact.freeze

PERSONA_EMAILS = PERSONAS.map { |persona| persona[:email] }
11 changes: 11 additions & 0 deletions db/migrate/20231214141009_create_schools.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
class CreateSchools < ActiveRecord::Migration[7.1]
def change
create_table :schools, id: :uuid do |t|
t.string :urn, null: false, index: { unique: true }
t.boolean :placements, default: false, index: true
t.boolean :claims, default: false, index: true

t.timestamps
end
end
end
9 changes: 9 additions & 0 deletions db/migrate/20231214142055_create_providers.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
class CreateProviders < ActiveRecord::Migration[7.1]
def change
create_table :providers, id: :uuid do |t|
t.string :provider_code, null: false, index: { unique: true }

t.timestamps
end
end
end
5 changes: 5 additions & 0 deletions db/migrate/20231216101427_add_support_user_to_users.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class AddSupportUserToUsers < ActiveRecord::Migration[7.1]
def change
add_column :users, :support_user, :boolean, default: false
end
end
6 changes: 6 additions & 0 deletions db/migrate/20231216101536_add_service_enum_to_user.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
class AddServiceEnumToUser < ActiveRecord::Migration[7.1]
def change
create_enum :service, %w[claims placements]
add_column :users, :service, :enum, enum_type: "service", null: false # rubocop:disable Rails/NotNullColumn
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
class AddIndexToUsersOnEmailAndService < ActiveRecord::Migration[7.1]
def change
remove_index :users, :email
add_index :users, %i[service email], unique: true
end
end
28 changes: 26 additions & 2 deletions db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,14 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema[7.1].define(version: 2023_12_13_110952) do
ActiveRecord::Schema[7.1].define(version: 2023_12_16_102842) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"

# Custom types defined in this database.
# Note that some types may not work with other database engines. Be careful if changing database.
create_enum "service", ["claims", "placements"]

create_table "flipflop_features", force: :cascade do |t|
t.string "key", null: false
t.boolean "enabled", default: false, null: false
Expand All @@ -37,13 +41,33 @@
t.index ["urn"], name: "index_gias_schools_on_urn", unique: true
end

create_table "providers", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
t.string "provider_code", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["provider_code"], name: "index_providers_on_provider_code", unique: true
end

create_table "schools", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
t.string "urn", null: false
t.boolean "placements", default: false
t.boolean "claims", default: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["claims"], name: "index_schools_on_claims"
t.index ["placements"], name: "index_schools_on_placements"
t.index ["urn"], name: "index_schools_on_urn", unique: true
end

create_table "users", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
t.string "first_name", null: false
t.string "last_name", null: false
t.string "email", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["email"], name: "index_users_on_email", unique: true
t.boolean "support_user", default: false
t.enum "service", null: false, enum_type: "service"
t.index ["service", "email"], name: "index_users_on_service_and_email", unique: true
end

end
13 changes: 5 additions & 8 deletions db/seeds.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,11 @@
# Persona Creation (Dummy User Creation)
Rails.logger.debug "Creating Personas"

# For each persona...
PERSONAS.each do |persona_attributes|
# Create the persona
Persona.find_or_create_by!(
first_name: persona_attributes[:first_name],
last_name: persona_attributes[:last_name],
email: persona_attributes[:email]
)
# Create the same personas for each service
%w[claims placements].each do |service|
PERSONAS.each do |persona_attributes|
Persona.find_or_create_by!(**persona_attributes, service:)
end
end

Rails.logger.debug "Personas successfully created!"
11 changes: 6 additions & 5 deletions docs/data-model.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,11 +116,11 @@ The `placements_enabled` and `claims_enabled` boolean attributes will indicate w

For example:

| urn | name | placements_enabled | claims_enabled |
| --- | --- | --- | --- |
| 100000 | School A | 1 | 0 |
| 100001 | School B | 0 | 1 |
| 100002 | School C | 1 | 1 |
| urn | name | placements_enabled | claims_enabled |
| ------ | -------- | ------------------ | -------------- |
| 100000 | School A | 1 | 0 |
| 100001 | School B | 0 | 1 |
| 100002 | School C | 1 | 1 |

- School A has only been onboarded into the School Placements service.
- School B has only been onboarded into the Track & Pay service.
Expand Down Expand Up @@ -153,6 +153,7 @@ Since the services will be on different hostnames, they will automatically have
Users are scoped by `service`, which will be either `"placements"` or `"claims"`.

We can consider Users to have the unique composite index:

- `[service, email]`

### Memberships
Expand Down
2 changes: 2 additions & 0 deletions spec/factories/persona.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
factory :persona do
email { "anne_wilson@example.org" }
first_name { "Persona" }
service { "claims" }
sequence(:last_name)

trait :anne do
Expand All @@ -25,6 +26,7 @@
email { "colin@example.com" }
first_name { "Colin" }
last_name { "Chapman" }
support_user { true }
end
end
end
Loading

0 comments on commit 2e05f0b

Please sign in to comment.