From cb1b163b3077c6559696be154e9376c998b65170 Mon Sep 17 00:00:00 2001 From: Sebastian Serth Date: Tue, 20 Sep 2022 16:21:49 +0200 Subject: [PATCH] Always create a default study group for new consumers --- app/models/consumer.rb | 7 +++++++ app/policies/study_group_policy.rb | 9 ++++++++- spec/models/consumer_spec.rb | 5 +++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/app/models/consumer.rb b/app/models/consumer.rb index 567d2217..9f8e7670 100644 --- a/app/models/consumer.rb +++ b/app/models/consumer.rb @@ -12,6 +12,13 @@ class Consumer < ApplicationRecord validates :oauth_key, presence: true, uniqueness: true validates :oauth_secret, presence: true + after_create :generate_internal_study_group + + def generate_internal_study_group + StudyGroup.create!(consumer: self, name: "Default Study Group for #{name}", external_id: nil) + end + private :generate_internal_study_group + def to_s name end diff --git a/app/policies/study_group_policy.rb b/app/policies/study_group_policy.rb index 3e62034b..53a3f356 100644 --- a/app/policies/study_group_policy.rb +++ b/app/policies/study_group_policy.rb @@ -5,10 +5,17 @@ class StudyGroupPolicy < AdminOnlyPolicy admin? || teacher? end - %i[show? destroy? edit? update? stream_la?].each do |action| + %i[show? edit? update? stream_la?].each do |action| define_method(action) { admin? || (@user.teacher? && @record.present? && @user.study_groups.exists?(@record.id)) } end + def destroy? + # A default study group should not get deleted without the consumer + return no_one if @record.external_id.blank? + + admin? || teacher_in_study_group? + end + class Scope < Scope def resolve if @user.admin? diff --git a/spec/models/consumer_spec.rb b/spec/models/consumer_spec.rb index bdda9fb1..6af71380 100644 --- a/spec/models/consumer_spec.rb +++ b/spec/models/consumer_spec.rb @@ -4,6 +4,7 @@ require 'rails_helper' describe Consumer do let(:consumer) { described_class.create } + let(:valid_consumer) { create(:consumer) } it 'validates the presence of a name' do expect(consumer.errors[:name]).to be_present @@ -21,4 +22,8 @@ describe Consumer do it 'validates the presence of an OAuth secret' do expect(consumer.errors[:oauth_secret]).to be_present end + + it 'creates a study group after creation' do + expect(valid_consumer.study_groups.count).to eq 1 + end end