Created
March 13, 2014 21:28
-
-
Save benphelps/9537343 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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