diff --git a/app/models/adopter_application.rb b/app/models/adopter_application.rb index 06a2c5a62..4984ac424 100644 --- a/app/models/adopter_application.rb +++ b/app/models/adopter_application.rb @@ -9,6 +9,7 @@ # created_at :datetime not null # updated_at :datetime not null # adopter_foster_account_id :bigint not null +# form_submission_id :bigint not null # organization_id :bigint not null # pet_id :bigint not null # @@ -16,18 +17,21 @@ # # index_adopter_applications_on_account_and_pet (pet_id,adopter_foster_account_id) UNIQUE # index_adopter_applications_on_adopter_foster_account_id (adopter_foster_account_id) +# index_adopter_applications_on_form_submission_id (form_submission_id) # index_adopter_applications_on_organization_id (organization_id) # index_adopter_applications_on_pet_id (pet_id) # # Foreign Keys # # fk_rails_... (adopter_foster_account_id => adopter_foster_accounts.id) +# fk_rails_... (form_submission_id => form_submissions.id) # fk_rails_... (pet_id => pets.id) # class AdopterApplication < ApplicationRecord acts_as_tenant(:organization) belongs_to :pet, touch: true belongs_to :adopter_foster_account + belongs_to :form_submission broadcasts_refreshes diff --git a/app/models/custom_form/submitted_answer.rb b/app/models/custom_form/submitted_answer.rb index a653bfa51..1f88c0179 100644 --- a/app/models/custom_form/submitted_answer.rb +++ b/app/models/custom_form/submitted_answer.rb @@ -2,21 +2,24 @@ # # Table name: submitted_answers # -# id :bigint not null, primary key -# question_snapshot :json not null -# value :json not null -# created_at :datetime not null -# updated_at :datetime not null -# question_id :bigint not null -# user_id :bigint not null +# id :bigint not null, primary key +# question_snapshot :json not null +# value :json not null +# created_at :datetime not null +# updated_at :datetime not null +# form_submission_id :bigint not null +# question_id :bigint not null +# user_id :bigint not null # # Indexes # -# index_submitted_answers_on_question_id (question_id) -# index_submitted_answers_on_user_id (user_id) +# index_submitted_answers_on_form_submission_id (form_submission_id) +# index_submitted_answers_on_question_id (question_id) +# index_submitted_answers_on_user_id (user_id) # # Foreign Keys # +# fk_rails_... (form_submission_id => form_submissions.id) # fk_rails_... (question_id => questions.id) # fk_rails_... (user_id => users.id) # @@ -24,6 +27,7 @@ module CustomForm class SubmittedAnswer < ApplicationRecord belongs_to :question belongs_to :user + belongs_to :form_submission has_one :form, class_name: "CustomForm::Form", through: :question has_one :organization, through: :form diff --git a/app/models/form_submission.rb b/app/models/form_submission.rb new file mode 100644 index 000000000..cbbb11fe5 --- /dev/null +++ b/app/models/form_submission.rb @@ -0,0 +1,33 @@ +# == Schema Information +# +# Table name: form_submissions +# +# id :bigint not null, primary key +# created_at :datetime not null +# updated_at :datetime not null +# organization_id :bigint not null +# person_id :bigint not null +# +# Indexes +# +# index_form_submissions_on_organization_id (organization_id) +# index_form_submissions_on_person_id (person_id) +# +# Foreign Keys +# +# fk_rails_... (organization_id => organizations.id) +# fk_rails_... (person_id => people.id) +# +# The FormSubmission model binds together a set of submitted answers from an adopter into a single submission. This represents a snapshot in time. +# If an adopter submits answers either through an in-app form or a third party form that is uploaded to the app, +# we will have a set of answers belonging to a form submission. +# This form submission can be valid for a period of time to allow the user to apply to adopt multiple pets. +# If this time expires, or the person's context changes and they need to update their responses, we now have a new set of answers and a new form submission. +# +class FormSubmission < ApplicationRecord + acts_as_tenant(:organization) + belongs_to :person + + has_many :adopter_applications + has_many :submitted_answers, class_name: "CustomForm::SubmittedAnswer" +end diff --git a/app/models/organization.rb b/app/models/organization.rb index 7b429873d..def68c50c 100644 --- a/app/models/organization.rb +++ b/app/models/organization.rb @@ -25,5 +25,6 @@ class Organization < ApplicationRecord has_one :profile, dependent: :destroy, class_name: "OrganizationProfile", required: true has_one :location, through: :profile + has_one :form_submission, dependent: :destroy has_one :custom_page, dependent: :destroy end diff --git a/app/models/person.rb b/app/models/person.rb index d81c0ff34..9ea97da29 100644 --- a/app/models/person.rb +++ b/app/models/person.rb @@ -23,6 +23,7 @@ class Person < ApplicationRecord include Avatarable acts_as_tenant(:organization) + has_one :form_submission, dependent: :destroy validates :name, presence: true validates :email, presence: true, diff --git a/db/migrate/20240628222914_create_form_submissions.rb b/db/migrate/20240628222914_create_form_submissions.rb new file mode 100644 index 000000000..c32918cf8 --- /dev/null +++ b/db/migrate/20240628222914_create_form_submissions.rb @@ -0,0 +1,10 @@ +class CreateFormSubmissions < ActiveRecord::Migration[7.1] + def change + create_table :form_submissions do |t| + t.references :person, null: false, foreign_key: true + t.references :organization, null: false, foreign_key: true + + t.timestamps + end + end +end diff --git a/db/migrate/20240628224520_add_form_submission_to_submitted_answers.rb b/db/migrate/20240628224520_add_form_submission_to_submitted_answers.rb new file mode 100644 index 000000000..f43d39c5d --- /dev/null +++ b/db/migrate/20240628224520_add_form_submission_to_submitted_answers.rb @@ -0,0 +1,5 @@ +class AddFormSubmissionToSubmittedAnswers < ActiveRecord::Migration[7.1] + def change + add_reference :submitted_answers, :form_submission, null: false, foreign_key: true + end +end diff --git a/db/migrate/20240628225125_add_form_submission_to_adopter_applications.rb b/db/migrate/20240628225125_add_form_submission_to_adopter_applications.rb new file mode 100644 index 000000000..a86e1b682 --- /dev/null +++ b/db/migrate/20240628225125_add_form_submission_to_adopter_applications.rb @@ -0,0 +1,5 @@ +class AddFormSubmissionToAdopterApplications < ActiveRecord::Migration[7.1] + def change + add_reference :adopter_applications, :form_submission, null: false, foreign_key: true + end +end diff --git a/db/schema.rb b/db/schema.rb index 1efb5c8db..4792dd058 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.1].define(version: 2024_06_28_165551) do +ActiveRecord::Schema[7.1].define(version: 2024_06_28_225125) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -51,7 +51,9 @@ t.text "notes" t.boolean "profile_show", default: true t.bigint "organization_id", null: false + t.bigint "form_submission_id", null: false t.index ["adopter_foster_account_id"], name: "index_adopter_applications_on_adopter_foster_account_id" + t.index ["form_submission_id"], name: "index_adopter_applications_on_form_submission_id" t.index ["organization_id"], name: "index_adopter_applications_on_organization_id" t.index ["pet_id", "adopter_foster_account_id"], name: "index_adopter_applications_on_account_and_pet", unique: true t.index ["pet_id"], name: "index_adopter_applications_on_pet_id" @@ -148,6 +150,15 @@ t.index ["form_id"], name: "index_form_profiles_on_form_id" end + create_table "form_submissions", force: :cascade do |t| + t.bigint "person_id", null: false + t.bigint "organization_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["organization_id"], name: "index_form_submissions_on_organization_id" + t.index ["person_id"], name: "index_form_submissions_on_person_id" + end + create_table "forms", force: :cascade do |t| t.string "name", null: false t.text "description" @@ -294,6 +305,8 @@ t.bigint "user_id", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.bigint "form_submission_id", null: false + t.index ["form_submission_id"], name: "index_submitted_answers_on_form_submission_id" t.index ["question_id"], name: "index_submitted_answers_on_question_id" t.index ["user_id"], name: "index_submitted_answers_on_user_id" end @@ -352,6 +365,7 @@ add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id" add_foreign_key "adopter_applications", "adopter_foster_accounts" + add_foreign_key "adopter_applications", "form_submissions" add_foreign_key "adopter_applications", "pets" add_foreign_key "adopter_foster_accounts", "users" add_foreign_key "adopter_foster_profiles", "adopter_foster_accounts" @@ -360,6 +374,8 @@ add_foreign_key "default_pet_tasks", "organizations" add_foreign_key "faqs", "organizations" add_foreign_key "form_profiles", "forms" + add_foreign_key "form_submissions", "organizations" + add_foreign_key "form_submissions", "people" add_foreign_key "forms", "organizations" add_foreign_key "likes", "adopter_foster_accounts" add_foreign_key "likes", "organizations" @@ -373,6 +389,7 @@ add_foreign_key "questions", "forms" add_foreign_key "staff_accounts", "organizations" add_foreign_key "staff_accounts", "users" + add_foreign_key "submitted_answers", "form_submissions" add_foreign_key "submitted_answers", "questions" add_foreign_key "submitted_answers", "users" add_foreign_key "tasks", "pets" diff --git a/db/seeds/01_alta.rb b/db/seeds/01_alta.rb index a5ba08612..744462ace 100644 --- a/db/seeds/01_alta.rb +++ b/db/seeds/01_alta.rb @@ -401,17 +401,20 @@ end_date: upcoming_end_date ) + @form_submission = FormSubmission.new(organization: @organization, person: Person.new(name: "John Doe", email: "Doe@gmail.com")) + 10.times do adopter_application = AdopterApplication.new( notes: Faker::Lorem.paragraph, profile_show: true, status: rand(0..4), adopter_foster_account: AdopterFosterAccount.all.sample, - pet: Pet.all.sample + pet: Pet.all.sample, + form_submission: @form_submission ) # Prevent duplicate adopter applications. - redo if AdopterApplication.where(pet_id: adopter_application.pet_id, + redo if AdopterApplication.where(pet_id: adopter_application.pet_id, form_submission_id: adopter_application.form_submission_id, adopter_foster_account_id: adopter_application.adopter_foster_account_id).exists? if adopter_application.valid? diff --git a/db/seeds/02_baja.rb b/db/seeds/02_baja.rb index 185f1c5ed..e15a9beb3 100644 --- a/db/seeds/02_baja.rb +++ b/db/seeds/02_baja.rb @@ -354,13 +354,16 @@ end_date: upcoming_end_date ) + @form_submission = FormSubmission.new(organization: @organization, person: Person.new(name: "John Doe", email: "Doe@gmail.com")) + 10.times do adopter_application = AdopterApplication.new( notes: Faker::Lorem.paragraph, profile_show: true, status: rand(0..4), adopter_foster_account: AdopterFosterAccount.all.sample, - pet: Pet.all.sample + pet: Pet.all.sample, + form_submission: @form_submission ) # Prevent duplicate adopter applications. diff --git a/test/controllers/organizations/adopter_fosterer/adopter_applications_controller_test.rb b/test/controllers/organizations/adopter_fosterer/adopter_applications_controller_test.rb index d19c1c42b..c348b5242 100644 --- a/test/controllers/organizations/adopter_fosterer/adopter_applications_controller_test.rb +++ b/test/controllers/organizations/adopter_fosterer/adopter_applications_controller_test.rb @@ -29,8 +29,9 @@ class Organizations::AdopterFosterer::AdopterApplicationsControllerTest < Action should "count the total number of applications" do organization = ActsAsTenant.current_tenant + form_submission = create(:form_submission) adopter_foster_account = create(:adopter_foster_account, user: @user, organization: organization) - create_list(:adopter_application, 2, adopter_foster_account: adopter_foster_account) + create_list(:adopter_application, 2, adopter_foster_account: adopter_foster_account, form_submission: form_submission) get adopter_fosterer_dashboard_index_path @@ -68,7 +69,8 @@ class Organizations::AdopterFosterer::AdopterApplicationsControllerTest < Action context "#update" do setup do - @adopter_application = create(:adopter_application, user: @user) + @form_submission = create(:form_submission) + @adopter_application = create(:adopter_application, user: @user, form_submission: @form_submission) @params = {adopter_application: { status: "withdrawn" }} diff --git a/test/controllers/organizations/staff/adoption_application_reviews_controller_test.rb b/test/controllers/organizations/staff/adoption_application_reviews_controller_test.rb index 0624fba1b..04c0c1849 100644 --- a/test/controllers/organizations/staff/adoption_application_reviews_controller_test.rb +++ b/test/controllers/organizations/staff/adoption_application_reviews_controller_test.rb @@ -7,7 +7,8 @@ class Organizations::Staff::AdoptionApplicationReviewsControllerTest < ActionDis setup do @organization = ActsAsTenant.current_tenant - @adopter_application = create(:adopter_application) + @form_submission = create(:form_submission) + @adopter_application = create(:adopter_application, form_submission: @form_submission) user = create(:staff) sign_in user @@ -88,8 +89,8 @@ class Organizations::Staff::AdoptionApplicationReviewsControllerTest < ActionDis @pet2 = create(:pet, name: "Tycho") adopter_foster_account1 = create(:adopter_foster_account, :with_profile) adopter_foster_account2 = create(:adopter_foster_account, :with_profile) - create(:adopter_application, pet: @pet1, adopter_foster_account: adopter_foster_account1) - create(:adopter_application, pet: @pet2, adopter_foster_account: adopter_foster_account2) + create(:adopter_application, pet: @pet1, adopter_foster_account: adopter_foster_account1, form_submission: create(:form_submission)) + create(:adopter_application, pet: @pet2, adopter_foster_account: adopter_foster_account2, form_submission: create(:form_submission)) end should "return applications for a specific pet name" do @@ -107,8 +108,8 @@ class Organizations::Staff::AdoptionApplicationReviewsControllerTest < ActionDis user: create(:user, first_name: "David", last_name: "Attenborough")) adopter_foster_account2 = create(:adopter_foster_account, :with_profile, user: create(:user, first_name: "Jane", last_name: "Goodall")) - create(:adopter_application, pet: @pet, adopter_foster_account: adopter_foster_account1) - create(:adopter_application, pet: @pet, adopter_foster_account: adopter_foster_account2) + create(:adopter_application, pet: @pet, adopter_foster_account: adopter_foster_account1, form_submission: create(:form_submission)) + create(:adopter_application, pet: @pet, adopter_foster_account: adopter_foster_account2, form_submission: create(:form_submission)) end should "return applications for a specific applicant name" do @@ -124,8 +125,8 @@ class Organizations::Staff::AdoptionApplicationReviewsControllerTest < ActionDis @pet = create(:pet) adopter_foster_account1 = create(:adopter_foster_account, :with_profile) adopter_foster_account2 = create(:adopter_foster_account, :with_profile) - @application_under_review = create(:adopter_application, pet: @pet, adopter_foster_account: adopter_foster_account1, status: :under_review) - @application_awaiting_review = create(:adopter_application, pet: @pet, adopter_foster_account: adopter_foster_account2, status: :awaiting_review) + @application_under_review = create(:adopter_application, pet: @pet, adopter_foster_account: adopter_foster_account1, status: :under_review, form_submission: create(:form_submission)) + @application_awaiting_review = create(:adopter_application, pet: @pet, adopter_foster_account: adopter_foster_account2, status: :awaiting_review, form_submission: create(:form_submission)) end should "return pets only with applications of the specified status" do diff --git a/test/factories/adopter_applications.rb b/test/factories/adopter_applications.rb index 6dffa449f..78dc62558 100644 --- a/test/factories/adopter_applications.rb +++ b/test/factories/adopter_applications.rb @@ -18,6 +18,7 @@ end pet + form_submission trait :adoption_pending do status { 2 } diff --git a/test/factories/form_submisison.rb b/test/factories/form_submisison.rb new file mode 100644 index 000000000..31dcc8e9e --- /dev/null +++ b/test/factories/form_submisison.rb @@ -0,0 +1,6 @@ +FactoryBot.define do + factory :form_submission do + association :person + association :organization + end +end diff --git a/test/integration/adoption_application_reviews_test.rb b/test/integration/adoption_application_reviews_test.rb index a4e753c38..fa56daffa 100644 --- a/test/integration/adoption_application_reviews_test.rb +++ b/test/integration/adoption_application_reviews_test.rb @@ -2,12 +2,13 @@ class AdoptionApplicationReviewsTest < ActionDispatch::IntegrationTest setup do - @awaiting_review_app = create(:adopter_application, status: :awaiting_review) - @under_review_app = create(:adopter_application, status: :under_review) - @adoption_pending_app = create(:adopter_application, :adoption_pending) - @withdrawn_app = create(:adopter_application, :withdrawn) - @successful_applicant_app = create(:adopter_application, status: :successful_applicant) - @adoption_made_app = create(:adopter_application, status: :adoption_made) + @form_submission = create(:form_submission) + @awaiting_review_app = create(:adopter_application, status: :awaiting_review, form_submission: @form_submission) + @under_review_app = create(:adopter_application, status: :under_review, form_submission: @form_submission) + @adoption_pending_app = create(:adopter_application, :adoption_pending, form_submission: @form_submission) + @withdrawn_app = create(:adopter_application, :withdrawn, form_submission: @form_submission) + @successful_applicant_app = create(:adopter_application, status: :successful_applicant, form_submission: @form_submission) + @adoption_made_app = create(:adopter_application, status: :adoption_made, form_submission: @form_submission) @organization = create(:organization) @custom_page = create(:custom_page, organization: @organization) Current.organization = @organization diff --git a/test/models/adopter_application_test.rb b/test/models/adopter_application_test.rb index 327da43d2..7a30d953e 100644 --- a/test/models/adopter_application_test.rb +++ b/test/models/adopter_application_test.rb @@ -2,17 +2,24 @@ class AdopterApplicationTest < ActiveSupport::TestCase setup do - @application = create(:adopter_application) + @form_submission = create(:form_submission) + @application = create(:adopter_application, form_submission: @form_submission) + end + + context "associations" do + should belong_to(:pet).touch(true) + should belong_to(:adopter_foster_account) + should belong_to(:form_submission) end context "self.retire_applications" do context "when some applications match pet_id and some do not" do setup do @selected_applications = Array.new(3) { - create(:adopter_application, pet_id: @application.pet_id) + create(:adopter_application, pet_id: @application.pet_id, form_submission: @form_submission) } @unselected_applications = Array.new(2) { - create(:adopter_application) + create(:adopter_application, form_submission: @form_submission) } end diff --git a/test/models/custom_form/submitted_answer_test.rb b/test/models/custom_form/submitted_answer_test.rb index 053e33182..5afdcdc4e 100644 --- a/test/models/custom_form/submitted_answer_test.rb +++ b/test/models/custom_form/submitted_answer_test.rb @@ -4,6 +4,7 @@ class CustomForm::SubmittedAnswerTest < ActiveSupport::TestCase context "associations" do should belong_to(:question) should belong_to(:user) + should belong_to(:form_submission) should have_one(:form).through(:question) should have_one(:organization).through(:form) diff --git a/test/models/form_submission_test.rb b/test/models/form_submission_test.rb new file mode 100644 index 000000000..b15283af0 --- /dev/null +++ b/test/models/form_submission_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +class FormSubmissionTest < ActiveSupport::TestCase + context "associations" do + should belong_to(:person) + should have_many(:adopter_applications) + should have_many(:submitted_answers) + end +end diff --git a/test/models/organization_test.rb b/test/models/organization_test.rb index f09666678..5be20f00d 100644 --- a/test/models/organization_test.rb +++ b/test/models/organization_test.rb @@ -10,6 +10,7 @@ class OrganizationTest < ActiveSupport::TestCase should have_many(:faqs) should have_one(:profile).dependent(:destroy).required + should have_one(:form_submission).dependent(:destroy) should have_one(:custom_page).dependent(:destroy) end end diff --git a/test/policies/adopter_application_policy_test.rb b/test/policies/adopter_application_policy_test.rb index 5e4b10b8b..9eede8b78 100644 --- a/test/policies/adopter_application_policy_test.rb +++ b/test/policies/adopter_application_policy_test.rb @@ -23,11 +23,12 @@ class AdopterApplicationPolicyTest < ActiveSupport::TestCase context "when there are applications that do not belong to user" do setup do + @form_submission = create(:form_submission) @user_applications = [ - create(:adopter_application, user: @user), - create(:adopter_application, user: @user) + create(:adopter_application, user: @user, form_submission: @form_submission), + create(:adopter_application, user: @user, form_submission: @form_submission) ] - @other_application = create(:adopter_application) + @other_application = create(:adopter_application, form_submission: @form_submission) end should "return only user's applications" do @@ -39,7 +40,7 @@ class AdopterApplicationPolicyTest < ActiveSupport::TestCase context "when user has no applications" do setup do - @other_application = create(:adopter_application) + @other_application = create(:adopter_application, form_submission: create(:form_submission)) end should "return empty array" do @@ -170,7 +171,7 @@ class AdopterApplicationPolicyTest < ActiveSupport::TestCase context "when user already has an existing application for the pet" do setup do - @existing_app = create(:adopter_application, user: @user, pet: @pet) + @existing_app = create(:adopter_application, user: @user, pet: @pet, form_submission: create(:form_submission)) end should "return false" do @@ -200,7 +201,8 @@ class AdopterApplicationPolicyTest < ActiveSupport::TestCase context "existing record action" do setup do - @adopter_application = create(:adopter_application) + @form_submission = create(:form_submission) + @adopter_application = create(:adopter_application, form_submission: @form_submission) @policy = -> { AdopterApplicationPolicy.new(@adopter_application, user: @user) } diff --git a/test/policies/organizations/adopter_application_policy_test.rb b/test/policies/organizations/adopter_application_policy_test.rb index 467b875f7..b8084ece8 100644 --- a/test/policies/organizations/adopter_application_policy_test.rb +++ b/test/policies/organizations/adopter_application_policy_test.rb @@ -113,7 +113,8 @@ class Organizations::AdopterApplicationPolicyTest < ActiveSupport::TestCase context "existing record action" do setup do - @adopter_application = create(:adopter_application) + @form_submission = create(:form_submission) + @adopter_application = create(:adopter_application, form_submission: @form_submission) @policy = -> { Organizations::AdopterApplicationPolicy.new( @adopter_application, user: @user @@ -164,7 +165,8 @@ class Organizations::AdopterApplicationPolicyTest < ActiveSupport::TestCase context "when application belongs to a different organization" do setup do ActsAsTenant.with_tenant(create(:organization)) do - @adopter_application = create(:adopter_application) + @form_submission = create(:form_submission) + @adopter_application = create(:adopter_application, form_submission: @form_submission) end end @@ -198,7 +200,8 @@ class Organizations::AdopterApplicationPolicyTest < ActiveSupport::TestCase context "when application belongs to a different organization" do setup do ActsAsTenant.with_tenant(create(:organization)) do - @adopter_application = create(:adopter_application) + @form_submission = create(:form_submission) + @adopter_application = create(:adopter_application, form_submission: @form_submission) end end diff --git a/test/system/adoption_creation_test.rb b/test/system/adoption_creation_test.rb index a83243c8c..1634713f1 100644 --- a/test/system/adoption_creation_test.rb +++ b/test/system/adoption_creation_test.rb @@ -4,7 +4,7 @@ class AdoptionCreationTest < ApplicationSystemTestCase setup do user = create(:staff) @pet = create(:pet) - create(:adopter_application, :successful_applicant, pet_id: @pet.id) + create(:adopter_application, :successful_applicant, pet_id: @pet.id, form_submission: create(:form_submission)) sign_in user end diff --git a/test/system/adoption_fosterer_test.rb b/test/system/adoption_fosterer_test.rb index d6f089c76..d4be6910f 100644 --- a/test/system/adoption_fosterer_test.rb +++ b/test/system/adoption_fosterer_test.rb @@ -7,7 +7,7 @@ class AdoptionFostererTest < ApplicationSystemTestCase @custom_page = create(:custom_page, :with_about_us_image, organization: @org) @pet = create(:pet) - create(:adopter_application, pet: @pet, adopter_foster_account: @user.adopter_foster_account, organization: @org) + create(:adopter_application, pet: @pet, adopter_foster_account: @user.adopter_foster_account, organization: @org, form_submission: create(:form_submission)) sign_in @user end