diff --git a/app/controllers/api/v1/grid_weapons_controller.rb b/app/controllers/api/v1/grid_weapons_controller.rb index e87ee49..1db30b2 100644 --- a/app/controllers/api/v1/grid_weapons_controller.rb +++ b/app/controllers/api/v1/grid_weapons_controller.rb @@ -1,12 +1,12 @@ class Api::V1::GridWeaponsController < Api::V1::ApiController + before_action :set, except: ['create', 'update_uncap_level', 'destroy'] + def create party = Party.find(weapon_params[:party_id]) canonical_weapon = Weapon.find(weapon_params[:weapon_id]) - - if current_user - if party.user != current_user - render_unauthorized_response - end + + if !current_user || party.user != current_user + render_unauthorized_response end if grid_weapon = GridWeapon.where( @@ -26,6 +26,20 @@ class Api::V1::GridWeaponsController < Api::V1::ApiController render :show, status: :created if @weapon.save! end + def update + if !current_user || @weapon.party.user != current_user + render_unauthorized_response + end + + # TODO: Server-side validation of weapon mods + # We don't want someone modifying the JSON and adding + # keys to weapons that cannot have them + + # Maybe we make methods on the model to validate for us somehow + + render :update, status: :ok if @weapon.update(weapon_params) + end + def update_uncap_level @weapon = GridWeapon.find(weapon_params[:id]) @@ -39,13 +53,19 @@ class Api::V1::GridWeaponsController < Api::V1::ApiController render :show, status: :ok if @weapon.save! end - def destroy - end - private + def set + @weapon = GridWeapon.where("id = ?", params[:id]).first + end + # Specify whitelisted properties that can be modified. def weapon_params - params.require(:weapon).permit(:id, :party_id, :weapon_id, :position, :mainhand, :uncap_level) + params.require(:weapon).permit( + :id, :party_id, :weapon_id, + :position, :mainhand, :uncap_level, :element, + :weapon_key1_id, :weapon_key2_id, :weapon_key3_id, + :ax_modifier1, :ax_modifier2, :ax_strength1, :ax_strength2 + ) end end \ No newline at end of file diff --git a/app/controllers/api/v1/weapon_keys_controller.rb b/app/controllers/api/v1/weapon_keys_controller.rb new file mode 100644 index 0000000..b51ae6d --- /dev/null +++ b/app/controllers/api/v1/weapon_keys_controller.rb @@ -0,0 +1,11 @@ +class Api::V1::WeaponKeysController < Api::V1::ApiController + def all + conditions = {} + conditions[:series] = request.params['series'] + conditions[:slot] = request.params['slot'] + conditions[:group] = request.params['group'] unless request.params['group'].blank? + + @keys = WeaponKey.where(conditions) + render :all, status: :ok + end +end \ No newline at end of file diff --git a/app/models/grid_weapon.rb b/app/models/grid_weapon.rb index acef6ce..faf50cb 100644 --- a/app/models/grid_weapon.rb +++ b/app/models/grid_weapon.rb @@ -1,7 +1,20 @@ class GridWeapon < ApplicationRecord belongs_to :party + belongs_to :weapon_key1, class_name: 'WeaponKey', foreign_key: :weapon_key1_id, optional: true + belongs_to :weapon_key2, class_name: 'WeaponKey', foreign_key: :weapon_key2_id, optional: true + belongs_to :weapon_key3, class_name: 'WeaponKey', foreign_key: :weapon_key3_id, optional: true + def weapon Weapon.find(self.weapon_id) end + + def weapon_keys + weapon_keys = [] + weapon_keys.push(self.weapon_key1) if self.weapon_key1 != nil + weapon_keys.push(self.weapon_key2) if self.weapon_key2 != nil + weapon_keys.push(self.weapon_key3) if self.weapon_key3 != nil + + weapon_keys + end end diff --git a/app/views/api/v1/grid_characters/base.json.rabl b/app/views/api/v1/grid_characters/base.json.rabl index d535843..74e9ec1 100644 --- a/app/views/api/v1/grid_characters/base.json.rabl +++ b/app/views/api/v1/grid_characters/base.json.rabl @@ -1,7 +1,8 @@ attributes :id, :party_id, :position, - :uncap_level + :uncap_level, + :perpetuity node :object do |c| partial("characters/base", :object => c.character) diff --git a/app/views/api/v1/grid_weapons/base.json.rabl b/app/views/api/v1/grid_weapons/base.json.rabl index 4956934..36b5c87 100644 --- a/app/views/api/v1/grid_weapons/base.json.rabl +++ b/app/views/api/v1/grid_weapons/base.json.rabl @@ -2,8 +2,26 @@ attributes :id, :party_id, :mainhand, :position, - :uncap_level + :uncap_level, + :element node :object do |w| partial("weapons/base", :object => w.weapon) +end + +node :weapon_keys, :if => lambda { |w| [2, 3, 17, 22].include?(w.weapon.series) } do |w| + partial("weapon_keys/base", :object => w.weapon_keys) +end + +node :ax, :if => lambda { |w| w.weapon.ax > 0 } do |w| + [ + { + :modifier => w.ax_modifier1, + :strength => w.ax_strength1 + }, + { + :modifier => w.ax_modifier2, + :strength => w.ax_strength2 + } + ] end \ No newline at end of file diff --git a/app/views/api/v1/grid_weapons/update.json.rabl b/app/views/api/v1/grid_weapons/update.json.rabl new file mode 100644 index 0000000..cd450b3 --- /dev/null +++ b/app/views/api/v1/grid_weapons/update.json.rabl @@ -0,0 +1,3 @@ +object @weapon + +extends 'api/v1/grid_weapons/base' \ No newline at end of file diff --git a/app/views/api/v1/weapon_keys/all.json.rabl b/app/views/api/v1/weapon_keys/all.json.rabl new file mode 100644 index 0000000..f631ea6 --- /dev/null +++ b/app/views/api/v1/weapon_keys/all.json.rabl @@ -0,0 +1,3 @@ +collection @keys + +extends 'weapon_keys/base' diff --git a/app/views/api/v1/weapon_keys/base.json.rabl b/app/views/api/v1/weapon_keys/base.json.rabl new file mode 100644 index 0000000..04ff7d1 --- /dev/null +++ b/app/views/api/v1/weapon_keys/base.json.rabl @@ -0,0 +1,10 @@ +object :weapon_key + +attributes :id, :series, :slot, :group, :order + +node :name do |k| + { + :en => k.name_en, + :jp => k.name_jp + } +end \ No newline at end of file diff --git a/app/views/api/v1/weapons/base.json.rabl b/app/views/api/v1/weapons/base.json.rabl index 64dd42b..d8384f4 100644 --- a/app/views/api/v1/weapons/base.json.rabl +++ b/app/views/api/v1/weapons/base.json.rabl @@ -5,7 +5,11 @@ attributes :id, :element, :proficiency, :max_level, - :max_skill_level + :max_skill_level, + :limit, + :rarity, + :series, + :ax node :name do |w| { diff --git a/config/routes.rb b/config/routes.rb index 4d03f7e..e658b6a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -8,6 +8,7 @@ Rails.application.routes.draw do namespace :v1 do resources :parties, only: [:index, :create, :update, :destroy] resources :users, only: [:create, :show] + resources :grid_weapons, only: [:update] resources :favorites, only: [:create] get 'parties/favorites', to: 'parties#favorites' @@ -25,6 +26,7 @@ Rails.application.routes.draw do get 'search/summons', to: 'search#summons' get 'raids', to: 'raids#all' + get 'weapon_keys', to: 'weapon_keys#all' post 'characters', to: 'grid_characters#create' post 'characters/update_uncap', to: 'grid_characters#update_uncap_level' diff --git a/db/migrate/20220301232911_change_weapon_series_to_number.rb b/db/migrate/20220301232911_change_weapon_series_to_number.rb new file mode 100644 index 0000000..572a117 --- /dev/null +++ b/db/migrate/20220301232911_change_weapon_series_to_number.rb @@ -0,0 +1,5 @@ +class ChangeWeaponSeriesToNumber < ActiveRecord::Migration[6.1] + def change + change_column :weapons, :series, 'integer USING CAST(element AS integer)' + end +end diff --git a/db/migrate/20220302050159_remove_timestamps_from_weapon_keys.rb b/db/migrate/20220302050159_remove_timestamps_from_weapon_keys.rb new file mode 100644 index 0000000..2babc31 --- /dev/null +++ b/db/migrate/20220302050159_remove_timestamps_from_weapon_keys.rb @@ -0,0 +1,6 @@ +class RemoveTimestampsFromWeaponKeys < ActiveRecord::Migration[6.1] + def change + remove_column :weapon_keys, :created_at, :datetime + remove_column :weapon_keys, :updated_at, :datetime + end +end diff --git a/db/migrate/20220302050213_add_sub_type_to_weapon_keys.rb b/db/migrate/20220302050213_add_sub_type_to_weapon_keys.rb new file mode 100644 index 0000000..484fa3b --- /dev/null +++ b/db/migrate/20220302050213_add_sub_type_to_weapon_keys.rb @@ -0,0 +1,5 @@ +class AddSubTypeToWeaponKeys < ActiveRecord::Migration[6.1] + def change + add_column :weapon_keys, :subtype, :integer + end +end diff --git a/db/migrate/20220302054003_add_weapon_key3_to_grid_weapons.rb b/db/migrate/20220302054003_add_weapon_key3_to_grid_weapons.rb new file mode 100644 index 0000000..e149bf3 --- /dev/null +++ b/db/migrate/20220302054003_add_weapon_key3_to_grid_weapons.rb @@ -0,0 +1,5 @@ +class AddWeaponKey3ToGridWeapons < ActiveRecord::Migration[6.1] + def change + add_reference :grid_weapons, :weapon_key3, type: :uuid, foreign_key: { to_table: :weapon_keys } + end +end diff --git a/db/migrate/20220302054011_add_ax_to_grid_weapons.rb b/db/migrate/20220302054011_add_ax_to_grid_weapons.rb new file mode 100644 index 0000000..95bc240 --- /dev/null +++ b/db/migrate/20220302054011_add_ax_to_grid_weapons.rb @@ -0,0 +1,8 @@ +class AddAxToGridWeapons < ActiveRecord::Migration[6.1] + def change + add_column :grid_weapons, :ax_modifier1, :integer + add_column :grid_weapons, :ax_strength1, :float + add_column :grid_weapons, :ax_modifier2, :integer + add_column :grid_weapons, :ax_strength2, :float + end +end diff --git a/db/migrate/20220302054021_add_element_to_grid_weapons.rb b/db/migrate/20220302054021_add_element_to_grid_weapons.rb new file mode 100644 index 0000000..e671c12 --- /dev/null +++ b/db/migrate/20220302054021_add_element_to_grid_weapons.rb @@ -0,0 +1,5 @@ +class AddElementToGridWeapons < ActiveRecord::Migration[6.1] + def change + add_column :grid_weapons, :element, :integer + end +end diff --git a/db/migrate/20220302061525_add_perpetuity_to_grid_characters.rb b/db/migrate/20220302061525_add_perpetuity_to_grid_characters.rb new file mode 100644 index 0000000..fb89fc6 --- /dev/null +++ b/db/migrate/20220302061525_add_perpetuity_to_grid_characters.rb @@ -0,0 +1,5 @@ +class AddPerpetuityToGridCharacters < ActiveRecord::Migration[6.1] + def change + add_column :grid_characters, :perpetuity, :boolean + end +end diff --git a/db/migrate/20220302071015_rename_type_and_sub_type_in_weapon_keys.rb b/db/migrate/20220302071015_rename_type_and_sub_type_in_weapon_keys.rb new file mode 100644 index 0000000..3067f60 --- /dev/null +++ b/db/migrate/20220302071015_rename_type_and_sub_type_in_weapon_keys.rb @@ -0,0 +1,6 @@ +class RenameTypeAndSubTypeInWeaponKeys < ActiveRecord::Migration[6.1] + def change + rename_column :weapon_keys, :type, :slot + rename_column :weapon_keys, :subtype, :group + end +end diff --git a/db/migrate/20220303092208_add_order_to_weapon_keys.rb b/db/migrate/20220303092208_add_order_to_weapon_keys.rb new file mode 100644 index 0000000..80083b3 --- /dev/null +++ b/db/migrate/20220303092208_add_order_to_weapon_keys.rb @@ -0,0 +1,5 @@ +class AddOrderToWeaponKeys < ActiveRecord::Migration[6.1] + def change + add_column :weapon_keys, :order, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index 69ed289..f727b82 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.define(version: 2022_02_28_014758) do +ActiveRecord::Schema.define(version: 2022_03_03_092208) do # These are extensions that must be enabled in order to support this database enable_extension "pgcrypto" @@ -60,6 +60,7 @@ ActiveRecord::Schema.define(version: 2022_02_28_014758) do t.integer "position" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false + t.boolean "perpetuity" t.index ["character_id"], name: "index_grid_characters_on_character_id" t.index ["party_id"], name: "index_grid_characters_on_party_id" end @@ -87,10 +88,14 @@ ActiveRecord::Schema.define(version: 2022_02_28_014758) do t.integer "position" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false + t.uuid "weapon_key3_id" + t.integer "ax_modifier1" + t.float "ax_strength1" + t.integer "ax_modifier2" + t.float "ax_strength2" + t.integer "element" t.index ["party_id"], name: "index_grid_weapons_on_party_id" t.index ["weapon_id"], name: "index_grid_weapons_on_weapon_id" - t.index ["weapon_key1_id"], name: "index_grid_weapons_on_weapon_key1_id" - t.index ["weapon_key2_id"], name: "index_grid_weapons_on_weapon_key2_id" end create_table "oauth_access_grants", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| @@ -187,9 +192,9 @@ ActiveRecord::Schema.define(version: 2022_02_28_014758) do t.string "name_en" t.string "name_jp" t.integer "series" - t.integer "type" - t.datetime "created_at", precision: 6, null: false - t.datetime "updated_at", precision: 6, null: false + t.integer "slot" + t.integer "group" + t.integer "order" end create_table "weapons", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| @@ -199,7 +204,7 @@ ActiveRecord::Schema.define(version: 2022_02_28_014758) do t.integer "rarity" t.integer "element" t.integer "proficiency" - t.string "series" + t.integer "series" t.boolean "flb" t.boolean "ulb" t.integer "max_level" @@ -217,6 +222,7 @@ ActiveRecord::Schema.define(version: 2022_02_28_014758) do t.integer "ax" end + add_foreign_key "grid_weapons", "weapon_keys", column: "weapon_key3_id" add_foreign_key "oauth_access_grants", "oauth_applications", column: "application_id" add_foreign_key "oauth_access_tokens", "oauth_applications", column: "application_id" end