Add document classification filter

Add classification as a filter-only field on documents, resolved from
the latest document version. Expose in GraphQL, MCP, and document list
UI with a selector alongside the document type filter.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
This commit is contained in:
Sacha Al Himdani
2026-03-31 16:11:49 +02:00
parent 4a6cbdc97b
commit 2d11038232
6 changed files with 93 additions and 24 deletions

View File

@@ -28,6 +28,7 @@ type (
userEmail *mail.Addr
approverIdentityID *gid.GID
documentTypes []DocumentType
classifications []DocumentClassification
status []DocumentStatus
}
)
@@ -70,6 +71,11 @@ func (f *DocumentFilter) WithDocumentTypes(documentTypes []DocumentType) *Docume
return f
}
func (f *DocumentFilter) WithClassifications(classifications []DocumentClassification) *DocumentFilter {
f.classifications = classifications
return f
}
func (f *DocumentFilter) WithStatus(status []DocumentStatus) *DocumentFilter {
f.status = status
return f
@@ -92,6 +98,14 @@ func (f *DocumentFilter) SQLArguments() pgx.NamedArgs {
}
}
var classifications []string
if f.classifications != nil {
classifications = make([]string, len(f.classifications))
for i, c := range f.classifications {
classifications[i] = c.String()
}
}
var status []string
if f.status != nil {
status = make([]string, len(f.status))
@@ -107,6 +121,7 @@ func (f *DocumentFilter) SQLArguments() pgx.NamedArgs {
"user_email": f.userEmail,
"approver_identity_id": f.approverIdentityID,
"document_types": documentTypes,
"classifications": classifications,
"document_status": status,
}
}
@@ -169,6 +184,18 @@ func (f *DocumentFilter) SQLFragment() string {
ELSE TRUE
END
AND
CASE
WHEN @classifications::document_classification[] IS NOT NULL THEN
(
SELECT dv.classification
FROM document_versions dv
WHERE dv.document_id = documents.id
ORDER BY dv.major DESC, dv.minor DESC
LIMIT 1
) = ANY(@classifications::document_classification[])
ELSE TRUE
END
AND
CASE
WHEN @document_status::text[] IS NULL THEN TRUE
ELSE status::text = ANY(@document_status::text[])