@things-factory/attachment-base 10.1.112 → 10.1.116

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,7 +8,12 @@ export declare function attachmentReaderOf(refType: string): AttachmentReader |
8
8
  * From the inventory of 2026-10-02 (docs/design/attachment-access.md §5).
9
9
  */
10
10
  export declare const SENSITIVE_REF_TYPES: ReadonlySet<string>;
11
- /** Attachments any member of the domain may read when no reader is registered. */
11
+ /**
12
+ * Attachments any member of the domain may read when no reader is registered.
13
+ *
14
+ * A refType whose module registers a reader is left off - the reader is its rule, and where that module is not loaded
15
+ * the refType stays closed (figure-thumbnail: figure-service asks figure:query, Figure 711dd85af0).
16
+ */
12
17
  export declare const ORDINARY_REF_TYPES: ReadonlySet<string>;
13
18
  /** The Attachment id a storage path carries - `<id>` or `<id>.<ext>`. Anything else is not an attachment path. */
14
19
  export declare function attachmentIdOf(path: string): string | null;
@@ -45,7 +45,12 @@ exports.SENSITIVE_REF_TYPES = new Set([
45
45
  'headless-pdf-save',
46
46
  'chat-session'
47
47
  ]);
48
- /** Attachments any member of the domain may read when no reader is registered. */
48
+ /**
49
+ * Attachments any member of the domain may read when no reader is registered.
50
+ *
51
+ * A refType whose module registers a reader is left off - the reader is its rule, and where that module is not loaded
52
+ * the refType stays closed (figure-thumbnail: figure-service asks figure:query, Figure 711dd85af0).
53
+ */
49
54
  exports.ORDINARY_REF_TYPES = new Set([
50
55
  /* the generic upload (attachment list, image selector, image uploader) - board and page images */
51
56
  '',
@@ -63,7 +68,6 @@ exports.ORDINARY_REF_TYPES = new Set([
63
68
  'Activity',
64
69
  'ActivityTemplate',
65
70
  'activity-template',
66
- 'figure-thumbnail',
67
71
  'board-import',
68
72
  'twin-space-representation'
69
73
  ]);
@@ -1 +1 @@
1
- {"version":3,"file":"attachment-access.js","sourceRoot":"","sources":["../server/attachment-access.ts"],"names":[],"mappings":"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","sourcesContent":["import { getRepository } from '@things-factory/shell'\n\nimport { Attachment } from './service/attachment/attachment'\n\n/*\n * Who may read an attachment - ADR-0106 decision 2.\n *\n * An attachment is a record of one domain. It is found by the id its storage path carries (`<id>.<ext>` - the\n * Attachment PK) and must belong to the request's domain. The module that owns the record it hangs on (`refType`)\n * says who among that domain's people may read it; attachment-base does not open a parent's attachments for a child -\n * a module that wants that says so in its own reader.\n *\n * A `refType` with no reader is read by any member of the domain only when it is on ORDINARY_REF_TYPES. Everything\n * else - the people, money and regulated records on SENSITIVE_REF_TYPES, and any `refType` on neither list - stays\n * closed until its module registers a reader. A new `refType` therefore cannot open by being forgotten.\n */\n\nexport type AttachmentReader = (attachment: Attachment, context: any) => boolean | Promise<boolean>\n\nconst readers = new Map<string, AttachmentReader>()\n\n/** The module owning `refType` says who may read its attachments. Same key replaces, `null` takes it back. */\nexport function registerAttachmentReader(refType: string, reader: AttachmentReader | null): void {\n if (reader) readers.set(refType, reader)\n else readers.delete(refType)\n}\n\nexport function attachmentReaderOf(refType: string): AttachmentReader | undefined {\n return readers.get(refType ?? '')\n}\n\n/**\n * Attachments of people, money and regulated records - closed unless their module registers a reader.\n * From the inventory of 2026-10-02 (docs/design/attachment-access.md §5).\n */\nexport const SENSITIVE_REF_TYPES: ReadonlySet<string> = new Set<string>([\n /* people */\n 'Employee',\n 'Contact',\n /* money */\n 'FinancialInstitution',\n 'TaxAuditResult',\n 'TaxInvoiceItem',\n 'Quotation',\n 'ExpenseClaimItem',\n 'Office Financial Statement',\n 'Office Share Register',\n 'OfficeContractDocument',\n 'OfficeContractDocumentRemoved',\n /* regulated - measurement, reports, corporate documents */\n 'DataSample',\n 'DataSet-report-template',\n 'Office Articles',\n /* content decided by whoever made it */\n 'headless-pdf-save',\n 'chat-session'\n])\n\n/** Attachments any member of the domain may read when no reader is registered. */\nexport const ORDINARY_REF_TYPES: ReadonlySet<string> = new Set<string>([\n /* the generic upload (attachment list, image selector, image uploader) - board and page images */\n '',\n 'Department',\n 'Product',\n 'WorkCenter',\n 'NotificationRule',\n 'DataKeySet',\n 'Operation',\n 'Kpi',\n 'KpiMetric',\n 'Process',\n 'Rack',\n 'Font',\n 'Activity',\n 'ActivityTemplate',\n 'activity-template',\n 'figure-thumbnail',\n 'board-import',\n 'twin-space-representation'\n])\n\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\n/** The Attachment id a storage path carries - `<id>` or `<id>.<ext>`. Anything else is not an attachment path. */\nexport function attachmentIdOf(path: string): string | null {\n const name = String(path || '')\n if (!name || name.includes('/') || name.includes('\\\\')) return null\n const id = name.split('.')[0]\n return UUID.test(id) ? id : null\n}\n\n/** Whether the rules let the request read this row - pure, so it is tested without a server. */\nexport async function mayRead(attachment: Attachment, context: any): Promise<boolean> {\n const domainId = context?.state?.domain?.id\n if (!attachment || !domainId || attachment.domainId !== domainId) return false\n if (!context?.state?.user?.id) return false\n\n const reader = attachmentReaderOf(attachment.refType)\n if (reader) {\n try {\n return (await reader(attachment, context)) === true\n } catch {\n return false\n }\n }\n return ORDINARY_REF_TYPES.has(attachment.refType ?? '')\n}\n\n/**\n * The attachment a path names, if this request may read it - one answer (`undefined`) for \"none\", \"not this domain's\",\n * \"not yours\" and \"a file with no row\", so the answer never says what exists.\n */\nexport async function readableAttachment(path: string, context: any): Promise<Attachment | undefined> {\n const id = attachmentIdOf(path)\n const domainId = context?.state?.domain?.id\n if (!id || !domainId) return undefined\n\n const row = await getRepository(Attachment).findOne({ where: { id, domain: { id: domainId } } as any })\n if (!row || row.path !== path) return undefined\n return (await mayRead(row, context)) ? row : undefined\n}\n"]}
1
+ {"version":3,"file":"attachment-access.js","sourceRoot":"","sources":["../server/attachment-access.ts"],"names":[],"mappings":"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","sourcesContent":["import { getRepository } from '@things-factory/shell'\n\nimport { Attachment } from './service/attachment/attachment'\n\n/*\n * Who may read an attachment - ADR-0106 decision 2.\n *\n * An attachment is a record of one domain. It is found by the id its storage path carries (`<id>.<ext>` - the\n * Attachment PK) and must belong to the request's domain. The module that owns the record it hangs on (`refType`)\n * says who among that domain's people may read it; attachment-base does not open a parent's attachments for a child -\n * a module that wants that says so in its own reader.\n *\n * A `refType` with no reader is read by any member of the domain only when it is on ORDINARY_REF_TYPES. Everything\n * else - the people, money and regulated records on SENSITIVE_REF_TYPES, and any `refType` on neither list - stays\n * closed until its module registers a reader. A new `refType` therefore cannot open by being forgotten.\n */\n\nexport type AttachmentReader = (attachment: Attachment, context: any) => boolean | Promise<boolean>\n\nconst readers = new Map<string, AttachmentReader>()\n\n/** The module owning `refType` says who may read its attachments. Same key replaces, `null` takes it back. */\nexport function registerAttachmentReader(refType: string, reader: AttachmentReader | null): void {\n if (reader) readers.set(refType, reader)\n else readers.delete(refType)\n}\n\nexport function attachmentReaderOf(refType: string): AttachmentReader | undefined {\n return readers.get(refType ?? '')\n}\n\n/**\n * Attachments of people, money and regulated records - closed unless their module registers a reader.\n * From the inventory of 2026-10-02 (docs/design/attachment-access.md §5).\n */\nexport const SENSITIVE_REF_TYPES: ReadonlySet<string> = new Set<string>([\n /* people */\n 'Employee',\n 'Contact',\n /* money */\n 'FinancialInstitution',\n 'TaxAuditResult',\n 'TaxInvoiceItem',\n 'Quotation',\n 'ExpenseClaimItem',\n 'Office Financial Statement',\n 'Office Share Register',\n 'OfficeContractDocument',\n 'OfficeContractDocumentRemoved',\n /* regulated - measurement, reports, corporate documents */\n 'DataSample',\n 'DataSet-report-template',\n 'Office Articles',\n /* content decided by whoever made it */\n 'headless-pdf-save',\n 'chat-session'\n])\n\n/**\n * Attachments any member of the domain may read when no reader is registered.\n *\n * A refType whose module registers a reader is left off - the reader is its rule, and where that module is not loaded\n * the refType stays closed (figure-thumbnail: figure-service asks figure:query, Figure 711dd85af0).\n */\nexport const ORDINARY_REF_TYPES: ReadonlySet<string> = new Set<string>([\n /* the generic upload (attachment list, image selector, image uploader) - board and page images */\n '',\n 'Department',\n 'Product',\n 'WorkCenter',\n 'NotificationRule',\n 'DataKeySet',\n 'Operation',\n 'Kpi',\n 'KpiMetric',\n 'Process',\n 'Rack',\n 'Font',\n 'Activity',\n 'ActivityTemplate',\n 'activity-template',\n 'board-import',\n 'twin-space-representation'\n])\n\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\n/** The Attachment id a storage path carries - `<id>` or `<id>.<ext>`. Anything else is not an attachment path. */\nexport function attachmentIdOf(path: string): string | null {\n const name = String(path || '')\n if (!name || name.includes('/') || name.includes('\\\\')) return null\n const id = name.split('.')[0]\n return UUID.test(id) ? id : null\n}\n\n/** Whether the rules let the request read this row - pure, so it is tested without a server. */\nexport async function mayRead(attachment: Attachment, context: any): Promise<boolean> {\n const domainId = context?.state?.domain?.id\n if (!attachment || !domainId || attachment.domainId !== domainId) return false\n if (!context?.state?.user?.id) return false\n\n const reader = attachmentReaderOf(attachment.refType)\n if (reader) {\n try {\n return (await reader(attachment, context)) === true\n } catch {\n return false\n }\n }\n return ORDINARY_REF_TYPES.has(attachment.refType ?? '')\n}\n\n/**\n * The attachment a path names, if this request may read it - one answer (`undefined`) for \"none\", \"not this domain's\",\n * \"not yours\" and \"a file with no row\", so the answer never says what exists.\n */\nexport async function readableAttachment(path: string, context: any): Promise<Attachment | undefined> {\n const id = attachmentIdOf(path)\n const domainId = context?.state?.domain?.id\n if (!id || !domainId) return undefined\n\n const row = await getRepository(Attachment).findOne({ where: { id, domain: { id: domainId } } as any })\n if (!row || row.path !== path) return undefined\n return (await mayRead(row, context)) ? row : undefined\n}\n"]}
@@ -2,4 +2,4 @@ import { Attachment } from './attachment';
2
2
  import { AttachmentMutation } from './attachment-mutation';
3
3
  import { AttachmentQuery } from './attachment-query';
4
4
  export declare const entities: (typeof Attachment)[];
5
- export declare const resolvers: (typeof AttachmentQuery | typeof AttachmentMutation)[];
5
+ export declare const resolvers: (typeof AttachmentMutation | typeof AttachmentQuery)[];
@@ -2,7 +2,7 @@ export * from './attachment/attachment';
2
2
  export * from './attachment-share/attachment-share';
3
3
  export * from './attachment-share/attachment-share-rule';
4
4
  export * from './attachment/attachment-types';
5
- export declare const entities: (typeof import("./attachment-share/attachment-share").AttachmentShare | typeof import("./attachment/attachment").Attachment)[];
5
+ export declare const entities: (typeof import("./attachment/attachment").Attachment | typeof import("./attachment-share/attachment-share").AttachmentShare)[];
6
6
  export declare const schema: {
7
- resolverClasses: (typeof import("./attachment-share/attachment-share-mutation").AttachmentShareMutation | typeof import("./attachment/attachment-query").AttachmentQuery | typeof import("./attachment/attachment-mutation").AttachmentMutation)[];
7
+ resolverClasses: (typeof import("./attachment/attachment-mutation").AttachmentMutation | typeof import("./attachment/attachment-query").AttachmentQuery | typeof import("./attachment-share/attachment-share-mutation").AttachmentShareMutation)[];
8
8
  };