Drop request by

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
This commit is contained in:
Sacha Al Himdani
2025-09-26 09:07:51 +02:00
parent 18e640a4dd
commit 07b931c66c
10 changed files with 7 additions and 201 deletions

View File

@@ -34,7 +34,6 @@ type (
SignedBy gid.GID `json:"signed_by"` SignedBy gid.GID `json:"signed_by"`
SignedAt *time.Time `json:"signed_at"` SignedAt *time.Time `json:"signed_at"`
RequestedAt time.Time `json:"requested_at"` RequestedAt time.Time `json:"requested_at"`
RequestedBy gid.GID `json:"requested_by"`
CreatedAt time.Time `json:"created_at"` CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"` UpdatedAt time.Time `json:"updated_at"`
} }
@@ -68,7 +67,6 @@ SELECT
signed_by, signed_by,
signed_at, signed_at,
requested_at, requested_at,
requested_by,
created_at, created_at,
updated_at updated_at
FROM FROM
@@ -114,7 +112,6 @@ SELECT
signed_by, signed_by,
signed_at, signed_at,
requested_at, requested_at,
requested_by,
created_at, created_at,
updated_at updated_at
FROM FROM
@@ -158,7 +155,6 @@ INSERT INTO document_version_signatures (
signed_by, signed_by,
signed_at, signed_at,
requested_at, requested_at,
requested_by,
created_at, created_at,
updated_at updated_at
) VALUES ( ) VALUES (
@@ -169,7 +165,6 @@ INSERT INTO document_version_signatures (
@signed_by, @signed_by,
@signed_at, @signed_at,
@requested_at, @requested_at,
@requested_by,
@created_at, @created_at,
@updated_at @updated_at
) )
@@ -183,7 +178,6 @@ INSERT INTO document_version_signatures (
"signed_by": pvs.SignedBy, "signed_by": pvs.SignedBy,
"signed_at": pvs.SignedAt, "signed_at": pvs.SignedAt,
"requested_at": pvs.RequestedAt, "requested_at": pvs.RequestedAt,
"requested_by": pvs.RequestedBy,
"created_at": pvs.CreatedAt, "created_at": pvs.CreatedAt,
"updated_at": pvs.UpdatedAt, "updated_at": pvs.UpdatedAt,
} }
@@ -211,7 +205,6 @@ SELECT
signed_by, signed_by,
signed_at, signed_at,
requested_at, requested_at,
requested_by,
created_at, created_at,
updated_at updated_at
FROM FROM

View File

@@ -0,0 +1 @@
ALTER TABLE document_version_signatures DROP COLUMN requested_by;

View File

@@ -77,7 +77,6 @@ type (
SignedAt *time.Time SignedAt *time.Time
State coredata.DocumentVersionSignatureState State coredata.DocumentVersionSignatureState
RequestedAt time.Time RequestedAt time.Time
RequestedBy string
} }
) )
@@ -95,7 +94,6 @@ func RenderHTML(data DocumentData) ([]byte, error) {
for i := range data.Signatures { for i := range data.Signatures {
data.Signatures[i].SignedBy = html.EscapeString(data.Signatures[i].SignedBy) data.Signatures[i].SignedBy = html.EscapeString(data.Signatures[i].SignedBy)
data.Signatures[i].RequestedBy = html.EscapeString(data.Signatures[i].RequestedBy)
} }
var buf bytes.Buffer var buf bytes.Buffer

View File

@@ -50,7 +50,6 @@ func TestRenderHTML(t *testing.T) {
SignedAt: &now, SignedAt: &now,
State: coredata.DocumentVersionSignatureStateSigned, State: coredata.DocumentVersionSignatureStateSigned,
RequestedAt: now, RequestedAt: now,
RequestedBy: "Bob Johnson",
}, },
}, },
}, },
@@ -64,7 +63,6 @@ func TestRenderHTML(t *testing.T) {
"John Doe", "John Doe",
"Test document description", "Test document description",
"Alice Smith", "Alice Smith",
"Bob Johnson",
}, },
}, },
{ {
@@ -76,9 +74,8 @@ func TestRenderHTML(t *testing.T) {
Description: "Description with & symbols and <tags>", Description: "Description with & symbols and <tags>",
Signatures: []SignatureData{ Signatures: []SignatureData{
{ {
SignedBy: "Alice & <Bob>", SignedBy: "Alice & <Bob>",
RequestedBy: "Carol <script>", State: coredata.DocumentVersionSignatureStateRequested,
State: coredata.DocumentVersionSignatureStateRequested,
}, },
}, },
}, },
@@ -87,7 +84,6 @@ func TestRenderHTML(t *testing.T) {
"John &amp;lt;script&amp;gt;alert(&amp;#39;xss&amp;#39;)&amp;lt;/script&amp;gt; Doe", "John &amp;lt;script&amp;gt;alert(&amp;#39;xss&amp;#39;)&amp;lt;/script&amp;gt; Doe",
"Description with &amp;amp; symbols and &amp;lt;tags&amp;gt;", "Description with &amp;amp; symbols and &amp;lt;tags&amp;gt;",
"Alice &amp;amp; &amp;lt;Bob&amp;gt;", "Alice &amp;amp; &amp;lt;Bob&amp;gt;",
"Carol &amp;lt;script&amp;gt;",
}, },
wantNotContains: []string{ wantNotContains: []string{
"<script>alert('xss')</script>", "<script>alert('xss')</script>",
@@ -138,21 +134,17 @@ func TestRenderHTML(t *testing.T) {
SignedAt: &now, SignedAt: &now,
State: coredata.DocumentVersionSignatureStateSigned, State: coredata.DocumentVersionSignatureStateSigned,
RequestedAt: now, RequestedAt: now,
RequestedBy: "Requester 1",
}, },
{ {
SignedBy: "Signer 2", SignedBy: "Signer 2",
State: coredata.DocumentVersionSignatureStateRequested, State: coredata.DocumentVersionSignatureStateRequested,
RequestedAt: now, RequestedAt: now,
RequestedBy: "Requester 2",
}, },
}, },
}, },
wantContains: []string{ wantContains: []string{
"Signer 1", "Signer 1",
"Signer 2", "Signer 2",
"Requester 1",
"Requester 2",
}, },
}, },
} }
@@ -268,9 +260,8 @@ func TestHTMLEscaping(t *testing.T) {
Description: "Text with 'quotes' & \"double quotes\"", Description: "Text with 'quotes' & \"double quotes\"",
Signatures: []SignatureData{ Signatures: []SignatureData{
{ {
SignedBy: "<malicious>tag", SignedBy: "<malicious>tag",
RequestedBy: "User & Company", State: coredata.DocumentVersionSignatureStateRequested,
State: coredata.DocumentVersionSignatureStateRequested,
}, },
}, },
} }
@@ -357,7 +348,6 @@ func TestDocumentVersionSignatureStates(t *testing.T) {
SignedBy: "Test User", SignedBy: "Test User",
State: state, State: state,
RequestedAt: now, RequestedAt: now,
RequestedBy: "Requester",
}, },
}, },
} }
@@ -407,7 +397,6 @@ func BenchmarkGenerateHTML(b *testing.B) {
SignedAt: &now, SignedAt: &now,
State: coredata.DocumentVersionSignatureStateSigned, State: coredata.DocumentVersionSignatureStateSigned,
RequestedAt: now, RequestedAt: now,
RequestedBy: "Bob Johnson",
}, },
}, },
} }

View File

@@ -358,7 +358,6 @@
<th>Status</th> <th>Status</th>
<th>Requested Date</th> <th>Requested Date</th>
<th>Signed Date</th> <th>Signed Date</th>
<th>Requested By</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -380,7 +379,6 @@
- -
{{- end}} {{- end}}
</td> </td>
<td>{{.RequestedBy}}</td>
</tr> </tr>
{{- end}} {{- end}}
</tbody> </tbody>

View File

@@ -52,14 +52,12 @@ type (
RequestSignatureRequest struct { RequestSignatureRequest struct {
DocumentVersionID gid.GID DocumentVersionID gid.GID
RequestedBy gid.GID
Signatory gid.GID Signatory gid.GID
} }
BulkRequestSignaturesRequest struct { BulkRequestSignaturesRequest struct {
DocumentIDs []gid.GID DocumentIDs []gid.GID
SignatoryIDs []gid.GID SignatoryIDs []gid.GID
RequestedBy gid.GID
} }
SigningRequestData struct { SigningRequestData struct {
@@ -605,13 +603,8 @@ func (s *DocumentService) BulkRequestSignatures(
return fmt.Errorf("cannot request signature for unpublished document %q", documentID) return fmt.Errorf("cannot request signature for unpublished document %q", documentID)
} }
requestedBy := &coredata.People{}
if err := requestedBy.LoadByID(ctx, tx, s.svc.scope, req.RequestedBy); err != nil {
return fmt.Errorf("cannot load requested by: %w", err)
}
for _, signatoryID := range req.SignatoryIDs { for _, signatoryID := range req.SignatoryIDs {
signature, err := s.createSignatureRequestInTx(ctx, tx, documentVersion.ID, requestedBy, signatoryID, true) signature, err := s.createSignatureRequestInTx(ctx, tx, documentVersion.ID, signatoryID, true)
if err != nil { if err != nil {
return fmt.Errorf("cannot create signature request for document %q and signatory %q: %w", documentID, signatoryID, err) return fmt.Errorf("cannot create signature request for document %q and signatory %q: %w", documentID, signatoryID, err)
} }
@@ -633,7 +626,6 @@ func (s *DocumentService) createSignatureRequestInTx(
ctx context.Context, ctx context.Context,
tx pg.Conn, tx pg.Conn,
documentVersionID gid.GID, documentVersionID gid.GID,
requestedBy *coredata.People,
signatoryID gid.GID, signatoryID gid.GID,
ignoreExisting bool, ignoreExisting bool,
) (*coredata.DocumentVersionSignature, error) { ) (*coredata.DocumentVersionSignature, error) {
@@ -655,7 +647,6 @@ func (s *DocumentService) createSignatureRequestInTx(
ID: documentVersionSignatureID, ID: documentVersionSignatureID,
DocumentVersionID: documentVersionID, DocumentVersionID: documentVersionID,
State: coredata.DocumentVersionSignatureStateRequested, State: coredata.DocumentVersionSignatureStateRequested,
RequestedBy: requestedBy.ID,
RequestedAt: now, RequestedAt: now,
SignedBy: signatory.ID, SignedBy: signatory.ID,
SignedAt: nil, SignedAt: nil,
@@ -687,12 +678,7 @@ func (s *DocumentService) RequestSignature(
err = s.svc.pg.WithTx( err = s.svc.pg.WithTx(
ctx, ctx,
func(tx pg.Conn) error { func(tx pg.Conn) error {
requestedBy := &coredata.People{} signature, err = s.createSignatureRequestInTx(ctx, tx, req.DocumentVersionID, req.Signatory, false)
if err := requestedBy.LoadByID(ctx, tx, s.svc.scope, req.RequestedBy); err != nil {
return fmt.Errorf("cannot load requested by %q: %w", req.RequestedBy, err)
}
signature, err = s.createSignatureRequestInTx(ctx, tx, req.DocumentVersionID, requestedBy, req.Signatory, false)
if err != nil { if err != nil {
return fmt.Errorf("cannot create signature request: %w", err) return fmt.Errorf("cannot create signature request: %w", err)
} }
@@ -1337,14 +1323,6 @@ func exportDocumentPDF(
} }
peopleMap[sig.SignedBy] = people peopleMap[sig.SignedBy] = people
} }
if _, ok := peopleMap[sig.RequestedBy]; !ok {
people := &coredata.People{}
if err := people.LoadByID(ctx, conn, scope, sig.RequestedBy); err != nil {
return nil, fmt.Errorf("cannot load people %q: %w", sig.RequestedBy, err)
}
peopleMap[sig.RequestedBy] = people
}
} }
classification := docgen.ClassificationInternal classification := docgen.ClassificationInternal
@@ -1372,7 +1350,6 @@ func exportDocumentPDF(
SignedAt: sig.SignedAt, SignedAt: sig.SignedAt,
State: sig.State, State: sig.State,
RequestedAt: sig.RequestedAt, RequestedAt: sig.RequestedAt,
RequestedBy: peopleMap[sig.RequestedBy].FullName,
} }
} }

View File

@@ -3963,7 +3963,6 @@ type DocumentVersionSignature implements Node {
signedBy: People! @goField(forceResolver: true) signedBy: People! @goField(forceResolver: true)
signedAt: Datetime signedAt: Datetime
requestedAt: Datetime! requestedAt: Datetime!
requestedBy: People! @goField(forceResolver: true)
createdAt: Datetime! createdAt: Datetime!
updatedAt: Datetime! updatedAt: Datetime!
} }

View File

@@ -616,7 +616,6 @@ type ComplexityRoot struct {
DocumentVersion func(childComplexity int) int DocumentVersion func(childComplexity int) int
ID func(childComplexity int) int ID func(childComplexity int) int
RequestedAt func(childComplexity int) int RequestedAt func(childComplexity int) int
RequestedBy func(childComplexity int) int
SignedAt func(childComplexity int) int SignedAt func(childComplexity int) int
SignedBy func(childComplexity int) int SignedBy func(childComplexity int) int
State func(childComplexity int) int State func(childComplexity int) int
@@ -1586,8 +1585,6 @@ type DocumentVersionSignatureResolver interface {
DocumentVersion(ctx context.Context, obj *types.DocumentVersionSignature) (*types.DocumentVersion, error) DocumentVersion(ctx context.Context, obj *types.DocumentVersionSignature) (*types.DocumentVersion, error)
SignedBy(ctx context.Context, obj *types.DocumentVersionSignature) (*types.People, error) SignedBy(ctx context.Context, obj *types.DocumentVersionSignature) (*types.People, error)
RequestedBy(ctx context.Context, obj *types.DocumentVersionSignature) (*types.People, error)
} }
type EvidenceResolver interface { type EvidenceResolver interface {
FileURL(ctx context.Context, obj *types.Evidence) (*string, error) FileURL(ctx context.Context, obj *types.Evidence) (*string, error)
@@ -3493,13 +3490,6 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin
return e.complexity.DocumentVersionSignature.RequestedAt(childComplexity), true return e.complexity.DocumentVersionSignature.RequestedAt(childComplexity), true
case "DocumentVersionSignature.requestedBy":
if e.complexity.DocumentVersionSignature.RequestedBy == nil {
break
}
return e.complexity.DocumentVersionSignature.RequestedBy(childComplexity), true
case "DocumentVersionSignature.signedAt": case "DocumentVersionSignature.signedAt":
if e.complexity.DocumentVersionSignature.SignedAt == nil { if e.complexity.DocumentVersionSignature.SignedAt == nil {
break break
@@ -12382,7 +12372,6 @@ type DocumentVersionSignature implements Node {
signedBy: People! @goField(forceResolver: true) signedBy: People! @goField(forceResolver: true)
signedAt: Datetime signedAt: Datetime
requestedAt: Datetime! requestedAt: Datetime!
requestedBy: People! @goField(forceResolver: true)
createdAt: Datetime! createdAt: Datetime!
updatedAt: Datetime! updatedAt: Datetime!
} }
@@ -31649,72 +31638,6 @@ func (ec *executionContext) fieldContext_DocumentVersionSignature_requestedAt(_
return fc, nil return fc, nil
} }
func (ec *executionContext) _DocumentVersionSignature_requestedBy(ctx context.Context, field graphql.CollectedField, obj *types.DocumentVersionSignature) (ret graphql.Marshaler) {
fc, err := ec.fieldContext_DocumentVersionSignature_requestedBy(ctx, field)
if err != nil {
return graphql.Null
}
ctx = graphql.WithFieldContext(ctx, fc)
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
ret = graphql.Null
}
}()
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
ctx = rctx // use context from middleware stack in children
return ec.resolvers.DocumentVersionSignature().RequestedBy(rctx, obj)
})
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
if resTmp == nil {
if !graphql.HasFieldError(ctx, fc) {
ec.Errorf(ctx, "must not be null")
}
return graphql.Null
}
res := resTmp.(*types.People)
fc.Result = res
return ec.marshalNPeople2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐPeople(ctx, field.Selections, res)
}
func (ec *executionContext) fieldContext_DocumentVersionSignature_requestedBy(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
fc = &graphql.FieldContext{
Object: "DocumentVersionSignature",
Field: field,
IsMethod: true,
IsResolver: true,
Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
switch field.Name {
case "id":
return ec.fieldContext_People_id(ctx, field)
case "fullName":
return ec.fieldContext_People_fullName(ctx, field)
case "primaryEmailAddress":
return ec.fieldContext_People_primaryEmailAddress(ctx, field)
case "additionalEmailAddresses":
return ec.fieldContext_People_additionalEmailAddresses(ctx, field)
case "kind":
return ec.fieldContext_People_kind(ctx, field)
case "position":
return ec.fieldContext_People_position(ctx, field)
case "contractStartDate":
return ec.fieldContext_People_contractStartDate(ctx, field)
case "contractEndDate":
return ec.fieldContext_People_contractEndDate(ctx, field)
case "createdAt":
return ec.fieldContext_People_createdAt(ctx, field)
case "updatedAt":
return ec.fieldContext_People_updatedAt(ctx, field)
}
return nil, fmt.Errorf("no field named %q was found under type People", field.Name)
},
}
return fc, nil
}
func (ec *executionContext) _DocumentVersionSignature_createdAt(ctx context.Context, field graphql.CollectedField, obj *types.DocumentVersionSignature) (ret graphql.Marshaler) { func (ec *executionContext) _DocumentVersionSignature_createdAt(ctx context.Context, field graphql.CollectedField, obj *types.DocumentVersionSignature) (ret graphql.Marshaler) {
fc, err := ec.fieldContext_DocumentVersionSignature_createdAt(ctx, field) fc, err := ec.fieldContext_DocumentVersionSignature_createdAt(ctx, field)
if err != nil { if err != nil {
@@ -32002,8 +31925,6 @@ func (ec *executionContext) fieldContext_DocumentVersionSignatureEdge_node(_ con
return ec.fieldContext_DocumentVersionSignature_signedAt(ctx, field) return ec.fieldContext_DocumentVersionSignature_signedAt(ctx, field)
case "requestedAt": case "requestedAt":
return ec.fieldContext_DocumentVersionSignature_requestedAt(ctx, field) return ec.fieldContext_DocumentVersionSignature_requestedAt(ctx, field)
case "requestedBy":
return ec.fieldContext_DocumentVersionSignature_requestedBy(ctx, field)
case "createdAt": case "createdAt":
return ec.fieldContext_DocumentVersionSignature_createdAt(ctx, field) return ec.fieldContext_DocumentVersionSignature_createdAt(ctx, field)
case "updatedAt": case "updatedAt":
@@ -75903,42 +75824,6 @@ func (ec *executionContext) _DocumentVersionSignature(ctx context.Context, sel a
if out.Values[i] == graphql.Null { if out.Values[i] == graphql.Null {
atomic.AddUint32(&out.Invalids, 1) atomic.AddUint32(&out.Invalids, 1)
} }
case "requestedBy":
field := field
innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
}
}()
res = ec._DocumentVersionSignature_requestedBy(ctx, field, obj)
if res == graphql.Null {
atomic.AddUint32(&fs.Invalids, 1)
}
return res
}
if field.Deferrable != nil {
dfs, ok := deferred[field.Deferrable.Label]
di := 0
if ok {
dfs.AddField(field)
di = len(dfs.Values) - 1
} else {
dfs = graphql.NewFieldSet([]graphql.CollectedField{field})
deferred[field.Deferrable.Label] = dfs
}
dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {
return innerFunc(ctx, dfs)
})
// don't run the out.Concurrently() call below
out.Values[i] = graphql.Null
continue
}
out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })
case "createdAt": case "createdAt":
out.Values[i] = ec._DocumentVersionSignature_createdAt(ctx, field, obj) out.Values[i] = ec._DocumentVersionSignature_createdAt(ctx, field, obj)
if out.Values[i] == graphql.Null { if out.Values[i] == graphql.Null {

View File

@@ -1005,7 +1005,6 @@ type DocumentVersionSignature struct {
SignedBy *People `json:"signedBy"` SignedBy *People `json:"signedBy"`
SignedAt *time.Time `json:"signedAt,omitempty"` SignedAt *time.Time `json:"signedAt,omitempty"`
RequestedAt time.Time `json:"requestedAt"` RequestedAt time.Time `json:"requestedAt"`
RequestedBy *People `json:"requestedBy"`
CreatedAt time.Time `json:"createdAt"` CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"` UpdatedAt time.Time `json:"updatedAt"`
} }

View File

@@ -734,23 +734,6 @@ func (r *documentVersionSignatureResolver) SignedBy(ctx context.Context, obj *ty
return types.NewPeople(people), nil return types.NewPeople(people), nil
} }
// RequestedBy is the resolver for the requestedBy field.
func (r *documentVersionSignatureResolver) RequestedBy(ctx context.Context, obj *types.DocumentVersionSignature) (*types.People, error) {
prb := r.ProboService(ctx, obj.ID.TenantID())
documentVersionSignature, err := prb.Documents.GetVersionSignature(ctx, obj.ID)
if err != nil {
panic(fmt.Errorf("cannot get document version signature: %w", err))
}
people, err := prb.Peoples.Get(ctx, documentVersionSignature.RequestedBy)
if err != nil {
panic(fmt.Errorf("cannot get people: %w", err))
}
return types.NewPeople(people), nil
}
// FileURL is the resolver for the fileUrl field. // FileURL is the resolver for the fileUrl field.
func (r *evidenceResolver) FileURL(ctx context.Context, obj *types.Evidence) (*string, error) { func (r *evidenceResolver) FileURL(ctx context.Context, obj *types.Evidence) (*string, error) {
prb := r.ProboService(ctx, obj.ID.TenantID()) prb := r.ProboService(ctx, obj.ID.TenantID())
@@ -2718,18 +2701,10 @@ func (r *mutationResolver) UpdateDocumentVersion(ctx context.Context, input type
func (r *mutationResolver) RequestSignature(ctx context.Context, input types.RequestSignatureInput) (*types.RequestSignaturePayload, error) { func (r *mutationResolver) RequestSignature(ctx context.Context, input types.RequestSignatureInput) (*types.RequestSignaturePayload, error) {
prb := r.ProboService(ctx, input.DocumentVersionID.TenantID()) prb := r.ProboService(ctx, input.DocumentVersionID.TenantID())
user := UserFromContext(ctx)
people, err := prb.Peoples.GetByUserID(ctx, user.ID)
if err != nil {
panic(fmt.Errorf("cannot get people: %w", err))
}
documentVersionSignature, err := prb.Documents.RequestSignature( documentVersionSignature, err := prb.Documents.RequestSignature(
ctx, ctx,
probo.RequestSignatureRequest{ probo.RequestSignatureRequest{
DocumentVersionID: input.DocumentVersionID, DocumentVersionID: input.DocumentVersionID,
RequestedBy: people.ID,
Signatory: input.SignatoryID, Signatory: input.SignatoryID,
}, },
) )
@@ -2752,19 +2727,11 @@ func (r *mutationResolver) BulkRequestSignatures(ctx context.Context, input type
prb := r.ProboService(ctx, input.DocumentIds[0].TenantID()) prb := r.ProboService(ctx, input.DocumentIds[0].TenantID())
user := UserFromContext(ctx)
people, err := prb.Peoples.GetByUserID(ctx, user.ID)
if err != nil {
panic(fmt.Errorf("cannot get people: %w", err))
}
documentVersionSignatures, err := prb.Documents.BulkRequestSignatures( documentVersionSignatures, err := prb.Documents.BulkRequestSignatures(
ctx, ctx,
probo.BulkRequestSignaturesRequest{ probo.BulkRequestSignaturesRequest{
DocumentIDs: input.DocumentIds, DocumentIDs: input.DocumentIds,
SignatoryIDs: input.SignatoryIds, SignatoryIDs: input.SignatoryIds,
RequestedBy: people.ID,
}, },
) )
if err != nil { if err != nil {