Implement Merge for trusct center document accesses

Signed-off-by: Émile Ré <nemile.re@gmail.com>
This commit is contained in:
Émile Ré
2025-12-09 19:43:30 +01:00
parent eab3af5f26
commit c8e3636bf3
7 changed files with 552 additions and 400 deletions

View File

@@ -64,7 +64,7 @@ export function TrustCenterAccessEditForm(props: TrustCenterAccessEditFormProps)
queryRef, 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) => { const initialStatusByID = initialDocumentAccesses.reduce<Record<string, TrustCenterDocumentAccessStatus>>((acc, docAccess) => {
acc[docAccess.id] = docAccess.status; acc[docAccess.id] = docAccess.status;
return acc return acc

View File

@@ -201,7 +201,7 @@ FROM
WHERE WHERE
%s %s
AND deleted_at IS NULL 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()) q = fmt.Sprintf(q, scope.SQLFragment())

View File

@@ -133,7 +133,7 @@ FROM
files files
WHERE WHERE
%s %s
AND id (SELECT id FROM UNNEST(@file_ids::text[]) AS t(id)) AND id = ANY(@file_ids)
LIMIT 1; LIMIT 1;
` `

View File

@@ -110,7 +110,7 @@ FROM
reports reports
WHERE WHERE
%s %s
AND id IN (SELECT id FROM UNNEST(@report_ids::text[]) AS t(id)) AND id = ANY(@report_ids)
LIMIT 1; LIMIT 1;
` `

View File

@@ -79,22 +79,22 @@ func (tcda *TrustCenterDocumentAccess) LoadByID(
) error { ) error {
q := ` q := `
SELECT SELECT
id, id,
organization_id, organization_id,
trust_center_access_id, trust_center_access_id,
document_id, document_id,
report_id, report_id,
trust_center_file_id, trust_center_file_id,
active, active,
status, status,
requested, requested,
created_at, created_at,
updated_at updated_at
FROM FROM
trust_center_document_accesses trust_center_document_accesses
WHERE WHERE
%s %s
AND id = @access_id AND id = @access_id
LIMIT 1; LIMIT 1;
` `
@@ -130,23 +130,23 @@ func (tcda *TrustCenterDocumentAccess) LoadByTrustCenterAccessIDAndDocumentID(
) error { ) error {
q := ` q := `
SELECT SELECT
id, id,
organization_id, organization_id,
trust_center_access_id, trust_center_access_id,
document_id, document_id,
report_id, report_id,
trust_center_file_id, trust_center_file_id,
active, active,
status, status,
requested, requested,
created_at, created_at,
updated_at updated_at
FROM FROM
trust_center_document_accesses trust_center_document_accesses
WHERE WHERE
%s %s
AND trust_center_access_id = @trust_center_access_id AND trust_center_access_id = @trust_center_access_id
AND document_id = @document_id AND document_id = @document_id
LIMIT 1; LIMIT 1;
` `
@@ -182,23 +182,23 @@ func (tcda *TrustCenterDocumentAccess) LoadByTrustCenterAccessIDAndReportID(
) error { ) error {
q := ` q := `
SELECT SELECT
id, id,
organization_id, organization_id,
trust_center_access_id, trust_center_access_id,
document_id, document_id,
report_id, report_id,
trust_center_file_id, trust_center_file_id,
active, active,
status, status,
requested, requested,
created_at, created_at,
updated_at updated_at
FROM FROM
trust_center_document_accesses trust_center_document_accesses
WHERE WHERE
%s %s
AND trust_center_access_id = @trust_center_access_id AND trust_center_access_id = @trust_center_access_id
AND report_id = @report_id AND report_id = @report_id
LIMIT 1; LIMIT 1;
` `
@@ -232,31 +232,31 @@ func (tcda *TrustCenterDocumentAccess) Insert(
) error { ) error {
q := ` q := `
INSERT INTO trust_center_document_accesses ( INSERT INTO trust_center_document_accesses (
id, id,
tenant_id, tenant_id,
organization_id, organization_id,
trust_center_access_id, trust_center_access_id,
document_id, document_id,
report_id, report_id,
trust_center_file_id, trust_center_file_id,
active, active,
status, status,
requested, requested,
created_at, created_at,
updated_at updated_at
) VALUES ( ) VALUES (
@id, @id,
@tenant_id, @tenant_id,
@organization_id, @organization_id,
@trust_center_access_id, @trust_center_access_id,
@document_id, @document_id,
@report_id, @report_id,
@trust_center_file_id, @trust_center_file_id,
@active, @active,
@status::trust_center_document_access_status, @status::trust_center_document_access_status,
@requested, @requested,
@created_at, @created_at,
@updated_at @updated_at
) )
` `
@@ -309,11 +309,11 @@ func (tcda *TrustCenterDocumentAccess) Update(
) error { ) error {
q := ` q := `
UPDATE trust_center_document_accesses SET UPDATE trust_center_document_accesses SET
status = @status::trust_center_document_access_status, status = @status::trust_center_document_access_status,
updated_at = @updated_at updated_at = @updated_at
WHERE WHERE
%s %s
AND id = @id AND id = @id
` `
q = fmt.Sprintf(q, scope.SQLFragment()) q = fmt.Sprintf(q, scope.SQLFragment())
@@ -341,8 +341,8 @@ func (tcda *TrustCenterDocumentAccess) Delete(
q := ` q := `
DELETE FROM trust_center_document_accesses DELETE FROM trust_center_document_accesses
WHERE WHERE
%s %s
AND id = @id AND id = @id
` `
q = fmt.Sprintf(q, scope.SQLFragment()) q = fmt.Sprintf(q, scope.SQLFragment())
@@ -368,12 +368,12 @@ func (tcdas *TrustCenterDocumentAccesses) CountByTrustCenterAccessID(
) (int, error) { ) (int, error) {
q := ` q := `
SELECT SELECT
COUNT(id) COUNT(id)
FROM FROM
trust_center_document_accesses trust_center_document_accesses
WHERE WHERE
%s %s
AND trust_center_access_id = @trust_center_access_id AND trust_center_access_id = @trust_center_access_id
` `
q = fmt.Sprintf(q, scope.SQLFragment()) q = fmt.Sprintf(q, scope.SQLFragment())
@@ -401,14 +401,14 @@ func (tcdas *TrustCenterDocumentAccesses) CountPendingRequestByTrustCenterAccess
) (int, error) { ) (int, error) {
q := ` q := `
SELECT SELECT
COUNT(id) COUNT(id)
FROM FROM
trust_center_document_accesses trust_center_document_accesses
WHERE WHERE
%s %s
AND trust_center_access_id = @trust_center_access_id AND trust_center_access_id = @trust_center_access_id
AND requested = true AND requested = true
AND status = 'REQUESTED'::trust_center_document_access_status AND status = 'REQUESTED'::trust_center_document_access_status
` `
q = fmt.Sprintf(q, scope.SQLFragment()) q = fmt.Sprintf(q, scope.SQLFragment())
@@ -436,13 +436,13 @@ func (tcdas *TrustCenterDocumentAccesses) CountActiveByTrustCenterAccessID(
) (int, error) { ) (int, error) {
q := ` q := `
SELECT SELECT
COUNT(id) COUNT(id)
FROM FROM
trust_center_document_accesses trust_center_document_accesses
WHERE WHERE
%s %s
AND trust_center_access_id = @trust_center_access_id AND trust_center_access_id = @trust_center_access_id
AND status = 'GRANTED'::trust_center_document_access_status AND status = 'GRANTED'::trust_center_document_access_status
` `
q = fmt.Sprintf(q, scope.SQLFragment()) q = fmt.Sprintf(q, scope.SQLFragment())
@@ -471,93 +471,93 @@ func (tcdas *TrustCenterDocumentAccesses) LoadAvailableByTrustCenterAccessID(
) error { ) error {
q := ` q := `
WITH organization AS ( WITH organization AS (
SELECT tc.organization_id SELECT tc.organization_id
FROM trust_center_accesses tca FROM trust_center_accesses tca
INNER JOIN trust_centers tc ON tca.trust_center_id = tc.id INNER JOIN trust_centers tc ON tca.trust_center_id = tc.id
WHERE tca.tenant_id = @tenant_id WHERE tca.tenant_id = @tenant_id
AND tca.id = @trust_center_access_id AND tca.id = @trust_center_access_id
), ),
tenant_organization AS ( tenant_organization AS (
SELECT o.id AS organization_id SELECT o.id AS organization_id
FROM organizations o FROM organizations o
WHERE %s WHERE %s
), ),
all_items AS ( all_items AS (
SELECT SELECT
d.id AS item_id, d.id AS item_id,
d.id AS document_id, d.id AS document_id,
NULL::text AS report_id, NULL::text AS report_id,
NULL::text AS trust_center_file_id, NULL::text AS trust_center_file_id,
d.created_at AS item_created_at, d.created_at AS item_created_at,
d.updated_at AS item_updated_at d.updated_at AS item_updated_at
FROM documents d, tenant_organization o FROM documents d, tenant_organization o
WHERE d.organization_id = o.organization_id WHERE d.organization_id = o.organization_id
AND d.deleted_at IS NULL AND d.deleted_at IS NULL
AND d.trust_center_visibility = 'PRIVATE'::trust_center_visibility AND d.trust_center_visibility = 'PRIVATE'::trust_center_visibility
UNION ALL UNION ALL
SELECT SELECT
r.report_id AS item_id, r.report_id AS item_id,
NULL::text AS document_id, NULL::text AS document_id,
r.report_id AS report_id, r.report_id AS report_id,
NULL::text AS trust_center_file_id, NULL::text AS trust_center_file_id,
r.created_at AS item_created_at, r.created_at AS item_created_at,
r.updated_at AS item_updated_at r.updated_at AS item_updated_at
FROM audits r, tenant_organization o FROM audits r, tenant_organization o
WHERE r.organization_id = o.organization_id WHERE r.organization_id = o.organization_id
AND r.trust_center_visibility = 'PRIVATE'::trust_center_visibility AND r.trust_center_visibility = 'PRIVATE'::trust_center_visibility
AND r.report_id IS NOT NULL AND r.report_id IS NOT NULL
UNION ALL UNION ALL
SELECT SELECT
tcf.id AS item_id, tcf.id AS item_id,
NULL::text AS document_id, NULL::text AS document_id,
NULL::text AS report_id, NULL::text AS report_id,
tcf.id AS trust_center_file_id, tcf.id AS trust_center_file_id,
tcf.created_at AS item_created_at, tcf.created_at AS item_created_at,
tcf.updated_at AS item_updated_at tcf.updated_at AS item_updated_at
FROM trust_center_files tcf, tenant_organization o FROM trust_center_files tcf, tenant_organization o
WHERE tcf.organization_id = o.organization_id WHERE tcf.organization_id = o.organization_id
AND tcf.trust_center_visibility = 'PRIVATE'::trust_center_visibility AND tcf.trust_center_visibility = 'PRIVATE'::trust_center_visibility
), ),
final_items AS ( final_items AS (
SELECT SELECT
COALESCE(tcda.id, ai.item_id) AS id, COALESCE(tcda.id, ai.item_id) AS id,
tcda.tenant_id, tcda.tenant_id,
(SELECT organization_id FROM organization) AS organization_id, (SELECT organization_id FROM organization) AS organization_id,
@trust_center_access_id AS trust_center_access_id, @trust_center_access_id AS trust_center_access_id,
ai.document_id, ai.document_id,
ai.report_id, ai.report_id,
ai.trust_center_file_id, ai.trust_center_file_id,
COALESCE(tcda.active, false) AS active, COALESCE(tcda.active, false) AS active,
COALESCE(tcda.status, 'REQUESTED'::trust_center_document_access_status) AS status, COALESCE(tcda.status, 'REQUESTED'::trust_center_document_access_status) AS status,
COALESCE(tcda.requested, false) AS requested, COALESCE(tcda.requested, false) AS requested,
COALESCE(tcda.created_at, ai.item_created_at) AS created_at, COALESCE(tcda.created_at, ai.item_created_at) AS created_at,
COALESCE(tcda.updated_at, ai.item_updated_at) AS updated_at COALESCE(tcda.updated_at, ai.item_updated_at) AS updated_at
FROM all_items ai FROM all_items ai
LEFT JOIN trust_center_document_accesses tcda ON ( LEFT JOIN trust_center_document_accesses tcda ON (
tcda.trust_center_access_id = @trust_center_access_id tcda.trust_center_access_id = @trust_center_access_id
AND ( AND (
(tcda.document_id = ai.document_id AND ai.document_id IS NOT NULL) (tcda.document_id = ai.document_id AND ai.document_id IS NOT NULL)
OR (tcda.report_id = ai.report_id AND ai.report_id IS NOT NULL) OR (tcda.report_id = ai.report_id AND ai.report_id IS NOT NULL)
OR (tcda.trust_center_file_id = ai.trust_center_file_id AND ai.trust_center_file_id IS NOT NULL) OR (tcda.trust_center_file_id = ai.trust_center_file_id AND ai.trust_center_file_id IS NOT NULL)
) )
) )
) )
SELECT SELECT
id, id,
organization_id, organization_id,
trust_center_access_id, trust_center_access_id,
document_id, document_id,
report_id, report_id,
trust_center_file_id, trust_center_file_id,
active, active,
status, status,
requested, requested,
created_at, created_at,
updated_at updated_at
FROM final_items FROM final_items
WHERE %s WHERE %s
` `
@@ -593,22 +593,22 @@ func (tcdas *TrustCenterDocumentAccesses) LoadAllByTrustCenterAccessID(
) error { ) error {
q := ` q := `
SELECT SELECT
id, id,
organization_id, organization_id,
trust_center_access_id, trust_center_access_id,
document_id, document_id,
report_id, report_id,
trust_center_file_id, trust_center_file_id,
active, active,
status, status,
requested, requested,
created_at, created_at,
updated_at updated_at
FROM FROM
trust_center_document_accesses trust_center_document_accesses
WHERE WHERE
%s %s
AND trust_center_access_id = @trust_center_access_id AND trust_center_access_id = @trust_center_access_id
` `
q = fmt.Sprintf(q, scope.SQLFragment()) q = fmt.Sprintf(q, scope.SQLFragment())
@@ -633,34 +633,6 @@ WHERE
return nil 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( func GrantByDocumentIDs(
ctx context.Context, ctx context.Context,
conn pg.Conn, conn pg.Conn,
@@ -673,9 +645,9 @@ func GrantByDocumentIDs(
UPDATE trust_center_document_accesses UPDATE trust_center_document_accesses
SET status = 'GRANTED'::trust_center_document_access_status, updated_at = @updated_at SET status = 'GRANTED'::trust_center_document_access_status, updated_at = @updated_at
WHERE WHERE
%s %s
AND trust_center_access_id = @trust_center_access_id AND trust_center_access_id = @trust_center_access_id
AND document_id = ANY(@document_ids) AND document_id = ANY(@document_ids)
` `
q = fmt.Sprintf(q, scope.SQLFragment()) q = fmt.Sprintf(q, scope.SQLFragment())
@@ -706,9 +678,9 @@ func RejectByDocumentIDs(
UPDATE trust_center_document_accesses UPDATE trust_center_document_accesses
SET status = 'REJECTED'::trust_center_document_access_status SET status = 'REJECTED'::trust_center_document_access_status
WHERE WHERE
%s %s
AND trust_center_access_id = @trust_center_access_id AND trust_center_access_id = @trust_center_access_id
AND document_id = ANY(@document_ids) AND document_id = ANY(@document_ids)
` `
q = fmt.Sprintf(q, scope.SQLFragment()) q = fmt.Sprintf(q, scope.SQLFragment())
@@ -739,9 +711,9 @@ func GrantByReportIDs(
UPDATE trust_center_document_accesses UPDATE trust_center_document_accesses
SET status = 'GRANTED'::trust_center_document_access_status, updated_at = @updated_at SET status = 'GRANTED'::trust_center_document_access_status, updated_at = @updated_at
WHERE WHERE
%s %s
AND trust_center_access_id = @trust_center_access_id AND trust_center_access_id = @trust_center_access_id
AND report_id = ANY(@report_ids) AND report_id = ANY(@report_ids)
` `
q = fmt.Sprintf(q, scope.SQLFragment()) q = fmt.Sprintf(q, scope.SQLFragment())
@@ -772,9 +744,9 @@ func RejectByReportIDs(
UPDATE trust_center_document_accesses UPDATE trust_center_document_accesses
SET status = 'REJECTED'::trust_center_document_access_status SET status = 'REJECTED'::trust_center_document_access_status
WHERE WHERE
%s %s
AND trust_center_access_id = @trust_center_access_id AND trust_center_access_id = @trust_center_access_id
AND report_id = ANY(@report_ids) AND report_id = ANY(@report_ids)
` `
q = fmt.Sprintf(q, scope.SQLFragment()) q = fmt.Sprintf(q, scope.SQLFragment())
@@ -793,6 +765,230 @@ WHERE
return nil 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( func (tcdas TrustCenterDocumentAccesses) BulkInsertDocumentAccesses(
ctx context.Context, ctx context.Context,
conn pg.Conn, conn pg.Conn,
@@ -809,33 +1005,33 @@ func (tcdas TrustCenterDocumentAccesses) BulkInsertDocumentAccesses(
q := ` q := `
WITH document_access_data AS ( WITH document_access_data AS (
SELECT SELECT
generate_gid(decode_base64_unpadded(@tenant_id), @trust_center_document_access_entity_type) AS id, generate_gid(decode_base64_unpadded(@tenant_id), @trust_center_document_access_entity_type) AS id,
@tenant_id AS tenant_id, @tenant_id AS tenant_id,
@organization_id AS organization_id, @organization_id AS organization_id,
@trust_center_access_id AS trust_center_access_id, @trust_center_access_id AS trust_center_access_id,
unnest(@document_ids::text[]) AS document_id, unnest(@document_ids::text[]) AS document_id,
null::text AS report_id, null::text AS report_id,
null::text AS trust_center_file_id, null::text AS trust_center_file_id,
false AS active, false AS active,
@status::trust_center_document_access_status AS status, @status::trust_center_document_access_status AS status,
false AS requested, false AS requested,
@created_at::timestamptz AS created_at, @created_at::timestamptz AS created_at,
@updated_at::timestamptz AS updated_at @updated_at::timestamptz AS updated_at
) )
INSERT INTO trust_center_document_accesses ( INSERT INTO trust_center_document_accesses (
id, id,
tenant_id, tenant_id,
organization_id, organization_id,
trust_center_access_id, trust_center_access_id,
document_id, document_id,
report_id, report_id,
trust_center_file_id, trust_center_file_id,
active, active,
status, status,
requested, requested,
created_at, created_at,
updated_at updated_at
) )
SELECT * FROM document_access_data SELECT * FROM document_access_data
ON CONFLICT DO NOTHING ON CONFLICT DO NOTHING
@@ -875,33 +1071,33 @@ func (tcdas TrustCenterDocumentAccesses) BulkInsertReportAccesses(
q := ` q := `
WITH report_access_data AS ( WITH report_access_data AS (
SELECT SELECT
generate_gid(decode_base64_unpadded(@tenant_id), @trust_center_document_access_entity_type) AS id, generate_gid(decode_base64_unpadded(@tenant_id), @trust_center_document_access_entity_type) AS id,
@tenant_id AS tenant_id, @tenant_id AS tenant_id,
@organization_id AS organization_id, @organization_id AS organization_id,
@trust_center_access_id AS trust_center_access_id, @trust_center_access_id AS trust_center_access_id,
null::text AS document_id, null::text AS document_id,
unnest(@report_ids::text[]) AS report_id, unnest(@report_ids::text[]) AS report_id,
null::text AS trust_center_file_id, null::text AS trust_center_file_id,
false AS active, false AS active,
@status::trust_center_document_access_status AS status, @status::trust_center_document_access_status AS status,
false AS requested, false AS requested,
@created_at::timestamptz AS created_at, @created_at::timestamptz AS created_at,
@updated_at::timestamptz AS updated_at @updated_at::timestamptz AS updated_at
) )
INSERT INTO trust_center_document_accesses ( INSERT INTO trust_center_document_accesses (
id, id,
tenant_id, tenant_id,
organization_id, organization_id,
trust_center_access_id, trust_center_access_id,
document_id, document_id,
report_id, report_id,
trust_center_file_id, trust_center_file_id,
active, active,
status, status,
requested, requested,
created_at, created_at,
updated_at updated_at
) )
SELECT * FROM report_access_data SELECT * FROM report_access_data
ON CONFLICT DO NOTHING ON CONFLICT DO NOTHING
@@ -934,22 +1130,22 @@ func (tcda *TrustCenterDocumentAccess) LoadByTrustCenterAccessIDAndTrustCenterFi
) error { ) error {
q := ` q := `
SELECT SELECT
id, id,
trust_center_access_id, trust_center_access_id,
document_id, document_id,
report_id, report_id,
trust_center_file_id, trust_center_file_id,
active, active,
status, status,
requested, requested,
created_at, created_at,
updated_at updated_at
FROM FROM
trust_center_document_accesses trust_center_document_accesses
WHERE WHERE
%s %s
AND trust_center_access_id = @trust_center_access_id AND trust_center_access_id = @trust_center_access_id
AND trust_center_file_id = @trust_center_file_id AND trust_center_file_id = @trust_center_file_id
LIMIT 1; LIMIT 1;
` `
@@ -988,9 +1184,9 @@ func GrantByTrustCenterFileIDs(
UPDATE trust_center_document_accesses UPDATE trust_center_document_accesses
SET status = 'GRANTED'::trust_center_document_access_status, updated_at = @updated_at SET status = 'GRANTED'::trust_center_document_access_status, updated_at = @updated_at
WHERE WHERE
%s %s
AND trust_center_access_id = @trust_center_access_id AND trust_center_access_id = @trust_center_access_id
AND trust_center_file_id = ANY(@trust_center_file_ids) AND trust_center_file_id = ANY(@trust_center_file_ids)
` `
q = fmt.Sprintf(q, scope.SQLFragment()) q = fmt.Sprintf(q, scope.SQLFragment())
@@ -1021,9 +1217,9 @@ func RejectByTrustCenterFileIDs(
UPDATE trust_center_document_accesses UPDATE trust_center_document_accesses
SET status = 'REJECTED'::trust_center_document_access_status SET status = 'REJECTED'::trust_center_document_access_status
WHERE WHERE
%s %s
AND trust_center_access_id = @trust_center_access_id AND trust_center_access_id = @trust_center_access_id
AND trust_center_file_id = ANY(@trust_center_file_ids) AND trust_center_file_id = ANY(@trust_center_file_ids)
` `
q = fmt.Sprintf(q, scope.SQLFragment()) q = fmt.Sprintf(q, scope.SQLFragment())
@@ -1054,33 +1250,33 @@ func (tcdas TrustCenterDocumentAccesses) BulkInsertTrustCenterFileAccesses(
) error { ) error {
q := ` q := `
WITH trust_center_file_access_data AS ( WITH trust_center_file_access_data AS (
SELECT SELECT
generate_gid(decode_base64_unpadded(@tenant_id), @trust_center_document_access_entity_type) AS id, generate_gid(decode_base64_unpadded(@tenant_id), @trust_center_document_access_entity_type) AS id,
@tenant_id AS tenant_id, @tenant_id AS tenant_id,
@organization_id AS organization_id, @organization_id AS organization_id,
@trust_center_access_id AS trust_center_access_id, @trust_center_access_id AS trust_center_access_id,
null::text AS document_id, null::text AS document_id,
null::text AS report_id, null::text AS report_id,
unnest(@trust_center_file_ids::text[]) AS trust_center_file_id, unnest(@trust_center_file_ids::text[]) AS trust_center_file_id,
false AS active, false AS active,
@status::trust_center_document_access_status AS status, @status::trust_center_document_access_status AS status,
false AS requested, false AS requested,
@created_at::timestamptz AS created_at, @created_at::timestamptz AS created_at,
@updated_at::timestamptz AS updated_at @updated_at::timestamptz AS updated_at
) )
INSERT INTO trust_center_document_accesses ( INSERT INTO trust_center_document_accesses (
id, id,
tenant_id, tenant_id,
organization_id, organization_id,
trust_center_access_id, trust_center_access_id,
document_id, document_id,
report_id, report_id,
trust_center_file_id, trust_center_file_id,
active, active,
status, status,
requested, requested,
created_at, created_at,
updated_at updated_at
) )
SELECT * FROM trust_center_file_access_data SELECT * FROM trust_center_file_access_data
ON CONFLICT DO NOTHING ON CONFLICT DO NOTHING

View File

@@ -295,8 +295,42 @@ func (s TrustCenterAccessService) Update(
return fmt.Errorf("cannot update trust center access: %w", err) 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 { var tcdas coredata.TrustCenterDocumentAccesses
return fmt.Errorf("cannot upsert document accesses: %w", err)
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 { if shouldSendEmail {
@@ -340,84 +374,6 @@ func (s TrustCenterAccessService) Delete(
return err 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 { func (s TrustCenterAccessService) sendAccessEmail(ctx context.Context, tx pg.Conn, access *coredata.TrustCenterAccess) error {
accessToken, err := statelesstoken.NewToken( accessToken, err := statelesstoken.NewToken(
s.svc.trustConfig.TokenSecret, s.svc.trustConfig.TokenSecret,

View File

@@ -1664,19 +1664,19 @@ func (r *mutationResolver) UpdateTrustCenterAccess(ctx context.Context, input ty
var documentAccesses []probo.UpdateTrustCenterDocumentAccessRequest var documentAccesses []probo.UpdateTrustCenterDocumentAccessRequest
var reportAccesses []probo.UpdateTrustCenterDocumentAccessRequest var reportAccesses []probo.UpdateTrustCenterDocumentAccessRequest
var fileAccesses []probo.UpdateTrustCenterDocumentAccessRequest var fileAccesses []probo.UpdateTrustCenterDocumentAccessRequest
for _, documentAccess := range documentAccesses { for _, documentAccess := range input.Documents {
documentAccesses = append(documentAccesses, probo.UpdateTrustCenterDocumentAccessRequest{ documentAccesses = append(documentAccesses, probo.UpdateTrustCenterDocumentAccessRequest{
ID: documentAccess.ID, ID: documentAccess.ID,
Status: documentAccess.Status, Status: documentAccess.Status,
}) })
} }
for _, reportAccess := range reportAccesses { for _, reportAccess := range input.Reports {
reportAccesses = append(reportAccesses, probo.UpdateTrustCenterDocumentAccessRequest{ reportAccesses = append(reportAccesses, probo.UpdateTrustCenterDocumentAccessRequest{
ID: reportAccess.ID, ID: reportAccess.ID,
Status: reportAccess.Status, Status: reportAccess.Status,
}) })
} }
for _, fileAccess := range fileAccesses { for _, fileAccess := range input.TrustCenterFiles {
fileAccesses = append(fileAccesses, probo.UpdateTrustCenterDocumentAccessRequest{ fileAccesses = append(fileAccesses, probo.UpdateTrustCenterDocumentAccessRequest{
ID: fileAccess.ID, ID: fileAccess.ID,
Status: fileAccess.Status, Status: fileAccess.Status,