From 13aea0d644b5a6cf607910f15ae9095ad3c900e8 Mon Sep 17 00:00:00 2001 From: NDT2000 Date: Fri, 21 Nov 2025 15:14:19 -0500 Subject: [PATCH 1/6] Updated the database --- db/new_seed.sql | 324 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 324 insertions(+) create mode 100644 db/new_seed.sql diff --git a/db/new_seed.sql b/db/new_seed.sql new file mode 100644 index 000000000..66adcfbf1 --- /dev/null +++ b/db/new_seed.sql @@ -0,0 +1,324 @@ +USE expertiza_anonymization; +SET FOREIGN_KEY_CHECKS = 0; +DELIMITER $$ + +DROP PROCEDURE IF EXISTS rename_if_exists $$ +CREATE PROCEDURE rename_if_exists( + IN tbl VARCHAR(255), + IN old_col VARCHAR(255), + IN new_col VARCHAR(255), + IN new_type VARCHAR(255) +) +BEGIN + IF EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_schema = DATABASE() + AND table_name = tbl + AND column_name = old_col + ) AND NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_schema = DATABASE() + AND table_name = tbl + AND column_name = new_col + ) THEN + SET @sql = CONCAT( + 'ALTER TABLE `', tbl, + '` CHANGE COLUMN `', old_col, '` `', new_col, '` ', new_type + ); + PREPARE stmt FROM @sql; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; + END IF; +END $$ + +DROP PROCEDURE IF EXISTS drop_column_if_exists $$ +CREATE PROCEDURE drop_column_if_exists( + IN tbl VARCHAR(255), + IN col VARCHAR(255) +) +BEGIN + IF EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_schema = DATABASE() + AND table_name = tbl + AND column_name = col + ) THEN + SET @sql = CONCAT( + 'ALTER TABLE `', tbl, + '` DROP COLUMN `', col, '`' + ); + PREPARE stmt FROM @sql; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; + END IF; +END $$ + +DROP PROCEDURE IF EXISTS drop_questionnaires_display_type $$ +CREATE PROCEDURE drop_questionnaires_display_type() +BEGIN + IF EXISTS ( + SELECT 1 + FROM information_schema.columns + WHERE table_schema = DATABASE() + AND table_name = 'questionnaires' + AND column_name = 'display_type' + ) THEN + SET @old_sql_mode = @@sql_mode; + SET @new_sql_mode = + REPLACE(REPLACE(@old_sql_mode,'NO_ZERO_DATE',''),'NO_ZERO_IN_DATE',''); + SET SESSION sql_mode = @new_sql_mode; + + SET @sql = 'ALTER TABLE `questionnaires` DROP COLUMN `display_type`'; + PREPARE stmt FROM @sql; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; + + SET SESSION sql_mode = @old_sql_mode; + END IF; +END $$ + +DROP PROCEDURE IF EXISTS add_column_if_not_exists $$ +CREATE PROCEDURE add_column_if_not_exists( + IN tbl VARCHAR(255), + IN col VARCHAR(255), + IN definition VARCHAR(1000) +) +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_schema = DATABASE() + AND table_name = tbl + AND column_name = col + ) THEN + SET @sql = CONCAT( + 'ALTER TABLE `', tbl, + '` ADD COLUMN `', col, '` ', definition + ); + PREPARE stmt FROM @sql; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; + END IF; +END $$ + +DROP PROCEDURE IF EXISTS drop_fk_if_exists $$ +CREATE PROCEDURE drop_fk_if_exists( + IN tbl VARCHAR(255), + IN fk_name VARCHAR(255) +) +BEGIN + IF EXISTS ( + SELECT 1 FROM information_schema.table_constraints + WHERE table_schema = DATABASE() + AND table_name = tbl + AND constraint_type = 'FOREIGN KEY' + AND constraint_name = fk_name + ) THEN + SET @sql = CONCAT( + 'ALTER TABLE `', tbl, + '` DROP FOREIGN KEY `', fk_name, '`' + ); + PREPARE stmt FROM @sql; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; + END IF; +END $$ + +DROP PROCEDURE IF EXISTS rename_table_if_exists $$ +CREATE PROCEDURE rename_table_if_exists( + IN old_name VARCHAR(255), + IN new_name VARCHAR(255) +) +BEGIN + IF EXISTS ( + SELECT 1 FROM information_schema.tables + WHERE table_schema = DATABASE() + AND table_name = old_name + ) AND NOT EXISTS ( + SELECT 1 FROM information_schema.tables + WHERE table_schema = DATABASE() + AND table_name = new_name + ) THEN + SET @sql = CONCAT( + 'RENAME TABLE `', old_name, '` TO `', new_name, '`' + ); + PREPARE stmt FROM @sql; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; + END IF; +END $$ + +DROP PROCEDURE IF EXISTS update_signed_up_teams_from_teams $$ +CREATE PROCEDURE update_signed_up_teams_from_teams() +BEGIN + IF EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_schema = DATABASE() + AND table_name = 'signed_up_teams' + AND column_name = 'comments_for_advertisement' + ) + AND EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_schema = DATABASE() + AND table_name = 'signed_up_teams' + AND column_name = 'advertising_for_partner' + ) + AND EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_schema = DATABASE() + AND table_name = 'teams' + AND column_name = 'comments_for_advertisement' + ) + AND EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_schema = DATABASE() + AND table_name = 'teams' + AND column_name = 'advertise_for_partner' + ) THEN + SET @old_safe_updates = @@sql_safe_updates; + SET SQL_SAFE_UPDATES = 0; + + SET @sql = ' + UPDATE signed_up_teams sut + JOIN teams t ON sut.team_id = t.id + SET + sut.comments_for_advertisement = t.comments_for_advertisement, + sut.advertising_for_partner = t.advertise_for_partner + '; + PREPARE stmt FROM @sql; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; + + SET SQL_SAFE_UPDATES = @old_safe_updates; + END IF; +END $$ + +DROP PROCEDURE IF EXISTS modify_column_if_exists $$ +CREATE PROCEDURE modify_column_if_exists( + IN tbl VARCHAR(255), + IN col VARCHAR(255), + IN definition VARCHAR(1000) +) +BEGIN + IF EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_schema = DATABASE() + AND table_name = tbl + AND column_name = col + ) THEN + SET @sql = CONCAT( + 'ALTER TABLE `', tbl, + '` MODIFY COLUMN `', col, '` ', definition + ); + PREPARE stmt FROM @sql; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; + END IF; +END $$ + +DELIMITER ; + +CALL rename_if_exists('account_requests','name','username','VARCHAR(255)'); +CALL rename_if_exists('account_requests','fullname','name','VARCHAR(255)'); + +CALL rename_if_exists('assignment_questionnaires','notification_limit','notification_threshold','INT'); +CALL rename_if_exists('assignment_questionnaires','dropdown','dropdown_in_use','TINYINT(1)'); + +CALL rename_if_exists('assignments','spec_location','URL','VARCHAR(255)'); +CALL rename_if_exists('assignments','is_intelligent','topics_assigned_by_bidding','TINYINT(1)'); +CALL rename_if_exists('assignments','availability_flag','available_to_students','TINYINT(1)'); +CALL rename_if_exists('assignments','use_bookmark','can_bookmark_topics','TINYINT(1)'); +CALL rename_if_exists('assignments','duty_based_assignment?','team_members_have_duties','TINYINT(1)'); +CALL drop_column_if_exists('assignments','max_bids'); +CALL drop_column_if_exists('assignments','reputation_algorithm'); +CALL drop_column_if_exists('assignments','simicheck'); +CALL drop_column_if_exists('assignments','simicheck_threshold'); +CALL drop_column_if_exists('assignments','has_badge'); +CALL drop_column_if_exists('assignments','is_conference_assignment'); + +CALL rename_if_exists('bookmark_ratings','bookmark_id','artifact_id','INT'); +CALL rename_if_exists('bookmark_ratings','user_id','rater_id','INT'); +CALL rename_if_exists('bookmark_ratings','rating','ratings','INT'); + +CALL rename_if_exists('courses','private','is_private','TINYINT(1)'); +CALL rename_if_exists('courses','institutions_id','institution_id','INT'); +CALL rename_if_exists('courses','locale','language','VARCHAR(255)'); + +CALL rename_if_exists('due_dates','parent_id','assignment_id','INT'); + +CALL rename_if_exists('quiz_question_choices','iscorrect','is_correct','TINYINT(1)'); + +CALL rename_if_exists('response_maps','calibrate_to','for_calibration','INT'); + +CALL rename_if_exists('responses','map_id','response_map_id','INT'); + +CALL rename_if_exists('review_bids','signuptopic_id','project_topic_id','INT'); + +CALL rename_if_exists('suggestions','unityID','username','VARCHAR(255)'); + +CALL rename_if_exists('users','name','username','VARCHAR(255)'); +CALL rename_if_exists('users','fullname','name','VARCHAR(255)'); +CALL rename_if_exists('users','timezonepref','time_zone_pref','VARCHAR(255)'); +CALL drop_column_if_exists('users','mru_directory_path'); +CALL drop_column_if_exists('users','email_on_review'); +CALL drop_column_if_exists('users','email_on_review_of_review'); +CALL drop_column_if_exists('users','master_permission_granted'); +CALL drop_column_if_exists('users','digital_certificate'); +CALL drop_column_if_exists('users','persistence_token'); + +CALL modify_column_if_exists('participants','user_id','INT(10) FIRST'); +CALL drop_column_if_exists('participants','submitted_at'); +CALL drop_column_if_exists('participants','penalty_accumulated'); +CALL drop_column_if_exists('participants','time_stamp'); +CALL drop_column_if_exists('participants','digital_signature'); +CALL drop_column_if_exists('participants','duty'); +CALL drop_column_if_exists('participants','duty_id'); +CALL drop_column_if_exists('participants','Hamer'); +CALL drop_column_if_exists('participants','Lauw'); +CALL rename_if_exists('participants','permission_granted','OK_to_show','BIT'); +CALL add_column_if_not_exists('participants','can_mentor','BIT AFTER can_take_quiz'); +CALL drop_fk_if_exists('participants','fk_rails_812e0f599c'); +CALL drop_column_if_exists('participants','duty'); +CALL drop_column_if_exists('participants','duty_id'); + +CALL drop_questionnaires_display_type(); + +CALL rename_if_exists('submission_records','type','record_type','TEXT'); +CALL rename_if_exists('submission_records','user','submitted_by','VARCHAR(255)'); +CALL drop_column_if_exists('submission_records','assignment_id'); + +CALL add_column_if_not_exists('signed_up_teams','comments_for_advertisement','TEXT'); +CALL add_column_if_not_exists('signed_up_teams','advertising_for_partner','BOOLEAN DEFAULT FALSE'); +CALL update_signed_up_teams_from_teams(); + +CALL drop_column_if_exists('teams','make_public'); +CALL drop_column_if_exists('teams','comments_for_advertisement'); +CALL drop_column_if_exists('teams','advertise_for_partner'); + +CALL rename_table_if_exists('teams_users','teams_participants'); +CALL rename_table_if_exists('question_advices','question_advice'); +CALL rename_table_if_exists('bids','topic_bids'); + +DROP TABLE IF EXISTS awarded_badges; +DROP TABLE IF EXISTS badges; +DROP TABLE IF EXISTS calculated_penalties; +DROP TABLE IF EXISTS delayed_jobs; +DROP TABLE IF EXISTS locks; +DROP TABLE IF EXISTS menu_items; +DROP TABLE IF EXISTS plagiarism_checker_assignment_submissions; +DROP TABLE IF EXISTS plagiarism_checker_comparisons; +DROP TABLE IF EXISTS sections; +DROP TABLE IF EXISTS system_settings; +DROP TABLE IF EXISTS automated_metareviews; +DROP TABLE IF EXISTS content_pages; +DROP TABLE IF EXISTS controller_actions; +DROP TABLE IF EXISTS markup_styles; +DROP TABLE IF EXISTS notifications; +DROP TABLE IF EXISTS ar_internal_metadata; +DROP TABLE IF EXISTS site_controllers; + +CREATE TABLE IF NOT EXISTS questionnaire_types ( + id INT AUTO_INCREMENT PRIMARY KEY, + display_type VARCHAR(255) NOT NULL +); + +SET FOREIGN_KEY_CHECKS = 1; From b47ac57330b6fd5e13e4802befab908ba92b3fbe Mon Sep 17 00:00:00 2001 From: Prithish Samanta Date: Tue, 9 Dec 2025 12:44:12 -0500 Subject: [PATCH 2/6] Update new_seed.sql --- db/new_seed.sql | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/db/new_seed.sql b/db/new_seed.sql index 66adcfbf1..a5883e11d 100644 --- a/db/new_seed.sql +++ b/db/new_seed.sql @@ -1,4 +1,4 @@ -USE expertiza_anonymization; +USE reimplementation; SET FOREIGN_KEY_CHECKS = 0; DELIMITER $$ @@ -322,3 +322,4 @@ CREATE TABLE IF NOT EXISTS questionnaire_types ( ); SET FOREIGN_KEY_CHECKS = 1; + From e41351ee19f86736ac4d1df5c8afb09d51eee280 Mon Sep 17 00:00:00 2001 From: Prithish Samanta Date: Tue, 9 Dec 2025 12:51:51 -0500 Subject: [PATCH 3/6] Update new_seed.sql --- db/new_seed.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/db/new_seed.sql b/db/new_seed.sql index a5883e11d..6b6af0c7b 100644 --- a/db/new_seed.sql +++ b/db/new_seed.sql @@ -1,3 +1,4 @@ +CREATE DATABASE IF NOT EXISTS reimplementation; USE reimplementation; SET FOREIGN_KEY_CHECKS = 0; DELIMITER $$ @@ -323,3 +324,4 @@ CREATE TABLE IF NOT EXISTS questionnaire_types ( SET FOREIGN_KEY_CHECKS = 1; + From a4dee7a72e9d2f2c4d54c28937e98710c765ab00 Mon Sep 17 00:00:00 2001 From: Prithish Samanta Date: Tue, 9 Dec 2025 12:52:56 -0500 Subject: [PATCH 4/6] Update setup script steps and commands --- setup.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/setup.sh b/setup.sh index c10d11f6f..009dad64a 100755 --- a/setup.sh +++ b/setup.sh @@ -19,8 +19,11 @@ rake db:create echo "Step 4: Running database migrations..." rake db:migrate -echo "Step 5: Seeding the database..." +echo "Step 5: Running schema transformations..." +mysql -h db -uroot -pexpertiza reimplementation < /app/db/new_seed.sql + +echo "Step 6: Seeding the database..." rake db:seed -echo "Step 6: Starting the Rails server..." +echo "Step 7: Starting the Rails server..." rails s -p 3002 -b '0.0.0.0' From d947421159019f568cae6741c4fb8461d5425471 Mon Sep 17 00:00:00 2001 From: prithishsamantae Date: Wed, 10 Dec 2025 05:51:37 -0500 Subject: [PATCH 5/6] Minor tweeks regarding new_seed.sql --- Dockerfile | 3 ++- config/application.rb | 2 +- db/new_seed.sql | 3 ++- db/seeds.rb | 6 +++--- docker-compose.yml | 2 +- setup.sh | 3 ++- 6 files changed, 11 insertions(+), 8 deletions(-) diff --git a/Dockerfile b/Dockerfile index ff57d5dd5..ea9201383 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,8 @@ RUN apt-get update && \ apt-get install -y curl && \ curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && \ apt-get install -y nodejs && \ - apt-get install -y netcat-openbsd + apt-get install -y netcat-openbsd && \ + apt-get install -y default-mysql-client # Set the working directory WORKDIR /app diff --git a/config/application.rb b/config/application.rb index 798f8702b..f78d01563 100644 --- a/config/application.rb +++ b/config/application.rb @@ -17,7 +17,7 @@ def self.preview_path=(_) module Reimplementation class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. - config.load_defaults 7.0 + config.load_defaults 8.0 config.active_record.schema_format = :ruby # Configuration for the application, engines, and railties goes here. diff --git a/db/new_seed.sql b/db/new_seed.sql index 6b6af0c7b..e0082fdb8 100644 --- a/db/new_seed.sql +++ b/db/new_seed.sql @@ -266,7 +266,8 @@ CALL drop_column_if_exists('users','master_permission_granted'); CALL drop_column_if_exists('users','digital_certificate'); CALL drop_column_if_exists('users','persistence_token'); -CALL modify_column_if_exists('participants','user_id','INT(10) FIRST'); +-- Keep user_id aligned with users.id (bigint) to satisfy FK constraints +CALL modify_column_if_exists('participants','user_id','BIGINT FIRST'); CALL drop_column_if_exists('participants','submitted_at'); CALL drop_column_if_exists('participants','penalty_accumulated'); CALL drop_column_if_exists('participants','time_stamp'); diff --git a/db/seeds.rb b/db/seeds.rb index 8c11894f0..df412abe7 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -14,7 +14,7 @@ # Create an admin user User.create!( - name: 'admin', + username: 'admin', email: 'admin2@example.com', password: 'password123', full_name: 'admin admin', @@ -33,7 +33,7 @@ instructor_user_ids = [] num_instructors.times do instructor_user_ids << User.create( - name: Faker::Internet.unique.username, + username: Faker::Internet.unique.username, email: Faker::Internet.unique.email, password: "password", full_name: Faker::Name.name, @@ -80,7 +80,7 @@ student_user_ids = [] num_students.times do student_user_ids << User.create( - name: Faker::Internet.unique.username, + username: Faker::Internet.unique.username, email: Faker::Internet.unique.email, password: "password", full_name: Faker::Name.name, diff --git a/docker-compose.yml b/docker-compose.yml index f22dc27ef..2413a65fd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,7 +4,7 @@ services: command: tail -f /dev/null environment: RAILS_ENV: development - DATABASE_URL: mysql2://root:expertiza@db:3306/reimplementation? + DATABASE_URL: mysql2://root:expertiza@db:3306/reimplementation CACHE_STORE: redis://redis:6380/0 ports: - "3002:3002" diff --git a/setup.sh b/setup.sh index 009dad64a..8142d71e3 100755 --- a/setup.sh +++ b/setup.sh @@ -20,7 +20,8 @@ echo "Step 4: Running database migrations..." rake db:migrate echo "Step 5: Running schema transformations..." -mysql -h db -uroot -pexpertiza reimplementation < /app/db/new_seed.sql +# Disable SSL because the local MySQL instance uses a self-signed cert +mysql --ssl=0 -h db -uroot -pexpertiza reimplementation < /app/db/new_seed.sql echo "Step 6: Seeding the database..." rake db:seed From f3a37daec7cddf63617cf4b349ada4bbe91568f2 Mon Sep 17 00:00:00 2001 From: prithishsamantae Date: Wed, 10 Dec 2025 08:07:41 -0500 Subject: [PATCH 6/6] changed private variable in seeds.rb and name variable in user.rb --- app/models/user.rb | 12 +++++------- db/seeds.rb | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index 0e77e25dc..e2f0ec722 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class User < ApplicationRecord + # Keep compatibility with legacy code that still references `name` + alias_attribute :name, :username has_secure_password after_initialize :set_defaults @@ -126,16 +128,15 @@ def self.from_params(params) # that only the id, name, and email attributes should be included when a User object is serialized. def as_json(options = {}) super(options.merge({ - only: %i[id name email full_name email_on_review email_on_submission - email_on_review_of_review], + only: %i[id username email full_name], include: { role: { only: %i[id name] }, - parent: { only: %i[id name] }, + parent: { only: %i[id username] }, institution: { only: %i[id name] } } })).tap do |hash| - hash['parent'] ||= { id: nil, name: nil } + hash['parent'] ||= { id: nil, username: nil } hash['institution'] ||= { id: nil, name: nil } end end @@ -143,9 +144,6 @@ def as_json(options = {}) def set_defaults self.is_new_user = true self.copy_of_emails ||= false - self.email_on_review ||= false - self.email_on_submission ||= false - self.email_on_review_of_review ||= false self.etc_icons_on_homepage ||= true end diff --git a/db/seeds.rb b/db/seeds.rb index df412abe7..a7acaeeb3 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -51,7 +51,7 @@ directory_path: Faker::File.dir(segment_count: 2), name: Faker::Company.industry, info: "A fake class", - private: false + is_private: false ).id end