Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove use of submissionCreate from entity audit event #932

Merged
merged 5 commits into from
Jan 24, 2024
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions src/components/entity/activity.vue
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,12 @@ const feed = computed(() => {
} else if (audit.action === 'entity.create') {
const group = [{ entry: audit }];
const { details } = audit;
// this will insert a feed entry for the submission approval event
if (details.sourceEvent?.action === 'submission.update')
group.push({ entry: details.sourceEvent });
if (details.submissionCreate != null)
group.push({ entry: details.submissionCreate, submission: details.submission });
// this will insert a feed entry for the submission creation
if (details.submission != null)
group.push({ entry: { action: 'submission.create', loggedAt: details.submission.createdAt }, submission: details.submission });
groups.push(group);
} else {
groups.push([{ entry: audit }]);
Expand Down
25 changes: 9 additions & 16 deletions src/components/entity/basic-details.vue
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,16 @@ except according to the terms contained in the LICENSE file.
<dt>{{ $t('entity.entityId') }}</dt>
<dd>{{ entity.uuid }}</dd>
</div>
<div v-if="instanceId != null">
<div v-if="submission != null">
<dt>{{ $t('creatingSubmission') }}</dt>
<dd id="entity-basic-details-creating-submission">
<router-link v-if="submission != null"
:to="submissionPath(projectId, submission.xmlFormId, instanceId)">
{{ submission.currentVersion.instanceName ?? instanceId }}
<router-link v-if="submission.currentVersion != null"
:to="submissionPath(projectId, submission.xmlFormId, submission.instanceId)">
{{ submission.currentVersion.instanceName ?? submission.instanceId }}
</router-link>
<template v-else>
<span class="icon-trash" v-tooltip.sr-only></span>
<span>{{ instanceId }}</span>
<span>{{ submission.instanceId }}</span>
<span class="sr-only">&nbsp;{{ $t('submissionDeleted') }}</span>
</template>
</dd>
Expand Down Expand Up @@ -65,23 +65,16 @@ const projectId = inject('projectId');
// created.
const { entity, audits } = useRequestData();

// Using `ref` and watchEffect() for instanceId and `submission` rather than
// `computed` so that they don't change whenever `audits` is refreshed.
const instanceId = ref(undefined);
// Using `ref` and watchEffect() for `submission` rather than
// `computed` so that it doesn't change whenever `audits` is refreshed.
const submission = ref(undefined);
watchEffect(() => {
if (instanceId.value !== undefined || !audits.dataExists) return;
if (submission.value !== undefined || !audits.dataExists) return;
const audit = audits.find(({ action }) => action === 'entity.create');
// `audit` should always exist in production, but it doesn't always exist in
// testing.
if (audit == null) return;
const { submissionCreate } = audit.details;
if (submissionCreate != null) {
instanceId.value = submissionCreate.details.instanceId;
submission.value = audit.details.submission;
} else {
instanceId.value = null;
}
submission.value = audit.details.submission;
});
const { submissionPath } = useRoutes();
</script>
Expand Down
18 changes: 9 additions & 9 deletions src/components/entity/feed-entry.vue
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,20 @@ except according to the terms contained in the LICENSE file.
<template #title>
<template v-if="entry.action === 'submission.create'">
<span class="icon-cloud-upload"></span>
<i18n-t v-if="submission != null"
<i18n-t v-if="submission.currentVersion != null"
keypath="title.submission.create.notDeleted">
<template #instanceName>
<router-link :to="creatingSubmissionPath">
{{ submission.currentVersion.instanceName ?? submission.instanceId }}
</router-link>
</template>
<template #submitter><actor-link :actor="entry.actor"/></template>
<template #submitter><actor-link :actor="submission.submitter"/></template>
</i18n-t>
<i18n-t v-else keypath="title.submission.create.deleted.full">
<template #deletedSubmission>
<span class="deleted-submission">{{ deletedSubmission }}</span>
</template>
<template #name><actor-link :actor="entry.actor"/></template>
<template #name><actor-link :actor="submission.submitter"/></template>
</i18n-t>
</template>
<template v-else-if="entry.action === 'submission.update'">
Expand All @@ -44,7 +44,7 @@ except according to the terms contained in the LICENSE file.
</template>
<template v-else-if="entry.action === 'entity.create'">
<span class="icon-magic-wand"></span>
<i18n-t v-if="entry.details.submissionCreate != null"
<i18n-t v-if="entry.details.submission != null"
keypath="title.entity.create.submission">
<template #label>
<span class="entity-label">{{ entity.currentVersion.label }}</span>
Expand All @@ -63,8 +63,8 @@ except according to the terms contained in the LICENSE file.
<template v-else-if="entry.action === 'entity.update.version'">
<span class="icon-pencil"></span>
<span class="title">
<template v-if="entry.details.submissionCreate != null">
<i18n-t v-if="submission != null"
<template v-if="entry.details.submission != null">
ktuite marked this conversation as resolved.
Show resolved Hide resolved
<i18n-t v-if="submission.currentVersion != null"
keypath="title.entity.update_version.submission.notDeleted">
<template #instanceName>
<router-link :to="creatingSubmissionPath">
Expand Down Expand Up @@ -152,14 +152,14 @@ const { t } = useI18n();
// is about a submission (creation, approval) and the ID is directly
// in the event details.
ktuite marked this conversation as resolved.
Show resolved Hide resolved
const deletedSubmission = computed(() => {
const id = props.entry.details.instanceId;
const id = props.submission.instanceId;
return t('title.submission.create.deleted.deletedSubmission', { id });
});

// This function pulls out the submission instance ID in events about
// entities, where the instance ID is found deep inside the submissionCreate event.
// entities
const deletedSubmissionEntityEvent = computed(() => {
const id = props.entry.details.submissionCreate.details.instanceId;
const id = props.submission.instanceId;
return t('title.entity.update_version.submission.deleted.deletedSubmission', { id });
});
const { reviewStateIcon } = useReviewState();
Expand Down
8 changes: 4 additions & 4 deletions src/components/entity/version-link.vue
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,10 @@ const versionPath = computed(() => {
const { t } = useI18n();
const text = computed(() => {
const { source } = props.version;
const { submissionCreate } = source;
if (submissionCreate != null) {
const nameOrId = source.submission?.currentVersion?.instanceName ??
submissionCreate.details.instanceId;
const { submission } = source;
if (submission != null) {
const nameOrId = submission?.currentVersion?.instanceName ??
ktuite marked this conversation as resolved.
Show resolved Hide resolved
submission.instanceId;
return t('submission', { instanceName: nameOrId });
}
return t('api', { name: props.version.creator.displayName });
Expand Down
15 changes: 6 additions & 9 deletions test/components/entity/basic-details.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,20 +47,17 @@ describe('EntityBasicDetails', () => {
const submission = testData.extendedSubmissions
.createPast(1, { instanceId: 's', ...submissionOptions })
.last();
const submissionCreate = testData.extendedAudits
.createPast(1, {
action: 'submission.create',
details: { instanceId: submission.instanceId }
})
.last();

testData.extendedEntities.createPast(1, { uuid: 'e' });
const details = {
entity: { uuid: 'e' },
submissionCreate
};
if (!submissionDeleted)
details.submission = { ...submission, xmlFormId: 'f' };
details.submission = { ...submission, xmlFormId: 'f' }; // Use entire submission, augmented with form id
else {
// If submission is deleted, these are the only fields we pass through in the audit log
const { instanceId, submitter, createdAt } = submission;
details.submission = { instanceId, submitter, createdAt };
}
testData.extendedAudits.createPast(1, {
action: 'entity.create',
details
Expand Down
47 changes: 26 additions & 21 deletions test/components/entity/feed-entry.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,18 +50,25 @@ describe('EntityFeedEntry', () => {

describe('submission.create audit event', () => {
const createSubmission = ({ deleted = false, ...options } = {}) => {
const submission = testData.extendedSubmissions
// create a submission
const fullSubmission = testData.extendedSubmissions
.createPast(1, { instanceId: 's', ...options })
.last();
// return either full or partial submission info depending on if submission was deleted
const submission = (deleted)
? { instanceId: fullSubmission.instanceId, submitter: fullSubmission.submitter, createdAt: fullSubmission.createdAt }
: { ...fullSubmission, xmlFormId: 'f' }; // full submission augmented with form id

const audit = testData.extendedAudits
.createPast(1, {
action: 'submission.create',
details: { instanceId: 's' }
details: { instanceId: submission.instanceId }
})
.last();

return {
entry: audit,
submission: deleted ? null : { ...submission, xmlFormId: 'f' }
submission
};
};

Expand Down Expand Up @@ -163,10 +170,8 @@ describe('EntityFeedEntry', () => {
entity: { uuid: 'e' }
};
if (options.submission === true) {
testData.extendedSubmissions.createPast(1);
details.submissionCreate = testData.extendedAudits
.createPast(1, { action: 'submission.create' })
.last();
const submission = testData.extendedSubmissions.createPast(1);
ktuite marked this conversation as resolved.
Show resolved Hide resolved
details.submission = { ...submission, xmlFormId: 'f' };
}
testData.extendedAudits.createPast(1, {
action: 'entity.create',
Expand Down Expand Up @@ -250,21 +255,21 @@ describe('EntityFeedEntry', () => {

describe('entity.update.version (via submission) audit event', () => {
const updateEntityFromSubmission = ({ deleted = false, ...options } = {}) => {
const details = {
entity: { uuid: 'e' }
};

details.submissionCreate = testData.extendedAudits
.createPast(1, {
action: 'submission.create',
details: { instanceId: 'x' }
})
.last();

const submission = testData.extendedSubmissions
// create the submission this event is based on
const fullSubmission = testData.extendedSubmissions
.createPast(1, { instanceId: 's', ...options })
.last();

// return either full or partial submission info depending on if submission was deleted
const submission = (deleted)
? { instanceId: fullSubmission.instanceId, submitter: fullSubmission.submitter, createdAt: fullSubmission.createdAt }
: { ...fullSubmission, xmlFormId: 'f' }; // full submission augmented with form id

const details = {
entity: { uuid: 'e' },
submission
};

testData.extendedEntityVersions.createPast(1);
const audit = testData.extendedAudits
.createPast(1, {
Expand All @@ -275,7 +280,7 @@ describe('EntityFeedEntry', () => {

return {
entry: audit,
submission: deleted ? null : { ...submission, xmlFormId: 'f' }
submission
};
};

Expand Down Expand Up @@ -308,7 +313,7 @@ describe('EntityFeedEntry', () => {
it('shows the correct text with deleted submission instance id', () => {
const component = mountComponent({ props: updateEntityFromSubmission({ deleted: true }) });
const text = component.get('.feed-entry-title .title').text();
text.should.equal('Data updated by (deleted Submission x)');
text.should.equal('Data updated by (deleted Submission s)');
});

it('does not link to the deleted submission', () => {
Expand Down
22 changes: 15 additions & 7 deletions test/components/entity/version-link.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,25 +37,33 @@ describe('EntityVersionLink', () => {

describe('entity source is a submission', () => {
it('shows the instance name if the submission has one', () => {
const { submission, submissionCreate } = testData.extendedEntities
const { submission } = testData.extendedEntities
.createSourceSubmission('submission.create', {
meta: { instanceName: 'Some Name' }
});
testData.extendedEntities.createPast(1, {
source: { submission, submissionCreate }
source: { submission }
});
mountComponent().text().should.equal('Submission Some Name');
});

it('falls back to the instance ID', () => {
const { submissionCreate } = testData.extendedEntities
it('shows the instance ID if the submission has no instance name', () => {
const { submission } = testData.extendedEntities
.createSourceSubmission('submission.create', { instanceId: 's' });
testData.extendedEntities.createPast(1, {
// Don't specify source.submission, matching the response if the
// submission is deleted.
source: { submissionCreate }
source: { submission }
});
mountComponent().text().should.equal('Submission s');
});

it('falls back to the instance ID if submission deleted', () => {
// Final argument about source submission: deleted=true
const { submission } = testData.extendedEntities
.createSourceSubmission('submission.create', { instanceId: 'x' }, true);
testData.extendedEntities.createPast(1, {
source: { submission }
});
mountComponent().text().should.equal('Submission x');
});
});
});
19 changes: 11 additions & 8 deletions test/data/entities.js
Original file line number Diff line number Diff line change
Expand Up @@ -258,22 +258,25 @@ export const entityOData = (top = 250, skip = 0) => {
};

// Creates a source submission along with submission audit log events.
extendedEntities.createSourceSubmission = (sourceAction, submissionOptions = {}) => {
const submission = extendedSubmissions
extendedEntities.createSourceSubmission = (sourceAction, submissionOptions = {}, deleted = false) => {
const fullSubmission = extendedSubmissions
.createPast(1, submissionOptions)
.last();
const formVersion = submissionOptions.formVersion ?? extendedForms.first();
const submissionWithFormId = {
...submission,
xmlFormId: formVersion.xmlFormId
};
const submission = (!deleted)
? { ...fullSubmission, xmlFormId: formVersion.xmlFormId }
: {
instanceId: fullSubmission.instanceId,
submitter: fullSubmission.submitter,
createdAt: fullSubmission.createdAt
};

const auditOptions = {
actor: submission.submitter,
actee: formVersion,
details: { instanceId: submission.instanceId }
};
const submissionCreate = extendedAudits
extendedAudits
.createPast(1, {
ktuite marked this conversation as resolved.
Show resolved Hide resolved
action: 'submission.create',
loggedAt: submission.createdAt,
Expand All @@ -297,7 +300,7 @@ extendedEntities.createSourceSubmission = (sourceAction, submissionOptions = {})
}
const sourceEvent = extendedAudits.last();

return { submission: submissionWithFormId, submissionCreate, sourceEvent };
return { submission, sourceEvent };
};

extendedEntities.resolve = (index) => {
Expand Down