Implement favoriting of courses

This commit is contained in:
Tobias Eidelpes 2020-05-21 13:31:54 +02:00
parent a43c2b8edb
commit b8cc0d5b61
6 changed files with 67 additions and 1 deletions

View File

@ -40,6 +40,27 @@ class Crawlers::CoursesCrawlerController < Crawlers::TissCrawlerController
end
def add_to_fav
params[:api] = '/api/course/'
regex = params[:detail_url].match(/courseNr=(?<number>\S{6})/)
params[:number] = regex[:number]
regex = params[:detail_url].match(/semester=(?<semester>\d{4}[SW])/)
params[:semester] = regex[:semester]
@course = TissCrawler.get_course_details(params)
# create stores the object to the db after creation
favorite_hash = {number: @course['courseNumber'],
semester: @course['semesterCode'],
title: @course['title']['de'],
# the user who is currently active
user_id: current_user.id}
if FavoriteCourse.create(favorite_hash).valid?
FavoriteCourse.create(favorite_hash)
flash[:alert] = 'Course added to your favorites!'
else
flash[:alert] = 'Course is already favorited!'
end
redirect_back(fallback_location: search)
end
end

View File

@ -0,0 +1,4 @@
class FavoriteCourse < ApplicationRecord
validates :title, :semester, :number, presence: true
validates :semester, :number, uniqueness: {scope: [:semester, :number]}
end

View File

@ -0,0 +1,13 @@
class CreateFavoriteCourses < ActiveRecord::Migration[6.0]
def change
create_table :favorite_courses do |t|
t.string :number, null: false
t.string :semester, null: false
t.string :title, null: false
t.integer :user_id, null: false
t.timestamps
end
add_index :favorite_courses, [:number, :semester], unique: true
end
end

View File

@ -10,7 +10,17 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 2020_04_21_152314) do
ActiveRecord::Schema.define(version: 2020_05_21_091231) do
create_table "favorite_courses", force: :cascade do |t|
t.string "number", null: false
t.string "semester", null: false
t.string "title", null: false
t.integer "user_id", null: false
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.index ["number", "semester"], name: "index_favorite_courses_on_number_and_semester", unique: true
end
create_table "favorite_people", id: false, force: :cascade do |t|
t.integer "tiss_id", null: false

11
test/fixtures/favorite_courses.yml vendored Normal file
View File

@ -0,0 +1,11 @@
# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
# This model initially had no columns defined. If you add columns to the
# model remove the '{}' from the fixture names and add the columns immediately
# below each fixture, per the syntax in the comments below
#
one: {}
# column: value
#
two: {}
# column: value

View File

@ -0,0 +1,7 @@
require 'test_helper'
class FavoriteCourseTest < ActiveSupport::TestCase
# test "the truth" do
# assert true
# end
end