Skip to content

Commit f7c3f7d

Browse files
authored
FIX-216: Allow passing optional file_id while uploading to gridfs (#217)
1 parent 64f8ea1 commit f7c3f7d

File tree

3 files changed

+25
-8
lines changed

3 files changed

+25
-8
lines changed

lib/mongo/grid_fs/upload.ex

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ defmodule Mongo.GridFs.Upload do
77

88
@doc """
99
Opens a stream that the application can write the contents of the file to.
10-
The driver generates the file id.
10+
The driver generates the file id if not provided.
1111
1212
User data for the 'metadata' field of the files collection document.
1313
"""
14-
@spec open_upload_stream(Mongo.GridFs.Bucket.t(), String.t(), BSON.document() | nil) :: UploadStream.t()
15-
def open_upload_stream(bucket, filename, meta \\ nil) do
16-
UploadStream.new(bucket, filename, meta)
14+
@spec open_upload_stream(Mongo.GridFs.Bucket.t(), String.t(), BSON.document() | nil, UploadStream.file_id() | nil) :: UploadStream.t()
15+
def open_upload_stream(bucket, filename, meta \\ nil, file_id \\ nil) do
16+
UploadStream.new(bucket, filename, meta, file_id)
1717
end
1818
end

lib/mongo/grid_fs/upload_stream.ex

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@ defmodule Mongo.GridFs.UploadStream do
2020
alias Mongo.GridFs.Bucket
2121
alias Mongo.GridFs.UploadStream
2222

23+
@type file_id :: BSON.ObjectId.t() | binary()
2324
@type t :: %__MODULE__{
2425
bucket: Bucket.t(),
25-
id: BSON.ObjectId.t(),
26+
id: file_id(),
2627
filename: String.t(),
2728
metadata: {BSON.document() | nil}
2829
}
@@ -31,9 +32,9 @@ defmodule Mongo.GridFs.UploadStream do
3132
@doc """
3233
Creates a new upload stream to insert a file into the grid-fs.
3334
"""
34-
@spec new(Bucket.t(), String.t(), BSON.document() | nil) :: UploadStream.t()
35-
def new(bucket, filename, metadata \\ nil) do
36-
%UploadStream{bucket: bucket, filename: filename, id: Mongo.object_id(), metadata: metadata}
35+
@spec new(Bucket.t(), String.t(), BSON.document() | nil, file_id() | nil) :: UploadStream.t()
36+
def new(bucket, filename, metadata \\ nil, file_id \\ nil) do
37+
%UploadStream{bucket: bucket, filename: filename, id: file_id || Mongo.object_id(), metadata: metadata}
3738
end
3839

3940
defimpl Collectable, for: UploadStream do

test/mongo/grid_fs/upload_test.exs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,22 @@ defmodule Mongo.GridFs.UploadTest do
8888
assert x == chksum
8989
end
9090

91+
test "upload a text file with custom id, check download, length, meta-data and checksum", c do
92+
src_filename = "./test/data/test.txt"
93+
bucket = Bucket.new(c.pid, j: true, w: :majority)
94+
chksum = calc_checksum(src_filename)
95+
file_id = Mongo.object_id()
96+
97+
upload_stream = Upload.open_upload_stream(bucket, "my-example-file.txt", %{tag: "checked", chk_sum: chksum}, file_id)
98+
99+
File.stream!(src_filename, [], 512) |> Stream.into(upload_stream) |> Stream.run()
100+
101+
assert file_id == upload_stream.id
102+
103+
%{"metadata" => %{"tag" => "checked", "chk_sum" => x}} = Mongo.find_one(c.pid, Bucket.files_collection_name(bucket), %{_id: file_id})
104+
assert x == chksum
105+
end
106+
91107
@tag :mongo_4_2
92108
@tag :rs_required
93109
test "upload a text file, check download, length, meta-data and checksum transaction", c do

0 commit comments

Comments
 (0)