You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
3.8 KiB
118 lines
3.8 KiB
user = @user
|
|
split_list = lambda do |value|
|
|
value.to_s.split(/[;,]/).map { |item| item.strip }.reject(&:blank?)
|
|
end
|
|
|
|
parse_period = lambda do |period|
|
|
years = period.to_s.scan(/\b(19\d{2}|20\d{2})\b/).flatten
|
|
return [nil, nil] if years.empty?
|
|
[years[0], years[1]]
|
|
end
|
|
|
|
normalize_url = lambda do |value|
|
|
return nil if value.blank?
|
|
value.match?(/\Ahttps?:\/\//) ? value : "https://#{value}"
|
|
end
|
|
|
|
profile_from = lambda do |value, network, base_url|
|
|
return nil if value.blank?
|
|
|
|
if value.include?("/") || value.include?(".")
|
|
url = normalize_url.call(value)
|
|
username = url.to_s.split("/").last&.delete_prefix("@")
|
|
else
|
|
username = value.delete_prefix("@")
|
|
url = base_url.present? ? "#{base_url}/#{username}" : nil
|
|
end
|
|
|
|
profile = { "network" => network }
|
|
profile["username"] = username if username.present?
|
|
profile["url"] = url if url.present?
|
|
profile
|
|
end
|
|
|
|
json.basics do
|
|
json.name user.name if user.name.present?
|
|
json.label user.title if user.title.present?
|
|
json.email user.email if user.email.present?
|
|
json.phone user.phone if user.phone.present?
|
|
json.summary user.objective if user.objective.present?
|
|
|
|
if user.address.present?
|
|
json.location do
|
|
json.address user.address
|
|
end
|
|
end
|
|
|
|
primary_url = user.other_page_url.presence || user.linkedin.presence || user.github.presence
|
|
url = normalize_url.call(primary_url)
|
|
json.url url if url.present?
|
|
|
|
profiles = []
|
|
profiles << profile_from.call(user.linkedin, "LinkedIn", "https://www.linkedin.com/in")
|
|
profiles << profile_from.call(user.github, "GitHub", "https://github.com")
|
|
profiles << profile_from.call(user.other_page_url, "Website", nil)
|
|
profiles.compact!
|
|
json.profiles profiles if profiles.any?
|
|
end
|
|
|
|
if user.work_experiences.active.any?
|
|
json.work user.work_experiences.active do |work_entry|
|
|
start_date, end_date = parse_period.call(work_entry.period)
|
|
highlights = split_list.call(work_entry.items_csv)
|
|
technologies = split_list.call(work_entry.technologies)
|
|
highlights << "Technologies: #{technologies.join(', ')}" if technologies.any?
|
|
|
|
summary = work_entry.achivements.presence
|
|
summary = work_entry.period.presence if summary.blank? && start_date.blank? && end_date.blank?
|
|
|
|
json.name work_entry.employer if work_entry.employer.present?
|
|
json.position work_entry.title if work_entry.title.present?
|
|
json.summary summary if summary.present?
|
|
json.highlights highlights if highlights.any?
|
|
json.startDate start_date if start_date.present?
|
|
json.endDate end_date if end_date.present?
|
|
|
|
if start_date.blank? && end_date.blank? && work_entry.reference_date.present?
|
|
json.endDate work_entry.reference_date.iso8601
|
|
end
|
|
end
|
|
end
|
|
|
|
if user.education_entries.active.any?
|
|
json.education user.education_entries.active do |education_entry|
|
|
start_date, end_date = parse_period.call(education_entry.period)
|
|
|
|
study_type = education_entry.title
|
|
area = nil
|
|
if study_type.present? && study_type.match?(/\s+in\s+/i)
|
|
study_type, area = study_type.split(/\s+in\s+/i, 2)
|
|
end
|
|
|
|
courses = split_list.call(education_entry.items_csv)
|
|
|
|
json.institution education_entry.institution if education_entry.institution.present?
|
|
json.studyType study_type if study_type.present?
|
|
json.area area if area.present?
|
|
json.courses courses if courses.any?
|
|
json.startDate start_date if start_date.present?
|
|
json.endDate end_date if end_date.present?
|
|
|
|
if start_date.blank? && end_date.blank? && education_entry.reference_date.present?
|
|
json.endDate education_entry.reference_date.iso8601
|
|
end
|
|
end
|
|
end
|
|
|
|
if user.skills.active.any?
|
|
json.skills user.skills.active do |skill|
|
|
keywords = split_list.call(skill.detail)
|
|
|
|
json.name skill.title if skill.title.present?
|
|
if keywords.any?
|
|
json.keywords keywords
|
|
elsif skill.detail.present?
|
|
json.level skill.detail
|
|
end
|
|
end
|
|
end
|
|
|