summaryrefslogtreecommitdiff
path: root/help/app/models/ticket_selection.rb
blob: 74d5b78ab251840f0055e09e8a5dd32a2c7d92ed (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
class TicketSelection

  #
  # supported options:
  #
  # user_id:      id of the user (uuid string)
  # open_status:  open | closed | all
  # sort_order:   updated_at_desc | updated_at_asc | created_at_desc | created_at_asc
  # admin_status: mine | all
  # is_admin:     true | false
  #
  def initialize(options = {})
    @user_id      = options[:user_id].gsub /[^a-z0-9]/, ''
    @open_status  = allow options[:open_status],  'open', 'closed', 'all'
    @sort_order   = allow options[:sort_order],   'updated_at_desc', 'updated_at_asc', 'created_at_desc', 'created_at_asc'
    @admin_status = allow options[:admin_status], 'mine', 'all'
    @is_admin     = allow options[:is_admin],     false, true
  end

  def tickets
    Ticket.send(finder_method).startkey(startkey).endkey(endkey).send(order)
  end

  protected

  def allow(source, *allowed)
    if allowed.include?(source)
      source
    else
      allowed.first
    end
  end

  def finder_method
    method = 'by_'
    method += 'includes_post_by_and_' if only_mine?
    method += 'is_open_and_' if @open_status != 'all'
    method += @sort_order.sub(/_(de|a)sc$/, '')
  end

  def startkey
    startkeys = []
    startkeys << @user_id if only_mine?
    startkeys << (@open_status == 'open') if @open_status != 'all'
    startkeys << 0
    startkeys = startkeys.join if startkeys.length == 1 # want string not array if just one thing in array
    startkeys
  end

  def endkey
    endtime = Time.now + 2.days # TODO. this obviously isn't ideal
    if self.startkey.is_a?(Array)
      endkeys = self.startkey
      endkeys.pop
      endkeys << endtime
    else
      endtime
    end
  end

  def order
    # we have defined the ascending method to return the view itself:
    (@sort_order.end_with? 'desc') ? 'descending' : 'ascending'
  end


  def only_mine?
    !@is_admin || @admin_status == 'mine'
  end

end