Skip to content

Instantly share code, notes, and snippets.

@Cristopheer96
Last active July 18, 2024 15:19
Show Gist options
  • Save Cristopheer96/7cee011eea7297d74ec2b64fb5039a01 to your computer and use it in GitHub Desktop.
Save Cristopheer96/7cee011eea7297d74ec2b64fb5039a01 to your computer and use it in GitHub Desktop.
module Subjects
class IndexCareerItemsService < ApplicationService
def initialize(user:, query:, page:, per_page:)
super()
@user = user
@page = page || Subjects::PAGE
@per_page = per_page || Subjects::PER_PAGE
@query = query
end
def call
response(success: true, payload: paginated_items)
rescue => error
response(error:)
end
private
attr_reader :user, :query, :page, :per_page
def paginated_items
service = Users::ShowSubjectsService.call(@user)
raise(service.error) unless service.success?
user_show_subjects = service.payload #esto es un boolean que nos servira como criterio de que se debe mostrar
items =
if user_show_subjects
fetch_career_subjects + fetch_interests
else
fetch_interests
end
WillPaginate::Collection.create(@page, @per_page, items.size) do |pager|
pager.replace(items.slice(pager.offset, pager.per_page))
end
end
def fetch_career_subjects
fetch_career_subjects = CareerSubject.includes(:subject).where("'documents_count > 0 and status = 'approved'")
career_id = @user&.career&.id
career_approved = @user&.career&.status == 'approved'
university_id = @user&.university&.id
university_approved = @user&.university&.status == 'approved'
order_sql = []
if university_id && university_approved
order_sql << "CASE WHEN university_id = #{university_id} THEN 0 ELSE 1 END"
end
order_sql << "CASE WHEN career_id = #{career_id} THEN 0 ELSE 1 END" if career_id && career_approved
order_sql << 'documents_count DESC'
fetch_career_subjects.order(Arel.sql(order_sql.join(',')))
fetch_career_subjects.joins(:subject).includes(:subject)
if @query
fetch_career_subjects = fetch_career_subjects.where('subjects.normalized_name % ?', @query)
.reorder(Arel.sql("subjects.normalized_name <-> #{@query}"))
end
fetch_career_subjects = fetch_career_subjects.joins(
"LEFT JOIN follow_career_subjects fc ON fc.career_subject_id = career_subjects.id AND fc.user_id = #{@user.id}"
).where(fc: { career_subject_id: nil })
end
def fetch_interests
fetch_interests = Tag.all
.where("normalized_description % #{ActiveRecord::Base.connection.quote(@query)} and documents_count > 0")
.order(Arel.sql("normalized_description <-> #{ActiveRecord::Base.connection.quote(@query)}"))
.limit(Interests::DEFAULT_LIMIT_SEARCH)
.order(documents_count: :desc)
if @user
followed_tag_ids = FollowTag.where(user_id: @user.id).pluck(:tag_id) # aqui devuelve un array de ids
fetch_interests.where.not(id: followed_tag_ids)
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment