Files
provider-service/lib/provider_service_web/schemas/provider.ex
HaimKortovich d66a8805d0
All checks were successful
Build and Publish / build-release (push) Successful in 1m30s
dont use S3 directly allow to use any document url (document service agnostic)
2026-04-29 12:18:52 -05:00

209 lines
5.5 KiB
Elixir

defmodule ProviderServiceWeb.Schemas.Provider do
alias OpenApiSpex.Schema
defmodule PaginationMeta do
require OpenApiSpex
OpenApiSpex.schema(%{
title: "PaginationMeta",
type: :object,
properties: %{
total_count: %Schema{type: :integer},
total_pages: %Schema{type: :integer},
current_page: %Schema{type: :integer},
page_size: %Schema{type: :integer},
has_next: %Schema{type: :boolean},
has_prev: %Schema{type: :boolean}
}
})
end
defmodule Template do
require OpenApiSpex
OpenApiSpex.schema(%{
title: "Template",
type: :object,
properties: %{
template_id: %Schema{type: :string, format: :uuid},
policy_type: %Schema{type: :string, enum: ["car", "life", "fire"]},
client_type: %Schema{type: :string, enum: ["natural", "juridico"]},
document_url: %Schema{type: :string},
active: %Schema{type: :boolean}
}
})
end
defmodule RegisterProvider do
require OpenApiSpex
OpenApiSpex.schema(%{
title: "RegisterProvider",
type: :object,
required: [:provider_id, :name],
properties: %{
provider_id: %Schema{
type: :string,
pattern: "^[a-zA-Z0-9]+$",
description: "Alphanumeric ID for the provider"
},
name: %Schema{type: :string, example: "Seguros ABC"},
email: %Schema{type: :string, format: :email},
phone: %Schema{type: :string},
contact_name: %Schema{type: :string},
ruc: %Schema{type: :string},
address: %Schema{type: :string}
}
})
end
defmodule UpdateProvider do
require OpenApiSpex
OpenApiSpex.schema(%{
title: "UpdateProvider",
type: :object,
properties: %{
name: %Schema{type: :string},
email: %Schema{type: :string, format: :email},
phone: %Schema{type: :string},
contact_name: %Schema{type: :string},
ruc: %Schema{type: :string},
address: %Schema{type: :string}
}
})
end
defmodule UploadTemplateRequest do
require OpenApiSpex
OpenApiSpex.schema(%{
title: "UploadTemplateRequest",
type: :object,
required: [:document_url, :policy_type, :client_type],
properties: %{
document_url: %Schema{
type: :string,
description: "URL to the uploaded document"
},
policy_type: %Schema{
type: :string,
enum: ["car", "life", "fire"],
description: "Policy type this template applies to"
},
client_type: %Schema{
type: :string,
enum: ["natural", "juridico"],
description: "Client type this template applies to"
}
}
})
end
defmodule UploadTemplateResponse do
require OpenApiSpex
OpenApiSpex.schema(%{
title: "UploadTemplateResponse",
type: :object,
properties: %{
template_id: %Schema{type: :string, format: :uuid},
document_url: %Schema{type: :string}
}
})
end
# templates: %{ policy_type => %{ client_type => [Template] } }
# default_templates: %{ policy_type => %{ client_type => template_id } }
defmodule ClientTypeTemplates do
require OpenApiSpex
OpenApiSpex.schema(%{
title: "ClientTypeTemplates",
type: :object,
description: "Map of client_type (natural | juridico) to list of templates",
properties: %{
natural: %Schema{type: :array, items: Template, nullable: true},
juridico: %Schema{type: :array, items: Template, nullable: true}
}
})
end
defmodule ClientTypeDefaults do
require OpenApiSpex
OpenApiSpex.schema(%{
title: "ClientTypeDefaults",
type: :object,
description: "Map of client_type (natural | juridico) to default template_id",
properties: %{
natural: %Schema{type: :string, format: :uuid, nullable: true},
juridico: %Schema{type: :string, format: :uuid, nullable: true}
}
})
end
defmodule ProviderData do
require OpenApiSpex
OpenApiSpex.schema(%{
title: "ProviderData",
type: :object,
properties: %{
provider_id: %Schema{type: :string, format: :uuid},
name: %Schema{type: :string},
email: %Schema{type: :string},
phone: %Schema{type: :string},
contact_name: %Schema{type: :string},
ruc: %Schema{type: :string},
address: %Schema{type: :string},
active: %Schema{type: :boolean},
templates: %Schema{
type: :object,
description: "Map of policy_type (car | life | fire) to client_type map of templates",
properties: %{
car: ClientTypeTemplates,
life: ClientTypeTemplates,
fire: ClientTypeTemplates
}
},
default_templates: %Schema{
type: :object,
description: "Map of policy_type to client_type to default template_id",
properties: %{
car: ClientTypeDefaults,
life: ClientTypeDefaults,
fire: ClientTypeDefaults
}
}
}
})
end
defmodule ProviderResponse do
require OpenApiSpex
OpenApiSpex.schema(%{
title: "ProviderResponse",
type: :object,
properties: %{
data: ProviderData
}
})
end
defmodule ProviderListResponse do
require OpenApiSpex
OpenApiSpex.schema(%{
title: "ProviderListResponse",
type: :object,
properties: %{
data: %Schema{type: :array, items: ProviderData},
meta: PaginationMeta
}
})
end
end