[deploy] Extracts DisplayAds from Administrate into admin (#10153)

* Extracts DisplayAds from Administrate into admin

* Suggested changes
This commit is contained in:
Fernando Valverde 2020-09-02 09:28:22 -06:00 committed by GitHub
parent f82ea80fcf
commit ada2d0c728
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 297 additions and 2 deletions

View file

@ -13,6 +13,7 @@ module Admin
{ name: "chat_channels", controller: "chat_channels" },
{ name: "comments", controller: "comments" },
{ name: "config", controller: "config" },
{ name: "display_ads", controller: "display_ads" },
{ name: "events", controller: "events" },
{ name: "growth", controller: "growth" },
{ name: "listings", controller: "listings" },

View file

@ -0,0 +1,70 @@
module Admin
class DisplayAdsController < Admin::ApplicationController
layout "admin"
def index
@display_ads = DisplayAd.order(id: :desc)
.joins(:organization)
.includes([:organization])
.page(params[:page]).per(50)
return if params[:search].blank?
@display_ads = @display_ads.where("organizations.name ILIKE :search", search: "%#{params[:search]}%")
end
def new
@display_ad = DisplayAd.new
end
def edit
@display_ad = DisplayAd.find(params[:id])
end
def create
@display_ad = DisplayAd.new(display_ad_params)
if @display_ad.save
flash[:success] = "Display Ad has been created!"
redirect_to admin_display_ads_path
else
flash[:danger] = @display_ad.errors_as_sentence
render new_admin_display_ad_path
end
end
def update
@display_ad = DisplayAd.find(params[:id])
if @display_ad.update(display_ad_params)
flash[:success] = "Display Ad has been updated!"
redirect_to admin_display_ads_path
else
flash[:danger] = @display_ad.errors_as_sentence
render :edit
end
end
def destroy
@display_ad = DisplayAd.find(params[:id])
if @display_ad.destroy
flash[:success] = "Display Ad has been deleted!"
redirect_to admin_display_ads_path
else
flash[:danger] = "Something went wrong with deleting the Display Ad."
render :edit
end
end
private
def display_ad_params
params.permit(:organization_id, :body_markdown, :placement_area, :published, :approved)
end
def authorize_admin
authorize DisplayAd, :access?, policy_class: InternalPolicy
end
end
end

View file

@ -22,7 +22,6 @@ class DashboardManifest
tags
email_messages
feedback_messages
display_ads
badges
badge_achievements
html_variants

View file

@ -16,6 +16,7 @@ module Constants
"Resource Admin: Page",
"Resource Admin: FeedbackMessage",
"Resource Admin: Config",
"Resource Admin: Broadcast"].freeze
"Resource Admin: Broadcast",
"Resource Admin: DisplayAd"].freeze
end
end

View file

@ -1,4 +1,6 @@
class DisplayAd < ApplicationRecord
resourcify
belongs_to :organization
has_many :display_ad_events, dependent: :destroy

View file

@ -0,0 +1,24 @@
<div class="form-group">
<%= label_tag :organization_id, "Organization ID:" %>
<%= text_field_tag :organization_id, @display_ad.organization_id, class: "form-control" %>
</div>
<div class="form-group">
<%= label_tag :body_markdown, "Body Markdown:" %>
<%= text_area_tag :body_markdown, @display_ad.body_markdown, size: "100x10", class: "form-control" %>
</div>
<div class="form-group">
<%= label_tag :placement_area, "Placement Area:" %>
<%= select_tag :placement_area, options_for_select(%w[sidebar_left sidebar_right], selected: @display_ad.placement_area), include_blank: true %>
</div>
<div class="form-group">
<%= label_tag :published, "Published:" %>
<%= select_tag :published, options_for_select([false, true], selected: @display_ad.published) %>
</div>
<div class="form-group">
<%= label_tag :approved, "Approved:" %>
<%= select_tag :approved, options_for_select([false, true], selected: @display_ad.approved) %>
</div>

View file

@ -0,0 +1,7 @@
<h2 class="fs-2xl s:fs-3xl mb-6">Edit Display Ad:</h2>
<div class="crayons-card p-6">
<%= form_for([:admin, @display_ad], method: :patch) do %>
<%= render "form" %>
<%= submit_tag "Update Display Ad", class: "btn btn-primary" %>
<% end %>
</div>

View file

@ -0,0 +1,43 @@
<nav class="flex mb-4" aria-label="Display Ads navigation">
<%= form_tag("/admin/display_ads", method: "get") do %>
<%= text_field_tag(:search, params[:search], aria: { label: "Search" }, class: "top-bar--search-input crayons-textfield", placeholder: "Search by Org name") %>
<% end %>
<div class="ml-auto">
<div class="justify-content-end">
<%= link_to "Make A New Display Ad", new_admin_display_ad_path, class: "crayons-btn" %>
</div>
</div>
</nav>
<%= paginate @display_ads %>
<table class="crayons-table" width="100%">
<thead>
<tr>
<th scope="col">ID</th>
<th scope="col">Organization</th>
<th scope="col">Placement Area</th>
<th scope="col">Body Markdown</th>
<th scope="col">Published</th>
<th scope="col">Approved</th>
<th scope="col">Success Rate</th>
</tr>
</thead>
<tbody class="crayons-card">
<% @display_ads.each do |display_ad| %>
<tr>
<td><%= link_to display_ad.id, edit_admin_display_ad_path(display_ad) %></td>
<td><%= link_to display_ad.organization.name, admin_organization_path(display_ad.organization) %></td>
<td><%= display_ad.placement_area %></td>
<td><%= display_ad.body_markdown.truncate(30) %></td>
<td><%= display_ad.published %></td>
<td><%= display_ad.approved %></td>
<td><%= display_ad.success_rate %></td>
<td><%= link_to "Edit", edit_admin_display_ad_path(display_ad), class: "crayons-btn" %></td>
<td><%= link_to "Destroy", admin_display_ad_path(display_ad), class: "crayons-btn crayons-btn--danger", method: :delete, data: { confirm: "Are you sure?" } %></td>
</tr>
<% end %>
</tbody>
</table>
<%= paginate @display_ads %>

View file

@ -0,0 +1,7 @@
<h2 class="fs-2xl s:fs-3xl mb-6">Make a new Display Ad:</h2>
<div class="crayons-card p-6">
<%= form_for([:admin, @display_ad], method: :post) do %>
<%= render "form" %>
<%= submit_tag "Create Display Ad", class: "btn btn-primary" %>
<% end %>
</div>

View file

@ -121,6 +121,7 @@ Rails.application.routes.draw do
resources :webhook_endpoints, only: :index
resource :config
resources :badges, only: %i[index edit update new create]
resources :display_ads, only: %i[index edit update new create destroy]
# These redirects serve as a safegaurd to prevent 404s for any Admins
# who have the old badge_achievement URLs bookmarked.
get "/badges/badge_achievements", to: redirect("/admin/badge_achievements")

View file

@ -0,0 +1,140 @@
require "rails_helper"
require "requests/shared_examples/internal_policy_dependant_request"
RSpec.describe "/admin/display_ads", type: :request do
let(:get_resource) { get "/admin/display_ads" }
let(:org) { create(:organization) }
let(:params) do
{ organization_id: org.id, body_markdown: "[Click here!](https://example.com)", placement_area: "sidebar_left",
approved: true, published: true }
end
let(:post_resource) { post "/admin/display_ads", params: params }
it_behaves_like "an InternalPolicy dependant request", DisplayAd do
let(:request) { get_resource }
end
context "when the user is not an admin" do
let(:user) { create(:user) }
before { sign_in user }
describe "GET /admin/display_ads" do
it "blocks the request" do
expect { get_resource }.to raise_error(Pundit::NotAuthorizedError)
end
end
describe "POST /admin/display_ads" do
it "blocks the request" do
expect { post_resource }.to raise_error(Pundit::NotAuthorizedError)
end
end
end
context "when the user is a super admin" do
let(:super_admin) { create(:user, :super_admin) }
before { sign_in super_admin }
describe "GET /admin/display_ads" do
it "allows the request" do
get_resource
expect(response).to have_http_status(:ok)
end
end
describe "POST /admin/display_ads" do
it "creates a new display_ad" do
expect do
post_resource
end.to change { DisplayAd.all.count }.by(1)
end
end
describe "PUT /admin/display_ads" do
let!(:display_ad) { create(:display_ad, approved: false) }
it "updates DisplayAd's approved value" do
Timecop.freeze(Time.current) do
expect do
put "/admin/display_ads/#{display_ad.id}", params: params
end.to change { display_ad.reload.approved }.from(false).to(true)
end
end
end
describe "DELETE /admin/display_ads/:id" do
let!(:display_ad) { create(:display_ad) }
it "deletes the Display Ad" do
expect do
delete "/admin/display_ads/#{display_ad.id}"
end.to change { DisplayAd.all.count }.by(-1)
expect(response.body).to redirect_to "/admin/display_ads"
end
end
end
context "when the user is a single resource admin" do
let(:single_resource_admin) { create(:user, :single_resource_admin, resource: DisplayAd) }
before { sign_in single_resource_admin }
describe "GET /admin/display_ads" do
it "allows the request" do
get_resource
expect(response).to have_http_status(:ok)
end
end
describe "POST /admin/display_ads" do
it "creates a new display_ad" do
expect do
post_resource
end.to change { DisplayAd.all.count }.by(1)
end
end
describe "PUT /admin/display_ads" do
let!(:display_ad) { create(:display_ad, approved: false) }
it "updates DisplayAd's approved value" do
Timecop.freeze(Time.current) do
expect do
put "/admin/display_ads/#{display_ad.id}", params: params
end.to change { display_ad.reload.approved }.from(false).to(true)
end
end
end
describe "DELETE /admin/display_ads/:id" do
let!(:display_ad) { create(:display_ad) }
it "deletes the Display Ad" do
expect do
delete "/admin/display_ads/#{display_ad.id}"
end.to change { DisplayAd.all.count }.by(-1)
expect(response.body).to redirect_to "/admin/display_ads"
end
end
end
context "when the user is the wrong single resource admin" do
let(:single_resource_admin) { create(:user, :single_resource_admin, resource: Article) }
before { sign_in single_resource_admin }
describe "GET /admin/display_ads" do
it "blocks the request" do
expect { get_resource }.to raise_error(Pundit::NotAuthorizedError)
end
end
describe "POST /admin/display_ads" do
it "blocks the request" do
expect { post_resource }.to raise_error(Pundit::NotAuthorizedError)
end
end
end
end