Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

Commit

Permalink
added deduping feature
Browse files Browse the repository at this point in the history
  • Loading branch information
neko committed Jan 21, 2017
1 parent d48c190 commit 66ea772
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 19 deletions.
1 change: 1 addition & 0 deletions migrations/m20170121002508_create_column_in_uploads.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ALTER TABLE uploads ADD COLUMN hash text;
24 changes: 20 additions & 4 deletions src/pomf/controllers/upload_controller.cr
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,29 @@ module Pomf

size, hash = write_file(file_path, io)

url = URI.parse Pomf.upload_url
Pomf.db.connection do |db|
file_exists = db.exec("SELECT FROM uploads WHERE hash = $1", [hash]).rows

if file_exists.size > 0
file = Models::Upload.where("hash = $1", [hash])

if file
if File.exists?(File.join(upload_dir, file.filename))
file_name = file.filename

if File.exists?(file_path)
File.delete(file_path)
end
end
end
else
Models::Upload.new(file_name, size.to_i64, hash, metadata.filename, user).create!
end
end

url = URI.parse Pomf.upload_url
url.path = "/#{file_name}"

url = url.to_s

Models::Upload.new(file_name, size.to_i64, metadata.filename, user).create!
files << {name: metadata.filename, url: url.to_s, hash: hash, size: size.to_i64}
end
end
Expand Down
31 changes: 16 additions & 15 deletions src/pomf/models/upload.cr
Original file line number Diff line number Diff line change
Expand Up @@ -3,48 +3,49 @@ module Pomf::Models
getter id : Int32
getter user_id : Int32?
property filename : String
property hash : String?
getter original_filename : String?
getter size : Int64
getter created : Time

def self.new(filename, size, original_filename = nil, user_id : Int? = nil)
new(-1, user_id, filename, original_filename, size, Time.now)
def self.new(filename, size, hash, original_filename = nil, user_id : Int? = nil)
new(-1, user_id, filename, original_filename, size, hash, Time.now)
end

def self.new(id, user_id, filename, size, created, original_filename = nil)
new(id, user_id, filename, original_filename, size, created)
def self.new(id, user_id, filename, size, hash, created, original_filename = nil)
new(id, user_id, filename, original_filename, size, hash, created)
end

def self.new(filename, size, original_filename = nil, user : User? = nil)
new(filename, size, original_filename, user.try &.id)
def self.new(filename, size, hash, original_filename = nil, user : User? = nil)
new(filename, size, hash, original_filename, user.try &.id)
end

def self.where(query : String, params = [] of Nil)
Pomf.db.connection do |db|
query = "SELECT id, user_id, filename, original_filename, size, created FROM uploads WHERE #{query} LIMIT 1"
rows = db.exec({Int32, Int32 | Nil, String, String | Nil, Int64, Time}, query, params).rows
query = "SELECT id, user_id, filename, original_filename, size, hash, created FROM uploads WHERE #{query} LIMIT 1"
rows = db.exec({Int32, Int32 | Nil, String, String | Nil, Int64, String | Nil, Time}, query, params).rows

!rows.empty? ? Upload.new(*rows.first) : nil
end
end

def self.where_multi(query : String, params = [] of Nil)
Pomf.db.connection do |db|
query = "SELECT id, user_id, filename, original_filename, size, created FROM uploads WHERE #{query}"
rows = db.exec({Int32, Int32 | Nil, String, String | Nil, Int64, Time}, query, params).rows
query = "SELECT id, user_id, filename, original_filename, size, hash, created FROM uploads WHERE #{query}"
rows = db.exec({Int32, Int32 | Nil, String, String | Nil, Int64, String | Nil, Time}, query, params).rows
rows.map { |row| Upload.new(*row) }
end
end

def initialize(@id, @user_id, @filename, @original_filename, @size, @created)
def initialize(@id, @user_id, @filename, @original_filename, @size, @hash, @created)
end

def save
raise "Record has not been created" if @id == -1

Pomf.db.connection do |db|
db.exec("UPDATE uploads SET (user_id, filename, original_filename, size, created) = ($1, $2, $3, $4, $5) WHERE id = $6", [
@user_id, @filename, @original_filename, @size, @created, @id,
db.exec("UPDATE uploads SET (user_id, filename, original_filename, size, hash, created) = ($1, $2, $3, $4, $5, $6) WHERE id = $6", [
@user_id, @filename, @original_filename, @size, @hash, @created, @id,
])
end

Expand All @@ -55,8 +56,8 @@ module Pomf::Models
raise "Record already created" unless @id == -1

Pomf.db.connection do |db|
result = db.exec({Int32}, "INSERT INTO uploads (user_id, filename, original_filename, size, created) VALUES ($1, $2, $3, $4, $5) RETURNING id", [
@user_id, @filename, @original_filename, @size, @created,
result = db.exec({Int32}, "INSERT INTO uploads (user_id, filename, original_filename, size, hash, created) VALUES ($1, $2, $3, $4, $5, $6) RETURNING id", [
@user_id, @filename, @original_filename, @size, @hash, @created,
])

@id = result.rows.first[0]
Expand Down

0 comments on commit 66ea772

Please sign in to comment.