Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 23 additions & 3 deletions app/controllers/courses_controller.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
class CoursesController < ApplicationController
before_action :set_course, only: %i[ show edit update destroy ]
before_action :set_course, only: %i[ show edit update destroy approve unapprove ]

# GET /courses or /courses.json
def index
Expand All @@ -23,7 +23,7 @@ def index
# end

@ransack_path = courses_path
@ransack_courses = Course.ransack(params[:courses_search], search_key: :courses_search)
@ransack_courses = Course.published.approved.ransack(params[:courses_search], search_key: :courses_search)
# @courses = @ransack_courses.result.includes(:user)
@pagy, @courses = pagy(@ransack_courses.result.includes(:user))
end
Expand Down Expand Up @@ -62,6 +62,18 @@ def create
end
end

def approve
authorize @course, :approve?
@course.update_attribute(:approved, true)
redirect_to @course, notice: "Course approved and visible!"
end

def unapprove
authorize @course, :approve?
@course.update_attribute(:approved, false)
redirect_to @course, notice: "Course unapproved and hidden!"
end

# PATCH/PUT /courses/1 or /courses/1.json
def update
authorize @course
Expand Down Expand Up @@ -97,6 +109,14 @@ def created
render "index"
end

def unapproved
@ransack_path = unapproved_courses_path
@ransack_courses = Course.unapproved.ransack(params[:courses_search], search_key: :courses_search)
@pagy, @courses = pagy(@ransack_courses.result.includes(:user))
render "index"
end


def destroy
authorize @course
if @course.destroy
Expand All @@ -115,6 +135,6 @@ def set_course
end

def course_params
params.require(:course).permit(:title, :description, :short_description, :price, :language, :level)
params.require(:course).permit(:title, :description, :short_description, :price, :published, :language, :level)
end
end
4 changes: 4 additions & 0 deletions app/models/course.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@
scope :latest, -> { limit(4).order(created_at: :desc) }
scope :top_rated, -> { limit(4).order(average_rating: :desc, created_at: :desc) }
scope :popular, -> { limit(4).order(enrollments_count: :desc, created_at: :desc) }
scope :published, -> { where(published: true) }
scope :unpublished, -> {where(published: false) }

Check failure on line 12 in app/models/course.rb

View workflow job for this annotation

GitHub Actions / lint

Layout/SpaceInsideBlockBraces: Space missing inside {.
scope :approved, -> { where(approved: true) }
scope :unapproved, -> { where(approved: false) }

has_many :lessons, dependent: :destroy
has_many :enrollments, dependent: :restrict_with_error
Expand Down
8 changes: 6 additions & 2 deletions app/policies/course_policy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@ class Scope < ApplicationPolicy::Scope
end

def edit?
@user.has_role?(:admin) or @record.user == @user
@record.user == @user
end

def update?
@user.has_role?(:admin) or @record.user == @user
@record.user == @user
end

def new?
Expand All @@ -32,6 +32,10 @@ def destroy?
@user.has_role?(:admin) or @record.user == @user
end

def approve?
@user.has_role?(:admin)
end

def owner?
@record.user == @user
end
Expand Down
31 changes: 24 additions & 7 deletions app/views/courses/_course.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,27 @@
-# .text-end
-# .fa.fa-chalkboard-teacher
-# = link_to course.user.username, user_path(course.user)
- if current_user && policy(course).edit?
.card-footer
-if policy(course).owner?
= link_to "Add lesson", new_course_lesson_path(course, @lesson), class: "btn btn-sm btn-primary"
= link_to 'Edit', edit_course_path(course), class: 'btn btn-sm btn-warning'
-# - if current_user && policy(course).destroy?
= link_to 'Destroy', course, data: { turbo_method: :delete, confirm: 'Are you sure?' }, class: 'btn btn-sm btn-danger'
- if current_user
- if policy(course).edit?
.card-footer
- if policy(course).owner?
= link_to "Add lesson", new_course_lesson_path(course, @lesson), class: "btn btn-sm btn-primary"
= link_to 'Edit', edit_course_path(course), class: 'btn btn-sm btn-warning'
-# - if current_user && policy(course).destroy?
= link_to 'Destroy', course, data: { turbo_method: :delete, confirm: 'Are you sure?' }, class: 'btn btn-sm btn-danger'
- if policy(course).destroy?
.card-footer
- if course.published?
.badge.bg-success published
- else
.badge.bg-danger unpublished
- if course.approved?
.badge.bg-success approved
- else
.badge.bg-danger unapproved
- if policy(course).approve?
.card-footer
- if course.approved?
= link_to "unapprove", unapprove_course_path(course), data: { turbo_method: :patch }, class: 'btn btn-sm btn-danger'
- else
= link_to "approve", approve_course_path(course), data: { turbo_method: :patch }, class: 'btn btn-sm btn-success'
1 change: 1 addition & 0 deletions app/views/courses/_form.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
= f.input :language, collection: Course.languages, include_blank: true
= f.input :level, collection: Course.levels, include_blank: true
= f.input :price
= f.input :published

.form-actions
= f.button :submit, class: "btn-success"
5 changes: 5 additions & 0 deletions app/views/layouts/_header.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,11 @@
Users
.badge.bg-danger
= User.count
= link_to unapproved_courses_path, class: "dropdown-item" do
.fa.fa-graduation-cap
Unapproved Courses
.badge.bg-danger
= Course.unapproved.count
= link_to enrollments_path, class: "dropdown-item" do
.fa.fa-lock-open
Enrollments
Expand Down
6 changes: 5 additions & 1 deletion config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,11 @@
end

resources :courses do
get :purchased, :pending_review, :created, on: :collection
get :purchased, :pending_review, :created, :unapproved, on: :collection
member do
patch :approve
patch :unapprove
end
resources :lessons
resources :enrollments, only: [ :new, :create ]
end
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
class AddPublishedAndApprovedToCourses < ActiveRecord::Migration[7.2]
def change
add_column :courses, :published, :boolean, default: false
add_column :courses, :approved, :boolean, default: false
end
end
4 changes: 3 additions & 1 deletion db/schema.rb

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading