From f9e90694886c2d3a0360d9b925f24c699b271555 Mon Sep 17 00:00:00 2001 From: Kunal Govind Patil Date: Mon, 24 Apr 2023 19:12:33 -0400 Subject: [PATCH 01/27] setup --- Gemfile.lock | 9 ++++-- config/database.yml | 47 +++++++++++++++++++++++++++---- config/database.yml.example | 55 ------------------------------------- 3 files changed, 48 insertions(+), 63 deletions(-) delete mode 100644 config/database.yml.example diff --git a/Gemfile.lock b/Gemfile.lock index 428c0f22..e12ddfc7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -111,7 +111,9 @@ GEM net-smtp (0.3.3) net-protocol nio4r (2.5.8) - nokogiri (1.14.2-x86_64-linux) + nokogiri (1.14.2-aarch64-linux) + racc (~> 1.4) + nokogiri (1.14.2-arm64-darwin) racc (~> 1.4) parallel (1.22.1) parser (3.2.1.0) @@ -213,7 +215,8 @@ GEM zeitwerk (2.6.7) PLATFORMS - x86_64-linux + aarch64-linux + arm64-darwin-22 DEPENDENCIES bcrypt (~> 3.1.7) @@ -236,4 +239,4 @@ RUBY VERSION ruby 3.2.1p31 BUNDLED WITH - 2.4.7 + 2.4.12 diff --git a/config/database.yml b/config/database.yml index c3be97f1..092986fc 100644 --- a/config/database.yml +++ b/config/database.yml @@ -1,18 +1,55 @@ +# MySQL. Versions 5.5.8 and up are supported. +# +# Install the MySQL driver +# gem install mysql2 +# +# Ensure the MySQL gem is defined in your Gemfile +# gem "mysql2" +# +# And be sure to use new-style password hashing: +# https://dev.mysql.com/doc/refman/5.7/en/password-hashing.html +# default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> - port: 3306 - socket: /var/run/mysqld/mysqld.sock + username: root + password: expertiza + development: <<: *default - url: <%= ENV['DATABASE_URL'].gsub('?', '_development?') %> + database: reimplementation_development +# Warning: The database defined as "test" will be erased and +# re-generated from your development database when you run "rake". +# Do not set this db to the same as development or production. test: <<: *default - url: <%= ENV['DATABASE_URL'].gsub('?', '_test?') %> + database: reimplementation_test +# As with config/credentials.yml, you never want to store sensitive information, +# like your database password, in your source code. If your source code is +# ever seen by anyone, they now have access to your database. +# +# Instead, provide the password or a full connection URL as an environment +# variable when you boot the app. For example: +# +# DATABASE_URL="mysql2://myuser:mypass@localhost/somedatabase" +# +# If the connection URL is provided in the special DATABASE_URL environment +# variable, Rails will automatically merge its configuration values on top of +# the values provided in this file. Alternatively, you can specify a connection +# URL environment variable explicitly: +# +# production: +# url: <%= ENV["MY_APP_DATABASE_URL"] %> +# +# Read https://guides.rubyonrails.org/configuring.html#configuring-a-database +# for a full overview on how database connection configuration can be specified. +# production: <<: *default - url: <%= ENV['DATABASE_URL'].gsub('?', '_production?') %> + database: reimplementation_production + username: reimplementation + password: <%= ENV["REIMPLEMENTATION_DATABASE_PASSWORD"] %> diff --git a/config/database.yml.example b/config/database.yml.example deleted file mode 100644 index 909122e3..00000000 --- a/config/database.yml.example +++ /dev/null @@ -1,55 +0,0 @@ -# MySQL. Versions 5.5.8 and up are supported. -# -# Install the MySQL driver -# gem install mysql2 -# -# Ensure the MySQL gem is defined in your Gemfile -# gem "mysql2" -# -# And be sure to use new-style password hashing: -# https://dev.mysql.com/doc/refman/5.7/en/password-hashing.html -# -default: &default - adapter: mysql2 - encoding: utf8mb4 - pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> - username: dev - password: Root@123 - - -development: - <<: *default - database: reimplementation_development - -# Warning: The database defined as "test" will be erased and -# re-generated from your development database when you run "rake". -# Do not set this db to the same as development or production. -test: - <<: *default - database: reimplementation_test - -# As with config/credentials.yml, you never want to store sensitive information, -# like your database password, in your source code. If your source code is -# ever seen by anyone, they now have access to your database. -# -# Instead, provide the password or a full connection URL as an environment -# variable when you boot the app. For example: -# -# DATABASE_URL="mysql2://myuser:mypass@localhost/somedatabase" -# -# If the connection URL is provided in the special DATABASE_URL environment -# variable, Rails will automatically merge its configuration values on top of -# the values provided in this file. Alternatively, you can specify a connection -# URL environment variable explicitly: -# -# production: -# url: <%= ENV["MY_APP_DATABASE_URL"] %> -# -# Read https://guides.rubyonrails.org/configuring.html#configuring-a-database -# for a full overview on how database connection configuration can be specified. -# -production: - <<: *default - database: reimplementation_production - username: reimplementation - password: <%= ENV["REIMPLEMENTATION_DATABASE_PASSWORD"] %> From 79c01cb5c9894bb309e8752eaff0946fd9a69e28 Mon Sep 17 00:00:00 2001 From: Kunal Govind Patil Date: Mon, 24 Apr 2023 19:14:06 -0400 Subject: [PATCH 02/27] badges controller init --- app/controllers/api/v1/badges_controller.rb | 53 +++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 app/controllers/api/v1/badges_controller.rb diff --git a/app/controllers/api/v1/badges_controller.rb b/app/controllers/api/v1/badges_controller.rb new file mode 100644 index 00000000..4784c601 --- /dev/null +++ b/app/controllers/api/v1/badges_controller.rb @@ -0,0 +1,53 @@ +class Api::V1::BadgesController < ApplicationController + + before_action :set_badge, only: [:show, :edit, :update, :destroy] + before_action :set_return_to, only: [:new] + + def action_allowed? + current_user_has_ta_privileges? + end + + def index + @badges = Badge.all + end + + def new + @badge = Badge.new + end + + def create + @badge = Badge.new(badge_params) + + if @badge.save + redirect_to redirect_to_url, notice: 'Badge was successfully created' + else + render :new + end + end + + def update + if @badge.update(badge_params) + redirect_to @badge, notice: 'Badge was successfully updated.' + else + render :edit + end + end + + private + + def set_badge + @badge = Badge.find(params[:id]) + end + + def set_return_to + session[:return_to] ||= request.referer + end + + def redirect_to_url + session.delete(:return_to) || badges_url + end + + def badge_params + params.require(:badge).permit(:name, :description, :image_name, :image_file) + end +end From 8e324638f7357ee522c7a44d9cbb6b8b0f3321c3 Mon Sep 17 00:00:00 2001 From: Kunal Govind Patil Date: Mon, 24 Apr 2023 19:15:32 -0400 Subject: [PATCH 03/27] duties controller init --- app/controllers/api/v1/duties_controller.rb | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 app/controllers/api/v1/duties_controller.rb diff --git a/app/controllers/api/v1/duties_controller.rb b/app/controllers/api/v1/duties_controller.rb new file mode 100644 index 00000000..c5440335 --- /dev/null +++ b/app/controllers/api/v1/duties_controller.rb @@ -0,0 +1,16 @@ +class Api::V1::DutiesController < ApplicationController + def index + end + + def show + end + + def create + end + + def update + end + + def destroy + end +end From 89f845f21934ca3773ade3b861a25aac5c89bb52 Mon Sep 17 00:00:00 2001 From: Kunal Govind Patil Date: Mon, 24 Apr 2023 19:16:20 -0400 Subject: [PATCH 04/27] added badge model --- app/models/badge.rb | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 app/models/badge.rb diff --git a/app/models/badge.rb b/app/models/badge.rb new file mode 100644 index 00000000..2bca7c61 --- /dev/null +++ b/app/models/badge.rb @@ -0,0 +1,20 @@ +class Badge < ApplicationRecord + + def self.get_id_from_name(badge_name) + Badge.find_by(name: badge_name)&.id + end + + def self.get_image_name_from_name(badge_name) + Badge.find_by(name: badge_name)&.image_name + end + + def self.upload_image(image_file) + return '' unless image_file + + image_name = image_file.original_filename + File.open(Rails.root.join('app', 'assets', 'images', 'badges', image_name), 'wb') do |file| + file.write(image_file.read) + end + image_name + end +end From ef85f89a392646ff80b8c384e40270b0a0edc68e Mon Sep 17 00:00:00 2001 From: Kunal Govind Patil Date: Mon, 24 Apr 2023 19:16:48 -0400 Subject: [PATCH 05/27] added duties model --- app/models/duty.rb | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 app/models/duty.rb diff --git a/app/models/duty.rb b/app/models/duty.rb new file mode 100644 index 00000000..13459c95 --- /dev/null +++ b/app/models/duty.rb @@ -0,0 +1,28 @@ +class Duty < ApplicationRecord + belongs_to :assignment + + validates :name, + presence: true, + format: { with: /\A[^`!@#\$%\^&*+_=]+\z/, + message: 'Please enter a valid role name' }, + length: { + minimum: 3, + message: 'Role name is too short (minimum is 3 characters)' + }, + uniqueness: { + case_sensitive: false, scope: :assignment, + message: 'The role "%{value}" is already present for this assignment' + } + + validates_numericality_of :max_members_for_duty, + only_integer: true, + greater_than_or_equal_to: 1, + message: 'Value for max members for role is invalid' + + # check if the duty selected is available for selection in that particular team. + # Checks whether current duty count in the team is less than the max_members_for_duty + # set for that particular duty + def can_be_assigned?(team) + max_members_for_duty > team.participants.where(duty_id: id).count + end +end From 65ab2dddbf5a14083abc631937a31b3540f41865 Mon Sep 17 00:00:00 2001 From: Kunal Govind Patil Date: Mon, 24 Apr 2023 19:17:39 -0400 Subject: [PATCH 06/27] database migrations --- db/migrate/20230423205355_create_badges.rb | 11 +++++++++++ db/migrate/20230423220953_create_duties.rb | 11 +++++++++++ 2 files changed, 22 insertions(+) create mode 100644 db/migrate/20230423205355_create_badges.rb create mode 100644 db/migrate/20230423220953_create_duties.rb diff --git a/db/migrate/20230423205355_create_badges.rb b/db/migrate/20230423205355_create_badges.rb new file mode 100644 index 00000000..85d2b803 --- /dev/null +++ b/db/migrate/20230423205355_create_badges.rb @@ -0,0 +1,11 @@ +class CreateBadges < ActiveRecord::Migration[7.0] + def change + create_table :badges do |t| + t.string :name + t.string :description + t.string :image_name + + t.timestamps + end + end +end diff --git a/db/migrate/20230423220953_create_duties.rb b/db/migrate/20230423220953_create_duties.rb new file mode 100644 index 00000000..45297482 --- /dev/null +++ b/db/migrate/20230423220953_create_duties.rb @@ -0,0 +1,11 @@ +class CreateDuties < ActiveRecord::Migration[7.0] + def change + create_table :duties do |t| + t.string :name + t.integer :max_members_for_duty + t.references :assignment, null: false, foreign_key: true + + t.timestamps + end + end +end From 73f30dceb62f1597e73e09f3e522ad242fbe1558 Mon Sep 17 00:00:00 2001 From: Kunal Govind Patil Date: Mon, 24 Apr 2023 19:22:24 -0400 Subject: [PATCH 07/27] added model testing --- spec/models/badge_spec.rb | 5 +++++ spec/models/duty_spec.rb | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 spec/models/badge_spec.rb create mode 100644 spec/models/duty_spec.rb diff --git a/spec/models/badge_spec.rb b/spec/models/badge_spec.rb new file mode 100644 index 00000000..bd395a60 --- /dev/null +++ b/spec/models/badge_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe Badge, type: :model do + pending "add some examples to (or delete) #{__FILE__}" +end diff --git a/spec/models/duty_spec.rb b/spec/models/duty_spec.rb new file mode 100644 index 00000000..dd020192 --- /dev/null +++ b/spec/models/duty_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe Duty, type: :model do + pending "add some examples to (or delete) #{__FILE__}" +end From d1f8092e7898d905f9ba4f876c2f4001f3fa4e5f Mon Sep 17 00:00:00 2001 From: Kunal Govind Patil Date: Mon, 24 Apr 2023 19:22:55 -0400 Subject: [PATCH 08/27] added controller testing init --- spec/requests/api/v1/badges_spec.rb | 41 +++++++++++++++++++++++++++++ spec/requests/api/v1/duties_spec.rb | 39 +++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 spec/requests/api/v1/badges_spec.rb create mode 100644 spec/requests/api/v1/duties_spec.rb diff --git a/spec/requests/api/v1/badges_spec.rb b/spec/requests/api/v1/badges_spec.rb new file mode 100644 index 00000000..adcd6b0c --- /dev/null +++ b/spec/requests/api/v1/badges_spec.rb @@ -0,0 +1,41 @@ +require 'rails_helper' + +RSpec.describe "Api::V1::Badges", type: :request do + let(:user) { create(:user) } + + describe "GET #index" do + it "returns http success" do + get "/api/v1/badges/index" + expect(response).to have_http_status(:success) + end + end + + describe "GET /show" do + it "returns http success" do + get "/api/v1/badges/show" + expect(response).to have_http_status(:success) + end + end + + describe "GET /create" do + it "returns http success" do + get "/api/v1/badges/create" + expect(response).to have_http_status(:success) + end + end + + describe "GET /update" do + it "returns http success" do + get "/api/v1/badges/update" + expect(response).to have_http_status(:success) + end + end + + describe "GET /destroy" do + it "returns http success" do + get "/api/v1/badges/destroy" + expect(response).to have_http_status(:success) + end + end + +end diff --git a/spec/requests/api/v1/duties_spec.rb b/spec/requests/api/v1/duties_spec.rb new file mode 100644 index 00000000..c06e0edd --- /dev/null +++ b/spec/requests/api/v1/duties_spec.rb @@ -0,0 +1,39 @@ +require 'rails_helper' + +RSpec.describe "Api::V1::Duties", type: :request do + describe "GET /index" do + it "returns http success" do + get "/api/v1/duties/index" + expect(response).to have_http_status(:success) + end + end + + describe "GET /show" do + it "returns http success" do + get "/api/v1/duties/show" + expect(response).to have_http_status(:success) + end + end + + describe "GET /create" do + it "returns http success" do + get "/api/v1/duties/create" + expect(response).to have_http_status(:success) + end + end + + describe "GET /update" do + it "returns http success" do + get "/api/v1/duties/update" + expect(response).to have_http_status(:success) + end + end + + describe "GET /destroy" do + it "returns http success" do + get "/api/v1/duties/destroy" + expect(response).to have_http_status(:success) + end + end + +end From 7564662dfd658a264ef2c108286c44a9f3e8d5e8 Mon Sep 17 00:00:00 2001 From: Kunal Govind Patil Date: Mon, 24 Apr 2023 19:24:11 -0400 Subject: [PATCH 09/27] setup --- Gemfile | 2 +- config/database.yml | 4 ++-- config/routes.rb | 10 ++++++++++ db/schema.rb | 34 ++++++++++++++++++++++++++-------- 4 files changed, 39 insertions(+), 11 deletions(-) diff --git a/Gemfile b/Gemfile index 8e571b54..d360c4db 100644 --- a/Gemfile +++ b/Gemfile @@ -41,4 +41,4 @@ end group :development do # Speed up commands on slow machines / big apps [https://github.com/rails/spring] gem 'spring' -end +end \ No newline at end of file diff --git a/config/database.yml b/config/database.yml index 092986fc..d2ec0c2e 100644 --- a/config/database.yml +++ b/config/database.yml @@ -13,8 +13,8 @@ default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> - username: root - password: expertiza + username: dev + password: root development: diff --git a/config/routes.rb b/config/routes.rb index 3a27d696..de645a0b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -7,6 +7,16 @@ # root "articles#index" namespace :api do namespace :v1 do + get 'badges/index' + get 'badges/show' + get 'badges/create' + get 'badges/update' + get 'badges/destroy' + get 'duties/index' + get 'duties/show' + get 'duties/create' + get 'duties/update' + get 'duties/destroy' resources :institutions resources :roles resources :users do diff --git a/db/schema.rb b/db/schema.rb index 7af1bf3e..6637afe1 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.0].define(version: 2023_03_15_185139) do +ActiveRecord::Schema[7.0].define(version: 2023_04_23_220953) do create_table "assignments", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| t.string "name" t.string "directory_path" @@ -65,6 +65,23 @@ t.datetime "updated_at", null: false end + create_table "badges", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| + t.string "name" + t.string "description" + t.string "image_name" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "duties", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| + t.string "name" + t.integer "max_members_for_duty" + t.bigint "assignment_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["assignment_id"], name: "index_duties_on_assignment_id" + end + create_table "institutions", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| t.string "name" t.datetime "created_at", null: false @@ -88,21 +105,22 @@ t.string "email" t.integer "parent_id" t.string "mru_directory_path" - t.boolean "email_on_review" - t.boolean "email_on_submission" - t.boolean "email_on_review_of_review" - t.boolean "is_new_user" - t.boolean "master_permission_granted" + t.boolean "email_on_review", default: false + t.boolean "email_on_submission", default: false + t.boolean "email_on_review_of_review", default: false + t.boolean "is_new_user", default: true + t.boolean "master_permission_granted", default: false t.string "handle" t.string "persistence_token" t.string "timezonepref" - t.boolean "copy_of_emails" + t.boolean "copy_of_emails", default: false t.integer "institution_id" - t.boolean "etc_icons_on_homepage" + t.boolean "etc_icons_on_homepage", default: false t.integer "locale" t.datetime "created_at", null: false t.datetime "updated_at", null: false end + add_foreign_key "duties", "assignments" add_foreign_key "roles", "roles", column: "parent_id", on_delete: :cascade end From 87541493d17e91196345515870343c4b50302bae Mon Sep 17 00:00:00 2001 From: Kunal Govind Patil Date: Mon, 24 Apr 2023 20:36:36 -0400 Subject: [PATCH 10/27] controller modified --- app/controllers/api/v1/badges_controller.rb | 25 +++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/v1/badges_controller.rb b/app/controllers/api/v1/badges_controller.rb index 4784c601..46bdc62a 100644 --- a/app/controllers/api/v1/badges_controller.rb +++ b/app/controllers/api/v1/badges_controller.rb @@ -4,13 +4,20 @@ class Api::V1::BadgesController < ApplicationController before_action :set_return_to, only: [:new] def action_allowed? - current_user_has_ta_privileges? + unless current_user_has_ta_privileges? + redirect_to login_path, alert: "You don't have permission to access this page" + end end def index @badges = Badge.all end + def show + @badge = Badge.find(params[:id]) + render json: @badge + end + def new @badge = Badge.new end @@ -27,18 +34,28 @@ def create def update if @badge.update(badge_params) - redirect_to @badge, notice: 'Badge was successfully updated.' + redirect_to api_v1_badge_url(@badge), notice: 'Badge was successfully updated.' else render :edit end end + def destroy + @badge.destroy + redirect_to badges_url, notice: 'Badge was successfully destroyed.' + end + + private def set_badge @badge = Badge.find(params[:id]) end + def badges_url + "/api/v1/badges" + end + def set_return_to session[:return_to] ||= request.referer end @@ -50,4 +67,8 @@ def redirect_to_url def badge_params params.require(:badge).permit(:name, :description, :image_name, :image_file) end + + def redirect_to_url + session.delete(:return_to) || api_v1_badges_url + end end From 120e94ae8c37a0ddcf36b18ffa6bb43cb948e2a9 Mon Sep 17 00:00:00 2001 From: Kunal Govind Patil Date: Mon, 24 Apr 2023 20:37:01 -0400 Subject: [PATCH 11/27] route mod --- config/routes.rb | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index de645a0b..8f234c0f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,22 +1,11 @@ Rails.application.routes.draw do mount Rswag::Ui::Engine => '/api-docs' mount Rswag::Api::Engine => '/api-docs' - # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html - # Defines the root path route ("/") - # root "articles#index" namespace :api do namespace :v1 do - get 'badges/index' - get 'badges/show' - get 'badges/create' - get 'badges/update' - get 'badges/destroy' - get 'duties/index' - get 'duties/show' - get 'duties/create' - get 'duties/update' - get 'duties/destroy' + resources :badges + resources :duties resources :institutions resources :roles resources :users do From d7fa23f007ad48a2a1a216ebcf68554fcb23be83 Mon Sep 17 00:00:00 2001 From: Kunal Govind Patil Date: Mon, 24 Apr 2023 20:37:26 -0400 Subject: [PATCH 12/27] controller code fix --- spec/requests/api/v1/badges_spec.rb | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/spec/requests/api/v1/badges_spec.rb b/spec/requests/api/v1/badges_spec.rb index adcd6b0c..982f4313 100644 --- a/spec/requests/api/v1/badges_spec.rb +++ b/spec/requests/api/v1/badges_spec.rb @@ -5,37 +5,42 @@ describe "GET #index" do it "returns http success" do - get "/api/v1/badges/index" + get "/api/v1/badges" expect(response).to have_http_status(:success) end end describe "GET /show" do it "returns http success" do - get "/api/v1/badges/show" + badge = Badge.create(name: "Test Badge", description: "This is a test badge") + get "/api/v1/badges/#{badge.id}" expect(response).to have_http_status(:success) end end - describe "GET /create" do + describe "POST /create" do it "returns http success" do - get "/api/v1/badges/create" - expect(response).to have_http_status(:success) + post "/api/v1/badges", params: { badge: { name: "Test Badge", description: "This is a test badge" } } + expect(response).to have_http_status(:redirect) end end - describe "GET /update" do + describe "PATCH /update" do it "returns http success" do - get "/api/v1/badges/update" + badge = Badge.create(name: "Test Badge", description: "This is a test badge") + patch "/api/v1/badges/#{badge.id}", params: { badge: { name: "New Test Badge Name" } } + follow_redirect! expect(response).to have_http_status(:success) end end - describe "GET /destroy" do + describe "DELETE /destroy" do it "returns http success" do - get "/api/v1/badges/destroy" - expect(response).to have_http_status(:success) + badge = Badge.create(name: "Test Badge", description: "This is a test badge") + delete "/api/v1/badges/#{badge.id}" + expect(response).to have_http_status(:redirect) end end + end From f2251f6480e6840e67f646baccca558083f95750 Mon Sep 17 00:00:00 2001 From: sankettangade Date: Mon, 24 Apr 2023 23:15:24 -0400 Subject: [PATCH 13/27] Added duties_controller.rb and duty.rb changes --- app/controllers/api/v1/duties_controller.rb | 52 ++++++++++++++++++++- app/models/duty.rb | 34 +++++--------- 2 files changed, 63 insertions(+), 23 deletions(-) diff --git a/app/controllers/api/v1/duties_controller.rb b/app/controllers/api/v1/duties_controller.rb index c5440335..13b4492b 100644 --- a/app/controllers/api/v1/duties_controller.rb +++ b/app/controllers/api/v1/duties_controller.rb @@ -1,16 +1,66 @@ class Api::V1::DutiesController < ApplicationController + + before_action :set_assignment + before_action :set_duty, only: %i[show edit update destroy] + before_action :authorize_user, except: [:index, :show] + def index + @duties = @assignment.duties end def show end + def new + @duty = @assignment.duties.build + end + + def edit + end + def create + @duty = @assignment.duties.build(duty_params) + + if @duty.save + redirect_to edit_assignment_path(@assignment), notice: 'Role was successfully created.' + else + redirect_to_create_page_and_show_error + end end def update + if @duty.update(duty_params) + redirect_to edit_assignment_path(@assignment), notice: 'Role was successfully updated.' + else + redirect_to_create_page_and_show_error + end end def destroy + @duty.destroy + redirect_to edit_assignment_path(@assignment), notice: 'Role was successfully deleted.' + end + + private + + def set_assignment + @assignment = Assignment.find(params[:assignment_id]) + end + + def set_duty + @duty = @assignment.duties.find(params[:id]) + end + + def authorize_user + redirect_to root_path, alert: 'You are not authorized to perform this action.' unless current_user_has_ta_privileges? + end + + def redirect_to_create_page_and_show_error + flash[:error] = @duty.errors.full_messages.join('. ') + redirect_to action: :new, assignment_id: @assignment.id + end + + def duty_params + params.require(:duty).permit(:max_members_for_duty, :name) + end end -end diff --git a/app/models/duty.rb b/app/models/duty.rb index 13459c95..c37d9b0a 100644 --- a/app/models/duty.rb +++ b/app/models/duty.rb @@ -1,28 +1,18 @@ class Duty < ApplicationRecord belongs_to :assignment + validates :name, presence: true, + format: { with: /\A[^`!@#\$%\^&*+_=]+\z/, + message: 'Please enter a valid role name' }, + length: { + minimum: 3, + message: 'Role name is too short (minimum is 3 characters)' + } + validates :name, uniqueness: { case_sensitive: false, scope: :assignment_id, + message: 'The role "%{value}" is already present for this assignment' } + validates :max_members_for_duty, numericality: { only_integer: true, greater_than_or_equal_to: 1, + message: 'Value for max members for role is invalid' } - validates :name, - presence: true, - format: { with: /\A[^`!@#\$%\^&*+_=]+\z/, - message: 'Please enter a valid role name' }, - length: { - minimum: 3, - message: 'Role name is too short (minimum is 3 characters)' - }, - uniqueness: { - case_sensitive: false, scope: :assignment, - message: 'The role "%{value}" is already present for this assignment' - } - - validates_numericality_of :max_members_for_duty, - only_integer: true, - greater_than_or_equal_to: 1, - message: 'Value for max members for role is invalid' - - # check if the duty selected is available for selection in that particular team. - # Checks whether current duty count in the team is less than the max_members_for_duty - # set for that particular duty def can_be_assigned?(team) - max_members_for_duty > team.participants.where(duty_id: id).count + max_members_for_duty > team.participants.select { |team_member| team_member.duty_id == id }.count end end From 5f024077818b174e4081d07cf06577fffb14fa5f Mon Sep 17 00:00:00 2001 From: sankettangade Date: Mon, 24 Apr 2023 23:17:40 -0400 Subject: [PATCH 14/27] Changes in duties_controller --- app/controllers/api/v1/badges_controller.rb | 4 +++- app/controllers/api/v1/duties_controller.rb | 5 +++-- app/models/duty.rb | 2 ++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/app/controllers/api/v1/badges_controller.rb b/app/controllers/api/v1/badges_controller.rb index 46bdc62a..9ebbd929 100644 --- a/app/controllers/api/v1/badges_controller.rb +++ b/app/controllers/api/v1/badges_controller.rb @@ -46,8 +46,10 @@ def destroy end - private + + + private def set_badge @badge = Badge.find(params[:id]) end diff --git a/app/controllers/api/v1/duties_controller.rb b/app/controllers/api/v1/duties_controller.rb index 13b4492b..b8d1c4ee 100644 --- a/app/controllers/api/v1/duties_controller.rb +++ b/app/controllers/api/v1/duties_controller.rb @@ -1,8 +1,8 @@ class Api::V1::DutiesController < ApplicationController before_action :set_assignment - before_action :set_duty, only: %i[show edit update destroy] before_action :authorize_user, except: [:index, :show] + before_action :set_duty, only: %i[show edit update destroy] def index @duties = @assignment.duties @@ -41,8 +41,9 @@ def destroy redirect_to edit_assignment_path(@assignment), notice: 'Role was successfully deleted.' end - private + + private def set_assignment @assignment = Assignment.find(params[:assignment_id]) end diff --git a/app/models/duty.rb b/app/models/duty.rb index c37d9b0a..ae7e42de 100644 --- a/app/models/duty.rb +++ b/app/models/duty.rb @@ -12,6 +12,8 @@ class Duty < ApplicationRecord validates :max_members_for_duty, numericality: { only_integer: true, greater_than_or_equal_to: 1, message: 'Value for max members for role is invalid' } + + def can_be_assigned?(team) max_members_for_duty > team.participants.select { |team_member| team_member.duty_id == id }.count end From 8c4b8f254b2bfb21c1531fda721644a2755c0543 Mon Sep 17 00:00:00 2001 From: sankettangade Date: Mon, 24 Apr 2023 23:27:21 -0400 Subject: [PATCH 15/27] Added duties_controller test --- spec/requests/api/v1/duties_spec.rb | 57 ++++++++++++++++------------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/spec/requests/api/v1/duties_spec.rb b/spec/requests/api/v1/duties_spec.rb index c06e0edd..4db68d5d 100644 --- a/spec/requests/api/v1/duties_spec.rb +++ b/spec/requests/api/v1/duties_spec.rb @@ -1,39 +1,46 @@ -require 'rails_helper' +RSpec.describe Api::V1::DutiesController, type: :controller do + let(:assignment) { create(:assignment) } + let(:user) { create(:user) } -RSpec.describe "Api::V1::Duties", type: :request do - describe "GET /index" do - it "returns http success" do - get "/api/v1/duties/index" - expect(response).to have_http_status(:success) + before { sign_in(user) } + + describe 'GET #index' do + let!(:duties) { create_list(:duty, 3, assignment: assignment) } + + it 'returns a success response' do + get :index, params: { assignment_id: assignment.id } + expect(response).to be_successful end - end - describe "GET /show" do - it "returns http success" do - get "/api/v1/duties/show" - expect(response).to have_http_status(:success) + it 'assigns duties' do + get :index, params: { assignment_id: assignment.id } + expect(assigns(:duties)).to eq(duties) end end - describe "GET /create" do - it "returns http success" do - get "/api/v1/duties/create" - expect(response).to have_http_status(:success) + describe 'GET #show' do + let(:duty) { create(:duty, assignment: assignment) } + + it 'returns a success response' do + get :show, params: { assignment_id: assignment.id, id: duty.id } + expect(response).to be_successful end - end - describe "GET /update" do - it "returns http success" do - get "/api/v1/duties/update" - expect(response).to have_http_status(:success) + it 'assigns duty' do + get :show, params: { assignment_id: assignment.id, id: duty.id } + expect(assigns(:duty)).to eq(duty) end end - describe "GET /destroy" do - it "returns http success" do - get "/api/v1/duties/destroy" - expect(response).to have_http_status(:success) + describe 'GET #new' do + it 'returns a success response' do + get :new, params: { assignment_id: assignment.id } + expect(response).to be_successful end - end + it 'assigns a new duty' do + get :new, params: { assignment_id: assignment.id } + expect(assigns(:duty)).to be_a_new(Duty) + end + end end From d45c5938f8d2674e54cd386b8f9d02d949bee8c6 Mon Sep 17 00:00:00 2001 From: sankettangade Date: Mon, 24 Apr 2023 23:28:01 -0400 Subject: [PATCH 16/27] duties controller test --- spec/requests/api/v1/duties_spec.rb | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/spec/requests/api/v1/duties_spec.rb b/spec/requests/api/v1/duties_spec.rb index 4db68d5d..b277dfc2 100644 --- a/spec/requests/api/v1/duties_spec.rb +++ b/spec/requests/api/v1/duties_spec.rb @@ -43,4 +43,18 @@ expect(assigns(:duty)).to be_a_new(Duty) end end + + describe 'GET #edit' do + let(:duty) { create(:duty, assignment: assignment) } + + it 'returns a success response' do + get :edit, params: { assignment_id: assignment.id, id: duty.id } + expect(response).to be_successful + end + + it 'assigns duty' do + get :edit, params: { assignment_id: assignment.id, id: duty.id } + expect(assigns(:duty)).to eq(duty) + end + end end From 085a835127da80d7f1f356aef57cad4995f9f770 Mon Sep 17 00:00:00 2001 From: sankettangade Date: Mon, 24 Apr 2023 23:28:27 -0400 Subject: [PATCH 17/27] duties controller test --- spec/requests/api/v1/duties_spec.rb | 33 +++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/spec/requests/api/v1/duties_spec.rb b/spec/requests/api/v1/duties_spec.rb index b277dfc2..def29d6e 100644 --- a/spec/requests/api/v1/duties_spec.rb +++ b/spec/requests/api/v1/duties_spec.rb @@ -57,4 +57,37 @@ expect(assigns(:duty)).to eq(duty) end end + + describe 'POST #create' do + context 'with valid params' do + let(:duty_attributes) { attributes_for(:duty) } + + it 'creates a new duty' do + expect { + post :create, params: { assignment_id: assignment.id, duty: duty_attributes } + }.to change(Duty, :count).by(1) + end + + it 'redirects to edit_assignment_path' do + post :create, params: { assignment_id: assignment.id, duty: duty_attributes } + expect(response).to redirect_to(edit_assignment_path(assignment)) + end + end + + context 'with invalid params' do + let(:duty_attributes) { attributes_for(:duty, name: nil) } + + it 'does not create a new duty' do + expect { + post :create, params: { assignment_id: assignment.id, duty: duty_attributes } + }.to_not change(Duty, :count) + end + + it 'redirects to new duty page and shows error' do + post :create, params: { assignment_id: assignment.id, duty: duty_attributes } + expect(response).to redirect_to(action: :new, assignment_id: assignment.id) + expect(flash[:error]).to be_present + end + end + end end From ff363d37bee6956c57bf6a49e9b8368ddae98604 Mon Sep 17 00:00:00 2001 From: sankettangade Date: Tue, 25 Apr 2023 19:21:12 -0400 Subject: [PATCH 18/27] Duty test cases change --- spec/requests/api/v1/duties_spec.rb | 101 +++++++--------------------- 1 file changed, 26 insertions(+), 75 deletions(-) diff --git a/spec/requests/api/v1/duties_spec.rb b/spec/requests/api/v1/duties_spec.rb index def29d6e..cb3f03e9 100644 --- a/spec/requests/api/v1/duties_spec.rb +++ b/spec/requests/api/v1/duties_spec.rb @@ -1,93 +1,44 @@ -RSpec.describe Api::V1::DutiesController, type: :controller do - let(:assignment) { create(:assignment) } - let(:user) { create(:user) } +require 'rails_helper' - before { sign_in(user) } +RSpec.describe 'Api::V1::Duties', type: :request do + let(:user) { create(:user) } describe 'GET #index' do - let!(:duties) { create_list(:duty, 3, assignment: assignment) } - - it 'returns a success response' do - get :index, params: { assignment_id: assignment.id } - expect(response).to be_successful - end - - it 'assigns duties' do - get :index, params: { assignment_id: assignment.id } - expect(assigns(:duties)).to eq(duties) + it 'returns http success' do + get '/api/v1/duties' + expect(response).to have_http_status(:success) end end - describe 'GET #show' do - let(:duty) { create(:duty, assignment: assignment) } - - it 'returns a success response' do - get :show, params: { assignment_id: assignment.id, id: duty.id } - expect(response).to be_successful - end - - it 'assigns duty' do - get :show, params: { assignment_id: assignment.id, id: duty.id } - expect(assigns(:duty)).to eq(duty) + describe 'GET /show' do + it 'returns http success' do + duty = Duty.create(name: 'Test Duty', max_members_for_duty: 1, assignment_id: 1) + get "/api/v1/duty/#{duty.id}" + expect(response).to have_http_status(:success) end end - describe 'GET #new' do - it 'returns a success response' do - get :new, params: { assignment_id: assignment.id } - expect(response).to be_successful - end - - it 'assigns a new duty' do - get :new, params: { assignment_id: assignment.id } - expect(assigns(:duty)).to be_a_new(Duty) + describe 'POST /create' do + it 'returns http success' do + post '/api/v1/duties', params: { duty: { name: 'Test Duty', max_members_for_duty: 1} } + expect(response).to have_http_status(:redirect) end end - describe 'GET #edit' do - let(:duty) { create(:duty, assignment: assignment) } - - it 'returns a success response' do - get :edit, params: { assignment_id: assignment.id, id: duty.id } - expect(response).to be_successful - end - - it 'assigns duty' do - get :edit, params: { assignment_id: assignment.id, id: duty.id } - expect(assigns(:duty)).to eq(duty) + describe 'PATCH /update' do + it 'returns http success' do + duty = Duty.create(name: 'Test Duty', max_members_for_duty: 1, assignment_id: 1) + patch "/api/v1/duties/#{duty.id}", params: { duty: { name: 'Test Duty', max_members_for_duty: 1 } } + follow_redirect! + expect(response).to have_http_status(:success) end end - describe 'POST #create' do - context 'with valid params' do - let(:duty_attributes) { attributes_for(:duty) } - - it 'creates a new duty' do - expect { - post :create, params: { assignment_id: assignment.id, duty: duty_attributes } - }.to change(Duty, :count).by(1) - end - - it 'redirects to edit_assignment_path' do - post :create, params: { assignment_id: assignment.id, duty: duty_attributes } - expect(response).to redirect_to(edit_assignment_path(assignment)) - end - end - - context 'with invalid params' do - let(:duty_attributes) { attributes_for(:duty, name: nil) } - - it 'does not create a new duty' do - expect { - post :create, params: { assignment_id: assignment.id, duty: duty_attributes } - }.to_not change(Duty, :count) - end - - it 'redirects to new duty page and shows error' do - post :create, params: { assignment_id: assignment.id, duty: duty_attributes } - expect(response).to redirect_to(action: :new, assignment_id: assignment.id) - expect(flash[:error]).to be_present - end + describe 'DELETE /destroy' do + it 'returns http success' do + duty = Duty.create(name: 'Test Duty', max_members_for_duty: 1, assignment_id: 1) + delete "/api/v1/badges/#{duty.id}" + expect(response).to have_http_status(:redirect) end end end From 5d9b9cc5cf3ff7eff3f31eb57154af7305838d9c Mon Sep 17 00:00:00 2001 From: sankettangade Date: Tue, 25 Apr 2023 23:18:11 -0400 Subject: [PATCH 19/27] duties_controller test cases --- app/controllers/api/v1/duties_controller.rb | 49 ++++++++++----------- spec/requests/api/v1/duties_spec.rb | 46 ++++++++++--------- 2 files changed, 49 insertions(+), 46 deletions(-) diff --git a/app/controllers/api/v1/duties_controller.rb b/app/controllers/api/v1/duties_controller.rb index b8d1c4ee..8b09435f 100644 --- a/app/controllers/api/v1/duties_controller.rb +++ b/app/controllers/api/v1/duties_controller.rb @@ -1,28 +1,26 @@ -class Api::V1::DutiesController < ApplicationController +# frozen_string_literal: true - before_action :set_assignment - before_action :authorize_user, except: [:index, :show] +class Api::V1::DutiesController < ApplicationController before_action :set_duty, only: %i[show edit update destroy] def index - @duties = @assignment.duties + @duties = Duty.all end - def show - end + def show; end def new - @duty = @assignment.duties.build + @duty = Duty.new + @id = params[:id] end - def edit - end + def edit; end def create - @duty = @assignment.duties.build(duty_params) + @duty = Duty.new(duty_params) if @duty.save - redirect_to edit_assignment_path(@assignment), notice: 'Role was successfully created.' + redirect_to redirect_to_url, notice: 'Role was successfully created.' else redirect_to_create_page_and_show_error end @@ -30,7 +28,7 @@ def create def update if @duty.update(duty_params) - redirect_to edit_assignment_path(@assignment), notice: 'Role was successfully updated.' + redirect_to redirect_to_url, notice: 'Role was successfully updated.' else redirect_to_create_page_and_show_error end @@ -38,30 +36,29 @@ def update def destroy @duty.destroy - redirect_to edit_assignment_path(@assignment), notice: 'Role was successfully deleted.' + redirect_to redirect_to_url, notice: 'Role was successfully deleted.' end - - - private - def set_assignment - @assignment = Assignment.find(params[:assignment_id]) - end + private def set_duty - @duty = @assignment.duties.find(params[:id]) + @duty = Duty.find(params[:id]) end - def authorize_user - redirect_to root_path, alert: 'You are not authorized to perform this action.' unless current_user_has_ta_privileges? + def redirect_to_edit_assignment_path + redirect_to edit_assignment_path(duty_params[:assignment_id]) end def redirect_to_create_page_and_show_error - flash[:error] = @duty.errors.full_messages.join('. ') - redirect_to action: :new, assignment_id: @assignment.id + # flash[:error] = @duty.errors.full_messages.join('. ') + redirect_to action: :new, id: duty_params[:assignment_id] end def duty_params - params.require(:duty).permit(:max_members_for_duty, :name) - end + params.require(:duty).permit(:assignment_id, :max_members_for_duty, :name) end +end + +def redirect_to_url + "/api/v1/duties" +end diff --git a/spec/requests/api/v1/duties_spec.rb b/spec/requests/api/v1/duties_spec.rb index cb3f03e9..128b7066 100644 --- a/spec/requests/api/v1/duties_spec.rb +++ b/spec/requests/api/v1/duties_spec.rb @@ -1,44 +1,50 @@ require 'rails_helper' -RSpec.describe 'Api::V1::Duties', type: :request do +RSpec.describe "Api::V1::Duties", type: :request do let(:user) { create(:user) } - - describe 'GET #index' do - it 'returns http success' do - get '/api/v1/duties' + let(:assignment) { build(:assignment, id: 1) } + let(:due_date) { build(:assignment_due_date, deadline_type_id: 1) } + describe "GET #index" do + it "returns http success" do + get "/api/v1/duties" expect(response).to have_http_status(:success) end end - describe 'GET /show' do - it 'returns http success' do - duty = Duty.create(name: 'Test Duty', max_members_for_duty: 1, assignment_id: 1) - get "/api/v1/duty/#{duty.id}" + describe "GET /show" do + it "returns http success" do + duty = Duty.create(name: "Test Duties", max_members_for_duty: 1) + get "/api/v1/duties/#{duty.id}" expect(response).to have_http_status(:success) end end - describe 'POST /create' do - it 'returns http success' do - post '/api/v1/duties', params: { duty: { name: 'Test Duty', max_members_for_duty: 1} } + describe "POST /create" do + it "returns http success" do + assignment = Assignment.create(name: "Assignment") + post "/api/v1/duties", params: { duty: { name: "Test Duty", max_members_for_duty: 1, assignment_id: assignment.id} } expect(response).to have_http_status(:redirect) end end - describe 'PATCH /update' do - it 'returns http success' do - duty = Duty.create(name: 'Test Duty', max_members_for_duty: 1, assignment_id: 1) - patch "/api/v1/duties/#{duty.id}", params: { duty: { name: 'Test Duty', max_members_for_duty: 1 } } + describe "PATCH /update" do + it "returns http success" do + assignment = Assignment.create(name: "Assignment") + duty = Duty.create(name: "Test Duty", max_members_for_duty: 1, assignment_id: assignment.id) + patch "/api/v1/duties/#{duty.id}", params: { duty: { name: "New Test Duty Name" } } follow_redirect! expect(response).to have_http_status(:success) end end - describe 'DELETE /destroy' do - it 'returns http success' do - duty = Duty.create(name: 'Test Duty', max_members_for_duty: 1, assignment_id: 1) - delete "/api/v1/badges/#{duty.id}" + describe "DELETE /destroy" do + it "returns http success" do + assignment = Assignment.create(name: "Assignment") + duty = Duty.create(name: "Test Duty", max_members_for_duty: 1, assignment_id: assignment.id) + delete "/api/v1/duties/#{duty.id}" expect(response).to have_http_status(:redirect) end end + + end From 8a35ac07ed7be32d4612365869fa1d8f2fd17161 Mon Sep 17 00:00:00 2001 From: sankettangade Date: Thu, 27 Apr 2023 20:17:11 -0400 Subject: [PATCH 20/27] render data as json changes --- app/controllers/api/v1/badges_controller.rb | 41 ++++----------------- app/controllers/api/v1/duties_controller.rb | 35 ++++++------------ 2 files changed, 19 insertions(+), 57 deletions(-) diff --git a/app/controllers/api/v1/badges_controller.rb b/app/controllers/api/v1/badges_controller.rb index 9ebbd929..02c865e2 100644 --- a/app/controllers/api/v1/badges_controller.rb +++ b/app/controllers/api/v1/badges_controller.rb @@ -1,76 +1,51 @@ class Api::V1::BadgesController < ApplicationController - before_action :set_badge, only: [:show, :edit, :update, :destroy] before_action :set_return_to, only: [:new] - def action_allowed? - unless current_user_has_ta_privileges? - redirect_to login_path, alert: "You don't have permission to access this page" - end - end - def index @badges = Badge.all + render json: { badges: @badges }, status: :ok end def show - @badge = Badge.find(params[:id]) - render json: @badge - end - - def new - @badge = Badge.new + render json: { badge: @badge }, status: :ok end def create @badge = Badge.new(badge_params) if @badge.save - redirect_to redirect_to_url, notice: 'Badge was successfully created' + render json: { badge: @badge }, status: :created else - render :new + render json: { errors: @badge.errors.full_messages }, status: :unprocessable_entity end end def update if @badge.update(badge_params) - redirect_to api_v1_badge_url(@badge), notice: 'Badge was successfully updated.' + render json: { badge: @badge }, status: :ok else - render :edit + render json: { errors: @badge.errors.full_messages }, status: :unprocessable_entity end end def destroy @badge.destroy - redirect_to badges_url, notice: 'Badge was successfully destroyed.' + render json: { message: "Badge was successfully destroyed." }, status: :ok end - - - - private + def set_badge @badge = Badge.find(params[:id]) end - def badges_url - "/api/v1/badges" - end def set_return_to session[:return_to] ||= request.referer end - def redirect_to_url - session.delete(:return_to) || badges_url - end - def badge_params params.require(:badge).permit(:name, :description, :image_name, :image_file) end - - def redirect_to_url - session.delete(:return_to) || api_v1_badges_url - end end diff --git a/app/controllers/api/v1/duties_controller.rb b/app/controllers/api/v1/duties_controller.rb index 8b09435f..c7b61bc3 100644 --- a/app/controllers/api/v1/duties_controller.rb +++ b/app/controllers/api/v1/duties_controller.rb @@ -5,38 +5,38 @@ class Api::V1::DutiesController < ApplicationController def index @duties = Duty.all + render json: @duties end - def show; end - - def new - @duty = Duty.new - @id = params[:id] + def show + render json: @duty end - def edit; end + def edit + render json: @duty + end def create @duty = Duty.new(duty_params) if @duty.save - redirect_to redirect_to_url, notice: 'Role was successfully created.' + render json: @duty, status: :created else - redirect_to_create_page_and_show_error + render json: { error: @duty.errors.full_messages.join('. ') }, status: :unprocessable_entity end end def update if @duty.update(duty_params) - redirect_to redirect_to_url, notice: 'Role was successfully updated.' + render json: @duty else - redirect_to_create_page_and_show_error + render json: { error: @duty.errors.full_messages.join('. ') }, status: :unprocessable_entity end end def destroy @duty.destroy - redirect_to redirect_to_url, notice: 'Role was successfully deleted.' + head :no_content end private @@ -45,20 +45,7 @@ def set_duty @duty = Duty.find(params[:id]) end - def redirect_to_edit_assignment_path - redirect_to edit_assignment_path(duty_params[:assignment_id]) - end - - def redirect_to_create_page_and_show_error - # flash[:error] = @duty.errors.full_messages.join('. ') - redirect_to action: :new, id: duty_params[:assignment_id] - end - def duty_params params.require(:duty).permit(:assignment_id, :max_members_for_duty, :name) end end - -def redirect_to_url - "/api/v1/duties" -end From 2d339e2548135f7c9d236c9dbe8f09621cf04079 Mon Sep 17 00:00:00 2001 From: sankettangade Date: Thu, 27 Apr 2023 20:25:33 -0400 Subject: [PATCH 21/27] Minor changes for rendering responses --- app/controllers/api/v1/badges_controller.rb | 5 +++++ app/controllers/api/v1/duties_controller.rb | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/app/controllers/api/v1/badges_controller.rb b/app/controllers/api/v1/badges_controller.rb index 02c865e2..52f5b2be 100644 --- a/app/controllers/api/v1/badges_controller.rb +++ b/app/controllers/api/v1/badges_controller.rb @@ -7,6 +7,11 @@ def index render json: { badges: @badges }, status: :ok end + def new + @badge = Badge.new + render json: { badge: @badge }, status: :ok + end + def show render json: { badge: @badge }, status: :ok end diff --git a/app/controllers/api/v1/duties_controller.rb b/app/controllers/api/v1/duties_controller.rb index c7b61bc3..faa6856b 100644 --- a/app/controllers/api/v1/duties_controller.rb +++ b/app/controllers/api/v1/duties_controller.rb @@ -8,6 +8,11 @@ def index render json: @duties end + def new + @duty = Duty.new + @id = params[:id] + end + def show render json: @duty end From b33b076b82cef6f5dc443c8a6e8308c0035c2c65 Mon Sep 17 00:00:00 2001 From: sankettangade Date: Thu, 27 Apr 2023 20:28:02 -0400 Subject: [PATCH 22/27] Model class changes --- app/models/duty.rb | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/app/models/duty.rb b/app/models/duty.rb index ae7e42de..1242319e 100644 --- a/app/models/duty.rb +++ b/app/models/duty.rb @@ -1,19 +1,18 @@ class Duty < ApplicationRecord belongs_to :assignment + validates :name, presence: true, format: { with: /\A[^`!@#\$%\^&*+_=]+\z/, message: 'Please enter a valid role name' }, length: { - minimum: 3, - message: 'Role name is too short (minimum is 3 characters)' - } - validates :name, uniqueness: { case_sensitive: false, scope: :assignment_id, + minimum: 3, + message: 'Role name is too short (minimum is 3 characters)' + }, + uniqueness: { case_sensitive: false, scope: :assignment_id, message: 'The role "%{value}" is already present for this assignment' } validates :max_members_for_duty, numericality: { only_integer: true, greater_than_or_equal_to: 1, message: 'Value for max members for role is invalid' } - - def can_be_assigned?(team) max_members_for_duty > team.participants.select { |team_member| team_member.duty_id == id }.count end From d99fc561bb3f76b850999603eb1e609a8c96146c Mon Sep 17 00:00:00 2001 From: sankettangade Date: Thu, 27 Apr 2023 20:56:51 -0400 Subject: [PATCH 23/27] Added Rspecs API tests --- app/models/duty.rb | 6 +- spec/requests/api/v1/badges_Rspec_tests.rb | 46 ++++++++ spec/requests/api/v1/badges_spec.rb | 116 +++++++++++++------ spec/requests/api/v1/duties_Rspec_tests.rb | 50 +++++++++ spec/requests/api/v1/duties_spec.rb | 124 +++++++++++++++------ spec/requests/api/v1/institution_spec.rb | 3 - swagger/v1/swagger.yaml | 78 +++++++++++++ 7 files changed, 349 insertions(+), 74 deletions(-) create mode 100644 spec/requests/api/v1/badges_Rspec_tests.rb create mode 100644 spec/requests/api/v1/duties_Rspec_tests.rb diff --git a/app/models/duty.rb b/app/models/duty.rb index 1242319e..8d5b687a 100644 --- a/app/models/duty.rb +++ b/app/models/duty.rb @@ -5,9 +5,9 @@ class Duty < ApplicationRecord format: { with: /\A[^`!@#\$%\^&*+_=]+\z/, message: 'Please enter a valid role name' }, length: { - minimum: 3, - message: 'Role name is too short (minimum is 3 characters)' - }, + minimum: 3, + message: 'Role name is too short (minimum is 3 characters)' + }, uniqueness: { case_sensitive: false, scope: :assignment_id, message: 'The role "%{value}" is already present for this assignment' } validates :max_members_for_duty, numericality: { only_integer: true, greater_than_or_equal_to: 1, diff --git a/spec/requests/api/v1/badges_Rspec_tests.rb b/spec/requests/api/v1/badges_Rspec_tests.rb new file mode 100644 index 00000000..982f4313 --- /dev/null +++ b/spec/requests/api/v1/badges_Rspec_tests.rb @@ -0,0 +1,46 @@ +require 'rails_helper' + +RSpec.describe "Api::V1::Badges", type: :request do + let(:user) { create(:user) } + + describe "GET #index" do + it "returns http success" do + get "/api/v1/badges" + expect(response).to have_http_status(:success) + end + end + + describe "GET /show" do + it "returns http success" do + badge = Badge.create(name: "Test Badge", description: "This is a test badge") + get "/api/v1/badges/#{badge.id}" + expect(response).to have_http_status(:success) + end + end + + describe "POST /create" do + it "returns http success" do + post "/api/v1/badges", params: { badge: { name: "Test Badge", description: "This is a test badge" } } + expect(response).to have_http_status(:redirect) + end + end + + describe "PATCH /update" do + it "returns http success" do + badge = Badge.create(name: "Test Badge", description: "This is a test badge") + patch "/api/v1/badges/#{badge.id}", params: { badge: { name: "New Test Badge Name" } } + follow_redirect! + expect(response).to have_http_status(:success) + end + end + + describe "DELETE /destroy" do + it "returns http success" do + badge = Badge.create(name: "Test Badge", description: "This is a test badge") + delete "/api/v1/badges/#{badge.id}" + expect(response).to have_http_status(:redirect) + end + end + + +end diff --git a/spec/requests/api/v1/badges_spec.rb b/spec/requests/api/v1/badges_spec.rb index 982f4313..3000dc66 100644 --- a/spec/requests/api/v1/badges_spec.rb +++ b/spec/requests/api/v1/badges_spec.rb @@ -1,46 +1,100 @@ -require 'rails_helper' +require 'swagger_helper' -RSpec.describe "Api::V1::Badges", type: :request do - let(:user) { create(:user) } +RSpec.describe 'api/v1/badges', type: :request do - describe "GET #index" do - it "returns http success" do - get "/api/v1/badges" - expect(response).to have_http_status(:success) + path '/api/v1/badges' do + + get('list badges') do + response(200, 'successful') do + + after do |example| + example.metadata[:response][:content] = { + 'application/json' => { + example: JSON.parse(response.body, symbolize_names: true) + } + } + end + run_test! + end end - end - describe "GET /show" do - it "returns http success" do - badge = Badge.create(name: "Test Badge", description: "This is a test badge") - get "/api/v1/badges/#{badge.id}" - expect(response).to have_http_status(:success) + post('create badge') do + response(200, 'successful') do + + after do |example| + example.metadata[:response][:content] = { + 'application/json' => { + example: JSON.parse(response.body, symbolize_names: true) + } + } + end + run_test! + end end end - describe "POST /create" do - it "returns http success" do - post "/api/v1/badges", params: { badge: { name: "Test Badge", description: "This is a test badge" } } - expect(response).to have_http_status(:redirect) + path '/api/v1/badges/{id}' do + # You'll want to customize the parameter types... + parameter name: 'id', in: :path, type: :string, description: 'id' + + get('show badge') do + response(200, 'successful') do + let(:id) { '123' } + + after do |example| + example.metadata[:response][:content] = { + 'application/json' => { + example: JSON.parse(response.body, symbolize_names: true) + } + } + end + run_test! + end end - end - describe "PATCH /update" do - it "returns http success" do - badge = Badge.create(name: "Test Badge", description: "This is a test badge") - patch "/api/v1/badges/#{badge.id}", params: { badge: { name: "New Test Badge Name" } } - follow_redirect! - expect(response).to have_http_status(:success) + patch('update badge') do + response(200, 'successful') do + let(:id) { '123' } + + after do |example| + example.metadata[:response][:content] = { + 'application/json' => { + example: JSON.parse(response.body, symbolize_names: true) + } + } + end + run_test! + end end - end - describe "DELETE /destroy" do - it "returns http success" do - badge = Badge.create(name: "Test Badge", description: "This is a test badge") - delete "/api/v1/badges/#{badge.id}" - expect(response).to have_http_status(:redirect) + put('update badge') do + response(200, 'successful') do + let(:id) { '123' } + + after do |example| + example.metadata[:response][:content] = { + 'application/json' => { + example: JSON.parse(response.body, symbolize_names: true) + } + } + end + run_test! + end end - end + delete('delete badge') do + response(200, 'successful') do + let(:id) { '123' } + after do |example| + example.metadata[:response][:content] = { + 'application/json' => { + example: JSON.parse(response.body, symbolize_names: true) + } + } + end + run_test! + end + end + end end diff --git a/spec/requests/api/v1/duties_Rspec_tests.rb b/spec/requests/api/v1/duties_Rspec_tests.rb new file mode 100644 index 00000000..128b7066 --- /dev/null +++ b/spec/requests/api/v1/duties_Rspec_tests.rb @@ -0,0 +1,50 @@ +require 'rails_helper' + +RSpec.describe "Api::V1::Duties", type: :request do + let(:user) { create(:user) } + let(:assignment) { build(:assignment, id: 1) } + let(:due_date) { build(:assignment_due_date, deadline_type_id: 1) } + describe "GET #index" do + it "returns http success" do + get "/api/v1/duties" + expect(response).to have_http_status(:success) + end + end + + describe "GET /show" do + it "returns http success" do + duty = Duty.create(name: "Test Duties", max_members_for_duty: 1) + get "/api/v1/duties/#{duty.id}" + expect(response).to have_http_status(:success) + end + end + + describe "POST /create" do + it "returns http success" do + assignment = Assignment.create(name: "Assignment") + post "/api/v1/duties", params: { duty: { name: "Test Duty", max_members_for_duty: 1, assignment_id: assignment.id} } + expect(response).to have_http_status(:redirect) + end + end + + describe "PATCH /update" do + it "returns http success" do + assignment = Assignment.create(name: "Assignment") + duty = Duty.create(name: "Test Duty", max_members_for_duty: 1, assignment_id: assignment.id) + patch "/api/v1/duties/#{duty.id}", params: { duty: { name: "New Test Duty Name" } } + follow_redirect! + expect(response).to have_http_status(:success) + end + end + + describe "DELETE /destroy" do + it "returns http success" do + assignment = Assignment.create(name: "Assignment") + duty = Duty.create(name: "Test Duty", max_members_for_duty: 1, assignment_id: assignment.id) + delete "/api/v1/duties/#{duty.id}" + expect(response).to have_http_status(:redirect) + end + end + + +end diff --git a/spec/requests/api/v1/duties_spec.rb b/spec/requests/api/v1/duties_spec.rb index 128b7066..4bfd2b78 100644 --- a/spec/requests/api/v1/duties_spec.rb +++ b/spec/requests/api/v1/duties_spec.rb @@ -1,50 +1,100 @@ -require 'rails_helper' - -RSpec.describe "Api::V1::Duties", type: :request do - let(:user) { create(:user) } - let(:assignment) { build(:assignment, id: 1) } - let(:due_date) { build(:assignment_due_date, deadline_type_id: 1) } - describe "GET #index" do - it "returns http success" do - get "/api/v1/duties" - expect(response).to have_http_status(:success) +require 'swagger_helper' + +RSpec.describe 'api/v1/duties', type: :request do + + path '/api/v1/duties' do + + get('list duties') do + response(200, 'successful') do + + after do |example| + example.metadata[:response][:content] = { + 'application/json' => { + example: JSON.parse(response.body, symbolize_names: true) + } + } + end + run_test! + end end - end - describe "GET /show" do - it "returns http success" do - duty = Duty.create(name: "Test Duties", max_members_for_duty: 1) - get "/api/v1/duties/#{duty.id}" - expect(response).to have_http_status(:success) + post('create duty') do + response(200, 'successful') do + + after do |example| + example.metadata[:response][:content] = { + 'application/json' => { + example: JSON.parse(response.body, symbolize_names: true) + } + } + end + run_test! + end end end - describe "POST /create" do - it "returns http success" do - assignment = Assignment.create(name: "Assignment") - post "/api/v1/duties", params: { duty: { name: "Test Duty", max_members_for_duty: 1, assignment_id: assignment.id} } - expect(response).to have_http_status(:redirect) + path '/api/v1/duties/{id}' do + # You'll want to customize the parameter types... + parameter name: 'id', in: :path, type: :string, description: 'id' + + get('show duty') do + response(200, 'successful') do + let(:id) { '123' } + + after do |example| + example.metadata[:response][:content] = { + 'application/json' => { + example: JSON.parse(response.body, symbolize_names: true) + } + } + end + run_test! + end end - end - describe "PATCH /update" do - it "returns http success" do - assignment = Assignment.create(name: "Assignment") - duty = Duty.create(name: "Test Duty", max_members_for_duty: 1, assignment_id: assignment.id) - patch "/api/v1/duties/#{duty.id}", params: { duty: { name: "New Test Duty Name" } } - follow_redirect! - expect(response).to have_http_status(:success) + patch('update duty') do + response(200, 'successful') do + let(:id) { '123' } + + after do |example| + example.metadata[:response][:content] = { + 'application/json' => { + example: JSON.parse(response.body, symbolize_names: true) + } + } + end + run_test! + end end - end - describe "DELETE /destroy" do - it "returns http success" do - assignment = Assignment.create(name: "Assignment") - duty = Duty.create(name: "Test Duty", max_members_for_duty: 1, assignment_id: assignment.id) - delete "/api/v1/duties/#{duty.id}" - expect(response).to have_http_status(:redirect) + put('update duty') do + response(200, 'successful') do + let(:id) { '123' } + + after do |example| + example.metadata[:response][:content] = { + 'application/json' => { + example: JSON.parse(response.body, symbolize_names: true) + } + } + end + run_test! + end end - end + delete('delete duty') do + response(200, 'successful') do + let(:id) { '123' } + after do |example| + example.metadata[:response][:content] = { + 'application/json' => { + example: JSON.parse(response.body, symbolize_names: true) + } + } + end + run_test! + end + end + end end diff --git a/spec/requests/api/v1/institution_spec.rb b/spec/requests/api/v1/institution_spec.rb index 1ce0256b..a9fb49bf 100644 --- a/spec/requests/api/v1/institution_spec.rb +++ b/spec/requests/api/v1/institution_spec.rb @@ -1,7 +1,4 @@ require 'rails_helper' RSpec.describe "Api::V1::Institutions", type: :request do - describe "GET /index" do - pending "add some examples (or delete) #{__FILE__}" - end end diff --git a/swagger/v1/swagger.yaml b/swagger/v1/swagger.yaml index 23401885..0d33ef3a 100644 --- a/swagger/v1/swagger.yaml +++ b/swagger/v1/swagger.yaml @@ -4,6 +4,84 @@ info: title: EXPERTIZA API V1 version: v1 paths: + "/api/v1/badges": + get: + summary: list badges + responses: + '200': + description: successful + post: + summary: create badge + responses: + '200': + description: successful + "/api/v1/badges/{id}": + parameters: + - name: id + in: path + description: id + required: true + schema: + type: string + get: + summary: show badge + responses: + '200': + description: successful + patch: + summary: update badge + responses: + '200': + description: successful + put: + summary: update badge + responses: + '200': + description: successful + delete: + summary: delete badge + responses: + '200': + description: successful + "/api/v1/duties": + get: + summary: list duties + responses: + '200': + description: successful + post: + summary: create duty + responses: + '200': + description: successful + "/api/v1/duties/{id}": + parameters: + - name: id + in: path + description: id + required: true + schema: + type: string + get: + summary: show duty + responses: + '200': + description: successful + patch: + summary: update duty + responses: + '200': + description: successful + put: + summary: update duty + responses: + '200': + description: successful + delete: + summary: delete duty + responses: + '200': + description: successful "/api/v1/roles": get: summary: list roles From c972a39c9a54d555f3cf9176216bdb1cd5a882aa Mon Sep 17 00:00:00 2001 From: Kunal Govind Patil Date: Thu, 27 Apr 2023 23:35:41 -0400 Subject: [PATCH 24/27] fixed badges test --- spec/requests/api/v1/badges_spec.rb | 46 +++++++++++++++++++--------- swagger/v1/swagger.yaml | 47 ++++++++++++++++++++++++++--- 2 files changed, 73 insertions(+), 20 deletions(-) diff --git a/spec/requests/api/v1/badges_spec.rb b/spec/requests/api/v1/badges_spec.rb index 3000dc66..dce115ee 100644 --- a/spec/requests/api/v1/badges_spec.rb +++ b/spec/requests/api/v1/badges_spec.rb @@ -5,6 +5,7 @@ path '/api/v1/badges' do get('list badges') do + tags 'Badges' response(200, 'successful') do after do |example| @@ -19,8 +20,20 @@ end post('create badge') do - response(200, 'successful') do + tags 'Badges' + description 'Create a new badge' + consumes 'application/json' + produces 'application/json' + parameter name: :badge, in: :body, schema: { + type: :object, + properties: { + name: { type: :string }, + description: { type: :string } + }, + required: [ 'name', 'description' ] + } + response(200, 'successful') do after do |example| example.metadata[:response][:content] = { 'application/json' => { @@ -31,6 +44,7 @@ run_test! end end + end path '/api/v1/badges/{id}' do @@ -38,6 +52,7 @@ parameter name: 'id', in: :path, type: :string, description: 'id' get('show badge') do + tags 'Badges' response(200, 'successful') do let(:id) { '123' } @@ -53,23 +68,22 @@ end patch('update badge') do - response(200, 'successful') do - let(:id) { '123' } + tags 'Badges' + description 'Update a badge' + consumes 'application/json' + produces 'application/json' + parameter name: :id, in: :path, type: :string + parameter name: :badge, in: :body, schema: { + type: :object, + properties: { + name: { type: :string }, + description: { type: :string } + } + } - after do |example| - example.metadata[:response][:content] = { - 'application/json' => { - example: JSON.parse(response.body, symbolize_names: true) - } - } - end - run_test! - end - end - - put('update badge') do response(200, 'successful') do let(:id) { '123' } + let(:badge) { { name: 'Updated Badge Name', description: 'Updated Badge Description' } } after do |example| example.metadata[:response][:content] = { @@ -78,11 +92,13 @@ } } end + run_test! end end delete('delete badge') do + tags 'Badges' response(200, 'successful') do let(:id) { '123' } diff --git a/swagger/v1/swagger.yaml b/swagger/v1/swagger.yaml index 0d33ef3a..7855e031 100644 --- a/swagger/v1/swagger.yaml +++ b/swagger/v1/swagger.yaml @@ -7,14 +7,33 @@ paths: "/api/v1/badges": get: summary: list badges + tags: + - Badges responses: '200': description: successful post: summary: create badge + tags: + - Badges + description: Create a new badge + parameters: [] responses: '200': description: successful + requestBody: + content: + application/json: + schema: + type: object + properties: + name: + type: string + description: + type: string + required: + - name + - description "/api/v1/badges/{id}": parameters: - name: id @@ -25,21 +44,39 @@ paths: type: string get: summary: show badge + tags: + - Badges responses: '200': description: successful patch: summary: update badge + tags: + - Badges + description: Update a badge + parameters: + - name: id + in: path + required: true + schema: + type: string responses: '200': description: successful - put: - summary: update badge - responses: - '200': - description: successful + requestBody: + content: + application/json: + schema: + type: object + properties: + name: + type: string + description: + type: string delete: summary: delete badge + tags: + - Badges responses: '200': description: successful From 235938f208f4514841d727a629f0d2e95a133097 Mon Sep 17 00:00:00 2001 From: Kunal Govind Patil Date: Fri, 28 Apr 2023 01:47:19 -0400 Subject: [PATCH 25/27] fixed duties test --- spec/requests/api/v1/duties_spec.rb | 47 +++++++++++++++++--------- swagger/v1/swagger.yaml | 52 ++++++++++++++++++++++++++--- 2 files changed, 79 insertions(+), 20 deletions(-) diff --git a/spec/requests/api/v1/duties_spec.rb b/spec/requests/api/v1/duties_spec.rb index 4bfd2b78..fa698052 100644 --- a/spec/requests/api/v1/duties_spec.rb +++ b/spec/requests/api/v1/duties_spec.rb @@ -5,6 +5,7 @@ path '/api/v1/duties' do get('list duties') do + tags 'Duties' response(200, 'successful') do after do |example| @@ -19,8 +20,21 @@ end post('create duty') do - response(200, 'successful') do + tags 'Duties' + description 'Create a new duty' + consumes 'application/json' + produces 'application/json' + parameter name: :duty, in: :body, schema: { + type: :object, + properties: { + name: { type: :string }, + max_members_for_duty: { type: :integer }, + assignment_id: { type: :integer } + }, + required: [ 'name', 'max_members_for_duty', 'assignment_id'] + } + response(200, 'successful') do after do |example| example.metadata[:response][:content] = { 'application/json' => { @@ -38,6 +52,7 @@ parameter name: 'id', in: :path, type: :string, description: 'id' get('show duty') do + tags 'Duties' response(200, 'successful') do let(:id) { '123' } @@ -53,23 +68,23 @@ end patch('update duty') do - response(200, 'successful') do - let(:id) { '123' } - - after do |example| - example.metadata[:response][:content] = { - 'application/json' => { - example: JSON.parse(response.body, symbolize_names: true) - } - } - end - run_test! - end - end + tags 'Duties' + description 'Update a duty' + consumes 'application/json' + produces 'application/json' + parameter name: :id, in: :path, type: :string + parameter name: :duty, in: :body, schema: { + type: :object, + properties: { + name: { type: :string }, + max_members_for_duty: { type: :integer }, + assignment_id: { type: :integer } + } + } - put('update duty') do response(200, 'successful') do let(:id) { '123' } + let(:duty) { { name: 'Updated Duty Name', max_members_for_duty: 2, assignment_id: 456 } } after do |example| example.metadata[:response][:content] = { @@ -78,11 +93,13 @@ } } end + run_test! end end delete('delete duty') do + tags 'Duties' response(200, 'successful') do let(:id) { '123' } diff --git a/swagger/v1/swagger.yaml b/swagger/v1/swagger.yaml index 7855e031..ca88de0f 100644 --- a/swagger/v1/swagger.yaml +++ b/swagger/v1/swagger.yaml @@ -83,14 +83,36 @@ paths: "/api/v1/duties": get: summary: list duties + tags: + - Duties responses: '200': description: successful post: summary: create duty + tags: + - Duties + description: Create a new duty + parameters: [] responses: '200': description: successful + requestBody: + content: + application/json: + schema: + type: object + properties: + name: + type: string + max_members_for_duty: + type: integer + assignment_id: + type: integer + required: + - name + - max_members_for_duty + - assignment_id "/api/v1/duties/{id}": parameters: - name: id @@ -101,21 +123,41 @@ paths: type: string get: summary: show duty + tags: + - Duties responses: '200': description: successful patch: summary: update duty + tags: + - Duties + description: Update a duty + parameters: + - name: id + in: path + required: true + schema: + type: string responses: '200': description: successful - put: - summary: update duty - responses: - '200': - description: successful + requestBody: + content: + application/json: + schema: + type: object + properties: + name: + type: string + max_members_for_duty: + type: integer + assignment_id: + type: integer delete: summary: delete duty + tags: + - Duties responses: '200': description: successful From 11f81b380e29a9411e7aee5ece3bb7250b90808a Mon Sep 17 00:00:00 2001 From: sankettangade Date: Fri, 28 Apr 2023 19:42:35 -0400 Subject: [PATCH 26/27] Minor code changes --- app/models/badge.rb | 8 -------- 1 file changed, 8 deletions(-) diff --git a/app/models/badge.rb b/app/models/badge.rb index 2bca7c61..6c71a03e 100644 --- a/app/models/badge.rb +++ b/app/models/badge.rb @@ -1,13 +1,5 @@ class Badge < ApplicationRecord - def self.get_id_from_name(badge_name) - Badge.find_by(name: badge_name)&.id - end - - def self.get_image_name_from_name(badge_name) - Badge.find_by(name: badge_name)&.image_name - end - def self.upload_image(image_file) return '' unless image_file From da26cd92db719c673454656dda4b00f0d36d1889 Mon Sep 17 00:00:00 2001 From: Kunal Govind Patil Date: Fri, 28 Apr 2023 20:27:26 -0400 Subject: [PATCH 27/27] Minor changes added --- app/controllers/api/v1/duties_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/api/v1/duties_controller.rb b/app/controllers/api/v1/duties_controller.rb index faa6856b..3329e5a2 100644 --- a/app/controllers/api/v1/duties_controller.rb +++ b/app/controllers/api/v1/duties_controller.rb @@ -41,7 +41,7 @@ def update def destroy @duty.destroy - head :no_content + render json: { message: "Duty was successfully destroyed." }, status: :ok end private