Skip to content

Commit 960a5b2

Browse files
committed
Refactor routes, models, and integration tests and updated Rswag documentation
1 parent 697abd2 commit 960a5b2

File tree

12 files changed

+992
-68
lines changed

12 files changed

+992
-68
lines changed

app/controllers/api/v1/airlines_controller.rb

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def show
1414
render json: { message: "Airline with ID #{params[:id]} not found" }, status: :not_found
1515
end
1616
rescue Couchbase::Error::DocumentNotFound => e
17-
render json: { error: "Airline not found", message: e.message }, status: :not_found
17+
render json: { error: 'Airline not found', message: e.message }, status: :not_found
1818
rescue StandardError => e
1919
render json: { error: 'Internal server error', message: e.message }, status: :internal_server_error
2020
end
@@ -25,11 +25,12 @@ def create
2525
if @airline
2626
render json: { message: "Airline with ID #{params[:id]} already exists" }, status: :conflict
2727
else
28-
@airline = Airline.create(airline_params)
29-
if @airline
28+
@airline = Airline.new(airline_params)
29+
if @airline.save
3030
render json: @airline, status: :created
3131
else
32-
render json: { error: 'Failed to create airline' }, status: :bad_request
32+
render json: { error: 'Failed to create airline', message: @airline.errors.full_messages },
33+
status: :bad_request
3334
end
3435
end
3536
rescue ArgumentError => e
@@ -38,20 +39,15 @@ def create
3839
render json: { error: 'Internal server error', message: e.message }, status: :internal_server_error
3940
end
4041

42+
# PUT /api/v1/airlines/{id}
4143
def update
42-
if @airline
43-
if @airline.update(airline_params)
44-
render json: @airline.attributes.except('id'), status: :ok
45-
else
46-
render json: { message: 'Failed to update airline' }, status: :bad_request
47-
end
44+
@airline = Airline.new(airline_params)
45+
if @airline.save
46+
render json: @airline.attributes.except('id'), status: :ok
4847
else
49-
@airline = Airline.create(airline_params)
50-
if @airline
51-
render json: @airline.attributes.except('id'), status: :ok
52-
else
53-
render json: { message: 'Airline already exists' }, status: :conflict
54-
end
48+
render json: { error: 'Invalid request', message: @airline.errors.full_messages },
49+
status: :bad_request
50+
5551
end
5652
rescue ArgumentError => e
5753
render json: { error: 'Invalid request', message: e.message }, status: :bad_request
@@ -66,13 +62,14 @@ def destroy
6662
if @airline.destroy
6763
render json: { message: 'Airline deleted successfully' }, status: :accepted
6864
else
69-
render json: { message: 'Failed to delete airline' }, status: :bad_request
65+
render json: { error: 'Failed to delete airline', message: @airline.errors.full_messages },
66+
status: :bad_request
7067
end
7168
else
7269
render json: { message: "Airline with ID #{params[:id]} not found" }, status: :not_found
7370
end
7471
rescue Couchbase::Error::DocumentNotFound => e
75-
render json: { error: "Airline not found", message: e.message }, status: :not_found
72+
render json: { error: 'Airline not found', message: e.message }, status: :not_found
7673
rescue StandardError => e
7774
render json: { error: 'Internal server error', message: e.message }, status: :internal_server_error
7875
end

app/controllers/api/v1/airports_controller.rb

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def show
1414
render json: { message: "Airport with ID #{params[:id]} not found" }, status: :not_found
1515
end
1616
rescue Couchbase::Error::DocumentNotFound => e
17-
render json: { error: "Airport not found", message: e.message }, status: :not_found
17+
render json: { error: 'Airport not found', message: e.message }, status: :not_found
1818
rescue StandardError => e
1919
render json: { error: 'Internal server error', message: e.message }, status: :internal_server_error
2020
end
@@ -25,11 +25,12 @@ def create
2525
if @airport
2626
render json: { message: "Airport with ID #{params[:id]} already exists" }, status: :conflict
2727
else
28-
@airport = Airport.create(airport_params)
29-
if @airport
28+
@airport = Airport.new(airport_params)
29+
if @airport.save
3030
render json: @airport, status: :created
3131
else
32-
render json: { error: 'Failed to create airport' }, status: :bad_request
32+
render json: { error: 'Failed to create airport', message: @airport.errors.full_messages },
33+
status: :bad_request
3334
end
3435
end
3536
rescue ArgumentError => e
@@ -38,21 +39,14 @@ def create
3839
render json: { error: 'Internal server error', message: e.message }, status: :internal_server_error
3940
end
4041

41-
# PATCH/PUT /api/v1/airports/{id}
42+
# PUT /api/v1/airports/{id}
4243
def update
43-
if @airport
44-
if @airport.update(airport_params)
45-
render json: @airport.attributes.except('id'), status: :ok
46-
else
47-
render json: { message: 'Failed to update airport' }, status: :bad_request
48-
end
44+
@airport = Airport.new(airport_params)
45+
if @airport.save
46+
render json: @airport.attributes.except('id'), status: :ok
4947
else
50-
@airport = Airport.create(airport_params)
51-
if @airport
52-
render json: @airport.attributes.except('id'), status: :ok
53-
else
54-
render json: { message: 'Airport already exists' }, status: :conflict
55-
end
48+
render json: { error: 'Invalid request', message: @airport.errors.full_messages },
49+
status: :bad_request
5650
end
5751
rescue ArgumentError => e
5852
render json: { error: 'Invalid request', message: e.message }, status: :bad_request
@@ -67,17 +61,42 @@ def destroy
6761
if @airport.destroy
6862
render json: { message: 'Airport deleted successfully' }, status: :accepted
6963
else
70-
render json: { message: 'Failed to delete airport' }, status: :bad_request
64+
render json: { error: 'Failed to delete airport', message: @airport.errors.full_messages },
65+
status: :bad_request
7166
end
7267
else
7368
render json: { message: "Airport with ID #{params[:id]} not found" }, status: :not_found
7469
end
7570
rescue Couchbase::Error::DocumentNotFound => e
76-
render json: { error: "Airport not found", message: e.message }, status: :not_found
71+
render json: { error: 'Airport not found', message: e.message }, status: :not_found
7772
rescue StandardError => e
7873
render json: { error: 'Internal server error', message: e.message }, status: :internal_server_error
7974
end
8075

76+
# GET /api/v1/airports/list
77+
def index
78+
airports = Airport.all
79+
formatted_airports = airports.map do |airport|
80+
{
81+
id: airport.id,
82+
airportname: airport.airportname,
83+
city: airport.city,
84+
country: airport.country,
85+
faa: airport.faa,
86+
icao: airport.icao,
87+
tz: airport.tz,
88+
geo: {
89+
lat: airport.geo&.lat,
90+
lon: airport.geo&.lon,
91+
alt: airport.geo&.alt
92+
}
93+
}
94+
end
95+
render json: formatted_airports
96+
rescue StandardError => e
97+
render json: { error: e.message }, status: :internal_server_error
98+
end
99+
81100
private
82101

83102
def set_airport
@@ -87,7 +106,7 @@ def set_airport
87106
end
88107

89108
def airport_params
90-
params.require(:airport).permit(:id, :airportname, :city, :country, :faa, :icao, :tz, geo: [:lat, :lon, :alt])
109+
params.require(:airport).permit(:id, :airportname, :city, :country, :faa, :icao, :tz, geo: %i[lat lon alt])
91110
end
92111
end
93112
end

app/controllers/api/v1/routes_controller.rb

Lines changed: 44 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def show
1414
render json: { message: "Route with ID #{params[:id]} not found" }, status: :not_found
1515
end
1616
rescue Couchbase::Error::DocumentNotFound => e
17-
render json: { error: "Route not found", message: e.message }, status: :not_found
17+
render json: { error: 'Route not found', message: e.message }, status: :not_found
1818
rescue StandardError => e
1919
render json: { error: 'Internal server error', message: e.message }, status: :internal_server_error
2020
end
@@ -25,11 +25,12 @@ def create
2525
if @route
2626
render json: { message: "Route with ID #{params[:id]} already exists" }, status: :conflict
2727
else
28-
@route = Route.create(route_params)
29-
if @route
28+
@route = Route.new(route_params)
29+
if @route.save
3030
render json: @route, status: :created
3131
else
32-
render json: { error: 'Failed to create route' }, status: :bad_request
32+
render json: { error: 'Failed to create route', message: @route.errors.full_messages },
33+
status: :bad_request
3334
end
3435
end
3536
rescue ArgumentError => e
@@ -38,21 +39,14 @@ def create
3839
render json: { error: 'Internal server error', message: e.message }, status: :internal_server_error
3940
end
4041

41-
# PATCH/PUT /api/v1/routes/{id}
42+
# PUT /api/v1/routes/{id}
4243
def update
43-
if @route
44-
if @route.update(route_params)
45-
render json: @route.attributes.except('id'), status: :ok
46-
else
47-
render json: { message: 'Failed to update route' }, status: :bad_request
48-
end
44+
@route = Route.new(route_params)
45+
if @route.save
46+
render json: @route.attributes.except('id'), status: :ok
4947
else
50-
@route = Route.create(route_params)
51-
if @route
52-
render json: @route.attributes.except('id'), status: :ok
53-
else
54-
render json: { message: 'Route already exists' }, status: :conflict
55-
end
48+
render json: { error: 'Invalid request', message: @route.errors.full_messages },
49+
status: :bad_request
5650
end
5751
rescue ArgumentError => e
5852
render json: { error: 'Invalid request', message: e.message }, status: :bad_request
@@ -67,17 +61,46 @@ def destroy
6761
if @route.destroy
6862
render json: { message: 'Route deleted successfully' }, status: :accepted
6963
else
70-
render json: { message: 'Failed to delete route' }, status: :bad_request
64+
render json: { error: 'Failed to delete route', message: @route.errors.full_messages },
65+
status: :bad_request
7166
end
7267
else
7368
render json: { message: "Route with ID #{params[:id]} not found" }, status: :not_found
7469
end
7570
rescue Couchbase::Error::DocumentNotFound => e
76-
render json: { error: "Route not found", message: e.message }, status: :not_found
71+
render json: { error: 'Route not found', message: e.message }, status: :not_found
7772
rescue StandardError => e
7873
render json: { error: 'Internal server error', message: e.message }, status: :internal_server_error
7974
end
8075

76+
# GET /api/v1/routes/list
77+
def index
78+
routes = Route.all
79+
formatted_routes = routes.map do |route|
80+
{
81+
id: route.id,
82+
type: route.type,
83+
airline: route.airline,
84+
airlineid: route.airlineid,
85+
sourceairport: route.sourceairport,
86+
destinationairport: route.destinationairport,
87+
stops: route.stops,
88+
equipment: route.equipment,
89+
schedule: route.schedule.map do |schedule_detail|
90+
{
91+
day: schedule_detail.day,
92+
utc: schedule_detail.utc,
93+
flight: schedule_detail.flight
94+
}
95+
end,
96+
distance: route.distance
97+
}
98+
end
99+
render json: formatted_routes
100+
rescue StandardError => e
101+
render json: { error: e.message }, status: :internal_server_error
102+
end
103+
81104
private
82105

83106
def set_route
@@ -87,7 +110,8 @@ def set_route
87110
end
88111

89112
def route_params
90-
params.require(:route).permit(:id, :type, :airline, :airlineid, :sourceairport, :destinationairport, :stops, :equipment, :distance, schedule: [:day, :utc, :flight])
113+
params.require(:route).permit(:id, :type, :airline, :airlineid, :sourceairport, :destinationairport,
114+
:stops, :equipment, :distance, schedule: %i[day utc flight])
91115
end
92116
end
93117
end

app/models/route.rb

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ class ScheduleDetail < CouchbaseOrm::NestedDocument
99
end
1010

1111
class Route < CouchbaseOrm::Base
12-
attribute :type, :string
1312
attribute :airline, :string
1413
attribute :airlineid, :string
1514
attribute :sourceairport, :string
@@ -19,7 +18,6 @@ class Route < CouchbaseOrm::Base
1918
attribute :schedule, :array, type: ScheduleDetail
2019
attribute :distance, :float
2120

22-
validates :type, presence: true
2321
validates :airline, presence: true
2422
validates :airlineid, presence: true
2523
validates :sourceairport, presence: true

config/initializers/rswag_api.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
Rswag::Api.configure do |c|
2+
# Specify a root folder where Swagger JSON files are located
3+
# This is used by the Swagger middleware to serve requests for API descriptions
4+
# NOTE: If you're using rswag-specs to generate Swagger, you'll need to ensure
5+
# that it's configured to generate files in the same folder
6+
c.openapi_root = Rails.root.to_s + '/swagger'
7+
8+
# Inject a lambda function to alter the returned Swagger prior to serialization
9+
# The function will have access to the rack env for the current request
10+
# For example, you could leverage this to dynamically assign the "host" property
11+
#
12+
# c.swagger_filter = lambda { |swagger, env| swagger['host'] = env['HTTP_HOST'] }
13+
end

config/initializers/rswag_ui.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
Rswag::Ui.configure do |c|
2+
3+
# List the Swagger endpoints that you want to be documented through the
4+
# swagger-ui. The first parameter is the path (absolute or relative to the UI
5+
# host) to the corresponding endpoint and the second is a title that will be
6+
# displayed in the document selector.
7+
# NOTE: If you're using rspec-api to expose Swagger files
8+
# (under openapi_root) as JSON or YAML endpoints, then the list below should
9+
# correspond to the relative paths for those endpoints.
10+
11+
c.swagger_endpoint '/api-docs/v1/swagger.yaml', 'API V1 Docs'
12+
13+
# Add Basic Auth in case your API is private
14+
# c.basic_auth_enabled = true
15+
# c.basic_auth_credentials 'username', 'password'
16+
end

config/routes.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Rails.application.routes.draw do
2-
# mount Rswag::Ui::Engine => '/api-docs'
3-
# mount Rswag::Api::Engine => '/api-docs'
2+
mount Rswag::Ui::Engine => '/api-docs'
3+
mount Rswag::Api::Engine => '/api-docs'
44

55
namespace :api do
66
namespace :v1 do

0 commit comments

Comments
 (0)