Merge pull request #3096 from AndrewKvalheim/api-urls

Add URLs to API responses
This commit is contained in:
Henne Vogelsang 2023-04-19 13:26:44 +02:00 committed by GitHub
commit 04b45adbe5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 48 additions and 8 deletions

View file

@ -2,7 +2,9 @@
class ConferenceSerializer < ActiveModel::Serializer class ConferenceSerializer < ActiveModel::Serializer
include ApplicationHelper include ApplicationHelper
attributes :short_title, :title, :description, :start_date, :end_date, :picture_url, include Rails.application.routes.url_helpers
attributes :short_title, :url, :title, :description, :start_date, :end_date, :picture_url,
:difficulty_levels, :event_types, :rooms, :tracks, :difficulty_levels, :event_types, :rooms, :tracks,
:date_range, :revision :date_range, :revision
@ -56,6 +58,10 @@ class ConferenceSerializer < ActiveModel::Serializer
end end
end end
def url
url_for(object)
end
def revision def revision
object.revision || 0 object.revision || 0
end end

View file

@ -2,8 +2,13 @@
class EventSerializer < ActiveModel::Serializer class EventSerializer < ActiveModel::Serializer
include ActionView::Helpers::TextHelper include ActionView::Helpers::TextHelper
include Rails.application.routes.url_helpers
attributes :guid, :title, :length, :scheduled_date, :language, :abstract, :speaker_ids, :type, :room, :track attributes :guid, :url, :title, :length, :scheduled_date, :language, :abstract, :speaker_ids, :type, :room, :track
def url
conference_program_proposal_url(object.conference.short_title, object.id)
end
def scheduled_date def scheduled_date
t = object.time t = object.time

View file

@ -2,8 +2,13 @@
class SpeakerSerializer < ActiveModel::Serializer class SpeakerSerializer < ActiveModel::Serializer
include ActionView::Helpers::TextHelper include ActionView::Helpers::TextHelper
include Rails.application.routes.url_helpers
attributes :name, :affiliation, :biography attributes :url, :name, :affiliation, :biography
delegate :name, to: :object delegate :name, to: :object
def url
url_for(object)
end
end end

View file

@ -54,8 +54,10 @@ Rails.application.configure do
# Annotate rendered view with file names. # Annotate rendered view with file names.
# config.action_view.annotate_rendered_view_with_filenames = true # config.action_view.annotate_rendered_view_with_filenames = true
# Set the detault url for action mailer # Provide a default host for URLs
config.action_mailer.default_url_options = { host: ENV.fetch('OSEM_HOSTNAME', 'localhost:3000') } Rails.application.routes.default_url_options[:host] = ENV.fetch('OSEM_HOSTNAME', 'localhost:3000')
config.action_controller.default_url_options = Rails.application.routes.default_url_options
config.action_mailer.default_url_options = Rails.application.routes.default_url_options
# Access all mails sent at http://localhost:3000/letter_opener # Access all mails sent at http://localhost:3000/letter_opener
config.action_mailer.delivery_method = :letter_opener config.action_mailer.delivery_method = :letter_opener

View file

@ -89,7 +89,12 @@ Rails.application.configure do
config.logger = ActiveSupport::TaggedLogging.new(logger) config.logger = ActiveSupport::TaggedLogging.new(logger)
end end
config.action_mailer.default_url_options = { host: ENV.fetch('OSEM_HOSTNAME', 'localhost:3000') } # Provide a default host for URLs
Rails.application.routes.default_url_options[:host] = ENV.fetch('OSEM_HOSTNAME', 'localhost:3000')
config.action_controller.default_url_options = Rails.application.routes.default_url_options
config.action_mailer.default_url_options = Rails.application.routes.default_url_options
# Configure outgoing mail
config.action_mailer.smtp_settings = { config.action_mailer.smtp_settings = {
address: ENV.fetch('OSEM_SMTP_ADDRESS', 'localhost'), address: ENV.fetch('OSEM_SMTP_ADDRESS', 'localhost'),
port: ENV.fetch('OSEM_SMTP_PORT', 25), port: ENV.fetch('OSEM_SMTP_PORT', 25),

View file

@ -43,8 +43,12 @@ Rails.application.configure do
# Tell Active Support which deprecation messages to disallow. # Tell Active Support which deprecation messages to disallow.
config.active_support.disallowed_deprecation_warnings = [] config.active_support.disallowed_deprecation_warnings = []
# Set the detault url for action mailer # Provide a default host for URLs
config.action_mailer.default_url_options = { host: 'localhost:3000' } Rails.application.routes.default_url_options[:host] = 'localhost:3000'
config.action_controller.default_url_options = Rails.application.routes.default_url_options
config.action_mailer.default_url_options = Rails.application.routes.default_url_options
# Configure outgoing mail
config.action_mailer.delivery_method = :test config.action_mailer.delivery_method = :test
config.after_initialize do config.after_initialize do

View file

@ -9,6 +9,7 @@ describe EventSerializer, type: :serializer do
it 'sets guid, title, length, abstract and type' do it 'sets guid, title, length, abstract and type' do
expected_json = { expected_json = {
guid: event.guid, guid: event.guid,
url: "http://localhost:3000/conferences/#{event.conference.short_title}/program/proposals/#{event.id}",
title: 'Some Talk', title: 'Some Talk',
length: 30, length: 30,
scheduled_date: '', scheduled_date: '',
@ -39,6 +40,7 @@ describe EventSerializer, type: :serializer do
it 'sets guid, title, length, abstract, type, date, language, speakers, room and track' do it 'sets guid, title, length, abstract, type, date, language, speakers, room and track' do
expected_json = { expected_json = {
guid: event.guid, guid: event.guid,
url: "http://localhost:3000/conferences/#{event.conference.short_title}/program/proposals/#{event.id}",
title: 'Some Talk', title: 'Some Talk',
length: 30, length: 30,
scheduled_date: ' 2014-03-04T09:00:00+0000 ', scheduled_date: ' 2014-03-04T09:00:00+0000 ',

View file

@ -8,6 +8,7 @@ describe SpeakerSerializer, type: :serializer do
context 'speaker does not have biography' do context 'speaker does not have biography' do
it 'sets name and affiliation' do it 'sets name and affiliation' do
expected_json = { expected_json = {
url: "http://localhost:3000/users/#{speaker.id}",
name: 'John Doe', name: 'John Doe',
affiliation: 'JohnDoesInc', affiliation: 'JohnDoesInc',
biography: nil biography: nil
@ -22,6 +23,7 @@ describe SpeakerSerializer, type: :serializer do
it 'sets name, affiliation and biography' do it 'sets name, affiliation and biography' do
expected_json = { expected_json = {
url: "http://localhost:3000/users/#{speaker.id}",
name: 'John Doe', name: 'John Doe',
affiliation: 'JohnDoesInc', affiliation: 'JohnDoesInc',
biography: 'Doest of all Jon Does' biography: 'Doest of all Jon Does'

View file

@ -117,6 +117,11 @@ RSpec.configure do |config|
# end # end
# end # end
# Expect configured host instead of `test.host` (see https://stackoverflow.com/q/15414847)
config.before(:each, type: :controller) do
@request.host = Rails.application.routes.default_url_options[:host]
end
# use the config to use # use the config to use
# t('some.locale.key') instead of always having to type I18n.t # t('some.locale.key') instead of always having to type I18n.t
config.include AbstractController::Translation config.include AbstractController::Translation

View file

@ -3,6 +3,7 @@
"type" : "object", "type" : "object",
"required" : [ "required" : [
"short_title", "short_title",
"url",
"title", "title",
"description", "description",
"start_date", "start_date",
@ -19,6 +20,9 @@
"short_title": { "short_title": {
"type": "string" "type": "string"
}, },
"url": {
"type": "string"
},
"title": { "title": {
"type": "string" "type": "string"
}, },