Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add User, School, Provider models and default scopes #31

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
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
elceebee marked this conversation as resolved.
Show resolved Hide resolved
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
Loading