Skip to content

868 add school email domain api#878

Draft
PetarSimonovic wants to merge 2 commits into
mainfrom
868-add-school-email-domain-api
Draft

868 add school email domain api#878
PetarSimonovic wants to merge 2 commits into
mainfrom
868-add-school-email-domain-api

Conversation

@PetarSimonovic

@PetarSimonovic PetarSimonovic commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

Status

Description

A REST API that allows school owners and teachers to create and list SchoolEmailDomains.

  • Owners and teachers can list/create; students and users from other schools cannot
  • Domains are validated (FQDN format, URI, registrable public suffix) with translated error messages
  • New domains are synced to Profile; the DB transaction rolls back if Profile sync fails
  • Delete is out of scope for this PR

What's changed?

  • GET /api/schools/:school_id/school_email_domains — list domains
  • POST /api/schools/:school_id/school_email_domains — create a domain
  • Added concept with Profile sync + rollback on failure
  • Validation with translated error messages
  • Specs at validator, model, concept, and feature levels

@PetarSimonovic PetarSimonovic linked an issue Jun 17, 2026 that may be closed by this pull request
@cla-bot cla-bot Bot added the cla-signed label Jun 17, 2026
@PetarSimonovic PetarSimonovic force-pushed the 868-add-school-email-domain-api branch from b46e372 to 4ea2fbf Compare June 17, 2026 08:26
@PetarSimonovic PetarSimonovic requested a review from Copilot June 17, 2026 08:26
Comment thread lib/concepts/school_email_domain/operations/create.rb Fixed
Comment thread lib/concepts/school_email_domain/operations/create.rb Fixed
response
rescue StandardError => e
Sentry.capture_exception(e) # Send unexpected/Profile errors to Sentry
response[:error] = e.message

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think if OperationResponse.new fails, response will be nil anyway.

@github-actions

github-actions Bot commented Jun 17, 2026

Copy link
Copy Markdown

Test coverage

91.79% line coverage reported by SimpleCov.
Run: https://github.com/RaspberryPiFoundation/editor-api/actions/runs/27683877786

@PetarSimonovic PetarSimonovic force-pushed the 868-add-school-email-domain-api branch from 4ea2fbf to 3159b2a Compare June 17, 2026 08:29

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a REST API for managing a school’s allowed student email domains, intended for use by authorised school owners/teachers and kept in sync with the Profile service.

Changes:

  • Introduces GET /api/schools/:school_id/school_email_domains (list) and POST /api/schools/:school_id/school_email_domains (create) endpoints.
  • Adds a SchoolEmailDomain::Create concept that persists the domain and syncs the school’s full domain list to Profile (rolling back on sync failure).
  • Extends authorisation and i18n error messages, plus adds factories and request/unit specs.

Reviewed changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
spec/support/profile_api_mock.rb Adds a stub helper for Profile “update school email domains” calls in specs.
spec/features/school_email_domain/listing_school_email_domains_spec.rb Request specs for listing domains with auth/unauth coverage.
spec/features/school_email_domain/creating_school_email_domains_spec.rb Request specs for creating domains, validation errors, and Profile failure handling.
spec/factories/school_email_domain.rb Factory for SchoolEmailDomain.
spec/concepts/school_email_domain/create_spec.rb Unit coverage for the SchoolEmailDomain::Create concept.
lib/concepts/school_email_domain/operations/create.rb Implements the create + Profile sync operation with rollback on failure.
config/routes.rb Wires nested school email domain routes under schools.
config/locales/en.yml Adds translated validation messages for domain validation error codes.
app/models/ability.rb Grants school owners/teachers ability to read/create school email domains.
app/controllers/api/school_email_domains_controller.rb Adds the API controller for index/create with CanCan authorisation.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread lib/concepts/school_email_domain/operations/create.rb
Comment thread lib/concepts/school_email_domain/operations/create.rb Outdated
Comment thread lib/concepts/school_email_domain/operations/create.rb
Add SchoolEmailDomainsController and school_email_domains route.
Return a list of domain strings.
Update CanCan ability to allow access only for teachers and owners.

Co-authored-by: Cursor <cursoragent@cursor.com>
@PetarSimonovic PetarSimonovic force-pushed the 868-add-school-email-domain-api branch from 3159b2a to 1ef1f88 Compare June 17, 2026 09:54
@PetarSimonovic PetarSimonovic temporarily deployed to editor-api-p-868-add-sc-u3xxpf June 17, 2026 09:54 Inactive
end
response
rescue ActiveRecord::RecordInvalid => e
record = response[:school_email_domain] || e.record
response
rescue ActiveRecord::RecordInvalid => e
record = response[:school_email_domain] || e.record
response[:error] = record.errors.full_messages.join(', ')
response[:error] = record.errors.full_messages.join(', ')
response
rescue ActiveRecord::RecordNotUnique
record = response[:school_email_domain]
rescue ActiveRecord::RecordNotUnique
record = response[:school_email_domain]
record.errors.add(:domain, :taken)
response[:error] = record.errors.full_messages.join(', ')
Add POST create to SchoolEmailDomainsController and route.
Add SchoolEmailDomain::Create concept to persist domains and sync the full list with Profile.
@PetarSimonovic PetarSimonovic force-pushed the 868-add-school-email-domain-api branch from 1ef1f88 to 511affb Compare June 17, 2026 10:54
@PetarSimonovic PetarSimonovic temporarily deployed to editor-api-p-868-add-sc-u3xxpf June 17, 2026 10:54 Inactive
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add school email domain API

2 participants