Skip to content

Instantly share code, notes, and snippets.

@benphelps
Created March 13, 2014 21:28
Show Gist options
  • Save benphelps/9537343 to your computer and use it in GitHub Desktop.
Save benphelps/9537343 to your computer and use it in GitHub Desktop.
class Ticket < ActiveRecord::Base
include AASM
belongs_to :user
has_many :messages
attr_accessor :message
validates :message, presence: true
validates :name, presence: true
aasm do
state :staff, :initial => true
state :customer
state :open
state :closed
event :customer_response do
transitions :from => :staff, :to => :customer
end
event :staff_response do
transitions :from => :customer, :to => :staff
end
event :open do
transitions :from => :closed, :to => :customer
end
event :close do
transitions :from => [:customer, :staff], :to => :closed
end
end
def state
'Unknown'
case aasm_state
when 'customer' then 'Customer Response'
when 'staff' then 'Staff Response'
when 'closed' then 'Closed'
when 'open' then 'Open'
end
end
def background(message)
case
when message.visible == false then 'bg-warning'
when self.resolved == message.id then 'bg-success'
end
end
def message=(message)
@message = messages.first
@message.message = message
@message.save
end
def message
if messages.first
messages.first.message
end
end
end
class TicketsController < ApplicationController
before_action :set_ticket, only: [:show, :edit, :update, :destroy, :open, :close]
before_action :set_ticket_by_message, only: [:resolve, :unresolve]
before_filter :authenticate_user!
# GET /tickets
def index
if current_user.admin?
@open = Ticket.where('aasm_state != ?', 'closed')
@closed = Ticket.where(aasm_state: 'closed')
else
@open = current_user.tickets.where('aasm_state != ?', 'closed')
@closed = current_user.tickets.where(aasm_state: 'closed')
end
end
# GET /tickets/1
def show
end
# GET /tickets/new
def new
@ticket = Ticket.new
end
# GET /tickets/1/edit
def edit
end
# POST /tickets
def create
@ticket = Ticket.new(user: current_user, name: ticket_params[:name], priority: ticket_params[:priority])
@ticket.messages.new(user: current_user, message: ticket_params[:message])
current_user.tickets << @ticket
@ticket.customer_response
if @ticket.save
redirect_to @ticket, notice: 'Ticket was successfully created.'
else
render action: 'new'
end
end
# GET /tickets/open
def open
if @ticket.open!
redirect_to @ticket, notice: 'Ticket was successfully opened.'
else
render action: 'edit'
end
end
# GET /tickets/close
def close
if @ticket.close!
redirect_to @ticket, notice: 'Ticket was successfully closed.'
else
render action: 'edit'
end
end
# GET /tickets/resolve
def resolve
if @ticket.update(resolved: @message.id)
redirect_to @ticket, notice: 'Ticket was successfully resloved.'
else
render action: 'edit'
end
end
# GET /tickets/unresolve
def unresolve
if @ticket.update(resolved: nil)
redirect_to @ticket, notice: 'Ticket was successfully unresloved.'
else
render action: 'edit'
end
end
# PATCH/PUT /tickets/1
def update
if @ticket.update(ticket_params)
redirect_to @ticket, notice: 'Ticket was successfully updated.'
else
render action: 'edit'
end
end
# DELETE /tickets/1
def destroy
@ticket.close!
redirect_to tickets_url
end
private
def set_ticket
if current_user.admin?
@ticket = Ticket.find(params[:id])
@message = Message.new(ticket_id: @ticket.id, user_id: current_user.id)
else
@ticket = current_user.tickets.find(params[:id])
@message = Message.new(ticket_id: @ticket.id, user_id: current_user.id)
end
end
def set_ticket_by_message
if current_user.admin?
@message = Message.find(params[:id])
@ticket = @message.ticket
else
@message = Message.find(params[:id])
if @message.ticket.user != current_user
redirect_to '/'
end
if @message
@ticket = @message.ticket
end
end
end
# Never trust parameters from the scary internet, only allow the white list through.
def ticket_params
params.require(:ticket).permit(:name, :message, :priority_id)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment