* define api routes and create controllers, sketch out index and create actions * add api v1 organizations CRUD spec and docs spec, need to run swagger * swagger dry run on admin organizations routes, typo fix in api.rb * flesh out specs and sketch out admin actions * move actions out of concerns/include pattern and into v1 inline * remove private constant call * add v1 accept header to doc spec, fix syntax in a before block * update controllers to address failing specs * simplify controller and clarify route config * flesh out tests for errors * fix long line * add missing commas * return username show route to v0 concern controller * create separate show route and action name, remove nesting from create/update params requirement * clean up syntax in controller params and update show path in specs; move routes * fix up syntax in params permit * create organization in index spec * one more syntax tweak for org params * refactoring to one show route that handles username or id * tweak spec syntax to expect the right array * tweak controller and specs, simplify routing to show * remove create route, action, and specs from this branch * add clarifying comment in show controller action * add explicit not found return to show route * fix controller formatting causing 404 errors * remove comment, update specs * remove commment and fix id show response and specs * fix show route and request spec for username param * update unauthorized user specs to use put for now instead of post, regenerate swagger docs * adjust update 422 spec to break org validity * fix admin update spec, rerun swagger * reorganiza controller actions, update specs, ensure authorized update and delete * improve spec, handle finding one org more gracefully, delete via worker * copy routes into api namespace instead of moving them from general namespace * update param in v0 show route to fit more general naming * regenerate v1 swagger docs * use profile image url getter in update controller response * update swagger docs and remove unneeded comment from org' model * configure organizations destroy action for super admins only (for now)
79 lines
2.4 KiB
Ruby
79 lines
2.4 KiB
Ruby
module Api
|
|
module OrganizationsController
|
|
extend ActiveSupport::Concern
|
|
|
|
SHOW_ATTRIBUTES_FOR_SERIALIZATION = %i[
|
|
id username name summary twitter_username github_username url
|
|
location created_at profile_image tech_stack tag_line story
|
|
].freeze
|
|
private_constant :SHOW_ATTRIBUTES_FOR_SERIALIZATION
|
|
|
|
USERS_FOR_SERIALIZATION = %i[
|
|
id username name twitter_username github_username
|
|
profile_image website_url location summary created_at
|
|
].freeze
|
|
private_constant :USERS_FOR_SERIALIZATION
|
|
|
|
LISTINGS_FOR_SERIALIZATION = %i[
|
|
id user_id organization_id title slug body_markdown cached_tag_list
|
|
classified_listing_category_id processed_html published created_at
|
|
].freeze
|
|
private_constant :LISTINGS_FOR_SERIALIZATION
|
|
|
|
ARTICLES_FOR_SERIALIZATION = Api::V0::ArticlesController::INDEX_ATTRIBUTES_FOR_SERIALIZATION
|
|
|
|
def show
|
|
@organization = Organization.select(SHOW_ATTRIBUTES_FOR_SERIALIZATION)
|
|
.find_by!(username: params[:id_or_slug])
|
|
end
|
|
|
|
def users
|
|
per_page = (params[:per_page] || 30).to_i
|
|
num = [per_page, per_page_max].min
|
|
page = params[:page] || 1
|
|
|
|
@users = @organization.users.joins(:profile).select(USERS_FOR_SERIALIZATION).page(page).per(num)
|
|
end
|
|
|
|
def listings
|
|
per_page = (params[:per_page] || 30).to_i
|
|
num = [per_page, per_page_max].min
|
|
page = params[:page] || 1
|
|
|
|
@listings = @organization.listings.published
|
|
.select(LISTINGS_FOR_SERIALIZATION).page(page).per(num)
|
|
.includes(:user, :taggings, :listing_category)
|
|
.order(bumped_at: :desc)
|
|
|
|
@listings = @listings.in_category(params[:category]) if params[:category].present?
|
|
end
|
|
|
|
def articles
|
|
per_page = (params[:per_page] || 30).to_i
|
|
num = [per_page, per_page_max].min
|
|
page = params[:page] || 1
|
|
|
|
@articles = @organization.articles.published
|
|
.select(ARTICLES_FOR_SERIALIZATION)
|
|
.includes(:user)
|
|
.order(published_at: :desc)
|
|
.page(page)
|
|
.per(num)
|
|
.decorate
|
|
|
|
render "api/v0/articles/index", formats: :json
|
|
end
|
|
|
|
private
|
|
|
|
def per_page_max
|
|
(ApplicationConfig["API_PER_PAGE_MAX"] || 1000).to_i
|
|
end
|
|
|
|
def find_organization
|
|
# Looking up via id_or_slug parameter since both types of lookup are handled in
|
|
# the v1 show route
|
|
@organization = Organization.find_by!(username: params[:organization_id_or_slug])
|
|
end
|
|
end
|
|
end
|