|
| 1 | +import { assertType } from '../../../utils/type-utils'; |
1 | 2 | import type { AttachmentProcessorExtractedProp } from '../../../database/attachment-processor-props'; |
2 | 3 | import { ENTITY_TYPE_INTERNAL_FILE } from '../../../schema/internalObject'; |
3 | 4 | import { schemaAttributesDefinition } from '../../../schema/schema-attributes'; |
4 | | -import { |
5 | | - type AttributeDefinition, |
6 | | - createdAt, |
7 | | - creators, |
8 | | - entityType, |
9 | | - id, |
10 | | - internalId, |
11 | | - parentTypes, |
12 | | - refreshedAt, |
13 | | - standardId, |
14 | | - updatedAt, |
15 | | - type MappingDefinition, |
16 | | - type BasicStoreAttribute, |
17 | | -} from '../../../schema/attribute-definition'; |
| 5 | +import { type AttributeDefinition, createdAt, creators, entityType, id, internalId, parentTypes, refreshedAt, standardId, updatedAt } from '../../../schema/attribute-definition'; |
18 | 6 | import { ENTITY_TYPE_MARKING_DEFINITION } from '../../../schema/stixMetaObject'; |
19 | 7 | import { ABSTRACT_STIX_CORE_OBJECT } from '../../../schema/general'; |
20 | 8 | import { UPLOAD_STATUS_VALUES } from './document-domain'; |
21 | 9 |
|
22 | | -export const ATTACHMENT_MAPPINGS = [ |
23 | | - { name: 'author', label: 'Author', type: 'string', format: 'short', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
24 | | - { name: 'comments', label: 'Comments', type: 'string', format: 'short', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
25 | | - { name: 'content', label: 'Content', type: 'string', format: 'text', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
26 | | - { name: 'content_length', label: 'Content length', type: 'numeric', precision: 'integer', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
27 | | - { name: 'content_type', label: 'Content type', type: 'string', format: 'short', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
28 | | - { name: 'creator_tool', label: 'Creator tool', type: 'string', format: 'short', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
29 | | - { name: 'date', label: 'Created date', type: 'date', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
30 | | - { name: 'description', label: 'Description', type: 'string', format: 'text', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
31 | | - { name: 'format', label: 'Format', type: 'string', format: 'short', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
32 | | - { name: 'keywords', label: 'Keywords', type: 'string', format: 'short', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
33 | | - { name: 'language', label: 'Language', type: 'string', format: 'short', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
34 | | - { name: 'metadata_date', label: 'Metadata date', type: 'date', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
35 | | - { name: 'modified', label: 'Modified date', type: 'date', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
36 | | - { name: 'modifier', label: 'Modifier', type: 'string', format: 'short', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
37 | | - { name: 'print_date', label: 'Print date', type: 'date', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
38 | | - { name: 'title', label: 'Title', type: 'string', format: 'short', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
39 | | -] satisfies ({ |
40 | | - name: AttachmentProcessorExtractedProp; |
41 | | -} & MappingDefinition<BasicStoreAttribute>)[]; |
42 | | - |
43 | | -// Compile-time shenanigans to make sure we don't forget to update |
44 | | -// ATTACHMENT_MAPPINGS when/if we start extracting new fields |
45 | | -// via the ES/OS attachment ingest pipeline. |
46 | | -type AttachmentMappingsWithCheck = Exclude< |
47 | | - AttachmentProcessorExtractedProp, |
48 | | - typeof ATTACHMENT_MAPPINGS[number]['name'] |
49 | | -> extends never |
50 | | - ? MappingDefinition<BasicStoreAttribute>[] |
51 | | - : 'Make sure ATTACHMENT_MAPPINGS defines one mapping for each AttachmentProcessorExtractedProp'; |
52 | | - |
53 | | -const TYPE_CHECKED_ATTACHMENT_MAPPINGS: AttachmentMappingsWithCheck = ATTACHMENT_MAPPINGS; |
54 | | - |
55 | | -const attributes: Array<AttributeDefinition> = [ |
| 10 | +const attributes = [ |
56 | 11 | id, |
57 | 12 | internalId, |
58 | 13 | standardId, |
@@ -117,12 +72,40 @@ const attributes: Array<AttributeDefinition> = [ |
117 | 72 | multiple: false, |
118 | 73 | upsert: false, |
119 | 74 | isFilterable: false, |
120 | | - mappings: TYPE_CHECKED_ATTACHMENT_MAPPINGS, |
| 75 | + mappings: [ |
| 76 | + { name: 'author', label: 'Author', type: 'string', format: 'short', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
| 77 | + { name: 'comments', label: 'Comments', type: 'string', format: 'short', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
| 78 | + { name: 'content', label: 'Content', type: 'string', format: 'text', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
| 79 | + { name: 'content_length', label: 'Content length', type: 'numeric', precision: 'integer', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
| 80 | + { name: 'content_type', label: 'Content type', type: 'string', format: 'short', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
| 81 | + { name: 'creator_tool', label: 'Creator tool', type: 'string', format: 'short', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
| 82 | + { name: 'date', label: 'Created date', type: 'date', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
| 83 | + { name: 'description', label: 'Description', type: 'string', format: 'text', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
| 84 | + { name: 'format', label: 'Format', type: 'string', format: 'short', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
| 85 | + { name: 'keywords', label: 'Keywords', type: 'string', format: 'short', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
| 86 | + { name: 'language', label: 'Language', type: 'string', format: 'short', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
| 87 | + { name: 'metadata_date', label: 'Metadata date', type: 'date', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
| 88 | + { name: 'modified', label: 'Modified date', type: 'date', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
| 89 | + { name: 'modifier', label: 'Modifier', type: 'string', format: 'short', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
| 90 | + { name: 'print_date', label: 'Print date', type: 'date', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
| 91 | + { name: 'title', label: 'Title', type: 'string', format: 'short', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: true }, |
| 92 | + ], |
121 | 93 | }, |
122 | 94 | { name: 'uploaded_at', label: 'Upload date', type: 'date', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: false }, |
123 | 95 | { name: 'file_id', label: 'File identifier', type: 'string', format: 'short', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: false }, |
124 | 96 | { name: 'entity_id', label: 'Related entity', type: 'string', format: 'id', entityTypes: [ABSTRACT_STIX_CORE_OBJECT], mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: false }, |
125 | 97 | { name: 'removed', label: 'Removed', type: 'boolean', mandatoryType: 'no', editDefault: false, multiple: false, upsert: false, isFilterable: false }, |
126 | | -]; |
| 98 | +] as const satisfies Array<AttributeDefinition>; |
| 99 | + |
| 100 | +const attachmentAttributes = attributes[18]; |
| 101 | + |
| 102 | +type AttachmentAttributeMappingNames = typeof attachmentAttributes.mappings[number]['name'][]; |
| 103 | + |
| 104 | +// Make sure there's an attachment mapping for each field extracted |
| 105 | +// by the `attachment` ingest processor, exhaustively. |
| 106 | +assertType< |
| 107 | + AttachmentAttributeMappingNames, |
| 108 | + AttachmentProcessorExtractedProp[] |
| 109 | +>(attachmentAttributes.mappings.map(({ name }) => name)); |
127 | 110 |
|
128 | 111 | schemaAttributesDefinition.registerAttributes(ENTITY_TYPE_INTERNAL_FILE, attributes); |
0 commit comments