Class: FileUpload::RedisFile

Inherits:
Object
  • Object
show all
Extended by:
ActiveModel::Naming
Defined in:
app/models/file_upload/redis_file.rb

Constant Summary collapse

FILE_EXPIRY =

1 hour

60 * 60

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(attrs = {}) ⇒ RedisFile

Returns a new instance of RedisFile.



11
12
13
14
15
# File 'app/models/file_upload/redis_file.rb', line 11

def initialize(attrs = {})
  attrs.each do |k, v|
    send("#{k}=", v) if respond_to?("#{k}=")
  end
end

Instance Attribute Details

#file_ioObject

Returns the value of attribute file_io.



8
9
10
# File 'app/models/file_upload/redis_file.rb', line 8

def file_io
  @file_io
end

#idObject



64
65
66
# File 'app/models/file_upload/redis_file.rb', line 64

def id
  @id ||= SecureRandom.random_number(1000000000)
end

#keyObject



60
61
62
# File 'app/models/file_upload/redis_file.rb', line 60

def key
  @key ||= self.class.base_key(id)
end

#nameObject



84
85
86
87
88
89
90
91
92
# File 'app/models/file_upload/redis_file.rb', line 84

def name
  @name ||= begin
    if file_io
      file_io.original_filename
    else
      nil
    end
  end
end

#typeObject



112
113
114
# File 'app/models/file_upload/redis_file.rb', line 112

def type
  @type ||= FileMagic.new(FileMagic::MAGIC_MIME_TYPE).buffer(data)
end

Class Method Details

.base_key(uuid) ⇒ Object



55
56
57
# File 'app/models/file_upload/redis_file.rb', line 55

def base_key(uuid)
  "redis_file:#{uuid}"
end

.data_key(base_key) ⇒ Object



43
44
45
# File 'app/models/file_upload/redis_file.rb', line 43

def data_key(base_key)
  "#{base_key}:data"
end

.find(uuid) ⇒ Object



35
36
37
# File 'app/models/file_upload/redis_file.rb', line 35

def find(uuid)
  find_by_id(uuid) || raise(ActiveRecord::RecordNotFound)
end

.find_by_id(uuid) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'app/models/file_upload/redis_file.rb', line 19

def find_by_id(uuid)
  key = base_key(uuid)
  name, type, size = redis.mget(name_key(key), type_key(key), size_key(key))
  if name && type && size
    new({
      id:   uuid,
      key:  key,
      name: name,
      type: type,
      size: size
    })
  else
    nil
  end
end

.name_key(base_key) ⇒ Object



39
40
41
# File 'app/models/file_upload/redis_file.rb', line 39

def name_key(base_key)
  "#{base_key}:name"
end

.size_key(base_key) ⇒ Object



51
52
53
# File 'app/models/file_upload/redis_file.rb', line 51

def size_key(base_key)
  "#{base_key}:size"
end

.type_key(base_key) ⇒ Object



47
48
49
# File 'app/models/file_upload/redis_file.rb', line 47

def type_key(base_key)
  "#{base_key}:type"
end

Instance Method Details

#dataObject



94
95
96
97
98
99
100
101
102
# File 'app/models/file_upload/redis_file.rb', line 94

def data
  @data ||= begin
    if file_io
      file_io.read
    elsif key
      redis.get(data_key)
    end
  end
end

#data=(data) ⇒ Object



104
105
106
# File 'app/models/file_upload/redis_file.rb', line 104

def data=(data)
  @data = data
end

#data_keyObject



68
69
70
# File 'app/models/file_upload/redis_file.rb', line 68

def data_key
  self.class.data_key(key)
end

#destroyObject



123
124
125
# File 'app/models/file_upload/redis_file.rb', line 123

def destroy
  redis.del(data_key, name_key, type_key, size_key)
end

#name_keyObject



72
73
74
# File 'app/models/file_upload/redis_file.rb', line 72

def name_key
  self.class.name_key(key)
end

#persisted?Boolean

Returns:

  • (Boolean)


145
146
147
# File 'app/models/file_upload/redis_file.rb', line 145

def persisted?
  redis.exists(data_key)
end

#saveObject



116
117
118
119
120
121
# File 'app/models/file_upload/redis_file.rb', line 116

def save
  redis.setex(data_key, FILE_EXPIRY, data)
  redis.setex(name_key, FILE_EXPIRY, name)
  redis.setex(type_key, FILE_EXPIRY, type)
  redis.setex(size_key, FILE_EXPIRY, size)
end

#sizeObject



108
109
110
# File 'app/models/file_upload/redis_file.rb', line 108

def size
  @size ||= data.size
end

#size_keyObject



80
81
82
# File 'app/models/file_upload/redis_file.rb', line 80

def size_key
  self.class.size_key(key)
end

#to_json(options = {}) ⇒ Object



127
128
129
130
131
132
133
134
135
# File 'app/models/file_upload/redis_file.rb', line 127

def to_json(options = {})
  {
    size: size,
    name: name,
    type: type,
    id: id,
    key: key
  }
end

#to_keyObject



137
138
139
# File 'app/models/file_upload/redis_file.rb', line 137

def to_key
  [key]
end

#to_paramObject



141
142
143
# File 'app/models/file_upload/redis_file.rb', line 141

def to_param
  id.to_s
end

#type_keyObject



76
77
78
# File 'app/models/file_upload/redis_file.rb', line 76

def type_key
  self.class.type_key(key)
end