dont use S3 directly allow to use any document url (document service agnostic)
All checks were successful
Build and Publish / build-release (push) Successful in 1m30s
All checks were successful
Build and Publish / build-release (push) Successful in 1m30s
This commit is contained in:
@@ -13,7 +13,6 @@ defmodule ProviderServiceWeb.TemplateController do
|
||||
RemoveProviderTemplate
|
||||
}
|
||||
|
||||
alias ProviderService.S3
|
||||
alias ProviderServiceWeb.Schemas.Provider, as: PS
|
||||
|
||||
operation(:index,
|
||||
@@ -37,65 +36,41 @@ defmodule ProviderServiceWeb.TemplateController do
|
||||
end
|
||||
|
||||
operation(:upload_template,
|
||||
summary: "Upload solicitation template",
|
||||
description: "Upload a fillable PDF. Fields are auto-discovered via solicitation_service.",
|
||||
summary: "Register template by document URL",
|
||||
description: "Register a template document URL for a provider.",
|
||||
parameters: [
|
||||
provider_id: [in: :path, type: :string, required: true]
|
||||
],
|
||||
request_body:
|
||||
{"Multipart PDF upload", "multipart/form-data", PS.UploadTemplateRequest, required: true},
|
||||
{"Document URL payload", "application/json", PS.UploadTemplateRequest, required: true},
|
||||
responses: [
|
||||
created: {"Template registered", "application/json", PS.UploadTemplateResponse}
|
||||
]
|
||||
)
|
||||
|
||||
def upload_template(conn, %{"provider_id" => provider_id} = params) do
|
||||
# %Plug.Upload{}
|
||||
upload = params["file"]
|
||||
document_url = params["document_url"]
|
||||
policy_type = params["policy_type"]
|
||||
client_type = params["client_type"]
|
||||
|
||||
template_id = Ecto.UUID.generate()
|
||||
s3_key = "templates/#{provider_id}/#{policy_type}/#{client_type}/#{template_id}.pdf"
|
||||
|
||||
# Upload to S3/MinIO
|
||||
case S3.upload(upload.path, s3_key) do
|
||||
cmd = %AddProviderTemplate{
|
||||
provider_id: provider_id,
|
||||
template_id: template_id,
|
||||
client_type: client_type,
|
||||
policy_type: policy_type,
|
||||
document_url: document_url
|
||||
}
|
||||
|
||||
case ProviderService.CommandedApp.dispatch(cmd) do
|
||||
:ok ->
|
||||
# Discover AcroForm fields via solicitation_service
|
||||
fields = discover_fields(s3_key)
|
||||
|
||||
cmd = %AddProviderTemplate{
|
||||
provider_id: provider_id,
|
||||
template_id: template_id,
|
||||
client_type: client_type,
|
||||
policy_type: policy_type,
|
||||
s3_key: s3_key,
|
||||
fields: fields
|
||||
}
|
||||
|
||||
case ProviderService.CommandedApp.dispatch(cmd) do
|
||||
:ok ->
|
||||
conn
|
||||
|> put_status(:created)
|
||||
|> json(%{template_id: template_id, s3_key: s3_key, fields: fields})
|
||||
|
||||
{:error, reason} ->
|
||||
conn |> put_status(:unprocessable_entity) |> json(%{error: reason})
|
||||
end
|
||||
conn
|
||||
|> put_status(:created)
|
||||
|> json(%{template_id: template_id, document_url: document_url})
|
||||
|
||||
{:error, reason} ->
|
||||
conn
|
||||
|> put_status(:internal_server_error)
|
||||
|> json(%{error: "S3 upload failed: #{reason}"})
|
||||
end
|
||||
end
|
||||
|
||||
defp discover_fields(s3_key) do
|
||||
url = Application.get_env(:provider_service, :solicitation_service_url)
|
||||
|
||||
case Req.get("#{url}/api/solicitations/templates/fields", params: [s3_key: s3_key]) do
|
||||
{:ok, %{status: 200, body: %{"fields" => fields}}} -> fields
|
||||
_ -> []
|
||||
conn |> put_status(:unprocessable_entity) |> json(%{error: reason})
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user