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

This commit is contained in:
2026-04-29 12:18:52 -05:00
parent 8782f957b0
commit d66a8805d0
16 changed files with 78 additions and 196 deletions

View File

@@ -13,16 +13,11 @@ defmodule ProviderServiceWeb.ProviderController do
}
alias ProviderServiceWeb.Schemas.Provider, as: PS
alias ProviderServiceWeb.QueryHelpers
operation(:index,
summary: "List providers",
parameters: [
"page[number]": [in: :query, type: :integer, required: false],
"page[size]": [in: :query, type: :integer, required: false],
"filters[0][field]": [in: :query, type: :string, required: false],
"filters[0][op]": [in: :query, type: :string, required: false],
"filters[0][value]": [in: :query, type: :string, required: false]
],
parameters: QueryHelpers.flop([:active, :search], [:name, :inserted_at]),
responses: [
ok: {"Provider list", "application/json", PS.ProviderListResponse}
]

View File

@@ -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