Skip to content

Commit 98885af

Browse files
authored
Merge branch 'main' into expand-profile-api-client
2 parents ff7252d + df4557a commit 98885af

File tree

5 files changed

+53
-5
lines changed

5 files changed

+53
-5
lines changed

app/graphql/types/query_type.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class QueryType < Types::BaseObject
1515
description: 'List of preferred project locales, defaults to ["en"]'
1616
end
1717

18-
field :projects, Types::ProjectType.connection_type, 'All viewable projects' do
18+
field :projects, Types::ProjectType.connection_type, 'All viewable personal projects' do
1919
argument :user_id, String, required: false, description: 'Filter by user ID'
2020
end
2121

@@ -26,7 +26,7 @@ def project(identifier:, preferred_locales: ['en'])
2626

2727
def projects(user_id: nil)
2828
results = Project.accessible_by(context[:current_ability], :show).order(updated_at: :desc)
29-
results = results.where(user_id:) if user_id
29+
results = results.where(user_id:, school_id: nil, lesson_id: nil) if user_id
3030

3131
results
3232
end

app/models/ability.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ def initialize(user)
5050
def define_school_owner_abilities(school:)
5151
can(%i[read update destroy], School, id: school.id)
5252
can(%i[read create update destroy], SchoolClass, school: { id: school.id })
53+
can(%i[read], Project, school_id: school.id, lesson: { visibility: %w[teachers students] })
5354
can(%i[read create destroy], ClassMember, school_class: { school: { id: school.id } })
5455
can(%i[read create destroy], :school_owner)
5556
can(%i[read create destroy], :school_teacher)
@@ -64,6 +65,7 @@ def define_school_teacher_abilities(user:, school:)
6465
can(%i[read], School, id: school.id)
6566
can(%i[create], SchoolClass, school: { id: school.id })
6667
can(%i[read update destroy], SchoolClass, school: { id: school.id }, teacher_id: user.id)
68+
can(%i[read], Project, school_id: school.id, lesson: { visibility: %w[teachers students] })
6769
can(%i[read create destroy], ClassMember, school_class: { school: { id: school.id }, teacher_id: user.id })
6870
can(%i[read], :school_owner)
6971
can(%i[read], :school_teacher)

db/schema.graphql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,7 @@ type Query {
567567
): Project
568568

569569
"""
570-
All viewable projects
570+
All viewable personal projects
571571
"""
572572
projects(
573573
"""

spec/graphql/queries/projects_query_spec.rb

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,13 +85,14 @@
8585
context 'when fetching projects by user ID when logged in' do
8686
let(:query) { 'query ($userId: String) { projects(userId: $userId) { edges { node { id } } } }' }
8787
let(:current_user) { authenticated_user }
88+
let(:teacher) { create(:teacher, school:) }
8889
let(:variables) { { userId: authenticated_user.id } }
8990
let(:project) { create(:project, user_id: authenticated_user.id) }
9091
let(:school) { create(:school) }
91-
let(:owner) { create(:owner, school:) }
92+
let(:lesson) { create(:lesson, user_id: teacher.id, school:) }
9293

9394
before do
94-
authenticated_in_hydra_as(owner)
95+
authenticated_in_hydra_as(teacher)
9596
end
9697

9798
it { expect(query).to be_a_valid_graphql_query }
@@ -103,6 +104,24 @@
103104
end
104105
end
105106

107+
context 'with an existing project owned by the user that belongs to a school' do
108+
let(:project) { create(:project, user_id: teacher.id, school:) }
109+
110+
it 'returns an empty array' do
111+
project
112+
expect(result.dig('data', 'projects', 'edges')).to be_empty
113+
end
114+
end
115+
116+
context 'with an existing project owned by the user that belongs to a lesson' do
117+
let(:project) { create(:project, user_id: teacher.id, lesson:) }
118+
119+
it 'returns an empty array' do
120+
project
121+
expect(result.dig('data', 'projects', 'edges')).to be_empty
122+
end
123+
end
124+
106125
context 'with an existing unowned project' do
107126
let(:project) { create(:project, user_id: nil) }
108127

spec/models/ability_spec.rb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,33 @@
5757
it { is_expected.not_to be_able_to(:destroy, another_project) }
5858
end
5959
end
60+
61+
context 'when the project belongs to a school and the associated lesson is not private' do
62+
let(:user) { build(:user) }
63+
let(:school) { build(:school) }
64+
let(:lesson) { build(:lesson, school:, visibility: 'teachers') }
65+
let(:school_project) { build(:project, school:, lesson:) }
66+
67+
context 'when user is a school owner' do
68+
before do
69+
create(:owner_role, user_id: user.id, school:)
70+
end
71+
72+
it { is_expected.to be_able_to(:read, school_project) }
73+
it { is_expected.not_to be_able_to(:update, school_project) }
74+
it { is_expected.not_to be_able_to(:destroy, school_project) }
75+
end
76+
77+
context 'when user is a school teacher' do
78+
before do
79+
create(:teacher_role, user_id: user.id, school:)
80+
end
81+
82+
it { is_expected.to be_able_to(:read, school_project) }
83+
it { is_expected.not_to be_able_to(:update, school_project) }
84+
it { is_expected.not_to be_able_to(:destroy, school_project) }
85+
end
86+
end
6087
end
6188

6289
describe 'Component' do

0 commit comments

Comments
 (0)