Skip to content

Commit

Permalink
Merge 4d12dd2 into b7b2098
Browse files Browse the repository at this point in the history
  • Loading branch information
KrainNeun committed Sep 4, 2019
2 parents b7b2098 + 4d12dd2 commit 75b6e48
Show file tree
Hide file tree
Showing 10 changed files with 132 additions and 1 deletion.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,5 @@ erl_crash.dump
/config/*.secret.exs

/.idea

/config/test_credential.json
3 changes: 3 additions & 0 deletions config/test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -64,4 +64,7 @@ config :materia, Materia.Accounts,
config :materia, Materia.Plug.ApplicationKeyChecker,
app_key: "test_app_key"

config :goth, config_module: Materia.Files.GoogleCloudPlatformConfigStub
#config :goth, config_module: Materia.Files.GoogleCloudPlatformConfig

config :materia, bucket_id: System.get_env("BUCKET_ID")
7 changes: 7 additions & 0 deletions lib/materia/files/google_cloud_platform_config.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
defmodule Materia.Files.GoogleCloudPlatformConfig do
use Goth.Config

def init(config) do
{:ok, Keyword.put(config, :json, System.get_env("GCP_JSON_CREDENTIALS") |> File.read!)}
end
end
13 changes: 13 additions & 0 deletions lib/materia/files/google_cloud_platform_config_stub.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
defmodule Materia.Files.GoogleCloudPlatformConfigStub do
use Goth.Config

def init(config) do
{:ok, json} = Poison.encode(
%{
project_id: "",
private_key: "",
}
)
{:ok, Keyword.put(config, :json, json)}
end
end
65 changes: 65 additions & 0 deletions lib/materia/files/google_cloud_storage.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
defmodule Materia.Files.GoogleCloudStorage do
@moduledoc false
alias MateriaUtils.String.StringUtil
alias Materia.Errors.BusinessError

@doc false
def upload_file_private(params) do
params
|> check_file_params()
|> upload([{:predefinedAcl, "private"}])
end

@doc false
def upload_file_public(params) do
params
|> check_file_params()
|> upload([{:predefinedAcl, "publicread"}])
end

@doc false
defp check_file_params(params) do
if StringUtil.is_empty(params["file"]) do
raise BusinessError, message: "file not found."
else
params
end
end

@doc false
defp get_connection() do
{:ok, token} = Goth.Token.for_scope("https://www.googleapis.com/auth/cloud-platform")
GoogleApi.Storage.V1.Connection.new(token.token)
end

@doc false
defp upload(params, optional_params) do
file = params["file"]
directory_name = params["directory"]
file_name =
if StringUtil.is_empty(directory_name) do
"#{UUID.uuid4()}/#{file.filename}"
else
"#{directory_name}/#{UUID.uuid4()}/#{file.filename}"
end
{:ok, object} = GoogleApi.Storage.V1.Api.Objects.storage_objects_insert_simple(
get_connection(),
get_bucket_id(),
"multipart",
%{name: file_name, contentType: file.content_type},
file.path,
optional_params
)
object
end

@doc false
defp get_bucket_id() do
bucket_id = Application.get_env(:materia, :bucket_id)
if StringUtil.is_empty(bucket_id) do
raise BusinessError, message: "bucket_id not found."
else
bucket_id
end
end
end
17 changes: 17 additions & 0 deletions lib/materia_web/controllers/file_controller.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
defmodule MateriaWeb.FileController do
use MateriaWeb, :controller

alias Materia.Files.GoogleCloudStorage

action_fallback MateriaWeb.FallbackController

def upload_file_public(conn, params) do
upload = GoogleCloudStorage.upload_file_public(params)
render(conn, "file.json", upload: upload)
end

def upload_file_private(conn, params) do
upload = GoogleCloudStorage.upload_file_private(params)
render(conn, "file.json", upload: upload)
end
end
2 changes: 2 additions & 0 deletions lib/materia_web/router.ex
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,8 @@ defmodule MateriaWeb.Router do
post "/search-accounts", AccountController, :list_accounts_by_params
resources "/value-definitions", ValueDefinitionController, except: [:new, :edit]
post "/search-definitions", ValueDefinitionController, :list_definitions_by_params
post "/upload-file-public", FileController, :upload_file_public
post "/upload-file-private", FileController, :upload_file_private
end

scope "/api", MateriaWeb do
Expand Down
11 changes: 11 additions & 0 deletions lib/materia_web/views/file_view.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
defmodule MateriaWeb.FileView do
use MateriaWeb, :view

def render("file.json", %{upload: upload}) do
%{
name: upload.name,
content_type: upload.contentType,
url: "https://storage.googleapis.com/#{upload.bucket}/#{upload.name}"
}
end
end
4 changes: 4 additions & 0 deletions mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,10 @@ defmodule Materia.Mixfile do
{:materia_utils, git: "https://github.com/karabiner-inc/materia_utils.git"},
{:ex_doc, ">= 0.0.0", only: :test},
{:excoveralls, "~> 0.10", only: :test},
{:google_api_storage, "~> 0.11.0"},
{:goth, "~> 1.1"},
{:uuid, "~> 1.1"},
{:credo, "~> 1.0.0", only: :test, runtime: false},
]
end

Expand Down
9 changes: 8 additions & 1 deletion mix.lock
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
%{
"base64url": {:hex, :base64url, "0.0.1", "36a90125f5948e3afd7be97662a1504b934dd5dac78451ca6e9abf85a10286be", [:rebar], [], "hexpm"},
"bcrypt_elixir": {:hex, :bcrypt_elixir, "1.0.7", "e79d84b666bfad0e461ed217860e1c7de6bc4a1ae919cdb39d473ca784817653", [:make, :mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"},
"bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], [], "hexpm"},
"certifi": {:hex, :certifi, "2.5.1", "867ce347f7c7d78563450a18a6a28a8090331e77fa02380b4a21962a65d36ee5", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm"},
"combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm"},
"comeonin": {:hex, :comeonin, "4.1.1", "c7304fc29b45b897b34142a91122bc72757bc0c295e9e824999d5179ffc08416", [:mix], [{:argon2_elixir, "~> 1.2", [hex: :argon2_elixir, repo: "hexpm", optional: true]}, {:bcrypt_elixir, "~> 0.12.1 or ~> 1.0", [hex: :bcrypt_elixir, repo: "hexpm", optional: true]}, {:pbkdf2_elixir, "~> 0.12", [hex: :pbkdf2_elixir, repo: "hexpm", optional: true]}], "hexpm"},
"connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm"},
"cowboy": {:hex, :cowboy, "1.1.2", "61ac29ea970389a88eca5a65601460162d370a70018afe6f949a29dca91f3bb0", [:rebar3], [{:cowlib, "~> 1.0.2", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.3.2", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm"},
"cowlib": {:hex, :cowlib, "1.0.2", "9d769a1d062c9c3ac753096f868ca121e2730b9a377de23dec0f7e08b1df84ee", [:make], [], "hexpm"},
"credo": {:hex, :credo, "1.0.5", "fdea745579f8845315fe6a3b43e2f9f8866839cfbc8562bb72778e9fdaa94214", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm"},
"db_connection": {:hex, :db_connection, "1.1.3", "89b30ca1ef0a3b469b1c779579590688561d586694a3ce8792985d4d7e575a61", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm"},
"decimal": {:hex, :decimal, "1.7.0", "30d6b52c88541f9a66637359ddf85016df9eb266170d53105f02e4a67e00c5aa", [:mix], [], "hexpm"},
"earmark": {:hex, :earmark, "1.2.5", "4d21980d5d2862a2e13ec3c49ad9ad783ffc7ca5769cf6ff891a4553fbaae761", [:mix], [], "hexpm"},
Expand All @@ -16,15 +18,19 @@
"excoveralls": {:hex, :excoveralls, "0.10.3", "b090a3fbcb3cfa136f0427d038c92a9051f840953ec11b40ee74d9d4eac04d1e", [:mix], [{:hackney, "~> 1.13", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm"},
"file_system": {:hex, :file_system, "0.2.5", "a3060f063b116daf56c044c273f65202e36f75ec42e678dc10653056d3366054", [:mix], [], "hexpm"},
"gettext": {:hex, :gettext, "0.16.1", "e2130b25eebcbe02bb343b119a07ae2c7e28bd4b146c4a154da2ffb2b3507af2", [:mix], [], "hexpm"},
"google_api_storage": {:hex, :google_api_storage, "0.11.0", "e94b524905191378e9159476e7d8159af31601a409c74acac997fb58db92a7d3", [:mix], [{:google_gax, "~> 0.2", [hex: :google_gax, repo: "hexpm", optional: false]}], "hexpm"},
"google_gax": {:hex, :google_gax, "0.2.0", "2017530e1b38cd157e7681452763c56bfdb3c2081ef65a38456452654791d496", [:mix], [{:poison, ">= 1.0.0 and < 4.0.0", [hex: :poison, repo: "hexpm", optional: false]}, {:tesla, "~> 1.2", [hex: :tesla, repo: "hexpm", optional: false]}], "hexpm"},
"goth": {:hex, :goth, "1.1.0", "85977656822e54217bc0472666f1ce15dc3921495ef5f4f0774ef15503bae207", [:mix], [{:httpoison, "~> 0.11 or ~> 1.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:joken, "~> 2.0", [hex: :joken, repo: "hexpm", optional: false]}], "hexpm"},
"guardian": {:hex, :guardian, "1.1.1", "be14c4007eaf05268251ae114030cb7237ed9a9631c260022f020164ff4ed733", [:mix], [{:jose, "~> 1.8", [hex: :jose, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.0 or ~> 1.2 or ~> 1.3", [hex: :phoenix, repo: "hexpm", optional: true]}, {:plug, "~> 1.3.3 or ~> 1.4", [hex: :plug, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: false]}], "hexpm"},
"guardian_backdoor": {:hex, :guardian_backdoor, "1.0.0", "d82a8b967fbcfc37be9c88a8f3597426ac3c9171beb258b2092a0185cd8645cc", [:mix], [{:guardian, "~> 1.0", [hex: :guardian, repo: "hexpm", optional: false]}, {:plug, "~> 1.3.3 or ~> 1.4", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"},
"guardian_db": {:hex, :guardian_db, "1.1.0", "45ab94206cce38f7443dc27de6dc52966ccbdeff65ca1b1f11a6d8f3daceb556", [:mix], [{:ecto, "~> 2.2", [hex: :ecto, repo: "hexpm", optional: false]}, {:guardian, "~> 1.0", [hex: :guardian, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.13", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm"},
"hackney": {:hex, :hackney, "1.15.1", "9f8f471c844b8ce395f7b6d8398139e26ddca9ebc171a8b91342ee15a19963f4", [:rebar3], [{:certifi, "2.5.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.4", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm"},
"httpoison": {:hex, :httpoison, "1.4.0", "e0b3c2ad6fa573134e42194d13e925acfa8f89d138bc621ffb7b1989e6d22e73", [:mix], [{:hackney, "~> 1.8", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm"},
"idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm"},
"jason": {:hex, :jason, "1.1.2", "b03dedea67a99223a2eaf9f1264ce37154564de899fd3d8b9a21b1a6fd64afe7", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm"},
"joken": {:hex, :joken, "2.0.0", "ff10fca10ec539d7a73874da303f4a7a975fea53fcd59b1b89dda2a71ecb4c6b", [:mix], [{:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:jose, "~> 1.8", [hex: :jose, repo: "hexpm", optional: false]}], "hexpm"},
"jose": {:hex, :jose, "1.8.4", "7946d1e5c03a76ac9ef42a6e6a20001d35987afd68c2107bcd8f01a84e75aa73", [:mix, :rebar3], [{:base64url, "~> 0.0.1", [hex: :base64url, repo: "hexpm", optional: false]}], "hexpm"},
"materia_utils": {:git, "https://github.com/karabiner-inc/materia_utils.git", "f8414a32748ca5b04dc51a8622d2dd34f8dd792a", []},
"materia_utils": {:git, "https://github.com/karabiner-inc/materia_utils.git", "d512cdafd34a169915bb0da42478caf0e4433fa6", []},
"metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm"},
"mime": {:hex, :mime, "1.3.0", "5e8d45a39e95c650900d03f897fbf99ae04f60ab1daa4a34c7a20a5151b7a5fe", [:mix], [], "hexpm"},
"mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm"},
Expand All @@ -44,6 +50,7 @@
"ranch": {:hex, :ranch, "1.3.2", "e4965a144dc9fbe70e5c077c65e73c57165416a901bd02ea899cfd95aa890986", [:rebar3], [], "hexpm"},
"sendgrid": {:hex, :sendgrid, "1.8.0", "d483f9029164da5ad58e474b8c18955afc51c785923f8d1f46b6f716b576206d", [:mix], [{:httpoison, ">= 0.11.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:poison, ">= 2.0.0 or >= 3.0.0", [hex: :poison, repo: "hexpm", optional: false]}], "hexpm"},
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.4", "f0eafff810d2041e93f915ef59899c923f4568f4585904d010387ed74988e77b", [:make, :mix, :rebar3], [], "hexpm"},
"tesla": {:hex, :tesla, "1.2.1", "864783cc27f71dd8c8969163704752476cec0f3a51eb3b06393b3971dc9733ff", [:mix], [{:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "~> 4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}], "hexpm"},
"timex": {:hex, :timex, "3.5.0", "b0a23167da02d0fe4f1a4e104d1f929a00d348502b52432c05de875d0b9cffa5", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 0.1.8 or ~> 0.5", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm"},
"tzdata": {:hex, :tzdata, "0.5.20", "304b9e98a02840fb32a43ec111ffbe517863c8566eb04a061f1c4dbb90b4d84c", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm"},
"unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm"},
Expand Down

0 comments on commit 75b6e48

Please sign in to comment.