Create UserAchievement model
What does this MR do and why?
Related to #385380 (closed)
This MR introduces the linking table used to award achievements to users.
Migrations
lee@Lees-MBP gitlab % bundle exec rake db:migrate:up VERSION=20221214201256 RAILS_ENV=development
main: == 20221214201256 CreateUserAchievements: migrating ===========================
main: -- create_table(:user_achievements, {})
main: -> 0.0109s
main: == 20221214201256 CreateUserAchievements: migrated (0.0120s) ==================
lee@Lees-MBP gitlab % bundle exec rake db:migrate:up VERSION=20221214204247 RAILS_ENV=development
main: == 20221214204247 UserAchievementsForeignKeys: migrating ======================
main: -- transaction_open?()
main: -> 0.0000s
main: -- foreign_keys(:user_achievements)
main: -> 0.1202s
main: -- transaction_open?()
main: -> 0.0000s
main: -- execute("ALTER TABLE user_achievements\nADD CONSTRAINT fk_4efde02858\nFOREIGN KEY (user_id)\nREFERENCES users (id)\nON DELETE CASCADE\nNOT VALID;\n")
main: -> 0.0017s
main: -- execute("SET statement_timeout TO 0")
main: -> 0.0005s
main: -- execute("ALTER TABLE user_achievements VALIDATE CONSTRAINT fk_4efde02858;")
main: -> 0.0030s
main: -- execute("RESET statement_timeout")
main: -> 0.0007s
main: -- transaction_open?()
main: -> 0.0000s
main: -- foreign_keys(:user_achievements)
main: -> 0.0020s
main: -- transaction_open?()
main: -> 0.0000s
main: -- execute("ALTER TABLE user_achievements\nADD CONSTRAINT fk_60b12fcda3\nFOREIGN KEY (awarded_by_user_id)\nREFERENCES users (id)\nON DELETE SET NULL\nNOT VALID;\n")
main: -> 0.0015s
main: -- execute("ALTER TABLE user_achievements VALIDATE CONSTRAINT fk_60b12fcda3;")
main: -> 0.0009s
main: -- transaction_open?()
main: -> 0.0000s
main: -- foreign_keys(:user_achievements)
main: -> 0.0019s
main: -- transaction_open?()
main: -> 0.0000s
main: -- execute("ALTER TABLE user_achievements\nADD CONSTRAINT fk_d7653ef780\nFOREIGN KEY (revoked_by_user_id)\nREFERENCES users (id)\nON DELETE SET NULL\nNOT VALID;\n")
main: -> 0.0007s
main: -- execute("ALTER TABLE user_achievements VALIDATE CONSTRAINT fk_d7653ef780;")
main: -> 0.0009s
main: == 20221214204247 UserAchievementsForeignKeys: migrated (0.1533s) =============
lee@Lees-MBP gitlab % bundle exec rake db:migrate:down VERSION=20221214204247 RAILS_ENV=development
main: == 20221214204247 UserAchievementsForeignKeys: reverting ======================
main: -- transaction_open?()
main: -> 0.0007s
main: -- remove_foreign_key(:user_achievements, {:column=>:user_id})
main: -> 0.1454s
main: -- remove_foreign_key(:user_achievements, {:column=>:awarded_by_user_id})
main: -> 0.0033s
main: -- remove_foreign_key(:user_achievements, {:column=>:revoked_by_user_id})
main: -> 0.0035s
main: == 20221214204247 UserAchievementsForeignKeys: reverted (0.1832s) =============
lee@Lees-MBP gitlab % bundle exec rake db:migrate:down VERSION=20221214201256 RAILS_ENV=development
main: == 20221214201256 CreateUserAchievements: reverting ===========================
main: -- drop_table(:user_achievements)
main: -> 0.0021s
main: == 20221214201256 CreateUserAchievements: reverted (0.0031s) ==================
How to set up and validate locally
Achievements are not exposed via API/frontend etc yet- the only way to validate is via the rails console. You could do something like:
a = Achievements::Achievement.new
a.namespace_id = 31
a.name = "Test"
a.save
ua = Achievements::UserAchievement.new
ua.achievement_id = 1
ua.user_id = 1
ua.awarded_by = 2
ua.revoked_by = 3
ua.revoked_at = DateTime.current
ua.save
a.users
ua.user
ua.achievement
Users.find(1).achievements
Users.find(1).user_achievements
Users.find(2).awarded_user_achievements
Users.find(3).revoked_userachievements
MR acceptance checklist
This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.
-
I have evaluated the MR acceptance checklist for this MR.
Edited by Lee Tickett