diff --git a/app/controllers/achievements_controller.rb b/app/controllers/achievements_controller.rb new file mode 100644 index 0000000..a227c96 --- /dev/null +++ b/app/controllers/achievements_controller.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +class AchievementsController < ProtectedController + def index + @wow_achievement_categories = WowAchievementCategory.base_categories.order(display_order: :asc) + @wow_achievements = nil + @wow_last_completed_achievements = CompletedWowAchievement.where( + wow_character: current_user.wow_characters + ).includes(:wow_character, wow_achievement: :wow_achievement_criterium).order(completed_timestamp: :desc).first(5) + @wow_achievement_category = nil + end + + def show + @wow_achievement_category = WowAchievementCategory.find(params[:id]) + @wow_achievement_categories = @wow_achievement_category.child_categories.order(display_order: :asc) + @wow_achievements = @wow_achievement_category.wow_achievements.includes( + wow_achievement_criterium: :child_criteria + ).order(display_order: :asc) + end +end + +# TODO +# Find a way to get the last achievement accomplished that were not already achievement by another character +# This will return all WowAchievement only completed by one character of the current user +# achievements = WowAchievement.joins(:completed_wow_achievements).where('completed_wow_achievements.wow_character_id': current_user.wow_characters).group(:id).having("count(completed_wow_achievements.id) < 2") +# +# This will return all the CompletedWowAchievement of the previous list +# completed_achievements = CompletedWowAchievement.where(wow_character: current_user.wow_characters, wow_achievement: achievements) +# +# The problem is that these completed_achivements all have a completed_timestamp at Thu, 01 Jan 1970 00:00:00.000000000 UTC +00:00 +# +# It's probably required to use the WowAchievementCriterium to sort that diff --git a/app/helpers/achievements_helper.rb b/app/helpers/achievements_helper.rb new file mode 100644 index 0000000..b36044d --- /dev/null +++ b/app/helpers/achievements_helper.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module AchievementsHelper + def achievement_completed(achievement_id, user) + CompletedWowAchievement.where(wow_achievement_id: achievement_id, wow_character: user.wow_characters).exists? + end +end diff --git a/app/models/wow_achievement.rb b/app/models/wow_achievement.rb index bbdba4c..7d673c6 100644 --- a/app/models/wow_achievement.rb +++ b/app/models/wow_achievement.rb @@ -19,4 +19,6 @@ class WowAchievement < ApplicationRecord validates :name, presence: true validates :achievement_id, presence: true, uniqueness: true + + scope :base_achievements, -> { where(prerequisite_achievement: nil) } end diff --git a/app/models/wow_achievement_category.rb b/app/models/wow_achievement_category.rb index d95e531..9136b5a 100644 --- a/app/models/wow_achievement_category.rb +++ b/app/models/wow_achievement_category.rb @@ -4,8 +4,16 @@ class WowAchievementCategory < ApplicationRecord extend Mobility translates :name + belongs_to :parent_category, class_name: 'WowAchievementCategory', optional: true + has_many :child_categories, + class_name: 'WowAchievementCategory', + foreign_key: 'parent_category_id', + dependent: :nullify, + inverse_of: :parent_category has_many :wow_achievements, dependent: :destroy validates :name, presence: true validates :category_id, presence: true, uniqueness: true + + scope :base_categories, -> { where(parent_category: nil) } end diff --git a/app/models/wow_achievement_criterium.rb b/app/models/wow_achievement_criterium.rb index 9f0d55d..89c658b 100644 --- a/app/models/wow_achievement_criterium.rb +++ b/app/models/wow_achievement_criterium.rb @@ -11,6 +11,7 @@ class WowAchievementCriterium < ApplicationRecord dependent: :destroy, inverse_of: :parent_criterium belongs_to :parent_criterium, class_name: 'WowAchievementCriterium', optional: true + has_many :completed_wow_achievement_criteria, dependent: :destroy has_many :wow_characters, through: :completed_wow_achievement_criteria diff --git a/app/views/achievements/_achievements.html.erb b/app/views/achievements/_achievements.html.erb new file mode 100644 index 0000000..52c7bc7 --- /dev/null +++ b/app/views/achievements/_achievements.html.erb @@ -0,0 +1,76 @@ +
+
+
+
+ <% if wow_achievement_category %>

Achievement category: <%= wow_achievement_category.name %>

<% end %> +
+ <% wow_achievement_categories.each do |category| %> + <%= link_to category.name, "/#{locale}/achievements/#{category.id}", class: "btn btn-outline-dark" %> + <% end %> +
+
+
+
+
+
+ <% if wow_achievement_category&.parent_category %> + <%= link_to "Back", "/#{locale}/achievements/#{wow_achievement_category.parent_category.id}", class: "btn btn-outline-dark" %> + <% elsif wow_achievement_category %> + <%= link_to "Back", "/#{locale}/achievements", class: "btn btn-outline-dark" %> + <% end %> +
+
+
+ <% if wow_achievements %> +
+

Achievement:

+
+ <% wow_achievements.each do |achievement| %> +
+
+ <%= achievement.name %><% if Rails.env.development? %> - ID: <%= achievement.achievement_id %><% end %> +
+
+

Description: <%= achievement.description %>

+

Criterium: <%= achievement&.wow_achievement_criterium&.description %>

+
+ <% achievement&.wow_achievement_criterium&.child_criteria&.each do |criterium| %> +
+

<%= criterium&.description %>

+
+ <% end %> +
+
+
+ <% end %> +
+
+ <% elsif wow_last_completed_achievements %> +
+

Last achievement:

+
+ <% wow_last_completed_achievements.each do |achievement| %> +
+
+ <%= achievement.wow_achievement.name %> - ID: <%= achievement.wow_achievement.achievement_id %> +
+
+

Description: <%= achievement.wow_achievement.description %>

+

Criterium: <%= achievement&.wow_achievement.wow_achievement_criterium&.description %>

+ <% if achievement&.wow_achievement.wow_achievement_criterium.child_criteria %> +
+ <% achievement&.wow_achievement.wow_achievement_criterium.child_criteria.each do |criterium| %> +
+

<%= criterium&.description %>

+
+ <% end %> +
+ <% end %> +

Completed by: <%= link_to achievement.wow_character.name, achievement.wow_character, data: { turbo: false } %>

+
+
+ <% end %> +
+
+ <% end %> +
diff --git a/app/views/achievements/index.html.erb b/app/views/achievements/index.html.erb new file mode 100644 index 0000000..fe10d1f --- /dev/null +++ b/app/views/achievements/index.html.erb @@ -0,0 +1,5 @@ +

Achievement list

+ +<%= turbo_frame_tag 'achievements' do %> + <%= render partial: 'achievements/achievements', locals: { wow_achievement_category: @wow_achievement_category, wow_achievement_categories: @wow_achievement_categories, wow_achievements: @wow_achievements, wow_last_completed_achievements: @wow_last_completed_achievements } %> +<% end %> diff --git a/app/views/achievements/show.html.erb b/app/views/achievements/show.html.erb new file mode 100644 index 0000000..7779a21 --- /dev/null +++ b/app/views/achievements/show.html.erb @@ -0,0 +1,5 @@ +

Achievement list

+ +<%= turbo_frame_tag 'achievements' do %> + <%= render partial: 'achievements/achievements', locals: { wow_achievement_category: @wow_achievement_category, wow_achievement_categories: @wow_achievement_categories, wow_achievements: @wow_achievements, wow_last_completed_achievements: nil } %> +<% end %> diff --git a/app/views/layouts/_navbar.html.erb b/app/views/layouts/_navbar.html.erb index 9386f1a..6d91199 100644 --- a/app/views/layouts/_navbar.html.erb +++ b/app/views/layouts/_navbar.html.erb @@ -19,6 +19,9 @@ +