✂✂✂ Remove events (#15062)
* Remove events * Fix schema * Fix specs * More removal
This commit is contained in:
parent
333775b831
commit
a1f512e49e
25 changed files with 23 additions and 754 deletions
|
|
@ -1,56 +0,0 @@
|
|||
module Admin
|
||||
class EventsController < ApplicationController
|
||||
layout "admin"
|
||||
include ApplicationHelper
|
||||
|
||||
EVENTS_ALLOWED_PARAMS = %i[
|
||||
title category event_date starts_at ends_at
|
||||
location_name cover_image location_url description_markdown published
|
||||
host_name profile_image live_now
|
||||
].freeze
|
||||
|
||||
def index
|
||||
@events = Event.order(starts_at: :desc).page(params[:page]).per(20)
|
||||
end
|
||||
|
||||
def new
|
||||
@event = Event.new(
|
||||
location_name: "#{URL.domain}/live",
|
||||
location_url: app_url,
|
||||
description_markdown: "*Description* *Pre-requisites:* *Bio*",
|
||||
)
|
||||
end
|
||||
|
||||
def edit
|
||||
@event = Event.find(params[:id])
|
||||
end
|
||||
|
||||
def create
|
||||
@event = Event.new(event_params)
|
||||
if @event.save
|
||||
flash[:success] = "Successfully created event: #{@event.title}"
|
||||
redirect_to admin_events_path
|
||||
else
|
||||
flash[:danger] = @event.errors.full_messages
|
||||
render :new
|
||||
end
|
||||
end
|
||||
|
||||
def update
|
||||
@event = Event.find(params[:id])
|
||||
if @event.update(event_params)
|
||||
flash[:success] = "#{@event.title} was successfully updated"
|
||||
redirect_to admin_events_path
|
||||
else
|
||||
flash[:danger] = @event.errors.full_messages
|
||||
render :edit
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def event_params
|
||||
params.require(:event).permit(EVENTS_ALLOWED_PARAMS)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
class EventsController < ApplicationController
|
||||
before_action :set_cache_control_headers, only: [:index]
|
||||
# No authorization required for entirely public controller
|
||||
|
||||
def index
|
||||
@events = Event.in_the_future_and_published.sort_by(&:starts_at)
|
||||
@past_events = Event.in_the_past_and_published.sort_by(&:starts_at)
|
||||
set_surrogate_key_header "events_index_page"
|
||||
@past_events.reverse!
|
||||
end
|
||||
|
||||
def show
|
||||
@event = Event.find_by!(slug: params[:id])
|
||||
end
|
||||
end
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
class Event < ApplicationRecord
|
||||
mount_uploader :cover_image, CoverImageUploader
|
||||
mount_uploader :profile_image, ProfileImageUploader
|
||||
|
||||
validates :title, length: { maximum: 90 }
|
||||
validates :location_url, url: { allow_blank: true, schemes: %w[https http] }
|
||||
validate :end_time_after_start
|
||||
validates :slug, presence: { if: :published? }, format: /\A[0-9a-z-]*\z/
|
||||
before_validation :evaluate_markdown
|
||||
before_validation :create_slug
|
||||
after_save :bust_cache
|
||||
|
||||
scope :in_the_future_and_published, lambda {
|
||||
where("starts_at > ?", Time.current)
|
||||
.where(published: true)
|
||||
}
|
||||
|
||||
scope :in_the_past_and_published, lambda {
|
||||
where("starts_at < ?", Time.current)
|
||||
.where(published: true)
|
||||
}
|
||||
|
||||
private
|
||||
|
||||
def evaluate_markdown
|
||||
self.description_html = MarkdownProcessor::Parser.new(description_markdown).evaluate_markdown
|
||||
end
|
||||
|
||||
def end_time_after_start
|
||||
if ends_at.nil? || starts_at.nil?
|
||||
errors.add(:starts_at, "and ends_at must not be nil")
|
||||
elsif ends_at < starts_at
|
||||
errors.add(:ends_at, "must be after start date")
|
||||
end
|
||||
end
|
||||
|
||||
def create_slug
|
||||
self.slug = title_to_slug if slug.blank? && title.present? && published
|
||||
end
|
||||
|
||||
def title_to_slug
|
||||
downcase = "#{id}-#{category}-#{title}"
|
||||
"#{downcase.parameterize}-#{starts_at.strftime('%m-%d-%Y')}"
|
||||
end
|
||||
|
||||
def bust_cache
|
||||
Events::BustCacheWorker.perform_async
|
||||
end
|
||||
end
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
module EdgeCache
|
||||
class BustEvents
|
||||
def self.call
|
||||
cache_bust = EdgeCache::Bust.new
|
||||
cache_bust.call("/events")
|
||||
cache_bust.call("/events?i=i")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
class CoverImageUploader < BaseUploader
|
||||
end
|
||||
|
|
@ -1,58 +0,0 @@
|
|||
<div class="crayons-card p-6">
|
||||
<%= form_for [:admin, @event] do |f| %>
|
||||
<div class="crayons-field">
|
||||
<%= f.label :cover_image, class: "crayons-field__label" %>
|
||||
<%= f.file_field :cover_image, class: "crayons-field" %>
|
||||
</div>
|
||||
<div class="crayons-field">
|
||||
<%= f.label :profile_image, class: "crayons-field__label" %> (for live notification):
|
||||
<%= f.file_field :profile_image, class: "crayons-field" %>
|
||||
<img src="<%= @event.profile_image_url %>" style="width: 25%;" alt="event profile image">
|
||||
</div>
|
||||
<div class="crayons-field">
|
||||
<%= f.label :title, class: "crayons-field__label" %>
|
||||
<%= f.text_field :title, maxlength: 90, size: 40, required: true, class: "crayons-textfield" %>
|
||||
</div>
|
||||
<div class="crayons-field">
|
||||
<%= f.label :host_name, class: "crayons-field__label" %>
|
||||
<%= f.text_field :host_name, size: 40, required: true, class: "crayons-textfield" %>
|
||||
</div>
|
||||
<div class="crayons-field">
|
||||
<%= f.label :category, class: "crayons-field__label" %>
|
||||
<%= f.select :category, ["AMA", "Workshop", "Talk", "Town Hall"], required: true, class: "crayons-select" %>
|
||||
</div>
|
||||
<div class="crayons-field">
|
||||
<%= f.label :starts_at, class: "crayons-field__label" %>
|
||||
<fieldset>
|
||||
<%= f.datetime_select :starts_at, required: true, include_blank: true, start_year: Time.current.year, end_year: Time.current.year + 2, class: "crayons-select" %> UTC Time Only (4 hours ahead of eastern time)
|
||||
</fieldset>
|
||||
</div>
|
||||
<div class="crayons-field">
|
||||
<%= f.label :ends_at, class: "crayons-field__label" %>
|
||||
<fieldset>
|
||||
<%= f.datetime_select :ends_at, required: true, include_blank: true, start_year: Time.current.year, end_year: Time.current.year + 2, class: "crayons-select" %> UTC Time Only (4 hours ahead of eastern time)
|
||||
</fieldset>
|
||||
</div>
|
||||
<div class="crayons-field">
|
||||
<%= f.label :location_name, class: "crayons-field__label" %>
|
||||
<%= f.text_field :location_name, required: true, class: "crayons-textfield" %>
|
||||
</div>
|
||||
<div class="crayons-field">
|
||||
<%= f.label :location_url, class: "crayons-field__label" %>
|
||||
<%= f.text_field :location_url, required: true, class: "crayons-textfield" %>
|
||||
</div>
|
||||
<div class="crayons-field">
|
||||
<%= f.label :description_markdown, class: "crayons-field__label" %>
|
||||
<%= f.text_area :description_markdown, size: "45x10", required: true, class: "crayons-textfield" %>
|
||||
</div>
|
||||
<div class="crayons-field">
|
||||
<%= f.label :published, class: "crayons-field__label" %>
|
||||
<%= f.check_box :published, class: "crayons-checkbox" %>
|
||||
</div>
|
||||
<div class="crayons-field">
|
||||
<%= f.label :live_now, class: "crayons-field__label" %>
|
||||
<%= f.check_box :live_now, class: "crayons-checkbox" %>
|
||||
</div>
|
||||
<%= f.submit class: "crayons-btn" %>
|
||||
<% end %>
|
||||
</div>
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
<div class="crayons-card p-6 mb-6">
|
||||
<h2 class="crayons-title mb-6">Edit Event: <%= @event.title.to_s %></h2>
|
||||
<%= render "event_form" %>
|
||||
</div>
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
<header class="flex items-center mb-6">
|
||||
<h2 class="crayons-title">Events</h2>
|
||||
<%= link_to "New Event", new_admin_event_path, class: "ml-auto crayons-btn crayons-btn--s" %>
|
||||
</header>
|
||||
<br>
|
||||
|
||||
<div class="crayons-card p-6 pages__table">
|
||||
<h3>Upcoming Events</h3>
|
||||
<% @events.each do |event| %>
|
||||
<% if event.starts_at.future? %>
|
||||
<div class="flex py-2 items-center">
|
||||
<%= event.title %>
|
||||
<% if event.cover_image_url.present? %>
|
||||
<img class="mx-auto mt-3" width="40" height="40" src="<%= event.cover_image_url %>" alt="event cover image" loading="lazy" />
|
||||
<% end %>
|
||||
<%= link_to "Edit", edit_admin_event_path(event.id), class: "ml-auto crayons-btn crayons-btn--s crayons-btn--secondary" %>
|
||||
</div>
|
||||
<hr>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</div>
|
||||
<br>
|
||||
|
||||
<div class="crayons-card p-6 pages__table">
|
||||
<h3>Past Events</h3>
|
||||
<% @events.each do |event| %>
|
||||
<% if !event.starts_at.future? %>
|
||||
<div class="flex py-2 items-center">
|
||||
<%= event.title %>
|
||||
<% if event.cover_image_url.present? %>
|
||||
<img class="mx-auto mt-3 justify-content-center" width="40" height="40" src="<%= event.cover_image_url %>" alt="event cover image" loading="lazy" />
|
||||
<% end %>
|
||||
<%= link_to "Edit", edit_admin_event_path(event.id), class: "ml-auto crayons-btn crayons-btn--s crayons-btn--secondary" %>
|
||||
</div>
|
||||
<hr>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</div>
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
<div class="crayons-card p-6 mb-6">
|
||||
<h2 class="crayons-title mb-6">Create New Event</h2>
|
||||
<%= render "event_form" %>
|
||||
</div>
|
||||
|
|
@ -1,100 +0,0 @@
|
|||
<style>
|
||||
.container .event {
|
||||
padding: 20px;
|
||||
border: solid 2px #66e2d5;;
|
||||
border-radius: 3px;
|
||||
margin: 50px auto;
|
||||
box-shadow: 5px 8px 0px #ccfff9;
|
||||
font-size: 17px;
|
||||
max-width: 700px;
|
||||
font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
|
||||
line-height: 145%;
|
||||
}
|
||||
|
||||
.container .event-image {
|
||||
max-width: 43%;
|
||||
float: left;
|
||||
margin-right: 20px;
|
||||
}
|
||||
|
||||
.container .event-image img {
|
||||
max-width: 100%;
|
||||
border-radius: 3px;
|
||||
left: 1px;
|
||||
}
|
||||
|
||||
.event .event-details p {
|
||||
margin: 5px;
|
||||
}
|
||||
|
||||
.event .event-description p {
|
||||
text-align: justify;
|
||||
}
|
||||
|
||||
.event .event-details h3 {
|
||||
margin: 0 0 .5em 0;
|
||||
font-weight: 800;
|
||||
font-size: 1.11em;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 900px) {
|
||||
.container .body .event .event-image {
|
||||
display: block;
|
||||
max-width: 100%;
|
||||
margin: 0 0 20px;
|
||||
}
|
||||
}
|
||||
|
||||
.copyx {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.addeventatc {
|
||||
visibility: hidden;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="event">
|
||||
<div class="event-image">
|
||||
<img src="<%= optimized_image_url(event.cover_image_url, width: 500) %>" alt="event image" loading="lazy" />
|
||||
</div>
|
||||
<div class="event-details">
|
||||
<h3><a href="/events/<%= event.slug %>"><%= event.category %>: <%= event.title %></a></h3>
|
||||
<p>
|
||||
Date: <span class="utc-date" data-datetime="<%= event.starts_at.strftime("%d %B %Y %H:%M UTC") %>"> </span>
|
||||
<br>
|
||||
Time: <span class="utc-time" data-datetime="<%= event.starts_at.strftime("%d %B %Y %H:%M UTC") %>"> </span>
|
||||
- <span class="utc-time" data-datetime="<%= event.ends_at.strftime("%d %B %Y %H:%M UTC") %>"> </span>
|
||||
<br>
|
||||
Location: <a href="<%= event.location_url %>"><%= event.location_name %></a>
|
||||
</p>
|
||||
<div title="Add to Calendar" class="addeventatc">
|
||||
Add to Calendar
|
||||
<span class="start utc"><%= event.starts_at.strftime("%d %B %Y %H:%M UTC") %></span>
|
||||
<span class="end utc"><%= event.ends_at.strftime("%d %B %Y %H:%M UTC") %></span>
|
||||
<span class="timezone">America/New_York</span>
|
||||
<span class="title"><%= event.title %></span>
|
||||
<span class="organizer"><%= community_name %></span>
|
||||
<span class="organizer_email"><%= ForemInstance.email %></span>
|
||||
<span class="calname">dev-event</span>
|
||||
<span class="location"><%= event.location_url %></span>
|
||||
<span class="alarm_reminder">15</span>
|
||||
<span class="description">
|
||||
<%= event.description_html&.html_safe %>
|
||||
------
|
||||
Link to attend - <%= event.location_url %>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="event-description">
|
||||
<%= event.description_html&.html_safe %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
window.addeventasync = function () {
|
||||
addeventatc.register('button-dropdown-click', function (obj) {
|
||||
ga('send', 'event', 'click', 'Add Event To Calendar', 'User: <%= user_signed_in? %>');
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
|
@ -1,42 +0,0 @@
|
|||
<%= content_for :page_meta do %>
|
||||
<% title("#{community_name} EVENTS") %>
|
||||
<link rel="canonical" href="<%= app_url("/events") %>" />
|
||||
<meta name="description" content="<%= community_name %> Events">
|
||||
<%= meta_keywords_default %>
|
||||
|
||||
<meta property="og:type" content="article" />
|
||||
<meta property="og:url" content="<%= app_url("/events") %>" />
|
||||
<meta property="og:title" content="<%= community_name %> Events" />
|
||||
<meta property="og:description" content="Community events." />
|
||||
<meta property="og:site_name" content="<%= community_name %>" />
|
||||
<meta property="og:image" content="<%= Settings::General.main_social_image %>">
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:site" content="@<%= Settings::General.social_media_handles["twitter"] %>">
|
||||
<meta name="twitter:title" content="<%= community_name %> Events">
|
||||
<meta name="twitter:image:src" content="<%= Settings::General.main_social_image %>">
|
||||
<% end %>
|
||||
|
||||
<script type="text/javascript" src="https://addevent.com/libs/atc/1.6.1/atc.min.js" async defer></script>
|
||||
|
||||
<div class="crayons-layout crayons-layout--limited-l">
|
||||
<div class="crayons-card text-styles text-padding">
|
||||
<h1 class="fs-3xl s:fs-4xl l:fs-5xl fw-bold s:fw-heavy lh-tight mb-4 mt-0">
|
||||
Upcoming Events
|
||||
</h1>
|
||||
|
||||
<%= render partial: "event", collection: @events, as: :event %>
|
||||
|
||||
<% if @events.none? %>
|
||||
<div class="crayons-notice" aria-live="polite">
|
||||
There are no upcoming events currently scheduled
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<% if @past_events.any? %>
|
||||
<h1>
|
||||
Past Events
|
||||
</h1>
|
||||
<%= render partial: "event", collection: @past_events, as: :event %>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1,77 +0,0 @@
|
|||
<%= content_for :page_meta do %>
|
||||
<% title("#{@event.title} - #{community_name}") %>
|
||||
<link rel="canonical" href="<%= app_url("/#{@event.slug}") %>" />
|
||||
<meta name="description" content="<%= community_name %> | Events">
|
||||
<%= meta_keywords_default %>
|
||||
|
||||
<meta property="og:type" content="article" />
|
||||
<meta property="og:url" content="<%= app_url("/#{@event.slug}") %>" />
|
||||
<meta property="og:title" content="<%= @event.title %>" />
|
||||
<% if @event.cover_image.present? %>
|
||||
<meta property="og:image" content="<%= @event.cover_image_url %>" />
|
||||
<% else %>
|
||||
<meta property="og:image" content="<%= Settings::General.main_social_image %>" />
|
||||
<% end %>
|
||||
<meta property="og:description" content="<%= truncate(strip_tags(@event.description_html), length: 140) %>" />
|
||||
<meta property="og:site_name" content="<%= community_name %>" />
|
||||
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:site" content="@<%= Settings::General.social_media_handles["twitter"] %>">
|
||||
<meta name="twitter:title" content="<%= truncate(strip_tags(@event.title), length: 70) %>">
|
||||
<meta property="og:description" content="<%= truncate(strip_tags(@event.description_html), length: 140) %>" />
|
||||
<% if @event.cover_image.present? %>
|
||||
<meta name="twitter:image:src" content="<%= @event.cover_image_url %>">
|
||||
<% else %>
|
||||
<meta name="twitter:image:src" content="<%= Settings::General.main_social_image %>">
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
<div class="blank-space"></div>
|
||||
|
||||
<style>
|
||||
|
||||
.container .body .event {
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
margin-top: 0px;
|
||||
}
|
||||
|
||||
.container .body .event h3 {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.container .body h1 {
|
||||
margin-bottom: 10px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.container .event .event-description {
|
||||
text-align: justify;
|
||||
}
|
||||
|
||||
.container .event .event-details {
|
||||
font-size: 1.3em;
|
||||
}
|
||||
|
||||
.addeventatc {
|
||||
border: solid 1px #66e2d5;
|
||||
}
|
||||
|
||||
.addeventatc:hover {
|
||||
border: 1px solid #557de8;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
<script type="text/javascript" src="https://addevent.com/libs/atc/1.6.1/atc.min.js" async defer></script>
|
||||
|
||||
<div class="container article">
|
||||
<div style="height:30px">
|
||||
</div>
|
||||
<div class="body">
|
||||
<h1 style="padding-left: 20px; font-weight: 500;"><%= @event.category %>: <%= @event.title %></h1>
|
||||
<%= render "event", event: @event %>
|
||||
<h3 style="text-align: center">
|
||||
<span style="background-color: yellow; padding: 5px"><a href="/events"> All EVENTS </a></span></h3>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
module Events
|
||||
class BustCacheWorker < BustCacheBaseWorker
|
||||
sidekiq_options queue: :low_priority
|
||||
|
||||
def perform
|
||||
EdgeCache::BustEvents.call
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -166,7 +166,6 @@ Rails.application.routes.draw do
|
|||
post "/update_or_create", to: "github_repos#update_or_create"
|
||||
end
|
||||
end
|
||||
resources :events, only: %i[index show]
|
||||
resources :videos, only: %i[index create new]
|
||||
resources :video_states, only: [:create]
|
||||
resources :twilio_tokens, only: [:show]
|
||||
|
|
@ -313,8 +312,6 @@ Rails.application.routes.draw do
|
|||
get "/badge", to: "pages#badge", as: :pages_badge
|
||||
get "/💸", to: redirect("t/hiring")
|
||||
get "/survey", to: redirect("https://dev.to/ben/final-thoughts-on-the-state-of-the-web-survey-44nn")
|
||||
get "/events", to: "events#index"
|
||||
get "/workshops", to: redirect("events")
|
||||
get "/sponsors", to: "pages#sponsors"
|
||||
get "/search", to: "stories/articles_search#index"
|
||||
post "articles/preview", to: "articles#preview"
|
||||
|
|
|
|||
|
|
@ -149,7 +149,6 @@ namespace :admin do
|
|||
end
|
||||
end
|
||||
resources :consumer_apps, only: %i[index new create edit update destroy]
|
||||
resources :events, only: %i[index create update new edit]
|
||||
resources :listings, only: %i[index edit update destroy]
|
||||
resources :listing_categories, only: %i[index edit update new create
|
||||
destroy], path: "listings/categories"
|
||||
|
|
|
|||
22
db/migrate/20211013060449_drop_events.rb
Normal file
22
db/migrate/20211013060449_drop_events.rb
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
class DropEvents < ActiveRecord::Migration[6.1]
|
||||
def up
|
||||
drop_table :events do |t|
|
||||
t.string :category
|
||||
t.string :cover_image
|
||||
t.text :description_html
|
||||
t.text :description_markdown
|
||||
t.datetime :ends_at
|
||||
t.string :host_name
|
||||
t.boolean :live_now, default: false
|
||||
t.string :location_name
|
||||
t.string :location_url
|
||||
t.string :profile_image
|
||||
t.boolean :published
|
||||
t.string :slug
|
||||
t.datetime :starts_at
|
||||
t.string :title
|
||||
|
||||
t.timestamps
|
||||
end
|
||||
end
|
||||
end
|
||||
21
db/schema.rb
21
db/schema.rb
|
|
@ -10,7 +10,7 @@
|
|||
#
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema.define(version: 2021_10_08_170433) do
|
||||
ActiveRecord::Schema.define(version: 2021_10_13_060449) do
|
||||
|
||||
# These are extensions that must be enabled in order to support this database
|
||||
enable_extension "citext"
|
||||
|
|
@ -496,25 +496,6 @@ ActiveRecord::Schema.define(version: 2021_10_08_170433) do
|
|||
t.index ["user_id"], name: "index_email_authorizations_on_user_id"
|
||||
end
|
||||
|
||||
create_table "events", force: :cascade do |t|
|
||||
t.string "category"
|
||||
t.string "cover_image"
|
||||
t.datetime "created_at", null: false
|
||||
t.text "description_html"
|
||||
t.text "description_markdown"
|
||||
t.datetime "ends_at"
|
||||
t.string "host_name"
|
||||
t.boolean "live_now", default: false
|
||||
t.string "location_name"
|
||||
t.string "location_url"
|
||||
t.string "profile_image"
|
||||
t.boolean "published"
|
||||
t.string "slug"
|
||||
t.datetime "starts_at"
|
||||
t.string "title"
|
||||
t.datetime "updated_at", null: false
|
||||
end
|
||||
|
||||
create_table "feedback_messages", force: :cascade do |t|
|
||||
t.bigint "affected_id"
|
||||
t.string "category"
|
||||
|
|
|
|||
|
|
@ -1,9 +0,0 @@
|
|||
FactoryBot.define do
|
||||
factory :event do
|
||||
title { Faker::Company.bs }
|
||||
description_markdown { Faker::Hipster.paragraph(sentence_count: 2) }
|
||||
starts_at { Time.current }
|
||||
ends_at { 3660.seconds.from_now }
|
||||
category { "AMA" }
|
||||
end
|
||||
end
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
require "rails_helper"
|
||||
|
||||
RSpec.describe Event, type: :model do
|
||||
let(:event) { build(:event) }
|
||||
|
||||
it "rejects title with over 90 characters" do
|
||||
event.title = Faker::Lorem.characters(number: 100)
|
||||
expect(event).not_to be_valid
|
||||
end
|
||||
|
||||
it "rejects invalid http url" do
|
||||
event.location_url = "dev.to"
|
||||
expect(event).not_to be_valid
|
||||
end
|
||||
|
||||
it "rejects ends times that are earlier than start times" do
|
||||
event.ends_at = event.starts_at - 1.minute
|
||||
expect(event).not_to be_valid
|
||||
end
|
||||
|
||||
it "creates slug for published events" do
|
||||
event = build(:event, category: "ama", title: "yo", published: true)
|
||||
event.validate!
|
||||
expected_slug = "#{event.category}-#{event.title}-#{event.starts_at.strftime('%m-%d-%Y')}"
|
||||
expect(event.slug).to eq(expected_slug)
|
||||
end
|
||||
|
||||
it "triggers cache busting on save" do
|
||||
sidekiq_assert_enqueued_jobs(1, queue: "low_priority") do
|
||||
event.save
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -1,52 +0,0 @@
|
|||
require "rails_helper"
|
||||
|
||||
RSpec.describe "/admin/apps/events", type: :request do
|
||||
let(:event) { create(:event, title: "Hey") }
|
||||
let(:admin) { create(:user, :super_admin) }
|
||||
let(:params) do
|
||||
{
|
||||
event: {
|
||||
title: "Hello, world!",
|
||||
description_markdown: "This is an event",
|
||||
starts_at: Time.current,
|
||||
ends_at: 3660.seconds.from_now,
|
||||
category: "Talk"
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
describe "PUT admin/apps/events" do
|
||||
before do
|
||||
sign_in(admin)
|
||||
end
|
||||
|
||||
it "marks an event as not live now" do
|
||||
event.update(live_now: true)
|
||||
patch admin_event_path(event.id), params: { event: { live_now: "0" } }
|
||||
expect(event.reload.live_now).to eq false
|
||||
end
|
||||
|
||||
it "marks an event as live now" do
|
||||
patch admin_event_path(event.id), params: { event: { live_now: "1" } }
|
||||
expect(event.reload.live_now).to eq true
|
||||
end
|
||||
|
||||
it "successfully updates the event title" do
|
||||
expect do
|
||||
patch admin_event_path(event.id), params: params
|
||||
end.to change { event.reload.title }.to("Hello, world!")
|
||||
end
|
||||
end
|
||||
|
||||
describe "POST /admin/apps/events" do
|
||||
let(:post_resource) { post admin_events_path, params: params }
|
||||
|
||||
before { sign_in admin }
|
||||
|
||||
it "successfully creates an event" do
|
||||
expect do
|
||||
post_resource
|
||||
end.to change { Event.all.count }.by(1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
require "rails_helper"
|
||||
|
||||
RSpec.describe "Events", type: :request do
|
||||
let(:event) { create(:event, published: true) }
|
||||
|
||||
describe "GET events" do
|
||||
it "returns index page" do
|
||||
event
|
||||
get "/events"
|
||||
expect(response.body).to include("#{community_name} EVENTS")
|
||||
expect(response.body).to include(event.title)
|
||||
end
|
||||
|
||||
it "does not include unpublished events" do
|
||||
unpublished_event = create(:event, published: false)
|
||||
get "/events"
|
||||
expect(response.body).not_to include(unpublished_event.title)
|
||||
end
|
||||
end
|
||||
|
||||
describe "GET events#show" do
|
||||
it "returns event show page" do
|
||||
get "/events/#{event.slug}"
|
||||
expect(response.body).to include event.title
|
||||
end
|
||||
|
||||
it "renders not_found" do
|
||||
expect do
|
||||
get "/events/NotSlug-#{event.slug}"
|
||||
end.to raise_error(ActiveRecord::RecordNotFound)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
require "rails_helper"
|
||||
|
||||
RSpec.describe EdgeCache::BustEvents, type: :service do
|
||||
let(:cache_bust) { instance_double(EdgeCache::Bust) }
|
||||
let(:paths) do
|
||||
[
|
||||
"/events",
|
||||
"/events?i=i",
|
||||
]
|
||||
end
|
||||
|
||||
before do
|
||||
allow(EdgeCache::Bust).to receive(:new).and_return(cache_bust)
|
||||
paths.each do |path|
|
||||
allow(cache_bust).to receive(:call).with(path).once
|
||||
end
|
||||
end
|
||||
|
||||
it "busts the cache" do
|
||||
described_class.call
|
||||
|
||||
paths.each do |path|
|
||||
expect(cache_bust).to have_received(:call).with(path).once
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
require "rails_helper"
|
||||
require "date"
|
||||
|
||||
RSpec.describe "Admin creates new event", type: :system do
|
||||
let(:admin) { create(:user, :super_admin) }
|
||||
|
||||
before do
|
||||
sign_in admin
|
||||
visit new_admin_event_path
|
||||
end
|
||||
|
||||
def select_date_and_time(year, month, date, hour, min, field_name)
|
||||
select year, from: "event[#{field_name}(1i)]"
|
||||
select month, from: "event[#{field_name}(2i)]"
|
||||
select date, from: "event[#{field_name}(3i)]"
|
||||
select hour, from: "event[#{field_name}(4i)]"
|
||||
select min, from: "event[#{field_name}(5i)]"
|
||||
end
|
||||
|
||||
def create_and_publish_event
|
||||
fill_in("Title", with: "Workshop Title")
|
||||
select_date_and_time(Time.current.year.to_s, "December", "30", "15", "30", "starts_at")
|
||||
select_date_and_time(Time.current.year.to_s, "December", "30", "16", "30", "ends_at")
|
||||
check("event[published]")
|
||||
click_button("Create Event")
|
||||
end
|
||||
|
||||
it "loads /admin/apps/events" do
|
||||
expect(page).to have_content("New Event")
|
||||
end
|
||||
|
||||
it "loads published events on /events" do
|
||||
create_and_publish_event
|
||||
visit "/events"
|
||||
|
||||
expect(page).to have_content("Workshop Title")
|
||||
end
|
||||
end
|
||||
|
|
@ -1,63 +0,0 @@
|
|||
require "rails_helper"
|
||||
require "carrierwave/test/matchers"
|
||||
require "exifr/jpeg"
|
||||
|
||||
describe CoverImageUploader, type: :uploader do
|
||||
include CarrierWave::Test::Matchers
|
||||
|
||||
let(:image_jpg) { fixture_file_upload("800x600.jpg", "image/jpeg") }
|
||||
let(:image_png) { fixture_file_upload("800x600.png", "image/png") }
|
||||
let(:image_webp) { fixture_file_upload("800x600.webp", "image/webp") }
|
||||
let(:image_with_gps) { fixture_file_upload("image_gps_data.jpg", "image/jpeg") }
|
||||
|
||||
let(:event) { create(:event) }
|
||||
|
||||
# we need a new uploader before each test, and since the uploader is not a model
|
||||
# we can recreate it quickly in memory with `let!`
|
||||
let!(:uploader) { described_class.new(event, :cover_image) }
|
||||
|
||||
before do
|
||||
described_class.include CarrierWave::MiniMagick # needed for processing
|
||||
described_class.enable_processing = true
|
||||
end
|
||||
|
||||
after do
|
||||
described_class.enable_processing = false
|
||||
uploader.remove!
|
||||
end
|
||||
|
||||
it "stores files in the correct directory" do
|
||||
expect(uploader.store_dir).to eq("uploads/event/cover_image/#{event.id}")
|
||||
end
|
||||
|
||||
describe "formats" do
|
||||
it "permits a set of extensions" do
|
||||
expect(uploader.extension_allowlist).to eq(%w[jpg jpeg jpe gif png ico bmp dng])
|
||||
end
|
||||
|
||||
it "permits jpegs" do
|
||||
uploader.store!(image_jpg)
|
||||
expect(uploader).to be_format("jpeg")
|
||||
end
|
||||
|
||||
it "permits pngs" do
|
||||
uploader.store!(image_png)
|
||||
expect(uploader).to be_format("png")
|
||||
end
|
||||
|
||||
it "rejects unsupported formats like webp" do
|
||||
expect { uploader.store!(image_webp) }.to raise_error(CarrierWave::IntegrityError)
|
||||
end
|
||||
end
|
||||
|
||||
describe "exif removal" do
|
||||
it "removes EXIF and GPS data on upload" do
|
||||
expect(EXIFR::JPEG.new(image_with_gps.path).exif?).to be(true)
|
||||
expect(EXIFR::JPEG.new(image_with_gps.path).gps.present?).to be(true)
|
||||
event.cover_image = image_with_gps
|
||||
event.save!
|
||||
expect(EXIFR::JPEG.new(event.cover_image.path).exif?).to be(false)
|
||||
expect(EXIFR::JPEG.new(event.cover_image.path).gps.present?).to be(false)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
require "rails_helper"
|
||||
|
||||
RSpec.describe Events::BustCacheWorker do
|
||||
include_examples "#enqueues_on_correct_queue", "low_priority"
|
||||
|
||||
describe "#perform" do
|
||||
it "busts cache" do
|
||||
allow(EdgeCache::BustEvents).to receive(:call)
|
||||
described_class.new.perform
|
||||
expect(EdgeCache::BustEvents).to have_received(:call)
|
||||
end
|
||||
end
|
||||
end
|
||||
Loading…
Add table
Reference in a new issue