Make UI of signature page better

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
This commit is contained in:
Bryan Frimin
2025-10-15 14:03:48 +02:00
parent 84859446ab
commit 2f2c8ccd4b
5 changed files with 422 additions and 85 deletions

View File

@@ -377,15 +377,24 @@ func (s *DocumentService) ListSigningRequests(
SELECT
p.title,
pv.content,
pv.id AS document_version_id
pv.id AS document_version_id,
o.name AS organization_name
FROM
documents p
INNER JOIN document_versions pv ON pv.document_id = p.id
INNER JOIN document_version_signatures pvs ON pvs.document_version_id = pv.id
INNER JOIN organizations o ON o.id = p.organization_id
WHERE
p.tenant_id = $1
AND pvs.signed_by = $2
AND pvs.signed_at IS NULL
AND pv.status = 'PUBLISHED'
AND pv.version_number = (
SELECT MAX(pv2.version_number)
FROM document_versions pv2
WHERE pv2.document_id = pv.document_id
AND pv2.status = 'PUBLISHED'
)
`
var results []map[string]any

View File

@@ -122,6 +122,54 @@ func NewMux(
},
)
r.Get(
"/documents/signing-requests/{document_version_id}/pdf",
func(w http.ResponseWriter, r *http.Request) {
token := r.URL.Query().Get("token")
if token == "" {
http.Error(w, "token is required", http.StatusUnauthorized)
return
}
data, err := statelesstoken.ValidateToken[probo.SigningRequestData](authCfg.CookieSecret, probo.TokenTypeSigningRequest, token)
if err != nil {
http.Error(w, "invalid token", http.StatusUnauthorized)
return
}
documentVersionID, err := gid.ParseGID(chi.URLParam(r, "document_version_id"))
if err != nil {
http.Error(w, "invalid document version id", http.StatusBadRequest)
return
}
svc := proboSvc.WithTenant(data.Data.OrganizationID.TenantID())
// Get the people to get their email for watermark
people, err := svc.Peoples.Get(r.Context(), data.Data.PeopleID)
if err != nil {
http.Error(w, "failed to get user", http.StatusInternalServerError)
return
}
// Generate PDF with watermark
pdfData, err := svc.Documents.ExportPDF(r.Context(), documentVersionID, probo.ExportPDFOptions{
WithWatermark: true,
WatermarkEmail: &people.PrimaryEmailAddress,
WithSignatures: false,
})
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/pdf")
w.Header().Set("Content-Disposition", "inline; filename=\"document.pdf\"")
w.WriteHeader(http.StatusOK)
w.Write(pdfData)
},
)
r.Post(
"/documents/signing-requests/{document_version_id}/sign",
func(w http.ResponseWriter, r *http.Request) {