Implement Merge for trusct center document accesses
Signed-off-by: Émile Ré <nemile.re@gmail.com>
This commit is contained in:
@@ -64,7 +64,7 @@ export function TrustCenterAccessEditForm(props: TrustCenterAccessEditFormProps)
|
||||
queryRef,
|
||||
)
|
||||
|
||||
const initialDocumentAccesses = (data.node.availableDocumentAccesses?.edges.map(edge => edge.node) ?? []).map(da => getTrustCenterDocumentAccessInfo(da, __))
|
||||
const initialDocumentAccesses = data.node.availableDocumentAccesses?.edges.map(edge => getTrustCenterDocumentAccessInfo(edge.node, __)) ?? []
|
||||
const initialStatusByID = initialDocumentAccesses.reduce<Record<string, TrustCenterDocumentAccessStatus>>((acc, docAccess) => {
|
||||
acc[docAccess.id] = docAccess.status;
|
||||
return acc
|
||||
|
||||
@@ -201,7 +201,7 @@ FROM
|
||||
WHERE
|
||||
%s
|
||||
AND deleted_at IS NULL
|
||||
AND id IN (SELECT id FROM UNNEST(@document_ids::text[]) AS t(id));;
|
||||
AND id = ANY(@document_ids)
|
||||
`
|
||||
|
||||
q = fmt.Sprintf(q, scope.SQLFragment())
|
||||
|
||||
@@ -133,7 +133,7 @@ FROM
|
||||
files
|
||||
WHERE
|
||||
%s
|
||||
AND id (SELECT id FROM UNNEST(@file_ids::text[]) AS t(id))
|
||||
AND id = ANY(@file_ids)
|
||||
LIMIT 1;
|
||||
`
|
||||
|
||||
|
||||
@@ -110,7 +110,7 @@ FROM
|
||||
reports
|
||||
WHERE
|
||||
%s
|
||||
AND id IN (SELECT id FROM UNNEST(@report_ids::text[]) AS t(id))
|
||||
AND id = ANY(@report_ids)
|
||||
LIMIT 1;
|
||||
`
|
||||
|
||||
|
||||
@@ -633,34 +633,6 @@ WHERE
|
||||
return nil
|
||||
}
|
||||
|
||||
func DeleteByTrustCenterAccessID(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
trustCenterAccessID gid.GID,
|
||||
) error {
|
||||
q := `
|
||||
DELETE FROM trust_center_document_accesses
|
||||
WHERE
|
||||
%s
|
||||
AND trust_center_access_id = @trust_center_access_id
|
||||
`
|
||||
|
||||
q = fmt.Sprintf(q, scope.SQLFragment())
|
||||
|
||||
args := pgx.StrictNamedArgs{
|
||||
"trust_center_access_id": trustCenterAccessID,
|
||||
}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
|
||||
_, err := conn.Exec(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot delete trust center document accesses: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func GrantByDocumentIDs(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
@@ -793,6 +765,230 @@ WHERE
|
||||
return nil
|
||||
}
|
||||
|
||||
type MergeTrustCenterDocumentAccessesData struct {
|
||||
ID gid.GID
|
||||
Status TrustCenterDocumentAccessStatus
|
||||
}
|
||||
|
||||
func (tcdas TrustCenterDocumentAccesses) MergeDocumentAccesses(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
organizationID gid.GID,
|
||||
trustCenterAccessID gid.GID,
|
||||
data []MergeTrustCenterDocumentAccessesData,
|
||||
) error {
|
||||
q := `
|
||||
WITH data AS (
|
||||
SELECT
|
||||
id,
|
||||
status
|
||||
FROM
|
||||
json_to_recordset(@data) AS t(id text, status trust_center_document_access_status)
|
||||
)
|
||||
MERGE INTO trust_center_document_accesses tcda
|
||||
USING data
|
||||
ON data.id = tcda.document_id
|
||||
WHEN MATCHED
|
||||
THEN UPDATE SET tcda.status = data.status, tcda.updated_at = @now
|
||||
WHEN NOT MATCHED BY SOURCE
|
||||
AND tcda.tenant_id = @tenant_id
|
||||
AND tcda.trust_center_access_id = @trust_center_access_id
|
||||
AND tcda.document_id IS NOT NULL
|
||||
THEN DELETE
|
||||
WHEN NOT MATCHED
|
||||
THEN INSERT (
|
||||
id,
|
||||
tenant_id,
|
||||
organization_id,
|
||||
trust_center_access_id,
|
||||
document_id,
|
||||
report_id,
|
||||
trust_center_file_id,
|
||||
active,
|
||||
status,
|
||||
requested,
|
||||
created_at,
|
||||
updated_at
|
||||
)
|
||||
VALUES (
|
||||
generate_gid(decode_base64_unpadded(@tenant_id), @trust_center_document_access_entity_type) AS id,
|
||||
@tenant_id AS tenant_id,
|
||||
@organization_id AS organization_id,
|
||||
@trust_center_access_id AS trust_center_access_id,
|
||||
data.id AS document_id,
|
||||
NULL AS report_id,
|
||||
NULL AS trust_center_file_id,
|
||||
false AS active,
|
||||
data.status AS status,
|
||||
false AS requested,
|
||||
@now AS created_at,
|
||||
@now AS updated_at
|
||||
)
|
||||
`
|
||||
|
||||
args := pgx.StrictNamedArgs{
|
||||
"trust_center_document_access_entity_type": TrustCenterDocumentAccessEntityType,
|
||||
"tenant_id": scope.GetTenantID(),
|
||||
"trust_center_access_id": trustCenterAccessID,
|
||||
"organization_id": organizationID,
|
||||
"now": time.Now(),
|
||||
"data": data,
|
||||
}
|
||||
|
||||
if _, err := conn.Exec(ctx, q, args); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (tcdas TrustCenterDocumentAccesses) MergeReportAccesses(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
organizationID gid.GID,
|
||||
trustCenterAccessID gid.GID,
|
||||
data []MergeTrustCenterDocumentAccessesData,
|
||||
) error {
|
||||
q := `
|
||||
WITH data AS (
|
||||
SELECT
|
||||
id,
|
||||
status
|
||||
FROM
|
||||
json_to_recordset(@data) AS t(id text, status trust_center_document_access_status)
|
||||
)
|
||||
MERGE INTO trust_center_document_accesses tcda
|
||||
USING data
|
||||
ON data.id = tcda.report_id
|
||||
WHEN MATCHED
|
||||
THEN UPDATE SET tcda.status = data.status, tcda.updated_at = @now
|
||||
WHEN NOT MATCHED BY SOURCE
|
||||
AND tcda.tenant_id = @tenant_id
|
||||
AND tcda.trust_center_access_id = @trust_center_access_id
|
||||
AND tcda.report_id IS NOT NULL
|
||||
THEN DELETE
|
||||
WHEN NOT MATCHED
|
||||
THEN INSERT (
|
||||
id,
|
||||
tenant_id,
|
||||
organization_id,
|
||||
trust_center_access_id,
|
||||
document_id,
|
||||
report_id,
|
||||
trust_center_file_id,
|
||||
active,
|
||||
status,
|
||||
requested,
|
||||
created_at,
|
||||
updated_at
|
||||
)
|
||||
VALUES (
|
||||
generate_gid(decode_base64_unpadded(@tenant_id), @trust_center_document_access_entity_type) AS id,
|
||||
@tenant_id AS tenant_id,
|
||||
@organization_id AS organization_id,
|
||||
@trust_center_access_id AS trust_center_access_id,
|
||||
NULL AS document_id,
|
||||
data.id AS report_id,
|
||||
NULL AS trust_center_file_id,
|
||||
false AS active,
|
||||
data.status AS status,
|
||||
false AS requested,
|
||||
@now AS created_at,
|
||||
@now AS updated_at
|
||||
)
|
||||
`
|
||||
|
||||
args := pgx.StrictNamedArgs{
|
||||
"trust_center_document_access_entity_type": TrustCenterDocumentAccessEntityType,
|
||||
"tenant_id": scope.GetTenantID(),
|
||||
"trust_center_access_id": trustCenterAccessID,
|
||||
"organization_id": organizationID,
|
||||
"now": time.Now(),
|
||||
"data": data,
|
||||
}
|
||||
|
||||
if _, err := conn.Exec(ctx, q, args); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (tcdas TrustCenterDocumentAccesses) MergeTrustCenterFileAccesses(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
organizationID gid.GID,
|
||||
trustCenterAccessID gid.GID,
|
||||
data []MergeTrustCenterDocumentAccessesData,
|
||||
) error {
|
||||
q := `
|
||||
WITH data AS (
|
||||
SELECT
|
||||
id,
|
||||
status
|
||||
FROM
|
||||
json_to_recordset(@data) AS t(id text, status trust_center_document_access_status)
|
||||
)
|
||||
MERGE INTO trust_center_document_accesses tcda
|
||||
USING data
|
||||
ON data.id = tcda.trust_center_file_id
|
||||
WHEN MATCHED
|
||||
THEN UPDATE SET tcda.status = data.status, tcda.updated_at = @now
|
||||
WHEN NOT MATCHED BY SOURCE
|
||||
AND tcda.tenant_id = @tenant_id
|
||||
AND tcda.trust_center_access_id = @trust_center_access_id
|
||||
AND tcda.trust_center_file_id IS NOT NULL
|
||||
THEN DELETE
|
||||
WHEN NOT MATCHED
|
||||
THEN INSERT (
|
||||
id,
|
||||
tenant_id,
|
||||
organization_id,
|
||||
trust_center_access_id,
|
||||
document_id,
|
||||
report_id,
|
||||
trust_center_file_id,
|
||||
active,
|
||||
status,
|
||||
requested,
|
||||
created_at,
|
||||
updated_at
|
||||
)
|
||||
VALUES (
|
||||
generate_gid(decode_base64_unpadded(@tenant_id), @trust_center_document_access_entity_type) AS id,
|
||||
@tenant_id AS tenant_id,
|
||||
@organization_id AS organization_id,
|
||||
@trust_center_access_id AS trust_center_access_id,
|
||||
NULL AS document_id,
|
||||
NULL AS report_id,
|
||||
data.id AS trust_center_file_id,
|
||||
false AS active,
|
||||
data.status AS status,
|
||||
false AS requested,
|
||||
@now AS created_at,
|
||||
@now AS updated_at
|
||||
)
|
||||
`
|
||||
|
||||
args := pgx.StrictNamedArgs{
|
||||
"trust_center_document_access_entity_type": TrustCenterDocumentAccessEntityType,
|
||||
"tenant_id": scope.GetTenantID(),
|
||||
"trust_center_access_id": trustCenterAccessID,
|
||||
"organization_id": organizationID,
|
||||
"now": time.Now(),
|
||||
"data": data,
|
||||
}
|
||||
|
||||
if _, err := conn.Exec(ctx, q, args); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (tcdas TrustCenterDocumentAccesses) BulkInsertDocumentAccesses(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
|
||||
@@ -295,8 +295,42 @@ func (s TrustCenterAccessService) Update(
|
||||
return fmt.Errorf("cannot update trust center access: %w", err)
|
||||
}
|
||||
|
||||
if err := s.upsertDocumentAccesses(ctx, tx, access.ID, access.OrganizationID, req.DocumentIDs, req.ReportIDs, req.TrustCenterFileIDs, now); err != nil {
|
||||
return fmt.Errorf("cannot upsert document accesses: %w", err)
|
||||
var tcdas coredata.TrustCenterDocumentAccesses
|
||||
|
||||
var documentData []coredata.MergeTrustCenterDocumentAccessesData
|
||||
for _, d := range req.DocumentAccesses {
|
||||
documentData = append(documentData, coredata.MergeTrustCenterDocumentAccessesData{
|
||||
ID: d.ID,
|
||||
Status: d.Status,
|
||||
})
|
||||
}
|
||||
|
||||
if err := tcdas.MergeDocumentAccesses(ctx, tx, s.svc.scope, access.OrganizationID, access.ID, documentData); err != nil {
|
||||
return fmt.Errorf("cannot merge document accesses: %w", err)
|
||||
}
|
||||
|
||||
var reportData []coredata.MergeTrustCenterDocumentAccessesData
|
||||
for _, d := range req.ReportAccesses {
|
||||
reportData = append(reportData, coredata.MergeTrustCenterDocumentAccessesData{
|
||||
ID: d.ID,
|
||||
Status: d.Status,
|
||||
})
|
||||
}
|
||||
|
||||
if err := tcdas.MergeReportAccesses(ctx, tx, s.svc.scope, access.OrganizationID, access.ID, reportData); err != nil {
|
||||
return fmt.Errorf("cannot merge report accesses: %w", err)
|
||||
}
|
||||
|
||||
var fileData []coredata.MergeTrustCenterDocumentAccessesData
|
||||
for _, d := range req.TrustCenterFileAccesses {
|
||||
fileData = append(fileData, coredata.MergeTrustCenterDocumentAccessesData{
|
||||
ID: d.ID,
|
||||
Status: d.Status,
|
||||
})
|
||||
}
|
||||
|
||||
if err := tcdas.MergeTrustCenterFileAccesses(ctx, tx, s.svc.scope, access.OrganizationID, access.ID, fileData); err != nil {
|
||||
return fmt.Errorf("cannot merge trust center file accesses: %w", err)
|
||||
}
|
||||
|
||||
if shouldSendEmail {
|
||||
@@ -340,84 +374,6 @@ func (s TrustCenterAccessService) Delete(
|
||||
return err
|
||||
}
|
||||
|
||||
func (s TrustCenterAccessService) upsertDocumentAccesses(
|
||||
ctx context.Context,
|
||||
tx pg.Conn,
|
||||
accessID gid.GID,
|
||||
organizationID gid.GID,
|
||||
documentIDs []gid.GID,
|
||||
reportIDs []gid.GID,
|
||||
trustCenterFileIDs []gid.GID,
|
||||
now time.Time,
|
||||
) error {
|
||||
if documentIDs == nil && reportIDs == nil && trustCenterFileIDs == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
if err := coredata.DeleteByTrustCenterAccessID(ctx, tx, s.svc.scope, accessID); err != nil {
|
||||
return fmt.Errorf("cannot delete existing document accesses: %w", err)
|
||||
}
|
||||
|
||||
if documentIDs != nil {
|
||||
var documentAccesses coredata.TrustCenterDocumentAccesses
|
||||
if err := documentAccesses.BulkInsertDocumentAccesses(
|
||||
ctx,
|
||||
tx,
|
||||
s.svc.scope,
|
||||
accessID,
|
||||
organizationID,
|
||||
documentIDs,
|
||||
coredata.TrustCenterDocumentAccessStatusGranted,
|
||||
now,
|
||||
); err != nil {
|
||||
return fmt.Errorf("cannot create document accesses: %w", err)
|
||||
}
|
||||
if err := coredata.GrantByDocumentIDs(ctx, tx, s.svc.scope, accessID, documentIDs, now); err != nil {
|
||||
return fmt.Errorf("cannot grant document accesses: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
if reportIDs != nil {
|
||||
var documentAccesses coredata.TrustCenterDocumentAccesses
|
||||
if err := documentAccesses.BulkInsertReportAccesses(
|
||||
ctx,
|
||||
tx,
|
||||
s.svc.scope,
|
||||
accessID,
|
||||
organizationID,
|
||||
reportIDs,
|
||||
coredata.TrustCenterDocumentAccessStatusGranted,
|
||||
now,
|
||||
); err != nil {
|
||||
return fmt.Errorf("cannot create report accesses: %w", err)
|
||||
}
|
||||
if err := coredata.GrantByReportIDs(ctx, tx, s.svc.scope, accessID, reportIDs, now); err != nil {
|
||||
return fmt.Errorf("cannot grant report accesses: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
if trustCenterFileIDs != nil {
|
||||
var documentAccesses coredata.TrustCenterDocumentAccesses
|
||||
if err := documentAccesses.BulkInsertTrustCenterFileAccesses(
|
||||
ctx,
|
||||
tx,
|
||||
s.svc.scope,
|
||||
accessID,
|
||||
organizationID,
|
||||
trustCenterFileIDs,
|
||||
coredata.TrustCenterDocumentAccessStatusGranted,
|
||||
now,
|
||||
); err != nil {
|
||||
return fmt.Errorf("cannot create trust center file accesses: %w", err)
|
||||
}
|
||||
if err := coredata.GrantByTrustCenterFileIDs(ctx, tx, s.svc.scope, accessID, trustCenterFileIDs, now); err != nil {
|
||||
return fmt.Errorf("cannot grant trust center file accesses: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s TrustCenterAccessService) sendAccessEmail(ctx context.Context, tx pg.Conn, access *coredata.TrustCenterAccess) error {
|
||||
accessToken, err := statelesstoken.NewToken(
|
||||
s.svc.trustConfig.TokenSecret,
|
||||
|
||||
@@ -1664,19 +1664,19 @@ func (r *mutationResolver) UpdateTrustCenterAccess(ctx context.Context, input ty
|
||||
var documentAccesses []probo.UpdateTrustCenterDocumentAccessRequest
|
||||
var reportAccesses []probo.UpdateTrustCenterDocumentAccessRequest
|
||||
var fileAccesses []probo.UpdateTrustCenterDocumentAccessRequest
|
||||
for _, documentAccess := range documentAccesses {
|
||||
for _, documentAccess := range input.Documents {
|
||||
documentAccesses = append(documentAccesses, probo.UpdateTrustCenterDocumentAccessRequest{
|
||||
ID: documentAccess.ID,
|
||||
Status: documentAccess.Status,
|
||||
})
|
||||
}
|
||||
for _, reportAccess := range reportAccesses {
|
||||
for _, reportAccess := range input.Reports {
|
||||
reportAccesses = append(reportAccesses, probo.UpdateTrustCenterDocumentAccessRequest{
|
||||
ID: reportAccess.ID,
|
||||
Status: reportAccess.Status,
|
||||
})
|
||||
}
|
||||
for _, fileAccess := range fileAccesses {
|
||||
for _, fileAccess := range input.TrustCenterFiles {
|
||||
fileAccesses = append(fileAccesses, probo.UpdateTrustCenterDocumentAccessRequest{
|
||||
ID: fileAccess.ID,
|
||||
Status: fileAccess.Status,
|
||||
|
||||
Reference in New Issue
Block a user